{"matchId":"57819783","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-31T11:46:59Z","creationBytecode":{"onchainBytecode":"0x60e060405260015f55348015610013575f80fd5b50604051611932380380611932833981016040819052610032916103fb565b6001600160a01b038516608052808561004a3061017e565b506001600160a01b03811661007d575f604051631e4fbdf760e01b81526004016100749190610464565b60405180910390fd5b61008681610271565b506001600160a01b03851615806100a457506001600160a01b038416155b806100b657506001600160a01b038316155b156100d45760405163d92e233d60e01b815260040160405180910390fd5b606461ffff8316111561010757604051633c057d7b60e01b815261ffff8316600482015260646024820152604401610074565b6001600160a01b0384811660a052831660c0526002805461ffff60a01b1916600160a01b61ffff851690810291909117909155604080515f815260208101929092527f9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64910160405180910390a15050505050610478565b61026e81610269604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052600160e0820181905261010082018390526101208201839052610140820183905261016082015261018081018290526101a081019190915290565b6102cd565b50565b600280546001600160a01b0319908116909155600180546001600160a01b0384811693821684179092556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6102d681610311565b6001600160a01b0316613fff83166001600160a01b03161461030d5781604051630732d7b560e51b81526004016100749190610464565b5050565b80515f901561031f57612000175b81602001511561032e57611000175b81604001511561033d57610800175b81606001511561034c57610400175b81608001511561035b57610200175b8160a001511561036a57610100175b8160c0015115610378576080175b8160e0015115610386576040175b81610100015115610395576020175b816101200151156103a4576010175b816101400151156103b3576008175b816101600151156103c2576004175b816101800151156103d1576002175b816101a00151156103e0576001175b919050565b80516001600160a01b03811681146103e0575f80fd5b5f805f805f60a0868803121561040f575f80fd5b610418866103e5565b9450610426602087016103e5565b9350610434604087016103e5565b9250606086015161ffff8116811461044a575f80fd5b9150610458608087016103e5565b90509295509295909350565b6001600160a01b0391909116815260200190565b60805160a05160c0516114436104ef5f395f818161042e0152818161065a0152818161069501528181610b0101528181610b3c0152610b9f01525f8181610399015281816105bf0152818161099301528181610c640152610d5601525f81816103c0015281816107940152610a8701526114435ff3fe608060405234801561000f575f80fd5b5060043610610126575f3560e01c806321d0ee701461012a5780632205f5681461015b578063259982e51461012a5780632c43afc51461017c578063575e24b4146101915780636b9f96ea146101cf5780636c2bbe7e146101d75780636fe7e6eb1461020a57806379ba5097146102185780638da5cb5b146102205780639f063efc146101d7578063b47b2fb11461023a578063b6a8b0fa14610270578063c40849381461027e578063c4e833ce14610285578063c6878f4e14610379578063c98a295b14610394578063dc4c90d3146103bb578063dc98354e146103e2578063e1b4af6914610270578063e30c3978146103f0578063ea26abcf14610401578063f2fde38b14610416578063fbfa77cf14610429575b5f80fd5b61013d610138366004610e1b565b610450565b6040516001600160e01b031990911681526020015b60405180910390f35b61016e610169366004610e91565b61046a565b604051908152602001610152565b61018f61018a366004610ea8565b610498565b005b6101a461019f366004610ee0565b610564565b604080516001600160e01b03199094168452602084019290925262ffffff1690820152606001610152565b61018f610580565b6101ea6101e5366004610f39565b610734565b604080516001600160e01b03199093168352602083019190915201610152565b61013d610138366004610fd4565b61018f61074f565b6001546001600160a01b03165b604051610152919061102b565b61024d61024836600461103f565b610787565b604080516001600160e01b03199093168352600f9190910b602083015201610152565b61013d6101383660046110bf565b604461022d565b61036c604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052600160e0820181905261010082018390526101208201839052610140820183905261016082015261018081018290526101a081019190915290565b6040516101529190611118565b610381606481565b60405161ffff9091168152602001610152565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61013d610138366004611239565b6002546001600160a01b031661022d565b60025461038190600160a01b900461ffff1681565b61018f610424366004611280565b6107ef565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b5f604051630a85dc2960e01b815260040160405180910390fd5b6002545f906127109061048890600160a01b900461ffff168461129b565b61049291906112be565b92915050565b6001546001600160a01b031633146104ce573360405163118cdaa760e01b81526004016104c5919061102b565b60405180910390fd5b606461ffff821611156104f957806064604051633c057d7b60e01b81526004016104c59291906112dd565b7f9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64600260149054906101000a900461ffff168260405161053a9291906112dd565b60405180910390a16002805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b5f805f604051630a85dc2960e01b815260040160405180910390fd5b60025f54036105a257604051633ee5aeb560e01b815260040160405180910390fd5b60025f9081556040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105f490309060040161102b565b602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906112f2565b9050805f0361065557604051633ada528f60e21b815260040160405180910390fd5b61067f7f00000000000000000000000000000000000000000000000000000000000000008261086d565b60405163f14faf6f60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b1580156106de575f80fd5b505af11580156106f0573d5f803e3d5ffd5b505050507fed1eeda1fde9cc22a2ecf41efc0d6cf519c1d95184b36b93b4cd4877881488ee8160405161072591815260200190565b60405180910390a15060015f55565b5f80604051630a85dc2960e01b815260040160405180910390fd5b6002546001600160a01b0316331461077c573360405163118cdaa760e01b81526004016104c5919061102b565b610785336108ba565b565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d25760405163570c108560e11b815260040160405180910390fd5b6107e0888888888888610916565b91509150965096945050505050565b6001546001600160a01b0316331461081c573360405163118cdaa760e01b81526004016104c5919061102b565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700905f90a350565b6108778282610c5f565b6108b657610885825f610c5f565b158061089857506108968282610c5f565b155b156108b657604051633e3f8f7360e01b815260040160405180910390fd5b5050565b600280546001600160a01b0319908116909155600180546001600160a01b0384811693821684179092556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8060025f540361093a57604051633ee5aeb560e01b815260040160405180910390fd5b60025f90815560208701351261095b575063b47b2fb160e01b90505f610c4e565b5f6109696020880188611316565b61097f5761097a6020890189611280565b61098f565b61098f6040890160208a01611280565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146109dd575063b47b2fb160e01b91505f9050610c4e565b5f6109eb6020890189611316565b6109fe576109f98760801d90565b610a08565b610a0887600f0b90565b90505f81600f0b13610a29575063b47b2fb160e01b92505f9150610c4e9050565b5f610a3c826001600160801b031661046a565b9050805f03610a5b575063b47b2fb160e01b93505f9250610c4e915050565b604051630b0d9c0960e01b81526001600160a01b038481166004830152306024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690630b0d9c09906064015f604051808303815f87803b158015610ac8575f80fd5b505af1158015610ada573d5f803e3d5ffd5b505050505f610afa8b803603810190610af39190611343565b60a0902090565b9050610b267f00000000000000000000000000000000000000000000000000000000000000008361086d565b60405163f14faf6f60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b158015610b85575f80fd5b505af1925050508015610b96575060015b610c0357610bc47f00000000000000000000000000000000000000000000000000000000000000005f61086d565b807f76853f6287e5caf0c4284c123f04368dc4ada480832f72484e445adf762ee45783604051610bf691815260200190565b60405180910390a2610c3e565b807f5cba8bc9707d2af8fcbba504de8cd3ae98564aac502e8c1db7bf8853ff678ec283604051610c3591815260200190565b60405180910390a25b5063b47b2fb160e01b9450925050505b60015f559097909650945050505050565b5f805f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585604051602401610cb39291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b17905251610ce891906113dc565b5f604051808303815f865af19150503d805f8114610d21576040519150601f19603f3d011682016040523d82523d5f602084013e610d26565b606091505b5091509150818015610d815750805115610d535780806020019051810190610d4e91906113f2565b610d81565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b115b95945050505050565b6001600160a01b0381168114610d9e575f80fd5b50565b8035610dac81610d8a565b919050565b5f60a08284031215610dc1575f80fd5b50919050565b5f60808284031215610dc1575f80fd5b5f8083601f840112610de7575f80fd5b5081356001600160401b03811115610dfd575f80fd5b602083019150836020828501011115610e14575f80fd5b9250929050565b5f805f805f6101608688031215610e30575f80fd5b8535610e3b81610d8a565b9450610e4a8760208801610db1565b9350610e598760c08801610dc7565b92506101408601356001600160401b03811115610e74575f80fd5b610e8088828901610dd7565b969995985093965092949392505050565b5f60208284031215610ea1575f80fd5b5035919050565b5f60208284031215610eb8575f80fd5b813561ffff81168114610ec9575f80fd5b9392505050565b5f60608284031215610dc1575f80fd5b5f805f805f6101408688031215610ef5575f80fd5b8535610f0081610d8a565b9450610f0f8760208801610db1565b9350610f1e8760c08801610ed0565b92506101208601356001600160401b03811115610e74575f80fd5b5f805f805f805f6101a0888a031215610f50575f80fd5b8735610f5b81610d8a565b9650610f6a8960208a01610db1565b9550610f798960c08a01610dc7565b9450610140880135935061016088013592506101808801356001600160401b03811115610fa4575f80fd5b610fb08a828b01610dd7565b989b979a50959850939692959293505050565b8035600281900b8114610dac575f80fd5b5f805f806101008587031215610fe8575f80fd5b8435610ff381610d8a565b93506110028660208701610db1565b925060c085013561101281610d8a565b915061102060e08601610fc3565b905092959194509250565b6001600160a01b0391909116815260200190565b5f805f805f806101608789031215611055575f80fd5b863561106081610d8a565b955061106f8860208901610db1565b945061107e8860c08901610ed0565b935061012087013592506101408701356001600160401b038111156110a1575f80fd5b6110ad89828a01610dd7565b979a9699509497509295939492505050565b5f805f805f8061012087890312156110d5575f80fd5b86356110e081610d8a565b95506110ef8860208901610db1565b945060c0870135935060e087013592506101008701356001600160401b038111156110a1575f80fd5b8151151581526101c081016020830151611136602084018215159052565b50604083015161114a604084018215159052565b50606083015161115e606084018215159052565b506080830151611172608084018215159052565b5060a083015161118660a084018215159052565b5060c083015161119a60c084018215159052565b5060e08301516111ae60e084018215159052565b506101008301516111c461010084018215159052565b506101208301516111da61012084018215159052565b506101408301516111f061014084018215159052565b5061016083015161120661016084018215159052565b5061018083015161121c61018084018215159052565b506101a08301516112326101a084018215159052565b5092915050565b5f805f60e0848603121561124b575f80fd5b833561125681610d8a565b92506112658560208601610db1565b915060c084013561127581610d8a565b809150509250925092565b5f60208284031215611290575f80fd5b8135610ec981610d8a565b808202811582820484141761049257634e487b7160e01b5f52601160045260245ffd5b5f826112d857634e487b7160e01b5f52601260045260245ffd5b500490565b61ffff92831681529116602082015260400190565b5f60208284031215611302575f80fd5b5051919050565b8015158114610d9e575f80fd5b5f60208284031215611326575f80fd5b8135610ec981611309565b803562ffffff81168114610dac575f80fd5b5f60a0828403128015611354575f80fd5b5060405160a081016001600160401b038111828210171561138357634e487b7160e01b5f52604160045260245ffd5b60405261138f83610da1565b815261139d60208401610da1565b60208201526113ae60408401611331565b60408201526113bf60608401610fc3565b60608201526113d060808401610da1565b60808201529392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611402575f80fd5b8151610ec98161130956fea26469706673582212207c5d3c0125472d6d4a682d879b3fa761e7290775ca8090df88bda4d5259b689764736f6c634300081a0033000000000000000000000000e03a1074c86cfedd5c142c4f04f1a1536e2035430000000000000000000000005501e1fa81be1c3f49225fa7668da0245d07db60000000000000000000000000b63abab9019fa0db4a3ab1824c5e5fa7171f1472000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000bc8744370bcb6d5abf5de8b4086ecfbb4c5629c3","recompiledBytecode":"0x60e060405260015f55348015610013575f80fd5b50604051611932380380611932833981016040819052610032916103fb565b6001600160a01b038516608052808561004a3061017e565b506001600160a01b03811661007d575f604051631e4fbdf760e01b81526004016100749190610464565b60405180910390fd5b61008681610271565b506001600160a01b03851615806100a457506001600160a01b038416155b806100b657506001600160a01b038316155b156100d45760405163d92e233d60e01b815260040160405180910390fd5b606461ffff8316111561010757604051633c057d7b60e01b815261ffff8316600482015260646024820152604401610074565b6001600160a01b0384811660a052831660c0526002805461ffff60a01b1916600160a01b61ffff851690810291909117909155604080515f815260208101929092527f9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64910160405180910390a15050505050610478565b61026e81610269604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052600160e0820181905261010082018390526101208201839052610140820183905261016082015261018081018290526101a081019190915290565b6102cd565b50565b600280546001600160a01b0319908116909155600180546001600160a01b0384811693821684179092556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6102d681610311565b6001600160a01b0316613fff83166001600160a01b03161461030d5781604051630732d7b560e51b81526004016100749190610464565b5050565b80515f901561031f57612000175b81602001511561032e57611000175b81604001511561033d57610800175b81606001511561034c57610400175b81608001511561035b57610200175b8160a001511561036a57610100175b8160c0015115610378576080175b8160e0015115610386576040175b81610100015115610395576020175b816101200151156103a4576010175b816101400151156103b3576008175b816101600151156103c2576004175b816101800151156103d1576002175b816101a00151156103e0576001175b919050565b80516001600160a01b03811681146103e0575f80fd5b5f805f805f60a0868803121561040f575f80fd5b610418866103e5565b9450610426602087016103e5565b9350610434604087016103e5565b9250606086015161ffff8116811461044a575f80fd5b9150610458608087016103e5565b90509295509295909350565b6001600160a01b0391909116815260200190565b60805160a05160c0516114436104ef5f395f818161042e0152818161065a0152818161069501528181610b0101528181610b3c0152610b9f01525f8181610399015281816105bf0152818161099301528181610c640152610d5601525f81816103c0015281816107940152610a8701526114435ff3fe608060405234801561000f575f80fd5b5060043610610126575f3560e01c806321d0ee701461012a5780632205f5681461015b578063259982e51461012a5780632c43afc51461017c578063575e24b4146101915780636b9f96ea146101cf5780636c2bbe7e146101d75780636fe7e6eb1461020a57806379ba5097146102185780638da5cb5b146102205780639f063efc146101d7578063b47b2fb11461023a578063b6a8b0fa14610270578063c40849381461027e578063c4e833ce14610285578063c6878f4e14610379578063c98a295b14610394578063dc4c90d3146103bb578063dc98354e146103e2578063e1b4af6914610270578063e30c3978146103f0578063ea26abcf14610401578063f2fde38b14610416578063fbfa77cf14610429575b5f80fd5b61013d610138366004610e1b565b610450565b6040516001600160e01b031990911681526020015b60405180910390f35b61016e610169366004610e91565b61046a565b604051908152602001610152565b61018f61018a366004610ea8565b610498565b005b6101a461019f366004610ee0565b610564565b604080516001600160e01b03199094168452602084019290925262ffffff1690820152606001610152565b61018f610580565b6101ea6101e5366004610f39565b610734565b604080516001600160e01b03199093168352602083019190915201610152565b61013d610138366004610fd4565b61018f61074f565b6001546001600160a01b03165b604051610152919061102b565b61024d61024836600461103f565b610787565b604080516001600160e01b03199093168352600f9190910b602083015201610152565b61013d6101383660046110bf565b604461022d565b61036c604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052600160e0820181905261010082018390526101208201839052610140820183905261016082015261018081018290526101a081019190915290565b6040516101529190611118565b610381606481565b60405161ffff9091168152602001610152565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61013d610138366004611239565b6002546001600160a01b031661022d565b60025461038190600160a01b900461ffff1681565b61018f610424366004611280565b6107ef565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b5f604051630a85dc2960e01b815260040160405180910390fd5b6002545f906127109061048890600160a01b900461ffff168461129b565b61049291906112be565b92915050565b6001546001600160a01b031633146104ce573360405163118cdaa760e01b81526004016104c5919061102b565b60405180910390fd5b606461ffff821611156104f957806064604051633c057d7b60e01b81526004016104c59291906112dd565b7f9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64600260149054906101000a900461ffff168260405161053a9291906112dd565b60405180910390a16002805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b5f805f604051630a85dc2960e01b815260040160405180910390fd5b60025f54036105a257604051633ee5aeb560e01b815260040160405180910390fd5b60025f9081556040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105f490309060040161102b565b602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906112f2565b9050805f0361065557604051633ada528f60e21b815260040160405180910390fd5b61067f7f00000000000000000000000000000000000000000000000000000000000000008261086d565b60405163f14faf6f60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b1580156106de575f80fd5b505af11580156106f0573d5f803e3d5ffd5b505050507fed1eeda1fde9cc22a2ecf41efc0d6cf519c1d95184b36b93b4cd4877881488ee8160405161072591815260200190565b60405180910390a15060015f55565b5f80604051630a85dc2960e01b815260040160405180910390fd5b6002546001600160a01b0316331461077c573360405163118cdaa760e01b81526004016104c5919061102b565b610785336108ba565b565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d25760405163570c108560e11b815260040160405180910390fd5b6107e0888888888888610916565b91509150965096945050505050565b6001546001600160a01b0316331461081c573360405163118cdaa760e01b81526004016104c5919061102b565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700905f90a350565b6108778282610c5f565b6108b657610885825f610c5f565b158061089857506108968282610c5f565b155b156108b657604051633e3f8f7360e01b815260040160405180910390fd5b5050565b600280546001600160a01b0319908116909155600180546001600160a01b0384811693821684179092556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8060025f540361093a57604051633ee5aeb560e01b815260040160405180910390fd5b60025f90815560208701351261095b575063b47b2fb160e01b90505f610c4e565b5f6109696020880188611316565b61097f5761097a6020890189611280565b61098f565b61098f6040890160208a01611280565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146109dd575063b47b2fb160e01b91505f9050610c4e565b5f6109eb6020890189611316565b6109fe576109f98760801d90565b610a08565b610a0887600f0b90565b90505f81600f0b13610a29575063b47b2fb160e01b92505f9150610c4e9050565b5f610a3c826001600160801b031661046a565b9050805f03610a5b575063b47b2fb160e01b93505f9250610c4e915050565b604051630b0d9c0960e01b81526001600160a01b038481166004830152306024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690630b0d9c09906064015f604051808303815f87803b158015610ac8575f80fd5b505af1158015610ada573d5f803e3d5ffd5b505050505f610afa8b803603810190610af39190611343565b60a0902090565b9050610b267f00000000000000000000000000000000000000000000000000000000000000008361086d565b60405163f14faf6f60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b158015610b85575f80fd5b505af1925050508015610b96575060015b610c0357610bc47f00000000000000000000000000000000000000000000000000000000000000005f61086d565b807f76853f6287e5caf0c4284c123f04368dc4ada480832f72484e445adf762ee45783604051610bf691815260200190565b60405180910390a2610c3e565b807f5cba8bc9707d2af8fcbba504de8cd3ae98564aac502e8c1db7bf8853ff678ec283604051610c3591815260200190565b60405180910390a25b5063b47b2fb160e01b9450925050505b60015f559097909650945050505050565b5f805f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585604051602401610cb39291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b17905251610ce891906113dc565b5f604051808303815f865af19150503d805f8114610d21576040519150601f19603f3d011682016040523d82523d5f602084013e610d26565b606091505b5091509150818015610d815750805115610d535780806020019051810190610d4e91906113f2565b610d81565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b115b95945050505050565b6001600160a01b0381168114610d9e575f80fd5b50565b8035610dac81610d8a565b919050565b5f60a08284031215610dc1575f80fd5b50919050565b5f60808284031215610dc1575f80fd5b5f8083601f840112610de7575f80fd5b5081356001600160401b03811115610dfd575f80fd5b602083019150836020828501011115610e14575f80fd5b9250929050565b5f805f805f6101608688031215610e30575f80fd5b8535610e3b81610d8a565b9450610e4a8760208801610db1565b9350610e598760c08801610dc7565b92506101408601356001600160401b03811115610e74575f80fd5b610e8088828901610dd7565b969995985093965092949392505050565b5f60208284031215610ea1575f80fd5b5035919050565b5f60208284031215610eb8575f80fd5b813561ffff81168114610ec9575f80fd5b9392505050565b5f60608284031215610dc1575f80fd5b5f805f805f6101408688031215610ef5575f80fd5b8535610f0081610d8a565b9450610f0f8760208801610db1565b9350610f1e8760c08801610ed0565b92506101208601356001600160401b03811115610e74575f80fd5b5f805f805f805f6101a0888a031215610f50575f80fd5b8735610f5b81610d8a565b9650610f6a8960208a01610db1565b9550610f798960c08a01610dc7565b9450610140880135935061016088013592506101808801356001600160401b03811115610fa4575f80fd5b610fb08a828b01610dd7565b989b979a50959850939692959293505050565b8035600281900b8114610dac575f80fd5b5f805f806101008587031215610fe8575f80fd5b8435610ff381610d8a565b93506110028660208701610db1565b925060c085013561101281610d8a565b915061102060e08601610fc3565b905092959194509250565b6001600160a01b0391909116815260200190565b5f805f805f806101608789031215611055575f80fd5b863561106081610d8a565b955061106f8860208901610db1565b945061107e8860c08901610ed0565b935061012087013592506101408701356001600160401b038111156110a1575f80fd5b6110ad89828a01610dd7565b979a9699509497509295939492505050565b5f805f805f8061012087890312156110d5575f80fd5b86356110e081610d8a565b95506110ef8860208901610db1565b945060c0870135935060e087013592506101008701356001600160401b038111156110a1575f80fd5b8151151581526101c081016020830151611136602084018215159052565b50604083015161114a604084018215159052565b50606083015161115e606084018215159052565b506080830151611172608084018215159052565b5060a083015161118660a084018215159052565b5060c083015161119a60c084018215159052565b5060e08301516111ae60e084018215159052565b506101008301516111c461010084018215159052565b506101208301516111da61012084018215159052565b506101408301516111f061014084018215159052565b5061016083015161120661016084018215159052565b5061018083015161121c61018084018215159052565b506101a08301516112326101a084018215159052565b5092915050565b5f805f60e0848603121561124b575f80fd5b833561125681610d8a565b92506112658560208601610db1565b915060c084013561127581610d8a565b809150509250925092565b5f60208284031215611290575f80fd5b8135610ec981610d8a565b808202811582820484141761049257634e487b7160e01b5f52601160045260245ffd5b5f826112d857634e487b7160e01b5f52601260045260245ffd5b500490565b61ffff92831681529116602082015260400190565b5f60208284031215611302575f80fd5b5051919050565b8015158114610d9e575f80fd5b5f60208284031215611326575f80fd5b8135610ec981611309565b803562ffffff81168114610dac575f80fd5b5f60a0828403128015611354575f80fd5b5060405160a081016001600160401b038111828210171561138357634e487b7160e01b5f52604160045260245ffd5b60405261138f83610da1565b815261139d60208401610da1565b60208201526113ae60408401611331565b60408201526113bf60608401610fc3565b60608201526113d060808401610da1565b60808201529392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611402575f80fd5b8151610ec98161130956fea26469706673582212207c5d3c0125472d6d4a682d879b3fa761e7290775ca8090df88bda4d5259b689764736f6c634300081a0033","sourceMap":"12121:6302:0:-:0;;;9613:1;9662:37;;13664:567;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5942:26:0;;;;13852:6;13806:12;5978:25;5998:4;5978:19;:25::i;:::-;-1:-1:-1;;;;;;10461:26:0;;10457:70;;10524:1;10496:31;;-1:-1:-1;;;10496:31:0;;;;;;;;:::i;:::-;;;;;;;;10457:70;10537:32;10556:12;10537:18;:32::i;:::-;-1:-1:-1;;;;;;13878:26:0;::::2;::::0;;:48:::2;;-1:-1:-1::0;;;;;;13908:18:0;::::2;::::0;13878:48:::2;:72;;;-1:-1:-1::0;;;;;;13930:20:0;::::2;::::0;13878:72:::2;13874:98;;;13959:13;;-1:-1:-1::0;;;13959:13:0::2;;;;;;;;;;;13874:98;12431:3;13986:30;::::0;::::2;;13982:84;;;14025:41;::::0;-1:-1:-1;;;14025:41:0;;1227:6:1;1215:19;;14025:41:0::2;::::0;::::2;1197:38:1::0;12431:3:0::2;1251:18:1::0;;;1244:47;1170:18;;14025:41:0::2;1027:270:1::0;13982:84:0::2;-1:-1:-1::0;;;;;14076:28:0;;::::2;;::::0;14114:35;::::2;;::::0;14159:10:::2;:24:::0;;-1:-1:-1;;;;14159:24:0::2;-1:-1:-1::0;;;14159:24:0::2;::::0;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;14198:26:::2;::::0;;-1:-1:-1;1197:38:1;;1266:2;1251:18;;1244:47;;;;14198:26:0::2;::::0;1170:18:1;14198:26:0::2;;;;;;;13664:567:::0;;;;;12121:6302;;6237:163;6320:73;6364:5;6372:20;12121:6302;;;;;;;;-1:-1:-1;12121:6302:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14403:576:0;;;;;;;;-1:-1:-1;14403:576:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14294:692;6372:20;6320:35;:73::i;:::-;6237:163;:::o;11233:198::-;11304:13;11297:20;;-1:-1:-1;;;;;;11297:20:0;;;;;;;11341:6;;-1:-1:-1;;;;;11357:17:0;;;;;;;;;;;11389:35;;11341:6;;;11357:17;11341:6;;11389:35;;11304:13;;11389:35;11287:144;11233:198;:::o;5353:181::-;5483:10;5491:1;5483:7;:10::i;:::-;-1:-1:-1;;;;;5450:43:0;2654:13;5458:4;5450:29;-1:-1:-1;;;;;5450:43:0;;5446:81;;5522:4;5502:25;;-1:-1:-1;;;5502:25:0;;;;;;;;:::i;5446:81::-;5353:181;;:::o;4143:1062::-;4234:18;;4205:13;;4230:55;;;2726:7;4254:31;4230:55;4299:1;:17;;;4295:53;;;2789:7;4318:30;4295:53;4362:1;:20;;;4358:60;;;2856:7;4384:34;4358:60;4432:1;:19;;;4428:58;;;2922:7;4453:33;4428:58;4500:1;:23;;;4496:66;;;2992:6;4525:37;4496:66;4576:1;:22;;;4572:64;;;3060:6;4600:36;4572:64;4650:1;:12;;;4646:43;;;3117:6;4664:25;4646:43;4703:1;:11;;;4699:41;;;3173:6;4716:24;4699:41;4754:1;:14;;;4750:47;;;3232:6;4770:27;4750:47;4811:1;:13;;;4807:45;;;3290:6;4826:26;4807:45;4866:1;:23;;;4862:68;;;3361:6;4891:39;4862:68;4944:1;:22;;;4940:66;;;3431:6;4968:38;4940:66;5020:1;:30;;;5016:83;;;3510:6;5052:47;5016:83;5113:1;:33;;;5109:89;;;3592:6;5148:50;5109:89;4143:1062;;;:::o;14:177:1:-;93:13;;-1:-1:-1;;;;;135:31:1;;125:42;;115:70;;181:1;178;171:12;196:618;301:6;309;317;325;333;386:3;374:9;365:7;361:23;357:33;354:53;;;403:1;400;393:12;354:53;426:40;456:9;426:40;:::i;:::-;416:50;;485:49;530:2;519:9;515:18;485:49;:::i;:::-;475:59;;553:49;598:2;587:9;583:18;553:49;:::i;:::-;543:59;;645:2;634:9;630:18;624:25;689:6;682:5;678:18;671:5;668:29;658:57;;711:1;708;701:12;658:57;734:5;-1:-1:-1;758:50:1;803:3;788:19;;758:50;:::i;:::-;748:60;;196:618;;;;;;;;:::o;819:203::-;-1:-1:-1;;;;;983:32:1;;;;965:51;;953:2;938:18;;819:203::o;1302:279::-;12121:6302:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212207c5d3c0125472d6d4a682d879b3fa761e7290775ca8090df88bda4d5259b689764736f6c634300081a0033","offset":6397}},"transformations":[{"type":"insert","offset":6450,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x000000000000000000000000e03a1074c86cfedd5c142c4f04f1a1536e2035430000000000000000000000005501e1fa81be1c3f49225fa7668da0245d07db60000000000000000000000000b63abab9019fa0db4a3ab1824c5e5fa7171f1472000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000bc8744370bcb6d5abf5de8b4086ecfbb4c5629c3"}},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561000f575f80fd5b5060043610610126575f3560e01c806321d0ee701461012a5780632205f5681461015b578063259982e51461012a5780632c43afc51461017c578063575e24b4146101915780636b9f96ea146101cf5780636c2bbe7e146101d75780636fe7e6eb1461020a57806379ba5097146102185780638da5cb5b146102205780639f063efc146101d7578063b47b2fb11461023a578063b6a8b0fa14610270578063c40849381461027e578063c4e833ce14610285578063c6878f4e14610379578063c98a295b14610394578063dc4c90d3146103bb578063dc98354e146103e2578063e1b4af6914610270578063e30c3978146103f0578063ea26abcf14610401578063f2fde38b14610416578063fbfa77cf14610429575b5f80fd5b61013d610138366004610e1b565b610450565b6040516001600160e01b031990911681526020015b60405180910390f35b61016e610169366004610e91565b61046a565b604051908152602001610152565b61018f61018a366004610ea8565b610498565b005b6101a461019f366004610ee0565b610564565b604080516001600160e01b03199094168452602084019290925262ffffff1690820152606001610152565b61018f610580565b6101ea6101e5366004610f39565b610734565b604080516001600160e01b03199093168352602083019190915201610152565b61013d610138366004610fd4565b61018f61074f565b6001546001600160a01b03165b604051610152919061102b565b61024d61024836600461103f565b610787565b604080516001600160e01b03199093168352600f9190910b602083015201610152565b61013d6101383660046110bf565b604461022d565b61036c604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052600160e0820181905261010082018390526101208201839052610140820183905261016082015261018081018290526101a081019190915290565b6040516101529190611118565b610381606481565b60405161ffff9091168152602001610152565b61022d7f0000000000000000000000005501e1fa81be1c3f49225fa7668da0245d07db6081565b61022d7f000000000000000000000000e03a1074c86cfedd5c142c4f04f1a1536e20354381565b61013d610138366004611239565b6002546001600160a01b031661022d565b60025461038190600160a01b900461ffff1681565b61018f610424366004611280565b6107ef565b61022d7f000000000000000000000000b63abab9019fa0db4a3ab1824c5e5fa7171f147281565b5f604051630a85dc2960e01b815260040160405180910390fd5b6002545f906127109061048890600160a01b900461ffff168461129b565b61049291906112be565b92915050565b6001546001600160a01b031633146104ce573360405163118cdaa760e01b81526004016104c5919061102b565b60405180910390fd5b606461ffff821611156104f957806064604051633c057d7b60e01b81526004016104c59291906112dd565b7f9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64600260149054906101000a900461ffff168260405161053a9291906112dd565b60405180910390a16002805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b5f805f604051630a85dc2960e01b815260040160405180910390fd5b60025f54036105a257604051633ee5aeb560e01b815260040160405180910390fd5b60025f9081556040516370a0823160e01b81526001600160a01b037f0000000000000000000000005501e1fa81be1c3f49225fa7668da0245d07db6016906370a08231906105f490309060040161102b565b602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906112f2565b9050805f0361065557604051633ada528f60e21b815260040160405180910390fd5b61067f7f000000000000000000000000b63abab9019fa0db4a3ab1824c5e5fa7171f14728261086d565b60405163f14faf6f60e01b8152600481018290527f000000000000000000000000b63abab9019fa0db4a3ab1824c5e5fa7171f14726001600160a01b03169063f14faf6f906024015f604051808303815f87803b1580156106de575f80fd5b505af11580156106f0573d5f803e3d5ffd5b505050507fed1eeda1fde9cc22a2ecf41efc0d6cf519c1d95184b36b93b4cd4877881488ee8160405161072591815260200190565b60405180910390a15060015f55565b5f80604051630a85dc2960e01b815260040160405180910390fd5b6002546001600160a01b0316331461077c573360405163118cdaa760e01b81526004016104c5919061102b565b610785336108ba565b565b5f80336001600160a01b037f000000000000000000000000e03a1074c86cfedd5c142c4f04f1a1536e20354316146107d25760405163570c108560e11b815260040160405180910390fd5b6107e0888888888888610916565b91509150965096945050505050565b6001546001600160a01b0316331461081c573360405163118cdaa760e01b81526004016104c5919061102b565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700905f90a350565b6108778282610c5f565b6108b657610885825f610c5f565b158061089857506108968282610c5f565b155b156108b657604051633e3f8f7360e01b815260040160405180910390fd5b5050565b600280546001600160a01b0319908116909155600180546001600160a01b0384811693821684179092556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8060025f540361093a57604051633ee5aeb560e01b815260040160405180910390fd5b60025f90815560208701351261095b575063b47b2fb160e01b90505f610c4e565b5f6109696020880188611316565b61097f5761097a6020890189611280565b61098f565b61098f6040890160208a01611280565b90507f0000000000000000000000005501e1fa81be1c3f49225fa7668da0245d07db606001600160a01b0316816001600160a01b0316146109dd575063b47b2fb160e01b91505f9050610c4e565b5f6109eb6020890189611316565b6109fe576109f98760801d90565b610a08565b610a0887600f0b90565b90505f81600f0b13610a29575063b47b2fb160e01b92505f9150610c4e9050565b5f610a3c826001600160801b031661046a565b9050805f03610a5b575063b47b2fb160e01b93505f9250610c4e915050565b604051630b0d9c0960e01b81526001600160a01b038481166004830152306024830152604482018390527f000000000000000000000000e03a1074c86cfedd5c142c4f04f1a1536e2035431690630b0d9c09906064015f604051808303815f87803b158015610ac8575f80fd5b505af1158015610ada573d5f803e3d5ffd5b505050505f610afa8b803603810190610af39190611343565b60a0902090565b9050610b267f000000000000000000000000b63abab9019fa0db4a3ab1824c5e5fa7171f14728361086d565b60405163f14faf6f60e01b8152600481018390527f000000000000000000000000b63abab9019fa0db4a3ab1824c5e5fa7171f14726001600160a01b03169063f14faf6f906024015f604051808303815f87803b158015610b85575f80fd5b505af1925050508015610b96575060015b610c0357610bc47f000000000000000000000000b63abab9019fa0db4a3ab1824c5e5fa7171f14725f61086d565b807f76853f6287e5caf0c4284c123f04368dc4ada480832f72484e445adf762ee45783604051610bf691815260200190565b60405180910390a2610c3e565b807f5cba8bc9707d2af8fcbba504de8cd3ae98564aac502e8c1db7bf8853ff678ec283604051610c3591815260200190565b60405180910390a25b5063b47b2fb160e01b9450925050505b60015f559097909650945050505050565b5f805f7f0000000000000000000000005501e1fa81be1c3f49225fa7668da0245d07db606001600160a01b03168585604051602401610cb39291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b17905251610ce891906113dc565b5f604051808303815f865af19150503d805f8114610d21576040519150601f19603f3d011682016040523d82523d5f602084013e610d26565b606091505b5091509150818015610d815750805115610d535780806020019051810190610d4e91906113f2565b610d81565b5f7f0000000000000000000000005501e1fa81be1c3f49225fa7668da0245d07db606001600160a01b03163b115b95945050505050565b6001600160a01b0381168114610d9e575f80fd5b50565b8035610dac81610d8a565b919050565b5f60a08284031215610dc1575f80fd5b50919050565b5f60808284031215610dc1575f80fd5b5f8083601f840112610de7575f80fd5b5081356001600160401b03811115610dfd575f80fd5b602083019150836020828501011115610e14575f80fd5b9250929050565b5f805f805f6101608688031215610e30575f80fd5b8535610e3b81610d8a565b9450610e4a8760208801610db1565b9350610e598760c08801610dc7565b92506101408601356001600160401b03811115610e74575f80fd5b610e8088828901610dd7565b969995985093965092949392505050565b5f60208284031215610ea1575f80fd5b5035919050565b5f60208284031215610eb8575f80fd5b813561ffff81168114610ec9575f80fd5b9392505050565b5f60608284031215610dc1575f80fd5b5f805f805f6101408688031215610ef5575f80fd5b8535610f0081610d8a565b9450610f0f8760208801610db1565b9350610f1e8760c08801610ed0565b92506101208601356001600160401b03811115610e74575f80fd5b5f805f805f805f6101a0888a031215610f50575f80fd5b8735610f5b81610d8a565b9650610f6a8960208a01610db1565b9550610f798960c08a01610dc7565b9450610140880135935061016088013592506101808801356001600160401b03811115610fa4575f80fd5b610fb08a828b01610dd7565b989b979a50959850939692959293505050565b8035600281900b8114610dac575f80fd5b5f805f806101008587031215610fe8575f80fd5b8435610ff381610d8a565b93506110028660208701610db1565b925060c085013561101281610d8a565b915061102060e08601610fc3565b905092959194509250565b6001600160a01b0391909116815260200190565b5f805f805f806101608789031215611055575f80fd5b863561106081610d8a565b955061106f8860208901610db1565b945061107e8860c08901610ed0565b935061012087013592506101408701356001600160401b038111156110a1575f80fd5b6110ad89828a01610dd7565b979a9699509497509295939492505050565b5f805f805f8061012087890312156110d5575f80fd5b86356110e081610d8a565b95506110ef8860208901610db1565b945060c0870135935060e087013592506101008701356001600160401b038111156110a1575f80fd5b8151151581526101c081016020830151611136602084018215159052565b50604083015161114a604084018215159052565b50606083015161115e606084018215159052565b506080830151611172608084018215159052565b5060a083015161118660a084018215159052565b5060c083015161119a60c084018215159052565b5060e08301516111ae60e084018215159052565b506101008301516111c461010084018215159052565b506101208301516111da61012084018215159052565b506101408301516111f061014084018215159052565b5061016083015161120661016084018215159052565b5061018083015161121c61018084018215159052565b506101a08301516112326101a084018215159052565b5092915050565b5f805f60e0848603121561124b575f80fd5b833561125681610d8a565b92506112658560208601610db1565b915060c084013561127581610d8a565b809150509250925092565b5f60208284031215611290575f80fd5b8135610ec981610d8a565b808202811582820484141761049257634e487b7160e01b5f52601160045260245ffd5b5f826112d857634e487b7160e01b5f52601260045260245ffd5b500490565b61ffff92831681529116602082015260400190565b5f60208284031215611302575f80fd5b5051919050565b8015158114610d9e575f80fd5b5f60208284031215611326575f80fd5b8135610ec981611309565b803562ffffff81168114610dac575f80fd5b5f60a0828403128015611354575f80fd5b5060405160a081016001600160401b038111828210171561138357634e487b7160e01b5f52604160045260245ffd5b60405261138f83610da1565b815261139d60208401610da1565b60208201526113ae60408401611331565b60408201526113bf60608401610fc3565b60608201526113d060808401610da1565b60808201529392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611402575f80fd5b8151610ec98161130956fea26469706673582212207c5d3c0125472d6d4a682d879b3fa761e7290775ca8090df88bda4d5259b689764736f6c634300081a0033","recompiledBytecode":"0x608060405234801561000f575f80fd5b5060043610610126575f3560e01c806321d0ee701461012a5780632205f5681461015b578063259982e51461012a5780632c43afc51461017c578063575e24b4146101915780636b9f96ea146101cf5780636c2bbe7e146101d75780636fe7e6eb1461020a57806379ba5097146102185780638da5cb5b146102205780639f063efc146101d7578063b47b2fb11461023a578063b6a8b0fa14610270578063c40849381461027e578063c4e833ce14610285578063c6878f4e14610379578063c98a295b14610394578063dc4c90d3146103bb578063dc98354e146103e2578063e1b4af6914610270578063e30c3978146103f0578063ea26abcf14610401578063f2fde38b14610416578063fbfa77cf14610429575b5f80fd5b61013d610138366004610e1b565b610450565b6040516001600160e01b031990911681526020015b60405180910390f35b61016e610169366004610e91565b61046a565b604051908152602001610152565b61018f61018a366004610ea8565b610498565b005b6101a461019f366004610ee0565b610564565b604080516001600160e01b03199094168452602084019290925262ffffff1690820152606001610152565b61018f610580565b6101ea6101e5366004610f39565b610734565b604080516001600160e01b03199093168352602083019190915201610152565b61013d610138366004610fd4565b61018f61074f565b6001546001600160a01b03165b604051610152919061102b565b61024d61024836600461103f565b610787565b604080516001600160e01b03199093168352600f9190910b602083015201610152565b61013d6101383660046110bf565b604461022d565b61036c604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052600160e0820181905261010082018390526101208201839052610140820183905261016082015261018081018290526101a081019190915290565b6040516101529190611118565b610381606481565b60405161ffff9091168152602001610152565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61013d610138366004611239565b6002546001600160a01b031661022d565b60025461038190600160a01b900461ffff1681565b61018f610424366004611280565b6107ef565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b5f604051630a85dc2960e01b815260040160405180910390fd5b6002545f906127109061048890600160a01b900461ffff168461129b565b61049291906112be565b92915050565b6001546001600160a01b031633146104ce573360405163118cdaa760e01b81526004016104c5919061102b565b60405180910390fd5b606461ffff821611156104f957806064604051633c057d7b60e01b81526004016104c59291906112dd565b7f9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64600260149054906101000a900461ffff168260405161053a9291906112dd565b60405180910390a16002805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b5f805f604051630a85dc2960e01b815260040160405180910390fd5b60025f54036105a257604051633ee5aeb560e01b815260040160405180910390fd5b60025f9081556040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105f490309060040161102b565b602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906112f2565b9050805f0361065557604051633ada528f60e21b815260040160405180910390fd5b61067f7f00000000000000000000000000000000000000000000000000000000000000008261086d565b60405163f14faf6f60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b1580156106de575f80fd5b505af11580156106f0573d5f803e3d5ffd5b505050507fed1eeda1fde9cc22a2ecf41efc0d6cf519c1d95184b36b93b4cd4877881488ee8160405161072591815260200190565b60405180910390a15060015f55565b5f80604051630a85dc2960e01b815260040160405180910390fd5b6002546001600160a01b0316331461077c573360405163118cdaa760e01b81526004016104c5919061102b565b610785336108ba565b565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d25760405163570c108560e11b815260040160405180910390fd5b6107e0888888888888610916565b91509150965096945050505050565b6001546001600160a01b0316331461081c573360405163118cdaa760e01b81526004016104c5919061102b565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700905f90a350565b6108778282610c5f565b6108b657610885825f610c5f565b158061089857506108968282610c5f565b155b156108b657604051633e3f8f7360e01b815260040160405180910390fd5b5050565b600280546001600160a01b0319908116909155600180546001600160a01b0384811693821684179092556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8060025f540361093a57604051633ee5aeb560e01b815260040160405180910390fd5b60025f90815560208701351261095b575063b47b2fb160e01b90505f610c4e565b5f6109696020880188611316565b61097f5761097a6020890189611280565b61098f565b61098f6040890160208a01611280565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146109dd575063b47b2fb160e01b91505f9050610c4e565b5f6109eb6020890189611316565b6109fe576109f98760801d90565b610a08565b610a0887600f0b90565b90505f81600f0b13610a29575063b47b2fb160e01b92505f9150610c4e9050565b5f610a3c826001600160801b031661046a565b9050805f03610a5b575063b47b2fb160e01b93505f9250610c4e915050565b604051630b0d9c0960e01b81526001600160a01b038481166004830152306024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690630b0d9c09906064015f604051808303815f87803b158015610ac8575f80fd5b505af1158015610ada573d5f803e3d5ffd5b505050505f610afa8b803603810190610af39190611343565b60a0902090565b9050610b267f00000000000000000000000000000000000000000000000000000000000000008361086d565b60405163f14faf6f60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b158015610b85575f80fd5b505af1925050508015610b96575060015b610c0357610bc47f00000000000000000000000000000000000000000000000000000000000000005f61086d565b807f76853f6287e5caf0c4284c123f04368dc4ada480832f72484e445adf762ee45783604051610bf691815260200190565b60405180910390a2610c3e565b807f5cba8bc9707d2af8fcbba504de8cd3ae98564aac502e8c1db7bf8853ff678ec283604051610c3591815260200190565b60405180910390a25b5063b47b2fb160e01b9450925050505b60015f559097909650945050505050565b5f805f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585604051602401610cb39291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b17905251610ce891906113dc565b5f604051808303815f865af19150503d805f8114610d21576040519150601f19603f3d011682016040523d82523d5f602084013e610d26565b606091505b5091509150818015610d815750805115610d535780806020019051810190610d4e91906113f2565b610d81565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b115b95945050505050565b6001600160a01b0381168114610d9e575f80fd5b50565b8035610dac81610d8a565b919050565b5f60a08284031215610dc1575f80fd5b50919050565b5f60808284031215610dc1575f80fd5b5f8083601f840112610de7575f80fd5b5081356001600160401b03811115610dfd575f80fd5b602083019150836020828501011115610e14575f80fd5b9250929050565b5f805f805f6101608688031215610e30575f80fd5b8535610e3b81610d8a565b9450610e4a8760208801610db1565b9350610e598760c08801610dc7565b92506101408601356001600160401b03811115610e74575f80fd5b610e8088828901610dd7565b969995985093965092949392505050565b5f60208284031215610ea1575f80fd5b5035919050565b5f60208284031215610eb8575f80fd5b813561ffff81168114610ec9575f80fd5b9392505050565b5f60608284031215610dc1575f80fd5b5f805f805f6101408688031215610ef5575f80fd5b8535610f0081610d8a565b9450610f0f8760208801610db1565b9350610f1e8760c08801610ed0565b92506101208601356001600160401b03811115610e74575f80fd5b5f805f805f805f6101a0888a031215610f50575f80fd5b8735610f5b81610d8a565b9650610f6a8960208a01610db1565b9550610f798960c08a01610dc7565b9450610140880135935061016088013592506101808801356001600160401b03811115610fa4575f80fd5b610fb08a828b01610dd7565b989b979a50959850939692959293505050565b8035600281900b8114610dac575f80fd5b5f805f806101008587031215610fe8575f80fd5b8435610ff381610d8a565b93506110028660208701610db1565b925060c085013561101281610d8a565b915061102060e08601610fc3565b905092959194509250565b6001600160a01b0391909116815260200190565b5f805f805f806101608789031215611055575f80fd5b863561106081610d8a565b955061106f8860208901610db1565b945061107e8860c08901610ed0565b935061012087013592506101408701356001600160401b038111156110a1575f80fd5b6110ad89828a01610dd7565b979a9699509497509295939492505050565b5f805f805f8061012087890312156110d5575f80fd5b86356110e081610d8a565b95506110ef8860208901610db1565b945060c0870135935060e087013592506101008701356001600160401b038111156110a1575f80fd5b8151151581526101c081016020830151611136602084018215159052565b50604083015161114a604084018215159052565b50606083015161115e606084018215159052565b506080830151611172608084018215159052565b5060a083015161118660a084018215159052565b5060c083015161119a60c084018215159052565b5060e08301516111ae60e084018215159052565b506101008301516111c461010084018215159052565b506101208301516111da61012084018215159052565b506101408301516111f061014084018215159052565b5061016083015161120661016084018215159052565b5061018083015161121c61018084018215159052565b506101a08301516112326101a084018215159052565b5092915050565b5f805f60e0848603121561124b575f80fd5b833561125681610d8a565b92506112658560208601610db1565b915060c084013561127581610d8a565b809150509250925092565b5f60208284031215611290575f80fd5b8135610ec981610d8a565b808202811582820484141761049257634e487b7160e01b5f52601160045260245ffd5b5f826112d857634e487b7160e01b5f52601260045260245ffd5b500490565b61ffff92831681529116602082015260400190565b5f60208284031215611302575f80fd5b5051919050565b8015158114610d9e575f80fd5b5f60208284031215611326575f80fd5b8135610ec981611309565b803562ffffff81168114610dac575f80fd5b5f60a0828403128015611354575f80fd5b5060405160a081016001600160401b038111828210171561138357634e487b7160e01b5f52604160045260245ffd5b60405261138f83610da1565b815261139d60208401610da1565b60208201526113ae60408401611331565b60408201526113bf60608401610fc3565b60608201526113d060808401610da1565b60808201529392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611402575f80fd5b8151610ec98161130956fea26469706673582212207c5d3c0125472d6d4a682d879b3fa761e7290775ca8090df88bda4d5259b689764736f6c634300081a0033","sourceMap":"12121:6302:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7255:234;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;2003:33:1;;;1985:52;;1973:2;1958:18;7255:234:0;;;;;;;;15649:125;;;;;;:::i;:::-;;:::i;:::-;;;2425:25:1;;;2413:2;2398:18;15649:125:0;2279:177:1;15327:237:0;;;;;;:::i;:::-;;:::i;:::-;;7810:233;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;;3992:33:1;;;3974:52;;4057:2;4042:18;;4035:34;;;;4117:8;4105:21;4085:18;;;4078:49;3962:2;3947:18;7810:233:0;3737:396:1;15885:258:0;;;:::i;7495:309::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;;5529:33:1;;;5511:52;;5594:2;5579:18;;5572:34;;;;5484:18;7495:309:0;5304:308:1;6558:152:0;;;;;;:::i;11056:171::-;;;:::i;10708:77::-;10772:6;;-1:-1:-1;;;;;10772:6:0;10708:77;;;;;;;:::i;8049:316::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;;7767:33:1;;;7749:52;;7848:2;7837:22;;;;7832:2;7817:18;;7810:50;7722:18;8049:316:0;7579:287:1;8371:195:0;;;;;;:::i;15110:148::-;15180:71;15110:148;;14294:692;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14403:576:0;;;;;;;;-1:-1:-1;14403:576:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14294:692;;;;;;;;:::i;12389:45::-;;12431:3;12389:45;;;;;11080:6:1;11068:19;;;11050:38;;11038:2;11023:18;12389:45:0;10906:188:1;12556:37:0;;;;;5833:47;;;;;6406:146;;;;;;:::i;10791:91::-;10862:13;;-1:-1:-1;;;;;10862:13:0;10791:91;;12817:24;;;;;-1:-1:-1;;;12817:24:0;;;;;;10888:162;;;;;;:::i;:::-;;:::i;12680:42::-;;;;;7255:234;7437:6;7462:20;;-1:-1:-1;;;7462:20:0;;;;;;;;;;;15649:125;15751:10;;15710:7;;12472:6;;15736:25;;-1:-1:-1;;;15751:10:0;;;;15736:12;:25;:::i;:::-;:31;;;;:::i;:::-;15729:38;15649:125;-1:-1:-1;;15649:125:0:o;15327:237::-;10631:6;;-1:-1:-1;;;;;10631:6:0;10617:10;:20;10613:71;;10673:10;10646:38;;-1:-1:-1;;;10646:38:0;;;;;;;;:::i;:::-;;;;;;;;10613:71;12431:3:::1;15401:28;::::0;::::1;;15397:80;;;15449:9;12431:3;15438:39;;-1:-1:-1::0;;;15438:39:0::1;;;;;;;;;:::i;15397:80::-;15492:33;15503:10;;;;;;;;;;;15515:9;15492:33;;;;;;;:::i;:::-;;;;;;;;15535:10;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;15535:22:0::1;-1:-1:-1::0;;;;15535:22:0;;::::1;::::0;;;::::1;::::0;;15327:237::o;7810:233::-;7956:6;7964:21;7987:6;8016:20;;-1:-1:-1;;;8016:20:0;;;;;;;;;;;15885:258;9655:1;9787:7;;:18;9783:61;;9814:30;;-1:-1:-1;;;9814:30:0;;;;;;;;;;;9783:61;9655:1;9854:7;:17;;;15951:28:::1;::::0;-1:-1:-1;;;15951:28:0;;-1:-1:-1;;;;;15951:3:0::1;:13;::::0;::::1;::::0;:28:::1;::::0;15973:4:::1;::::0;15951:28:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15934:45;;15993:6;16003:1;15993:11:::0;15989:40:::1;;16013:16;;-1:-1:-1::0;;;16013:16:0::1;;;;;;;;;;;15989:40;16039:37;16061:5;16069:6;16039:13;:37::i;:::-;16086:20;::::0;-1:-1:-1;;;16086:20:0;;::::1;::::0;::::1;2425:25:1::0;;;16086:5:0::1;-1:-1:-1::0;;;;;16086:12:0::1;::::0;::::1;::::0;2398:18:1;;16086:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16121:15;16129:6;16121:15;;;;2425:25:1::0;;2413:2;2398:18;;2279:177;16121:15:0::1;;;;;;;;-1:-1:-1::0;9613:1:0;9892:7;:21;15885:258::o;7495:309::-;7732:6;7740:18;7777:20;;-1:-1:-1;;;7777:20:0;;;;;;;;;;;11056:171;11120:13;;-1:-1:-1;;;;;11120:13:0;11106:10;:27;11102:78;;11169:10;11142:38;;-1:-1:-1;;;11142:38:0;;;;;;;;:::i;11102:78::-;11190:30;11209:10;11190:18;:30::i;:::-;11056:171::o;8049:316::-;8277:6;;6057:10;-1:-1:-1;;;;;6079:11:0;6057:34;;6053:63;;6100:16;;-1:-1:-1;;;6100:16:0;;;;;;;;;;;6053:63;8310:48:::1;8321:6;8329:3;8334:6;8342:5;8349:8;;8310:10;:48::i;:::-;8303:55;;;;8049:316:::0;;;;;;;;;:::o;10888:162::-;10631:6;;-1:-1:-1;;;;;10631:6:0;10617:10;:20;10613:71;;10673:10;10646:38;;-1:-1:-1;;;10646:38:0;;;;;;;;:::i;10613:71::-;10962:13:::1;:24:::0;;-1:-1:-1;;;;;;10962:24:0::1;-1:-1:-1::0;;;;;10962:24:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;11026:6:0;11001:42:::1;::::0;10962:24;;11026:6:::1;::::0;11001:42:::1;::::0;-1:-1:-1;;11001:42:0::1;10888:162:::0;:::o;17896:222::-;17974:27;17986:7;17995:5;17974:11;:27::i;:::-;17969:143;;18022:23;18034:7;18043:1;18022:11;:23::i;:::-;18021:24;:56;;;;18050:27;18062:7;18071:5;18050:11;:27::i;:::-;18049:28;18021:56;18017:84;;;18086:15;;-1:-1:-1;;;18086:15:0;;;;;;;;;;;18017:84;17896:222;;:::o;11233:198::-;11304:13;11297:20;;-1:-1:-1;;;;;;11297:20:0;;;;;;;11341:6;;-1:-1:-1;;;;;11357:17:0;;;;;;;;;;;11389:35;;11341:6;;;11357:17;11341:6;;11389:35;;11304:13;;11389:35;11287:144;11233:198;:::o;16149:1576::-;16368:6;16376;9655:1;9787:7;;:18;9783:61;;9814:30;;-1:-1:-1;;;9814:30:0;;;;;;;;;;;9783:61;9655:1;9854:7;:17;;;16506:22:::1;::::0;::::1;;:27;16502:78;;-1:-1:-1::0;;;;16543:33:0;-1:-1:-1;16578:1:0::1;16535:45;;16502:78;16591:21;16615:17;;::::0;::::1;:6:::0;:17:::1;:::i;:::-;:49;;16651:13;;::::0;::::1;:3:::0;:13:::1;:::i;:::-;16615:49;;;16635:13;::::0;;;::::1;::::0;::::1;;:::i;:::-;16591:73;;16719:3;-1:-1:-1::0;;;;;16678:45:0::1;16700:6;-1:-1:-1::0;;;;;16678:45:0::1;;16674:96;;-1:-1:-1::0;;;;16733:33:0;-1:-1:-1;16768:1:0::1;::::0;-1:-1:-1;16725:45:0::1;;16674:96;16781:19;16803:17;;::::0;::::1;:6:::0;:17:::1;:::i;:::-;:53;;16841:15;:5;1844:3:::0;1840:11;;1712:155;16841:15:::1;16803:53;;;16823:15;:5;2012:2:::0;2001:17;;1873:161;16823:15:::1;16781:75;;16886:1;16870:12;:17;;;16866:68;;-1:-1:-1::0;;;;16897:33:0;-1:-1:-1;16932:1:0::1;::::0;-1:-1:-1;16889:45:0::1;::::0;-1:-1:-1;16889:45:0::1;16866:68;16945:11;16959:40;16984:12;-1:-1:-1::0;;;;;16968:30:0::1;16959:8;:40::i;:::-;16945:54;;17013:3;17020:1;17013:8:::0;17009:59:::1;;-1:-1:-1::0;;;;17031:33:0;-1:-1:-1;17066:1:0::1;::::0;-1:-1:-1;17023:45:0::1;::::0;-1:-1:-1;;17023:45:0::1;17009:59;17176:44;::::0;-1:-1:-1;;;17176:44:0;;-1:-1:-1;;;;;14443:32:1;;;17176:44:0::1;::::0;::::1;14425:51:1::0;17209:4:0::1;14492:18:1::0;;;14485:60;14561:18;;;14554:34;;;17176:11:0::1;:16;::::0;::::1;::::0;14398:18:1;;17176:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17231:14;17248:10;:3;:8;;;;;;;;;;:::i;:::-;2290:4:::0;2275:20;;;2145:166;17248:10:::1;17231:27;;17268:34;17290:5;17298:3;17268:13;:34::i;:::-;17402:17;::::0;-1:-1:-1;;;17402:17:0;;::::1;::::0;::::1;2425:25:1::0;;;17402:5:0::1;-1:-1:-1::0;;;;;17402:12:0::1;::::0;::::1;::::0;2398:18:1;;17402:17:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;17398:178;;17494:32;17516:5;17524:1;17494:13;:32::i;:::-;17553:6;17545:20;17561:3;17545:20;;;;2425:25:1::0;;2413:2;2398:18;;2279:177;17545:20:0::1;;;;;;;;17398:178;;;17450:6;17439:23;17458:3;17439:23;;;;2425:25:1::0;;2413:2;2398:18;;2279:177;17439:23:0::1;;;;;;;;17398:178;-1:-1:-1::0;;;;17663:33:0;-1:-1:-1;17712:3:0;-1:-1:-1;;;9881:1:0::1;9613::::0;9892:7;:21;16149:1576;;;;-1:-1:-1;16149:1576:0;-1:-1:-1;;;;;16149:1576:0:o;18124:297::-;18194:4;18211:7;18220:16;18248:3;-1:-1:-1;;;;;18240:17:0;18300:7;18309:5;18258:58;;;;;;;;-1:-1:-1;;;;;15833:32:1;;;;15815:51;;15897:2;15882:18;;15875:34;15803:2;15788:18;;15641:274;18258:58:0;;;;-1:-1:-1;;18258:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;18258:58:0;-1:-1:-1;;;18258:58:0;;;18240:77;;;18258:58;18240:77;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18210:107;;;;18334:2;:80;;;;-1:-1:-1;18341:10:0;;:15;:72;;18401:3;18390:23;;;;;;;;;;;;:::i;:::-;18341:72;;;18386:1;18367:3;-1:-1:-1;;;;;18359:24:0;;:28;18341:72;18327:87;18124:297;-1:-1:-1;;;;;18124:297:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:134::-;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:162::-;355:5;400:3;391:6;386:3;382:16;378:26;375:46;;;417:1;414;407:12;375:46;-1:-1:-1;439:6:1;289:162;-1:-1:-1;289:162:1:o;456:176::-;536:5;581:3;572:6;567:3;563:16;559:26;556:46;;;598:1;595;588:12;637:347;688:8;698:6;752:3;745:4;737:6;733:17;729:27;719:55;;770:1;767;760:12;719:55;-1:-1:-1;793:20:1;;-1:-1:-1;;;;;825:30:1;;822:50;;;868:1;865;858:12;822:50;905:4;897:6;893:17;881:29;;957:3;950:4;941:6;933;929:19;925:30;922:39;919:59;;;974:1;971;964:12;919:59;637:347;;;;;:::o;989:847::-;1162:6;1170;1178;1186;1194;1247:3;1235:9;1226:7;1222:23;1218:33;1215:53;;;1264:1;1261;1254:12;1215:53;1303:9;1290:23;1322:31;1347:5;1322:31;:::i;:::-;1372:5;-1:-1:-1;1396:69:1;1457:7;1452:2;1437:18;;1396:69;:::i;:::-;1386:79;;1484:84;1560:7;1554:3;1543:9;1539:19;1484:84;:::i;:::-;1474:94;-1:-1:-1;1619:3:1;1604:19;;1591:33;-1:-1:-1;;;;;1636:30:1;;1633:50;;;1679:1;1676;1669:12;1633:50;1718:58;1768:7;1759:6;1748:9;1744:22;1718:58;:::i;:::-;989:847;;;;-1:-1:-1;989:847:1;;-1:-1:-1;1795:8:1;;1692:84;989:847;-1:-1:-1;;;989:847:1:o;2048:226::-;2107:6;2160:2;2148:9;2139:7;2135:23;2131:32;2128:52;;;2176:1;2173;2166:12;2128:52;-1:-1:-1;2221:23:1;;2048:226;-1:-1:-1;2048:226:1:o;2461:272::-;2519:6;2572:2;2560:9;2551:7;2547:23;2543:32;2540:52;;;2588:1;2585;2578:12;2540:52;2627:9;2614:23;2677:6;2670:5;2666:18;2659:5;2656:29;2646:57;;2699:1;2696;2689:12;2646:57;2722:5;2461:272;-1:-1:-1;;;2461:272:1:o;2738:164::-;2807:5;2852:2;2843:6;2838:3;2834:16;2830:25;2827:45;;;2868:1;2865;2858:12;2907:825;3069:6;3077;3085;3093;3101;3154:3;3142:9;3133:7;3129:23;3125:33;3122:53;;;3171:1;3168;3161:12;3122:53;3210:9;3197:23;3229:31;3254:5;3229:31;:::i;:::-;3279:5;-1:-1:-1;3303:69:1;3364:7;3359:2;3344:18;;3303:69;:::i;:::-;3293:79;;3391:73;3456:7;3450:3;3439:9;3435:19;3391:73;:::i;:::-;3381:83;-1:-1:-1;3515:3:1;3500:19;;3487:33;-1:-1:-1;;;;;3532:30:1;;3529:50;;;3575:1;3572;3565:12;4138:1161;4401:6;4409;4417;4425;4433;4441;4449;4502:3;4490:9;4481:7;4477:23;4473:33;4470:53;;;4519:1;4516;4509:12;4470:53;4558:9;4545:23;4577:31;4602:5;4577:31;:::i;:::-;4627:5;-1:-1:-1;4651:69:1;4712:7;4707:2;4692:18;;4651:69;:::i;:::-;4641:79;;4739:84;4815:7;4809:3;4798:9;4794:19;4739:84;:::i;:::-;4729:94;-1:-1:-1;4896:3:1;4881:19;;4868:33;;-1:-1:-1;5000:3:1;4985:19;;4972:33;;-1:-1:-1;5082:3:1;5067:19;;5054:33;-1:-1:-1;;;;;5099:30:1;;5096:50;;;5142:1;5139;5132:12;5096:50;5181:58;5231:7;5222:6;5211:9;5207:22;5181:58;:::i;:::-;4138:1161;;;;-1:-1:-1;4138:1161:1;;-1:-1:-1;4138:1161:1;;;;5155:84;;-1:-1:-1;;;4138:1161:1:o;5617:160::-;5683:20;;5743:1;5732:20;;;5722:31;;5712:59;;5767:1;5764;5757:12;5782:597;5897:6;5905;5913;5921;5974:3;5962:9;5953:7;5949:23;5945:33;5942:53;;;5991:1;5988;5981:12;5942:53;6030:9;6017:23;6049:31;6074:5;6049:31;:::i;:::-;6099:5;-1:-1:-1;6123:69:1;6184:7;6179:2;6164:18;;6123:69;:::i;:::-;6113:79;;6244:3;6233:9;6229:19;6216:33;6258;6283:7;6258:33;:::i;:::-;6310:7;-1:-1:-1;6336:37:1;6368:3;6353:19;;6336:37;:::i;:::-;6326:47;;5782:597;;;;;;;:::o;6384:203::-;-1:-1:-1;;;;;6548:32:1;;;;6530:51;;6518:2;6503:18;;6384:203::o;6592:982::-;6799:6;6807;6815;6823;6831;6839;6892:3;6880:9;6871:7;6867:23;6863:33;6860:53;;;6909:1;6906;6899:12;6860:53;6948:9;6935:23;6967:31;6992:5;6967:31;:::i;:::-;7017:5;-1:-1:-1;7041:69:1;7102:7;7097:2;7082:18;;7041:69;:::i;:::-;7031:79;;7129:73;7194:7;7188:3;7177:9;7173:19;7129:73;:::i;:::-;7119:83;-1:-1:-1;7275:3:1;7260:19;;7247:33;;-1:-1:-1;7357:3:1;7342:19;;7329:33;-1:-1:-1;;;;;7374:30:1;;7371:50;;;7417:1;7414;7407:12;7371:50;7456:58;7506:7;7497:6;7486:9;7482:22;7456:58;:::i;:::-;6592:982;;;;-1:-1:-1;6592:982:1;;-1:-1:-1;6592:982:1;;7533:8;;6592:982;-1:-1:-1;;;6592:982:1:o;7871:924::-;8008:6;8016;8024;8032;8040;8048;8101:3;8089:9;8080:7;8076:23;8072:33;8069:53;;;8118:1;8115;8108:12;8069:53;8157:9;8144:23;8176:31;8201:5;8176:31;:::i;:::-;8226:5;-1:-1:-1;8250:69:1;8311:7;8306:2;8291:18;;8250:69;:::i;:::-;8240:79;-1:-1:-1;8392:3:1;8377:19;;8364:33;;-1:-1:-1;8496:3:1;8481:19;;8468:33;;-1:-1:-1;8578:3:1;8563:19;;8550:33;-1:-1:-1;;;;;8595:30:1;;8592:50;;;8638:1;8635;8628:12;9104:1797;9323:13;;9078;9071:21;9059:34;;9294:3;9279:19;;9395:4;9387:6;9383:17;9377:24;9410:51;9455:4;9444:9;9440:20;9426:12;9078:13;9071:21;9059:34;;9008:91;9410:51;;9510:4;9502:6;9498:17;9492:24;9525:53;9572:4;9561:9;9557:20;9541:14;9078:13;9071:21;9059:34;;9008:91;9525:53;;9627:4;9619:6;9615:17;9609:24;9642:53;9689:4;9678:9;9674:20;9658:14;9078:13;9071:21;9059:34;;9008:91;9642:53;;9744:4;9736:6;9732:17;9726:24;9759:53;9806:4;9795:9;9791:20;9775:14;9078:13;9071:21;9059:34;;9008:91;9759:53;;9861:4;9853:6;9849:17;9843:24;9876:53;9923:4;9912:9;9908:20;9892:14;9078:13;9071:21;9059:34;;9008:91;9876:53;;9978:4;9970:6;9966:17;9960:24;9993:53;10040:4;10029:9;10025:20;10009:14;9078:13;9071:21;9059:34;;9008:91;9993:53;;10095:4;10087:6;10083:17;10077:24;10110:53;10157:4;10146:9;10142:20;10126:14;9078:13;9071:21;9059:34;;9008:91;10110:53;;10212:6;10204;10200:19;10194:26;10229:55;10276:6;10265:9;10261:22;10245:14;9078:13;9071:21;9059:34;;9008:91;10229:55;;10333:6;10325;10321:19;10315:26;10350:55;10397:6;10386:9;10382:22;10366:14;9078:13;9071:21;9059:34;;9008:91;10350:55;;10454:6;10446;10442:19;10436:26;10471:55;10518:6;10507:9;10503:22;10487:14;9078:13;9071:21;9059:34;;9008:91;10471:55;;10576:6;10568;10564:19;10558:26;10593:56;10641:6;10630:9;10626:22;10609:15;9078:13;9071:21;9059:34;;9008:91;10593:56;;10699:6;10691;10687:19;10681:26;10716:56;10764:6;10753:9;10749:22;10732:15;9078:13;9071:21;9059:34;;9008:91;10716:56;;10822:6;10814;10810:19;10804:26;10839:56;10887:6;10876:9;10872:22;10855:15;9078:13;9071:21;9059:34;;9008:91;10839:56;;9104:1797;;;;:::o;11564:526::-;11672:6;11680;11688;11741:3;11729:9;11720:7;11716:23;11712:33;11709:53;;;11758:1;11755;11748:12;11709:53;11797:9;11784:23;11816:31;11841:5;11816:31;:::i;:::-;11866:5;-1:-1:-1;11890:69:1;11951:7;11946:2;11931:18;;11890:69;:::i;:::-;11880:79;;12011:3;12000:9;11996:19;11983:33;12025;12050:7;12025:33;:::i;:::-;12077:7;12067:17;;;11564:526;;;;;:::o;12095:247::-;12154:6;12207:2;12195:9;12186:7;12182:23;12178:32;12175:52;;;12223:1;12220;12213:12;12175:52;12262:9;12249:23;12281:31;12306:5;12281:31;:::i;12582:265::-;12655:9;;;12686;;12703:15;;;12697:22;;12683:37;12673:168;;12763:10;12758:3;12754:20;12751:1;12744:31;12798:4;12795:1;12788:15;12826:4;12823:1;12816:15;12852:217;12892:1;12918;12908:132;;12962:10;12957:3;12953:20;12950:1;12943:31;12997:4;12994:1;12987:15;13025:4;13022:1;13015:15;12908:132;-1:-1:-1;13054:9:1;;12852:217::o;13074:270::-;13274:6;13262:19;;;13244:38;;13318:19;;13313:2;13298:18;;13291:47;13232:2;13217:18;;13074:270::o;13349:184::-;13419:6;13472:2;13460:9;13451:7;13447:23;13443:32;13440:52;;;13488:1;13485;13478:12;13440:52;-1:-1:-1;13511:16:1;;13349:184;-1:-1:-1;13349:184:1:o;13538:118::-;13624:5;13617:13;13610:21;13603:5;13600:32;13590:60;;13646:1;13643;13636:12;13661:241;13717:6;13770:2;13758:9;13749:7;13745:23;13741:32;13738:52;;;13786:1;13783;13776:12;13738:52;13825:9;13812:23;13844:28;13866:5;13844:28;:::i;14599:161::-;14666:20;;14726:8;14715:20;;14705:31;;14695:59;;14750:1;14747;14740:12;14765:871;14853:6;14913:3;14901:9;14892:7;14888:23;14884:33;14929:2;14926:22;;;14944:1;14941;14934:12;14926:22;-1:-1:-1;14993:2:1;14987:9;15035:3;15023:16;;-1:-1:-1;;;;;15054:34:1;;15090:22;;;15051:62;15048:185;;;15155:10;15150:3;15146:20;15143:1;15136:31;15190:4;15187:1;15180:15;15218:4;15215:1;15208:15;15048:185;15249:2;15242:22;15288:29;15307:9;15288:29;:::i;:::-;15280:6;15273:45;15351:38;15385:2;15374:9;15370:18;15351:38;:::i;:::-;15346:2;15338:6;15334:15;15327:63;15423:37;15456:2;15445:9;15441:18;15423:37;:::i;:::-;15418:2;15410:6;15406:15;15399:62;15494:36;15526:2;15515:9;15511:18;15494:36;:::i;:::-;15489:2;15481:6;15477:15;15470:61;15565:39;15599:3;15588:9;15584:19;15565:39;:::i;:::-;15559:3;15547:16;;15540:65;15551:6;14765:871;-1:-1:-1;;;14765:871:1:o;15920:301::-;16049:3;16087:6;16081:13;16133:6;16126:4;16118:6;16114:17;16109:3;16103:37;16195:1;16159:16;;16184:13;;;-1:-1:-1;16159:16:1;15920:301;-1:-1:-1;15920:301:1:o;16226:245::-;16293:6;16346:2;16334:9;16325:7;16321:23;16317:32;16314:52;;;16362:1;16359;16352:12;16314:52;16394:9;16388:16;16413:28;16435:5;16413:28;:::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212207c5d3c0125472d6d4a682d879b3fa761e7290775ca8090df88bda4d5259b689764736f6c634300081a0033","offset":5134}},"immutableReferences":{"340":[{"start":960,"length":32},{"start":1940,"length":32},{"start":2695,"length":32}],"863":[{"start":921,"length":32},{"start":1471,"length":32},{"start":2451,"length":32},{"start":3172,"length":32},{"start":3414,"length":32}],"867":[{"start":1070,"length":32},{"start":1626,"length":32},{"start":1685,"length":32},{"start":2817,"length":32},{"start":2876,"length":32},{"start":2975,"length":32}]},"transformations":[{"id":"863","type":"replace","offset":921,"reason":"immutable"},{"id":"340","type":"replace","offset":960,"reason":"immutable"},{"id":"867","type":"replace","offset":1070,"reason":"immutable"},{"id":"863","type":"replace","offset":1471,"reason":"immutable"},{"id":"867","type":"replace","offset":1626,"reason":"immutable"},{"id":"867","type":"replace","offset":1685,"reason":"immutable"},{"id":"340","type":"replace","offset":1940,"reason":"immutable"},{"id":"863","type":"replace","offset":2451,"reason":"immutable"},{"id":"340","type":"replace","offset":2695,"reason":"immutable"},{"id":"867","type":"replace","offset":2817,"reason":"immutable"},{"id":"867","type":"replace","offset":2876,"reason":"immutable"},{"id":"867","type":"replace","offset":2975,"reason":"immutable"},{"id":"863","type":"replace","offset":3172,"reason":"immutable"},{"id":"863","type":"replace","offset":3414,"reason":"immutable"}],"transformationValues":{"immutables":{"340":"0x000000000000000000000000e03a1074c86cfedd5c142c4f04f1a1536e203543","863":"0x0000000000000000000000005501e1fa81be1c3f49225fa7668da0245d07db60","867":"0x000000000000000000000000b63abab9019fa0db4a3ab1824c5e5fa7171f1472"}}},"deployment":{"transactionHash":"0x17a454a0dbd91ef6c1c176770bbfa6024fa3bcec2fa9a4435dd0d131b3b62180","blockNumber":"12033613","transactionIndex":"73","deployer":"0xbC8744370bCb6D5AbF5dE8B4086ecfBB4C5629C3"},"sources":{"src/BurrowHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\n// -----------------------------------------------------------------------------------------------\n// This file is self-contained on purpose: the repository vendors no v4-core, v4-periphery or\n// OpenZeppelin, and the build runs offline. The pieces below are minimal, ABI-compatible ports of\n// the Uniswap v4 types (PoolKey, SwapParams, BalanceDelta, Currency), the v4 Hooks permission\n// flags, v4-periphery's BaseHook, and OpenZeppelin's SafeERC20.forceApprove, ReentrancyGuard and\n// Ownable2Step. Names are prefixed so they never clash with the real libraries when the\n// integrator adds them. Encodings, selectors and flag bits match Uniswap v4 exactly.\n// -----------------------------------------------------------------------------------------------\n\n/// @dev Uniswap v4 `Currency` (an address, native ETH is address(0)).\ntype BurrowCurrency is address;\n\n/// @dev Uniswap v4 `BalanceDelta`: amount0 in the upper 128 bits, amount1 in the lower 128 bits.\ntype BurrowBalanceDelta is int256;\n\n/// @dev Uniswap v4 `PoolKey`.\nstruct BurrowPoolKey {\n    BurrowCurrency currency0;\n    BurrowCurrency currency1;\n    uint24 fee;\n    int24 tickSpacing;\n    address hooks;\n}\n\n/// @dev Uniswap v4 `SwapParams` (IPoolManager.SwapParams / PoolOperation.SwapParams).\nstruct BurrowSwapParams {\n    bool zeroForOne;\n    int256 amountSpecified;\n    uint160 sqrtPriceLimitX96;\n}\n\n/// @dev Uniswap v4 `ModifyLiquidityParams`.\nstruct BurrowModifyLiquidityParams {\n    int24 tickLower;\n    int24 tickUpper;\n    int256 liquidityDelta;\n    bytes32 salt;\n}\n\n/// @dev Uniswap v4 `BeforeSwapDelta`.\ntype BurrowBeforeSwapDelta is int256;\n\nlibrary BurrowBalanceDeltaLib {\n    function amount0(BurrowBalanceDelta d) internal pure returns (int128 a0) {\n        assembly (\"memory-safe\") {\n            a0 := sar(128, d)\n        }\n    }\n\n    function amount1(BurrowBalanceDelta d) internal pure returns (int128 a1) {\n        assembly (\"memory-safe\") {\n            a1 := signextend(15, d)\n        }\n    }\n}\n\nlibrary BurrowPoolIdLib {\n    /// @dev Same as v4 PoolIdLibrary.toId: keccak256 of the 5-word PoolKey.\n    function toId(BurrowPoolKey memory key) internal pure returns (bytes32 id) {\n        assembly (\"memory-safe\") {\n            id := keccak256(key, 0xa0)\n        }\n    }\n}\n\n/// @dev The subset of the v4 PoolManager this hook calls.\ninterface IBurrowPoolManager {\n    function take(BurrowCurrency currency, address to, uint256 amount) external;\n}\n\n/// @dev Uniswap v4 `Hooks.Permissions` and flag bits (v4-core src/libraries/Hooks.sol).\nlibrary BurrowHooks {\n    uint160 internal constant ALL_HOOK_MASK = uint160((1 << 14) - 1);\n\n    uint160 internal constant BEFORE_INITIALIZE_FLAG = 1 << 13;\n    uint160 internal constant AFTER_INITIALIZE_FLAG = 1 << 12;\n    uint160 internal constant BEFORE_ADD_LIQUIDITY_FLAG = 1 << 11;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_FLAG = 1 << 10;\n    uint160 internal constant BEFORE_REMOVE_LIQUIDITY_FLAG = 1 << 9;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_FLAG = 1 << 8;\n    uint160 internal constant BEFORE_SWAP_FLAG = 1 << 7;\n    uint160 internal constant AFTER_SWAP_FLAG = 1 << 6;\n    uint160 internal constant BEFORE_DONATE_FLAG = 1 << 5;\n    uint160 internal constant AFTER_DONATE_FLAG = 1 << 4;\n    uint160 internal constant BEFORE_SWAP_RETURNS_DELTA_FLAG = 1 << 3;\n    uint160 internal constant AFTER_SWAP_RETURNS_DELTA_FLAG = 1 << 2;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 1;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 0;\n\n    struct Permissions {\n        bool beforeInitialize;\n        bool afterInitialize;\n        bool beforeAddLiquidity;\n        bool afterAddLiquidity;\n        bool beforeRemoveLiquidity;\n        bool afterRemoveLiquidity;\n        bool beforeSwap;\n        bool afterSwap;\n        bool beforeDonate;\n        bool afterDonate;\n        bool beforeSwapReturnDelta;\n        bool afterSwapReturnDelta;\n        bool afterAddLiquidityReturnDelta;\n        bool afterRemoveLiquidityReturnDelta;\n    }\n\n    error HookAddressNotValid(address hooks);\n\n    function toFlags(Permissions memory p) internal pure returns (uint160 flags) {\n        if (p.beforeInitialize) flags |= BEFORE_INITIALIZE_FLAG;\n        if (p.afterInitialize) flags |= AFTER_INITIALIZE_FLAG;\n        if (p.beforeAddLiquidity) flags |= BEFORE_ADD_LIQUIDITY_FLAG;\n        if (p.afterAddLiquidity) flags |= AFTER_ADD_LIQUIDITY_FLAG;\n        if (p.beforeRemoveLiquidity) flags |= BEFORE_REMOVE_LIQUIDITY_FLAG;\n        if (p.afterRemoveLiquidity) flags |= AFTER_REMOVE_LIQUIDITY_FLAG;\n        if (p.beforeSwap) flags |= BEFORE_SWAP_FLAG;\n        if (p.afterSwap) flags |= AFTER_SWAP_FLAG;\n        if (p.beforeDonate) flags |= BEFORE_DONATE_FLAG;\n        if (p.afterDonate) flags |= AFTER_DONATE_FLAG;\n        if (p.beforeSwapReturnDelta) flags |= BEFORE_SWAP_RETURNS_DELTA_FLAG;\n        if (p.afterSwapReturnDelta) flags |= AFTER_SWAP_RETURNS_DELTA_FLAG;\n        if (p.afterAddLiquidityReturnDelta) flags |= AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG;\n        if (p.afterRemoveLiquidityReturnDelta) flags |= AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG;\n    }\n\n    /// @dev Equivalent to v4 Hooks.validateHookPermissions: every one of the 14 low address bits\n    /// must equal the declared permission.\n    function validateHookPermissions(address self, Permissions memory p) internal pure {\n        if (uint160(self) & ALL_HOOK_MASK != toFlags(p)) revert HookAddressNotValid(self);\n    }\n}\n\n/// @dev Port of v4-periphery `BaseHook`: validates its own address against getHookPermissions at\n/// construction, gates every callback to the PoolManager and reverts on any unimplemented hook.\nabstract contract BurrowBaseHook {\n    error NotPoolManager();\n    error HookNotImplemented();\n\n    IBurrowPoolManager public immutable poolManager;\n\n    constructor(IBurrowPoolManager _poolManager) {\n        poolManager = _poolManager;\n        validateHookAddress(this);\n    }\n\n    modifier onlyPoolManager() {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        _;\n    }\n\n    function getHookPermissions() public pure virtual returns (BurrowHooks.Permissions memory);\n\n    function validateHookAddress(BurrowBaseHook _this) internal pure virtual {\n        BurrowHooks.validateHookPermissions(address(_this), getHookPermissions());\n    }\n\n    function beforeInitialize(address, BurrowPoolKey calldata, uint160) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function afterInitialize(address, BurrowPoolKey calldata, uint160, int24) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function beforeAddLiquidity(address, BurrowPoolKey calldata, BurrowModifyLiquidityParams calldata, bytes calldata)\n        external\n        virtual\n        returns (bytes4)\n    {\n        revert HookNotImplemented();\n    }\n\n    function afterAddLiquidity(\n        address,\n        BurrowPoolKey calldata,\n        BurrowModifyLiquidityParams calldata,\n        BurrowBalanceDelta,\n        BurrowBalanceDelta,\n        bytes calldata\n    ) external virtual returns (bytes4, BurrowBalanceDelta) {\n        revert HookNotImplemented();\n    }\n\n    function beforeRemoveLiquidity(\n        address,\n        BurrowPoolKey calldata,\n        BurrowModifyLiquidityParams calldata,\n        bytes calldata\n    ) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function afterRemoveLiquidity(\n        address,\n        BurrowPoolKey calldata,\n        BurrowModifyLiquidityParams calldata,\n        BurrowBalanceDelta,\n        BurrowBalanceDelta,\n        bytes calldata\n    ) external virtual returns (bytes4, BurrowBalanceDelta) {\n        revert HookNotImplemented();\n    }\n\n    function beforeSwap(address, BurrowPoolKey calldata, BurrowSwapParams calldata, bytes calldata)\n        external\n        virtual\n        returns (bytes4, BurrowBeforeSwapDelta, uint24)\n    {\n        revert HookNotImplemented();\n    }\n\n    function afterSwap(\n        address sender,\n        BurrowPoolKey calldata key,\n        BurrowSwapParams calldata params,\n        BurrowBalanceDelta delta,\n        bytes calldata hookData\n    ) external onlyPoolManager returns (bytes4, int128) {\n        return _afterSwap(sender, key, params, delta, hookData);\n    }\n\n    function beforeDonate(address, BurrowPoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        virtual\n        returns (bytes4)\n    {\n        revert HookNotImplemented();\n    }\n\n    function afterDonate(address, BurrowPoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        virtual\n        returns (bytes4)\n    {\n        revert HookNotImplemented();\n    }\n\n    function _afterSwap(address, BurrowPoolKey calldata, BurrowSwapParams calldata, BurrowBalanceDelta, bytes calldata)\n        internal\n        virtual\n        returns (bytes4, int128)\n    {\n        revert HookNotImplemented();\n    }\n}\n\n/// @dev Minimal ERC20 surface the hook needs.\ninterface IBurrowHookERC20 {\n    function balanceOf(address account) external view returns (uint256);\n    function approve(address spender, uint256 value) external returns (bool);\n}\n\n/// @notice The single function of BurrowVault this hook relies on: pull SQK from the caller and\n/// raise the bSQK share price without minting.\ninterface IBurrowVaultFeeSink {\n    function donate(uint256 amount) external;\n}\n\n/// @dev Port of OpenZeppelin ReentrancyGuard (v5 semantics).\nabstract contract BurrowHookReentrancyGuard {\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n    uint256 private _status = NOT_ENTERED;\n\n    error ReentrancyGuardReentrantCall();\n\n    modifier nonReentrant() {\n        if (_status == ENTERED) revert ReentrancyGuardReentrantCall();\n        _status = ENTERED;\n        _;\n        _status = NOT_ENTERED;\n    }\n}\n\n/// @dev Port of OpenZeppelin Ownable + Ownable2Step (v5 semantics, same errors and events).\nabstract contract BurrowHookOwnable2Step {\n    address private _owner;\n    address private _pendingOwner;\n\n    error OwnableUnauthorizedAccount(address account);\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) revert OwnableInvalidOwner(address(0));\n        _transferOwnership(initialOwner);\n    }\n\n    modifier onlyOwner() {\n        if (msg.sender != _owner) revert OwnableUnauthorizedAccount(msg.sender);\n        _;\n    }\n\n    function owner() public view returns (address) {\n        return _owner;\n    }\n\n    function pendingOwner() public view returns (address) {\n        return _pendingOwner;\n    }\n\n    function transferOwnership(address newOwner) external onlyOwner {\n        _pendingOwner = newOwner;\n        emit OwnershipTransferStarted(_owner, newOwner);\n    }\n\n    function acceptOwnership() external {\n        if (msg.sender != _pendingOwner) revert OwnableUnauthorizedAccount(msg.sender);\n        _transferOwnership(msg.sender);\n    }\n\n    function _transferOwnership(address newOwner) private {\n        delete _pendingOwner;\n        address old = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(old, newOwner);\n    }\n}\n\n/// @title BurrowHook\n/// @notice Uniswap v4 hook for the SQK pool. After every exact-input swap whose output currency is\n/// SQK it skims `hookFeeBps` of the output, takes it from the PoolManager and donates it to the\n/// Burrow vault, raising the bSQK share price. Swaps that do not pay out SQK are left untouched.\n/// @dev UNAUDITED, TESTNET ONLY. The hook address must carry exactly the AFTER_SWAP and\n/// AFTER_SWAP_RETURNS_DELTA flags (0x44 in the low 14 bits); deploy it through CREATE2 with a salt\n/// mined by HookMiner. A v4 afterSwap delta can only adjust the unspecified currency, so on\n/// exact-output swaps (where the SQK output is the specified amount) no fee is taken.\ncontract BurrowHook is BurrowBaseHook, BurrowHookReentrancyGuard, BurrowHookOwnable2Step {\n    using BurrowBalanceDeltaLib for BurrowBalanceDelta;\n    using BurrowPoolIdLib for BurrowPoolKey;\n\n    /// @notice Hard cap on the hook fee: 1 percent of the SQK output.\n    uint16 public constant MAX_HOOK_FEE_BPS = 100;\n    uint256 internal constant BPS = 10_000;\n\n    /// @notice The SQK token, the only currency this hook ever skims.\n    IBurrowHookERC20 public immutable sqk;\n    /// @notice The Burrow vault every fee is donated to. Fixed at construction.\n    IBurrowVaultFeeSink public immutable vault;\n\n    /// @notice Fee skimmed from SQK output, in basis points, at most MAX_HOOK_FEE_BPS.\n    uint16 public hookFeeBps;\n\n    error ZeroAddress();\n    error FeeTooHigh(uint16 feeBps, uint16 maxBps);\n    error NothingToFlush();\n    error ApproveFailed();\n\n    event HookFeeSet(uint16 oldFeeBps, uint16 newFeeBps);\n    event FeeDonated(bytes32 indexed poolId, uint256 amount);\n    /// @notice Emitted when the vault refused a donation; the fee stays here until flush().\n    event FeeHeld(bytes32 indexed poolId, uint256 amount);\n    event Flushed(uint256 amount);\n\n    /// @param poolManager_ Uniswap v4 PoolManager (Sepolia 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543).\n    /// @param sqk_ SQK token (Sepolia 0x5501e1fa81be1c3f49225fa7668da0245d07db60).\n    /// @param vault_ BurrowVault, the fee sink.\n    /// @param hookFeeBps_ Initial fee, at most MAX_HOOK_FEE_BPS.\n    /// @param owner_ Owner allowed to tune hookFeeBps within its cap.\n    constructor(address poolManager_, address sqk_, address vault_, uint16 hookFeeBps_, address owner_)\n        BurrowBaseHook(IBurrowPoolManager(poolManager_))\n        BurrowHookOwnable2Step(owner_)\n    {\n        if (poolManager_ == address(0) || sqk_ == address(0) || vault_ == address(0)) revert ZeroAddress();\n        if (hookFeeBps_ > MAX_HOOK_FEE_BPS) revert FeeTooHigh(hookFeeBps_, MAX_HOOK_FEE_BPS);\n        sqk = IBurrowHookERC20(sqk_);\n        vault = IBurrowVaultFeeSink(vault_);\n        hookFeeBps = hookFeeBps_;\n        emit HookFeeSet(0, hookFeeBps_);\n    }\n\n    /// @notice afterSwap and afterSwapReturnDelta only.\n    function getHookPermissions() public pure override returns (BurrowHooks.Permissions memory) {\n        return BurrowHooks.Permissions({\n            beforeInitialize: false,\n            afterInitialize: false,\n            beforeAddLiquidity: false,\n            afterAddLiquidity: false,\n            beforeRemoveLiquidity: false,\n            afterRemoveLiquidity: false,\n            beforeSwap: false,\n            afterSwap: true,\n            beforeDonate: false,\n            afterDonate: false,\n            beforeSwapReturnDelta: false,\n            afterSwapReturnDelta: true,\n            afterAddLiquidityReturnDelta: false,\n            afterRemoveLiquidityReturnDelta: false\n        });\n    }\n\n    /// @notice The exact low-14-bit flag set this hook's address must carry (AFTER_SWAP | AFTER_SWAP_RETURNS_DELTA).\n    function hookFlags() external pure returns (uint160) {\n        return BurrowHooks.AFTER_SWAP_FLAG | BurrowHooks.AFTER_SWAP_RETURNS_DELTA_FLAG;\n    }\n\n    /// @notice Set the hook fee, bounded by MAX_HOOK_FEE_BPS.\n    function setHookFeeBps(uint16 newFeeBps) external onlyOwner {\n        if (newFeeBps > MAX_HOOK_FEE_BPS) revert FeeTooHigh(newFeeBps, MAX_HOOK_FEE_BPS);\n        emit HookFeeSet(hookFeeBps, newFeeBps);\n        hookFeeBps = newFeeBps;\n    }\n\n    /// @notice Fee this hook would skim from an SQK output of `outputAmount`.\n    function quoteFee(uint256 outputAmount) public view returns (uint256) {\n        return outputAmount * hookFeeBps / BPS;\n    }\n\n    /// @notice Donate any SQK held here (fees the vault refused earlier) to the vault. Anyone may call.\n    function flush() external nonReentrant {\n        uint256 amount = sqk.balanceOf(address(this));\n        if (amount == 0) revert NothingToFlush();\n        _forceApprove(address(vault), amount);\n        vault.donate(amount);\n        emit Flushed(amount);\n    }\n\n    function _afterSwap(\n        address,\n        BurrowPoolKey calldata key,\n        BurrowSwapParams calldata params,\n        BurrowBalanceDelta delta,\n        bytes calldata\n    ) internal override nonReentrant returns (bytes4, int128) {\n        // The returned delta applies to the unspecified currency, which is the output only on exact input.\n        if (params.amountSpecified >= 0) return (BurrowBaseHook.afterSwap.selector, 0);\n\n        BurrowCurrency output = params.zeroForOne ? key.currency1 : key.currency0;\n        if (BurrowCurrency.unwrap(output) != address(sqk)) return (BurrowBaseHook.afterSwap.selector, 0);\n\n        int128 outputAmount = params.zeroForOne ? delta.amount1() : delta.amount0();\n        if (outputAmount <= 0) return (BurrowBaseHook.afterSwap.selector, 0);\n\n        uint256 fee = quoteFee(uint256(uint128(outputAmount)));\n        if (fee == 0) return (BurrowBaseHook.afterSwap.selector, 0);\n\n        // Returning +fee credits this hook in SQK; take() settles that credit to this contract.\n        poolManager.take(output, address(this), fee);\n\n        bytes32 poolId = key.toId();\n        _forceApprove(address(vault), fee);\n        // A failing vault must not brick the pool: keep the fee for flush() instead.\n        try vault.donate(fee) {\n            emit FeeDonated(poolId, fee);\n        } catch {\n            _forceApprove(address(vault), 0);\n            emit FeeHeld(poolId, fee);\n        }\n\n        // fee <= 1% of a positive int128, so the cast back is safe.\n        return (BurrowBaseHook.afterSwap.selector, int128(int256(fee)));\n    }\n\n    /// @dev OpenZeppelin SafeERC20.forceApprove semantics: tolerate tokens returning nothing and\n    /// tokens that require resetting the allowance to zero first.\n    function _forceApprove(address spender, uint256 value) private {\n        if (!_tryApprove(spender, value)) {\n            if (!_tryApprove(spender, 0) || !_tryApprove(spender, value)) revert ApproveFailed();\n        }\n    }\n\n    function _tryApprove(address spender, uint256 value) private returns (bool) {\n        (bool ok, bytes memory ret) = address(sqk).call(abi.encodeCall(IBurrowHookERC20.approve, (spender, value)));\n        return ok && (ret.length == 0 ? address(sqk).code.length > 0 : abi.decode(ret, (bool)));\n    }\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.26+commit.8a97fa7a","compilerSettings":{"viaIR":false,"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"libraries":{},"optimizer":{"runs":1,"enabled":true},"evmVersion":"cancun","remappings":["forge-std/=/Users/loserzx/squeek/burrow-lite/lib/forge-std/src/"]},"name":"BurrowHook","fullyQualifiedName":"src/BurrowHook.sol:BurrowHook"},"abi":[{"type":"constructor","inputs":[{"name":"poolManager_","type":"address","internalType":"address"},{"name":"sqk_","type":"address","internalType":"address"},{"name":"vault_","type":"address","internalType":"address"},{"name":"hookFeeBps_","type":"uint16","internalType":"uint16"},{"name":"owner_","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"ApproveFailed","type":"error","inputs":[]},{"name":"FeeTooHigh","type":"error","inputs":[{"name":"feeBps","type":"uint16","internalType":"uint16"},{"name":"maxBps","type":"uint16","internalType":"uint16"}]},{"name":"HookAddressNotValid","type":"error","inputs":[{"name":"hooks","type":"address","internalType":"address"}]},{"name":"HookNotImplemented","type":"error","inputs":[]},{"name":"NotPoolManager","type":"error","inputs":[]},{"name":"NothingToFlush","type":"error","inputs":[]},{"name":"OwnableInvalidOwner","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"name":"OwnableUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"ReentrancyGuardReentrantCall","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"FeeDonated","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FeeHeld","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Flushed","type":"event","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"HookFeeSet","type":"event","inputs":[{"name":"oldFeeBps","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"newFeeBps","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"name":"OwnershipTransferStarted","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"MAX_HOOK_FEE_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"acceptOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"afterAddLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"}],"stateMutability":"nonpayable"},{"name":"afterDonate","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"afterInitialize","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"uint160","internalType":"uint160"},{"name":"","type":"int24","internalType":"int24"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"afterRemoveLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"}],"stateMutability":"nonpayable"},{"name":"afterSwap","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"params","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct BurrowSwapParams"},{"name":"delta","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"hookData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int128","internalType":"int128"}],"stateMutability":"nonpayable"},{"name":"beforeAddLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeDonate","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeInitialize","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"uint160","internalType":"uint160"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeRemoveLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeSwap","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct BurrowSwapParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BurrowBeforeSwapDelta"},{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"nonpayable"},{"name":"flush","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"getHookPermissions","type":"function","inputs":[],"outputs":[{"name":"","type":"tuple","components":[{"name":"beforeInitialize","type":"bool","internalType":"bool"},{"name":"afterInitialize","type":"bool","internalType":"bool"},{"name":"beforeAddLiquidity","type":"bool","internalType":"bool"},{"name":"afterAddLiquidity","type":"bool","internalType":"bool"},{"name":"beforeRemoveLiquidity","type":"bool","internalType":"bool"},{"name":"afterRemoveLiquidity","type":"bool","internalType":"bool"},{"name":"beforeSwap","type":"bool","internalType":"bool"},{"name":"afterSwap","type":"bool","internalType":"bool"},{"name":"beforeDonate","type":"bool","internalType":"bool"},{"name":"afterDonate","type":"bool","internalType":"bool"},{"name":"beforeSwapReturnDelta","type":"bool","internalType":"bool"},{"name":"afterSwapReturnDelta","type":"bool","internalType":"bool"},{"name":"afterAddLiquidityReturnDelta","type":"bool","internalType":"bool"},{"name":"afterRemoveLiquidityReturnDelta","type":"bool","internalType":"bool"}],"internalType":"struct BurrowHooks.Permissions"}],"stateMutability":"pure"},{"name":"hookFeeBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"hookFlags","type":"function","inputs":[],"outputs":[{"name":"","type":"uint160","internalType":"uint160"}],"stateMutability":"pure"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"pendingOwner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"poolManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBurrowPoolManager"}],"stateMutability":"view"},{"name":"quoteFee","type":"function","inputs":[{"name":"outputAmount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"setHookFeeBps","type":"function","inputs":[{"name":"newFeeBps","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sqk","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBurrowHookERC20"}],"stateMutability":"view"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"vault","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBurrowVaultFeeSink"}],"stateMutability":"view"}],"metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"address","name":"sqk_","type":"address"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"uint16","name":"hookFeeBps_","type":"uint16"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApproveFailed","type":"error"},{"inputs":[{"internalType":"uint16","name":"feeBps","type":"uint16"},{"internalType":"uint16","name":"maxBps","type":"uint16"}],"name":"FeeTooHigh","type":"error"},{"inputs":[{"internalType":"address","name":"hooks","type":"address"}],"name":"HookAddressNotValid","type":"error"},{"inputs":[],"name":"HookNotImplemented","type":"error"},{"inputs":[],"name":"NotPoolManager","type":"error"},{"inputs":[],"name":"NothingToFlush","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"poolId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeDonated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"poolId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeHeld","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Flushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"oldFeeBps","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newFeeBps","type":"uint16"}],"name":"HookFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MAX_HOOK_FEE_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"","type":"tuple"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams","name":"","type":"tuple"},{"internalType":"BurrowBalanceDelta","name":"","type":"int256"},{"internalType":"BurrowBalanceDelta","name":"","type":"int256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"afterAddLiquidity","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"BurrowBalanceDelta","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"","type":"tuple"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"afterDonate","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"","type":"tuple"},{"internalType":"uint160","name":"","type":"uint160"},{"internalType":"int24","name":"","type":"int24"}],"name":"afterInitialize","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"","type":"tuple"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams","name":"","type":"tuple"},{"internalType":"BurrowBalanceDelta","name":"","type":"int256"},{"internalType":"BurrowBalanceDelta","name":"","type":"int256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"afterRemoveLiquidity","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"BurrowBalanceDelta","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"key","type":"tuple"},{"components":[{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct BurrowSwapParams","name":"params","type":"tuple"},{"internalType":"BurrowBalanceDelta","name":"delta","type":"int256"},{"internalType":"bytes","name":"hookData","type":"bytes"}],"name":"afterSwap","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"","type":"tuple"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"beforeAddLiquidity","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"","type":"tuple"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"beforeDonate","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"","type":"tuple"},{"internalType":"uint160","name":"","type":"uint160"}],"name":"beforeInitialize","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"","type":"tuple"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int256","name":"liquidityDelta","type":"int256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"beforeRemoveLiquidity","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"components":[{"internalType":"BurrowCurrency","name":"currency0","type":"address"},{"internalType":"BurrowCurrency","name":"currency1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"},{"internalType":"address","name":"hooks","type":"address"}],"internalType":"struct BurrowPoolKey","name":"","type":"tuple"},{"components":[{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct BurrowSwapParams","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"beforeSwap","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"BurrowBeforeSwapDelta","name":"","type":"int256"},{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flush","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getHookPermissions","outputs":[{"components":[{"internalType":"bool","name":"beforeInitialize","type":"bool"},{"internalType":"bool","name":"afterInitialize","type":"bool"},{"internalType":"bool","name":"beforeAddLiquidity","type":"bool"},{"internalType":"bool","name":"afterAddLiquidity","type":"bool"},{"internalType":"bool","name":"beforeRemoveLiquidity","type":"bool"},{"internalType":"bool","name":"afterRemoveLiquidity","type":"bool"},{"internalType":"bool","name":"beforeSwap","type":"bool"},{"internalType":"bool","name":"afterSwap","type":"bool"},{"internalType":"bool","name":"beforeDonate","type":"bool"},{"internalType":"bool","name":"afterDonate","type":"bool"},{"internalType":"bool","name":"beforeSwapReturnDelta","type":"bool"},{"internalType":"bool","name":"afterSwapReturnDelta","type":"bool"},{"internalType":"bool","name":"afterAddLiquidityReturnDelta","type":"bool"},{"internalType":"bool","name":"afterRemoveLiquidityReturnDelta","type":"bool"}],"internalType":"struct BurrowHooks.Permissions","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"hookFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hookFlags","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolManager","outputs":[{"internalType":"contract IBurrowPoolManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"outputAmount","type":"uint256"}],"name":"quoteFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"newFeeBps","type":"uint16"}],"name":"setHookFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sqk","outputs":[{"internalType":"contract IBurrowHookERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IBurrowVaultFeeSink","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"UNAUDITED, TESTNET ONLY. The hook address must carry exactly the AFTER_SWAP and AFTER_SWAP_RETURNS_DELTA flags (0x44 in the low 14 bits); deploy it through CREATE2 with a salt mined by HookMiner. A v4 afterSwap delta can only adjust the unspecified currency, so on exact-output swaps (where the SQK output is the specified amount) no fee is taken.","kind":"dev","methods":{"constructor":{"params":{"hookFeeBps_":"Initial fee, at most MAX_HOOK_FEE_BPS.","owner_":"Owner allowed to tune hookFeeBps within its cap.","poolManager_":"Uniswap v4 PoolManager (Sepolia 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543).","sqk_":"SQK token (Sepolia 0x5501e1fa81be1c3f49225fa7668da0245d07db60).","vault_":"BurrowVault, the fee sink."}}},"title":"BurrowHook","version":1},"userdoc":{"events":{"FeeHeld(bytes32,uint256)":{"notice":"Emitted when the vault refused a donation; the fee stays here until flush()."}},"kind":"user","methods":{"MAX_HOOK_FEE_BPS()":{"notice":"Hard cap on the hook fee: 1 percent of the SQK output."},"flush()":{"notice":"Donate any SQK held here (fees the vault refused earlier) to the vault. Anyone may call."},"getHookPermissions()":{"notice":"afterSwap and afterSwapReturnDelta only."},"hookFeeBps()":{"notice":"Fee skimmed from SQK output, in basis points, at most MAX_HOOK_FEE_BPS."},"hookFlags()":{"notice":"The exact low-14-bit flag set this hook's address must carry (AFTER_SWAP | AFTER_SWAP_RETURNS_DELTA)."},"quoteFee(uint256)":{"notice":"Fee this hook would skim from an SQK output of `outputAmount`."},"setHookFeeBps(uint16)":{"notice":"Set the hook fee, bounded by MAX_HOOK_FEE_BPS."},"sqk()":{"notice":"The SQK token, the only currency this hook ever skims."},"vault()":{"notice":"The Burrow vault every fee is donated to. Fixed at construction."}},"notice":"Uniswap v4 hook for the SQK pool. After every exact-input swap whose output currency is SQK it skims `hookFeeBps` of the output, takes it from the PoolManager and donates it to the Burrow vault, raising the bSQK share price. Swaps that do not pay out SQK are left untouched.","version":1}},"settings":{"compilationTarget":{"src/BurrowHook.sol":"BurrowHook"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":1},"remappings":[":forge-std/=/Users/loserzx/squeek/burrow-lite/lib/forge-std/src/"]},"sources":{"src/BurrowHook.sol":{"keccak256":"0xc99030275a53ddca0a76addb6264fc3a271d4084ae7eda609646646830347e36","license":"MIT","urls":["bzz-raw://261ea7869cd306ff0235726d5d35dbc757cc560936b0959746100ad3da6f3852","dweb:/ipfs/QmaEvz9ngbyVMLwyHybkfa3LP8Xz94NaWzfSNiASMg8Uz7"]}},"version":1},"storageLayout":{"types":{"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_uint256","astId":677,"label":"_status","offset":0,"contract":"src/BurrowHook.sol:BurrowHook"},{"slot":"1","type":"t_address","astId":702,"label":"_owner","offset":0,"contract":"src/BurrowHook.sol:BurrowHook"},{"slot":"2","type":"t_address","astId":704,"label":"_pendingOwner","offset":0,"contract":"src/BurrowHook.sol:BurrowHook"},{"slot":"2","type":"t_uint16","astId":870,"label":"hookFeeBps","offset":20,"contract":"src/BurrowHook.sol:BurrowHook"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","events":{"FeeHeld(bytes32,uint256)":{"notice":"Emitted when the vault refused a donation; the fee stays here until flush()."}},"notice":"Uniswap v4 hook for the SQK pool. After every exact-input swap whose output currency is SQK it skims `hookFeeBps` of the output, takes it from the PoolManager and donates it to the Burrow vault, raising the bSQK share price. Swaps that do not pay out SQK are left untouched.","methods":{"sqk()":{"notice":"The SQK token, the only currency this hook ever skims."},"flush()":{"notice":"Donate any SQK held here (fees the vault refused earlier) to the vault. Anyone may call."},"vault()":{"notice":"The Burrow vault every fee is donated to. Fixed at construction."},"hookFlags()":{"notice":"The exact low-14-bit flag set this hook's address must carry (AFTER_SWAP | AFTER_SWAP_RETURNS_DELTA)."},"hookFeeBps()":{"notice":"Fee skimmed from SQK output, in basis points, at most MAX_HOOK_FEE_BPS."},"quoteFee(uint256)":{"notice":"Fee this hook would skim from an SQK output of `outputAmount`."},"MAX_HOOK_FEE_BPS()":{"notice":"Hard cap on the hook fee: 1 percent of the SQK output."},"getHookPermissions()":{"notice":"afterSwap and afterSwapReturnDelta only."},"setHookFeeBps(uint16)":{"notice":"Set the hook fee, bounded by MAX_HOOK_FEE_BPS."}},"version":1},"devdoc":{"kind":"dev","title":"BurrowHook","details":"UNAUDITED, TESTNET ONLY. The hook address must carry exactly the AFTER_SWAP and AFTER_SWAP_RETURNS_DELTA flags (0x44 in the low 14 bits); deploy it through CREATE2 with a salt mined by HookMiner. A v4 afterSwap delta can only adjust the unspecified currency, so on exact-output swaps (where the SQK output is the specified amount) no fee is taken.","methods":{"constructor":{"params":{"sqk_":"SQK token (Sepolia 0x5501e1fa81be1c3f49225fa7668da0245d07db60).","owner_":"Owner allowed to tune hookFeeBps within its cap.","vault_":"BurrowVault, the fee sink.","hookFeeBps_":"Initial fee, at most MAX_HOOK_FEE_BPS.","poolManager_":"Uniswap v4 PoolManager (Sepolia 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543)."}}},"version":1},"sourceIds":{"src/BurrowHook.sol":{"id":0}},"additionalInput":null,"stdJsonInput":{"sources":{"src/BurrowHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\n// -----------------------------------------------------------------------------------------------\n// This file is self-contained on purpose: the repository vendors no v4-core, v4-periphery or\n// OpenZeppelin, and the build runs offline. The pieces below are minimal, ABI-compatible ports of\n// the Uniswap v4 types (PoolKey, SwapParams, BalanceDelta, Currency), the v4 Hooks permission\n// flags, v4-periphery's BaseHook, and OpenZeppelin's SafeERC20.forceApprove, ReentrancyGuard and\n// Ownable2Step. Names are prefixed so they never clash with the real libraries when the\n// integrator adds them. Encodings, selectors and flag bits match Uniswap v4 exactly.\n// -----------------------------------------------------------------------------------------------\n\n/// @dev Uniswap v4 `Currency` (an address, native ETH is address(0)).\ntype BurrowCurrency is address;\n\n/// @dev Uniswap v4 `BalanceDelta`: amount0 in the upper 128 bits, amount1 in the lower 128 bits.\ntype BurrowBalanceDelta is int256;\n\n/// @dev Uniswap v4 `PoolKey`.\nstruct BurrowPoolKey {\n    BurrowCurrency currency0;\n    BurrowCurrency currency1;\n    uint24 fee;\n    int24 tickSpacing;\n    address hooks;\n}\n\n/// @dev Uniswap v4 `SwapParams` (IPoolManager.SwapParams / PoolOperation.SwapParams).\nstruct BurrowSwapParams {\n    bool zeroForOne;\n    int256 amountSpecified;\n    uint160 sqrtPriceLimitX96;\n}\n\n/// @dev Uniswap v4 `ModifyLiquidityParams`.\nstruct BurrowModifyLiquidityParams {\n    int24 tickLower;\n    int24 tickUpper;\n    int256 liquidityDelta;\n    bytes32 salt;\n}\n\n/// @dev Uniswap v4 `BeforeSwapDelta`.\ntype BurrowBeforeSwapDelta is int256;\n\nlibrary BurrowBalanceDeltaLib {\n    function amount0(BurrowBalanceDelta d) internal pure returns (int128 a0) {\n        assembly (\"memory-safe\") {\n            a0 := sar(128, d)\n        }\n    }\n\n    function amount1(BurrowBalanceDelta d) internal pure returns (int128 a1) {\n        assembly (\"memory-safe\") {\n            a1 := signextend(15, d)\n        }\n    }\n}\n\nlibrary BurrowPoolIdLib {\n    /// @dev Same as v4 PoolIdLibrary.toId: keccak256 of the 5-word PoolKey.\n    function toId(BurrowPoolKey memory key) internal pure returns (bytes32 id) {\n        assembly (\"memory-safe\") {\n            id := keccak256(key, 0xa0)\n        }\n    }\n}\n\n/// @dev The subset of the v4 PoolManager this hook calls.\ninterface IBurrowPoolManager {\n    function take(BurrowCurrency currency, address to, uint256 amount) external;\n}\n\n/// @dev Uniswap v4 `Hooks.Permissions` and flag bits (v4-core src/libraries/Hooks.sol).\nlibrary BurrowHooks {\n    uint160 internal constant ALL_HOOK_MASK = uint160((1 << 14) - 1);\n\n    uint160 internal constant BEFORE_INITIALIZE_FLAG = 1 << 13;\n    uint160 internal constant AFTER_INITIALIZE_FLAG = 1 << 12;\n    uint160 internal constant BEFORE_ADD_LIQUIDITY_FLAG = 1 << 11;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_FLAG = 1 << 10;\n    uint160 internal constant BEFORE_REMOVE_LIQUIDITY_FLAG = 1 << 9;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_FLAG = 1 << 8;\n    uint160 internal constant BEFORE_SWAP_FLAG = 1 << 7;\n    uint160 internal constant AFTER_SWAP_FLAG = 1 << 6;\n    uint160 internal constant BEFORE_DONATE_FLAG = 1 << 5;\n    uint160 internal constant AFTER_DONATE_FLAG = 1 << 4;\n    uint160 internal constant BEFORE_SWAP_RETURNS_DELTA_FLAG = 1 << 3;\n    uint160 internal constant AFTER_SWAP_RETURNS_DELTA_FLAG = 1 << 2;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 1;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 0;\n\n    struct Permissions {\n        bool beforeInitialize;\n        bool afterInitialize;\n        bool beforeAddLiquidity;\n        bool afterAddLiquidity;\n        bool beforeRemoveLiquidity;\n        bool afterRemoveLiquidity;\n        bool beforeSwap;\n        bool afterSwap;\n        bool beforeDonate;\n        bool afterDonate;\n        bool beforeSwapReturnDelta;\n        bool afterSwapReturnDelta;\n        bool afterAddLiquidityReturnDelta;\n        bool afterRemoveLiquidityReturnDelta;\n    }\n\n    error HookAddressNotValid(address hooks);\n\n    function toFlags(Permissions memory p) internal pure returns (uint160 flags) {\n        if (p.beforeInitialize) flags |= BEFORE_INITIALIZE_FLAG;\n        if (p.afterInitialize) flags |= AFTER_INITIALIZE_FLAG;\n        if (p.beforeAddLiquidity) flags |= BEFORE_ADD_LIQUIDITY_FLAG;\n        if (p.afterAddLiquidity) flags |= AFTER_ADD_LIQUIDITY_FLAG;\n        if (p.beforeRemoveLiquidity) flags |= BEFORE_REMOVE_LIQUIDITY_FLAG;\n        if (p.afterRemoveLiquidity) flags |= AFTER_REMOVE_LIQUIDITY_FLAG;\n        if (p.beforeSwap) flags |= BEFORE_SWAP_FLAG;\n        if (p.afterSwap) flags |= AFTER_SWAP_FLAG;\n        if (p.beforeDonate) flags |= BEFORE_DONATE_FLAG;\n        if (p.afterDonate) flags |= AFTER_DONATE_FLAG;\n        if (p.beforeSwapReturnDelta) flags |= BEFORE_SWAP_RETURNS_DELTA_FLAG;\n        if (p.afterSwapReturnDelta) flags |= AFTER_SWAP_RETURNS_DELTA_FLAG;\n        if (p.afterAddLiquidityReturnDelta) flags |= AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG;\n        if (p.afterRemoveLiquidityReturnDelta) flags |= AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG;\n    }\n\n    /// @dev Equivalent to v4 Hooks.validateHookPermissions: every one of the 14 low address bits\n    /// must equal the declared permission.\n    function validateHookPermissions(address self, Permissions memory p) internal pure {\n        if (uint160(self) & ALL_HOOK_MASK != toFlags(p)) revert HookAddressNotValid(self);\n    }\n}\n\n/// @dev Port of v4-periphery `BaseHook`: validates its own address against getHookPermissions at\n/// construction, gates every callback to the PoolManager and reverts on any unimplemented hook.\nabstract contract BurrowBaseHook {\n    error NotPoolManager();\n    error HookNotImplemented();\n\n    IBurrowPoolManager public immutable poolManager;\n\n    constructor(IBurrowPoolManager _poolManager) {\n        poolManager = _poolManager;\n        validateHookAddress(this);\n    }\n\n    modifier onlyPoolManager() {\n        if (msg.sender != address(poolManager)) revert NotPoolManager();\n        _;\n    }\n\n    function getHookPermissions() public pure virtual returns (BurrowHooks.Permissions memory);\n\n    function validateHookAddress(BurrowBaseHook _this) internal pure virtual {\n        BurrowHooks.validateHookPermissions(address(_this), getHookPermissions());\n    }\n\n    function beforeInitialize(address, BurrowPoolKey calldata, uint160) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function afterInitialize(address, BurrowPoolKey calldata, uint160, int24) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function beforeAddLiquidity(address, BurrowPoolKey calldata, BurrowModifyLiquidityParams calldata, bytes calldata)\n        external\n        virtual\n        returns (bytes4)\n    {\n        revert HookNotImplemented();\n    }\n\n    function afterAddLiquidity(\n        address,\n        BurrowPoolKey calldata,\n        BurrowModifyLiquidityParams calldata,\n        BurrowBalanceDelta,\n        BurrowBalanceDelta,\n        bytes calldata\n    ) external virtual returns (bytes4, BurrowBalanceDelta) {\n        revert HookNotImplemented();\n    }\n\n    function beforeRemoveLiquidity(\n        address,\n        BurrowPoolKey calldata,\n        BurrowModifyLiquidityParams calldata,\n        bytes calldata\n    ) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function afterRemoveLiquidity(\n        address,\n        BurrowPoolKey calldata,\n        BurrowModifyLiquidityParams calldata,\n        BurrowBalanceDelta,\n        BurrowBalanceDelta,\n        bytes calldata\n    ) external virtual returns (bytes4, BurrowBalanceDelta) {\n        revert HookNotImplemented();\n    }\n\n    function beforeSwap(address, BurrowPoolKey calldata, BurrowSwapParams calldata, bytes calldata)\n        external\n        virtual\n        returns (bytes4, BurrowBeforeSwapDelta, uint24)\n    {\n        revert HookNotImplemented();\n    }\n\n    function afterSwap(\n        address sender,\n        BurrowPoolKey calldata key,\n        BurrowSwapParams calldata params,\n        BurrowBalanceDelta delta,\n        bytes calldata hookData\n    ) external onlyPoolManager returns (bytes4, int128) {\n        return _afterSwap(sender, key, params, delta, hookData);\n    }\n\n    function beforeDonate(address, BurrowPoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        virtual\n        returns (bytes4)\n    {\n        revert HookNotImplemented();\n    }\n\n    function afterDonate(address, BurrowPoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        virtual\n        returns (bytes4)\n    {\n        revert HookNotImplemented();\n    }\n\n    function _afterSwap(address, BurrowPoolKey calldata, BurrowSwapParams calldata, BurrowBalanceDelta, bytes calldata)\n        internal\n        virtual\n        returns (bytes4, int128)\n    {\n        revert HookNotImplemented();\n    }\n}\n\n/// @dev Minimal ERC20 surface the hook needs.\ninterface IBurrowHookERC20 {\n    function balanceOf(address account) external view returns (uint256);\n    function approve(address spender, uint256 value) external returns (bool);\n}\n\n/// @notice The single function of BurrowVault this hook relies on: pull SQK from the caller and\n/// raise the bSQK share price without minting.\ninterface IBurrowVaultFeeSink {\n    function donate(uint256 amount) external;\n}\n\n/// @dev Port of OpenZeppelin ReentrancyGuard (v5 semantics).\nabstract contract BurrowHookReentrancyGuard {\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n    uint256 private _status = NOT_ENTERED;\n\n    error ReentrancyGuardReentrantCall();\n\n    modifier nonReentrant() {\n        if (_status == ENTERED) revert ReentrancyGuardReentrantCall();\n        _status = ENTERED;\n        _;\n        _status = NOT_ENTERED;\n    }\n}\n\n/// @dev Port of OpenZeppelin Ownable + Ownable2Step (v5 semantics, same errors and events).\nabstract contract BurrowHookOwnable2Step {\n    address private _owner;\n    address private _pendingOwner;\n\n    error OwnableUnauthorizedAccount(address account);\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) revert OwnableInvalidOwner(address(0));\n        _transferOwnership(initialOwner);\n    }\n\n    modifier onlyOwner() {\n        if (msg.sender != _owner) revert OwnableUnauthorizedAccount(msg.sender);\n        _;\n    }\n\n    function owner() public view returns (address) {\n        return _owner;\n    }\n\n    function pendingOwner() public view returns (address) {\n        return _pendingOwner;\n    }\n\n    function transferOwnership(address newOwner) external onlyOwner {\n        _pendingOwner = newOwner;\n        emit OwnershipTransferStarted(_owner, newOwner);\n    }\n\n    function acceptOwnership() external {\n        if (msg.sender != _pendingOwner) revert OwnableUnauthorizedAccount(msg.sender);\n        _transferOwnership(msg.sender);\n    }\n\n    function _transferOwnership(address newOwner) private {\n        delete _pendingOwner;\n        address old = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(old, newOwner);\n    }\n}\n\n/// @title BurrowHook\n/// @notice Uniswap v4 hook for the SQK pool. After every exact-input swap whose output currency is\n/// SQK it skims `hookFeeBps` of the output, takes it from the PoolManager and donates it to the\n/// Burrow vault, raising the bSQK share price. Swaps that do not pay out SQK are left untouched.\n/// @dev UNAUDITED, TESTNET ONLY. The hook address must carry exactly the AFTER_SWAP and\n/// AFTER_SWAP_RETURNS_DELTA flags (0x44 in the low 14 bits); deploy it through CREATE2 with a salt\n/// mined by HookMiner. A v4 afterSwap delta can only adjust the unspecified currency, so on\n/// exact-output swaps (where the SQK output is the specified amount) no fee is taken.\ncontract BurrowHook is BurrowBaseHook, BurrowHookReentrancyGuard, BurrowHookOwnable2Step {\n    using BurrowBalanceDeltaLib for BurrowBalanceDelta;\n    using BurrowPoolIdLib for BurrowPoolKey;\n\n    /// @notice Hard cap on the hook fee: 1 percent of the SQK output.\n    uint16 public constant MAX_HOOK_FEE_BPS = 100;\n    uint256 internal constant BPS = 10_000;\n\n    /// @notice The SQK token, the only currency this hook ever skims.\n    IBurrowHookERC20 public immutable sqk;\n    /// @notice The Burrow vault every fee is donated to. Fixed at construction.\n    IBurrowVaultFeeSink public immutable vault;\n\n    /// @notice Fee skimmed from SQK output, in basis points, at most MAX_HOOK_FEE_BPS.\n    uint16 public hookFeeBps;\n\n    error ZeroAddress();\n    error FeeTooHigh(uint16 feeBps, uint16 maxBps);\n    error NothingToFlush();\n    error ApproveFailed();\n\n    event HookFeeSet(uint16 oldFeeBps, uint16 newFeeBps);\n    event FeeDonated(bytes32 indexed poolId, uint256 amount);\n    /// @notice Emitted when the vault refused a donation; the fee stays here until flush().\n    event FeeHeld(bytes32 indexed poolId, uint256 amount);\n    event Flushed(uint256 amount);\n\n    /// @param poolManager_ Uniswap v4 PoolManager (Sepolia 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543).\n    /// @param sqk_ SQK token (Sepolia 0x5501e1fa81be1c3f49225fa7668da0245d07db60).\n    /// @param vault_ BurrowVault, the fee sink.\n    /// @param hookFeeBps_ Initial fee, at most MAX_HOOK_FEE_BPS.\n    /// @param owner_ Owner allowed to tune hookFeeBps within its cap.\n    constructor(address poolManager_, address sqk_, address vault_, uint16 hookFeeBps_, address owner_)\n        BurrowBaseHook(IBurrowPoolManager(poolManager_))\n        BurrowHookOwnable2Step(owner_)\n    {\n        if (poolManager_ == address(0) || sqk_ == address(0) || vault_ == address(0)) revert ZeroAddress();\n        if (hookFeeBps_ > MAX_HOOK_FEE_BPS) revert FeeTooHigh(hookFeeBps_, MAX_HOOK_FEE_BPS);\n        sqk = IBurrowHookERC20(sqk_);\n        vault = IBurrowVaultFeeSink(vault_);\n        hookFeeBps = hookFeeBps_;\n        emit HookFeeSet(0, hookFeeBps_);\n    }\n\n    /// @notice afterSwap and afterSwapReturnDelta only.\n    function getHookPermissions() public pure override returns (BurrowHooks.Permissions memory) {\n        return BurrowHooks.Permissions({\n            beforeInitialize: false,\n            afterInitialize: false,\n            beforeAddLiquidity: false,\n            afterAddLiquidity: false,\n            beforeRemoveLiquidity: false,\n            afterRemoveLiquidity: false,\n            beforeSwap: false,\n            afterSwap: true,\n            beforeDonate: false,\n            afterDonate: false,\n            beforeSwapReturnDelta: false,\n            afterSwapReturnDelta: true,\n            afterAddLiquidityReturnDelta: false,\n            afterRemoveLiquidityReturnDelta: false\n        });\n    }\n\n    /// @notice The exact low-14-bit flag set this hook's address must carry (AFTER_SWAP | AFTER_SWAP_RETURNS_DELTA).\n    function hookFlags() external pure returns (uint160) {\n        return BurrowHooks.AFTER_SWAP_FLAG | BurrowHooks.AFTER_SWAP_RETURNS_DELTA_FLAG;\n    }\n\n    /// @notice Set the hook fee, bounded by MAX_HOOK_FEE_BPS.\n    function setHookFeeBps(uint16 newFeeBps) external onlyOwner {\n        if (newFeeBps > MAX_HOOK_FEE_BPS) revert FeeTooHigh(newFeeBps, MAX_HOOK_FEE_BPS);\n        emit HookFeeSet(hookFeeBps, newFeeBps);\n        hookFeeBps = newFeeBps;\n    }\n\n    /// @notice Fee this hook would skim from an SQK output of `outputAmount`.\n    function quoteFee(uint256 outputAmount) public view returns (uint256) {\n        return outputAmount * hookFeeBps / BPS;\n    }\n\n    /// @notice Donate any SQK held here (fees the vault refused earlier) to the vault. Anyone may call.\n    function flush() external nonReentrant {\n        uint256 amount = sqk.balanceOf(address(this));\n        if (amount == 0) revert NothingToFlush();\n        _forceApprove(address(vault), amount);\n        vault.donate(amount);\n        emit Flushed(amount);\n    }\n\n    function _afterSwap(\n        address,\n        BurrowPoolKey calldata key,\n        BurrowSwapParams calldata params,\n        BurrowBalanceDelta delta,\n        bytes calldata\n    ) internal override nonReentrant returns (bytes4, int128) {\n        // The returned delta applies to the unspecified currency, which is the output only on exact input.\n        if (params.amountSpecified >= 0) return (BurrowBaseHook.afterSwap.selector, 0);\n\n        BurrowCurrency output = params.zeroForOne ? key.currency1 : key.currency0;\n        if (BurrowCurrency.unwrap(output) != address(sqk)) return (BurrowBaseHook.afterSwap.selector, 0);\n\n        int128 outputAmount = params.zeroForOne ? delta.amount1() : delta.amount0();\n        if (outputAmount <= 0) return (BurrowBaseHook.afterSwap.selector, 0);\n\n        uint256 fee = quoteFee(uint256(uint128(outputAmount)));\n        if (fee == 0) return (BurrowBaseHook.afterSwap.selector, 0);\n\n        // Returning +fee credits this hook in SQK; take() settles that credit to this contract.\n        poolManager.take(output, address(this), fee);\n\n        bytes32 poolId = key.toId();\n        _forceApprove(address(vault), fee);\n        // A failing vault must not brick the pool: keep the fee for flush() instead.\n        try vault.donate(fee) {\n            emit FeeDonated(poolId, fee);\n        } catch {\n            _forceApprove(address(vault), 0);\n            emit FeeHeld(poolId, fee);\n        }\n\n        // fee <= 1% of a positive int128, so the cast back is safe.\n        return (BurrowBaseHook.afterSwap.selector, int128(int256(fee)));\n    }\n\n    /// @dev OpenZeppelin SafeERC20.forceApprove semantics: tolerate tokens returning nothing and\n    /// tokens that require resetting the allowance to zero first.\n    function _forceApprove(address spender, uint256 value) private {\n        if (!_tryApprove(spender, value)) {\n            if (!_tryApprove(spender, 0) || !_tryApprove(spender, value)) revert ApproveFailed();\n        }\n    }\n\n    function _tryApprove(address spender, uint256 value) private returns (bool) {\n        (bool ok, bytes memory ret) = address(sqk).call(abi.encodeCall(IBurrowHookERC20.approve, (spender, value)));\n        return ok && (ret.length == 0 ? address(sqk).code.length > 0 : abi.decode(ret, (bool)));\n    }\n}\n"}},"language":"Solidity","settings":{"viaIR":false,"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"libraries":{},"optimizer":{"runs":1,"enabled":true},"evmVersion":"cancun","remappings":["forge-std/=/Users/loserzx/squeek/burrow-lite/lib/forge-std/src/"]}},"stdJsonOutput":{"sources":{"src/BurrowHook.sol":{"id":0}},"contracts":{"src/BurrowHook.sol":{"BurrowHook":{"abi":[{"type":"constructor","inputs":[{"name":"poolManager_","type":"address","internalType":"address"},{"name":"sqk_","type":"address","internalType":"address"},{"name":"vault_","type":"address","internalType":"address"},{"name":"hookFeeBps_","type":"uint16","internalType":"uint16"},{"name":"owner_","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"ApproveFailed","type":"error","inputs":[]},{"name":"FeeTooHigh","type":"error","inputs":[{"name":"feeBps","type":"uint16","internalType":"uint16"},{"name":"maxBps","type":"uint16","internalType":"uint16"}]},{"name":"HookAddressNotValid","type":"error","inputs":[{"name":"hooks","type":"address","internalType":"address"}]},{"name":"HookNotImplemented","type":"error","inputs":[]},{"name":"NotPoolManager","type":"error","inputs":[]},{"name":"NothingToFlush","type":"error","inputs":[]},{"name":"OwnableInvalidOwner","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"name":"OwnableUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"ReentrancyGuardReentrantCall","type":"error","inputs":[]},{"name":"ZeroAddress","type":"error","inputs":[]},{"name":"FeeDonated","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"FeeHeld","type":"event","inputs":[{"name":"poolId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Flushed","type":"event","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"HookFeeSet","type":"event","inputs":[{"name":"oldFeeBps","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"newFeeBps","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"name":"OwnershipTransferStarted","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"MAX_HOOK_FEE_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"acceptOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"afterAddLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"}],"stateMutability":"nonpayable"},{"name":"afterDonate","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"afterInitialize","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"uint160","internalType":"uint160"},{"name":"","type":"int24","internalType":"int24"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"afterRemoveLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BurrowBalanceDelta"}],"stateMutability":"nonpayable"},{"name":"afterSwap","type":"function","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"key","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"params","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct BurrowSwapParams"},{"name":"delta","type":"int256","internalType":"BurrowBalanceDelta"},{"name":"hookData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int128","internalType":"int128"}],"stateMutability":"nonpayable"},{"name":"beforeAddLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeDonate","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeInitialize","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"uint160","internalType":"uint160"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeRemoveLiquidity","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"liquidityDelta","type":"int256","internalType":"int256"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"internalType":"struct BurrowModifyLiquidityParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"name":"beforeSwap","type":"function","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"tuple","components":[{"name":"currency0","type":"address","internalType":"BurrowCurrency"},{"name":"currency1","type":"address","internalType":"BurrowCurrency"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"tickSpacing","type":"int24","internalType":"int24"},{"name":"hooks","type":"address","internalType":"address"}],"internalType":"struct BurrowPoolKey"},{"name":"","type":"tuple","components":[{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"}],"internalType":"struct BurrowSwapParams"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"},{"name":"","type":"int256","internalType":"BurrowBeforeSwapDelta"},{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"nonpayable"},{"name":"flush","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"getHookPermissions","type":"function","inputs":[],"outputs":[{"name":"","type":"tuple","components":[{"name":"beforeInitialize","type":"bool","internalType":"bool"},{"name":"afterInitialize","type":"bool","internalType":"bool"},{"name":"beforeAddLiquidity","type":"bool","internalType":"bool"},{"name":"afterAddLiquidity","type":"bool","internalType":"bool"},{"name":"beforeRemoveLiquidity","type":"bool","internalType":"bool"},{"name":"afterRemoveLiquidity","type":"bool","internalType":"bool"},{"name":"beforeSwap","type":"bool","internalType":"bool"},{"name":"afterSwap","type":"bool","internalType":"bool"},{"name":"beforeDonate","type":"bool","internalType":"bool"},{"name":"afterDonate","type":"bool","internalType":"bool"},{"name":"beforeSwapReturnDelta","type":"bool","internalType":"bool"},{"name":"afterSwapReturnDelta","type":"bool","internalType":"bool"},{"name":"afterAddLiquidityReturnDelta","type":"bool","internalType":"bool"},{"name":"afterRemoveLiquidityReturnDelta","type":"bool","internalType":"bool"}],"internalType":"struct BurrowHooks.Permissions"}],"stateMutability":"pure"},{"name":"hookFeeBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"hookFlags","type":"function","inputs":[],"outputs":[{"name":"","type":"uint160","internalType":"uint160"}],"stateMutability":"pure"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"pendingOwner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"poolManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBurrowPoolManager"}],"stateMutability":"view"},{"name":"quoteFee","type":"function","inputs":[{"name":"outputAmount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"setHookFeeBps","type":"function","inputs":[{"name":"newFeeBps","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sqk","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBurrowHookERC20"}],"stateMutability":"view"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"vault","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBurrowVaultFeeSink"}],"stateMutability":"view"}],"metadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"poolManager_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sqk_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vault_\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"hookFeeBps_\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"owner_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ApproveFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"feeBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"maxBps\",\"type\":\"uint16\"}],\"name\":\"FeeTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"name\":\"HookAddressNotValid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HookNotImplemented\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPoolManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NothingToFlush\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeDonated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeHeld\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Flushed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"oldFeeBps\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newFeeBps\",\"type\":\"uint16\"}],\"name\":\"HookFeeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_HOOK_FEE_BPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"internalType\":\"struct BurrowModifyLiquidityParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"BurrowBalanceDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"BurrowBalanceDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"afterAddLiquidity\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"BurrowBalanceDelta\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"afterDonate\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint160\",\"name\":\"\",\"type\":\"uint160\"},{\"internalType\":\"int24\",\"name\":\"\",\"type\":\"int24\"}],\"name\":\"afterInitialize\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"internalType\":\"struct BurrowModifyLiquidityParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"BurrowBalanceDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"BurrowBalanceDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"afterRemoveLiquidity\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"BurrowBalanceDelta\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"zeroForOne\",\"type\":\"bool\"},{\"internalType\":\"int256\",\"name\":\"amountSpecified\",\"type\":\"int256\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceLimitX96\",\"type\":\"uint160\"}],\"internalType\":\"struct BurrowSwapParams\",\"name\":\"params\",\"type\":\"tuple\"},{\"internalType\":\"BurrowBalanceDelta\",\"name\":\"delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"hookData\",\"type\":\"bytes\"}],\"name\":\"afterSwap\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"int128\",\"name\":\"\",\"type\":\"int128\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"internalType\":\"struct BurrowModifyLiquidityParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"beforeAddLiquidity\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"beforeDonate\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint160\",\"name\":\"\",\"type\":\"uint160\"}],\"name\":\"beforeInitialize\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"int256\",\"name\":\"liquidityDelta\",\"type\":\"int256\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"internalType\":\"struct BurrowModifyLiquidityParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"beforeRemoveLiquidity\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"BurrowCurrency\",\"name\":\"currency0\",\"type\":\"address\"},{\"internalType\":\"BurrowCurrency\",\"name\":\"currency1\",\"type\":\"address\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"int24\",\"name\":\"tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"hooks\",\"type\":\"address\"}],\"internalType\":\"struct BurrowPoolKey\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"zeroForOne\",\"type\":\"bool\"},{\"internalType\":\"int256\",\"name\":\"amountSpecified\",\"type\":\"int256\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceLimitX96\",\"type\":\"uint160\"}],\"internalType\":\"struct BurrowSwapParams\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"beforeSwap\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"},{\"internalType\":\"BurrowBeforeSwapDelta\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"flush\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getHookPermissions\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"beforeInitialize\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"afterInitialize\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"beforeAddLiquidity\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"afterAddLiquidity\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"beforeRemoveLiquidity\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"afterRemoveLiquidity\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"beforeSwap\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"afterSwap\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"beforeDonate\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"afterDonate\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"beforeSwapReturnDelta\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"afterSwapReturnDelta\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"afterAddLiquidityReturnDelta\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"afterRemoveLiquidityReturnDelta\",\"type\":\"bool\"}],\"internalType\":\"struct BurrowHooks.Permissions\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hookFeeBps\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hookFlags\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"\",\"type\":\"uint160\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolManager\",\"outputs\":[{\"internalType\":\"contract IBurrowPoolManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"outputAmount\",\"type\":\"uint256\"}],\"name\":\"quoteFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"newFeeBps\",\"type\":\"uint16\"}],\"name\":\"setHookFeeBps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sqk\",\"outputs\":[{\"internalType\":\"contract IBurrowHookERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vault\",\"outputs\":[{\"internalType\":\"contract IBurrowVaultFeeSink\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"UNAUDITED, TESTNET ONLY. The hook address must carry exactly the AFTER_SWAP and AFTER_SWAP_RETURNS_DELTA flags (0x44 in the low 14 bits); deploy it through CREATE2 with a salt mined by HookMiner. A v4 afterSwap delta can only adjust the unspecified currency, so on exact-output swaps (where the SQK output is the specified amount) no fee is taken.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"hookFeeBps_\":\"Initial fee, at most MAX_HOOK_FEE_BPS.\",\"owner_\":\"Owner allowed to tune hookFeeBps within its cap.\",\"poolManager_\":\"Uniswap v4 PoolManager (Sepolia 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543).\",\"sqk_\":\"SQK token (Sepolia 0x5501e1fa81be1c3f49225fa7668da0245d07db60).\",\"vault_\":\"BurrowVault, the fee sink.\"}}},\"title\":\"BurrowHook\",\"version\":1},\"userdoc\":{\"events\":{\"FeeHeld(bytes32,uint256)\":{\"notice\":\"Emitted when the vault refused a donation; the fee stays here until flush().\"}},\"kind\":\"user\",\"methods\":{\"MAX_HOOK_FEE_BPS()\":{\"notice\":\"Hard cap on the hook fee: 1 percent of the SQK output.\"},\"flush()\":{\"notice\":\"Donate any SQK held here (fees the vault refused earlier) to the vault. Anyone may call.\"},\"getHookPermissions()\":{\"notice\":\"afterSwap and afterSwapReturnDelta only.\"},\"hookFeeBps()\":{\"notice\":\"Fee skimmed from SQK output, in basis points, at most MAX_HOOK_FEE_BPS.\"},\"hookFlags()\":{\"notice\":\"The exact low-14-bit flag set this hook's address must carry (AFTER_SWAP | AFTER_SWAP_RETURNS_DELTA).\"},\"quoteFee(uint256)\":{\"notice\":\"Fee this hook would skim from an SQK output of `outputAmount`.\"},\"setHookFeeBps(uint16)\":{\"notice\":\"Set the hook fee, bounded by MAX_HOOK_FEE_BPS.\"},\"sqk()\":{\"notice\":\"The SQK token, the only currency this hook ever skims.\"},\"vault()\":{\"notice\":\"The Burrow vault every fee is donated to. Fixed at construction.\"}},\"notice\":\"Uniswap v4 hook for the SQK pool. After every exact-input swap whose output currency is SQK it skims `hookFeeBps` of the output, takes it from the PoolManager and donates it to the Burrow vault, raising the bSQK share price. Swaps that do not pay out SQK are left untouched.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/BurrowHook.sol\":\"BurrowHook\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1},\"remappings\":[\":forge-std/=/Users/loserzx/squeek/burrow-lite/lib/forge-std/src/\"]},\"sources\":{\"src/BurrowHook.sol\":{\"keccak256\":\"0xc99030275a53ddca0a76addb6264fc3a271d4084ae7eda609646646830347e36\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://261ea7869cd306ff0235726d5d35dbc757cc560936b0959746100ad3da6f3852\",\"dweb:/ipfs/QmaEvz9ngbyVMLwyHybkfa3LP8Xz94NaWzfSNiASMg8Uz7\"]}},\"version\":1}","userdoc":{"kind":"user","events":{"FeeHeld(bytes32,uint256)":{"notice":"Emitted when the vault refused a donation; the fee stays here until flush()."}},"notice":"Uniswap v4 hook for the SQK pool. After every exact-input swap whose output currency is SQK it skims `hookFeeBps` of the output, takes it from the PoolManager and donates it to the Burrow vault, raising the bSQK share price. Swaps that do not pay out SQK are left untouched.","methods":{"sqk()":{"notice":"The SQK token, the only currency this hook ever skims."},"flush()":{"notice":"Donate any SQK held here (fees the vault refused earlier) to the vault. Anyone may call."},"vault()":{"notice":"The Burrow vault every fee is donated to. Fixed at construction."},"hookFlags()":{"notice":"The exact low-14-bit flag set this hook's address must carry (AFTER_SWAP | AFTER_SWAP_RETURNS_DELTA)."},"hookFeeBps()":{"notice":"Fee skimmed from SQK output, in basis points, at most MAX_HOOK_FEE_BPS."},"quoteFee(uint256)":{"notice":"Fee this hook would skim from an SQK output of `outputAmount`."},"MAX_HOOK_FEE_BPS()":{"notice":"Hard cap on the hook fee: 1 percent of the SQK output."},"getHookPermissions()":{"notice":"afterSwap and afterSwapReturnDelta only."},"setHookFeeBps(uint16)":{"notice":"Set the hook fee, bounded by MAX_HOOK_FEE_BPS."}},"version":1},"devdoc":{"kind":"dev","title":"BurrowHook","details":"UNAUDITED, TESTNET ONLY. The hook address must carry exactly the AFTER_SWAP and AFTER_SWAP_RETURNS_DELTA flags (0x44 in the low 14 bits); deploy it through CREATE2 with a salt mined by HookMiner. A v4 afterSwap delta can only adjust the unspecified currency, so on exact-output swaps (where the SQK output is the specified amount) no fee is taken.","methods":{"constructor":{"params":{"sqk_":"SQK token (Sepolia 0x5501e1fa81be1c3f49225fa7668da0245d07db60).","owner_":"Owner allowed to tune hookFeeBps within its cap.","vault_":"BurrowVault, the fee sink.","hookFeeBps_":"Initial fee, at most MAX_HOOK_FEE_BPS.","poolManager_":"Uniswap v4 PoolManager (Sepolia 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543)."}}},"version":1},"storageLayout":{"types":{"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_uint256","astId":677,"label":"_status","offset":0,"contract":"src/BurrowHook.sol:BurrowHook"},{"slot":"1","type":"t_address","astId":702,"label":"_owner","offset":0,"contract":"src/BurrowHook.sol:BurrowHook"},{"slot":"2","type":"t_address","astId":704,"label":"_pendingOwner","offset":0,"contract":"src/BurrowHook.sol:BurrowHook"},{"slot":"2","type":"t_uint16","astId":870,"label":"hookFeeBps","offset":20,"contract":"src/BurrowHook.sol:BurrowHook"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"60e060405260015f55348015610013575f80fd5b50604051611932380380611932833981016040819052610032916103fb565b6001600160a01b038516608052808561004a3061017e565b506001600160a01b03811661007d575f604051631e4fbdf760e01b81526004016100749190610464565b60405180910390fd5b61008681610271565b506001600160a01b03851615806100a457506001600160a01b038416155b806100b657506001600160a01b038316155b156100d45760405163d92e233d60e01b815260040160405180910390fd5b606461ffff8316111561010757604051633c057d7b60e01b815261ffff8316600482015260646024820152604401610074565b6001600160a01b0384811660a052831660c0526002805461ffff60a01b1916600160a01b61ffff851690810291909117909155604080515f815260208101929092527f9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64910160405180910390a15050505050610478565b61026e81610269604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052600160e0820181905261010082018390526101208201839052610140820183905261016082015261018081018290526101a081019190915290565b6102cd565b50565b600280546001600160a01b0319908116909155600180546001600160a01b0384811693821684179092556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6102d681610311565b6001600160a01b0316613fff83166001600160a01b03161461030d5781604051630732d7b560e51b81526004016100749190610464565b5050565b80515f901561031f57612000175b81602001511561032e57611000175b81604001511561033d57610800175b81606001511561034c57610400175b81608001511561035b57610200175b8160a001511561036a57610100175b8160c0015115610378576080175b8160e0015115610386576040175b81610100015115610395576020175b816101200151156103a4576010175b816101400151156103b3576008175b816101600151156103c2576004175b816101800151156103d1576002175b816101a00151156103e0576001175b919050565b80516001600160a01b03811681146103e0575f80fd5b5f805f805f60a0868803121561040f575f80fd5b610418866103e5565b9450610426602087016103e5565b9350610434604087016103e5565b9250606086015161ffff8116811461044a575f80fd5b9150610458608087016103e5565b90509295509295909350565b6001600160a01b0391909116815260200190565b60805160a05160c0516114436104ef5f395f818161042e0152818161065a0152818161069501528181610b0101528181610b3c0152610b9f01525f8181610399015281816105bf0152818161099301528181610c640152610d5601525f81816103c0015281816107940152610a8701526114435ff3fe608060405234801561000f575f80fd5b5060043610610126575f3560e01c806321d0ee701461012a5780632205f5681461015b578063259982e51461012a5780632c43afc51461017c578063575e24b4146101915780636b9f96ea146101cf5780636c2bbe7e146101d75780636fe7e6eb1461020a57806379ba5097146102185780638da5cb5b146102205780639f063efc146101d7578063b47b2fb11461023a578063b6a8b0fa14610270578063c40849381461027e578063c4e833ce14610285578063c6878f4e14610379578063c98a295b14610394578063dc4c90d3146103bb578063dc98354e146103e2578063e1b4af6914610270578063e30c3978146103f0578063ea26abcf14610401578063f2fde38b14610416578063fbfa77cf14610429575b5f80fd5b61013d610138366004610e1b565b610450565b6040516001600160e01b031990911681526020015b60405180910390f35b61016e610169366004610e91565b61046a565b604051908152602001610152565b61018f61018a366004610ea8565b610498565b005b6101a461019f366004610ee0565b610564565b604080516001600160e01b03199094168452602084019290925262ffffff1690820152606001610152565b61018f610580565b6101ea6101e5366004610f39565b610734565b604080516001600160e01b03199093168352602083019190915201610152565b61013d610138366004610fd4565b61018f61074f565b6001546001600160a01b03165b604051610152919061102b565b61024d61024836600461103f565b610787565b604080516001600160e01b03199093168352600f9190910b602083015201610152565b61013d6101383660046110bf565b604461022d565b61036c604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052600160e0820181905261010082018390526101208201839052610140820183905261016082015261018081018290526101a081019190915290565b6040516101529190611118565b610381606481565b60405161ffff9091168152602001610152565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61013d610138366004611239565b6002546001600160a01b031661022d565b60025461038190600160a01b900461ffff1681565b61018f610424366004611280565b6107ef565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b5f604051630a85dc2960e01b815260040160405180910390fd5b6002545f906127109061048890600160a01b900461ffff168461129b565b61049291906112be565b92915050565b6001546001600160a01b031633146104ce573360405163118cdaa760e01b81526004016104c5919061102b565b60405180910390fd5b606461ffff821611156104f957806064604051633c057d7b60e01b81526004016104c59291906112dd565b7f9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64600260149054906101000a900461ffff168260405161053a9291906112dd565b60405180910390a16002805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b5f805f604051630a85dc2960e01b815260040160405180910390fd5b60025f54036105a257604051633ee5aeb560e01b815260040160405180910390fd5b60025f9081556040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105f490309060040161102b565b602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906112f2565b9050805f0361065557604051633ada528f60e21b815260040160405180910390fd5b61067f7f00000000000000000000000000000000000000000000000000000000000000008261086d565b60405163f14faf6f60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b1580156106de575f80fd5b505af11580156106f0573d5f803e3d5ffd5b505050507fed1eeda1fde9cc22a2ecf41efc0d6cf519c1d95184b36b93b4cd4877881488ee8160405161072591815260200190565b60405180910390a15060015f55565b5f80604051630a85dc2960e01b815260040160405180910390fd5b6002546001600160a01b0316331461077c573360405163118cdaa760e01b81526004016104c5919061102b565b610785336108ba565b565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d25760405163570c108560e11b815260040160405180910390fd5b6107e0888888888888610916565b91509150965096945050505050565b6001546001600160a01b0316331461081c573360405163118cdaa760e01b81526004016104c5919061102b565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700905f90a350565b6108778282610c5f565b6108b657610885825f610c5f565b158061089857506108968282610c5f565b155b156108b657604051633e3f8f7360e01b815260040160405180910390fd5b5050565b600280546001600160a01b0319908116909155600180546001600160a01b0384811693821684179092556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8060025f540361093a57604051633ee5aeb560e01b815260040160405180910390fd5b60025f90815560208701351261095b575063b47b2fb160e01b90505f610c4e565b5f6109696020880188611316565b61097f5761097a6020890189611280565b61098f565b61098f6040890160208a01611280565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146109dd575063b47b2fb160e01b91505f9050610c4e565b5f6109eb6020890189611316565b6109fe576109f98760801d90565b610a08565b610a0887600f0b90565b90505f81600f0b13610a29575063b47b2fb160e01b92505f9150610c4e9050565b5f610a3c826001600160801b031661046a565b9050805f03610a5b575063b47b2fb160e01b93505f9250610c4e915050565b604051630b0d9c0960e01b81526001600160a01b038481166004830152306024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690630b0d9c09906064015f604051808303815f87803b158015610ac8575f80fd5b505af1158015610ada573d5f803e3d5ffd5b505050505f610afa8b803603810190610af39190611343565b60a0902090565b9050610b267f00000000000000000000000000000000000000000000000000000000000000008361086d565b60405163f14faf6f60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b158015610b85575f80fd5b505af1925050508015610b96575060015b610c0357610bc47f00000000000000000000000000000000000000000000000000000000000000005f61086d565b807f76853f6287e5caf0c4284c123f04368dc4ada480832f72484e445adf762ee45783604051610bf691815260200190565b60405180910390a2610c3e565b807f5cba8bc9707d2af8fcbba504de8cd3ae98564aac502e8c1db7bf8853ff678ec283604051610c3591815260200190565b60405180910390a25b5063b47b2fb160e01b9450925050505b60015f559097909650945050505050565b5f805f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585604051602401610cb39291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b17905251610ce891906113dc565b5f604051808303815f865af19150503d805f8114610d21576040519150601f19603f3d011682016040523d82523d5f602084013e610d26565b606091505b5091509150818015610d815750805115610d535780806020019051810190610d4e91906113f2565b610d81565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b115b95945050505050565b6001600160a01b0381168114610d9e575f80fd5b50565b8035610dac81610d8a565b919050565b5f60a08284031215610dc1575f80fd5b50919050565b5f60808284031215610dc1575f80fd5b5f8083601f840112610de7575f80fd5b5081356001600160401b03811115610dfd575f80fd5b602083019150836020828501011115610e14575f80fd5b9250929050565b5f805f805f6101608688031215610e30575f80fd5b8535610e3b81610d8a565b9450610e4a8760208801610db1565b9350610e598760c08801610dc7565b92506101408601356001600160401b03811115610e74575f80fd5b610e8088828901610dd7565b969995985093965092949392505050565b5f60208284031215610ea1575f80fd5b5035919050565b5f60208284031215610eb8575f80fd5b813561ffff81168114610ec9575f80fd5b9392505050565b5f60608284031215610dc1575f80fd5b5f805f805f6101408688031215610ef5575f80fd5b8535610f0081610d8a565b9450610f0f8760208801610db1565b9350610f1e8760c08801610ed0565b92506101208601356001600160401b03811115610e74575f80fd5b5f805f805f805f6101a0888a031215610f50575f80fd5b8735610f5b81610d8a565b9650610f6a8960208a01610db1565b9550610f798960c08a01610dc7565b9450610140880135935061016088013592506101808801356001600160401b03811115610fa4575f80fd5b610fb08a828b01610dd7565b989b979a50959850939692959293505050565b8035600281900b8114610dac575f80fd5b5f805f806101008587031215610fe8575f80fd5b8435610ff381610d8a565b93506110028660208701610db1565b925060c085013561101281610d8a565b915061102060e08601610fc3565b905092959194509250565b6001600160a01b0391909116815260200190565b5f805f805f806101608789031215611055575f80fd5b863561106081610d8a565b955061106f8860208901610db1565b945061107e8860c08901610ed0565b935061012087013592506101408701356001600160401b038111156110a1575f80fd5b6110ad89828a01610dd7565b979a9699509497509295939492505050565b5f805f805f8061012087890312156110d5575f80fd5b86356110e081610d8a565b95506110ef8860208901610db1565b945060c0870135935060e087013592506101008701356001600160401b038111156110a1575f80fd5b8151151581526101c081016020830151611136602084018215159052565b50604083015161114a604084018215159052565b50606083015161115e606084018215159052565b506080830151611172608084018215159052565b5060a083015161118660a084018215159052565b5060c083015161119a60c084018215159052565b5060e08301516111ae60e084018215159052565b506101008301516111c461010084018215159052565b506101208301516111da61012084018215159052565b506101408301516111f061014084018215159052565b5061016083015161120661016084018215159052565b5061018083015161121c61018084018215159052565b506101a08301516112326101a084018215159052565b5092915050565b5f805f60e0848603121561124b575f80fd5b833561125681610d8a565b92506112658560208601610db1565b915060c084013561127581610d8a565b809150509250925092565b5f60208284031215611290575f80fd5b8135610ec981610d8a565b808202811582820484141761049257634e487b7160e01b5f52601160045260245ffd5b5f826112d857634e487b7160e01b5f52601260045260245ffd5b500490565b61ffff92831681529116602082015260400190565b5f60208284031215611302575f80fd5b5051919050565b8015158114610d9e575f80fd5b5f60208284031215611326575f80fd5b8135610ec981611309565b803562ffffff81168114610dac575f80fd5b5f60a0828403128015611354575f80fd5b5060405160a081016001600160401b038111828210171561138357634e487b7160e01b5f52604160045260245ffd5b60405261138f83610da1565b815261139d60208401610da1565b60208201526113ae60408401611331565b60408201526113bf60608401610fc3565b60608201526113d060808401610da1565b60808201529392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611402575f80fd5b8151610ec98161130956fea26469706673582212207c5d3c0125472d6d4a682d879b3fa761e7290775ca8090df88bda4d5259b689764736f6c634300081a0033","sourceMap":"12121:6302:0:-:0;;;9613:1;9662:37;;13664:567;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5942:26:0;;;;13852:6;13806:12;5978:25;5998:4;5978:19;:25::i;:::-;-1:-1:-1;;;;;;10461:26:0;;10457:70;;10524:1;10496:31;;-1:-1:-1;;;10496:31:0;;;;;;;;:::i;:::-;;;;;;;;10457:70;10537:32;10556:12;10537:18;:32::i;:::-;-1:-1:-1;;;;;;13878:26:0;::::2;::::0;;:48:::2;;-1:-1:-1::0;;;;;;13908:18:0;::::2;::::0;13878:48:::2;:72;;;-1:-1:-1::0;;;;;;13930:20:0;::::2;::::0;13878:72:::2;13874:98;;;13959:13;;-1:-1:-1::0;;;13959:13:0::2;;;;;;;;;;;13874:98;12431:3;13986:30;::::0;::::2;;13982:84;;;14025:41;::::0;-1:-1:-1;;;14025:41:0;;1227:6:1;1215:19;;14025:41:0::2;::::0;::::2;1197:38:1::0;12431:3:0::2;1251:18:1::0;;;1244:47;1170:18;;14025:41:0::2;1027:270:1::0;13982:84:0::2;-1:-1:-1::0;;;;;14076:28:0;;::::2;;::::0;14114:35;::::2;;::::0;14159:10:::2;:24:::0;;-1:-1:-1;;;;14159:24:0::2;-1:-1:-1::0;;;14159:24:0::2;::::0;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;14198:26:::2;::::0;;-1:-1:-1;1197:38:1;;1266:2;1251:18;;1244:47;;;;14198:26:0::2;::::0;1170:18:1;14198:26:0::2;;;;;;;13664:567:::0;;;;;12121:6302;;6237:163;6320:73;6364:5;6372:20;12121:6302;;;;;;;;-1:-1:-1;12121:6302:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14403:576:0;;;;;;;;-1:-1:-1;14403:576:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14294:692;6372:20;6320:35;:73::i;:::-;6237:163;:::o;11233:198::-;11304:13;11297:20;;-1:-1:-1;;;;;;11297:20:0;;;;;;;11341:6;;-1:-1:-1;;;;;11357:17:0;;;;;;;;;;;11389:35;;11341:6;;;11357:17;11341:6;;11389:35;;11304:13;;11389:35;11287:144;11233:198;:::o;5353:181::-;5483:10;5491:1;5483:7;:10::i;:::-;-1:-1:-1;;;;;5450:43:0;2654:13;5458:4;5450:29;-1:-1:-1;;;;;5450:43:0;;5446:81;;5522:4;5502:25;;-1:-1:-1;;;5502:25:0;;;;;;;;:::i;5446:81::-;5353:181;;:::o;4143:1062::-;4234:18;;4205:13;;4230:55;;;2726:7;4254:31;4230:55;4299:1;:17;;;4295:53;;;2789:7;4318:30;4295:53;4362:1;:20;;;4358:60;;;2856:7;4384:34;4358:60;4432:1;:19;;;4428:58;;;2922:7;4453:33;4428:58;4500:1;:23;;;4496:66;;;2992:6;4525:37;4496:66;4576:1;:22;;;4572:64;;;3060:6;4600:36;4572:64;4650:1;:12;;;4646:43;;;3117:6;4664:25;4646:43;4703:1;:11;;;4699:41;;;3173:6;4716:24;4699:41;4754:1;:14;;;4750:47;;;3232:6;4770:27;4750:47;4811:1;:13;;;4807:45;;;3290:6;4826:26;4807:45;4866:1;:23;;;4862:68;;;3361:6;4891:39;4862:68;4944:1;:22;;;4940:66;;;3431:6;4968:38;4940:66;5020:1;:30;;;5016:83;;;3510:6;5052:47;5016:83;5113:1;:33;;;5109:89;;;3592:6;5148:50;5109:89;4143:1062;;;:::o;14:177:1:-;93:13;;-1:-1:-1;;;;;135:31:1;;125:42;;115:70;;181:1;178;171:12;196:618;301:6;309;317;325;333;386:3;374:9;365:7;361:23;357:33;354:53;;;403:1;400;393:12;354:53;426:40;456:9;426:40;:::i;:::-;416:50;;485:49;530:2;519:9;515:18;485:49;:::i;:::-;475:59;;553:49;598:2;587:9;583:18;553:49;:::i;:::-;543:59;;645:2;634:9;630:18;624:25;689:6;682:5;678:18;671:5;668:29;658:57;;711:1;708;701:12;658:57;734:5;-1:-1:-1;758:50:1;803:3;788:19;;758:50;:::i;:::-;748:60;;196:618;;;;;;;;:::o;819:203::-;-1:-1:-1;;;;;983:32:1;;;;965:51;;953:2;938:18;;819:203::o;1302:279::-;12121:6302:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608060405234801561000f575f80fd5b5060043610610126575f3560e01c806321d0ee701461012a5780632205f5681461015b578063259982e51461012a5780632c43afc51461017c578063575e24b4146101915780636b9f96ea146101cf5780636c2bbe7e146101d75780636fe7e6eb1461020a57806379ba5097146102185780638da5cb5b146102205780639f063efc146101d7578063b47b2fb11461023a578063b6a8b0fa14610270578063c40849381461027e578063c4e833ce14610285578063c6878f4e14610379578063c98a295b14610394578063dc4c90d3146103bb578063dc98354e146103e2578063e1b4af6914610270578063e30c3978146103f0578063ea26abcf14610401578063f2fde38b14610416578063fbfa77cf14610429575b5f80fd5b61013d610138366004610e1b565b610450565b6040516001600160e01b031990911681526020015b60405180910390f35b61016e610169366004610e91565b61046a565b604051908152602001610152565b61018f61018a366004610ea8565b610498565b005b6101a461019f366004610ee0565b610564565b604080516001600160e01b03199094168452602084019290925262ffffff1690820152606001610152565b61018f610580565b6101ea6101e5366004610f39565b610734565b604080516001600160e01b03199093168352602083019190915201610152565b61013d610138366004610fd4565b61018f61074f565b6001546001600160a01b03165b604051610152919061102b565b61024d61024836600461103f565b610787565b604080516001600160e01b03199093168352600f9190910b602083015201610152565b61013d6101383660046110bf565b604461022d565b61036c604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101829052600160e0820181905261010082018390526101208201839052610140820183905261016082015261018081018290526101a081019190915290565b6040516101529190611118565b610381606481565b60405161ffff9091168152602001610152565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b61013d610138366004611239565b6002546001600160a01b031661022d565b60025461038190600160a01b900461ffff1681565b61018f610424366004611280565b6107ef565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b5f604051630a85dc2960e01b815260040160405180910390fd5b6002545f906127109061048890600160a01b900461ffff168461129b565b61049291906112be565b92915050565b6001546001600160a01b031633146104ce573360405163118cdaa760e01b81526004016104c5919061102b565b60405180910390fd5b606461ffff821611156104f957806064604051633c057d7b60e01b81526004016104c59291906112dd565b7f9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64600260149054906101000a900461ffff168260405161053a9291906112dd565b60405180910390a16002805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b5f805f604051630a85dc2960e01b815260040160405180910390fd5b60025f54036105a257604051633ee5aeb560e01b815260040160405180910390fd5b60025f9081556040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906105f490309060040161102b565b602060405180830381865afa15801561060f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063391906112f2565b9050805f0361065557604051633ada528f60e21b815260040160405180910390fd5b61067f7f00000000000000000000000000000000000000000000000000000000000000008261086d565b60405163f14faf6f60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b1580156106de575f80fd5b505af11580156106f0573d5f803e3d5ffd5b505050507fed1eeda1fde9cc22a2ecf41efc0d6cf519c1d95184b36b93b4cd4877881488ee8160405161072591815260200190565b60405180910390a15060015f55565b5f80604051630a85dc2960e01b815260040160405180910390fd5b6002546001600160a01b0316331461077c573360405163118cdaa760e01b81526004016104c5919061102b565b610785336108ba565b565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d25760405163570c108560e11b815260040160405180910390fd5b6107e0888888888888610916565b91509150965096945050505050565b6001546001600160a01b0316331461081c573360405163118cdaa760e01b81526004016104c5919061102b565b600280546001600160a01b0319166001600160a01b03838116918217909255600154604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700905f90a350565b6108778282610c5f565b6108b657610885825f610c5f565b158061089857506108968282610c5f565b155b156108b657604051633e3f8f7360e01b815260040160405180910390fd5b5050565b600280546001600160a01b0319908116909155600180546001600160a01b0384811693821684179092556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8060025f540361093a57604051633ee5aeb560e01b815260040160405180910390fd5b60025f90815560208701351261095b575063b47b2fb160e01b90505f610c4e565b5f6109696020880188611316565b61097f5761097a6020890189611280565b61098f565b61098f6040890160208a01611280565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146109dd575063b47b2fb160e01b91505f9050610c4e565b5f6109eb6020890189611316565b6109fe576109f98760801d90565b610a08565b610a0887600f0b90565b90505f81600f0b13610a29575063b47b2fb160e01b92505f9150610c4e9050565b5f610a3c826001600160801b031661046a565b9050805f03610a5b575063b47b2fb160e01b93505f9250610c4e915050565b604051630b0d9c0960e01b81526001600160a01b038481166004830152306024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690630b0d9c09906064015f604051808303815f87803b158015610ac8575f80fd5b505af1158015610ada573d5f803e3d5ffd5b505050505f610afa8b803603810190610af39190611343565b60a0902090565b9050610b267f00000000000000000000000000000000000000000000000000000000000000008361086d565b60405163f14faf6f60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f14faf6f906024015f604051808303815f87803b158015610b85575f80fd5b505af1925050508015610b96575060015b610c0357610bc47f00000000000000000000000000000000000000000000000000000000000000005f61086d565b807f76853f6287e5caf0c4284c123f04368dc4ada480832f72484e445adf762ee45783604051610bf691815260200190565b60405180910390a2610c3e565b807f5cba8bc9707d2af8fcbba504de8cd3ae98564aac502e8c1db7bf8853ff678ec283604051610c3591815260200190565b60405180910390a25b5063b47b2fb160e01b9450925050505b60015f559097909650945050505050565b5f805f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585604051602401610cb39291906001600160a01b03929092168252602082015260400190565b60408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b17905251610ce891906113dc565b5f604051808303815f865af19150503d805f8114610d21576040519150601f19603f3d011682016040523d82523d5f602084013e610d26565b606091505b5091509150818015610d815750805115610d535780806020019051810190610d4e91906113f2565b610d81565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b115b95945050505050565b6001600160a01b0381168114610d9e575f80fd5b50565b8035610dac81610d8a565b919050565b5f60a08284031215610dc1575f80fd5b50919050565b5f60808284031215610dc1575f80fd5b5f8083601f840112610de7575f80fd5b5081356001600160401b03811115610dfd575f80fd5b602083019150836020828501011115610e14575f80fd5b9250929050565b5f805f805f6101608688031215610e30575f80fd5b8535610e3b81610d8a565b9450610e4a8760208801610db1565b9350610e598760c08801610dc7565b92506101408601356001600160401b03811115610e74575f80fd5b610e8088828901610dd7565b969995985093965092949392505050565b5f60208284031215610ea1575f80fd5b5035919050565b5f60208284031215610eb8575f80fd5b813561ffff81168114610ec9575f80fd5b9392505050565b5f60608284031215610dc1575f80fd5b5f805f805f6101408688031215610ef5575f80fd5b8535610f0081610d8a565b9450610f0f8760208801610db1565b9350610f1e8760c08801610ed0565b92506101208601356001600160401b03811115610e74575f80fd5b5f805f805f805f6101a0888a031215610f50575f80fd5b8735610f5b81610d8a565b9650610f6a8960208a01610db1565b9550610f798960c08a01610dc7565b9450610140880135935061016088013592506101808801356001600160401b03811115610fa4575f80fd5b610fb08a828b01610dd7565b989b979a50959850939692959293505050565b8035600281900b8114610dac575f80fd5b5f805f806101008587031215610fe8575f80fd5b8435610ff381610d8a565b93506110028660208701610db1565b925060c085013561101281610d8a565b915061102060e08601610fc3565b905092959194509250565b6001600160a01b0391909116815260200190565b5f805f805f806101608789031215611055575f80fd5b863561106081610d8a565b955061106f8860208901610db1565b945061107e8860c08901610ed0565b935061012087013592506101408701356001600160401b038111156110a1575f80fd5b6110ad89828a01610dd7565b979a9699509497509295939492505050565b5f805f805f8061012087890312156110d5575f80fd5b86356110e081610d8a565b95506110ef8860208901610db1565b945060c0870135935060e087013592506101008701356001600160401b038111156110a1575f80fd5b8151151581526101c081016020830151611136602084018215159052565b50604083015161114a604084018215159052565b50606083015161115e606084018215159052565b506080830151611172608084018215159052565b5060a083015161118660a084018215159052565b5060c083015161119a60c084018215159052565b5060e08301516111ae60e084018215159052565b506101008301516111c461010084018215159052565b506101208301516111da61012084018215159052565b506101408301516111f061014084018215159052565b5061016083015161120661016084018215159052565b5061018083015161121c61018084018215159052565b506101a08301516112326101a084018215159052565b5092915050565b5f805f60e0848603121561124b575f80fd5b833561125681610d8a565b92506112658560208601610db1565b915060c084013561127581610d8a565b809150509250925092565b5f60208284031215611290575f80fd5b8135610ec981610d8a565b808202811582820484141761049257634e487b7160e01b5f52601160045260245ffd5b5f826112d857634e487b7160e01b5f52601260045260245ffd5b500490565b61ffff92831681529116602082015260400190565b5f60208284031215611302575f80fd5b5051919050565b8015158114610d9e575f80fd5b5f60208284031215611326575f80fd5b8135610ec981611309565b803562ffffff81168114610dac575f80fd5b5f60a0828403128015611354575f80fd5b5060405160a081016001600160401b038111828210171561138357634e487b7160e01b5f52604160045260245ffd5b60405261138f83610da1565b815261139d60208401610da1565b60208201526113ae60408401611331565b60408201526113bf60608401610fc3565b60608201526113d060808401610da1565b60808201529392505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215611402575f80fd5b8151610ec98161130956fea26469706673582212207c5d3c0125472d6d4a682d879b3fa761e7290775ca8090df88bda4d5259b689764736f6c634300081a0033","sourceMap":"12121:6302:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7255:234;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;2003:33:1;;;1985:52;;1973:2;1958:18;7255:234:0;;;;;;;;15649:125;;;;;;:::i;:::-;;:::i;:::-;;;2425:25:1;;;2413:2;2398:18;15649:125:0;2279:177:1;15327:237:0;;;;;;:::i;:::-;;:::i;:::-;;7810:233;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;;3992:33:1;;;3974:52;;4057:2;4042:18;;4035:34;;;;4117:8;4105:21;4085:18;;;4078:49;3962:2;3947:18;7810:233:0;3737:396:1;15885:258:0;;;:::i;7495:309::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;;5529:33:1;;;5511:52;;5594:2;5579:18;;5572:34;;;;5484:18;7495:309:0;5304:308:1;6558:152:0;;;;;;:::i;11056:171::-;;;:::i;10708:77::-;10772:6;;-1:-1:-1;;;;;10772:6:0;10708:77;;;;;;;:::i;8049:316::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;;7767:33:1;;;7749:52;;7848:2;7837:22;;;;7832:2;7817:18;;7810:50;7722:18;8049:316:0;7579:287:1;8371:195:0;;;;;;:::i;15110:148::-;15180:71;15110:148;;14294:692;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14403:576:0;;;;;;;;-1:-1:-1;14403:576:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14294:692;;;;;;;;:::i;12389:45::-;;12431:3;12389:45;;;;;11080:6:1;11068:19;;;11050:38;;11038:2;11023:18;12389:45:0;10906:188:1;12556:37:0;;;;;5833:47;;;;;6406:146;;;;;;:::i;10791:91::-;10862:13;;-1:-1:-1;;;;;10862:13:0;10791:91;;12817:24;;;;;-1:-1:-1;;;12817:24:0;;;;;;10888:162;;;;;;:::i;:::-;;:::i;12680:42::-;;;;;7255:234;7437:6;7462:20;;-1:-1:-1;;;7462:20:0;;;;;;;;;;;15649:125;15751:10;;15710:7;;12472:6;;15736:25;;-1:-1:-1;;;15751:10:0;;;;15736:12;:25;:::i;:::-;:31;;;;:::i;:::-;15729:38;15649:125;-1:-1:-1;;15649:125:0:o;15327:237::-;10631:6;;-1:-1:-1;;;;;10631:6:0;10617:10;:20;10613:71;;10673:10;10646:38;;-1:-1:-1;;;10646:38:0;;;;;;;;:::i;:::-;;;;;;;;10613:71;12431:3:::1;15401:28;::::0;::::1;;15397:80;;;15449:9;12431:3;15438:39;;-1:-1:-1::0;;;15438:39:0::1;;;;;;;;;:::i;15397:80::-;15492:33;15503:10;;;;;;;;;;;15515:9;15492:33;;;;;;;:::i;:::-;;;;;;;;15535:10;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;15535:22:0::1;-1:-1:-1::0;;;;15535:22:0;;::::1;::::0;;;::::1;::::0;;15327:237::o;7810:233::-;7956:6;7964:21;7987:6;8016:20;;-1:-1:-1;;;8016:20:0;;;;;;;;;;;15885:258;9655:1;9787:7;;:18;9783:61;;9814:30;;-1:-1:-1;;;9814:30:0;;;;;;;;;;;9783:61;9655:1;9854:7;:17;;;15951:28:::1;::::0;-1:-1:-1;;;15951:28:0;;-1:-1:-1;;;;;15951:3:0::1;:13;::::0;::::1;::::0;:28:::1;::::0;15973:4:::1;::::0;15951:28:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15934:45;;15993:6;16003:1;15993:11:::0;15989:40:::1;;16013:16;;-1:-1:-1::0;;;16013:16:0::1;;;;;;;;;;;15989:40;16039:37;16061:5;16069:6;16039:13;:37::i;:::-;16086:20;::::0;-1:-1:-1;;;16086:20:0;;::::1;::::0;::::1;2425:25:1::0;;;16086:5:0::1;-1:-1:-1::0;;;;;16086:12:0::1;::::0;::::1;::::0;2398:18:1;;16086:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16121:15;16129:6;16121:15;;;;2425:25:1::0;;2413:2;2398:18;;2279:177;16121:15:0::1;;;;;;;;-1:-1:-1::0;9613:1:0;9892:7;:21;15885:258::o;7495:309::-;7732:6;7740:18;7777:20;;-1:-1:-1;;;7777:20:0;;;;;;;;;;;11056:171;11120:13;;-1:-1:-1;;;;;11120:13:0;11106:10;:27;11102:78;;11169:10;11142:38;;-1:-1:-1;;;11142:38:0;;;;;;;;:::i;11102:78::-;11190:30;11209:10;11190:18;:30::i;:::-;11056:171::o;8049:316::-;8277:6;;6057:10;-1:-1:-1;;;;;6079:11:0;6057:34;;6053:63;;6100:16;;-1:-1:-1;;;6100:16:0;;;;;;;;;;;6053:63;8310:48:::1;8321:6;8329:3;8334:6;8342:5;8349:8;;8310:10;:48::i;:::-;8303:55;;;;8049:316:::0;;;;;;;;;:::o;10888:162::-;10631:6;;-1:-1:-1;;;;;10631:6:0;10617:10;:20;10613:71;;10673:10;10646:38;;-1:-1:-1;;;10646:38:0;;;;;;;;:::i;10613:71::-;10962:13:::1;:24:::0;;-1:-1:-1;;;;;;10962:24:0::1;-1:-1:-1::0;;;;;10962:24:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;11026:6:0;11001:42:::1;::::0;10962:24;;11026:6:::1;::::0;11001:42:::1;::::0;-1:-1:-1;;11001:42:0::1;10888:162:::0;:::o;17896:222::-;17974:27;17986:7;17995:5;17974:11;:27::i;:::-;17969:143;;18022:23;18034:7;18043:1;18022:11;:23::i;:::-;18021:24;:56;;;;18050:27;18062:7;18071:5;18050:11;:27::i;:::-;18049:28;18021:56;18017:84;;;18086:15;;-1:-1:-1;;;18086:15:0;;;;;;;;;;;18017:84;17896:222;;:::o;11233:198::-;11304:13;11297:20;;-1:-1:-1;;;;;;11297:20:0;;;;;;;11341:6;;-1:-1:-1;;;;;11357:17:0;;;;;;;;;;;11389:35;;11341:6;;;11357:17;11341:6;;11389:35;;11304:13;;11389:35;11287:144;11233:198;:::o;16149:1576::-;16368:6;16376;9655:1;9787:7;;:18;9783:61;;9814:30;;-1:-1:-1;;;9814:30:0;;;;;;;;;;;9783:61;9655:1;9854:7;:17;;;16506:22:::1;::::0;::::1;;:27;16502:78;;-1:-1:-1::0;;;;16543:33:0;-1:-1:-1;16578:1:0::1;16535:45;;16502:78;16591:21;16615:17;;::::0;::::1;:6:::0;:17:::1;:::i;:::-;:49;;16651:13;;::::0;::::1;:3:::0;:13:::1;:::i;:::-;16615:49;;;16635:13;::::0;;;::::1;::::0;::::1;;:::i;:::-;16591:73;;16719:3;-1:-1:-1::0;;;;;16678:45:0::1;16700:6;-1:-1:-1::0;;;;;16678:45:0::1;;16674:96;;-1:-1:-1::0;;;;16733:33:0;-1:-1:-1;16768:1:0::1;::::0;-1:-1:-1;16725:45:0::1;;16674:96;16781:19;16803:17;;::::0;::::1;:6:::0;:17:::1;:::i;:::-;:53;;16841:15;:5;1844:3:::0;1840:11;;1712:155;16841:15:::1;16803:53;;;16823:15;:5;2012:2:::0;2001:17;;1873:161;16823:15:::1;16781:75;;16886:1;16870:12;:17;;;16866:68;;-1:-1:-1::0;;;;16897:33:0;-1:-1:-1;16932:1:0::1;::::0;-1:-1:-1;16889:45:0::1;::::0;-1:-1:-1;16889:45:0::1;16866:68;16945:11;16959:40;16984:12;-1:-1:-1::0;;;;;16968:30:0::1;16959:8;:40::i;:::-;16945:54;;17013:3;17020:1;17013:8:::0;17009:59:::1;;-1:-1:-1::0;;;;17031:33:0;-1:-1:-1;17066:1:0::1;::::0;-1:-1:-1;17023:45:0::1;::::0;-1:-1:-1;;17023:45:0::1;17009:59;17176:44;::::0;-1:-1:-1;;;17176:44:0;;-1:-1:-1;;;;;14443:32:1;;;17176:44:0::1;::::0;::::1;14425:51:1::0;17209:4:0::1;14492:18:1::0;;;14485:60;14561:18;;;14554:34;;;17176:11:0::1;:16;::::0;::::1;::::0;14398:18:1;;17176:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17231:14;17248:10;:3;:8;;;;;;;;;;:::i;:::-;2290:4:::0;2275:20;;;2145:166;17248:10:::1;17231:27;;17268:34;17290:5;17298:3;17268:13;:34::i;:::-;17402:17;::::0;-1:-1:-1;;;17402:17:0;;::::1;::::0;::::1;2425:25:1::0;;;17402:5:0::1;-1:-1:-1::0;;;;;17402:12:0::1;::::0;::::1;::::0;2398:18:1;;17402:17:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;17398:178;;17494:32;17516:5;17524:1;17494:13;:32::i;:::-;17553:6;17545:20;17561:3;17545:20;;;;2425:25:1::0;;2413:2;2398:18;;2279:177;17545:20:0::1;;;;;;;;17398:178;;;17450:6;17439:23;17458:3;17439:23;;;;2425:25:1::0;;2413:2;2398:18;;2279:177;17439:23:0::1;;;;;;;;17398:178;-1:-1:-1::0;;;;17663:33:0;-1:-1:-1;17712:3:0;-1:-1:-1;;;9881:1:0::1;9613::::0;9892:7;:21;16149:1576;;;;-1:-1:-1;16149:1576:0;-1:-1:-1;;;;;16149:1576:0:o;18124:297::-;18194:4;18211:7;18220:16;18248:3;-1:-1:-1;;;;;18240:17:0;18300:7;18309:5;18258:58;;;;;;;;-1:-1:-1;;;;;15833:32:1;;;;15815:51;;15897:2;15882:18;;15875:34;15803:2;15788:18;;15641:274;18258:58:0;;;;-1:-1:-1;;18258:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;18258:58:0;-1:-1:-1;;;18258:58:0;;;18240:77;;;18258:58;18240:77;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18210:107;;;;18334:2;:80;;;;-1:-1:-1;18341:10:0;;:15;:72;;18401:3;18390:23;;;;;;;;;;;;:::i;:::-;18341:72;;;18386:1;18367:3;-1:-1:-1;;;;;18359:24:0;;:28;18341:72;18327:87;18124:297;-1:-1:-1;;;;;18124:297:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:134::-;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:162::-;355:5;400:3;391:6;386:3;382:16;378:26;375:46;;;417:1;414;407:12;375:46;-1:-1:-1;439:6:1;289:162;-1:-1:-1;289:162:1:o;456:176::-;536:5;581:3;572:6;567:3;563:16;559:26;556:46;;;598:1;595;588:12;637:347;688:8;698:6;752:3;745:4;737:6;733:17;729:27;719:55;;770:1;767;760:12;719:55;-1:-1:-1;793:20:1;;-1:-1:-1;;;;;825:30:1;;822:50;;;868:1;865;858:12;822:50;905:4;897:6;893:17;881:29;;957:3;950:4;941:6;933;929:19;925:30;922:39;919:59;;;974:1;971;964:12;919:59;637:347;;;;;:::o;989:847::-;1162:6;1170;1178;1186;1194;1247:3;1235:9;1226:7;1222:23;1218:33;1215:53;;;1264:1;1261;1254:12;1215:53;1303:9;1290:23;1322:31;1347:5;1322:31;:::i;:::-;1372:5;-1:-1:-1;1396:69:1;1457:7;1452:2;1437:18;;1396:69;:::i;:::-;1386:79;;1484:84;1560:7;1554:3;1543:9;1539:19;1484:84;:::i;:::-;1474:94;-1:-1:-1;1619:3:1;1604:19;;1591:33;-1:-1:-1;;;;;1636:30:1;;1633:50;;;1679:1;1676;1669:12;1633:50;1718:58;1768:7;1759:6;1748:9;1744:22;1718:58;:::i;:::-;989:847;;;;-1:-1:-1;989:847:1;;-1:-1:-1;1795:8:1;;1692:84;989:847;-1:-1:-1;;;989:847:1:o;2048:226::-;2107:6;2160:2;2148:9;2139:7;2135:23;2131:32;2128:52;;;2176:1;2173;2166:12;2128:52;-1:-1:-1;2221:23:1;;2048:226;-1:-1:-1;2048:226:1:o;2461:272::-;2519:6;2572:2;2560:9;2551:7;2547:23;2543:32;2540:52;;;2588:1;2585;2578:12;2540:52;2627:9;2614:23;2677:6;2670:5;2666:18;2659:5;2656:29;2646:57;;2699:1;2696;2689:12;2646:57;2722:5;2461:272;-1:-1:-1;;;2461:272:1:o;2738:164::-;2807:5;2852:2;2843:6;2838:3;2834:16;2830:25;2827:45;;;2868:1;2865;2858:12;2907:825;3069:6;3077;3085;3093;3101;3154:3;3142:9;3133:7;3129:23;3125:33;3122:53;;;3171:1;3168;3161:12;3122:53;3210:9;3197:23;3229:31;3254:5;3229:31;:::i;:::-;3279:5;-1:-1:-1;3303:69:1;3364:7;3359:2;3344:18;;3303:69;:::i;:::-;3293:79;;3391:73;3456:7;3450:3;3439:9;3435:19;3391:73;:::i;:::-;3381:83;-1:-1:-1;3515:3:1;3500:19;;3487:33;-1:-1:-1;;;;;3532:30:1;;3529:50;;;3575:1;3572;3565:12;4138:1161;4401:6;4409;4417;4425;4433;4441;4449;4502:3;4490:9;4481:7;4477:23;4473:33;4470:53;;;4519:1;4516;4509:12;4470:53;4558:9;4545:23;4577:31;4602:5;4577:31;:::i;:::-;4627:5;-1:-1:-1;4651:69:1;4712:7;4707:2;4692:18;;4651:69;:::i;:::-;4641:79;;4739:84;4815:7;4809:3;4798:9;4794:19;4739:84;:::i;:::-;4729:94;-1:-1:-1;4896:3:1;4881:19;;4868:33;;-1:-1:-1;5000:3:1;4985:19;;4972:33;;-1:-1:-1;5082:3:1;5067:19;;5054:33;-1:-1:-1;;;;;5099:30:1;;5096:50;;;5142:1;5139;5132:12;5096:50;5181:58;5231:7;5222:6;5211:9;5207:22;5181:58;:::i;:::-;4138:1161;;;;-1:-1:-1;4138:1161:1;;-1:-1:-1;4138:1161:1;;;;5155:84;;-1:-1:-1;;;4138:1161:1:o;5617:160::-;5683:20;;5743:1;5732:20;;;5722:31;;5712:59;;5767:1;5764;5757:12;5782:597;5897:6;5905;5913;5921;5974:3;5962:9;5953:7;5949:23;5945:33;5942:53;;;5991:1;5988;5981:12;5942:53;6030:9;6017:23;6049:31;6074:5;6049:31;:::i;:::-;6099:5;-1:-1:-1;6123:69:1;6184:7;6179:2;6164:18;;6123:69;:::i;:::-;6113:79;;6244:3;6233:9;6229:19;6216:33;6258;6283:7;6258:33;:::i;:::-;6310:7;-1:-1:-1;6336:37:1;6368:3;6353:19;;6336:37;:::i;:::-;6326:47;;5782:597;;;;;;;:::o;6384:203::-;-1:-1:-1;;;;;6548:32:1;;;;6530:51;;6518:2;6503:18;;6384:203::o;6592:982::-;6799:6;6807;6815;6823;6831;6839;6892:3;6880:9;6871:7;6867:23;6863:33;6860:53;;;6909:1;6906;6899:12;6860:53;6948:9;6935:23;6967:31;6992:5;6967:31;:::i;:::-;7017:5;-1:-1:-1;7041:69:1;7102:7;7097:2;7082:18;;7041:69;:::i;:::-;7031:79;;7129:73;7194:7;7188:3;7177:9;7173:19;7129:73;:::i;:::-;7119:83;-1:-1:-1;7275:3:1;7260:19;;7247:33;;-1:-1:-1;7357:3:1;7342:19;;7329:33;-1:-1:-1;;;;;7374:30:1;;7371:50;;;7417:1;7414;7407:12;7371:50;7456:58;7506:7;7497:6;7486:9;7482:22;7456:58;:::i;:::-;6592:982;;;;-1:-1:-1;6592:982:1;;-1:-1:-1;6592:982:1;;7533:8;;6592:982;-1:-1:-1;;;6592:982:1:o;7871:924::-;8008:6;8016;8024;8032;8040;8048;8101:3;8089:9;8080:7;8076:23;8072:33;8069:53;;;8118:1;8115;8108:12;8069:53;8157:9;8144:23;8176:31;8201:5;8176:31;:::i;:::-;8226:5;-1:-1:-1;8250:69:1;8311:7;8306:2;8291:18;;8250:69;:::i;:::-;8240:79;-1:-1:-1;8392:3:1;8377:19;;8364:33;;-1:-1:-1;8496:3:1;8481:19;;8468:33;;-1:-1:-1;8578:3:1;8563:19;;8550:33;-1:-1:-1;;;;;8595:30:1;;8592:50;;;8638:1;8635;8628:12;9104:1797;9323:13;;9078;9071:21;9059:34;;9294:3;9279:19;;9395:4;9387:6;9383:17;9377:24;9410:51;9455:4;9444:9;9440:20;9426:12;9078:13;9071:21;9059:34;;9008:91;9410:51;;9510:4;9502:6;9498:17;9492:24;9525:53;9572:4;9561:9;9557:20;9541:14;9078:13;9071:21;9059:34;;9008:91;9525:53;;9627:4;9619:6;9615:17;9609:24;9642:53;9689:4;9678:9;9674:20;9658:14;9078:13;9071:21;9059:34;;9008:91;9642:53;;9744:4;9736:6;9732:17;9726:24;9759:53;9806:4;9795:9;9791:20;9775:14;9078:13;9071:21;9059:34;;9008:91;9759:53;;9861:4;9853:6;9849:17;9843:24;9876:53;9923:4;9912:9;9908:20;9892:14;9078:13;9071:21;9059:34;;9008:91;9876:53;;9978:4;9970:6;9966:17;9960:24;9993:53;10040:4;10029:9;10025:20;10009:14;9078:13;9071:21;9059:34;;9008:91;9993:53;;10095:4;10087:6;10083:17;10077:24;10110:53;10157:4;10146:9;10142:20;10126:14;9078:13;9071:21;9059:34;;9008:91;10110:53;;10212:6;10204;10200:19;10194:26;10229:55;10276:6;10265:9;10261:22;10245:14;9078:13;9071:21;9059:34;;9008:91;10229:55;;10333:6;10325;10321:19;10315:26;10350:55;10397:6;10386:9;10382:22;10366:14;9078:13;9071:21;9059:34;;9008:91;10350:55;;10454:6;10446;10442:19;10436:26;10471:55;10518:6;10507:9;10503:22;10487:14;9078:13;9071:21;9059:34;;9008:91;10471:55;;10576:6;10568;10564:19;10558:26;10593:56;10641:6;10630:9;10626:22;10609:15;9078:13;9071:21;9059:34;;9008:91;10593:56;;10699:6;10691;10687:19;10681:26;10716:56;10764:6;10753:9;10749:22;10732:15;9078:13;9071:21;9059:34;;9008:91;10716:56;;10822:6;10814;10810:19;10804:26;10839:56;10887:6;10876:9;10872:22;10855:15;9078:13;9071:21;9059:34;;9008:91;10839:56;;9104:1797;;;;:::o;11564:526::-;11672:6;11680;11688;11741:3;11729:9;11720:7;11716:23;11712:33;11709:53;;;11758:1;11755;11748:12;11709:53;11797:9;11784:23;11816:31;11841:5;11816:31;:::i;:::-;11866:5;-1:-1:-1;11890:69:1;11951:7;11946:2;11931:18;;11890:69;:::i;:::-;11880:79;;12011:3;12000:9;11996:19;11983:33;12025;12050:7;12025:33;:::i;:::-;12077:7;12067:17;;;11564:526;;;;;:::o;12095:247::-;12154:6;12207:2;12195:9;12186:7;12182:23;12178:32;12175:52;;;12223:1;12220;12213:12;12175:52;12262:9;12249:23;12281:31;12306:5;12281:31;:::i;12582:265::-;12655:9;;;12686;;12703:15;;;12697:22;;12683:37;12673:168;;12763:10;12758:3;12754:20;12751:1;12744:31;12798:4;12795:1;12788:15;12826:4;12823:1;12816:15;12852:217;12892:1;12918;12908:132;;12962:10;12957:3;12953:20;12950:1;12943:31;12997:4;12994:1;12987:15;13025:4;13022:1;13015:15;12908:132;-1:-1:-1;13054:9:1;;12852:217::o;13074:270::-;13274:6;13262:19;;;13244:38;;13318:19;;13313:2;13298:18;;13291:47;13232:2;13217:18;;13074:270::o;13349:184::-;13419:6;13472:2;13460:9;13451:7;13447:23;13443:32;13440:52;;;13488:1;13485;13478:12;13440:52;-1:-1:-1;13511:16:1;;13349:184;-1:-1:-1;13349:184:1:o;13538:118::-;13624:5;13617:13;13610:21;13603:5;13600:32;13590:60;;13646:1;13643;13636:12;13661:241;13717:6;13770:2;13758:9;13749:7;13745:23;13741:32;13738:52;;;13786:1;13783;13776:12;13738:52;13825:9;13812:23;13844:28;13866:5;13844:28;:::i;14599:161::-;14666:20;;14726:8;14715:20;;14705:31;;14695:59;;14750:1;14747;14740:12;14765:871;14853:6;14913:3;14901:9;14892:7;14888:23;14884:33;14929:2;14926:22;;;14944:1;14941;14934:12;14926:22;-1:-1:-1;14993:2:1;14987:9;15035:3;15023:16;;-1:-1:-1;;;;;15054:34:1;;15090:22;;;15051:62;15048:185;;;15155:10;15150:3;15146:20;15143:1;15136:31;15190:4;15187:1;15180:15;15218:4;15215:1;15208:15;15048:185;15249:2;15242:22;15288:29;15307:9;15288:29;:::i;:::-;15280:6;15273:45;15351:38;15385:2;15374:9;15370:18;15351:38;:::i;:::-;15346:2;15338:6;15334:15;15327:63;15423:37;15456:2;15445:9;15441:18;15423:37;:::i;:::-;15418:2;15410:6;15406:15;15399:62;15494:36;15526:2;15515:9;15511:18;15494:36;:::i;:::-;15489:2;15481:6;15477:15;15470:61;15565:39;15599:3;15588:9;15584:19;15565:39;:::i;:::-;15559:3;15547:16;;15540:65;15551:6;14765:871;-1:-1:-1;;;14765:871:1:o;15920:301::-;16049:3;16087:6;16081:13;16133:6;16126:4;16118:6;16114:17;16109:3;16103:37;16195:1;16159:16;;16184:13;;;-1:-1:-1;16159:16:1;15920:301;-1:-1:-1;15920:301:1:o;16226:245::-;16293:6;16346:2;16334:9;16325:7;16321:23;16317:32;16314:52;;;16362:1;16359;16352:12;16314:52;16394:9;16388:16;16413:28;16435:5;16413:28;:::i","linkReferences":{},"immutableReferences":{"340":[{"start":960,"length":32},{"start":1940,"length":32},{"start":2695,"length":32}],"863":[{"start":921,"length":32},{"start":1471,"length":32},{"start":2451,"length":32},{"start":3172,"length":32},{"start":3414,"length":32}],"867":[{"start":1070,"length":32},{"start":1626,"length":32},{"start":1685,"length":32},{"start":2817,"length":32},{"start":2876,"length":32},{"start":2975,"length":32}]}}}}}}},"signatures":{"function":[{"signature":"acceptOwnership()","signatureHash4":"0x79ba5097","signatureHash32":"0x79ba5097e5519a381a52113cdcc59540d13f73fd9d26abc0453484a096cc96f2"},{"signature":"afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)","signatureHash4":"0x9f063efc","signatureHash32":"0x9f063efc0e7905d302491c9da772361c0faa77174cc43ec9e94aa9141b6a6b67"},{"signature":"afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)","signatureHash4":"0xe1b4af69","signatureHash32":"0xe1b4af69b30a88bed49d94820f012d5d3a111a00764242f510270492aeb7fb1e"},{"signature":"afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)","signatureHash4":"0x6fe7e6eb","signatureHash32":"0x6fe7e6ebae9b6648ee9582d3769da9a44fdb4ec83c36a0ffb490e9461143ec16"},{"signature":"afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)","signatureHash4":"0x6c2bbe7e","signatureHash32":"0x6c2bbe7e4f0f51f6ee10b6409b7088135645d7ae479b8f0be3d7250f85988483"},{"signature":"afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)","signatureHash4":"0xb47b2fb1","signatureHash32":"0xb47b2fb18a5a173c64a43e7f7fe55e43e298f5436a0e265b15e662727cb0695f"},{"signature":"beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)","signatureHash4":"0x259982e5","signatureHash32":"0x259982e524ca348fcfeda0fb247c362c89fadb178685b3f748fe9b5beeeff045"},{"signature":"beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)","signatureHash4":"0xb6a8b0fa","signatureHash32":"0xb6a8b0faa8fd517d727f03c7c72b0a7828d05348cbc4253b7cbd9609aad5559c"},{"signature":"beforeInitialize(address,(address,address,uint24,int24,address),uint160)","signatureHash4":"0xdc98354e","signatureHash32":"0xdc98354e711e2be5d28eff54c09e2e61c5b15fb066d17daaa5b71151b4ae5c5a"},{"signature":"beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)","signatureHash4":"0x21d0ee70","signatureHash32":"0x21d0ee70669b208d8af4dc382eaa03dea2d745370926da496c872bb9c9b98692"},{"signature":"beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)","signatureHash4":"0x575e24b4","signatureHash32":"0x575e24b486f1b1168e84028b6b7338846844275788c5ca5249def3be2dfc2c03"},{"signature":"flush()","signatureHash4":"0x6b9f96ea","signatureHash32":"0x6b9f96ea4e0e22bcc99bf02c2dbe35bb5cd412f720d41607144febae3b225f6c"},{"signature":"getHookPermissions()","signatureHash4":"0xc4e833ce","signatureHash32":"0xc4e833ce370f836b5a97086f8fc61e3c79efec9e6b02dbfe7965a512e92af68d"},{"signature":"hookFeeBps()","signatureHash4":"0xea26abcf","signatureHash32":"0xea26abcfdca5e49033ec7eb8c976eaf7371445d51d62b72f1e0b881ac067ff9f"},{"signature":"hookFlags()","signatureHash4":"0xc4084938","signatureHash32":"0xc40849380f91abae9ebe538e4b8f2ba8beb7c9af603da6818b6c843d65f94315"},{"signature":"MAX_HOOK_FEE_BPS()","signatureHash4":"0xc6878f4e","signatureHash32":"0xc6878f4e7334404937d62fc6a41c507dc2b253ed15e5e3d51f57aa234d365fd5"},{"signature":"owner()","signatureHash4":"0x8da5cb5b","signatureHash32":"0x8da5cb5b36e7f68c1d2e56001220cdbdd3ba2616072f718acfda4a06441a807d"},{"signature":"pendingOwner()","signatureHash4":"0xe30c3978","signatureHash32":"0xe30c3978ddd82956a01b5cb08d17f1a2d73e636aeefb7b36f896e41d4c2aab90"},{"signature":"poolManager()","signatureHash4":"0xdc4c90d3","signatureHash32":"0xdc4c90d3c2342c5afe26871a21a4ecf482fcb45ae1ac8294d1dcff7a134352c0"},{"signature":"quoteFee(uint256)","signatureHash4":"0x2205f568","signatureHash32":"0x2205f5688d774aabb6b485389b9211806f15e7a5afe751e308fd10977d7bd21b"},{"signature":"setHookFeeBps(uint16)","signatureHash4":"0x2c43afc5","signatureHash32":"0x2c43afc57ec6a26aaf3b3c52c2746583362224611b67723054e4693d52b3b212"},{"signature":"sqk()","signatureHash4":"0xc98a295b","signatureHash32":"0xc98a295b079f59c3de48974261b4eeca1437a2c7ae60e120e52f235190f4063c"},{"signature":"transferOwnership(address)","signatureHash4":"0xf2fde38b","signatureHash32":"0xf2fde38b092330466c661fc723d5289b90272a3e580e3187d1d7ef788506c557"},{"signature":"vault()","signatureHash4":"0xfbfa77cf","signatureHash32":"0xfbfa77cfa16f85c900b53d1065f840fd1fc574b2cd12cde1a86984206875ef23"}],"event":[{"signature":"FeeDonated(bytes32,uint256)","signatureHash4":"0x5cba8bc9","signatureHash32":"0x5cba8bc9707d2af8fcbba504de8cd3ae98564aac502e8c1db7bf8853ff678ec2"},{"signature":"FeeHeld(bytes32,uint256)","signatureHash4":"0x76853f62","signatureHash32":"0x76853f6287e5caf0c4284c123f04368dc4ada480832f72484e445adf762ee457"},{"signature":"Flushed(uint256)","signatureHash4":"0xed1eeda1","signatureHash32":"0xed1eeda1fde9cc22a2ecf41efc0d6cf519c1d95184b36b93b4cd4877881488ee"},{"signature":"HookFeeSet(uint16,uint16)","signatureHash4":"0x9627a8f4","signatureHash32":"0x9627a8f42781457b9ca33c4fc1cd9210ddb65aad8f71f1e28922af19a2bf4b64"},{"signature":"OwnershipTransferred(address,address)","signatureHash4":"0x8be0079c","signatureHash32":"0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0"},{"signature":"OwnershipTransferStarted(address,address)","signatureHash4":"0x38d16b8c","signatureHash32":"0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700"}],"error":[{"signature":"ApproveFailed()","signatureHash4":"0x3e3f8f73","signatureHash32":"0x3e3f8f73c1e139679f5cea66917fc7c537b9c1223dfca02e8c1e64743ed83456"},{"signature":"FeeTooHigh(uint16,uint16)","signatureHash4":"0x3c057d7b","signatureHash32":"0x3c057d7beb4fe9a19a13a1a22a6f33cb2fec09d9a38cbb3be52bda9374abe790"},{"signature":"HookAddressNotValid(address)","signatureHash4":"0xe65af6a0","signatureHash32":"0xe65af6a005910e734d42f50643ba6787875c5f9f3758dba04b3e832b60ef7011"},{"signature":"HookNotImplemented()","signatureHash4":"0x0a85dc29","signatureHash32":"0x0a85dc29bcc4d20e8373328a2a3f1b6cb998fd2fbddf45b4db05514aef5c184d"},{"signature":"NothingToFlush()","signatureHash4":"0xeb694a3c","signatureHash32":"0xeb694a3c6c37bd9e9a4fd080c62f426f7fbd368f26ed6f5f8175fa826bebec27"},{"signature":"NotPoolManager()","signatureHash4":"0xae18210a","signatureHash32":"0xae18210ab62e9620e84799499bafdb3202a30943ba8cb533c4bac9cdc8ced60b"},{"signature":"OwnableInvalidOwner(address)","signatureHash4":"0x1e4fbdf7","signatureHash32":"0x1e4fbdf7f3ef8bcaa855599e3abf48b232380f183f08f6f813d9ffa5bd585188"},{"signature":"OwnableUnauthorizedAccount(address)","signatureHash4":"0x118cdaa7","signatureHash32":"0x118cdaa7a341953d1887a2245fd6665d741c67c8c50581daa59e1d03373fa188"},{"signature":"ReentrancyGuardReentrantCall()","signatureHash4":"0x3ee5aeb5","signatureHash32":"0x3ee5aeb571de7fc460830b4d0017439a1ca56fb0bc39062227ade4fe4a24c1ca"},{"signature":"ZeroAddress()","signatureHash4":"0xd92e233d","signatureHash32":"0xd92e233df2717d4a40030e20904abd27b68fcbeede117eaaccbbdac9618c8c73"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"11155111","address":"0x9e0827db5831c49F9390707b467aA12A76E74044"}