{"matchId":"14250460","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-01-20T19:39:34Z","creationBytecode":{"onchainBytecode":"0x60e060405234801562000010575f80fd5b5060405162002efe38038062002efe833981016040819052620000339162000188565b6001600160a01b03868116608052600680546001600160a01b03199081168884161790915585821660a0525f805482168684161790556002805490911691841691909117905560405130908490839087906200008f906200015e565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103905ff080158015620000d1573d5f803e3d5ffd5b506001600160a01b0390811660c081905260a05160405163095ea7b360e01b815260048101929092525f1960248301529091169063095ea7b3906044016020604051808303815f875af11580156200012b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000151919062000205565b505050505050506200022d565b610e4280620020bc83390190565b80516001600160a01b038116811462000183575f80fd5b919050565b5f805f805f8060c087890312156200019e575f80fd5b620001a9876200016c565b9550620001b9602088016200016c565b9450620001c9604088016200016c565b9350620001d9606088016200016c565b9250620001e9608088016200016c565b9150620001f960a088016200016c565b90509295509295509295565b5f6020828403121562000216575f80fd5b8151801515811462000226575f80fd5b9392505050565b60805160a05160c051611e33620002895f395f61026101525f81816102d00152818161085001526110bd01525f818161034301528181610efd01528181610f67015281816114610152818161183b015261196c0152611e335ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806392c592d0116100fe578063e1a452181161009e578063f5d121e61161006e578063f5d121e6146103af578063f77c4791146103c2578063fbfa77cf146103d5578063fc22d0e5146103e8575f80fd5b8063e1a4521814610378578063e4849b3214610381578063efdf0bb014610394578063f0c9e465146103a7575f80fd5b8063c71a7eff116100d9578063c71a7eff14610318578063cce7ec131461032b578063d8dfeb451461033e578063d96a094a14610365575f80fd5b806392c592d0146102cb57806392eefe9b146102f2578063a0422edf14610305575f80fd5b806353d06f941161016957806370c105781161014457806370c105781461029e57806377d2300e146102a657806379db6346146102af5780639058c8a4146102b8575f80fd5b806353d06f941461025c578063679dffb4146102835780636c197ff51461028b575f80fd5b806323cbe1f3116101a457806323cbe1f314610225578063242693d31461022e578063252408101461023657806334119d1514610249575f80fd5b806301681a62146101ca578063047fc9aa146101df57806312d43a51146101fb575b5f80fd5b6101dd6101d8366004611c76565b6103fb565b005b6101e860055481565b6040519081526020015b60405180910390f35b5f5461020d906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b6101e860045481565b6101e86104f7565b60015461020d906001600160a01b031681565b6101dd610257366004611c91565b6105e4565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101e86106d0565b6101dd610299366004611ca8565b6106fe565b6101dd610982565b6101e860035481565b6101e860075481565b6101dd6102c6366004611c91565b610a5f565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610300366004611c76565b610b4b565b6101e8610313366004611c91565b610c6d565b6101e8610326366004611c91565b610c9d565b6101dd610339366004611ca8565b610cb0565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610373366004611c91565b611125565b6101e861271081565b6101dd61038f366004611c91565b61112f565b6101dd6103a2366004611c76565b611139565b6101dd6111f3565b6101dd6103bd366004611c91565b6112c7565b60025461020d906001600160a01b031681565b60065461020d906001600160a01b031681565b6101dd6103f6366004611cd2565b6113b0565b5f546001600160a01b031633146104595760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f760000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526104f4916001600160a01b0390811691908416906370a0823190602401602060405180830381865afa1580156104bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190611d04565b6001600160a01b0384169190611b25565b50565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f916001600160a01b031690634cdad5069082906370a0823190602401602060405180830381865afa15801561055e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105829190611d04565b6040518263ffffffff1660e01b81526004016105a091815260200190565b602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190611d04565b905090565b5f546001600160a01b0316331461063d5760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b61271081111561068f5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60045460408051918252602082018390527f5bafec153d96f8ef37761b64348732b41a6b477401d244a5070f9f82d689adce910160405180910390a1600455565b5f806106da6104f7565b905060055481116106eb575f6106f8565b6005546106f89082611d48565b91505090565b5f811161074d5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b6002546040517fb29431fb0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038481166024830152604482018490529091169063b29431fb906064016020604051808303815f875af11580156107bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e09190611d61565b61082c5760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b8060055f82825461083d9190611d48565b9091555061087890506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611b9e565b6004548190156108ae575f612710600454846108949190611d80565b61089e9190611d97565b90506108aa8183611d48565b9150505b6006546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0385811660248301523060448301529091169063b460af94906064016020604051808303815f875af115801561091d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109419190611d04565b50604080518381526020810183905233917fed7a144fad14804d5c249145e3e0e2b63a9eb455b76aee5bc92d711e9bba3e4a910160405180910390a2505050565b5f61098b6106d0565b90508015610a29576006545f546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03918216602482015230604482015291169063b460af94906064016020604051808303815f875af1158015610a03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a279190611d04565b505b6040518181527f949da057e0c10ac8c590fc56cf17f0a7f8a424d6f373268e7fc205c8dcbc7bb49060200160405180910390a150565b5f546001600160a01b03163314610ab85760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b612710811115610b0a5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60035460408051918252602082018390527f28e297c7c282931a994191b735b01eaf17558295f761512a7047f4e1b8dc3b0b910160405180910390a1600355565b5f546001600160a01b03163314610ba45760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b038116610bfa5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b6002546040516001600160a01b038084169216907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f7905f90a3600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8061271060035484610c809190611d80565b610c8a9190611d97565b9050610c968184611d48565b9392505050565b5f8061271060045484610c809190611d80565b5f8111610cff5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b60075460065f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d769190611d04565b1015610dc45760405162461bcd60e51b815260206004820152601860248201527f4d696e20746f74616c20737570706c79206e6f74206d657400000000000000006044820152606401610450565b6002546040517f1f437f9d0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0384811660248301526044820184905290911690631f437f9d906064016020604051808303815f875af1158015610e33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e579190611d61565b610ea35760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b600354819015610ed9575f61271060035484610ebf9190611d80565b610ec99190611d97565b9050610ed58183611d48565b9150505b8060055f828254610eea9190611dcf565b90915550610f2590506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611b9e565b6006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018490523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af115801561103b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105f9190611d04565b90505f81116110b05760405162461bcd60e51b815260206004820152600e60248201527f4465706f736974206661696c65640000000000000000000000000000000000006044820152606401610450565b6110e46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168584611b25565b604080518381526020810185905233917f1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed910160405180910390a250505050565b6104f43382610cb0565b6104f433826106fe565b5f546001600160a01b031633146111925760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49905f90a250565b6001546001600160a01b0316331461124d5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742070656e64696e6720676f7600000000000000000000000000000000006044820152606401610450565b6001545f80546040516001600160a01b0393841693909116917f3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac291a3600180545f80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b5f546001600160a01b031633146113205760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b5f811161136f5760405162461bcd60e51b815260206004820152601c60248201527f4d696e20746f74616c20737570706c79206d757374206265203e2030000000006044820152606401610450565b60075460408051918252602082018390527fe9b2d6ed3a1e53a2cbc74ea1516580639c8c1a43411ca794eaa9e101c3c3dea4910160405180910390a1600755565b5f546001600160a01b031633146114095760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b03831661145f5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e99190611de2565b6001600160a01b03161461153f5760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c74206d7573742061636365707420636f6c6c61746572616c6044820152606401610450565b611547610982565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ca9190611d04565b156116e0576006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039091169063ba0876529082906370a0823190602401602060405180830381865afa158015611636573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165a9190611d04565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af11580156116ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116de9190611d04565b505b600680547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03868116918217909355600754604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051949093169390926318160ddd9160048083019260209291908290030181865afa158015611773573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117979190611d04565b101561180b5760405162461bcd60e51b815260206004820152602860248201527f4e6577207661756c7420646f6573206e6f74206d656574206d696e20746f746160448201527f6c20737570706c790000000000000000000000000000000000000000000000006064820152608401610450565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611888573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ac9190611d04565b9050838110156119245760405162461bcd60e51b815260206004820152602d60248201527f496e73756666696369656e7420636f6c6c61746572616c2062616c616e63652060448201527f666f72206d6967726174696f6e000000000000000000000000000000000000006064820152608401610450565b8015611ade576006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156119b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d89190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018390523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015611a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a649190611d04565b905083811015611adc5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e74207368617265732072656365697665642066726f60448201527f6d206e6577207661756c740000000000000000000000000000000000000000006064820152608401610450565b505b846001600160a01b0316826001600160a01b03167faa10add0ff0f23b874d2d1fa353ab28a639aa51906dec303238cdb1f1e54ea4260405160405180910390a35050505050565b6040516001600160a01b03838116602483015260448201839052611b9991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bdd565b505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611bd79186918216906323b872dd90608401611b52565b50505050565b5f8060205f8451602086015f885af180611bfc576040513d5f823e3d81fd5b50505f513d91508115611c13578060011415611c20565b6001600160a01b0384163b155b15611bd7576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610450565b6001600160a01b03811681146104f4575f80fd5b5f60208284031215611c86575f80fd5b8135610c9681611c62565b5f60208284031215611ca1575f80fd5b5035919050565b5f8060408385031215611cb9575f80fd5b8235611cc481611c62565b946020939093013593505050565b5f805f60608486031215611ce4575f80fd5b8335611cef81611c62565b95602085013595506040909401359392505050565b5f60208284031215611d14575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115611d5b57611d5b611d1b565b92915050565b5f60208284031215611d71575f80fd5b81518015158114610c96575f80fd5b8082028115828204841417611d5b57611d5b611d1b565b5f82611dca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611d5b57611d5b611d1b565b5f60208284031215611df2575f80fd5b8151610c9681611c6256fea2646970667358221220fb094be55e618a2b326be9cb9c850683abaf8c7ae48d41e110708f81340d4efe64736f6c6343000814003360c060405234801561000f575f80fd5b50604051610e42380380610e4283398101604081905261002e91610087565b6001600160a01b039384166080525f80549385166001600160a01b03199485161790556002805492851692909316919091179091551660a0526100d8565b80516001600160a01b0381168114610082575f80fd5b919050565b5f805f806080858703121561009a575f80fd5b6100a38561006c565b93506100b16020860161006c565b92506100bf6040860161006c565b91506100cd6060860161006c565b905092959194509250565b60805160a051610d2661011c5f395f81816101bb0152818161043a015281816107f7015261089101525f818161010a0152818161040b01526107c20152610d265ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806392c592d011610088578063ee1ef57511610063578063ee1ef57514610203578063efdf0bb014610216578063f0c9e46514610229578063fdf893f514610231575f80fd5b806392c592d0146101b6578063b6a3f59a146101dd578063e1a611b7146101f0575f80fd5b806325240810116100c357806325240810146101705780632720b22e1461019057806369652fcf146101a55780638f770ad0146101ad575f80fd5b8063047fc9aa146100e957806304bda2621461010557806312d43a5114610151575b5f80fd5b6100f260035481565b6040519081526020015b60405180910390f35b61012c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fc565b5f5461012c9073ffffffffffffffffffffffffffffffffffffffff1681565b60015461012c9073ffffffffffffffffffffffffffffffffffffffff1681565b6101a361019e366004610c27565b610251565b005b6101a36104cd565b6100f260045481565b61012c7f000000000000000000000000000000000000000000000000000000000000000081565b6101a36101eb366004610c27565b6105c0565b6101a36101fe366004610c27565b610685565b6101a3610211366004610c3e565b61092e565b6101a3610224366004610c3e565b610a24565b6101a3610b12565b60025461012c9073ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206368616972000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f8111610340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f416d6f756e74206d757374206265203e2030000000000000000000000000000060448201526064016102ce565b6004546003546103509083610ca5565b11156103b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f537570706c79206361702065786365656465640000000000000000000000000060448201526064016102ce565b8060035f8282546103c99190610ca5565b90915550506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015f604051808303815f87803b15801561047b575f80fd5b505af115801561048d573d5f803e3d5ffd5b505050507fdcc16fd18a808d877bcd9a09b544844b36ae8f0a4b222e317d7b777b2c18b032816040516104c291815260200190565b60405180910390a150565b60025473ffffffffffffffffffffffffffffffffffffffff16331461054e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206368616972000000000000000000000000000000000000000000000060448201526064016102ce565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690915560405173ffffffffffffffffffffffffffffffffffffffff909116905f9082907f0a47357b37b43edfce3b49e26d073c29be56d40a540f4766153a6169d031e86e908390a350565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064016102ce565b600480549082905560408051828152602081018490527fb4d96b3a6638191d0f6aefa0fdc4d99af3592f4c97480e31feeb977723c63b53910160405180910390a15050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206368616972000000000000000000000000000000000000000000000060448201526064016102ce565b5f811161076f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f416d6f756e74206d757374206265203e2030000000000000000000000000000060448201526064016102ce565b8060035f8282546107809190610cbe565b90915550506040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303815f875af115801561083d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108619190610cd1565b506040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c68906024015f604051808303815f87803b1580156108e7575f80fd5b505af11580156108f9573d5f803e3d5ffd5b505050507f32d275175c36fa468b3e61c6763f9488ff3c9be127e35e011cf4e04d602224ba816040516104c291815260200190565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146109ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064016102ce565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f0a47357b37b43edfce3b49e26d073c29be56d40a540f4766153a6169d031e86e905f90a35050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064016102ce565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49905f90a250565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f742070656e64696e6720676f76000000000000000000000000000000000060448201526064016102ce565b6001545f805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917f3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac291a3600180545f80547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b5f60208284031215610c37575f80fd5b5035919050565b5f60208284031215610c4e575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610c71575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610cb857610cb8610c78565b92915050565b81810381811115610cb857610cb8610c78565b5f60208284031215610ce1575f80fd5b81518015158114610c71575f80fdfea264697066735822122036b7c9aa871b3c4aeaafcd7a910dc3a6d174e44d38a46c9060d0681b6bac34a064736f6c63430008140033000000000000000000000000dc035d45d973e3ec169d2276ddab16f1e407384f000000000000000000000000a3931d71877c0e7a3148cb7eb4463524fec27fbd000000000000000000000000865377367054516e17014ccded1e7d814edc9ce4000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b000000000000000000000000e3475728673eabaec90a37aa3ae2ced9f0db5ff20000000000000000000000008f97cca30dbe80e7a8b462f1dd1a51c32accdfc8","recompiledBytecode":"0x60e060405234801562000010575f80fd5b5060405162002efe38038062002efe833981016040819052620000339162000188565b6001600160a01b03868116608052600680546001600160a01b03199081168884161790915585821660a0525f805482168684161790556002805490911691841691909117905560405130908490839087906200008f906200015e565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103905ff080158015620000d1573d5f803e3d5ffd5b506001600160a01b0390811660c081905260a05160405163095ea7b360e01b815260048101929092525f1960248301529091169063095ea7b3906044016020604051808303815f875af11580156200012b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000151919062000205565b505050505050506200022d565b610e4280620020bc83390190565b80516001600160a01b038116811462000183575f80fd5b919050565b5f805f805f8060c087890312156200019e575f80fd5b620001a9876200016c565b9550620001b9602088016200016c565b9450620001c9604088016200016c565b9350620001d9606088016200016c565b9250620001e9608088016200016c565b9150620001f960a088016200016c565b90509295509295509295565b5f6020828403121562000216575f80fd5b8151801515811462000226575f80fd5b9392505050565b60805160a05160c051611e33620002895f395f61026101525f81816102d00152818161085001526110bd01525f818161034301528181610efd01528181610f67015281816114610152818161183b015261196c0152611e335ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806392c592d0116100fe578063e1a452181161009e578063f5d121e61161006e578063f5d121e6146103af578063f77c4791146103c2578063fbfa77cf146103d5578063fc22d0e5146103e8575f80fd5b8063e1a4521814610378578063e4849b3214610381578063efdf0bb014610394578063f0c9e465146103a7575f80fd5b8063c71a7eff116100d9578063c71a7eff14610318578063cce7ec131461032b578063d8dfeb451461033e578063d96a094a14610365575f80fd5b806392c592d0146102cb57806392eefe9b146102f2578063a0422edf14610305575f80fd5b806353d06f941161016957806370c105781161014457806370c105781461029e57806377d2300e146102a657806379db6346146102af5780639058c8a4146102b8575f80fd5b806353d06f941461025c578063679dffb4146102835780636c197ff51461028b575f80fd5b806323cbe1f3116101a457806323cbe1f314610225578063242693d31461022e578063252408101461023657806334119d1514610249575f80fd5b806301681a62146101ca578063047fc9aa146101df57806312d43a51146101fb575b5f80fd5b6101dd6101d8366004611c76565b6103fb565b005b6101e860055481565b6040519081526020015b60405180910390f35b5f5461020d906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b6101e860045481565b6101e86104f7565b60015461020d906001600160a01b031681565b6101dd610257366004611c91565b6105e4565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101e86106d0565b6101dd610299366004611ca8565b6106fe565b6101dd610982565b6101e860035481565b6101e860075481565b6101dd6102c6366004611c91565b610a5f565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610300366004611c76565b610b4b565b6101e8610313366004611c91565b610c6d565b6101e8610326366004611c91565b610c9d565b6101dd610339366004611ca8565b610cb0565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610373366004611c91565b611125565b6101e861271081565b6101dd61038f366004611c91565b61112f565b6101dd6103a2366004611c76565b611139565b6101dd6111f3565b6101dd6103bd366004611c91565b6112c7565b60025461020d906001600160a01b031681565b60065461020d906001600160a01b031681565b6101dd6103f6366004611cd2565b6113b0565b5f546001600160a01b031633146104595760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f760000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526104f4916001600160a01b0390811691908416906370a0823190602401602060405180830381865afa1580156104bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190611d04565b6001600160a01b0384169190611b25565b50565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f916001600160a01b031690634cdad5069082906370a0823190602401602060405180830381865afa15801561055e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105829190611d04565b6040518263ffffffff1660e01b81526004016105a091815260200190565b602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190611d04565b905090565b5f546001600160a01b0316331461063d5760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b61271081111561068f5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60045460408051918252602082018390527f5bafec153d96f8ef37761b64348732b41a6b477401d244a5070f9f82d689adce910160405180910390a1600455565b5f806106da6104f7565b905060055481116106eb575f6106f8565b6005546106f89082611d48565b91505090565b5f811161074d5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b6002546040517fb29431fb0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038481166024830152604482018490529091169063b29431fb906064016020604051808303815f875af11580156107bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e09190611d61565b61082c5760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b8060055f82825461083d9190611d48565b9091555061087890506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611b9e565b6004548190156108ae575f612710600454846108949190611d80565b61089e9190611d97565b90506108aa8183611d48565b9150505b6006546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0385811660248301523060448301529091169063b460af94906064016020604051808303815f875af115801561091d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109419190611d04565b50604080518381526020810183905233917fed7a144fad14804d5c249145e3e0e2b63a9eb455b76aee5bc92d711e9bba3e4a910160405180910390a2505050565b5f61098b6106d0565b90508015610a29576006545f546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03918216602482015230604482015291169063b460af94906064016020604051808303815f875af1158015610a03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a279190611d04565b505b6040518181527f949da057e0c10ac8c590fc56cf17f0a7f8a424d6f373268e7fc205c8dcbc7bb49060200160405180910390a150565b5f546001600160a01b03163314610ab85760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b612710811115610b0a5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60035460408051918252602082018390527f28e297c7c282931a994191b735b01eaf17558295f761512a7047f4e1b8dc3b0b910160405180910390a1600355565b5f546001600160a01b03163314610ba45760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b038116610bfa5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b6002546040516001600160a01b038084169216907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f7905f90a3600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8061271060035484610c809190611d80565b610c8a9190611d97565b9050610c968184611d48565b9392505050565b5f8061271060045484610c809190611d80565b5f8111610cff5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b60075460065f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d769190611d04565b1015610dc45760405162461bcd60e51b815260206004820152601860248201527f4d696e20746f74616c20737570706c79206e6f74206d657400000000000000006044820152606401610450565b6002546040517f1f437f9d0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0384811660248301526044820184905290911690631f437f9d906064016020604051808303815f875af1158015610e33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e579190611d61565b610ea35760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b600354819015610ed9575f61271060035484610ebf9190611d80565b610ec99190611d97565b9050610ed58183611d48565b9150505b8060055f828254610eea9190611dcf565b90915550610f2590506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611b9e565b6006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018490523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af115801561103b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105f9190611d04565b90505f81116110b05760405162461bcd60e51b815260206004820152600e60248201527f4465706f736974206661696c65640000000000000000000000000000000000006044820152606401610450565b6110e46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168584611b25565b604080518381526020810185905233917f1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed910160405180910390a250505050565b6104f43382610cb0565b6104f433826106fe565b5f546001600160a01b031633146111925760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49905f90a250565b6001546001600160a01b0316331461124d5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742070656e64696e6720676f7600000000000000000000000000000000006044820152606401610450565b6001545f80546040516001600160a01b0393841693909116917f3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac291a3600180545f80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b5f546001600160a01b031633146113205760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b5f811161136f5760405162461bcd60e51b815260206004820152601c60248201527f4d696e20746f74616c20737570706c79206d757374206265203e2030000000006044820152606401610450565b60075460408051918252602082018390527fe9b2d6ed3a1e53a2cbc74ea1516580639c8c1a43411ca794eaa9e101c3c3dea4910160405180910390a1600755565b5f546001600160a01b031633146114095760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b03831661145f5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e99190611de2565b6001600160a01b03161461153f5760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c74206d7573742061636365707420636f6c6c61746572616c6044820152606401610450565b611547610982565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ca9190611d04565b156116e0576006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039091169063ba0876529082906370a0823190602401602060405180830381865afa158015611636573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165a9190611d04565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af11580156116ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116de9190611d04565b505b600680547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03868116918217909355600754604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051949093169390926318160ddd9160048083019260209291908290030181865afa158015611773573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117979190611d04565b101561180b5760405162461bcd60e51b815260206004820152602860248201527f4e6577207661756c7420646f6573206e6f74206d656574206d696e20746f746160448201527f6c20737570706c790000000000000000000000000000000000000000000000006064820152608401610450565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611888573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ac9190611d04565b9050838110156119245760405162461bcd60e51b815260206004820152602d60248201527f496e73756666696369656e7420636f6c6c61746572616c2062616c616e63652060448201527f666f72206d6967726174696f6e000000000000000000000000000000000000006064820152608401610450565b8015611ade576006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156119b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d89190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018390523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015611a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a649190611d04565b905083811015611adc5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e74207368617265732072656365697665642066726f60448201527f6d206e6577207661756c740000000000000000000000000000000000000000006064820152608401610450565b505b846001600160a01b0316826001600160a01b03167faa10add0ff0f23b874d2d1fa353ab28a639aa51906dec303238cdb1f1e54ea4260405160405180910390a35050505050565b6040516001600160a01b03838116602483015260448201839052611b9991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bdd565b505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611bd79186918216906323b872dd90608401611b52565b50505050565b5f8060205f8451602086015f885af180611bfc576040513d5f823e3d81fd5b50505f513d91508115611c13578060011415611c20565b6001600160a01b0384163b155b15611bd7576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610450565b6001600160a01b03811681146104f4575f80fd5b5f60208284031215611c86575f80fd5b8135610c9681611c62565b5f60208284031215611ca1575f80fd5b5035919050565b5f8060408385031215611cb9575f80fd5b8235611cc481611c62565b946020939093013593505050565b5f805f60608486031215611ce4575f80fd5b8335611cef81611c62565b95602085013595506040909401359392505050565b5f60208284031215611d14575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115611d5b57611d5b611d1b565b92915050565b5f60208284031215611d71575f80fd5b81518015158114610c96575f80fd5b8082028115828204841417611d5b57611d5b611d1b565b5f82611dca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611d5b57611d5b611d1b565b5f60208284031215611df2575f80fd5b8151610c9681611c6256fea2646970667358221220fb094be55e618a2b326be9cb9c850683abaf8c7ae48d41e110708f81340d4efe64736f6c6343000814003360c060405234801561000f575f80fd5b50604051610e42380380610e4283398101604081905261002e91610087565b6001600160a01b039384166080525f80549385166001600160a01b03199485161790556002805492851692909316919091179091551660a0526100d8565b80516001600160a01b0381168114610082575f80fd5b919050565b5f805f806080858703121561009a575f80fd5b6100a38561006c565b93506100b16020860161006c565b92506100bf6040860161006c565b91506100cd6060860161006c565b905092959194509250565b60805160a051610d2661011c5f395f81816101bb0152818161043a015281816107f7015261089101525f818161010a0152818161040b01526107c20152610d265ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806392c592d011610088578063ee1ef57511610063578063ee1ef57514610203578063efdf0bb014610216578063f0c9e46514610229578063fdf893f514610231575f80fd5b806392c592d0146101b6578063b6a3f59a146101dd578063e1a611b7146101f0575f80fd5b806325240810116100c357806325240810146101705780632720b22e1461019057806369652fcf146101a55780638f770ad0146101ad575f80fd5b8063047fc9aa146100e957806304bda2621461010557806312d43a5114610151575b5f80fd5b6100f260035481565b6040519081526020015b60405180910390f35b61012c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fc565b5f5461012c9073ffffffffffffffffffffffffffffffffffffffff1681565b60015461012c9073ffffffffffffffffffffffffffffffffffffffff1681565b6101a361019e366004610c27565b610251565b005b6101a36104cd565b6100f260045481565b61012c7f000000000000000000000000000000000000000000000000000000000000000081565b6101a36101eb366004610c27565b6105c0565b6101a36101fe366004610c27565b610685565b6101a3610211366004610c3e565b61092e565b6101a3610224366004610c3e565b610a24565b6101a3610b12565b60025461012c9073ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206368616972000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f8111610340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f416d6f756e74206d757374206265203e2030000000000000000000000000000060448201526064016102ce565b6004546003546103509083610ca5565b11156103b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f537570706c79206361702065786365656465640000000000000000000000000060448201526064016102ce565b8060035f8282546103c99190610ca5565b90915550506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015f604051808303815f87803b15801561047b575f80fd5b505af115801561048d573d5f803e3d5ffd5b505050507fdcc16fd18a808d877bcd9a09b544844b36ae8f0a4b222e317d7b777b2c18b032816040516104c291815260200190565b60405180910390a150565b60025473ffffffffffffffffffffffffffffffffffffffff16331461054e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206368616972000000000000000000000000000000000000000000000060448201526064016102ce565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690915560405173ffffffffffffffffffffffffffffffffffffffff909116905f9082907f0a47357b37b43edfce3b49e26d073c29be56d40a540f4766153a6169d031e86e908390a350565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064016102ce565b600480549082905560408051828152602081018490527fb4d96b3a6638191d0f6aefa0fdc4d99af3592f4c97480e31feeb977723c63b53910160405180910390a15050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206368616972000000000000000000000000000000000000000000000060448201526064016102ce565b5f811161076f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f416d6f756e74206d757374206265203e2030000000000000000000000000000060448201526064016102ce565b8060035f8282546107809190610cbe565b90915550506040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303815f875af115801561083d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108619190610cd1565b506040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c68906024015f604051808303815f87803b1580156108e7575f80fd5b505af11580156108f9573d5f803e3d5ffd5b505050507f32d275175c36fa468b3e61c6763f9488ff3c9be127e35e011cf4e04d602224ba816040516104c291815260200190565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146109ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064016102ce565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f0a47357b37b43edfce3b49e26d073c29be56d40a540f4766153a6169d031e86e905f90a35050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064016102ce565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49905f90a250565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f742070656e64696e6720676f76000000000000000000000000000000000060448201526064016102ce565b6001545f805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917f3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac291a3600180545f80547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b5f60208284031215610c37575f80fd5b5035919050565b5f60208284031215610c4e575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610c71575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610cb857610cb8610c78565b92915050565b81810381811115610cb857610cb8610c78565b5f60208284031215610ce1575f80fd5b81518015158114610c71575f80fdfea264697066735822122036b7c9aa871b3c4aeaafcd7a910dc3a6d174e44d38a46c9060d0681b6bac34a064736f6c63430008140033","sourceMap":"555:10341:8:-:0;;;1897:412;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2022:32:8;;;;;2064:5;:24;;-1:-1:-1;;;;;;2064:24:8;;;;;;;;;;2098:20;;;;;-1:-1:-1;2128:10:8;;;;;;;;;;2148;:37;;;;;;;;;;;;;;2209:46;;2228:4;;2128:10;;2241:6;;2098:20;;2209:46;;;:::i;:::-;-1:-1:-1;;;;;1124:15:10;;;1106:34;;1176:15;;;1171:2;1156:18;;1149:43;1228:15;;;1223:2;1208:18;;1201:43;1280:15;;;1275:2;1260:18;;1253:43;1055:3;1040:19;2209:46:8;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2195:61:8;;;;;;;2266:4;;:36;;-1:-1:-1;;;2266:36:8;;;;;1481:51:10;;;;-1:-1:-1;;1548:18:10;;;1541:34;2266:12:8;;;;;;1454:18:10;;2266:36:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1897:412;;;;;;555:10341;;;;;;;;;;:::o;14:177:10:-;93:13;;-1:-1:-1;;;;;135:31:10;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:636::-;311:6;319;327;335;343;351;404:3;392:9;383:7;379:23;375:33;372:53;;;421:1;418;411:12;372:53;444:40;474:9;444:40;:::i;:::-;434:50;;503:49;548:2;537:9;533:18;503:49;:::i;:::-;493:59;;571:49;616:2;605:9;601:18;571:49;:::i;:::-;561:59;;639:49;684:2;673:9;669:18;639:49;:::i;:::-;629:59;;707:50;752:3;741:9;737:19;707:50;:::i;:::-;697:60;;776:50;821:3;810:9;806:19;776:50;:::i;:::-;766:60;;196:636;;;;;;;;:::o;1586:277::-;1653:6;1706:2;1694:9;1685:7;1681:23;1677:32;1674:52;;;1722:1;1719;1712:12;1674:52;1754:9;1748:16;1807:5;1800:13;1793:21;1786:5;1783:32;1773:60;;1829:1;1826;1819:12;1773:60;1852:5;1586:277;-1:-1:-1;;;1586:277:10:o;:::-;555:10341:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220fb094be55e618a2b326be9cb9c850683abaf8c7ae48d41e110708f81340d4efe64736f6c63430008140033","offset":8327},"2":{"value":"0xa264697066735822122036b7c9aa871b3c4aeaafcd7a910dc3a6d174e44d38a46c9060d0681b6bac34a064736f6c63430008140033","offset":11977}},"transformations":[{"type":"insert","offset":12030,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x000000000000000000000000dc035d45d973e3ec169d2276ddab16f1e407384f000000000000000000000000a3931d71877c0e7a3148cb7eb4463524fec27fbd000000000000000000000000865377367054516e17014ccded1e7d814edc9ce4000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b000000000000000000000000e3475728673eabaec90a37aa3ae2ced9f0db5ff20000000000000000000000008f97cca30dbe80e7a8b462f1dd1a51c32accdfc8"}},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806392c592d0116100fe578063e1a452181161009e578063f5d121e61161006e578063f5d121e6146103af578063f77c4791146103c2578063fbfa77cf146103d5578063fc22d0e5146103e8575f80fd5b8063e1a4521814610378578063e4849b3214610381578063efdf0bb014610394578063f0c9e465146103a7575f80fd5b8063c71a7eff116100d9578063c71a7eff14610318578063cce7ec131461032b578063d8dfeb451461033e578063d96a094a14610365575f80fd5b806392c592d0146102cb57806392eefe9b146102f2578063a0422edf14610305575f80fd5b806353d06f941161016957806370c105781161014457806370c105781461029e57806377d2300e146102a657806379db6346146102af5780639058c8a4146102b8575f80fd5b806353d06f941461025c578063679dffb4146102835780636c197ff51461028b575f80fd5b806323cbe1f3116101a457806323cbe1f314610225578063242693d31461022e578063252408101461023657806334119d1514610249575f80fd5b806301681a62146101ca578063047fc9aa146101df57806312d43a51146101fb575b5f80fd5b6101dd6101d8366004611c76565b6103fb565b005b6101e860055481565b6040519081526020015b60405180910390f35b5f5461020d906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b6101e860045481565b6101e86104f7565b60015461020d906001600160a01b031681565b6101dd610257366004611c91565b6105e4565b61020d7f00000000000000000000000067fc21332d24fc5250a3b7fc988191ad7f38f9cc81565b6101e86106d0565b6101dd610299366004611ca8565b6106fe565b6101dd610982565b6101e860035481565b6101e860075481565b6101dd6102c6366004611c91565b610a5f565b61020d7f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce481565b6101dd610300366004611c76565b610b4b565b6101e8610313366004611c91565b610c6d565b6101e8610326366004611c91565b610c9d565b6101dd610339366004611ca8565b610cb0565b61020d7f000000000000000000000000dc035d45d973e3ec169d2276ddab16f1e407384f81565b6101dd610373366004611c91565b611125565b6101e861271081565b6101dd61038f366004611c91565b61112f565b6101dd6103a2366004611c76565b611139565b6101dd6111f3565b6101dd6103bd366004611c91565b6112c7565b60025461020d906001600160a01b031681565b60065461020d906001600160a01b031681565b6101dd6103f6366004611cd2565b6113b0565b5f546001600160a01b031633146104595760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f760000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526104f4916001600160a01b0390811691908416906370a0823190602401602060405180830381865afa1580156104bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190611d04565b6001600160a01b0384169190611b25565b50565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f916001600160a01b031690634cdad5069082906370a0823190602401602060405180830381865afa15801561055e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105829190611d04565b6040518263ffffffff1660e01b81526004016105a091815260200190565b602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190611d04565b905090565b5f546001600160a01b0316331461063d5760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b61271081111561068f5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60045460408051918252602082018390527f5bafec153d96f8ef37761b64348732b41a6b477401d244a5070f9f82d689adce910160405180910390a1600455565b5f806106da6104f7565b905060055481116106eb575f6106f8565b6005546106f89082611d48565b91505090565b5f811161074d5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b6002546040517fb29431fb0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038481166024830152604482018490529091169063b29431fb906064016020604051808303815f875af11580156107bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e09190611d61565b61082c5760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b8060055f82825461083d9190611d48565b9091555061087890506001600160a01b037f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce416333084611b9e565b6004548190156108ae575f612710600454846108949190611d80565b61089e9190611d97565b90506108aa8183611d48565b9150505b6006546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0385811660248301523060448301529091169063b460af94906064016020604051808303815f875af115801561091d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109419190611d04565b50604080518381526020810183905233917fed7a144fad14804d5c249145e3e0e2b63a9eb455b76aee5bc92d711e9bba3e4a910160405180910390a2505050565b5f61098b6106d0565b90508015610a29576006545f546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03918216602482015230604482015291169063b460af94906064016020604051808303815f875af1158015610a03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a279190611d04565b505b6040518181527f949da057e0c10ac8c590fc56cf17f0a7f8a424d6f373268e7fc205c8dcbc7bb49060200160405180910390a150565b5f546001600160a01b03163314610ab85760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b612710811115610b0a5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60035460408051918252602082018390527f28e297c7c282931a994191b735b01eaf17558295f761512a7047f4e1b8dc3b0b910160405180910390a1600355565b5f546001600160a01b03163314610ba45760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b038116610bfa5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b6002546040516001600160a01b038084169216907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f7905f90a3600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8061271060035484610c809190611d80565b610c8a9190611d97565b9050610c968184611d48565b9392505050565b5f8061271060045484610c809190611d80565b5f8111610cff5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b60075460065f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d769190611d04565b1015610dc45760405162461bcd60e51b815260206004820152601860248201527f4d696e20746f74616c20737570706c79206e6f74206d657400000000000000006044820152606401610450565b6002546040517f1f437f9d0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0384811660248301526044820184905290911690631f437f9d906064016020604051808303815f875af1158015610e33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e579190611d61565b610ea35760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b600354819015610ed9575f61271060035484610ebf9190611d80565b610ec99190611d97565b9050610ed58183611d48565b9150505b8060055f828254610eea9190611dcf565b90915550610f2590506001600160a01b037f000000000000000000000000dc035d45d973e3ec169d2276ddab16f1e407384f16333085611b9e565b6006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018490527f000000000000000000000000dc035d45d973e3ec169d2276ddab16f1e407384f9091169063095ea7b3906044016020604051808303815f875af1158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018490523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af115801561103b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105f9190611d04565b90505f81116110b05760405162461bcd60e51b815260206004820152600e60248201527f4465706f736974206661696c65640000000000000000000000000000000000006044820152606401610450565b6110e46001600160a01b037f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce4168584611b25565b604080518381526020810185905233917f1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed910160405180910390a250505050565b6104f43382610cb0565b6104f433826106fe565b5f546001600160a01b031633146111925760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49905f90a250565b6001546001600160a01b0316331461124d5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742070656e64696e6720676f7600000000000000000000000000000000006044820152606401610450565b6001545f80546040516001600160a01b0393841693909116917f3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac291a3600180545f80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b5f546001600160a01b031633146113205760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b5f811161136f5760405162461bcd60e51b815260206004820152601c60248201527f4d696e20746f74616c20737570706c79206d757374206265203e2030000000006044820152606401610450565b60075460408051918252602082018390527fe9b2d6ed3a1e53a2cbc74ea1516580639c8c1a43411ca794eaa9e101c3c3dea4910160405180910390a1600755565b5f546001600160a01b031633146114095760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b03831661145f5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b7f000000000000000000000000dc035d45d973e3ec169d2276ddab16f1e407384f6001600160a01b0316836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e99190611de2565b6001600160a01b03161461153f5760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c74206d7573742061636365707420636f6c6c61746572616c6044820152606401610450565b611547610982565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ca9190611d04565b156116e0576006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039091169063ba0876529082906370a0823190602401602060405180830381865afa158015611636573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165a9190611d04565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af11580156116ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116de9190611d04565b505b600680547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03868116918217909355600754604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051949093169390926318160ddd9160048083019260209291908290030181865afa158015611773573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117979190611d04565b101561180b5760405162461bcd60e51b815260206004820152602860248201527f4e6577207661756c7420646f6573206e6f74206d656574206d696e20746f746160448201527f6c20737570706c790000000000000000000000000000000000000000000000006064820152608401610450565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000dc035d45d973e3ec169d2276ddab16f1e407384f6001600160a01b0316906370a0823190602401602060405180830381865afa158015611888573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ac9190611d04565b9050838110156119245760405162461bcd60e51b815260206004820152602d60248201527f496e73756666696369656e7420636f6c6c61746572616c2062616c616e63652060448201527f666f72206d6967726174696f6e000000000000000000000000000000000000006064820152608401610450565b8015611ade576006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390527f000000000000000000000000dc035d45d973e3ec169d2276ddab16f1e407384f9091169063095ea7b3906044016020604051808303815f875af11580156119b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d89190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018390523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015611a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a649190611d04565b905083811015611adc5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e74207368617265732072656365697665642066726f60448201527f6d206e6577207661756c740000000000000000000000000000000000000000006064820152608401610450565b505b846001600160a01b0316826001600160a01b03167faa10add0ff0f23b874d2d1fa353ab28a639aa51906dec303238cdb1f1e54ea4260405160405180910390a35050505050565b6040516001600160a01b03838116602483015260448201839052611b9991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bdd565b505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611bd79186918216906323b872dd90608401611b52565b50505050565b5f8060205f8451602086015f885af180611bfc576040513d5f823e3d81fd5b50505f513d91508115611c13578060011415611c20565b6001600160a01b0384163b155b15611bd7576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610450565b6001600160a01b03811681146104f4575f80fd5b5f60208284031215611c86575f80fd5b8135610c9681611c62565b5f60208284031215611ca1575f80fd5b5035919050565b5f8060408385031215611cb9575f80fd5b8235611cc481611c62565b946020939093013593505050565b5f805f60608486031215611ce4575f80fd5b8335611cef81611c62565b95602085013595506040909401359392505050565b5f60208284031215611d14575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115611d5b57611d5b611d1b565b92915050565b5f60208284031215611d71575f80fd5b81518015158114610c96575f80fd5b8082028115828204841417611d5b57611d5b611d1b565b5f82611dca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611d5b57611d5b611d1b565b5f60208284031215611df2575f80fd5b8151610c9681611c6256fea2646970667358221220fb094be55e618a2b326be9cb9c850683abaf8c7ae48d41e110708f81340d4efe64736f6c63430008140033","recompiledBytecode":"0x608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806392c592d0116100fe578063e1a452181161009e578063f5d121e61161006e578063f5d121e6146103af578063f77c4791146103c2578063fbfa77cf146103d5578063fc22d0e5146103e8575f80fd5b8063e1a4521814610378578063e4849b3214610381578063efdf0bb014610394578063f0c9e465146103a7575f80fd5b8063c71a7eff116100d9578063c71a7eff14610318578063cce7ec131461032b578063d8dfeb451461033e578063d96a094a14610365575f80fd5b806392c592d0146102cb57806392eefe9b146102f2578063a0422edf14610305575f80fd5b806353d06f941161016957806370c105781161014457806370c105781461029e57806377d2300e146102a657806379db6346146102af5780639058c8a4146102b8575f80fd5b806353d06f941461025c578063679dffb4146102835780636c197ff51461028b575f80fd5b806323cbe1f3116101a457806323cbe1f314610225578063242693d31461022e578063252408101461023657806334119d1514610249575f80fd5b806301681a62146101ca578063047fc9aa146101df57806312d43a51146101fb575b5f80fd5b6101dd6101d8366004611c76565b6103fb565b005b6101e860055481565b6040519081526020015b60405180910390f35b5f5461020d906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b6101e860045481565b6101e86104f7565b60015461020d906001600160a01b031681565b6101dd610257366004611c91565b6105e4565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101e86106d0565b6101dd610299366004611ca8565b6106fe565b6101dd610982565b6101e860035481565b6101e860075481565b6101dd6102c6366004611c91565b610a5f565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610300366004611c76565b610b4b565b6101e8610313366004611c91565b610c6d565b6101e8610326366004611c91565b610c9d565b6101dd610339366004611ca8565b610cb0565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610373366004611c91565b611125565b6101e861271081565b6101dd61038f366004611c91565b61112f565b6101dd6103a2366004611c76565b611139565b6101dd6111f3565b6101dd6103bd366004611c91565b6112c7565b60025461020d906001600160a01b031681565b60065461020d906001600160a01b031681565b6101dd6103f6366004611cd2565b6113b0565b5f546001600160a01b031633146104595760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f760000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526104f4916001600160a01b0390811691908416906370a0823190602401602060405180830381865afa1580156104bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190611d04565b6001600160a01b0384169190611b25565b50565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f916001600160a01b031690634cdad5069082906370a0823190602401602060405180830381865afa15801561055e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105829190611d04565b6040518263ffffffff1660e01b81526004016105a091815260200190565b602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190611d04565b905090565b5f546001600160a01b0316331461063d5760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b61271081111561068f5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60045460408051918252602082018390527f5bafec153d96f8ef37761b64348732b41a6b477401d244a5070f9f82d689adce910160405180910390a1600455565b5f806106da6104f7565b905060055481116106eb575f6106f8565b6005546106f89082611d48565b91505090565b5f811161074d5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b6002546040517fb29431fb0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038481166024830152604482018490529091169063b29431fb906064016020604051808303815f875af11580156107bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e09190611d61565b61082c5760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b8060055f82825461083d9190611d48565b9091555061087890506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611b9e565b6004548190156108ae575f612710600454846108949190611d80565b61089e9190611d97565b90506108aa8183611d48565b9150505b6006546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0385811660248301523060448301529091169063b460af94906064016020604051808303815f875af115801561091d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109419190611d04565b50604080518381526020810183905233917fed7a144fad14804d5c249145e3e0e2b63a9eb455b76aee5bc92d711e9bba3e4a910160405180910390a2505050565b5f61098b6106d0565b90508015610a29576006545f546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03918216602482015230604482015291169063b460af94906064016020604051808303815f875af1158015610a03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a279190611d04565b505b6040518181527f949da057e0c10ac8c590fc56cf17f0a7f8a424d6f373268e7fc205c8dcbc7bb49060200160405180910390a150565b5f546001600160a01b03163314610ab85760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b612710811115610b0a5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60035460408051918252602082018390527f28e297c7c282931a994191b735b01eaf17558295f761512a7047f4e1b8dc3b0b910160405180910390a1600355565b5f546001600160a01b03163314610ba45760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b038116610bfa5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b6002546040516001600160a01b038084169216907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f7905f90a3600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8061271060035484610c809190611d80565b610c8a9190611d97565b9050610c968184611d48565b9392505050565b5f8061271060045484610c809190611d80565b5f8111610cff5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b60075460065f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d769190611d04565b1015610dc45760405162461bcd60e51b815260206004820152601860248201527f4d696e20746f74616c20737570706c79206e6f74206d657400000000000000006044820152606401610450565b6002546040517f1f437f9d0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0384811660248301526044820184905290911690631f437f9d906064016020604051808303815f875af1158015610e33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e579190611d61565b610ea35760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b600354819015610ed9575f61271060035484610ebf9190611d80565b610ec99190611d97565b9050610ed58183611d48565b9150505b8060055f828254610eea9190611dcf565b90915550610f2590506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611b9e565b6006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018490523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af115801561103b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105f9190611d04565b90505f81116110b05760405162461bcd60e51b815260206004820152600e60248201527f4465706f736974206661696c65640000000000000000000000000000000000006044820152606401610450565b6110e46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168584611b25565b604080518381526020810185905233917f1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed910160405180910390a250505050565b6104f43382610cb0565b6104f433826106fe565b5f546001600160a01b031633146111925760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49905f90a250565b6001546001600160a01b0316331461124d5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742070656e64696e6720676f7600000000000000000000000000000000006044820152606401610450565b6001545f80546040516001600160a01b0393841693909116917f3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac291a3600180545f80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b5f546001600160a01b031633146113205760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b5f811161136f5760405162461bcd60e51b815260206004820152601c60248201527f4d696e20746f74616c20737570706c79206d757374206265203e2030000000006044820152606401610450565b60075460408051918252602082018390527fe9b2d6ed3a1e53a2cbc74ea1516580639c8c1a43411ca794eaa9e101c3c3dea4910160405180910390a1600755565b5f546001600160a01b031633146114095760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b03831661145f5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e99190611de2565b6001600160a01b03161461153f5760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c74206d7573742061636365707420636f6c6c61746572616c6044820152606401610450565b611547610982565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ca9190611d04565b156116e0576006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039091169063ba0876529082906370a0823190602401602060405180830381865afa158015611636573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165a9190611d04565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af11580156116ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116de9190611d04565b505b600680547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03868116918217909355600754604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051949093169390926318160ddd9160048083019260209291908290030181865afa158015611773573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117979190611d04565b101561180b5760405162461bcd60e51b815260206004820152602860248201527f4e6577207661756c7420646f6573206e6f74206d656574206d696e20746f746160448201527f6c20737570706c790000000000000000000000000000000000000000000000006064820152608401610450565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611888573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ac9190611d04565b9050838110156119245760405162461bcd60e51b815260206004820152602d60248201527f496e73756666696369656e7420636f6c6c61746572616c2062616c616e63652060448201527f666f72206d6967726174696f6e000000000000000000000000000000000000006064820152608401610450565b8015611ade576006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156119b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d89190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018390523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015611a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a649190611d04565b905083811015611adc5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e74207368617265732072656365697665642066726f60448201527f6d206e6577207661756c740000000000000000000000000000000000000000006064820152608401610450565b505b846001600160a01b0316826001600160a01b03167faa10add0ff0f23b874d2d1fa353ab28a639aa51906dec303238cdb1f1e54ea4260405160405180910390a35050505050565b6040516001600160a01b03838116602483015260448201839052611b9991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bdd565b505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611bd79186918216906323b872dd90608401611b52565b50505050565b5f8060205f8451602086015f885af180611bfc576040513d5f823e3d81fd5b50505f513d91508115611c13578060011415611c20565b6001600160a01b0384163b155b15611bd7576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610450565b6001600160a01b03811681146104f4575f80fd5b5f60208284031215611c86575f80fd5b8135610c9681611c62565b5f60208284031215611ca1575f80fd5b5035919050565b5f8060408385031215611cb9575f80fd5b8235611cc481611c62565b946020939093013593505050565b5f805f60608486031215611ce4575f80fd5b8335611cef81611c62565b95602085013595506040909401359392505050565b5f60208284031215611d14575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115611d5b57611d5b611d1b565b92915050565b5f60208284031215611d71575f80fd5b81518015158114610c96575f80fd5b8082028115828204841417611d5b57611d5b611d1b565b5f82611dca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611d5b57611d5b611d1b565b5f60208284031215611df2575f80fd5b8151610c9681611c6256fea2646970667358221220fb094be55e618a2b326be9cb9c850683abaf8c7ae48d41e110708f81340d4efe64736f6c63430008140033","sourceMap":"555:10341:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8357:118;;;;;;:::i;:::-;;:::i;:::-;;1017:21;;;;;;;;;601:25:10;;;589:2;574:18;1017:21:8;;;;;;;;743:18;;;;;-1:-1:-1;;;;;743:18:8;;;;;;-1:-1:-1;;;;;801:55:10;;;783:74;;771:2;756:18;743::8;637:226:10;913:25:8;;;;;;5325:133;;;:::i;767:25::-;;;;;-1:-1:-1;;;;;767:25:8;;;8975:201;;;;;;:::i;:::-;;:::i;681:28::-;;;;;5577:178;;;:::i;4165:611::-;;;;;;:::i;:::-;;:::i;4965:200::-;;;:::i;864:24::-;;;;;;1133:29;;;;;;8626:197;;;;;;:::i;:::-;;:::i;647:28::-;;;;;10645:249;;;;;;:::i;:::-;;:::i;6006:184::-;;;;;;:::i;:::-;;:::i;6441:173::-;;;;;;:::i;:::-;;:::i;2845:908::-;;;;;;:::i;:::-;;:::i;607:34::-;;;;;2555:102;;;;;;:::i;:::-;;:::i;963:48::-;;1005:6;963:48;;3887:92;;;;;;:::i;:::-;;:::i;9937:147::-;;;;;;:::i;:::-;;:::i;10239:206::-;;;:::i;9470:257::-;;;;;;:::i;:::-;;:::i;798:29::-;;;;;-1:-1:-1;;;;;798:29:8;;;1106:21;;;;;-1:-1:-1;;;;;1106:21:8;;;7021:1144;;;;;;:::i;:::-;;:::i;8357:118::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;;;;;;;;;8432:3:::1;::::0;8437:30:::1;::::0;;;;8461:4:::1;8437:30;::::0;::::1;783:74:10::0;8413:55:8::1;::::0;-1:-1:-1;;;;;8432:3:8;;::::1;::::0;8437:15;;::::1;::::0;::::1;::::0;756:18:10;;8437:30:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8413:18:8;::::1;::::0;:55;:18:::1;:55::i;:::-;8357:118:::0;:::o;5325:133::-;5400:5;;5420:30;;;;;5444:4;5420:30;;;783:74:10;5374:7:8;;-1:-1:-1;;;;;5400:5:8;;:19;;:5;;5420:15;;756:18:10;;5420:30:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5400:51;;;;;;;;;;;;;601:25:10;;589:2;574:18;;455:177;5400:51:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5393:58;;5325:133;:::o;8975:201::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;1005:6:::1;9049;:25;;9041:50;;;::::0;-1:-1:-1;;;9041:50:8;;3505:2:10;9041:50:8::1;::::0;::::1;3487:21:10::0;3544:2;3524:18;;;3517:30;3583:14;3563:18;;;3556:42;3615:18;;9041:50:8::1;3303:336:10::0;9041:50:8::1;9121:10;::::0;9106:34:::1;::::0;;3818:25:10;;;3874:2;3859:18;;3852:34;;;9106::8::1;::::0;3791:18:10;9106:34:8::1;;;;;;;9150:10;:19:::0;8975:201::o;5577:178::-;5619:7;5638:21;5662:18;:16;:18::i;:::-;5638:42;;5713:6;;5697:13;:22;:51;;5747:1;5697:51;;;5738:6;;5722:22;;:13;:22;:::i;:::-;5690:58;;;5577:178;:::o;4165:611::-;4253:1;4238:12;:16;4230:47;;;;-1:-1:-1;;;4230:47:8;;4421:2:10;4230:47:8;;;4403:21:10;4460:2;4440:18;;;4433:30;4499:20;4479:18;;;4472:48;4537:18;;4230:47:8;4219:342:10;4230:47:8;4295:10;;:47;;;;;4313:10;4295:47;;;4829:34:10;-1:-1:-1;;;;;4899:15:10;;;4879:18;;;4872:43;4931:18;;;4924:34;;;4295:10:8;;;;:17;;4741:18:10;;4295:47:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4287:80;;;;-1:-1:-1;;;4287:80:8;;5453:2:10;4287:80:8;;;5435:21:10;5492:2;5472:18;;;5465:30;5531:22;5511:18;;;5504:50;5571:18;;4287:80:8;5251:344:10;4287:80:8;4387:12;4377:6;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;4409:62:8;;-1:-1:-1;;;;;;4409:4:8;:21;4431:10;4451:4;4458:12;4409:21;:62::i;:::-;4529:10;;4502:12;;4529:14;4525:134;;4559:11;1005:6;4589:10;;4574:12;:25;;;;:::i;:::-;4573:45;;;;:::i;:::-;4559:59;-1:-1:-1;4632:16:8;4559:59;4632:16;;:::i;:::-;;;4545:114;4525:134;4669:5;;:44;;;;;;;;6254:25:10;;;-1:-1:-1;;;;;6376:15:10;;;6356:18;;;6349:43;4707:4:8;6408:18:10;;;6401:43;4669:5:8;;;;:14;;6227:18:10;;4669:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;4728:41:8;;;3818:25:10;;;3874:2;3859:18;;3852:34;;;4733:10:8;;4728:41;;3791:18:10;4728:41:8;;;;;;;4220:556;4165:611;;:::o;4965:200::-;5004:14;5021:11;:9;:11::i;:::-;5004:28;-1:-1:-1;5046:10:8;;5042:83;;5072:5;;;5095:3;5072:42;;;;;;;;6254:25:10;;;-1:-1:-1;;;;;5095:3:8;;;6356:18:10;;;6349:43;5108:4:8;6408:18:10;;;6401:43;5072:5:8;;;:14;;6227:18:10;;5072:42:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5042:83;5139:19;;601:25:10;;;5139:19:8;;589:2:10;574:18;5139:19:8;;;;;;;4994:171;4965:200::o;8626:197::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;1005:6:::1;8699;:25;;8691:50;;;::::0;-1:-1:-1;;;8691:50:8;;3505:2:10;8691:50:8::1;::::0;::::1;3487:21:10::0;3544:2;3524:18;;;3517:30;3583:14;3563:18;;;3556:42;3615:18;;8691:50:8::1;3303:336:10::0;8691:50:8::1;8770:9;::::0;8756:32:::1;::::0;;3818:25:10;;;3874:2;3859:18;;3852:34;;;8756:32:8::1;::::0;3791:18:10;8756:32:8::1;;;;;;;8798:9;:18:::0;8626:197::o;10645:249::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;-1:-1:-1;;;;;10726:27:8;::::1;10718:52;;;::::0;-1:-1:-1;;;10718:52:8;;6657:2:10;10718:52:8::1;::::0;::::1;6639:21:10::0;6696:2;6676:18;;;6669:30;6735:14;6715:18;;;6708:42;6767:18;;10718:52:8::1;6455:336:10::0;10718:52:8::1;10811:10;::::0;10785:53:::1;::::0;-1:-1:-1;;;;;10785:53:8;;::::1;::::0;10811:10:::1;::::0;10785:53:::1;::::0;10811:10:::1;::::0;10785:53:::1;10848:10;:39:::0;;;::::1;-1:-1:-1::0;;;;;10848:39:8;;;::::1;::::0;;;::::1;::::0;;10645:249::o;6006:184::-;6071:7;6090:11;1005:6;6120:9;;6105:12;:24;;;;:::i;:::-;6104:44;;;;:::i;:::-;6090:58;-1:-1:-1;6165:18:8;6090:58;6165:12;:18;:::i;:::-;6158:25;6006:184;-1:-1:-1;;;6006:184:8:o;6441:173::-;6506:7;6525:11;1005:6;6549:10;;6540:6;:19;;;;:::i;2845:908::-;2944:1;2923:18;:22;2915:53;;;;-1:-1:-1;;;2915:53:8;;4421:2:10;2915:53:8;;;4403:21:10;4460:2;4440:18;;;4433:30;4499:20;4479:18;;;4472:48;4537:18;;2915:53:8;4219:342:10;2915:53:8;3009:14;;2986:5;;;;;;;;;-1:-1:-1;;;;;2986:5:8;-1:-1:-1;;;;;2986:17:8;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;2978:74;;;;-1:-1:-1;;;2978:74:8;;6998:2:10;2978:74:8;;;6980:21:10;7037:2;7017:18;;;7010:30;7076:26;7056:18;;;7049:54;7120:18;;2978:74:8;6796:348:10;2978:74:8;3070:10;;:52;;;;;3087:10;3070:52;;;4829:34:10;-1:-1:-1;;;;;4899:15:10;;;4879:18;;;4872:43;4931:18;;;4924:34;;;3070:10:8;;;;:16;;4741:18:10;;3070:52:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3062:85;;;;-1:-1:-1;;;3062:85:8;;5453:2:10;3062:85:8;;;5435:21:10;5492:2;5472:18;;;5465:30;5531:22;5511:18;;;5504:50;5571:18;;3062:85:8;5251:344:10;3062:85:8;3210:9;;3177:18;;3210:13;3206:138;;3239:11;1005:6;3275:9;;3254:18;:30;;;;:::i;:::-;3253:50;;;;:::i;:::-;3239:64;-1:-1:-1;3317:16:8;3239:64;3317:16;;:::i;:::-;;;3225:119;3206:138;3363:9;3353:6;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;3383:74:8;;-1:-1:-1;;;;;;3383:10:8;:27;3411:10;3431:4;3438:18;3383:27;:74::i;:::-;3494:5;;3467:54;;;;;-1:-1:-1;;;;;3494:5:8;;;3467:54;;;7453:74:10;7543:18;;;7536:34;;;3467:10:8;:18;;;;;;7426::10;;3467:54:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3548:5:8;;:48;;;;;;;;7755:25:10;;;3590:4:8;7796:18:10;;;7789:83;3531:14:8;;-1:-1:-1;;;;;3548:5:8;;:13;;7728:18:10;;3548:48:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3531:65;;3623:1;3614:6;:10;3606:37;;;;-1:-1:-1;;;3606:37:8;;8085:2:10;3606:37:8;;;8067:21:10;8124:2;8104:18;;;8097:30;8163:16;8143:18;;;8136:44;8197:18;;3606:37:8;7883:338:10;3606:37:8;3653:32;-1:-1:-1;;;;;3653:4:8;:17;3671:2;3675:9;3653:17;:32::i;:::-;3700:46;;;3818:25:10;;;3874:2;3859:18;;3852:34;;;3704:10:8;;3700:46;;3791:18:10;3700:46:8;;;;;;;2905:848;;2845:908;;:::o;2555:102::-;2615:35;2619:10;2631:18;2615:3;:35::i;3887:92::-;3942:30;3947:10;3959:12;3942:4;:30::i;9937:147::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;10008:10:::1;:24:::0;;;::::1;-1:-1:-1::0;;;;;10008:24:8;::::1;::::0;;::::1;::::0;;;10047:30:::1;::::0;::::1;::::0;-1:-1:-1;;10047:30:8::1;9937:147:::0;:::o;10239:206::-;10307:10;;-1:-1:-1;;;;;10307:10:8;10293;:24;10285:52;;;;-1:-1:-1;;;10285:52:8;;8428:2:10;10285:52:8;;;8410:21:10;8467:2;8447:18;;;8440:30;8506:17;8486:18;;;8479:45;8541:18;;10285:52:8;8226:339:10;10285:52:8;10368:10;;;10363:3;;10352:27;;-1:-1:-1;;;;;10368:10:8;;;;10363:3;;;;10352:27;;;10395:10;;;;10389:16;;;;;;-1:-1:-1;;;;;10395:10:8;;10389:16;;;;10415:23;;;10239:206::o;9470:257::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;9575:1:::1;9557:15;:19;9549:60;;;::::0;-1:-1:-1;;;9549:60:8;;8772:2:10;9549:60:8::1;::::0;::::1;8754:21:10::0;8811:2;8791:18;;;8784:30;8850;8830:18;;;8823:58;8898:18;;9549:60:8::1;8570:352:10::0;9549:60:8::1;9646:14;::::0;9624:54:::1;::::0;;3818:25:10;;;3874:2;3859:18;;3852:34;;;9624:54:8::1;::::0;3791:18:10;9624:54:8::1;;;;;;;9688:14;:32:::0;9470:257::o;7021:1144::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;-1:-1:-1;;;;;7142:22:8;::::1;7134:47;;;::::0;-1:-1:-1;;;7134:47:8;;6657:2:10;7134:47:8::1;::::0;::::1;6639:21:10::0;6696:2;6676:18;;;6669:30;6735:14;6715:18;;;6708:42;6767:18;;7134:47:8::1;6455:336:10::0;7134:47:8::1;7237:10;-1:-1:-1::0;;;;;7199:49:8::1;7208:8;-1:-1:-1::0;;;;;7199:24:8::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7199:49:8::1;;7191:94;;;::::0;-1:-1:-1;;;7191:94:8;;9393:2:10;7191:94:8::1;::::0;::::1;9375:21:10::0;;;9412:18;;;9405:30;9471:34;9451:18;;;9444:62;9523:18;;7191:94:8::1;9191:356:10::0;7191:94:8::1;7296:12;:10;:12::i;:::-;7323:5;::::0;:30:::1;::::0;;;;7347:4:::1;7323:30;::::0;::::1;783:74:10::0;-1:-1:-1;;;;;7323:5:8;;::::1;::::0;:15:::1;::::0;756:18:10;;7323:30:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35:::0;7319:140:::1;;7374:5;::::0;7387:30:::1;::::0;;;;7411:4:::1;7387:30;::::0;::::1;783:74:10::0;-1:-1:-1;;;;;7374:5:8;;::::1;::::0;:12:::1;::::0;:5;;7387:15:::1;::::0;756:18:10;;7387:30:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7374:74;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6254:25:10::0;;;;7427:4:8::1;6356:18:10::0;;;6349:43;;;6408:18;;;6401:43;6227:18;;7374:74:8::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7319:140;7496:5;::::0;;7512:26;;::::1;-1:-1:-1::0;;;;;7512:26:8;;::::1;::::0;;::::1;::::0;;;7579:14:::1;::::0;7556:19:::1;::::0;;;;;;;7496:5;;;::::1;::::0;7579:14;;7556:17:::1;::::0;:19:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;7512:26;7556:19:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;7548:90;;;::::0;-1:-1:-1;;;7548:90:8;;9754:2:10;7548:90:8::1;::::0;::::1;9736:21:10::0;9793:2;9773:18;;;9766:30;9832:34;9812:18;;;9805:62;9903:10;9883:18;;;9876:38;9931:19;;7548:90:8::1;9552:404:10::0;7548:90:8::1;7677:35;::::0;;;;7706:4:::1;7677:35;::::0;::::1;783:74:10::0;7649:25:8::1;::::0;7677:10:::1;-1:-1:-1::0;;;;;7677:20:8::1;::::0;::::1;::::0;756:18:10;;7677:35:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7649:63;;7751:19;7730:17;:40;;7722:98;;;::::0;-1:-1:-1;;;7722:98:8;;10163:2:10;7722:98:8::1;::::0;::::1;10145:21:10::0;10202:2;10182:18;;;10175:30;10241:34;10221:18;;;10214:62;10312:15;10292:18;;;10285:43;10345:19;;7722:98:8::1;9961:409:10::0;7722:98:8::1;7834:21:::0;;7830:281:::1;;7898:5;::::0;7871:53:::1;::::0;;;;-1:-1:-1;;;;;7898:5:8;;::::1;7871:53;::::0;::::1;7453:74:10::0;7543:18;;;7536:34;;;7871:10:8::1;:18:::0;;::::1;::::0;::::1;::::0;7426::10;;7871:53:8::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;7958:5:8::1;::::0;:47:::1;::::0;;;;::::1;::::0;::::1;7755:25:10::0;;;7999:4:8::1;7796:18:10::0;;;7789:83;7938:17:8::1;::::0;-1:-1:-1;;;;;7958:5:8::1;::::0;:13:::1;::::0;7728:18:10;;7958:47:8::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7938:67;;8040:12;8027:9;:25;;8019:81;;;::::0;-1:-1:-1;;;8019:81:8;;10577:2:10;8019:81:8::1;::::0;::::1;10559:21:10::0;10616:2;10596:18;;;10589:30;10655:34;10635:18;;;10628:62;10726:13;10706:18;;;10699:41;10757:19;;8019:81:8::1;10375:407:10::0;8019:81:8::1;7857:254;7830:281;8149:8;-1:-1:-1::0;;;;;8125:33:8::1;8139:8;-1:-1:-1::0;;;;;8125:33:8::1;;;;;;;;;;;7124:1041;;7021:1144:::0;;;:::o;1219:160:6:-;1328:43;;-1:-1:-1;;;;;7471:55:10;;;1328:43:6;;;7453:74:10;7543:18;;;7536:34;;;1301:71:6;;1321:5;;1343:14;;;;;7426:18:10;;1328:43:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1301:19;:71::i;:::-;1219:160;;;:::o;1618:188::-;1745:53;;-1:-1:-1;;;;;4847:15:10;;;1745:53:6;;;4829:34:10;4899:15;;;4879:18;;;4872:43;4931:18;;;4924:34;;;1718:81:6;;1738:5;;1760:18;;;;;4741::10;;1745:53:6;4566:398:10;1718:81:6;1618:188;;;;:::o;8370:720::-;8450:18;8478:19;8616:4;8613:1;8606:4;8600:11;8593:4;8587;8583:15;8580:1;8573:5;8566;8561:60;8673:7;8663:176;;8717:4;8711:11;8762:16;8759:1;8754:3;8739:40;8808:16;8803:3;8796:29;8663:176;-1:-1:-1;;8916:1:6;8910:8;8866:16;;-1:-1:-1;8942:15:6;;:68;;8994:11;9009:1;8994:16;;8942:68;;;-1:-1:-1;;;;;8960:26:6;;;:31;8942:68;8938:146;;;9033:40;;;;;-1:-1:-1;;;;;801:55:10;;9033:40:6;;;783:74:10;756:18;;9033:40:6;637:226:10;14:162;-1:-1:-1;;;;;101:5:10;97:54;90:5;87:65;77:93;;166:1;163;156:12;181:269;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:39;414:5;381:39;:::i;868:180::-;927:6;980:2;968:9;959:7;955:23;951:32;948:52;;;996:1;993;986:12;948:52;-1:-1:-1;1019:23:10;;868:180;-1:-1:-1;868:180:10:o;1053:323::-;1121:6;1129;1182:2;1170:9;1161:7;1157:23;1153:32;1150:52;;;1198:1;1195;1188:12;1150:52;1237:9;1224:23;1256:39;1289:5;1256:39;:::i;:::-;1314:5;1366:2;1351:18;;;;1338:32;;-1:-1:-1;;;1053:323:10:o;2383:391::-;2460:6;2468;2476;2529:2;2517:9;2508:7;2504:23;2500:32;2497:52;;;2545:1;2542;2535:12;2497:52;2584:9;2571:23;2603:39;2636:5;2603:39;:::i;:::-;2661:5;2713:2;2698:18;;2685:32;;-1:-1:-1;2764:2:10;2749:18;;;2736:32;;2383:391;-1:-1:-1;;;2383:391:10:o;3114:184::-;3184:6;3237:2;3225:9;3216:7;3212:23;3208:32;3205:52;;;3253:1;3250;3243:12;3205:52;-1:-1:-1;3276:16:10;;3114:184;-1:-1:-1;3114:184:10:o;3897:::-;3949:77;3946:1;3939:88;4046:4;4043:1;4036:15;4070:4;4067:1;4060:15;4086:128;4153:9;;;4174:11;;;4171:37;;;4188:18;;:::i;:::-;4086:128;;;;:::o;4969:277::-;5036:6;5089:2;5077:9;5068:7;5064:23;5060:32;5057:52;;;5105:1;5102;5095:12;5057:52;5137:9;5131:16;5190:5;5183:13;5176:21;5169:5;5166:32;5156:60;;5212:1;5209;5202:12;5600:168;5673:9;;;5704;;5721:15;;;5715:22;;5701:37;5691:71;;5742:18;;:::i;5773:274::-;5813:1;5839;5829:189;;5874:77;5871:1;5864:88;5975:4;5972:1;5965:15;6003:4;6000:1;5993:15;5829:189;-1:-1:-1;6032:9:10;;5773:274::o;7149:125::-;7214:9;;;7235:10;;;7232:36;;;7248:18;;:::i;8927:259::-;8997:6;9050:2;9038:9;9029:7;9025:23;9021:32;9018:52;;;9066:1;9063;9056:12;9018:52;9098:9;9092:16;9117:39;9150:5;9117:39;:::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220fb094be55e618a2b326be9cb9c850683abaf8c7ae48d41e110708f81340d4efe64736f6c63430008140033","offset":7678}},"immutableReferences":{"877":[{"start":835,"length":32},{"start":3837,"length":32},{"start":3943,"length":32},{"start":5217,"length":32},{"start":6203,"length":32},{"start":6508,"length":32}],"880":[{"start":720,"length":32},{"start":2128,"length":32},{"start":4285,"length":32}],"882":[{"start":609,"length":32}]},"transformations":[{"id":"877","type":"replace","offset":835,"reason":"immutable"},{"id":"877","type":"replace","offset":3837,"reason":"immutable"},{"id":"877","type":"replace","offset":3943,"reason":"immutable"},{"id":"877","type":"replace","offset":5217,"reason":"immutable"},{"id":"877","type":"replace","offset":6203,"reason":"immutable"},{"id":"877","type":"replace","offset":6508,"reason":"immutable"},{"id":"880","type":"replace","offset":720,"reason":"immutable"},{"id":"880","type":"replace","offset":2128,"reason":"immutable"},{"id":"880","type":"replace","offset":4285,"reason":"immutable"},{"id":"882","type":"replace","offset":609,"reason":"immutable"}],"transformationValues":{"immutables":{"877":"0x000000000000000000000000dc035d45d973e3ec169d2276ddab16f1e407384f","880":"0x000000000000000000000000865377367054516e17014ccded1e7d814edc9ce4","882":"0x00000000000000000000000067fc21332d24fc5250a3b7fc988191ad7f38f9cc"}}},"deployment":{"transactionHash":"0x6bb8b2caeb7453676cd6819524f476d832d5f50400ea101418b5986ab949c43b","blockNumber":"23940840","transactionIndex":"201","deployer":"0xcfaD496f4e92f1f2d3fdC093Dde11Add1dc3a781"},"sources":{"src/PSM.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/interfaces/IERC4626.sol\";\nimport {PSMFed} from \"src/PSMFed.sol\";\n\ninterface IController {\n    function onBuy(address user, address to, uint256 amount) external returns (bool);\n    function onSell(address user, address to, uint256 amount) external returns (bool);\n}\n\ncontract PSM {\n    using SafeERC20 for IERC20;\n\n    IERC20 public immutable collateral;\n    IERC20 public immutable DOLA;\n    address public immutable fed; // PSMFed contract address\n\n    address public gov;\n    address public pendingGov;\n    IController public controller; // Controller contract address\n    uint256 public buyFeeBps; // e.g., 50 = 0.5%\n    uint256 public sellFeeBps; // e.g., 50 = 0.5%\n    uint256 public constant BPS_DENOMINATOR = 10_000;\n    uint256 public supply; // Collateral supplied in the PSM (excluding fees and profit)\n    IERC4626 public vault;\n    uint256 public minTotalSupply;\n\n    event GovChanged(address indexed oldGov, address indexed newGov);\n    event PendingGovUpdated(address indexed pendingGov);\n    event ControllerChanged(address indexed oldController, address indexed newController);\n    event VaultMigrated(address indexed oldVault, address indexed newVault);\n    event BuyFeeUpdated(uint256 oldFee, uint256 newFee);\n    event SellFeeUpdated(uint256 oldFee, uint256 newFee);\n    event SupplyCapUpdated(uint256 newSupplyCap);\n    event Buy(address indexed user, uint256 purchased, uint256 spent);\n    event Sell(address indexed user, uint256 sold, uint256 received);\n    event ProfitTaken(uint256 profit);\n    event MinTotalSupplyUpdated(uint256 oldMinTotalSupply, uint256 newMinTotalSupply);\n\n    constructor(address _collateral, address _vault, address _DOLA, address _gov, address _controller, address _chair) {\n        collateral = IERC20(_collateral);\n        vault = IERC4626(_vault);\n        DOLA = IERC20(_DOLA);\n        gov = _gov;\n        controller = IController(_controller);\n        fed = address(new PSMFed(address(this), _gov, _chair, _DOLA));\n        DOLA.approve(fed, type(uint256).max);\n    }\n\n    modifier onlyGov() {\n        require(msg.sender == gov, \"Not gov\");\n        _;\n    }\n\n    /**\n     * @notice Allows to buy DOLA minus fee using collateral.\n     * @param collateralAmountIn Amount of collateral to sell for DOLA.\n     */\n    function buy(uint256 collateralAmountIn) external {\n        buy(msg.sender, collateralAmountIn);\n    }\n\n    /**\n     * @notice Allows to buy DOLA minus fee using collateral.\n     * @param to DOLA receiver.\n     * @param collateralAmountIn Amount of collateral to sell for DOLA.\n     */\n    function buy(address to, uint256 collateralAmountIn) public {\n        require(collateralAmountIn > 0, \"Amount must be > 0\");\n        require(vault.totalSupply() >= minTotalSupply, \"Min total supply not met\");\n        require(controller.onBuy(msg.sender, to, collateralAmountIn), \"Denied by controller\");\n        uint256 amountOut = collateralAmountIn;\n\n        if (buyFeeBps > 0) {\n            uint256 fee = (collateralAmountIn * buyFeeBps) / BPS_DENOMINATOR;\n            amountOut -= fee;\n        }\n        supply += amountOut;\n\n        collateral.safeTransferFrom(msg.sender, address(this), collateralAmountIn);\n        collateral.approve(address(vault), collateralAmountIn);\n        uint256 shares = vault.deposit(collateralAmountIn, address(this));\n        require(shares > 0, \"Deposit failed\");\n        DOLA.safeTransfer(to, amountOut);\n        emit Buy(msg.sender, amountOut, collateralAmountIn);\n    }\n\n    /**\n     * @notice Allows to sell DOLA for collateral minus fee.\n     * @param dolaAmountIn Amount of DOLA to sell.\n     */\n    function sell(uint256 dolaAmountIn) external {\n        sell(msg.sender, dolaAmountIn);\n    }\n\n    /**\n     * @notice Allows to sell DOLA for collateral minus fee.\n     * @param to Address to receive the collateral.\n     * @param dolaAmountIn Amount of DOLA to sell.\n     */\n    function sell(address to, uint256 dolaAmountIn) public {\n        require(dolaAmountIn > 0, \"Amount must be > 0\");\n        require(controller.onSell(msg.sender, to, dolaAmountIn), \"Denied by controller\");\n        supply -= dolaAmountIn;\n        DOLA.safeTransferFrom(msg.sender, address(this), dolaAmountIn);\n\n        uint256 amountOut = dolaAmountIn;\n\n        if (sellFeeBps > 0) {\n            uint256 fee = (dolaAmountIn * sellFeeBps) / BPS_DENOMINATOR;\n            amountOut -= fee;\n        }\n\n        vault.withdraw(amountOut, to, address(this));\n        emit Sell(msg.sender, dolaAmountIn, amountOut);\n    }\n\n    /**\n     * @notice Takes profit from the vault and transfers it to the governance address.\n     * @dev Can be called by anyone to transfer profits and fees to governance.\n     */\n    function takeProfit() public {\n        uint256 profit = getProfit();\n        if (profit > 0) {\n            vault.withdraw(profit, gov, address(this));\n        }\n        emit ProfitTaken(profit);\n    }\n\n    /**\n     * @notice Returns the total collateral reserves in the vault, including profit and fees.\n     * @return Total reserves in the vault.\n     */\n    function getTotalReserves() public view returns (uint256) {\n        return vault.previewRedeem(vault.balanceOf(address(this)));\n    }\n\n    /**\n     * @notice Returns the total profit made by the PSM.\n     * @return Total profit in the PSM.\n     */\n    function getProfit() public view returns (uint256) {\n        uint256 totalReserves = getTotalReserves();\n        return totalReserves > supply ? totalReserves - supply : 0;\n    }\n\n    /**\n     * @notice Returns the amount of DOLA that can be obtained for a given amount of collateral.\n     * @param collateralIn Amount of collateral to convert to DOLA.\n     * @return Amount of DOLA that will be received after fees.\n     */\n    function getDolaOut(uint256 collateralIn) external view returns (uint256) {\n        uint256 fee = (collateralIn * buyFeeBps) / BPS_DENOMINATOR;\n        return collateralIn - fee;\n    }\n\n    /**\n     * @notice Returns the amount of collateral that can be obtained for a given amount of DOLA.\n     * @param dolaIn Amount of DOLA to convert to collateral.\n     * @return Amount of collateral that will be received after fees.\n     */\n    function getCollateralOut(uint256 dolaIn) external view returns (uint256) {\n        uint256 fee = (dolaIn * sellFeeBps) / BPS_DENOMINATOR;\n        return dolaIn - fee;\n    }\n\n    /**\n     * @notice Migrate the vault to a new IERC4626 vault.\n     * @dev Can only be called by governance and will take profit before migration.\n     * @param newVault Address of the new vault to migrate to.\n     * @param minCollateralAmount Minimum amount of collateral to be deposited in the new vault.\n     * @param minSharesOut Minimum amount of shares to receive from the new vault.\n     */\n    function migrate(address newVault, uint256 minCollateralAmount, uint256 minSharesOut) external onlyGov {\n        require(newVault != address(0), \"Zero address\");\n        require(IERC4626(newVault).asset() == address(collateral), \"New vault must accept collateral\");\n\n        takeProfit();\n\n        if (vault.balanceOf(address(this)) != 0) {\n            vault.redeem(vault.balanceOf(address(this)), address(this), address(this));\n        }\n\n        address oldVault = address(vault);\n        vault = IERC4626(newVault);\n        require(vault.totalSupply() >= minTotalSupply, \"New vault does not meet min total supply\");\n\n        uint256 collateralBalance = collateral.balanceOf(address(this));\n        require(collateralBalance >= minCollateralAmount, \"Insufficient collateral balance for migration\");\n        if (collateralBalance > 0) {\n            collateral.approve(address(vault), collateralBalance);\n            uint256 sharesOut = vault.deposit(collateralBalance, address(this));\n            require(sharesOut >= minSharesOut, \"Insufficient shares received from new vault\");\n        }\n        emit VaultMigrated(oldVault, newVault);\n    }\n\n    /**\n     * @notice Allows governance to sweep any ERC20 tokens from the contract.\n     * @dev Can only be called by governance.\n     * @param token The ERC20 token to sweep.\n     */\n    function sweep(IERC20 token) external onlyGov {\n        token.safeTransfer(gov, token.balanceOf(address(this)));\n    }\n\n    /**\n     * @notice Allows governance to set the buy fee.\n     * @dev The fee is specified in basis points (bps), where 100 bps = 1%.\n     */\n    function setBuyFeeBps(uint256 newFee) external onlyGov {\n        require(newFee <= BPS_DENOMINATOR, \"Fee too high\");\n        emit BuyFeeUpdated(buyFeeBps, newFee);\n        buyFeeBps = newFee;\n    }\n\n    /**\n     * @notice Allows governance to set the sell fee.\n     * @dev The fee is specified in basis points (bps), where 100 bps = 1%.\n     */\n    function setSellFeeBps(uint256 newFee) external onlyGov {\n        require(newFee <= BPS_DENOMINATOR, \"Fee too high\");\n        emit SellFeeUpdated(sellFeeBps, newFee);\n        sellFeeBps = newFee;\n    }\n\n    /**\n     * @notice Allows governance to set the minimum vault total supply.\n     * @dev This is used to ensure that the vault has enough shares before allowing buy operations.\n     * @param _minTotalSupply Minimum total supply that must have been already minted in the vault.\n     */\n    function setMinTotalSupply(uint256 _minTotalSupply) external onlyGov {\n        require(_minTotalSupply > 0, \"Min total supply must be > 0\");\n        emit MinTotalSupplyUpdated(minTotalSupply, _minTotalSupply);\n        minTotalSupply = _minTotalSupply;\n    }\n\n    /**\n     * @notice Allows governance to set a new pending governance.\n     * @dev The pending governance must accept the role.\n     * @param _pendingGov Address of the new pending governance.\n     */\n    function setPendingGov(address _pendingGov) external onlyGov {\n        pendingGov = _pendingGov;\n        emit PendingGovUpdated(_pendingGov);\n    }\n\n    /**\n     * @notice Allows the pending governance to claim the governance role.\n     * @dev Can only be called by the pending governance.\n     */\n    function claimPendingGov() external {\n        require(msg.sender == pendingGov, \"Not pending gov\");\n        emit GovChanged(gov, pendingGov);\n        gov = pendingGov;\n        pendingGov = address(0);\n    }\n\n    /**\n     * @notice Allows governance to set a new controller.\n     * @dev The new controller must not be the zero address.\n     * @param newController Address of the new controller.\n     */\n    function setController(address newController) external onlyGov {\n        require(newController != address(0), \"Zero address\");\n        emit ControllerChanged(address(controller), newController);\n        controller = IController(newController);\n    }\n}\n"},"lib/openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},"lib/openzeppelin/contracts/interfaces/IERC4626.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC4626.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\nimport {IERC20Metadata} from \"../token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @dev Interface of the ERC-4626 \"Tokenized Vault Standard\", as defined in\n * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].\n */\ninterface IERC4626 is IERC20, IERC20Metadata {\n    event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);\n\n    event Withdraw(\n        address indexed sender,\n        address indexed receiver,\n        address indexed owner,\n        uint256 assets,\n        uint256 shares\n    );\n\n    /**\n     * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.\n     *\n     * - MUST be an ERC-20 token contract.\n     * - MUST NOT revert.\n     */\n    function asset() external view returns (address assetTokenAddress);\n\n    /**\n     * @dev Returns the total amount of the underlying asset that is “managed” by Vault.\n     *\n     * - SHOULD include any compounding that occurs from yield.\n     * - MUST be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT revert.\n     */\n    function totalAssets() external view returns (uint256 totalManagedAssets);\n\n    /**\n     * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToShares(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToAssets(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,\n     * through a deposit call.\n     *\n     * - MUST return a limited value if receiver is subject to some deposit limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.\n     * - MUST NOT revert.\n     */\n    function maxDeposit(address receiver) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit\n     *   call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called\n     *   in the same transaction.\n     * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the\n     *   deposit would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewDeposit(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   deposit execution, and are accounted for during deposit.\n     * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function deposit(uint256 assets, address receiver) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.\n     * - MUST return a limited value if receiver is subject to some mint limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.\n     * - MUST NOT revert.\n     */\n    function maxMint(address receiver) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call\n     *   in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the\n     *   same transaction.\n     * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint\n     *   would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by minting.\n     */\n    function previewMint(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint\n     *   execution, and are accounted for during mint.\n     * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function mint(uint256 shares, address receiver) external returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the\n     * Vault, through a withdraw call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxWithdraw(address owner) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw\n     *   call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if\n     *   called\n     *   in the same transaction.\n     * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though\n     *   the withdrawal would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewWithdraw(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   withdraw execution, and are accounted for during withdraw.\n     * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,\n     * through a redeem call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxRedeem(address owner) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call\n     *   in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the\n     *   same transaction.\n     * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the\n     *   redemption would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by redeeming.\n     */\n    function previewRedeem(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   redeem execution, and are accounted for during redeem.\n     * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);\n}\n"},"src/PSMFed.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ninterface IDOLA is IERC20 {\n    function mint(address to, uint256 amount) external;\n    function burn(uint256 amount) external;\n}\n\ncontract PSMFed {\n    address public immutable psm;\n    IDOLA public immutable DOLA;\n\n    address public gov;\n    address public pendingGov;\n    address public chair;\n    uint256 public supply; // Current DOLA amount supplied to the PSM\n    uint256 public supplyCap; // Maximum DOLA supply allowed in the PSM\n\n    event GovChanged(address indexed oldGov, address indexed newGov);\n    event PendingGovUpdated(address indexed pendingGov);\n    event ChairChanged(address indexed oldChair, address indexed newChair);\n    event SupplyCapUpdated(uint256 oldSupplyCap, uint256 newSupplyCap);\n    event Expansion(uint256 amount);\n    event Contraction(uint256 amount);\n\n    constructor(address _psm, address _gov, address _chair, address _dola) {\n        psm = _psm;\n        gov = _gov;\n        chair = _chair;\n        DOLA = IDOLA(_dola);\n    }\n\n    modifier onlyGov() {\n        require(msg.sender == gov, \"Not governance\");\n        _;\n    }\n\n    modifier onlyChair() {\n        require(msg.sender == chair, \"Not chair\");\n        _;\n    }\n\n    /**\n     * @notice Allows the chair to expand the supply of DOLA in the PSM.\n     * @dev This function increases the supply of DOLA in the PSM and mints\n     * the specified amount of DOLA.\n     * @dev The amount must be greater than zero and cannot exceed the supply cap.\n     * @param amount The amount of DOLA to expand.\n     */\n    function expansion(uint256 amount) external onlyChair {\n        require(amount > 0, \"Amount must be > 0\");\n        require(amount + supply <= supplyCap, \"Supply cap exceeded\");\n        supply += amount;\n        DOLA.mint(psm, amount);\n        emit Expansion(amount);\n    }\n\n    /**\n     * @notice Allows the chair to contract the supply of DOLA in the PSM.\n     * @dev This function reduces the supply of DOLA in the PSM and burns the\n     * specified amount of DOLA.\n     * @dev The amount must be greater than zero and cannot exceed the current supply.\n     * @param amount The amount of DOLA to contract.\n     */\n    function contraction(uint256 amount) external onlyChair {\n        require(amount > 0, \"Amount must be > 0\");\n        supply -= amount;\n        DOLA.transferFrom(psm, address(this), amount);\n        DOLA.burn(amount);\n        emit Contraction(amount);\n    }\n\n    /**\n     * @notice Allows governance to set a new supply cap.\n     * @param newSupplyCap The new supply cap for DOLA in the PSM.\n     */\n    function setSupplyCap(uint256 newSupplyCap) external onlyGov {\n        uint256 oldSupplyCap = supplyCap;\n        supplyCap = newSupplyCap;\n        emit SupplyCapUpdated(oldSupplyCap, newSupplyCap);\n    }\n\n    /**\n     * @notice Allows governance to set a new chair.\n     * @dev The new chair must not be the zero address.\n     * @param newChair Address of the new chair.\n     */\n    function setChair(address newChair) external onlyGov {\n        address oldChair = chair;\n        chair = newChair;\n        emit ChairChanged(oldChair, newChair);\n    }\n\n    /**\n     * @notice Allows the current chair to resign.\n     * @dev The chair can resign, leaving the chair address as zero.\n     */\n    function resign() external onlyChair {\n        address oldChair = chair;\n        chair = address(0);\n        emit ChairChanged(oldChair, address(0));\n    }\n\n    /**\n     * @notice Allows governance to set a new pending governance.\n     * @dev The pending governance must accept the role.\n     * @param _pendingGov Address of the new pending governance.\n     */\n    function setPendingGov(address _pendingGov) external onlyGov {\n        pendingGov = _pendingGov;\n        emit PendingGovUpdated(_pendingGov);\n    }\n\n    /**\n     * @notice Allows the pending governance to claim the governance role.\n     * @dev Can only be called by the pending governance.\n     */\n    function claimPendingGov() external {\n        require(msg.sender == pendingGov, \"Not pending gov\");\n        emit GovChanged(gov, pendingGov);\n        gov = pendingGov;\n        pendingGov = address(0);\n    }\n}\n"},"lib/openzeppelin/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"lib/openzeppelin/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"lib/openzeppelin/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"lib/openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.20+commit.a1b79de6","compilerSettings":{"viaIR":false,"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"runs":10000,"enabled":true},"evmVersion":"shanghai","remappings":["@openzeppelin/contracts/=lib/openzeppelin/contracts/","forge-std/=lib/forge-std/src/","openzeppelin/=lib/openzeppelin/","solmate/=lib/solmate/src/"]},"name":"PSM","fullyQualifiedName":"src/PSM.sol:PSM"},"abi":[{"type":"constructor","inputs":[{"name":"_collateral","type":"address","internalType":"address"},{"name":"_vault","type":"address","internalType":"address"},{"name":"_DOLA","type":"address","internalType":"address"},{"name":"_gov","type":"address","internalType":"address"},{"name":"_controller","type":"address","internalType":"address"},{"name":"_chair","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"Buy","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"purchased","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"spent","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BuyFeeUpdated","type":"event","inputs":[{"name":"oldFee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newFee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ControllerChanged","type":"event","inputs":[{"name":"oldController","type":"address","indexed":true,"internalType":"address"},{"name":"newController","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"GovChanged","type":"event","inputs":[{"name":"oldGov","type":"address","indexed":true,"internalType":"address"},{"name":"newGov","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"MinTotalSupplyUpdated","type":"event","inputs":[{"name":"oldMinTotalSupply","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newMinTotalSupply","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PendingGovUpdated","type":"event","inputs":[{"name":"pendingGov","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ProfitTaken","type":"event","inputs":[{"name":"profit","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Sell","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"sold","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"received","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SellFeeUpdated","type":"event","inputs":[{"name":"oldFee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newFee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SupplyCapUpdated","type":"event","inputs":[{"name":"newSupplyCap","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"VaultMigrated","type":"event","inputs":[{"name":"oldVault","type":"address","indexed":true,"internalType":"address"},{"name":"newVault","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"BPS_DENOMINATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"DOLA","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20"}],"stateMutability":"view"},{"name":"buy","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"collateralAmountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"buy","type":"function","inputs":[{"name":"collateralAmountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"buyFeeBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claimPendingGov","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"collateral","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20"}],"stateMutability":"view"},{"name":"controller","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IController"}],"stateMutability":"view"},{"name":"fed","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getCollateralOut","type":"function","inputs":[{"name":"dolaIn","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getDolaOut","type":"function","inputs":[{"name":"collateralIn","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getProfit","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getTotalReserves","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"gov","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"migrate","type":"function","inputs":[{"name":"newVault","type":"address","internalType":"address"},{"name":"minCollateralAmount","type":"uint256","internalType":"uint256"},{"name":"minSharesOut","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"minTotalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingGov","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"sell","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"dolaAmountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sell","type":"function","inputs":[{"name":"dolaAmountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sellFeeBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"setBuyFeeBps","type":"function","inputs":[{"name":"newFee","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setController","type":"function","inputs":[{"name":"newController","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMinTotalSupply","type":"function","inputs":[{"name":"_minTotalSupply","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPendingGov","type":"function","inputs":[{"name":"_pendingGov","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setSellFeeBps","type":"function","inputs":[{"name":"newFee","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"sweep","type":"function","inputs":[{"name":"token","type":"address","internalType":"contract IERC20"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"takeProfit","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"vault","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC4626"}],"stateMutability":"view"}],"metadata":{"compiler":{"version":"0.8.20+commit.a1b79de6"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_DOLA","type":"address"},{"internalType":"address","name":"_gov","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_chair","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"purchased","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"spent","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"BuyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldController","type":"address"},{"indexed":true,"internalType":"address","name":"newController","type":"address"}],"name":"ControllerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldGov","type":"address"},{"indexed":true,"internalType":"address","name":"newGov","type":"address"}],"name":"GovChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMinTotalSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMinTotalSupply","type":"uint256"}],"name":"MinTotalSupplyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingGov","type":"address"}],"name":"PendingGovUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"ProfitTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"sold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"received","type":"uint256"}],"name":"Sell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"SellFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSupplyCap","type":"uint256"}],"name":"SupplyCapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVault","type":"address"},{"indexed":true,"internalType":"address","name":"newVault","type":"address"}],"name":"VaultMigrated","type":"event"},{"inputs":[],"name":"BPS_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOLA","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"collateralAmountIn","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collateralAmountIn","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPendingGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dolaIn","type":"uint256"}],"name":"getCollateralOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collateralIn","type":"uint256"}],"name":"getDolaOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newVault","type":"address"},{"internalType":"uint256","name":"minCollateralAmount","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"dolaAmountIn","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dolaAmountIn","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setBuyFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newController","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTotalSupply","type":"uint256"}],"name":"setMinTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingGov","type":"address"}],"name":"setPendingGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setSellFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"takeProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IERC4626","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"errors":{"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"kind":"dev","methods":{"buy(address,uint256)":{"params":{"collateralAmountIn":"Amount of collateral to sell for DOLA.","to":"DOLA receiver."}},"buy(uint256)":{"params":{"collateralAmountIn":"Amount of collateral to sell for DOLA."}},"claimPendingGov()":{"details":"Can only be called by the pending governance."},"getCollateralOut(uint256)":{"params":{"dolaIn":"Amount of DOLA to convert to collateral."},"returns":{"_0":"Amount of collateral that will be received after fees."}},"getDolaOut(uint256)":{"params":{"collateralIn":"Amount of collateral to convert to DOLA."},"returns":{"_0":"Amount of DOLA that will be received after fees."}},"getProfit()":{"returns":{"_0":"Total profit in the PSM."}},"getTotalReserves()":{"returns":{"_0":"Total reserves in the vault."}},"migrate(address,uint256,uint256)":{"details":"Can only be called by governance and will take profit before migration.","params":{"minCollateralAmount":"Minimum amount of collateral to be deposited in the new vault.","minSharesOut":"Minimum amount of shares to receive from the new vault.","newVault":"Address of the new vault to migrate to."}},"sell(address,uint256)":{"params":{"dolaAmountIn":"Amount of DOLA to sell.","to":"Address to receive the collateral."}},"sell(uint256)":{"params":{"dolaAmountIn":"Amount of DOLA to sell."}},"setBuyFeeBps(uint256)":{"details":"The fee is specified in basis points (bps), where 100 bps = 1%."},"setController(address)":{"details":"The new controller must not be the zero address.","params":{"newController":"Address of the new controller."}},"setMinTotalSupply(uint256)":{"details":"This is used to ensure that the vault has enough shares before allowing buy operations.","params":{"_minTotalSupply":"Minimum total supply that must have been already minted in the vault."}},"setPendingGov(address)":{"details":"The pending governance must accept the role.","params":{"_pendingGov":"Address of the new pending governance."}},"setSellFeeBps(uint256)":{"details":"The fee is specified in basis points (bps), where 100 bps = 1%."},"sweep(address)":{"details":"Can only be called by governance.","params":{"token":"The ERC20 token to sweep."}},"takeProfit()":{"details":"Can be called by anyone to transfer profits and fees to governance."}},"version":1},"userdoc":{"kind":"user","methods":{"buy(address,uint256)":{"notice":"Allows to buy DOLA minus fee using collateral."},"buy(uint256)":{"notice":"Allows to buy DOLA minus fee using collateral."},"claimPendingGov()":{"notice":"Allows the pending governance to claim the governance role."},"getCollateralOut(uint256)":{"notice":"Returns the amount of collateral that can be obtained for a given amount of DOLA."},"getDolaOut(uint256)":{"notice":"Returns the amount of DOLA that can be obtained for a given amount of collateral."},"getProfit()":{"notice":"Returns the total profit made by the PSM."},"getTotalReserves()":{"notice":"Returns the total collateral reserves in the vault, including profit and fees."},"migrate(address,uint256,uint256)":{"notice":"Migrate the vault to a new IERC4626 vault."},"sell(address,uint256)":{"notice":"Allows to sell DOLA for collateral minus fee."},"sell(uint256)":{"notice":"Allows to sell DOLA for collateral minus fee."},"setBuyFeeBps(uint256)":{"notice":"Allows governance to set the buy fee."},"setController(address)":{"notice":"Allows governance to set a new controller."},"setMinTotalSupply(uint256)":{"notice":"Allows governance to set the minimum vault total supply."},"setPendingGov(address)":{"notice":"Allows governance to set a new pending governance."},"setSellFeeBps(uint256)":{"notice":"Allows governance to set the sell fee."},"sweep(address)":{"notice":"Allows governance to sweep any ERC20 tokens from the contract."},"takeProfit()":{"notice":"Takes profit from the vault and transfers it to the governance address."}},"version":1}},"settings":{"compilationTarget":{"src/PSM.sol":"PSM"},"evmVersion":"shanghai","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":10000},"remappings":[":@openzeppelin/contracts/=lib/openzeppelin/contracts/",":forge-std/=lib/forge-std/src/",":openzeppelin/=lib/openzeppelin/",":solmate/=lib/solmate/src/"]},"sources":{"lib/openzeppelin/contracts/interfaces/IERC1363.sol":{"keccak256":"0x9b6b3e7803bc5f2f8cd7ad57db8ac1def61a9930a5a3107df4882e028a9605d7","license":"MIT","urls":["bzz-raw://da62d6be1f5c6edf577f0cb45666a8aa9c2086a4bac87d95d65f02e2f4c36a4b","dweb:/ipfs/QmNkpvBpoCMvX8JwAFNSc5XxJ2q5BXJpL5L1txb4QkqVFF"]},"lib/openzeppelin/contracts/interfaces/IERC165.sol":{"keccak256":"0xde7e9fd9aee8d4f40772f96bb3b58836cbc6dfc0227014a061947f8821ea9724","license":"MIT","urls":["bzz-raw://11fea9f8bc98949ac6709f0c1699db7430d2948137aa94d5a9e95a91f61a710a","dweb:/ipfs/QmQdfRXxQjwP6yn3DVo1GHPpriKNcFghSPi94Z1oKEFUNS"]},"lib/openzeppelin/contracts/interfaces/IERC20.sol":{"keccak256":"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c","license":"MIT","urls":["bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba","dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1"]},"lib/openzeppelin/contracts/interfaces/IERC4626.sol":{"keccak256":"0x7b6690c21e94a45b825631a12581b40a753ea827de5ac9127a6b5833411317f0","license":"MIT","urls":["bzz-raw://00045f2c18d7866618c65819fe180a9a9dab25c1974fab35069bdac9cf624b6b","dweb:/ipfs/QmYk62QRqGHJ3rjqfEtbfEGFHWsenv5tNMbeMfq5HkTP44"]},"lib/openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7","license":"MIT","urls":["bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db","dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"]},"lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x70f2f713b13b7ce4610bcd0ac9fec0f3cc43693b043abcb8dc40a42a726eb330","license":"MIT","urls":["bzz-raw://c13d13304ac79a83ab1c30168967d19e2203342ebbd6a9bbce4db7550522dcbf","dweb:/ipfs/QmeN5jKMN2vw5bhacr6tkg78afbTTZUeaacNHqjWt4Ew1r"]},"lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5","license":"MIT","urls":["bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508","dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB"]},"lib/openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8","license":"MIT","urls":["bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621","dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL"]},"src/PSM.sol":{"keccak256":"0xde85555fa934b7c0c7a94227e2b2cbf362566fdc362ba79cdd32ef5f1de9958d","license":"MIT","urls":["bzz-raw://7b27c2bf6b2964640ce76b2cc3fdb400dcf69b1fbb529f5e4b2b1d543e42847d","dweb:/ipfs/QmNP9FjPqsc8oVeFqM6Aix8kSS1GFG3bHZH8B2yf2XKnWR"]},"src/PSMFed.sol":{"keccak256":"0x354957fc64195780f762cb4ee86bc807238c5a4bc523440e5359c5cf7e6ebd4e","license":"MIT","urls":["bzz-raw://8f747e3bdfe4f230c9242a8595a2a555cf7fb3848198f22a721c8427cfc24baf","dweb:/ipfs/QmZFg7UVcQxfr5Fs8avtvbTABBvDGxeEFcpqmp4bXRDfER"]}},"version":1},"storageLayout":{"types":{"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_contract(IERC4626)259":{"label":"contract IERC4626","encoding":"inplace","numberOfBytes":"20"},"t_contract(IController)870":{"label":"contract IController","encoding":"inplace","numberOfBytes":"20"}},"storage":[{"slot":"0","type":"t_address","astId":884,"label":"gov","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"1","type":"t_address","astId":886,"label":"pendingGov","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"2","type":"t_contract(IController)870","astId":889,"label":"controller","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"3","type":"t_uint256","astId":891,"label":"buyFeeBps","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"4","type":"t_uint256","astId":893,"label":"sellFeeBps","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"5","type":"t_uint256","astId":898,"label":"supply","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"6","type":"t_contract(IERC4626)259","astId":901,"label":"vault","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"7","type":"t_uint256","astId":903,"label":"minTotalSupply","offset":0,"contract":"src/PSM.sol:PSM"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","methods":{"getProfit()":{"notice":"Returns the total profit made by the PSM."},"buy(uint256)":{"notice":"Allows to buy DOLA minus fee using collateral."},"takeProfit()":{"notice":"Takes profit from the vault and transfers it to the governance address."},"sell(uint256)":{"notice":"Allows to sell DOLA for collateral minus fee."},"sweep(address)":{"notice":"Allows governance to sweep any ERC20 tokens from the contract."},"claimPendingGov()":{"notice":"Allows the pending governance to claim the governance role."},"getTotalReserves()":{"notice":"Returns the total collateral reserves in the vault, including profit and fees."},"getDolaOut(uint256)":{"notice":"Returns the amount of DOLA that can be obtained for a given amount of collateral."},"buy(address,uint256)":{"notice":"Allows to buy DOLA minus fee using collateral."},"sell(address,uint256)":{"notice":"Allows to sell DOLA for collateral minus fee."},"setBuyFeeBps(uint256)":{"notice":"Allows governance to set the buy fee."},"setController(address)":{"notice":"Allows governance to set a new controller."},"setPendingGov(address)":{"notice":"Allows governance to set a new pending governance."},"setSellFeeBps(uint256)":{"notice":"Allows governance to set the sell fee."},"getCollateralOut(uint256)":{"notice":"Returns the amount of collateral that can be obtained for a given amount of DOLA."},"setMinTotalSupply(uint256)":{"notice":"Allows governance to set the minimum vault total supply."},"migrate(address,uint256,uint256)":{"notice":"Migrate the vault to a new IERC4626 vault."}},"version":1},"devdoc":{"kind":"dev","errors":{"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"methods":{"getProfit()":{"returns":{"_0":"Total profit in the PSM."}},"buy(uint256)":{"params":{"collateralAmountIn":"Amount of collateral to sell for DOLA."}},"takeProfit()":{"details":"Can be called by anyone to transfer profits and fees to governance."},"sell(uint256)":{"params":{"dolaAmountIn":"Amount of DOLA to sell."}},"sweep(address)":{"params":{"token":"The ERC20 token to sweep."},"details":"Can only be called by governance."},"claimPendingGov()":{"details":"Can only be called by the pending governance."},"getTotalReserves()":{"returns":{"_0":"Total reserves in the vault."}},"getDolaOut(uint256)":{"params":{"collateralIn":"Amount of collateral to convert to DOLA."},"returns":{"_0":"Amount of DOLA that will be received after fees."}},"buy(address,uint256)":{"params":{"to":"DOLA receiver.","collateralAmountIn":"Amount of collateral to sell for DOLA."}},"sell(address,uint256)":{"params":{"to":"Address to receive the collateral.","dolaAmountIn":"Amount of DOLA to sell."}},"setBuyFeeBps(uint256)":{"details":"The fee is specified in basis points (bps), where 100 bps = 1%."},"setController(address)":{"params":{"newController":"Address of the new controller."},"details":"The new controller must not be the zero address."},"setPendingGov(address)":{"params":{"_pendingGov":"Address of the new pending governance."},"details":"The pending governance must accept the role."},"setSellFeeBps(uint256)":{"details":"The fee is specified in basis points (bps), where 100 bps = 1%."},"getCollateralOut(uint256)":{"params":{"dolaIn":"Amount of DOLA to convert to collateral."},"returns":{"_0":"Amount of collateral that will be received after fees."}},"setMinTotalSupply(uint256)":{"params":{"_minTotalSupply":"Minimum total supply that must have been already minted in the vault."},"details":"This is used to ensure that the vault has enough shares before allowing buy operations."},"migrate(address,uint256,uint256)":{"params":{"newVault":"Address of the new vault to migrate to.","minSharesOut":"Minimum amount of shares to receive from the new vault.","minCollateralAmount":"Minimum amount of collateral to be deposited in the new vault."},"details":"Can only be called by governance and will take profit before migration."}},"version":1},"sourceIds":{"src/PSM.sol":{"id":8},"src/PSMFed.sol":{"id":9},"lib/openzeppelin/contracts/interfaces/IERC20.sol":{"id":2},"lib/openzeppelin/contracts/interfaces/IERC165.sol":{"id":1},"lib/openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":4},"lib/openzeppelin/contracts/interfaces/IERC1363.sol":{"id":0},"lib/openzeppelin/contracts/interfaces/IERC4626.sol":{"id":3},"lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":6},"lib/openzeppelin/contracts/utils/introspection/IERC165.sol":{"id":7},"lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":5}},"additionalInput":null,"stdJsonInput":{"sources":{"src/PSM.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport \"@openzeppelin/contracts/interfaces/IERC4626.sol\";\nimport {PSMFed} from \"src/PSMFed.sol\";\n\ninterface IController {\n    function onBuy(address user, address to, uint256 amount) external returns (bool);\n    function onSell(address user, address to, uint256 amount) external returns (bool);\n}\n\ncontract PSM {\n    using SafeERC20 for IERC20;\n\n    IERC20 public immutable collateral;\n    IERC20 public immutable DOLA;\n    address public immutable fed; // PSMFed contract address\n\n    address public gov;\n    address public pendingGov;\n    IController public controller; // Controller contract address\n    uint256 public buyFeeBps; // e.g., 50 = 0.5%\n    uint256 public sellFeeBps; // e.g., 50 = 0.5%\n    uint256 public constant BPS_DENOMINATOR = 10_000;\n    uint256 public supply; // Collateral supplied in the PSM (excluding fees and profit)\n    IERC4626 public vault;\n    uint256 public minTotalSupply;\n\n    event GovChanged(address indexed oldGov, address indexed newGov);\n    event PendingGovUpdated(address indexed pendingGov);\n    event ControllerChanged(address indexed oldController, address indexed newController);\n    event VaultMigrated(address indexed oldVault, address indexed newVault);\n    event BuyFeeUpdated(uint256 oldFee, uint256 newFee);\n    event SellFeeUpdated(uint256 oldFee, uint256 newFee);\n    event SupplyCapUpdated(uint256 newSupplyCap);\n    event Buy(address indexed user, uint256 purchased, uint256 spent);\n    event Sell(address indexed user, uint256 sold, uint256 received);\n    event ProfitTaken(uint256 profit);\n    event MinTotalSupplyUpdated(uint256 oldMinTotalSupply, uint256 newMinTotalSupply);\n\n    constructor(address _collateral, address _vault, address _DOLA, address _gov, address _controller, address _chair) {\n        collateral = IERC20(_collateral);\n        vault = IERC4626(_vault);\n        DOLA = IERC20(_DOLA);\n        gov = _gov;\n        controller = IController(_controller);\n        fed = address(new PSMFed(address(this), _gov, _chair, _DOLA));\n        DOLA.approve(fed, type(uint256).max);\n    }\n\n    modifier onlyGov() {\n        require(msg.sender == gov, \"Not gov\");\n        _;\n    }\n\n    /**\n     * @notice Allows to buy DOLA minus fee using collateral.\n     * @param collateralAmountIn Amount of collateral to sell for DOLA.\n     */\n    function buy(uint256 collateralAmountIn) external {\n        buy(msg.sender, collateralAmountIn);\n    }\n\n    /**\n     * @notice Allows to buy DOLA minus fee using collateral.\n     * @param to DOLA receiver.\n     * @param collateralAmountIn Amount of collateral to sell for DOLA.\n     */\n    function buy(address to, uint256 collateralAmountIn) public {\n        require(collateralAmountIn > 0, \"Amount must be > 0\");\n        require(vault.totalSupply() >= minTotalSupply, \"Min total supply not met\");\n        require(controller.onBuy(msg.sender, to, collateralAmountIn), \"Denied by controller\");\n        uint256 amountOut = collateralAmountIn;\n\n        if (buyFeeBps > 0) {\n            uint256 fee = (collateralAmountIn * buyFeeBps) / BPS_DENOMINATOR;\n            amountOut -= fee;\n        }\n        supply += amountOut;\n\n        collateral.safeTransferFrom(msg.sender, address(this), collateralAmountIn);\n        collateral.approve(address(vault), collateralAmountIn);\n        uint256 shares = vault.deposit(collateralAmountIn, address(this));\n        require(shares > 0, \"Deposit failed\");\n        DOLA.safeTransfer(to, amountOut);\n        emit Buy(msg.sender, amountOut, collateralAmountIn);\n    }\n\n    /**\n     * @notice Allows to sell DOLA for collateral minus fee.\n     * @param dolaAmountIn Amount of DOLA to sell.\n     */\n    function sell(uint256 dolaAmountIn) external {\n        sell(msg.sender, dolaAmountIn);\n    }\n\n    /**\n     * @notice Allows to sell DOLA for collateral minus fee.\n     * @param to Address to receive the collateral.\n     * @param dolaAmountIn Amount of DOLA to sell.\n     */\n    function sell(address to, uint256 dolaAmountIn) public {\n        require(dolaAmountIn > 0, \"Amount must be > 0\");\n        require(controller.onSell(msg.sender, to, dolaAmountIn), \"Denied by controller\");\n        supply -= dolaAmountIn;\n        DOLA.safeTransferFrom(msg.sender, address(this), dolaAmountIn);\n\n        uint256 amountOut = dolaAmountIn;\n\n        if (sellFeeBps > 0) {\n            uint256 fee = (dolaAmountIn * sellFeeBps) / BPS_DENOMINATOR;\n            amountOut -= fee;\n        }\n\n        vault.withdraw(amountOut, to, address(this));\n        emit Sell(msg.sender, dolaAmountIn, amountOut);\n    }\n\n    /**\n     * @notice Takes profit from the vault and transfers it to the governance address.\n     * @dev Can be called by anyone to transfer profits and fees to governance.\n     */\n    function takeProfit() public {\n        uint256 profit = getProfit();\n        if (profit > 0) {\n            vault.withdraw(profit, gov, address(this));\n        }\n        emit ProfitTaken(profit);\n    }\n\n    /**\n     * @notice Returns the total collateral reserves in the vault, including profit and fees.\n     * @return Total reserves in the vault.\n     */\n    function getTotalReserves() public view returns (uint256) {\n        return vault.previewRedeem(vault.balanceOf(address(this)));\n    }\n\n    /**\n     * @notice Returns the total profit made by the PSM.\n     * @return Total profit in the PSM.\n     */\n    function getProfit() public view returns (uint256) {\n        uint256 totalReserves = getTotalReserves();\n        return totalReserves > supply ? totalReserves - supply : 0;\n    }\n\n    /**\n     * @notice Returns the amount of DOLA that can be obtained for a given amount of collateral.\n     * @param collateralIn Amount of collateral to convert to DOLA.\n     * @return Amount of DOLA that will be received after fees.\n     */\n    function getDolaOut(uint256 collateralIn) external view returns (uint256) {\n        uint256 fee = (collateralIn * buyFeeBps) / BPS_DENOMINATOR;\n        return collateralIn - fee;\n    }\n\n    /**\n     * @notice Returns the amount of collateral that can be obtained for a given amount of DOLA.\n     * @param dolaIn Amount of DOLA to convert to collateral.\n     * @return Amount of collateral that will be received after fees.\n     */\n    function getCollateralOut(uint256 dolaIn) external view returns (uint256) {\n        uint256 fee = (dolaIn * sellFeeBps) / BPS_DENOMINATOR;\n        return dolaIn - fee;\n    }\n\n    /**\n     * @notice Migrate the vault to a new IERC4626 vault.\n     * @dev Can only be called by governance and will take profit before migration.\n     * @param newVault Address of the new vault to migrate to.\n     * @param minCollateralAmount Minimum amount of collateral to be deposited in the new vault.\n     * @param minSharesOut Minimum amount of shares to receive from the new vault.\n     */\n    function migrate(address newVault, uint256 minCollateralAmount, uint256 minSharesOut) external onlyGov {\n        require(newVault != address(0), \"Zero address\");\n        require(IERC4626(newVault).asset() == address(collateral), \"New vault must accept collateral\");\n\n        takeProfit();\n\n        if (vault.balanceOf(address(this)) != 0) {\n            vault.redeem(vault.balanceOf(address(this)), address(this), address(this));\n        }\n\n        address oldVault = address(vault);\n        vault = IERC4626(newVault);\n        require(vault.totalSupply() >= minTotalSupply, \"New vault does not meet min total supply\");\n\n        uint256 collateralBalance = collateral.balanceOf(address(this));\n        require(collateralBalance >= minCollateralAmount, \"Insufficient collateral balance for migration\");\n        if (collateralBalance > 0) {\n            collateral.approve(address(vault), collateralBalance);\n            uint256 sharesOut = vault.deposit(collateralBalance, address(this));\n            require(sharesOut >= minSharesOut, \"Insufficient shares received from new vault\");\n        }\n        emit VaultMigrated(oldVault, newVault);\n    }\n\n    /**\n     * @notice Allows governance to sweep any ERC20 tokens from the contract.\n     * @dev Can only be called by governance.\n     * @param token The ERC20 token to sweep.\n     */\n    function sweep(IERC20 token) external onlyGov {\n        token.safeTransfer(gov, token.balanceOf(address(this)));\n    }\n\n    /**\n     * @notice Allows governance to set the buy fee.\n     * @dev The fee is specified in basis points (bps), where 100 bps = 1%.\n     */\n    function setBuyFeeBps(uint256 newFee) external onlyGov {\n        require(newFee <= BPS_DENOMINATOR, \"Fee too high\");\n        emit BuyFeeUpdated(buyFeeBps, newFee);\n        buyFeeBps = newFee;\n    }\n\n    /**\n     * @notice Allows governance to set the sell fee.\n     * @dev The fee is specified in basis points (bps), where 100 bps = 1%.\n     */\n    function setSellFeeBps(uint256 newFee) external onlyGov {\n        require(newFee <= BPS_DENOMINATOR, \"Fee too high\");\n        emit SellFeeUpdated(sellFeeBps, newFee);\n        sellFeeBps = newFee;\n    }\n\n    /**\n     * @notice Allows governance to set the minimum vault total supply.\n     * @dev This is used to ensure that the vault has enough shares before allowing buy operations.\n     * @param _minTotalSupply Minimum total supply that must have been already minted in the vault.\n     */\n    function setMinTotalSupply(uint256 _minTotalSupply) external onlyGov {\n        require(_minTotalSupply > 0, \"Min total supply must be > 0\");\n        emit MinTotalSupplyUpdated(minTotalSupply, _minTotalSupply);\n        minTotalSupply = _minTotalSupply;\n    }\n\n    /**\n     * @notice Allows governance to set a new pending governance.\n     * @dev The pending governance must accept the role.\n     * @param _pendingGov Address of the new pending governance.\n     */\n    function setPendingGov(address _pendingGov) external onlyGov {\n        pendingGov = _pendingGov;\n        emit PendingGovUpdated(_pendingGov);\n    }\n\n    /**\n     * @notice Allows the pending governance to claim the governance role.\n     * @dev Can only be called by the pending governance.\n     */\n    function claimPendingGov() external {\n        require(msg.sender == pendingGov, \"Not pending gov\");\n        emit GovChanged(gov, pendingGov);\n        gov = pendingGov;\n        pendingGov = address(0);\n    }\n\n    /**\n     * @notice Allows governance to set a new controller.\n     * @dev The new controller must not be the zero address.\n     * @param newController Address of the new controller.\n     */\n    function setController(address newController) external onlyGov {\n        require(newController != address(0), \"Zero address\");\n        emit ControllerChanged(address(controller), newController);\n        controller = IController(newController);\n    }\n}\n"},"src/PSMFed.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\ninterface IDOLA is IERC20 {\n    function mint(address to, uint256 amount) external;\n    function burn(uint256 amount) external;\n}\n\ncontract PSMFed {\n    address public immutable psm;\n    IDOLA public immutable DOLA;\n\n    address public gov;\n    address public pendingGov;\n    address public chair;\n    uint256 public supply; // Current DOLA amount supplied to the PSM\n    uint256 public supplyCap; // Maximum DOLA supply allowed in the PSM\n\n    event GovChanged(address indexed oldGov, address indexed newGov);\n    event PendingGovUpdated(address indexed pendingGov);\n    event ChairChanged(address indexed oldChair, address indexed newChair);\n    event SupplyCapUpdated(uint256 oldSupplyCap, uint256 newSupplyCap);\n    event Expansion(uint256 amount);\n    event Contraction(uint256 amount);\n\n    constructor(address _psm, address _gov, address _chair, address _dola) {\n        psm = _psm;\n        gov = _gov;\n        chair = _chair;\n        DOLA = IDOLA(_dola);\n    }\n\n    modifier onlyGov() {\n        require(msg.sender == gov, \"Not governance\");\n        _;\n    }\n\n    modifier onlyChair() {\n        require(msg.sender == chair, \"Not chair\");\n        _;\n    }\n\n    /**\n     * @notice Allows the chair to expand the supply of DOLA in the PSM.\n     * @dev This function increases the supply of DOLA in the PSM and mints\n     * the specified amount of DOLA.\n     * @dev The amount must be greater than zero and cannot exceed the supply cap.\n     * @param amount The amount of DOLA to expand.\n     */\n    function expansion(uint256 amount) external onlyChair {\n        require(amount > 0, \"Amount must be > 0\");\n        require(amount + supply <= supplyCap, \"Supply cap exceeded\");\n        supply += amount;\n        DOLA.mint(psm, amount);\n        emit Expansion(amount);\n    }\n\n    /**\n     * @notice Allows the chair to contract the supply of DOLA in the PSM.\n     * @dev This function reduces the supply of DOLA in the PSM and burns the\n     * specified amount of DOLA.\n     * @dev The amount must be greater than zero and cannot exceed the current supply.\n     * @param amount The amount of DOLA to contract.\n     */\n    function contraction(uint256 amount) external onlyChair {\n        require(amount > 0, \"Amount must be > 0\");\n        supply -= amount;\n        DOLA.transferFrom(psm, address(this), amount);\n        DOLA.burn(amount);\n        emit Contraction(amount);\n    }\n\n    /**\n     * @notice Allows governance to set a new supply cap.\n     * @param newSupplyCap The new supply cap for DOLA in the PSM.\n     */\n    function setSupplyCap(uint256 newSupplyCap) external onlyGov {\n        uint256 oldSupplyCap = supplyCap;\n        supplyCap = newSupplyCap;\n        emit SupplyCapUpdated(oldSupplyCap, newSupplyCap);\n    }\n\n    /**\n     * @notice Allows governance to set a new chair.\n     * @dev The new chair must not be the zero address.\n     * @param newChair Address of the new chair.\n     */\n    function setChair(address newChair) external onlyGov {\n        address oldChair = chair;\n        chair = newChair;\n        emit ChairChanged(oldChair, newChair);\n    }\n\n    /**\n     * @notice Allows the current chair to resign.\n     * @dev The chair can resign, leaving the chair address as zero.\n     */\n    function resign() external onlyChair {\n        address oldChair = chair;\n        chair = address(0);\n        emit ChairChanged(oldChair, address(0));\n    }\n\n    /**\n     * @notice Allows governance to set a new pending governance.\n     * @dev The pending governance must accept the role.\n     * @param _pendingGov Address of the new pending governance.\n     */\n    function setPendingGov(address _pendingGov) external onlyGov {\n        pendingGov = _pendingGov;\n        emit PendingGovUpdated(_pendingGov);\n    }\n\n    /**\n     * @notice Allows the pending governance to claim the governance role.\n     * @dev Can only be called by the pending governance.\n     */\n    function claimPendingGov() external {\n        require(msg.sender == pendingGov, \"Not pending gov\");\n        emit GovChanged(gov, pendingGov);\n        gov = pendingGov;\n        pendingGov = address(0);\n    }\n}\n"},"lib/openzeppelin/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"lib/openzeppelin/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"lib/openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"lib/openzeppelin/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"lib/openzeppelin/contracts/interfaces/IERC4626.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (interfaces/IERC4626.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\nimport {IERC20Metadata} from \"../token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @dev Interface of the ERC-4626 \"Tokenized Vault Standard\", as defined in\n * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].\n */\ninterface IERC4626 is IERC20, IERC20Metadata {\n    event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);\n\n    event Withdraw(\n        address indexed sender,\n        address indexed receiver,\n        address indexed owner,\n        uint256 assets,\n        uint256 shares\n    );\n\n    /**\n     * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.\n     *\n     * - MUST be an ERC-20 token contract.\n     * - MUST NOT revert.\n     */\n    function asset() external view returns (address assetTokenAddress);\n\n    /**\n     * @dev Returns the total amount of the underlying asset that is “managed” by Vault.\n     *\n     * - SHOULD include any compounding that occurs from yield.\n     * - MUST be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT revert.\n     */\n    function totalAssets() external view returns (uint256 totalManagedAssets);\n\n    /**\n     * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToShares(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal\n     * scenario where all the conditions are met.\n     *\n     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     * - MUST NOT show any variations depending on the caller.\n     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.\n     * - MUST NOT revert.\n     *\n     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the\n     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and\n     * from.\n     */\n    function convertToAssets(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,\n     * through a deposit call.\n     *\n     * - MUST return a limited value if receiver is subject to some deposit limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.\n     * - MUST NOT revert.\n     */\n    function maxDeposit(address receiver) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit\n     *   call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called\n     *   in the same transaction.\n     * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the\n     *   deposit would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewDeposit(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   deposit execution, and are accounted for during deposit.\n     * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function deposit(uint256 assets, address receiver) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.\n     * - MUST return a limited value if receiver is subject to some mint limit.\n     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.\n     * - MUST NOT revert.\n     */\n    function maxMint(address receiver) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given\n     * current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call\n     *   in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the\n     *   same transaction.\n     * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint\n     *   would be accepted, regardless if the user has enough tokens approved, etc.\n     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by minting.\n     */\n    function previewMint(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.\n     *\n     * - MUST emit the Deposit event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint\n     *   execution, and are accounted for during mint.\n     * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not\n     *   approving enough underlying tokens to the Vault contract, etc).\n     *\n     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.\n     */\n    function mint(uint256 shares, address receiver) external returns (uint256 assets);\n\n    /**\n     * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the\n     * Vault, through a withdraw call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxWithdraw(address owner) external view returns (uint256 maxAssets);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw\n     *   call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if\n     *   called\n     *   in the same transaction.\n     * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though\n     *   the withdrawal would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by depositing.\n     */\n    function previewWithdraw(uint256 assets) external view returns (uint256 shares);\n\n    /**\n     * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   withdraw execution, and are accounted for during withdraw.\n     * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);\n\n    /**\n     * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,\n     * through a redeem call.\n     *\n     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.\n     * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.\n     * - MUST NOT revert.\n     */\n    function maxRedeem(address owner) external view returns (uint256 maxShares);\n\n    /**\n     * @dev Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block,\n     * given current on-chain conditions.\n     *\n     * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call\n     *   in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the\n     *   same transaction.\n     * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the\n     *   redemption would be accepted, regardless if the user has enough shares, etc.\n     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.\n     * - MUST NOT revert.\n     *\n     * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in\n     * share price or some other type of condition, meaning the depositor will lose assets by redeeming.\n     */\n    function previewRedeem(uint256 shares) external view returns (uint256 assets);\n\n    /**\n     * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.\n     *\n     * - MUST emit the Withdraw event.\n     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the\n     *   redeem execution, and are accounted for during redeem.\n     * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner\n     *   not having enough shares, etc).\n     *\n     * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.\n     * Those methods should be performed separately.\n     */\n    function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);\n}\n"},"lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},"lib/openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"}},"language":"Solidity","settings":{"viaIR":false,"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"runs":10000,"enabled":true},"evmVersion":"shanghai","remappings":["@openzeppelin/contracts/=lib/openzeppelin/contracts/","forge-std/=lib/forge-std/src/","openzeppelin/=lib/openzeppelin/","solmate/=lib/solmate/src/"]}},"stdJsonOutput":{"sources":{"src/PSM.sol":{"id":8},"src/PSMFed.sol":{"id":9},"lib/openzeppelin/contracts/interfaces/IERC20.sol":{"id":2},"lib/openzeppelin/contracts/interfaces/IERC165.sol":{"id":1},"lib/openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":4},"lib/openzeppelin/contracts/interfaces/IERC1363.sol":{"id":0},"lib/openzeppelin/contracts/interfaces/IERC4626.sol":{"id":3},"lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":6},"lib/openzeppelin/contracts/utils/introspection/IERC165.sol":{"id":7},"lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":5}},"contracts":{"src/PSM.sol":{"PSM":{"abi":[{"type":"constructor","inputs":[{"name":"_collateral","type":"address","internalType":"address"},{"name":"_vault","type":"address","internalType":"address"},{"name":"_DOLA","type":"address","internalType":"address"},{"name":"_gov","type":"address","internalType":"address"},{"name":"_controller","type":"address","internalType":"address"},{"name":"_chair","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"Buy","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"purchased","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"spent","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"BuyFeeUpdated","type":"event","inputs":[{"name":"oldFee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newFee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"ControllerChanged","type":"event","inputs":[{"name":"oldController","type":"address","indexed":true,"internalType":"address"},{"name":"newController","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"GovChanged","type":"event","inputs":[{"name":"oldGov","type":"address","indexed":true,"internalType":"address"},{"name":"newGov","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"MinTotalSupplyUpdated","type":"event","inputs":[{"name":"oldMinTotalSupply","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newMinTotalSupply","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"PendingGovUpdated","type":"event","inputs":[{"name":"pendingGov","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ProfitTaken","type":"event","inputs":[{"name":"profit","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Sell","type":"event","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"sold","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"received","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SellFeeUpdated","type":"event","inputs":[{"name":"oldFee","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newFee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SupplyCapUpdated","type":"event","inputs":[{"name":"newSupplyCap","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"VaultMigrated","type":"event","inputs":[{"name":"oldVault","type":"address","indexed":true,"internalType":"address"},{"name":"newVault","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"BPS_DENOMINATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"DOLA","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20"}],"stateMutability":"view"},{"name":"buy","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"collateralAmountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"buy","type":"function","inputs":[{"name":"collateralAmountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"buyFeeBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"claimPendingGov","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"collateral","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20"}],"stateMutability":"view"},{"name":"controller","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IController"}],"stateMutability":"view"},{"name":"fed","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getCollateralOut","type":"function","inputs":[{"name":"dolaIn","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getDolaOut","type":"function","inputs":[{"name":"collateralIn","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getProfit","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getTotalReserves","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"gov","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"migrate","type":"function","inputs":[{"name":"newVault","type":"address","internalType":"address"},{"name":"minCollateralAmount","type":"uint256","internalType":"uint256"},{"name":"minSharesOut","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"minTotalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"pendingGov","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"sell","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"dolaAmountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sell","type":"function","inputs":[{"name":"dolaAmountIn","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"sellFeeBps","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"setBuyFeeBps","type":"function","inputs":[{"name":"newFee","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setController","type":"function","inputs":[{"name":"newController","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setMinTotalSupply","type":"function","inputs":[{"name":"_minTotalSupply","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setPendingGov","type":"function","inputs":[{"name":"_pendingGov","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setSellFeeBps","type":"function","inputs":[{"name":"newFee","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"supply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"sweep","type":"function","inputs":[{"name":"token","type":"address","internalType":"contract IERC20"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"takeProfit","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"vault","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC4626"}],"stateMutability":"view"}],"metadata":"{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_collateral\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_vault\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_DOLA\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_gov\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_controller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_chair\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"purchased\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"spent\",\"type\":\"uint256\"}],\"name\":\"Buy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newFee\",\"type\":\"uint256\"}],\"name\":\"BuyFeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldController\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newController\",\"type\":\"address\"}],\"name\":\"ControllerChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldGov\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newGov\",\"type\":\"address\"}],\"name\":\"GovChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMinTotalSupply\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMinTotalSupply\",\"type\":\"uint256\"}],\"name\":\"MinTotalSupplyUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingGov\",\"type\":\"address\"}],\"name\":\"PendingGovUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"profit\",\"type\":\"uint256\"}],\"name\":\"ProfitTaken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"sold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"received\",\"type\":\"uint256\"}],\"name\":\"Sell\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newFee\",\"type\":\"uint256\"}],\"name\":\"SellFeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newSupplyCap\",\"type\":\"uint256\"}],\"name\":\"SupplyCapUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVault\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVault\",\"type\":\"address\"}],\"name\":\"VaultMigrated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BPS_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOLA\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmountIn\",\"type\":\"uint256\"}],\"name\":\"buy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralAmountIn\",\"type\":\"uint256\"}],\"name\":\"buy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"buyFeeBps\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimPendingGov\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"collateral\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"internalType\":\"contract IController\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fed\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"dolaIn\",\"type\":\"uint256\"}],\"name\":\"getCollateralOut\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralIn\",\"type\":\"uint256\"}],\"name\":\"getDolaOut\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProfit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalReserves\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gov\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newVault\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minCollateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSharesOut\",\"type\":\"uint256\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingGov\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"dolaAmountIn\",\"type\":\"uint256\"}],\"name\":\"sell\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"dolaAmountIn\",\"type\":\"uint256\"}],\"name\":\"sell\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sellFeeBps\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newFee\",\"type\":\"uint256\"}],\"name\":\"setBuyFeeBps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newController\",\"type\":\"address\"}],\"name\":\"setController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minTotalSupply\",\"type\":\"uint256\"}],\"name\":\"setMinTotalSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_pendingGov\",\"type\":\"address\"}],\"name\":\"setPendingGov\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newFee\",\"type\":\"uint256\"}],\"name\":\"setSellFeeBps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"sweep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"takeProfit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vault\",\"outputs\":[{\"internalType\":\"contract IERC4626\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"kind\":\"dev\",\"methods\":{\"buy(address,uint256)\":{\"params\":{\"collateralAmountIn\":\"Amount of collateral to sell for DOLA.\",\"to\":\"DOLA receiver.\"}},\"buy(uint256)\":{\"params\":{\"collateralAmountIn\":\"Amount of collateral to sell for DOLA.\"}},\"claimPendingGov()\":{\"details\":\"Can only be called by the pending governance.\"},\"getCollateralOut(uint256)\":{\"params\":{\"dolaIn\":\"Amount of DOLA to convert to collateral.\"},\"returns\":{\"_0\":\"Amount of collateral that will be received after fees.\"}},\"getDolaOut(uint256)\":{\"params\":{\"collateralIn\":\"Amount of collateral to convert to DOLA.\"},\"returns\":{\"_0\":\"Amount of DOLA that will be received after fees.\"}},\"getProfit()\":{\"returns\":{\"_0\":\"Total profit in the PSM.\"}},\"getTotalReserves()\":{\"returns\":{\"_0\":\"Total reserves in the vault.\"}},\"migrate(address,uint256,uint256)\":{\"details\":\"Can only be called by governance and will take profit before migration.\",\"params\":{\"minCollateralAmount\":\"Minimum amount of collateral to be deposited in the new vault.\",\"minSharesOut\":\"Minimum amount of shares to receive from the new vault.\",\"newVault\":\"Address of the new vault to migrate to.\"}},\"sell(address,uint256)\":{\"params\":{\"dolaAmountIn\":\"Amount of DOLA to sell.\",\"to\":\"Address to receive the collateral.\"}},\"sell(uint256)\":{\"params\":{\"dolaAmountIn\":\"Amount of DOLA to sell.\"}},\"setBuyFeeBps(uint256)\":{\"details\":\"The fee is specified in basis points (bps), where 100 bps = 1%.\"},\"setController(address)\":{\"details\":\"The new controller must not be the zero address.\",\"params\":{\"newController\":\"Address of the new controller.\"}},\"setMinTotalSupply(uint256)\":{\"details\":\"This is used to ensure that the vault has enough shares before allowing buy operations.\",\"params\":{\"_minTotalSupply\":\"Minimum total supply that must have been already minted in the vault.\"}},\"setPendingGov(address)\":{\"details\":\"The pending governance must accept the role.\",\"params\":{\"_pendingGov\":\"Address of the new pending governance.\"}},\"setSellFeeBps(uint256)\":{\"details\":\"The fee is specified in basis points (bps), where 100 bps = 1%.\"},\"sweep(address)\":{\"details\":\"Can only be called by governance.\",\"params\":{\"token\":\"The ERC20 token to sweep.\"}},\"takeProfit()\":{\"details\":\"Can be called by anyone to transfer profits and fees to governance.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"buy(address,uint256)\":{\"notice\":\"Allows to buy DOLA minus fee using collateral.\"},\"buy(uint256)\":{\"notice\":\"Allows to buy DOLA minus fee using collateral.\"},\"claimPendingGov()\":{\"notice\":\"Allows the pending governance to claim the governance role.\"},\"getCollateralOut(uint256)\":{\"notice\":\"Returns the amount of collateral that can be obtained for a given amount of DOLA.\"},\"getDolaOut(uint256)\":{\"notice\":\"Returns the amount of DOLA that can be obtained for a given amount of collateral.\"},\"getProfit()\":{\"notice\":\"Returns the total profit made by the PSM.\"},\"getTotalReserves()\":{\"notice\":\"Returns the total collateral reserves in the vault, including profit and fees.\"},\"migrate(address,uint256,uint256)\":{\"notice\":\"Migrate the vault to a new IERC4626 vault.\"},\"sell(address,uint256)\":{\"notice\":\"Allows to sell DOLA for collateral minus fee.\"},\"sell(uint256)\":{\"notice\":\"Allows to sell DOLA for collateral minus fee.\"},\"setBuyFeeBps(uint256)\":{\"notice\":\"Allows governance to set the buy fee.\"},\"setController(address)\":{\"notice\":\"Allows governance to set a new controller.\"},\"setMinTotalSupply(uint256)\":{\"notice\":\"Allows governance to set the minimum vault total supply.\"},\"setPendingGov(address)\":{\"notice\":\"Allows governance to set a new pending governance.\"},\"setSellFeeBps(uint256)\":{\"notice\":\"Allows governance to set the sell fee.\"},\"sweep(address)\":{\"notice\":\"Allows governance to sweep any ERC20 tokens from the contract.\"},\"takeProfit()\":{\"notice\":\"Takes profit from the vault and transfers it to the governance address.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/PSM.sol\":\"PSM\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin/contracts/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin/=lib/openzeppelin/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/openzeppelin/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0x9b6b3e7803bc5f2f8cd7ad57db8ac1def61a9930a5a3107df4882e028a9605d7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da62d6be1f5c6edf577f0cb45666a8aa9c2086a4bac87d95d65f02e2f4c36a4b\",\"dweb:/ipfs/QmNkpvBpoCMvX8JwAFNSc5XxJ2q5BXJpL5L1txb4QkqVFF\"]},\"lib/openzeppelin/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0xde7e9fd9aee8d4f40772f96bb3b58836cbc6dfc0227014a061947f8821ea9724\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11fea9f8bc98949ac6709f0c1699db7430d2948137aa94d5a9e95a91f61a710a\",\"dweb:/ipfs/QmQdfRXxQjwP6yn3DVo1GHPpriKNcFghSPi94Z1oKEFUNS\"]},\"lib/openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"]},\"lib/openzeppelin/contracts/interfaces/IERC4626.sol\":{\"keccak256\":\"0x7b6690c21e94a45b825631a12581b40a753ea827de5ac9127a6b5833411317f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://00045f2c18d7866618c65819fe180a9a9dab25c1974fab35069bdac9cf624b6b\",\"dweb:/ipfs/QmYk62QRqGHJ3rjqfEtbfEGFHWsenv5tNMbeMfq5HkTP44\"]},\"lib/openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"lib/openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x70f2f713b13b7ce4610bcd0ac9fec0f3cc43693b043abcb8dc40a42a726eb330\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c13d13304ac79a83ab1c30168967d19e2203342ebbd6a9bbce4db7550522dcbf\",\"dweb:/ipfs/QmeN5jKMN2vw5bhacr6tkg78afbTTZUeaacNHqjWt4Ew1r\"]},\"lib/openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508\",\"dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB\"]},\"lib/openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621\",\"dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL\"]},\"src/PSM.sol\":{\"keccak256\":\"0xde85555fa934b7c0c7a94227e2b2cbf362566fdc362ba79cdd32ef5f1de9958d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7b27c2bf6b2964640ce76b2cc3fdb400dcf69b1fbb529f5e4b2b1d543e42847d\",\"dweb:/ipfs/QmNP9FjPqsc8oVeFqM6Aix8kSS1GFG3bHZH8B2yf2XKnWR\"]},\"src/PSMFed.sol\":{\"keccak256\":\"0x354957fc64195780f762cb4ee86bc807238c5a4bc523440e5359c5cf7e6ebd4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8f747e3bdfe4f230c9242a8595a2a555cf7fb3848198f22a721c8427cfc24baf\",\"dweb:/ipfs/QmZFg7UVcQxfr5Fs8avtvbTABBvDGxeEFcpqmp4bXRDfER\"]}},\"version\":1}","userdoc":{"kind":"user","methods":{"getProfit()":{"notice":"Returns the total profit made by the PSM."},"buy(uint256)":{"notice":"Allows to buy DOLA minus fee using collateral."},"takeProfit()":{"notice":"Takes profit from the vault and transfers it to the governance address."},"sell(uint256)":{"notice":"Allows to sell DOLA for collateral minus fee."},"sweep(address)":{"notice":"Allows governance to sweep any ERC20 tokens from the contract."},"claimPendingGov()":{"notice":"Allows the pending governance to claim the governance role."},"getTotalReserves()":{"notice":"Returns the total collateral reserves in the vault, including profit and fees."},"getDolaOut(uint256)":{"notice":"Returns the amount of DOLA that can be obtained for a given amount of collateral."},"buy(address,uint256)":{"notice":"Allows to buy DOLA minus fee using collateral."},"sell(address,uint256)":{"notice":"Allows to sell DOLA for collateral minus fee."},"setBuyFeeBps(uint256)":{"notice":"Allows governance to set the buy fee."},"setController(address)":{"notice":"Allows governance to set a new controller."},"setPendingGov(address)":{"notice":"Allows governance to set a new pending governance."},"setSellFeeBps(uint256)":{"notice":"Allows governance to set the sell fee."},"getCollateralOut(uint256)":{"notice":"Returns the amount of collateral that can be obtained for a given amount of DOLA."},"setMinTotalSupply(uint256)":{"notice":"Allows governance to set the minimum vault total supply."},"migrate(address,uint256,uint256)":{"notice":"Migrate the vault to a new IERC4626 vault."}},"version":1},"devdoc":{"kind":"dev","errors":{"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"methods":{"getProfit()":{"returns":{"_0":"Total profit in the PSM."}},"buy(uint256)":{"params":{"collateralAmountIn":"Amount of collateral to sell for DOLA."}},"takeProfit()":{"details":"Can be called by anyone to transfer profits and fees to governance."},"sell(uint256)":{"params":{"dolaAmountIn":"Amount of DOLA to sell."}},"sweep(address)":{"params":{"token":"The ERC20 token to sweep."},"details":"Can only be called by governance."},"claimPendingGov()":{"details":"Can only be called by the pending governance."},"getTotalReserves()":{"returns":{"_0":"Total reserves in the vault."}},"getDolaOut(uint256)":{"params":{"collateralIn":"Amount of collateral to convert to DOLA."},"returns":{"_0":"Amount of DOLA that will be received after fees."}},"buy(address,uint256)":{"params":{"to":"DOLA receiver.","collateralAmountIn":"Amount of collateral to sell for DOLA."}},"sell(address,uint256)":{"params":{"to":"Address to receive the collateral.","dolaAmountIn":"Amount of DOLA to sell."}},"setBuyFeeBps(uint256)":{"details":"The fee is specified in basis points (bps), where 100 bps = 1%."},"setController(address)":{"params":{"newController":"Address of the new controller."},"details":"The new controller must not be the zero address."},"setPendingGov(address)":{"params":{"_pendingGov":"Address of the new pending governance."},"details":"The pending governance must accept the role."},"setSellFeeBps(uint256)":{"details":"The fee is specified in basis points (bps), where 100 bps = 1%."},"getCollateralOut(uint256)":{"params":{"dolaIn":"Amount of DOLA to convert to collateral."},"returns":{"_0":"Amount of collateral that will be received after fees."}},"setMinTotalSupply(uint256)":{"params":{"_minTotalSupply":"Minimum total supply that must have been already minted in the vault."},"details":"This is used to ensure that the vault has enough shares before allowing buy operations."},"migrate(address,uint256,uint256)":{"params":{"newVault":"Address of the new vault to migrate to.","minSharesOut":"Minimum amount of shares to receive from the new vault.","minCollateralAmount":"Minimum amount of collateral to be deposited in the new vault."},"details":"Can only be called by governance and will take profit before migration."}},"version":1},"storageLayout":{"types":{"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_contract(IERC4626)259":{"label":"contract IERC4626","encoding":"inplace","numberOfBytes":"20"},"t_contract(IController)870":{"label":"contract IController","encoding":"inplace","numberOfBytes":"20"}},"storage":[{"slot":"0","type":"t_address","astId":884,"label":"gov","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"1","type":"t_address","astId":886,"label":"pendingGov","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"2","type":"t_contract(IController)870","astId":889,"label":"controller","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"3","type":"t_uint256","astId":891,"label":"buyFeeBps","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"4","type":"t_uint256","astId":893,"label":"sellFeeBps","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"5","type":"t_uint256","astId":898,"label":"supply","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"6","type":"t_contract(IERC4626)259","astId":901,"label":"vault","offset":0,"contract":"src/PSM.sol:PSM"},{"slot":"7","type":"t_uint256","astId":903,"label":"minTotalSupply","offset":0,"contract":"src/PSM.sol:PSM"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"60e060405234801562000010575f80fd5b5060405162002efe38038062002efe833981016040819052620000339162000188565b6001600160a01b03868116608052600680546001600160a01b03199081168884161790915585821660a0525f805482168684161790556002805490911691841691909117905560405130908490839087906200008f906200015e565b6001600160a01b039485168152928416602084015290831660408301529091166060820152608001604051809103905ff080158015620000d1573d5f803e3d5ffd5b506001600160a01b0390811660c081905260a05160405163095ea7b360e01b815260048101929092525f1960248301529091169063095ea7b3906044016020604051808303815f875af11580156200012b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000151919062000205565b505050505050506200022d565b610e4280620020bc83390190565b80516001600160a01b038116811462000183575f80fd5b919050565b5f805f805f8060c087890312156200019e575f80fd5b620001a9876200016c565b9550620001b9602088016200016c565b9450620001c9604088016200016c565b9350620001d9606088016200016c565b9250620001e9608088016200016c565b9150620001f960a088016200016c565b90509295509295509295565b5f6020828403121562000216575f80fd5b8151801515811462000226575f80fd5b9392505050565b60805160a05160c051611e33620002895f395f61026101525f81816102d00152818161085001526110bd01525f818161034301528181610efd01528181610f67015281816114610152818161183b015261196c0152611e335ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806392c592d0116100fe578063e1a452181161009e578063f5d121e61161006e578063f5d121e6146103af578063f77c4791146103c2578063fbfa77cf146103d5578063fc22d0e5146103e8575f80fd5b8063e1a4521814610378578063e4849b3214610381578063efdf0bb014610394578063f0c9e465146103a7575f80fd5b8063c71a7eff116100d9578063c71a7eff14610318578063cce7ec131461032b578063d8dfeb451461033e578063d96a094a14610365575f80fd5b806392c592d0146102cb57806392eefe9b146102f2578063a0422edf14610305575f80fd5b806353d06f941161016957806370c105781161014457806370c105781461029e57806377d2300e146102a657806379db6346146102af5780639058c8a4146102b8575f80fd5b806353d06f941461025c578063679dffb4146102835780636c197ff51461028b575f80fd5b806323cbe1f3116101a457806323cbe1f314610225578063242693d31461022e578063252408101461023657806334119d1514610249575f80fd5b806301681a62146101ca578063047fc9aa146101df57806312d43a51146101fb575b5f80fd5b6101dd6101d8366004611c76565b6103fb565b005b6101e860055481565b6040519081526020015b60405180910390f35b5f5461020d906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b6101e860045481565b6101e86104f7565b60015461020d906001600160a01b031681565b6101dd610257366004611c91565b6105e4565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101e86106d0565b6101dd610299366004611ca8565b6106fe565b6101dd610982565b6101e860035481565b6101e860075481565b6101dd6102c6366004611c91565b610a5f565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610300366004611c76565b610b4b565b6101e8610313366004611c91565b610c6d565b6101e8610326366004611c91565b610c9d565b6101dd610339366004611ca8565b610cb0565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610373366004611c91565b611125565b6101e861271081565b6101dd61038f366004611c91565b61112f565b6101dd6103a2366004611c76565b611139565b6101dd6111f3565b6101dd6103bd366004611c91565b6112c7565b60025461020d906001600160a01b031681565b60065461020d906001600160a01b031681565b6101dd6103f6366004611cd2565b6113b0565b5f546001600160a01b031633146104595760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f760000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526104f4916001600160a01b0390811691908416906370a0823190602401602060405180830381865afa1580156104bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190611d04565b6001600160a01b0384169190611b25565b50565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f916001600160a01b031690634cdad5069082906370a0823190602401602060405180830381865afa15801561055e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105829190611d04565b6040518263ffffffff1660e01b81526004016105a091815260200190565b602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190611d04565b905090565b5f546001600160a01b0316331461063d5760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b61271081111561068f5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60045460408051918252602082018390527f5bafec153d96f8ef37761b64348732b41a6b477401d244a5070f9f82d689adce910160405180910390a1600455565b5f806106da6104f7565b905060055481116106eb575f6106f8565b6005546106f89082611d48565b91505090565b5f811161074d5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b6002546040517fb29431fb0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038481166024830152604482018490529091169063b29431fb906064016020604051808303815f875af11580156107bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e09190611d61565b61082c5760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b8060055f82825461083d9190611d48565b9091555061087890506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611b9e565b6004548190156108ae575f612710600454846108949190611d80565b61089e9190611d97565b90506108aa8183611d48565b9150505b6006546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0385811660248301523060448301529091169063b460af94906064016020604051808303815f875af115801561091d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109419190611d04565b50604080518381526020810183905233917fed7a144fad14804d5c249145e3e0e2b63a9eb455b76aee5bc92d711e9bba3e4a910160405180910390a2505050565b5f61098b6106d0565b90508015610a29576006545f546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03918216602482015230604482015291169063b460af94906064016020604051808303815f875af1158015610a03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a279190611d04565b505b6040518181527f949da057e0c10ac8c590fc56cf17f0a7f8a424d6f373268e7fc205c8dcbc7bb49060200160405180910390a150565b5f546001600160a01b03163314610ab85760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b612710811115610b0a5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60035460408051918252602082018390527f28e297c7c282931a994191b735b01eaf17558295f761512a7047f4e1b8dc3b0b910160405180910390a1600355565b5f546001600160a01b03163314610ba45760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b038116610bfa5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b6002546040516001600160a01b038084169216907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f7905f90a3600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8061271060035484610c809190611d80565b610c8a9190611d97565b9050610c968184611d48565b9392505050565b5f8061271060045484610c809190611d80565b5f8111610cff5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b60075460065f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d769190611d04565b1015610dc45760405162461bcd60e51b815260206004820152601860248201527f4d696e20746f74616c20737570706c79206e6f74206d657400000000000000006044820152606401610450565b6002546040517f1f437f9d0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0384811660248301526044820184905290911690631f437f9d906064016020604051808303815f875af1158015610e33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e579190611d61565b610ea35760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b600354819015610ed9575f61271060035484610ebf9190611d80565b610ec99190611d97565b9050610ed58183611d48565b9150505b8060055f828254610eea9190611dcf565b90915550610f2590506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611b9e565b6006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018490523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af115801561103b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105f9190611d04565b90505f81116110b05760405162461bcd60e51b815260206004820152600e60248201527f4465706f736974206661696c65640000000000000000000000000000000000006044820152606401610450565b6110e46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168584611b25565b604080518381526020810185905233917f1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed910160405180910390a250505050565b6104f43382610cb0565b6104f433826106fe565b5f546001600160a01b031633146111925760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49905f90a250565b6001546001600160a01b0316331461124d5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742070656e64696e6720676f7600000000000000000000000000000000006044820152606401610450565b6001545f80546040516001600160a01b0393841693909116917f3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac291a3600180545f80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b5f546001600160a01b031633146113205760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b5f811161136f5760405162461bcd60e51b815260206004820152601c60248201527f4d696e20746f74616c20737570706c79206d757374206265203e2030000000006044820152606401610450565b60075460408051918252602082018390527fe9b2d6ed3a1e53a2cbc74ea1516580639c8c1a43411ca794eaa9e101c3c3dea4910160405180910390a1600755565b5f546001600160a01b031633146114095760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b03831661145f5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e99190611de2565b6001600160a01b03161461153f5760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c74206d7573742061636365707420636f6c6c61746572616c6044820152606401610450565b611547610982565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ca9190611d04565b156116e0576006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039091169063ba0876529082906370a0823190602401602060405180830381865afa158015611636573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165a9190611d04565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af11580156116ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116de9190611d04565b505b600680547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03868116918217909355600754604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051949093169390926318160ddd9160048083019260209291908290030181865afa158015611773573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117979190611d04565b101561180b5760405162461bcd60e51b815260206004820152602860248201527f4e6577207661756c7420646f6573206e6f74206d656574206d696e20746f746160448201527f6c20737570706c790000000000000000000000000000000000000000000000006064820152608401610450565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611888573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ac9190611d04565b9050838110156119245760405162461bcd60e51b815260206004820152602d60248201527f496e73756666696369656e7420636f6c6c61746572616c2062616c616e63652060448201527f666f72206d6967726174696f6e000000000000000000000000000000000000006064820152608401610450565b8015611ade576006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156119b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d89190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018390523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015611a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a649190611d04565b905083811015611adc5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e74207368617265732072656365697665642066726f60448201527f6d206e6577207661756c740000000000000000000000000000000000000000006064820152608401610450565b505b846001600160a01b0316826001600160a01b03167faa10add0ff0f23b874d2d1fa353ab28a639aa51906dec303238cdb1f1e54ea4260405160405180910390a35050505050565b6040516001600160a01b03838116602483015260448201839052611b9991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bdd565b505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611bd79186918216906323b872dd90608401611b52565b50505050565b5f8060205f8451602086015f885af180611bfc576040513d5f823e3d81fd5b50505f513d91508115611c13578060011415611c20565b6001600160a01b0384163b155b15611bd7576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610450565b6001600160a01b03811681146104f4575f80fd5b5f60208284031215611c86575f80fd5b8135610c9681611c62565b5f60208284031215611ca1575f80fd5b5035919050565b5f8060408385031215611cb9575f80fd5b8235611cc481611c62565b946020939093013593505050565b5f805f60608486031215611ce4575f80fd5b8335611cef81611c62565b95602085013595506040909401359392505050565b5f60208284031215611d14575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115611d5b57611d5b611d1b565b92915050565b5f60208284031215611d71575f80fd5b81518015158114610c96575f80fd5b8082028115828204841417611d5b57611d5b611d1b565b5f82611dca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611d5b57611d5b611d1b565b5f60208284031215611df2575f80fd5b8151610c9681611c6256fea2646970667358221220fb094be55e618a2b326be9cb9c850683abaf8c7ae48d41e110708f81340d4efe64736f6c6343000814003360c060405234801561000f575f80fd5b50604051610e42380380610e4283398101604081905261002e91610087565b6001600160a01b039384166080525f80549385166001600160a01b03199485161790556002805492851692909316919091179091551660a0526100d8565b80516001600160a01b0381168114610082575f80fd5b919050565b5f805f806080858703121561009a575f80fd5b6100a38561006c565b93506100b16020860161006c565b92506100bf6040860161006c565b91506100cd6060860161006c565b905092959194509250565b60805160a051610d2661011c5f395f81816101bb0152818161043a015281816107f7015261089101525f818161010a0152818161040b01526107c20152610d265ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806392c592d011610088578063ee1ef57511610063578063ee1ef57514610203578063efdf0bb014610216578063f0c9e46514610229578063fdf893f514610231575f80fd5b806392c592d0146101b6578063b6a3f59a146101dd578063e1a611b7146101f0575f80fd5b806325240810116100c357806325240810146101705780632720b22e1461019057806369652fcf146101a55780638f770ad0146101ad575f80fd5b8063047fc9aa146100e957806304bda2621461010557806312d43a5114610151575b5f80fd5b6100f260035481565b6040519081526020015b60405180910390f35b61012c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fc565b5f5461012c9073ffffffffffffffffffffffffffffffffffffffff1681565b60015461012c9073ffffffffffffffffffffffffffffffffffffffff1681565b6101a361019e366004610c27565b610251565b005b6101a36104cd565b6100f260045481565b61012c7f000000000000000000000000000000000000000000000000000000000000000081565b6101a36101eb366004610c27565b6105c0565b6101a36101fe366004610c27565b610685565b6101a3610211366004610c3e565b61092e565b6101a3610224366004610c3e565b610a24565b6101a3610b12565b60025461012c9073ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206368616972000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f8111610340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f416d6f756e74206d757374206265203e2030000000000000000000000000000060448201526064016102ce565b6004546003546103509083610ca5565b11156103b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f537570706c79206361702065786365656465640000000000000000000000000060448201526064016102ce565b8060035f8282546103c99190610ca5565b90915550506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015f604051808303815f87803b15801561047b575f80fd5b505af115801561048d573d5f803e3d5ffd5b505050507fdcc16fd18a808d877bcd9a09b544844b36ae8f0a4b222e317d7b777b2c18b032816040516104c291815260200190565b60405180910390a150565b60025473ffffffffffffffffffffffffffffffffffffffff16331461054e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206368616972000000000000000000000000000000000000000000000060448201526064016102ce565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690915560405173ffffffffffffffffffffffffffffffffffffffff909116905f9082907f0a47357b37b43edfce3b49e26d073c29be56d40a540f4766153a6169d031e86e908390a350565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064016102ce565b600480549082905560408051828152602081018490527fb4d96b3a6638191d0f6aefa0fdc4d99af3592f4c97480e31feeb977723c63b53910160405180910390a15050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206368616972000000000000000000000000000000000000000000000060448201526064016102ce565b5f811161076f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f416d6f756e74206d757374206265203e2030000000000000000000000000000060448201526064016102ce565b8060035f8282546107809190610cbe565b90915550506040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303815f875af115801561083d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108619190610cd1565b506040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c68906024015f604051808303815f87803b1580156108e7575f80fd5b505af11580156108f9573d5f803e3d5ffd5b505050507f32d275175c36fa468b3e61c6763f9488ff3c9be127e35e011cf4e04d602224ba816040516104c291815260200190565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146109ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064016102ce565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f0a47357b37b43edfce3b49e26d073c29be56d40a540f4766153a6169d031e86e905f90a35050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420676f7665726e616e636500000000000000000000000000000000000060448201526064016102ce565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49905f90a250565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f742070656e64696e6720676f76000000000000000000000000000000000060448201526064016102ce565b6001545f805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917f3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac291a3600180545f80547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b5f60208284031215610c37575f80fd5b5035919050565b5f60208284031215610c4e575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610c71575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610cb857610cb8610c78565b92915050565b81810381811115610cb857610cb8610c78565b5f60208284031215610ce1575f80fd5b81518015158114610c71575f80fdfea264697066735822122036b7c9aa871b3c4aeaafcd7a910dc3a6d174e44d38a46c9060d0681b6bac34a064736f6c63430008140033","sourceMap":"555:10341:8:-:0;;;1897:412;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2022:32:8;;;;;2064:5;:24;;-1:-1:-1;;;;;;2064:24:8;;;;;;;;;;2098:20;;;;;-1:-1:-1;2128:10:8;;;;;;;;;;2148;:37;;;;;;;;;;;;;;2209:46;;2228:4;;2128:10;;2241:6;;2098:20;;2209:46;;;:::i;:::-;-1:-1:-1;;;;;1124:15:10;;;1106:34;;1176:15;;;1171:2;1156:18;;1149:43;1228:15;;;1223:2;1208:18;;1201:43;1280:15;;;1275:2;1260:18;;1253:43;1055:3;1040:19;2209:46:8;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2195:61:8;;;;;;;2266:4;;:36;;-1:-1:-1;;;2266:36:8;;;;;1481:51:10;;;;-1:-1:-1;;1548:18:10;;;1541:34;2266:12:8;;;;;;1454:18:10;;2266:36:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1897:412;;;;;;555:10341;;;;;;;;;;:::o;14:177:10:-;93:13;;-1:-1:-1;;;;;135:31:10;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:636::-;311:6;319;327;335;343;351;404:3;392:9;383:7;379:23;375:33;372:53;;;421:1;418;411:12;372:53;444:40;474:9;444:40;:::i;:::-;434:50;;503:49;548:2;537:9;533:18;503:49;:::i;:::-;493:59;;571:49;616:2;605:9;601:18;571:49;:::i;:::-;561:59;;639:49;684:2;673:9;669:18;639:49;:::i;:::-;629:59;;707:50;752:3;741:9;737:19;707:50;:::i;:::-;697:60;;776:50;821:3;810:9;806:19;776:50;:::i;:::-;766:60;;196:636;;;;;;;;:::o;1586:277::-;1653:6;1706:2;1694:9;1685:7;1681:23;1677:32;1674:52;;;1722:1;1719;1712:12;1674:52;1754:9;1748:16;1807:5;1800:13;1793:21;1786:5;1783:32;1773:60;;1829:1;1826;1819:12;1773:60;1852:5;1586:277;-1:-1:-1;;;1586:277:10:o;:::-;555:10341:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806392c592d0116100fe578063e1a452181161009e578063f5d121e61161006e578063f5d121e6146103af578063f77c4791146103c2578063fbfa77cf146103d5578063fc22d0e5146103e8575f80fd5b8063e1a4521814610378578063e4849b3214610381578063efdf0bb014610394578063f0c9e465146103a7575f80fd5b8063c71a7eff116100d9578063c71a7eff14610318578063cce7ec131461032b578063d8dfeb451461033e578063d96a094a14610365575f80fd5b806392c592d0146102cb57806392eefe9b146102f2578063a0422edf14610305575f80fd5b806353d06f941161016957806370c105781161014457806370c105781461029e57806377d2300e146102a657806379db6346146102af5780639058c8a4146102b8575f80fd5b806353d06f941461025c578063679dffb4146102835780636c197ff51461028b575f80fd5b806323cbe1f3116101a457806323cbe1f314610225578063242693d31461022e578063252408101461023657806334119d1514610249575f80fd5b806301681a62146101ca578063047fc9aa146101df57806312d43a51146101fb575b5f80fd5b6101dd6101d8366004611c76565b6103fb565b005b6101e860055481565b6040519081526020015b60405180910390f35b5f5461020d906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b6101e860045481565b6101e86104f7565b60015461020d906001600160a01b031681565b6101dd610257366004611c91565b6105e4565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101e86106d0565b6101dd610299366004611ca8565b6106fe565b6101dd610982565b6101e860035481565b6101e860075481565b6101dd6102c6366004611c91565b610a5f565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610300366004611c76565b610b4b565b6101e8610313366004611c91565b610c6d565b6101e8610326366004611c91565b610c9d565b6101dd610339366004611ca8565b610cb0565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610373366004611c91565b611125565b6101e861271081565b6101dd61038f366004611c91565b61112f565b6101dd6103a2366004611c76565b611139565b6101dd6111f3565b6101dd6103bd366004611c91565b6112c7565b60025461020d906001600160a01b031681565b60065461020d906001600160a01b031681565b6101dd6103f6366004611cd2565b6113b0565b5f546001600160a01b031633146104595760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f760000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526104f4916001600160a01b0390811691908416906370a0823190602401602060405180830381865afa1580156104bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e39190611d04565b6001600160a01b0384169190611b25565b50565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f916001600160a01b031690634cdad5069082906370a0823190602401602060405180830381865afa15801561055e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105829190611d04565b6040518263ffffffff1660e01b81526004016105a091815260200190565b602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190611d04565b905090565b5f546001600160a01b0316331461063d5760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b61271081111561068f5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60045460408051918252602082018390527f5bafec153d96f8ef37761b64348732b41a6b477401d244a5070f9f82d689adce910160405180910390a1600455565b5f806106da6104f7565b905060055481116106eb575f6106f8565b6005546106f89082611d48565b91505090565b5f811161074d5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b6002546040517fb29431fb0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038481166024830152604482018490529091169063b29431fb906064016020604051808303815f875af11580156107bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e09190611d61565b61082c5760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b8060055f82825461083d9190611d48565b9091555061087890506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611b9e565b6004548190156108ae575f612710600454846108949190611d80565b61089e9190611d97565b90506108aa8183611d48565b9150505b6006546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0385811660248301523060448301529091169063b460af94906064016020604051808303815f875af115801561091d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109419190611d04565b50604080518381526020810183905233917fed7a144fad14804d5c249145e3e0e2b63a9eb455b76aee5bc92d711e9bba3e4a910160405180910390a2505050565b5f61098b6106d0565b90508015610a29576006545f546040517fb460af94000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03918216602482015230604482015291169063b460af94906064016020604051808303815f875af1158015610a03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a279190611d04565b505b6040518181527f949da057e0c10ac8c590fc56cf17f0a7f8a424d6f373268e7fc205c8dcbc7bb49060200160405180910390a150565b5f546001600160a01b03163314610ab85760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b612710811115610b0a5760405162461bcd60e51b815260206004820152600c60248201527f46656520746f6f206869676800000000000000000000000000000000000000006044820152606401610450565b60035460408051918252602082018390527f28e297c7c282931a994191b735b01eaf17558295f761512a7047f4e1b8dc3b0b910160405180910390a1600355565b5f546001600160a01b03163314610ba45760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b038116610bfa5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b6002546040516001600160a01b038084169216907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f7905f90a3600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8061271060035484610c809190611d80565b610c8a9190611d97565b9050610c968184611d48565b9392505050565b5f8061271060045484610c809190611d80565b5f8111610cff5760405162461bcd60e51b815260206004820152601260248201527f416d6f756e74206d757374206265203e203000000000000000000000000000006044820152606401610450565b60075460065f9054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d769190611d04565b1015610dc45760405162461bcd60e51b815260206004820152601860248201527f4d696e20746f74616c20737570706c79206e6f74206d657400000000000000006044820152606401610450565b6002546040517f1f437f9d0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0384811660248301526044820184905290911690631f437f9d906064016020604051808303815f875af1158015610e33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e579190611d61565b610ea35760405162461bcd60e51b815260206004820152601460248201527f44656e69656420627920636f6e74726f6c6c65720000000000000000000000006044820152606401610450565b600354819015610ed9575f61271060035484610ebf9190611d80565b610ec99190611d97565b9050610ed58183611d48565b9150505b8060055f828254610eea9190611dcf565b90915550610f2590506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611b9e565b6006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015610faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd39190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018490523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af115801561103b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105f9190611d04565b90505f81116110b05760405162461bcd60e51b815260206004820152600e60248201527f4465706f736974206661696c65640000000000000000000000000000000000006044820152606401610450565b6110e46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168584611b25565b604080518381526020810185905233917f1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed910160405180910390a250505050565b6104f43382610cb0565b6104f433826106fe565b5f546001600160a01b031633146111925760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49905f90a250565b6001546001600160a01b0316331461124d5760405162461bcd60e51b815260206004820152600f60248201527f4e6f742070656e64696e6720676f7600000000000000000000000000000000006044820152606401610450565b6001545f80546040516001600160a01b0393841693909116917f3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac291a3600180545f80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b5f546001600160a01b031633146113205760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b5f811161136f5760405162461bcd60e51b815260206004820152601c60248201527f4d696e20746f74616c20737570706c79206d757374206265203e2030000000006044820152606401610450565b60075460408051918252602082018390527fe9b2d6ed3a1e53a2cbc74ea1516580639c8c1a43411ca794eaa9e101c3c3dea4910160405180910390a1600755565b5f546001600160a01b031633146114095760405162461bcd60e51b815260206004820152600760248201527f4e6f7420676f76000000000000000000000000000000000000000000000000006044820152606401610450565b6001600160a01b03831661145f5760405162461bcd60e51b815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610450565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e99190611de2565b6001600160a01b03161461153f5760405162461bcd60e51b815260206004820181905260248201527f4e6577207661756c74206d7573742061636365707420636f6c6c61746572616c6044820152606401610450565b611547610982565b6006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ca9190611d04565b156116e0576006546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039091169063ba0876529082906370a0823190602401602060405180830381865afa158015611636573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165a9190611d04565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152306024820181905260448201526064016020604051808303815f875af11580156116ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116de9190611d04565b505b600680547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03868116918217909355600754604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051949093169390926318160ddd9160048083019260209291908290030181865afa158015611773573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117979190611d04565b101561180b5760405162461bcd60e51b815260206004820152602860248201527f4e6577207661756c7420646f6573206e6f74206d656574206d696e20746f746160448201527f6c20737570706c790000000000000000000000000000000000000000000000006064820152608401610450565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611888573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ac9190611d04565b9050838110156119245760405162461bcd60e51b815260206004820152602d60248201527f496e73756666696369656e7420636f6c6c61746572616c2062616c616e63652060448201527f666f72206d6967726174696f6e000000000000000000000000000000000000006064820152608401610450565b8015611ade576006546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af11580156119b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d89190611d61565b506006546040517f6e553f65000000000000000000000000000000000000000000000000000000008152600481018390523060248201525f916001600160a01b031690636e553f65906044016020604051808303815f875af1158015611a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a649190611d04565b905083811015611adc5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e74207368617265732072656365697665642066726f60448201527f6d206e6577207661756c740000000000000000000000000000000000000000006064820152608401610450565b505b846001600160a01b0316826001600160a01b03167faa10add0ff0f23b874d2d1fa353ab28a639aa51906dec303238cdb1f1e54ea4260405160405180910390a35050505050565b6040516001600160a01b03838116602483015260448201839052611b9991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bdd565b505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611bd79186918216906323b872dd90608401611b52565b50505050565b5f8060205f8451602086015f885af180611bfc576040513d5f823e3d81fd5b50505f513d91508115611c13578060011415611c20565b6001600160a01b0384163b155b15611bd7576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610450565b6001600160a01b03811681146104f4575f80fd5b5f60208284031215611c86575f80fd5b8135610c9681611c62565b5f60208284031215611ca1575f80fd5b5035919050565b5f8060408385031215611cb9575f80fd5b8235611cc481611c62565b946020939093013593505050565b5f805f60608486031215611ce4575f80fd5b8335611cef81611c62565b95602085013595506040909401359392505050565b5f60208284031215611d14575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115611d5b57611d5b611d1b565b92915050565b5f60208284031215611d71575f80fd5b81518015158114610c96575f80fd5b8082028115828204841417611d5b57611d5b611d1b565b5f82611dca577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611d5b57611d5b611d1b565b5f60208284031215611df2575f80fd5b8151610c9681611c6256fea2646970667358221220fb094be55e618a2b326be9cb9c850683abaf8c7ae48d41e110708f81340d4efe64736f6c63430008140033","sourceMap":"555:10341:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8357:118;;;;;;:::i;:::-;;:::i;:::-;;1017:21;;;;;;;;;601:25:10;;;589:2;574:18;1017:21:8;;;;;;;;743:18;;;;;-1:-1:-1;;;;;743:18:8;;;;;;-1:-1:-1;;;;;801:55:10;;;783:74;;771:2;756:18;743::8;637:226:10;913:25:8;;;;;;5325:133;;;:::i;767:25::-;;;;;-1:-1:-1;;;;;767:25:8;;;8975:201;;;;;;:::i;:::-;;:::i;681:28::-;;;;;5577:178;;;:::i;4165:611::-;;;;;;:::i;:::-;;:::i;4965:200::-;;;:::i;864:24::-;;;;;;1133:29;;;;;;8626:197;;;;;;:::i;:::-;;:::i;647:28::-;;;;;10645:249;;;;;;:::i;:::-;;:::i;6006:184::-;;;;;;:::i;:::-;;:::i;6441:173::-;;;;;;:::i;:::-;;:::i;2845:908::-;;;;;;:::i;:::-;;:::i;607:34::-;;;;;2555:102;;;;;;:::i;:::-;;:::i;963:48::-;;1005:6;963:48;;3887:92;;;;;;:::i;:::-;;:::i;9937:147::-;;;;;;:::i;:::-;;:::i;10239:206::-;;;:::i;9470:257::-;;;;;;:::i;:::-;;:::i;798:29::-;;;;;-1:-1:-1;;;;;798:29:8;;;1106:21;;;;;-1:-1:-1;;;;;1106:21:8;;;7021:1144;;;;;;:::i;:::-;;:::i;8357:118::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;;;;;;;;;8432:3:::1;::::0;8437:30:::1;::::0;;;;8461:4:::1;8437:30;::::0;::::1;783:74:10::0;8413:55:8::1;::::0;-1:-1:-1;;;;;8432:3:8;;::::1;::::0;8437:15;;::::1;::::0;::::1;::::0;756:18:10;;8437:30:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8413:18:8;::::1;::::0;:55;:18:::1;:55::i;:::-;8357:118:::0;:::o;5325:133::-;5400:5;;5420:30;;;;;5444:4;5420:30;;;783:74:10;5374:7:8;;-1:-1:-1;;;;;5400:5:8;;:19;;:5;;5420:15;;756:18:10;;5420:30:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5400:51;;;;;;;;;;;;;601:25:10;;589:2;574:18;;455:177;5400:51:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5393:58;;5325:133;:::o;8975:201::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;1005:6:::1;9049;:25;;9041:50;;;::::0;-1:-1:-1;;;9041:50:8;;3505:2:10;9041:50:8::1;::::0;::::1;3487:21:10::0;3544:2;3524:18;;;3517:30;3583:14;3563:18;;;3556:42;3615:18;;9041:50:8::1;3303:336:10::0;9041:50:8::1;9121:10;::::0;9106:34:::1;::::0;;3818:25:10;;;3874:2;3859:18;;3852:34;;;9106::8::1;::::0;3791:18:10;9106:34:8::1;;;;;;;9150:10;:19:::0;8975:201::o;5577:178::-;5619:7;5638:21;5662:18;:16;:18::i;:::-;5638:42;;5713:6;;5697:13;:22;:51;;5747:1;5697:51;;;5738:6;;5722:22;;:13;:22;:::i;:::-;5690:58;;;5577:178;:::o;4165:611::-;4253:1;4238:12;:16;4230:47;;;;-1:-1:-1;;;4230:47:8;;4421:2:10;4230:47:8;;;4403:21:10;4460:2;4440:18;;;4433:30;4499:20;4479:18;;;4472:48;4537:18;;4230:47:8;4219:342:10;4230:47:8;4295:10;;:47;;;;;4313:10;4295:47;;;4829:34:10;-1:-1:-1;;;;;4899:15:10;;;4879:18;;;4872:43;4931:18;;;4924:34;;;4295:10:8;;;;:17;;4741:18:10;;4295:47:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4287:80;;;;-1:-1:-1;;;4287:80:8;;5453:2:10;4287:80:8;;;5435:21:10;5492:2;5472:18;;;5465:30;5531:22;5511:18;;;5504:50;5571:18;;4287:80:8;5251:344:10;4287:80:8;4387:12;4377:6;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;4409:62:8;;-1:-1:-1;;;;;;4409:4:8;:21;4431:10;4451:4;4458:12;4409:21;:62::i;:::-;4529:10;;4502:12;;4529:14;4525:134;;4559:11;1005:6;4589:10;;4574:12;:25;;;;:::i;:::-;4573:45;;;;:::i;:::-;4559:59;-1:-1:-1;4632:16:8;4559:59;4632:16;;:::i;:::-;;;4545:114;4525:134;4669:5;;:44;;;;;;;;6254:25:10;;;-1:-1:-1;;;;;6376:15:10;;;6356:18;;;6349:43;4707:4:8;6408:18:10;;;6401:43;4669:5:8;;;;:14;;6227:18:10;;4669:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;4728:41:8;;;3818:25:10;;;3874:2;3859:18;;3852:34;;;4733:10:8;;4728:41;;3791:18:10;4728:41:8;;;;;;;4220:556;4165:611;;:::o;4965:200::-;5004:14;5021:11;:9;:11::i;:::-;5004:28;-1:-1:-1;5046:10:8;;5042:83;;5072:5;;;5095:3;5072:42;;;;;;;;6254:25:10;;;-1:-1:-1;;;;;5095:3:8;;;6356:18:10;;;6349:43;5108:4:8;6408:18:10;;;6401:43;5072:5:8;;;:14;;6227:18:10;;5072:42:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5042:83;5139:19;;601:25:10;;;5139:19:8;;589:2:10;574:18;5139:19:8;;;;;;;4994:171;4965:200::o;8626:197::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;1005:6:::1;8699;:25;;8691:50;;;::::0;-1:-1:-1;;;8691:50:8;;3505:2:10;8691:50:8::1;::::0;::::1;3487:21:10::0;3544:2;3524:18;;;3517:30;3583:14;3563:18;;;3556:42;3615:18;;8691:50:8::1;3303:336:10::0;8691:50:8::1;8770:9;::::0;8756:32:::1;::::0;;3818:25:10;;;3874:2;3859:18;;3852:34;;;8756:32:8::1;::::0;3791:18:10;8756:32:8::1;;;;;;;8798:9;:18:::0;8626:197::o;10645:249::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;-1:-1:-1;;;;;10726:27:8;::::1;10718:52;;;::::0;-1:-1:-1;;;10718:52:8;;6657:2:10;10718:52:8::1;::::0;::::1;6639:21:10::0;6696:2;6676:18;;;6669:30;6735:14;6715:18;;;6708:42;6767:18;;10718:52:8::1;6455:336:10::0;10718:52:8::1;10811:10;::::0;10785:53:::1;::::0;-1:-1:-1;;;;;10785:53:8;;::::1;::::0;10811:10:::1;::::0;10785:53:::1;::::0;10811:10:::1;::::0;10785:53:::1;10848:10;:39:::0;;;::::1;-1:-1:-1::0;;;;;10848:39:8;;;::::1;::::0;;;::::1;::::0;;10645:249::o;6006:184::-;6071:7;6090:11;1005:6;6120:9;;6105:12;:24;;;;:::i;:::-;6104:44;;;;:::i;:::-;6090:58;-1:-1:-1;6165:18:8;6090:58;6165:12;:18;:::i;:::-;6158:25;6006:184;-1:-1:-1;;;6006:184:8:o;6441:173::-;6506:7;6525:11;1005:6;6549:10;;6540:6;:19;;;;:::i;2845:908::-;2944:1;2923:18;:22;2915:53;;;;-1:-1:-1;;;2915:53:8;;4421:2:10;2915:53:8;;;4403:21:10;4460:2;4440:18;;;4433:30;4499:20;4479:18;;;4472:48;4537:18;;2915:53:8;4219:342:10;2915:53:8;3009:14;;2986:5;;;;;;;;;-1:-1:-1;;;;;2986:5:8;-1:-1:-1;;;;;2986:17:8;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;2978:74;;;;-1:-1:-1;;;2978:74:8;;6998:2:10;2978:74:8;;;6980:21:10;7037:2;7017:18;;;7010:30;7076:26;7056:18;;;7049:54;7120:18;;2978:74:8;6796:348:10;2978:74:8;3070:10;;:52;;;;;3087:10;3070:52;;;4829:34:10;-1:-1:-1;;;;;4899:15:10;;;4879:18;;;4872:43;4931:18;;;4924:34;;;3070:10:8;;;;:16;;4741:18:10;;3070:52:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3062:85;;;;-1:-1:-1;;;3062:85:8;;5453:2:10;3062:85:8;;;5435:21:10;5492:2;5472:18;;;5465:30;5531:22;5511:18;;;5504:50;5571:18;;3062:85:8;5251:344:10;3062:85:8;3210:9;;3177:18;;3210:13;3206:138;;3239:11;1005:6;3275:9;;3254:18;:30;;;;:::i;:::-;3253:50;;;;:::i;:::-;3239:64;-1:-1:-1;3317:16:8;3239:64;3317:16;;:::i;:::-;;;3225:119;3206:138;3363:9;3353:6;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;3383:74:8;;-1:-1:-1;;;;;;3383:10:8;:27;3411:10;3431:4;3438:18;3383:27;:74::i;:::-;3494:5;;3467:54;;;;;-1:-1:-1;;;;;3494:5:8;;;3467:54;;;7453:74:10;7543:18;;;7536:34;;;3467:10:8;:18;;;;;;7426::10;;3467:54:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3548:5:8;;:48;;;;;;;;7755:25:10;;;3590:4:8;7796:18:10;;;7789:83;3531:14:8;;-1:-1:-1;;;;;3548:5:8;;:13;;7728:18:10;;3548:48:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3531:65;;3623:1;3614:6;:10;3606:37;;;;-1:-1:-1;;;3606:37:8;;8085:2:10;3606:37:8;;;8067:21:10;8124:2;8104:18;;;8097:30;8163:16;8143:18;;;8136:44;8197:18;;3606:37:8;7883:338:10;3606:37:8;3653:32;-1:-1:-1;;;;;3653:4:8;:17;3671:2;3675:9;3653:17;:32::i;:::-;3700:46;;;3818:25:10;;;3874:2;3859:18;;3852:34;;;3704:10:8;;3700:46;;3791:18:10;3700:46:8;;;;;;;2905:848;;2845:908;;:::o;2555:102::-;2615:35;2619:10;2631:18;2615:3;:35::i;3887:92::-;3942:30;3947:10;3959:12;3942:4;:30::i;9937:147::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;10008:10:::1;:24:::0;;;::::1;-1:-1:-1::0;;;;;10008:24:8;::::1;::::0;;::::1;::::0;;;10047:30:::1;::::0;::::1;::::0;-1:-1:-1;;10047:30:8::1;9937:147:::0;:::o;10239:206::-;10307:10;;-1:-1:-1;;;;;10307:10:8;10293;:24;10285:52;;;;-1:-1:-1;;;10285:52:8;;8428:2:10;10285:52:8;;;8410:21:10;8467:2;8447:18;;;8440:30;8506:17;8486:18;;;8479:45;8541:18;;10285:52:8;8226:339:10;10285:52:8;10368:10;;;10363:3;;10352:27;;-1:-1:-1;;;;;10368:10:8;;;;10363:3;;;;10352:27;;;10395:10;;;;10389:16;;;;;;-1:-1:-1;;;;;10395:10:8;;10389:16;;;;10415:23;;;10239:206::o;9470:257::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;9575:1:::1;9557:15;:19;9549:60;;;::::0;-1:-1:-1;;;9549:60:8;;8772:2:10;9549:60:8::1;::::0;::::1;8754:21:10::0;8811:2;8791:18;;;8784:30;8850;8830:18;;;8823:58;8898:18;;9549:60:8::1;8570:352:10::0;9549:60:8::1;9646:14;::::0;9624:54:::1;::::0;;3818:25:10;;;3874:2;3859:18;;3852:34;;;9624:54:8::1;::::0;3791:18:10;9624:54:8::1;;;;;;;9688:14;:32:::0;9470:257::o;7021:1144::-;2366:3;;-1:-1:-1;;;;;2366:3:8;2352:10;:17;2344:37;;;;-1:-1:-1;;;2344:37:8;;2981:2:10;2344:37:8;;;2963:21:10;3020:1;3000:18;;;2993:29;3058:9;3038:18;;;3031:37;3085:18;;2344:37:8;2779:330:10;2344:37:8;-1:-1:-1;;;;;7142:22:8;::::1;7134:47;;;::::0;-1:-1:-1;;;7134:47:8;;6657:2:10;7134:47:8::1;::::0;::::1;6639:21:10::0;6696:2;6676:18;;;6669:30;6735:14;6715:18;;;6708:42;6767:18;;7134:47:8::1;6455:336:10::0;7134:47:8::1;7237:10;-1:-1:-1::0;;;;;7199:49:8::1;7208:8;-1:-1:-1::0;;;;;7199:24:8::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7199:49:8::1;;7191:94;;;::::0;-1:-1:-1;;;7191:94:8;;9393:2:10;7191:94:8::1;::::0;::::1;9375:21:10::0;;;9412:18;;;9405:30;9471:34;9451:18;;;9444:62;9523:18;;7191:94:8::1;9191:356:10::0;7191:94:8::1;7296:12;:10;:12::i;:::-;7323:5;::::0;:30:::1;::::0;;;;7347:4:::1;7323:30;::::0;::::1;783:74:10::0;-1:-1:-1;;;;;7323:5:8;;::::1;::::0;:15:::1;::::0;756:18:10;;7323:30:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35:::0;7319:140:::1;;7374:5;::::0;7387:30:::1;::::0;;;;7411:4:::1;7387:30;::::0;::::1;783:74:10::0;-1:-1:-1;;;;;7374:5:8;;::::1;::::0;:12:::1;::::0;:5;;7387:15:::1;::::0;756:18:10;;7387:30:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7374:74;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6254:25:10::0;;;;7427:4:8::1;6356:18:10::0;;;6349:43;;;6408:18;;;6401:43;6227:18;;7374:74:8::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7319:140;7496:5;::::0;;7512:26;;::::1;-1:-1:-1::0;;;;;7512:26:8;;::::1;::::0;;::::1;::::0;;;7579:14:::1;::::0;7556:19:::1;::::0;;;;;;;7496:5;;;::::1;::::0;7579:14;;7556:17:::1;::::0;:19:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;7512:26;7556:19:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;7548:90;;;::::0;-1:-1:-1;;;7548:90:8;;9754:2:10;7548:90:8::1;::::0;::::1;9736:21:10::0;9793:2;9773:18;;;9766:30;9832:34;9812:18;;;9805:62;9903:10;9883:18;;;9876:38;9931:19;;7548:90:8::1;9552:404:10::0;7548:90:8::1;7677:35;::::0;;;;7706:4:::1;7677:35;::::0;::::1;783:74:10::0;7649:25:8::1;::::0;7677:10:::1;-1:-1:-1::0;;;;;7677:20:8::1;::::0;::::1;::::0;756:18:10;;7677:35:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7649:63;;7751:19;7730:17;:40;;7722:98;;;::::0;-1:-1:-1;;;7722:98:8;;10163:2:10;7722:98:8::1;::::0;::::1;10145:21:10::0;10202:2;10182:18;;;10175:30;10241:34;10221:18;;;10214:62;10312:15;10292:18;;;10285:43;10345:19;;7722:98:8::1;9961:409:10::0;7722:98:8::1;7834:21:::0;;7830:281:::1;;7898:5;::::0;7871:53:::1;::::0;;;;-1:-1:-1;;;;;7898:5:8;;::::1;7871:53;::::0;::::1;7453:74:10::0;7543:18;;;7536:34;;;7871:10:8::1;:18:::0;;::::1;::::0;::::1;::::0;7426::10;;7871:53:8::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;7958:5:8::1;::::0;:47:::1;::::0;;;;::::1;::::0;::::1;7755:25:10::0;;;7999:4:8::1;7796:18:10::0;;;7789:83;7938:17:8::1;::::0;-1:-1:-1;;;;;7958:5:8::1;::::0;:13:::1;::::0;7728:18:10;;7958:47:8::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7938:67;;8040:12;8027:9;:25;;8019:81;;;::::0;-1:-1:-1;;;8019:81:8;;10577:2:10;8019:81:8::1;::::0;::::1;10559:21:10::0;10616:2;10596:18;;;10589:30;10655:34;10635:18;;;10628:62;10726:13;10706:18;;;10699:41;10757:19;;8019:81:8::1;10375:407:10::0;8019:81:8::1;7857:254;7830:281;8149:8;-1:-1:-1::0;;;;;8125:33:8::1;8139:8;-1:-1:-1::0;;;;;8125:33:8::1;;;;;;;;;;;7124:1041;;7021:1144:::0;;;:::o;1219:160:6:-;1328:43;;-1:-1:-1;;;;;7471:55:10;;;1328:43:6;;;7453:74:10;7543:18;;;7536:34;;;1301:71:6;;1321:5;;1343:14;;;;;7426:18:10;;1328:43:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1301:19;:71::i;:::-;1219:160;;;:::o;1618:188::-;1745:53;;-1:-1:-1;;;;;4847:15:10;;;1745:53:6;;;4829:34:10;4899:15;;;4879:18;;;4872:43;4931:18;;;4924:34;;;1718:81:6;;1738:5;;1760:18;;;;;4741::10;;1745:53:6;4566:398:10;1718:81:6;1618:188;;;;:::o;8370:720::-;8450:18;8478:19;8616:4;8613:1;8606:4;8600:11;8593:4;8587;8583:15;8580:1;8573:5;8566;8561:60;8673:7;8663:176;;8717:4;8711:11;8762:16;8759:1;8754:3;8739:40;8808:16;8803:3;8796:29;8663:176;-1:-1:-1;;8916:1:6;8910:8;8866:16;;-1:-1:-1;8942:15:6;;:68;;8994:11;9009:1;8994:16;;8942:68;;;-1:-1:-1;;;;;8960:26:6;;;:31;8942:68;8938:146;;;9033:40;;;;;-1:-1:-1;;;;;801:55:10;;9033:40:6;;;783:74:10;756:18;;9033:40:6;637:226:10;14:162;-1:-1:-1;;;;;101:5:10;97:54;90:5;87:65;77:93;;166:1;163;156:12;181:269;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:39;414:5;381:39;:::i;868:180::-;927:6;980:2;968:9;959:7;955:23;951:32;948:52;;;996:1;993;986:12;948:52;-1:-1:-1;1019:23:10;;868:180;-1:-1:-1;868:180:10:o;1053:323::-;1121:6;1129;1182:2;1170:9;1161:7;1157:23;1153:32;1150:52;;;1198:1;1195;1188:12;1150:52;1237:9;1224:23;1256:39;1289:5;1256:39;:::i;:::-;1314:5;1366:2;1351:18;;;;1338:32;;-1:-1:-1;;;1053:323:10:o;2383:391::-;2460:6;2468;2476;2529:2;2517:9;2508:7;2504:23;2500:32;2497:52;;;2545:1;2542;2535:12;2497:52;2584:9;2571:23;2603:39;2636:5;2603:39;:::i;:::-;2661:5;2713:2;2698:18;;2685:32;;-1:-1:-1;2764:2:10;2749:18;;;2736:32;;2383:391;-1:-1:-1;;;2383:391:10:o;3114:184::-;3184:6;3237:2;3225:9;3216:7;3212:23;3208:32;3205:52;;;3253:1;3250;3243:12;3205:52;-1:-1:-1;3276:16:10;;3114:184;-1:-1:-1;3114:184:10:o;3897:::-;3949:77;3946:1;3939:88;4046:4;4043:1;4036:15;4070:4;4067:1;4060:15;4086:128;4153:9;;;4174:11;;;4171:37;;;4188:18;;:::i;:::-;4086:128;;;;:::o;4969:277::-;5036:6;5089:2;5077:9;5068:7;5064:23;5060:32;5057:52;;;5105:1;5102;5095:12;5057:52;5137:9;5131:16;5190:5;5183:13;5176:21;5169:5;5166:32;5156:60;;5212:1;5209;5202:12;5600:168;5673:9;;;5704;;5721:15;;;5715:22;;5701:37;5691:71;;5742:18;;:::i;5773:274::-;5813:1;5839;5829:189;;5874:77;5871:1;5864:88;5975:4;5972:1;5965:15;6003:4;6000:1;5993:15;5829:189;-1:-1:-1;6032:9:10;;5773:274::o;7149:125::-;7214:9;;;7235:10;;;7232:36;;;7248:18;;:::i;8927:259::-;8997:6;9050:2;9038:9;9029:7;9025:23;9021:32;9018:52;;;9066:1;9063;9056:12;9018:52;9098:9;9092:16;9117:39;9150:5;9117:39;:::i","linkReferences":{},"immutableReferences":{"877":[{"start":835,"length":32},{"start":3837,"length":32},{"start":3943,"length":32},{"start":5217,"length":32},{"start":6203,"length":32},{"start":6508,"length":32}],"880":[{"start":720,"length":32},{"start":2128,"length":32},{"start":4285,"length":32}],"882":[{"start":609,"length":32}]}}}}}}},"signatures":{"function":[{"signature":"BPS_DENOMINATOR()","signatureHash4":"0xe1a45218","signatureHash32":"0xe1a4521850d50968e490c6d57fa399a06168466e7e5fdca755e15734990c077d"},{"signature":"buy(address,uint256)","signatureHash4":"0xcce7ec13","signatureHash32":"0xcce7ec13039019daeb7946d483b165f6b38de084683a31b06edb866b7a835769"},{"signature":"buyFeeBps()","signatureHash4":"0x77d2300e","signatureHash32":"0x77d2300eda56a777ca4dc587b7091a2aa84245a82f1127216decd341942894f5"},{"signature":"buy(uint256)","signatureHash4":"0xd96a094a","signatureHash32":"0xd96a094a2136bb4bdc6ff7071c32bfd965739d6b1451a5167e1ebf99f9ceed6f"},{"signature":"claimPendingGov()","signatureHash4":"0xf0c9e465","signatureHash32":"0xf0c9e46594888b850f6b370b0e9ad9129d0a2811c8eafdfc2b45a13f4fa75431"},{"signature":"collateral()","signatureHash4":"0xd8dfeb45","signatureHash32":"0xd8dfeb45c97bc90ccb0083a78e72bfb0b5ba747c4da0382471fb4cb159c965b5"},{"signature":"controller()","signatureHash4":"0xf77c4791","signatureHash32":"0xf77c479193cde57766d8942951485a8f17f392317496eb71bad328979039b747"},{"signature":"DOLA()","signatureHash4":"0x92c592d0","signatureHash32":"0x92c592d01e694731497d4485feebfcc101a83ff11640c4de574ce4bcf6905927"},{"signature":"fed()","signatureHash4":"0x53d06f94","signatureHash32":"0x53d06f94d568d86b029f47e015f7916a7bdd6beecc188faba63278c22aa71717"},{"signature":"getCollateralOut(uint256)","signatureHash4":"0xc71a7eff","signatureHash32":"0xc71a7eff3624ab22740ee6652e5c767eaa4ebdacbeb91f6c307f945609a62bb7"},{"signature":"getDolaOut(uint256)","signatureHash4":"0xa0422edf","signatureHash32":"0xa0422edfa1e6e18a36b3e5a99a33d170e32a8cef008f5be68b49ee7acf05831d"},{"signature":"getProfit()","signatureHash4":"0x679dffb4","signatureHash32":"0x679dffb4ee5551ef15bee029fe99fb1ea40fd1daa3b456043c0768a24d1d107a"},{"signature":"getTotalReserves()","signatureHash4":"0x242693d3","signatureHash32":"0x242693d34c900aa92418bb9ad354cdc1ecf7b42e83a21c98363570c74ecb09b1"},{"signature":"gov()","signatureHash4":"0x12d43a51","signatureHash32":"0x12d43a5113d1a5a043fb0a1e225271349c3281c88b25aa7a29badb328e05e064"},{"signature":"migrate(address,uint256,uint256)","signatureHash4":"0xfc22d0e5","signatureHash32":"0xfc22d0e5860ed5fdb2e47229fc678a46a3572b9bbf88dbd9357babde3fec0072"},{"signature":"minTotalSupply()","signatureHash4":"0x79db6346","signatureHash32":"0x79db634612d33e9ae72654b2de264bba9363eb17a9be021ad1aaad5208666782"},{"signature":"pendingGov()","signatureHash4":"0x25240810","signatureHash32":"0x25240810b1354a6deb4201aae978914ac16267679b85c2c4a276da4725e9f260"},{"signature":"sell(address,uint256)","signatureHash4":"0x6c197ff5","signatureHash32":"0x6c197ff5fb3c0793d2ced16096dc40420539c99ae6f83b0c62bea63dab16ac6b"},{"signature":"sellFeeBps()","signatureHash4":"0x23cbe1f3","signatureHash32":"0x23cbe1f3c3ff914d15bf168c0ca107ffa3a47aaa32c92049623d94e618c6b532"},{"signature":"sell(uint256)","signatureHash4":"0xe4849b32","signatureHash32":"0xe4849b329328d01fcc5613b5ce515dc79613939f3329ccc097a6f91ec8e447ee"},{"signature":"setBuyFeeBps(uint256)","signatureHash4":"0x9058c8a4","signatureHash32":"0x9058c8a421fb56fd3b28dcf8890b764ae405bc3d36f39c9859b6edf0c584cc14"},{"signature":"setController(address)","signatureHash4":"0x92eefe9b","signatureHash32":"0x92eefe9bd8b9bd0cb86dccd6276f4fd9d00567c348f149c047110c0fa281cf3e"},{"signature":"setMinTotalSupply(uint256)","signatureHash4":"0xf5d121e6","signatureHash32":"0xf5d121e661cd327743cf23db961b521758f73163507b2e01d162ef81d608bc0a"},{"signature":"setPendingGov(address)","signatureHash4":"0xefdf0bb0","signatureHash32":"0xefdf0bb0c16256f6cf4130ba5695ce101f5b6f5df01c96d975683b8b4f2d9942"},{"signature":"setSellFeeBps(uint256)","signatureHash4":"0x34119d15","signatureHash32":"0x34119d15c2fefe15e7976db47707d0170304fda3333e20d73b183bed918cc383"},{"signature":"supply()","signatureHash4":"0x047fc9aa","signatureHash32":"0x047fc9aa9c43765b87c3a39fed07d345c783ece1257071b04e0cbada77a1af54"},{"signature":"sweep(address)","signatureHash4":"0x01681a62","signatureHash32":"0x01681a628e24156edbc103f46c93d52872d303758d81e660908162d05f3bddea"},{"signature":"takeProfit()","signatureHash4":"0x70c10578","signatureHash32":"0x70c1057896759705161a80e493b8255b90b19600b6f1c79ab75cd1aaa3447945"},{"signature":"vault()","signatureHash4":"0xfbfa77cf","signatureHash32":"0xfbfa77cfa16f85c900b53d1065f840fd1fc574b2cd12cde1a86984206875ef23"}],"event":[{"signature":"Buy(address,uint256,uint256)","signatureHash4":"0x1cbc5ab1","signatureHash32":"0x1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed"},{"signature":"BuyFeeUpdated(uint256,uint256)","signatureHash4":"0x28e297c7","signatureHash32":"0x28e297c7c282931a994191b735b01eaf17558295f761512a7047f4e1b8dc3b0b"},{"signature":"ControllerChanged(address,address)","signatureHash4":"0x6aef1fb5","signatureHash32":"0x6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f7"},{"signature":"GovChanged(address,address)","signatureHash4":"0x3d1e4c3a","signatureHash32":"0x3d1e4c3a68fed9f4f8315582b7297cf8fa264bc8e6704287603ba8c72bf05ac2"},{"signature":"MinTotalSupplyUpdated(uint256,uint256)","signatureHash4":"0xe9b2d6ed","signatureHash32":"0xe9b2d6ed3a1e53a2cbc74ea1516580639c8c1a43411ca794eaa9e101c3c3dea4"},{"signature":"PendingGovUpdated(address)","signatureHash4":"0x0b1b3d8e","signatureHash32":"0x0b1b3d8e19656af9f8acea883020be347ec617cada0060e56959226bb0109c49"},{"signature":"ProfitTaken(uint256)","signatureHash4":"0x949da057","signatureHash32":"0x949da057e0c10ac8c590fc56cf17f0a7f8a424d6f373268e7fc205c8dcbc7bb4"},{"signature":"Sell(address,uint256,uint256)","signatureHash4":"0xed7a144f","signatureHash32":"0xed7a144fad14804d5c249145e3e0e2b63a9eb455b76aee5bc92d711e9bba3e4a"},{"signature":"SellFeeUpdated(uint256,uint256)","signatureHash4":"0x5bafec15","signatureHash32":"0x5bafec153d96f8ef37761b64348732b41a6b477401d244a5070f9f82d689adce"},{"signature":"SupplyCapUpdated(uint256)","signatureHash4":"0x4e44c8be","signatureHash32":"0x4e44c8be34d12f1b7f56b13b4bbe97e64ca37a91916f86c73412da80c21748e2"},{"signature":"VaultMigrated(address,address)","signatureHash4":"0xaa10add0","signatureHash32":"0xaa10add0ff0f23b874d2d1fa353ab28a639aa51906dec303238cdb1f1e54ea42"}],"error":[{"signature":"SafeERC20FailedOperation(address)","signatureHash4":"0x5274afe7","signatureHash32":"0x5274afe73c98b4749fc91ffae6b7b574e7842cb2144a159e9377a5f20b32edf9"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"1","address":"0x1d02f2841afA3Cc20435a8c804C24dEaC5F30DFa"}