diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0946609c..c5636414 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: "CI" on: pull_request: - branches: [main] + branches: [main, fhevm] push: - branches: [main] + branches: [main, fhevm] jobs: ci: @@ -60,7 +60,7 @@ jobs: with: token: ${{ secrets.CODECOV_TOKEN }} files: ./coverage/lcov.info - fail_ci_if_error: true + fail_ci_if_error: false - name: "Add test summary" run: | diff --git a/artifacts/contracts/OrionConfig.sol/OrionConfig.json b/artifacts/contracts/OrionConfig.sol/OrionConfig.json index 079999bb..a6258fde 100644 --- a/artifacts/contracts/OrionConfig.sol/OrionConfig.json +++ b/artifacts/contracts/OrionConfig.sol/OrionConfig.json @@ -223,19 +223,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "encryptedVaultFactory", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -531,14 +518,9 @@ "internalType": "address", "name": "transparentFactory", "type": "address" - }, - { - "internalType": "address", - "name": "encryptedFactory", - "type": "address" } ], - "name": "setVaultFactories", + "name": "setVaultFactory", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -615,8 +597,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b506040516116ce3803806116ce83398101604081905261002e91610238565b816001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610165565b506001600160a01b03811661008d5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556006805461ffff60a01b1916610e0960a01b1790556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa1580156100f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061011d9190610269565b6001600160a01b0382165f908152600b60205260409020805460ff191660ff929092169190911790556101516007826101b4565b5061015d6009836101b4565b505050610290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6101c8836001600160a01b0384166101d1565b90505b92915050565b5f81815260018301602052604081205461021657508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556101cb565b505f6101cb565b80516001600160a01b0381168114610233575f5ffd5b919050565b5f5f60408385031215610249575f5ffd5b6102528361021d565b91506102606020840161021d565b90509250929050565b5f60208284031215610279575f5ffd5b815160ff81168114610289575f5ffd5b9392505050565b6114318061029d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610173575f3560e01c8063015df993146101775780630a8b78c7146101a05780631dbc3c04146101b55780632095b01e146101c857806323a06a1c146101db578063348ec5c8146101ee5780633a0dad8e146102015780633af32abf1461021457806355fba94e14610237578063567ba7131461024a5780635f2483681461027057806366e87e7f1461028b578063715018a61461029e5780637158da7c146102a6578063785c7cf6146102b95780637a0cb784146102e4578063849ede23146102f75780638771de871461030a5780638da5cb5b1461031d5780638ee573ac1461032557806391a848f314610347578063a51b8d5a1461035a578063b6dfcd8b1461036d578063c30dd72714610380578063d1717c7d14610393578063d86cd44e146103a7578063e0876b44146103bc578063ed04f218146103cf578063edcf9c1f146103e2578063f2fde38b146103ea578063f3cc6993146103fd575b5f5ffd5b60065461018a906001600160a01b031681565b60405161019791906111a2565b60405180910390f35b6101b36101ae3660046111d1565b610412565b005b6101b36101c33660046111f8565b61048d565b6101b36101d63660046111d1565b61054a565b6101b36101e9366004611229565b6105c5565b60025461018a906001600160a01b031681565b60035461018a906001600160a01b031681565b6102276102223660046111d1565b610798565b6040519015158152602001610197565b6101b36102453660046111d1565b6107aa565b60065461025e90600160a81b900460ff1681565b60405160ff9091168152602001610197565b6102786107e2565b60405161ffff9091168152602001610197565b6101b3610299366004611269565b6107f2565b6101b361086f565b60015461018a906001600160a01b031681565b61025e6102c73660046111d1565b6001600160a01b03165f908152600b602052604090205460ff1690565b6101b36102f23660046111f8565b610882565b60045461018a906001600160a01b031681565b6102276103183660046111d1565b61097d565b61018a610989565b61025e6103333660046111d1565b600b6020525f908152604090205460ff1681565b60055461018a906001600160a01b031681565b6101b361036836600461128a565b610997565b6101b361037b3660046111d1565b610a81565b6101b361038e3660046111d1565b610bee565b60065461025e90600160a01b900460ff1681565b6103af610c69565b60405161019791906112b2565b6102276103ca3660046111d1565b610d1c565b6103af6103dd3660046112fd565b610d39565b610227610e15565b6101b36103f83660046111d1565b610f26565b60065461027890600160b01b900461ffff1681565b61041a610f63565b6001600160a01b0381166104415760405163d92e233d60e01b815260040160405180910390fd5b6002546001600160a01b03161561046b57604051630ea075bf60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610495610f63565b61049d610e15565b6104ba576040516312aecd8160e01b815260040160405180910390fd5b5f60018260018111156104cf576104cf611316565b036104e6576104df600e84610f95565b90506104f4565b6104f1600c84610f95565b90505b8061051257604051631a27eac360e11b815260040160405180910390fd5b6040516001600160a01b038416907fe47da341e0fc63816c1254f1c35425f69460f49342668d11c984ea56762b00d4905f90a2505050565b610552610f63565b6001600160a01b0381166105795760405163d92e233d60e01b815260040160405180910390fd5b6006546001600160a01b0316156105a357604051630ea075bf60e21b815260040160405180910390fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6105cd610f63565b6105d5610e15565b6105f2576040516312aecd8160e01b815260040160405180910390fd5b5f6105fe600785610fb0565b90508061061e57604051630ea075bf60e21b815260040160405180910390fd5b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561065a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067e919061132a565b6001600160a01b038581165f908152600b602052604090819020805460ff191660ff949094169390931790925560065491516302707eef60e51b8152911690634e0fdde0906106d3908790879060040161134a565b5f604051808303815f87803b1580156106ea575f5ffd5b505af11580156106fc573d5f5f3e3d5ffd5b50506003546040516359017aa960e01b81526001600160a01b0390911692506359017aa99150610732908790869060040161134a565b5f604051808303815f87803b158015610749575f5ffd5b505af115801561075b573d5f5f3e3d5ffd5b50506040516001600160a01b03871692507fdcbd8d9d0373041250f6c25b6b7aeccb3e9ff291e510ef85bb9f8ac09ceb6f6491505f90a250505050565b5f6107a4600783610fc4565b92915050565b6107b2610f63565b5f6107be600983610fb0565b9050806107de57604051630ea075bf60e21b815260040160405180910390fd5b5050565b5f6107ed6007610fd8565b905090565b6107fa610f63565b610802610e15565b61081f576040516312aecd8160e01b815260040160405180910390fd5b6006805461ffff60b01b1916600160b01b61ffff84811682029290921792839055604051920416907f6c0e50288cc602be5dd504ce35358e01341e3c4f93e2e02b5a030a59bfdb84e2905f90a250565b610877610f63565b6108805f610fe1565b565b6004546001600160a01b031633148015906108a857506005546001600160a01b03163314155b156108c657604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0382166108ed5760405163d92e233d60e01b815260040160405180910390fd5b5f600182600181111561090257610902611316565b0361091957610912600e84610fb0565b9050610927565b610924600c84610fb0565b90505b8061094557604051630ea075bf60e21b815260040160405180910390fd5b6040516001600160a01b038416907f9a7094a648c0524f3d62b9167886d30be0e68cf53863fe556edda348f189445a905f90a2505050565b5f6107a4600983610fc4565b5f546001600160a01b031690565b61099f610f63565b6109a7610e15565b6109c4576040516312aecd8160e01b815260040160405180910390fd5b6001600160a01b0382166109eb5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038116610a125760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b0316151580610a3557506005546001600160a01b031615155b15610a5357604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b039384166001600160a01b03199182161790915560058054929093169116179055565b610a89610f63565b610a91610e15565b610aae576040516312aecd8160e01b815260040160405180910390fd5b5f610aba600783610f95565b905080610ae5578160405163751dff9760e11b8152600401610adc91906111a2565b60405180910390fd5b6001600160a01b038083165f908152600b602052604090819020805460ff191690556006549051634386017560e01b8152911690634386017590610b2d9085906004016111a2565b5f604051808303815f87803b158015610b44575f5ffd5b505af1158015610b56573d5f5f3e3d5ffd5b505060035460405163841181ef60e01b81526001600160a01b03909116925063841181ef9150610b8a9085906004016111a2565b5f604051808303815f87803b158015610ba1575f5ffd5b505af1158015610bb3573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f952363a786fc6f24cfb955cd6207cf91ecee3a82a7dd0bc26891ff7647b5784c91505f90a25050565b610bf6610f63565b6001600160a01b038116610c1d5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615610c4757604051630ea075bf60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610c766007610fd8565b90508061ffff166001600160401b03811115610c9457610c94611364565b604051908082528060200260200182016040528015610cbd578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015610d1757610ce1600761ffff8316611030565b838261ffff1681518110610cf757610cf7611378565b6001600160a01b0390921660209283029190910190910152600101610cc2565b505090565b5f610d28600e83610fc4565b806107a457506107a4600c83610fc4565b60605f6001836001811115610d5057610d50611316565b14610d5c57600c610d5f565b600e5b90505f610d6b82610fd8565b90505f8161ffff166001600160401b03811115610d8a57610d8a611364565b604051908082528060200260200182016040528015610db3578160200160208202803683370190505b5090505f5b8261ffff168161ffff161015610e0c57610dd68461ffff8316611030565b828261ffff1681518110610dec57610dec611378565b6001600160a01b0390921660209283029190910190910152600101610db8565b50949350505050565b5f8060035f9054906101000a90046001600160a01b03166001600160a01b031663055ad42e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e67573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8b919061138c565b6003811115610e9c57610e9c611316565b1480156107ed5750600254604080516302ad6a1760e11b815290515f926001600160a01b03169163055ad42e9160048083019260209291908290030181865afa158015610eeb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0f91906113aa565b6007811115610f2057610f20611316565b14905090565b610f2e610f63565b6001600160a01b038116610f57575f604051631e4fbdf760e01b8152600401610adc91906111a2565b610f6081610fe1565b50565b33610f6c610989565b6001600160a01b031614610880573360405163118cdaa760e01b8152600401610adc91906111a2565b5f610fa9836001600160a01b03841661103b565b9392505050565b5f610fa9836001600160a01b03841661111e565b5f610fa9836001600160a01b038416611165565b5f6107a4825490565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f610fa9838361117c565b5f8181526001830160205260408120548015611115575f61105d6001836113c8565b85549091505f90611070906001906113c8565b90508082146110cf575f865f01828154811061108e5761108e611378565b905f5260205f200154905080875f0184815481106110ae576110ae611378565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806110e0576110e06113e7565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506107a4565b5f9150506107a4565b5f6111298383611165565b61115e57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556107a4565b505f6107a4565b5f9081526001919091016020526040902054151590565b5f825f01828154811061119157611191611378565b905f5260205f200154905092915050565b6001600160a01b0391909116815260200190565b80356001600160a01b03811681146111cc575f5ffd5b919050565b5f602082840312156111e1575f5ffd5b610fa9826111b6565b8035600281106111cc575f5ffd5b5f5f60408385031215611209575f5ffd5b611212836111b6565b9150611220602084016111ea565b90509250929050565b5f5f5f6060848603121561123b575f5ffd5b611244846111b6565b9250611252602085016111b6565b9150611260604085016111b6565b90509250925092565b5f60208284031215611279575f5ffd5b813561ffff81168114610fa9575f5ffd5b5f5f6040838503121561129b575f5ffd5b6112a4836111b6565b9150611220602084016111b6565b602080825282518282018190525f918401906040840190835b818110156112f25783516001600160a01b03168352602093840193909201916001016112cb565b509095945050505050565b5f6020828403121561130d575f5ffd5b610fa9826111ea565b634e487b7160e01b5f52602160045260245ffd5b5f6020828403121561133a575f5ffd5b815160ff81168114610fa9575f5ffd5b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561139c575f5ffd5b815160048110610fa9575f5ffd5b5f602082840312156113ba575f5ffd5b815160088110610fa9575f5ffd5b818103818111156107a457634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea264697066735822122033bb690c639a516d7b08bd9464c1be8ad365ad43ae0f981d3692c1e3cf90218264736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610173575f3560e01c8063015df993146101775780630a8b78c7146101a05780631dbc3c04146101b55780632095b01e146101c857806323a06a1c146101db578063348ec5c8146101ee5780633a0dad8e146102015780633af32abf1461021457806355fba94e14610237578063567ba7131461024a5780635f2483681461027057806366e87e7f1461028b578063715018a61461029e5780637158da7c146102a6578063785c7cf6146102b95780637a0cb784146102e4578063849ede23146102f75780638771de871461030a5780638da5cb5b1461031d5780638ee573ac1461032557806391a848f314610347578063a51b8d5a1461035a578063b6dfcd8b1461036d578063c30dd72714610380578063d1717c7d14610393578063d86cd44e146103a7578063e0876b44146103bc578063ed04f218146103cf578063edcf9c1f146103e2578063f2fde38b146103ea578063f3cc6993146103fd575b5f5ffd5b60065461018a906001600160a01b031681565b60405161019791906111a2565b60405180910390f35b6101b36101ae3660046111d1565b610412565b005b6101b36101c33660046111f8565b61048d565b6101b36101d63660046111d1565b61054a565b6101b36101e9366004611229565b6105c5565b60025461018a906001600160a01b031681565b60035461018a906001600160a01b031681565b6102276102223660046111d1565b610798565b6040519015158152602001610197565b6101b36102453660046111d1565b6107aa565b60065461025e90600160a81b900460ff1681565b60405160ff9091168152602001610197565b6102786107e2565b60405161ffff9091168152602001610197565b6101b3610299366004611269565b6107f2565b6101b361086f565b60015461018a906001600160a01b031681565b61025e6102c73660046111d1565b6001600160a01b03165f908152600b602052604090205460ff1690565b6101b36102f23660046111f8565b610882565b60045461018a906001600160a01b031681565b6102276103183660046111d1565b61097d565b61018a610989565b61025e6103333660046111d1565b600b6020525f908152604090205460ff1681565b60055461018a906001600160a01b031681565b6101b361036836600461128a565b610997565b6101b361037b3660046111d1565b610a81565b6101b361038e3660046111d1565b610bee565b60065461025e90600160a01b900460ff1681565b6103af610c69565b60405161019791906112b2565b6102276103ca3660046111d1565b610d1c565b6103af6103dd3660046112fd565b610d39565b610227610e15565b6101b36103f83660046111d1565b610f26565b60065461027890600160b01b900461ffff1681565b61041a610f63565b6001600160a01b0381166104415760405163d92e233d60e01b815260040160405180910390fd5b6002546001600160a01b03161561046b57604051630ea075bf60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610495610f63565b61049d610e15565b6104ba576040516312aecd8160e01b815260040160405180910390fd5b5f60018260018111156104cf576104cf611316565b036104e6576104df600e84610f95565b90506104f4565b6104f1600c84610f95565b90505b8061051257604051631a27eac360e11b815260040160405180910390fd5b6040516001600160a01b038416907fe47da341e0fc63816c1254f1c35425f69460f49342668d11c984ea56762b00d4905f90a2505050565b610552610f63565b6001600160a01b0381166105795760405163d92e233d60e01b815260040160405180910390fd5b6006546001600160a01b0316156105a357604051630ea075bf60e21b815260040160405180910390fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6105cd610f63565b6105d5610e15565b6105f2576040516312aecd8160e01b815260040160405180910390fd5b5f6105fe600785610fb0565b90508061061e57604051630ea075bf60e21b815260040160405180910390fd5b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561065a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067e919061132a565b6001600160a01b038581165f908152600b602052604090819020805460ff191660ff949094169390931790925560065491516302707eef60e51b8152911690634e0fdde0906106d3908790879060040161134a565b5f604051808303815f87803b1580156106ea575f5ffd5b505af11580156106fc573d5f5f3e3d5ffd5b50506003546040516359017aa960e01b81526001600160a01b0390911692506359017aa99150610732908790869060040161134a565b5f604051808303815f87803b158015610749575f5ffd5b505af115801561075b573d5f5f3e3d5ffd5b50506040516001600160a01b03871692507fdcbd8d9d0373041250f6c25b6b7aeccb3e9ff291e510ef85bb9f8ac09ceb6f6491505f90a250505050565b5f6107a4600783610fc4565b92915050565b6107b2610f63565b5f6107be600983610fb0565b9050806107de57604051630ea075bf60e21b815260040160405180910390fd5b5050565b5f6107ed6007610fd8565b905090565b6107fa610f63565b610802610e15565b61081f576040516312aecd8160e01b815260040160405180910390fd5b6006805461ffff60b01b1916600160b01b61ffff84811682029290921792839055604051920416907f6c0e50288cc602be5dd504ce35358e01341e3c4f93e2e02b5a030a59bfdb84e2905f90a250565b610877610f63565b6108805f610fe1565b565b6004546001600160a01b031633148015906108a857506005546001600160a01b03163314155b156108c657604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0382166108ed5760405163d92e233d60e01b815260040160405180910390fd5b5f600182600181111561090257610902611316565b0361091957610912600e84610fb0565b9050610927565b610924600c84610fb0565b90505b8061094557604051630ea075bf60e21b815260040160405180910390fd5b6040516001600160a01b038416907f9a7094a648c0524f3d62b9167886d30be0e68cf53863fe556edda348f189445a905f90a2505050565b5f6107a4600983610fc4565b5f546001600160a01b031690565b61099f610f63565b6109a7610e15565b6109c4576040516312aecd8160e01b815260040160405180910390fd5b6001600160a01b0382166109eb5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038116610a125760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b0316151580610a3557506005546001600160a01b031615155b15610a5357604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b039384166001600160a01b03199182161790915560058054929093169116179055565b610a89610f63565b610a91610e15565b610aae576040516312aecd8160e01b815260040160405180910390fd5b5f610aba600783610f95565b905080610ae5578160405163751dff9760e11b8152600401610adc91906111a2565b60405180910390fd5b6001600160a01b038083165f908152600b602052604090819020805460ff191690556006549051634386017560e01b8152911690634386017590610b2d9085906004016111a2565b5f604051808303815f87803b158015610b44575f5ffd5b505af1158015610b56573d5f5f3e3d5ffd5b505060035460405163841181ef60e01b81526001600160a01b03909116925063841181ef9150610b8a9085906004016111a2565b5f604051808303815f87803b158015610ba1575f5ffd5b505af1158015610bb3573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f952363a786fc6f24cfb955cd6207cf91ecee3a82a7dd0bc26891ff7647b5784c91505f90a25050565b610bf6610f63565b6001600160a01b038116610c1d5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615610c4757604051630ea075bf60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610c766007610fd8565b90508061ffff166001600160401b03811115610c9457610c94611364565b604051908082528060200260200182016040528015610cbd578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015610d1757610ce1600761ffff8316611030565b838261ffff1681518110610cf757610cf7611378565b6001600160a01b0390921660209283029190910190910152600101610cc2565b505090565b5f610d28600e83610fc4565b806107a457506107a4600c83610fc4565b60605f6001836001811115610d5057610d50611316565b14610d5c57600c610d5f565b600e5b90505f610d6b82610fd8565b90505f8161ffff166001600160401b03811115610d8a57610d8a611364565b604051908082528060200260200182016040528015610db3578160200160208202803683370190505b5090505f5b8261ffff168161ffff161015610e0c57610dd68461ffff8316611030565b828261ffff1681518110610dec57610dec611378565b6001600160a01b0390921660209283029190910190910152600101610db8565b50949350505050565b5f8060035f9054906101000a90046001600160a01b03166001600160a01b031663055ad42e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e67573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8b919061138c565b6003811115610e9c57610e9c611316565b1480156107ed5750600254604080516302ad6a1760e11b815290515f926001600160a01b03169163055ad42e9160048083019260209291908290030181865afa158015610eeb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0f91906113aa565b6007811115610f2057610f20611316565b14905090565b610f2e610f63565b6001600160a01b038116610f57575f604051631e4fbdf760e01b8152600401610adc91906111a2565b610f6081610fe1565b50565b33610f6c610989565b6001600160a01b031614610880573360405163118cdaa760e01b8152600401610adc91906111a2565b5f610fa9836001600160a01b03841661103b565b9392505050565b5f610fa9836001600160a01b03841661111e565b5f610fa9836001600160a01b038416611165565b5f6107a4825490565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f610fa9838361117c565b5f8181526001830160205260408120548015611115575f61105d6001836113c8565b85549091505f90611070906001906113c8565b90508082146110cf575f865f01828154811061108e5761108e611378565b905f5260205f200154905080875f0184815481106110ae576110ae611378565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806110e0576110e06113e7565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506107a4565b5f9150506107a4565b5f6111298383611165565b61115e57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556107a4565b505f6107a4565b5f9081526001919091016020526040902054151590565b5f825f01828154811061119157611191611378565b905f5260205f200154905092915050565b6001600160a01b0391909116815260200190565b80356001600160a01b03811681146111cc575f5ffd5b919050565b5f602082840312156111e1575f5ffd5b610fa9826111b6565b8035600281106111cc575f5ffd5b5f5f60408385031215611209575f5ffd5b611212836111b6565b9150611220602084016111ea565b90509250929050565b5f5f5f6060848603121561123b575f5ffd5b611244846111b6565b9250611252602085016111b6565b9150611260604085016111b6565b90509250925092565b5f60208284031215611279575f5ffd5b813561ffff81168114610fa9575f5ffd5b5f5f6040838503121561129b575f5ffd5b6112a4836111b6565b9150611220602084016111b6565b602080825282518282018190525f918401906040840190835b818110156112f25783516001600160a01b03168352602093840193909201916001016112cb565b509095945050505050565b5f6020828403121561130d575f5ffd5b610fa9826111ea565b634e487b7160e01b5f52602160045260245ffd5b5f6020828403121561133a575f5ffd5b815160ff81168114610fa9575f5ffd5b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561139c575f5ffd5b815160048110610fa9575f5ffd5b5f602082840312156113ba575f5ffd5b815160088110610fa9575f5ffd5b818103818111156107a457634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea264697066735822122033bb690c639a516d7b08bd9464c1be8ad365ad43ae0f981d3692c1e3cf90218264736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b5060405161162538038061162583398101604081905261002e91610238565b816001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610165565b506001600160a01b03811661008d5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556005805461ffff60a01b1916610e0960a01b1790556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa1580156100f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061011d9190610269565b6001600160a01b0382165f908152600a60205260409020805460ff191660ff929092169190911790556101516006826101b4565b5061015d6008836101b4565b505050610290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6101c8836001600160a01b0384166101d1565b90505b92915050565b5f81815260018301602052604081205461021657508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556101cb565b505f6101cb565b80516001600160a01b0381168114610233575f5ffd5b919050565b5f5f60408385031215610249575f5ffd5b6102528361021d565b91506102606020840161021d565b90509250929050565b5f60208284031215610279575f5ffd5b815160ff81168114610289575f5ffd5b9392505050565b6113888061029d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610168575f3560e01c8063015df9931461016c5780630a8b78c7146101955780631dbc3c04146101aa5780632095b01e146101bd57806323a06a1c146101d0578063348ec5c8146101e35780633a0dad8e146101f65780633af32abf146102095780633ea7fbdb1461022c57806355fba94e1461023f578063567ba713146102525780635f2483681461027857806366e87e7f14610293578063715018a6146102a65780637158da7c146102ae578063785c7cf6146102c15780637a0cb784146102ec578063849ede23146102ff5780638771de87146103125780638da5cb5b146103255780638ee573ac1461032d578063b6dfcd8b1461034f578063c30dd72714610362578063d1717c7d14610375578063d86cd44e14610389578063e0876b441461039e578063ed04f218146103b1578063edcf9c1f146103c4578063f2fde38b146103cc578063f3cc6993146103df575b5f5ffd5b60055461017f906001600160a01b031681565b60405161018c9190611121565b60405180910390f35b6101a86101a3366004611150565b6103f4565b005b6101a86101b8366004611177565b61046f565b6101a86101cb366004611150565b61052c565b6101a86101de3660046111a8565b6105a7565b60025461017f906001600160a01b031681565b60035461017f906001600160a01b031681565b61021c610217366004611150565b61077a565b604051901515815260200161018c565b6101a861023a366004611150565b61078c565b6101a861024d366004611150565b61082c565b60055461026690600160a81b900460ff1681565b60405160ff909116815260200161018c565b610280610864565b60405161ffff909116815260200161018c565b6101a86102a13660046111e8565b610874565b6101a86108f1565b60015461017f906001600160a01b031681565b6102666102cf366004611150565b6001600160a01b03165f908152600a602052604090205460ff1690565b6101a86102fa366004611177565b610904565b60045461017f906001600160a01b031681565b61021c610320366004611150565b6109e6565b61017f6109f2565b61026661033b366004611150565b600a6020525f908152604090205460ff1681565b6101a861035d366004611150565b610a00565b6101a8610370366004611150565b610b6d565b60055461026690600160a01b900460ff1681565b610391610be8565b60405161018c9190611209565b61021c6103ac366004611150565b610c9b565b6103916103bf366004611254565b610cb8565b61021c610d94565b6101a86103da366004611150565b610ea5565b60055461028090600160b01b900461ffff1681565b6103fc610ee2565b6001600160a01b0381166104235760405163d92e233d60e01b815260040160405180910390fd5b6002546001600160a01b03161561044d57604051630ea075bf60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610477610ee2565b61047f610d94565b61049c576040516312aecd8160e01b815260040160405180910390fd5b5f60018260018111156104b1576104b161126d565b036104c8576104c1600d84610f14565b90506104d6565b6104d3600b84610f14565b90505b806104f457604051631a27eac360e11b815260040160405180910390fd5b6040516001600160a01b038416907fe47da341e0fc63816c1254f1c35425f69460f49342668d11c984ea56762b00d4905f90a2505050565b610534610ee2565b6001600160a01b03811661055b5760405163d92e233d60e01b815260040160405180910390fd5b6005546001600160a01b03161561058557604051630ea075bf60e21b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6105af610ee2565b6105b7610d94565b6105d4576040516312aecd8160e01b815260040160405180910390fd5b5f6105e0600685610f2f565b90508061060057604051630ea075bf60e21b815260040160405180910390fd5b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561063c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190611281565b6001600160a01b038581165f908152600a602052604090819020805460ff191660ff949094169390931790925560055491516302707eef60e51b8152911690634e0fdde0906106b590879087906004016112a1565b5f604051808303815f87803b1580156106cc575f5ffd5b505af11580156106de573d5f5f3e3d5ffd5b50506003546040516359017aa960e01b81526001600160a01b0390911692506359017aa9915061071490879086906004016112a1565b5f604051808303815f87803b15801561072b575f5ffd5b505af115801561073d573d5f5f3e3d5ffd5b50506040516001600160a01b03871692507fdcbd8d9d0373041250f6c25b6b7aeccb3e9ff291e510ef85bb9f8ac09ceb6f6491505f90a250505050565b5f610786600683610f43565b92915050565b610794610ee2565b61079c610d94565b6107b9576040516312aecd8160e01b815260040160405180910390fd5b6001600160a01b0381166107e05760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561080a57604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610834610ee2565b5f610840600883610f2f565b90508061086057604051630ea075bf60e21b815260040160405180910390fd5b5050565b5f61086f6006610f57565b905090565b61087c610ee2565b610884610d94565b6108a1576040516312aecd8160e01b815260040160405180910390fd5b6005805461ffff60b01b1916600160b01b61ffff84811682029290921792839055604051920416907f6c0e50288cc602be5dd504ce35358e01341e3c4f93e2e02b5a030a59bfdb84e2905f90a250565b6108f9610ee2565b6109025f610f60565b565b6004546001600160a01b0316331461092f57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0382166109565760405163d92e233d60e01b815260040160405180910390fd5b5f600182600181111561096b5761096b61126d565b036109825761097b600d84610f2f565b9050610990565b61098d600b84610f2f565b90505b806109ae57604051630ea075bf60e21b815260040160405180910390fd5b6040516001600160a01b038416907f9a7094a648c0524f3d62b9167886d30be0e68cf53863fe556edda348f189445a905f90a2505050565b5f610786600883610f43565b5f546001600160a01b031690565b610a08610ee2565b610a10610d94565b610a2d576040516312aecd8160e01b815260040160405180910390fd5b5f610a39600683610f14565b905080610a64578160405163751dff9760e11b8152600401610a5b9190611121565b60405180910390fd5b6001600160a01b038083165f908152600a602052604090819020805460ff191690556005549051634386017560e01b8152911690634386017590610aac908590600401611121565b5f604051808303815f87803b158015610ac3575f5ffd5b505af1158015610ad5573d5f5f3e3d5ffd5b505060035460405163841181ef60e01b81526001600160a01b03909116925063841181ef9150610b09908590600401611121565b5f604051808303815f87803b158015610b20575f5ffd5b505af1158015610b32573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f952363a786fc6f24cfb955cd6207cf91ecee3a82a7dd0bc26891ff7647b5784c91505f90a25050565b610b75610ee2565b6001600160a01b038116610b9c5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615610bc657604051630ea075bf60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610bf56006610f57565b90508061ffff166001600160401b03811115610c1357610c136112bb565b604051908082528060200260200182016040528015610c3c578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015610c9657610c60600661ffff8316610faf565b838261ffff1681518110610c7657610c766112cf565b6001600160a01b0390921660209283029190910190910152600101610c41565b505090565b5f610ca7600d83610f43565b806107865750610786600b83610f43565b60605f6001836001811115610ccf57610ccf61126d565b14610cdb57600b610cde565b600d5b90505f610cea82610f57565b90505f8161ffff166001600160401b03811115610d0957610d096112bb565b604051908082528060200260200182016040528015610d32578160200160208202803683370190505b5090505f5b8261ffff168161ffff161015610d8b57610d558461ffff8316610faf565b828261ffff1681518110610d6b57610d6b6112cf565b6001600160a01b0390921660209283029190910190910152600101610d37565b50949350505050565b5f8060035f9054906101000a90046001600160a01b03166001600160a01b031663055ad42e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a91906112e3565b6003811115610e1b57610e1b61126d565b14801561086f5750600254604080516302ad6a1760e11b815290515f926001600160a01b03169163055ad42e9160048083019260209291908290030181865afa158015610e6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8e9190611301565b6004811115610e9f57610e9f61126d565b14905090565b610ead610ee2565b6001600160a01b038116610ed6575f604051631e4fbdf760e01b8152600401610a5b9190611121565b610edf81610f60565b50565b33610eeb6109f2565b6001600160a01b031614610902573360405163118cdaa760e01b8152600401610a5b9190611121565b5f610f28836001600160a01b038416610fba565b9392505050565b5f610f28836001600160a01b03841661109d565b5f610f28836001600160a01b0384166110e4565b5f610786825490565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f610f2883836110fb565b5f8181526001830160205260408120548015611094575f610fdc60018361131f565b85549091505f90610fef9060019061131f565b905080821461104e575f865f01828154811061100d5761100d6112cf565b905f5260205f200154905080875f01848154811061102d5761102d6112cf565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061105f5761105f61133e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610786565b5f915050610786565b5f6110a883836110e4565b6110dd57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610786565b505f610786565b5f9081526001919091016020526040902054151590565b5f825f018281548110611110576111106112cf565b905f5260205f200154905092915050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461114b575f5ffd5b919050565b5f60208284031215611160575f5ffd5b610f2882611135565b80356002811061114b575f5ffd5b5f5f60408385031215611188575f5ffd5b61119183611135565b915061119f60208401611169565b90509250929050565b5f5f5f606084860312156111ba575f5ffd5b6111c384611135565b92506111d160208501611135565b91506111df60408501611135565b90509250925092565b5f602082840312156111f8575f5ffd5b813561ffff81168114610f28575f5ffd5b602080825282518282018190525f918401906040840190835b818110156112495783516001600160a01b0316835260209384019390920191600101611222565b509095945050505050565b5f60208284031215611264575f5ffd5b610f2882611169565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215611291575f5ffd5b815160ff81168114610f28575f5ffd5b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112f3575f5ffd5b815160048110610f28575f5ffd5b5f60208284031215611311575f5ffd5b815160058110610f28575f5ffd5b8181038181111561078657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea26469706673582212204dc23679a7cc2198ac36e311131fbce254a13fdb4f8938e8abd60064c4003add64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610168575f3560e01c8063015df9931461016c5780630a8b78c7146101955780631dbc3c04146101aa5780632095b01e146101bd57806323a06a1c146101d0578063348ec5c8146101e35780633a0dad8e146101f65780633af32abf146102095780633ea7fbdb1461022c57806355fba94e1461023f578063567ba713146102525780635f2483681461027857806366e87e7f14610293578063715018a6146102a65780637158da7c146102ae578063785c7cf6146102c15780637a0cb784146102ec578063849ede23146102ff5780638771de87146103125780638da5cb5b146103255780638ee573ac1461032d578063b6dfcd8b1461034f578063c30dd72714610362578063d1717c7d14610375578063d86cd44e14610389578063e0876b441461039e578063ed04f218146103b1578063edcf9c1f146103c4578063f2fde38b146103cc578063f3cc6993146103df575b5f5ffd5b60055461017f906001600160a01b031681565b60405161018c9190611121565b60405180910390f35b6101a86101a3366004611150565b6103f4565b005b6101a86101b8366004611177565b61046f565b6101a86101cb366004611150565b61052c565b6101a86101de3660046111a8565b6105a7565b60025461017f906001600160a01b031681565b60035461017f906001600160a01b031681565b61021c610217366004611150565b61077a565b604051901515815260200161018c565b6101a861023a366004611150565b61078c565b6101a861024d366004611150565b61082c565b60055461026690600160a81b900460ff1681565b60405160ff909116815260200161018c565b610280610864565b60405161ffff909116815260200161018c565b6101a86102a13660046111e8565b610874565b6101a86108f1565b60015461017f906001600160a01b031681565b6102666102cf366004611150565b6001600160a01b03165f908152600a602052604090205460ff1690565b6101a86102fa366004611177565b610904565b60045461017f906001600160a01b031681565b61021c610320366004611150565b6109e6565b61017f6109f2565b61026661033b366004611150565b600a6020525f908152604090205460ff1681565b6101a861035d366004611150565b610a00565b6101a8610370366004611150565b610b6d565b60055461026690600160a01b900460ff1681565b610391610be8565b60405161018c9190611209565b61021c6103ac366004611150565b610c9b565b6103916103bf366004611254565b610cb8565b61021c610d94565b6101a86103da366004611150565b610ea5565b60055461028090600160b01b900461ffff1681565b6103fc610ee2565b6001600160a01b0381166104235760405163d92e233d60e01b815260040160405180910390fd5b6002546001600160a01b03161561044d57604051630ea075bf60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610477610ee2565b61047f610d94565b61049c576040516312aecd8160e01b815260040160405180910390fd5b5f60018260018111156104b1576104b161126d565b036104c8576104c1600d84610f14565b90506104d6565b6104d3600b84610f14565b90505b806104f457604051631a27eac360e11b815260040160405180910390fd5b6040516001600160a01b038416907fe47da341e0fc63816c1254f1c35425f69460f49342668d11c984ea56762b00d4905f90a2505050565b610534610ee2565b6001600160a01b03811661055b5760405163d92e233d60e01b815260040160405180910390fd5b6005546001600160a01b03161561058557604051630ea075bf60e21b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6105af610ee2565b6105b7610d94565b6105d4576040516312aecd8160e01b815260040160405180910390fd5b5f6105e0600685610f2f565b90508061060057604051630ea075bf60e21b815260040160405180910390fd5b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561063c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190611281565b6001600160a01b038581165f908152600a602052604090819020805460ff191660ff949094169390931790925560055491516302707eef60e51b8152911690634e0fdde0906106b590879087906004016112a1565b5f604051808303815f87803b1580156106cc575f5ffd5b505af11580156106de573d5f5f3e3d5ffd5b50506003546040516359017aa960e01b81526001600160a01b0390911692506359017aa9915061071490879086906004016112a1565b5f604051808303815f87803b15801561072b575f5ffd5b505af115801561073d573d5f5f3e3d5ffd5b50506040516001600160a01b03871692507fdcbd8d9d0373041250f6c25b6b7aeccb3e9ff291e510ef85bb9f8ac09ceb6f6491505f90a250505050565b5f610786600683610f43565b92915050565b610794610ee2565b61079c610d94565b6107b9576040516312aecd8160e01b815260040160405180910390fd5b6001600160a01b0381166107e05760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561080a57604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610834610ee2565b5f610840600883610f2f565b90508061086057604051630ea075bf60e21b815260040160405180910390fd5b5050565b5f61086f6006610f57565b905090565b61087c610ee2565b610884610d94565b6108a1576040516312aecd8160e01b815260040160405180910390fd5b6005805461ffff60b01b1916600160b01b61ffff84811682029290921792839055604051920416907f6c0e50288cc602be5dd504ce35358e01341e3c4f93e2e02b5a030a59bfdb84e2905f90a250565b6108f9610ee2565b6109025f610f60565b565b6004546001600160a01b0316331461092f57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0382166109565760405163d92e233d60e01b815260040160405180910390fd5b5f600182600181111561096b5761096b61126d565b036109825761097b600d84610f2f565b9050610990565b61098d600b84610f2f565b90505b806109ae57604051630ea075bf60e21b815260040160405180910390fd5b6040516001600160a01b038416907f9a7094a648c0524f3d62b9167886d30be0e68cf53863fe556edda348f189445a905f90a2505050565b5f610786600883610f43565b5f546001600160a01b031690565b610a08610ee2565b610a10610d94565b610a2d576040516312aecd8160e01b815260040160405180910390fd5b5f610a39600683610f14565b905080610a64578160405163751dff9760e11b8152600401610a5b9190611121565b60405180910390fd5b6001600160a01b038083165f908152600a602052604090819020805460ff191690556005549051634386017560e01b8152911690634386017590610aac908590600401611121565b5f604051808303815f87803b158015610ac3575f5ffd5b505af1158015610ad5573d5f5f3e3d5ffd5b505060035460405163841181ef60e01b81526001600160a01b03909116925063841181ef9150610b09908590600401611121565b5f604051808303815f87803b158015610b20575f5ffd5b505af1158015610b32573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f952363a786fc6f24cfb955cd6207cf91ecee3a82a7dd0bc26891ff7647b5784c91505f90a25050565b610b75610ee2565b6001600160a01b038116610b9c5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615610bc657604051630ea075bf60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610bf56006610f57565b90508061ffff166001600160401b03811115610c1357610c136112bb565b604051908082528060200260200182016040528015610c3c578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015610c9657610c60600661ffff8316610faf565b838261ffff1681518110610c7657610c766112cf565b6001600160a01b0390921660209283029190910190910152600101610c41565b505090565b5f610ca7600d83610f43565b806107865750610786600b83610f43565b60605f6001836001811115610ccf57610ccf61126d565b14610cdb57600b610cde565b600d5b90505f610cea82610f57565b90505f8161ffff166001600160401b03811115610d0957610d096112bb565b604051908082528060200260200182016040528015610d32578160200160208202803683370190505b5090505f5b8261ffff168161ffff161015610d8b57610d558461ffff8316610faf565b828261ffff1681518110610d6b57610d6b6112cf565b6001600160a01b0390921660209283029190910190910152600101610d37565b50949350505050565b5f8060035f9054906101000a90046001600160a01b03166001600160a01b031663055ad42e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a91906112e3565b6003811115610e1b57610e1b61126d565b14801561086f5750600254604080516302ad6a1760e11b815290515f926001600160a01b03169163055ad42e9160048083019260209291908290030181865afa158015610e6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8e9190611301565b6004811115610e9f57610e9f61126d565b14905090565b610ead610ee2565b6001600160a01b038116610ed6575f604051631e4fbdf760e01b8152600401610a5b9190611121565b610edf81610f60565b50565b33610eeb6109f2565b6001600160a01b031614610902573360405163118cdaa760e01b8152600401610a5b9190611121565b5f610f28836001600160a01b038416610fba565b9392505050565b5f610f28836001600160a01b03841661109d565b5f610f28836001600160a01b0384166110e4565b5f610786825490565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f610f2883836110fb565b5f8181526001830160205260408120548015611094575f610fdc60018361131f565b85549091505f90610fef9060019061131f565b905080821461104e575f865f01828154811061100d5761100d6112cf565b905f5260205f200154905080875f01848154811061102d5761102d6112cf565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061105f5761105f61133e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610786565b5f915050610786565b5f6110a883836110e4565b6110dd57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610786565b505f610786565b5f9081526001919091016020526040902054151590565b5f825f018281548110611110576111106112cf565b905f5260205f200154905092915050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461114b575f5ffd5b919050565b5f60208284031215611160575f5ffd5b610f2882611135565b80356002811061114b575f5ffd5b5f5f60408385031215611188575f5ffd5b61119183611135565b915061119f60208401611169565b90509250929050565b5f5f5f606084860312156111ba575f5ffd5b6111c384611135565b92506111d160208501611135565b91506111df60408501611135565b90509250925092565b5f602082840312156111f8575f5ffd5b813561ffff81168114610f28575f5ffd5b602080825282518282018190525f918401906040840190835b818110156112495783516001600160a01b0316835260209384019390920191600101611222565b509095945050505050565b5f60208284031215611264575f5ffd5b610f2882611169565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215611291575f5ffd5b815160ff81168114610f28575f5ffd5b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112f3575f5ffd5b815160048110610f28575f5ffd5b5f60208284031215611311575f5ffd5b815160058110610f28575f5ffd5b8181038181111561078657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea26469706673582212204dc23679a7cc2198ac36e311131fbce254a13fdb4f8938e8abd60064c4003add64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol/OrionAssetERC4626ExecutionAdapter.json b/artifacts/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol/OrionAssetERC4626ExecutionAdapter.json index 7c31d928..5d65e494 100644 --- a/artifacts/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol/OrionAssetERC4626ExecutionAdapter.json +++ b/artifacts/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol/OrionAssetERC4626ExecutionAdapter.json @@ -157,8 +157,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b5060405161098f38038061098f83398101604081905261002e9161019b565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa1580156100ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100cf919061019b565b600180546001600160a01b039283166001600160a01b031991821681179092556002805490911690911790555f5460408051631d06d6c760e11b815290519190921691633a0dad8e9160048083019260209291908290030181865afa15801561013a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061015e919061019b565b600380546001600160a01b0319166001600160a01b0392909216919091179055506101bd565b6001600160a01b0381168114610198575f5ffd5b50565b5f602082840312156101ab575f5ffd5b81516101b681610184565b9392505050565b6107c5806101ca5f395ff3fe608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633a0dad8e146100645780636c197ff51461008d5780637158da7c146100ae57806379502c55146100c1578063ad071f00146100d3578063cce7ec13146100e6575b5f5ffd5b600354610077906001600160a01b031681565b60405161008491906106c9565b60405180910390f35b6100a061009b3660046106f4565b6100f9565b604051908152602001610084565b600154610077906001600160a01b031681565b5f54610077906001600160a01b031681565b600254610077906001600160a01b031681565b6100a06100f43660046106f4565b610276565b6003545f906001600160a01b0316331461012657604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610180575060408051601f3d908101601f1916820190925261017d9181019061071e565b60015b61019d5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101cb5760405163e6c4247b60e01b815260040160405180910390fd5b50815f036101f75782604051636b30633560e01b81526004016101ee91906106c9565b60405180910390fd5b604051635d043b2960e11b8152600481018390523360248201819052604482015283906001600160a01b0382169063ba087652906064016020604051808303815f875af115801561024a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026e9190610740565b949350505050565b6003545f906001600160a01b031633146102a357604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156102fd575060408051601f3d908101601f191682019092526102fa9181019061071e565b60015b61031a5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146103485760405163e6c4247b60e01b815260040160405180910390fd5b50815f0361036b5782604051636b30633560e01b81526004016101ee91906106c9565b60405163b3d7f6b960e01b81526004810183905283906001600160a01b0382169063b3d7f6b990602401602060405180830381865afa1580156103b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d49190610740565b6002549092506103ef906001600160a01b0316333085610524565b600254610406906001600160a01b03168584610591565b604051636e553f6560e01b8152600481018390523060248201526001600160a01b03821690636e553f65906044016020604051808303815f875af1158015610450573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104749190610740565b5060025461048c906001600160a01b0316855f610591565b60405163a9059cbb60e01b81525f906001600160a01b0383169063a9059cbb906104bc9033908890600401610757565b6020604051808303815f875af11580156104d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fc9190610770565b90508061051c576040516312171d8360e31b815260040160405180910390fd5b505092915050565b6040516001600160a01b03848116602483015283811660448301526064820183905261058b9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061061d565b50505050565b5f836001600160a01b031663095ea7b384846040516024016105b4929190610757565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505090506105ed8482610680565b61058b5761061784856001600160a01b031663095ea7b3865f604051602401610559929190610757565b61058b84825b5f5f60205f8451602086015f885af18061063c576040513d5f823e3d81fd5b50505f513d91508115610653578060011415610660565b6001600160a01b0384163b155b1561058b5783604051635274afe760e01b81526004016101ee91906106c9565b5f5f5f5f60205f8651602088015f8a5af192503d91505f5190508280156106bf575081156106b157806001146106bf565b5f866001600160a01b03163b115b9695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146106f1575f5ffd5b50565b5f5f60408385031215610705575f5ffd5b8235610710816106dd565b946020939093013593505050565b5f6020828403121561072e575f5ffd5b8151610739816106dd565b9392505050565b5f60208284031215610750575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b5f60208284031215610780575f5ffd5b81518015158114610739575f5ffdfea264697066735822122012a758e657031e20f958f09b3d0b96f04e75fb95c25e7b84fa6bed629fe4921d64736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633a0dad8e146100645780636c197ff51461008d5780637158da7c146100ae57806379502c55146100c1578063ad071f00146100d3578063cce7ec13146100e6575b5f5ffd5b600354610077906001600160a01b031681565b60405161008491906106c9565b60405180910390f35b6100a061009b3660046106f4565b6100f9565b604051908152602001610084565b600154610077906001600160a01b031681565b5f54610077906001600160a01b031681565b600254610077906001600160a01b031681565b6100a06100f43660046106f4565b610276565b6003545f906001600160a01b0316331461012657604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610180575060408051601f3d908101601f1916820190925261017d9181019061071e565b60015b61019d5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101cb5760405163e6c4247b60e01b815260040160405180910390fd5b50815f036101f75782604051636b30633560e01b81526004016101ee91906106c9565b60405180910390fd5b604051635d043b2960e11b8152600481018390523360248201819052604482015283906001600160a01b0382169063ba087652906064016020604051808303815f875af115801561024a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026e9190610740565b949350505050565b6003545f906001600160a01b031633146102a357604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156102fd575060408051601f3d908101601f191682019092526102fa9181019061071e565b60015b61031a5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146103485760405163e6c4247b60e01b815260040160405180910390fd5b50815f0361036b5782604051636b30633560e01b81526004016101ee91906106c9565b60405163b3d7f6b960e01b81526004810183905283906001600160a01b0382169063b3d7f6b990602401602060405180830381865afa1580156103b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d49190610740565b6002549092506103ef906001600160a01b0316333085610524565b600254610406906001600160a01b03168584610591565b604051636e553f6560e01b8152600481018390523060248201526001600160a01b03821690636e553f65906044016020604051808303815f875af1158015610450573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104749190610740565b5060025461048c906001600160a01b0316855f610591565b60405163a9059cbb60e01b81525f906001600160a01b0383169063a9059cbb906104bc9033908890600401610757565b6020604051808303815f875af11580156104d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fc9190610770565b90508061051c576040516312171d8360e31b815260040160405180910390fd5b505092915050565b6040516001600160a01b03848116602483015283811660448301526064820183905261058b9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061061d565b50505050565b5f836001600160a01b031663095ea7b384846040516024016105b4929190610757565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505090506105ed8482610680565b61058b5761061784856001600160a01b031663095ea7b3865f604051602401610559929190610757565b61058b84825b5f5f60205f8451602086015f885af18061063c576040513d5f823e3d81fd5b50505f513d91508115610653578060011415610660565b6001600160a01b0384163b155b1561058b5783604051635274afe760e01b81526004016101ee91906106c9565b5f5f5f5f60205f8651602088015f8a5af192503d91505f5190508280156106bf575081156106b157806001146106bf565b5f866001600160a01b03163b115b9695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146106f1575f5ffd5b50565b5f5f60408385031215610705575f5ffd5b8235610710816106dd565b946020939093013593505050565b5f6020828403121561072e575f5ffd5b8151610739816106dd565b9392505050565b5f60208284031215610750575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b5f60208284031215610780575f5ffd5b81518015158114610739575f5ffdfea264697066735822122012a758e657031e20f958f09b3d0b96f04e75fb95c25e7b84fa6bed629fe4921d64736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b5060405161098f38038061098f83398101604081905261002e9161019b565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa1580156100ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100cf919061019b565b600180546001600160a01b039283166001600160a01b031991821681179092556002805490911690911790555f5460408051631d06d6c760e11b815290519190921691633a0dad8e9160048083019260209291908290030181865afa15801561013a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061015e919061019b565b600380546001600160a01b0319166001600160a01b0392909216919091179055506101bd565b6001600160a01b0381168114610198575f5ffd5b50565b5f602082840312156101ab575f5ffd5b81516101b681610184565b9392505050565b6107c5806101ca5f395ff3fe608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633a0dad8e146100645780636c197ff51461008d5780637158da7c146100ae57806379502c55146100c1578063ad071f00146100d3578063cce7ec13146100e6575b5f5ffd5b600354610077906001600160a01b031681565b60405161008491906106c9565b60405180910390f35b6100a061009b3660046106f4565b6100f9565b604051908152602001610084565b600154610077906001600160a01b031681565b5f54610077906001600160a01b031681565b600254610077906001600160a01b031681565b6100a06100f43660046106f4565b610276565b6003545f906001600160a01b0316331461012657604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610180575060408051601f3d908101601f1916820190925261017d9181019061071e565b60015b61019d5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101cb5760405163e6c4247b60e01b815260040160405180910390fd5b50815f036101f75782604051636b30633560e01b81526004016101ee91906106c9565b60405180910390fd5b604051635d043b2960e11b8152600481018390523360248201819052604482015283906001600160a01b0382169063ba087652906064016020604051808303815f875af115801561024a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026e9190610740565b949350505050565b6003545f906001600160a01b031633146102a357604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156102fd575060408051601f3d908101601f191682019092526102fa9181019061071e565b60015b61031a5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146103485760405163e6c4247b60e01b815260040160405180910390fd5b50815f0361036b5782604051636b30633560e01b81526004016101ee91906106c9565b60405163b3d7f6b960e01b81526004810183905283906001600160a01b0382169063b3d7f6b990602401602060405180830381865afa1580156103b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d49190610740565b6002549092506103ef906001600160a01b0316333085610524565b600254610406906001600160a01b03168584610591565b604051636e553f6560e01b8152600481018390523060248201526001600160a01b03821690636e553f65906044016020604051808303815f875af1158015610450573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104749190610740565b5060025461048c906001600160a01b0316855f610591565b60405163a9059cbb60e01b81525f906001600160a01b0383169063a9059cbb906104bc9033908890600401610757565b6020604051808303815f875af11580156104d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fc9190610770565b90508061051c576040516312171d8360e31b815260040160405180910390fd5b505092915050565b6040516001600160a01b03848116602483015283811660448301526064820183905261058b9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061061d565b50505050565b5f836001600160a01b031663095ea7b384846040516024016105b4929190610757565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505090506105ed8482610680565b61058b5761061784856001600160a01b031663095ea7b3865f604051602401610559929190610757565b61058b84825b5f5f60205f8451602086015f885af18061063c576040513d5f823e3d81fd5b50505f513d91508115610653578060011415610660565b6001600160a01b0384163b155b1561058b5783604051635274afe760e01b81526004016101ee91906106c9565b5f5f5f5f60205f8651602088015f8a5af192503d91505f5190508280156106bf575081156106b157806001146106bf565b5f866001600160a01b03163b115b9695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146106f1575f5ffd5b50565b5f5f60408385031215610705575f5ffd5b8235610710816106dd565b946020939093013593505050565b5f6020828403121561072e575f5ffd5b8151610739816106dd565b9392505050565b5f60208284031215610750575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b5f60208284031215610780575f5ffd5b81518015158114610739575f5ffdfea2646970667358221220c70ca0d5ebb3a797b3fe0d1d4ed70d5476868585f8373c2ca89aad2638323f3964736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633a0dad8e146100645780636c197ff51461008d5780637158da7c146100ae57806379502c55146100c1578063ad071f00146100d3578063cce7ec13146100e6575b5f5ffd5b600354610077906001600160a01b031681565b60405161008491906106c9565b60405180910390f35b6100a061009b3660046106f4565b6100f9565b604051908152602001610084565b600154610077906001600160a01b031681565b5f54610077906001600160a01b031681565b600254610077906001600160a01b031681565b6100a06100f43660046106f4565b610276565b6003545f906001600160a01b0316331461012657604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610180575060408051601f3d908101601f1916820190925261017d9181019061071e565b60015b61019d5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101cb5760405163e6c4247b60e01b815260040160405180910390fd5b50815f036101f75782604051636b30633560e01b81526004016101ee91906106c9565b60405180910390fd5b604051635d043b2960e11b8152600481018390523360248201819052604482015283906001600160a01b0382169063ba087652906064016020604051808303815f875af115801561024a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026e9190610740565b949350505050565b6003545f906001600160a01b031633146102a357604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156102fd575060408051601f3d908101601f191682019092526102fa9181019061071e565b60015b61031a5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146103485760405163e6c4247b60e01b815260040160405180910390fd5b50815f0361036b5782604051636b30633560e01b81526004016101ee91906106c9565b60405163b3d7f6b960e01b81526004810183905283906001600160a01b0382169063b3d7f6b990602401602060405180830381865afa1580156103b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d49190610740565b6002549092506103ef906001600160a01b0316333085610524565b600254610406906001600160a01b03168584610591565b604051636e553f6560e01b8152600481018390523060248201526001600160a01b03821690636e553f65906044016020604051808303815f875af1158015610450573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104749190610740565b5060025461048c906001600160a01b0316855f610591565b60405163a9059cbb60e01b81525f906001600160a01b0383169063a9059cbb906104bc9033908890600401610757565b6020604051808303815f875af11580156104d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fc9190610770565b90508061051c576040516312171d8360e31b815260040160405180910390fd5b505092915050565b6040516001600160a01b03848116602483015283811660448301526064820183905261058b9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061061d565b50505050565b5f836001600160a01b031663095ea7b384846040516024016105b4929190610757565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505090506105ed8482610680565b61058b5761061784856001600160a01b031663095ea7b3865f604051602401610559929190610757565b61058b84825b5f5f60205f8451602086015f885af18061063c576040513d5f823e3d81fd5b50505f513d91508115610653578060011415610660565b6001600160a01b0384163b155b1561058b5783604051635274afe760e01b81526004016101ee91906106c9565b5f5f5f5f60205f8651602088015f8a5af192503d91505f5190508280156106bf575081156106b157806001146106bf565b5f866001600160a01b03163b115b9695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146106f1575f5ffd5b50565b5f5f60408385031215610705575f5ffd5b8235610710816106dd565b946020939093013593505050565b5f6020828403121561072e575f5ffd5b8151610739816106dd565b9392505050565b5f60208284031215610750575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b5f60208284031215610780575f5ffd5b81518015158114610739575f5ffdfea2646970667358221220c70ca0d5ebb3a797b3fe0d1d4ed70d5476868585f8373c2ca89aad2638323f3964736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/factories/EncryptedVaultFactory.sol/EncryptedVaultFactory.json b/artifacts/contracts/factories/EncryptedVaultFactory.sol/EncryptedVaultFactory.json deleted file mode 100644 index eb1003af..00000000 --- a/artifacts/contracts/factories/EncryptedVaultFactory.sol/EncryptedVaultFactory.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "EncryptedVaultFactory", - "sourceName": "contracts/factories/EncryptedVaultFactory.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "configAddress", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "SystemNotIdle", - "type": "error" - }, - { - "inputs": [], - "name": "UnauthorizedAccess", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddress", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "vault", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "vaultOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "curator", - "type": "address" - }, - { - "indexed": false, - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "symbol", - "type": "string" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "feeType", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint16", - "name": "performanceFee", - "type": "uint16" - }, - { - "indexed": false, - "internalType": "uint16", - "name": "managementFee", - "type": "uint16" - }, - { - "indexed": false, - "internalType": "enum EventsLib.VaultType", - "name": "vaultType", - "type": "uint8" - } - ], - "name": "OrionVaultCreated", - "type": "event" - }, - { - "inputs": [], - "name": "config", - "outputs": [ - { - "internalType": "contract IOrionConfig", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "curator", - "type": "address" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "string", - "name": "symbol", - "type": "string" - }, - { - "internalType": "uint8", - "name": "feeType", - "type": "uint8" - }, - { - "internalType": "uint16", - "name": "performanceFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "managementFee", - "type": "uint16" - } - ], - "name": "createVault", - "outputs": [ - { - "internalType": "address", - "name": "vault", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x6080604052348015600e575f5ffd5b50604051615ae7380380615ae7833981016040819052602b916074565b6001600160a01b03811660515760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0392909216919091179055609f565b5f602082840312156083575f5ffd5b81516001600160a01b03811681146098575f5ffd5b9392505050565b615a3b806100ac5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610349565b610073565b604051610058919061040a565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a390849060040161040a565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041e565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041e565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e2565b6101f39a9998979695949392919061046c565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f54604051631e832de160e21b81529194508492506001600160a01b031690637a0cb784906102439084906001906004016104ff565b5f604051808303815f87803b15801561025a575f5ffd5b505af115801561026c573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d60016040516102cc98979695949392919061051c565b60405180910390a4505098975050505050505050565b6154898061057d83390190565b5f5f83601f8401126102ff575f5ffd5b5081356001600160401b03811115610315575f5ffd5b60208301915083602082850101111561032c575f5ffd5b9250929050565b803561ffff81168114610344575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b031215610360575f5ffd5b88356001600160a01b0381168114610376575f5ffd5b975060208901356001600160401b03811115610390575f5ffd5b61039c8b828c016102ef565b90985096505060408901356001600160401b038111156103ba575f5ffd5b6103c68b828c016102ef565b909650945050606089013560ff811681146103df575f5ffd5b92506103ed60808a01610333565b91506103fb60a08a01610333565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042e575f5ffd5b8151801515811461043d575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f906104a1908301898b610444565b82810360808401526104b481888a610444565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104fb57634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043d60208301846104df565b60c081525f61052f60c083018a8c610444565b828103602084015261054281898b610444565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056f60a08301846104df565b999850505050505050505056fe60c060405234801561000f575f5ffd5b5060405161548938038061548983398101604081905261002e91610b0b565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610bda565b858561013b610136604080516080810182525f80825260208201819052918101829052606081019190915250604080516080810182527350157cffd6bbfa2dece204a89ec419c23ef5755d815273cd3ab3bd6bcc0c0bf3e27912a92043e817b1cf69602082015273a02cda4ca3a71d7c46997716f4283aa851c2881291810191909152731364cbbf2cdf5032c47d8226a6f6fbd2afcdacac606082015290565b610605565b60036101478382610c79565b5060046101548282610c79565b5050505f5f610168836106be60201b60201c565b915091508161017857601261017a565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101b45760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101db5760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa15801561024f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102739190610bda565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f89190610bda565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d33565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103e9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040d9190610bda565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610448573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046c9190610d33565b9050601260ff8216111561049357604051631c03248960e11b815260040160405180910390fd5b600460ff851611156104b8576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff841611156104df576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610506576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561051b5761051b610d4c565b6017805460ff1916600183600481111561053757610537610d4c565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff00199092169190911717905561057a81600a610e57565b601855610585610794565b50505050505050505061059d5f61086960201b60201c565b601e556105aa6001610884565b601f55600a80546105ce916105c991600160a01b900460ff1690610e57565b610869565b602055601e546105dd9061089f565b50601f546105ea9061089f565b506020546105f79061089f565b505050505050505050610f88565b80515f5160206154695f395f51905f5280546001600160a01b03199081166001600160a01b039384161790915560208301515f5160206154495f395f51905f528054831691841691909117905560408301517f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497028054831691841691909117905560608301517f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497038054909216921691909117905550565b50565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161070491610e65565b5f60405180830381855afa9150503d805f811461073c576040519150601f19603f3d011682016040523d82523d5f602084013e610741565b606091505b509150915081801561075557506020815110155b15610788575f8180602001905181019061076f9190610e7b565b905060ff8111610786576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa1580156107da573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108019190810190610e92565b90505f5b8151811015610865575f61083c83838151811061082457610824610f44565b6020026020010151600b6108ae60201b90919060201c565b90508061085c57604051630ea075bf60e21b815260040160405180910390fd5b50600101610805565b5050565b5f61087e6001600160801b03831660066108c9565b92915050565b5f61087e82610893575f610896565b60015b60ff165f6108c9565b5f6108aa8230610960565b5090565b5f6108c2836001600160a01b0384166109d6565b9392505050565b5f5160206154495f395f51905f5254604051639cd07acb60e01b81525f915f5160206154695f395f51905f52916001600160a01b0390911690639cd07acb906109189087908790600401610f58565b6020604051808303815f875af1158015610934573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109589190610e7b565b949350505050565b5f5f5160206154695f395f51905f528054604051635ca4b5b160e11b8152600481018690526001600160a01b03858116602483015292935091169063b9496b62906044015f604051808303815f87803b1580156109bb575f5ffd5b505af11580156109cd573d5f5f3e3d5ffd5b50505050505050565b5f818152600183016020526040812054610a1b57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561087e565b505f61087e565b6001600160a01b03811681146106bb575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715610a7257610a72610a36565b604052919050565b5f82601f830112610a89575f5ffd5b81516001600160401b03811115610aa257610aa2610a36565b610ab5601f8201601f1916602001610a4a565b818152846020838601011115610ac9575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff81168114610af5575f5ffd5b919050565b805161ffff81168114610af5575f5ffd5b5f5f5f5f5f5f5f5f610100898b031215610b23575f5ffd5b8851610b2e81610a22565b60208a0151909850610b3f81610a22565b60408a0151909750610b5081610a22565b60608a01519096506001600160401b03811115610b6b575f5ffd5b610b778b828c01610a7a565b60808b015190965090506001600160401b03811115610b94575f5ffd5b610ba08b828c01610a7a565b945050610baf60a08a01610ae5565b9250610bbd60c08a01610afa565b9150610bcb60e08a01610afa565b90509295985092959890939650565b5f60208284031215610bea575f5ffd5b81516108c281610a22565b600181811c90821680610c0957607f821691505b602082108103610c2757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c7457805f5260205f20601f840160051c81016020851015610c525750805b601f840160051c820191505b81811015610c71575f8155600101610c5e565b50505b505050565b81516001600160401b03811115610c9257610c92610a36565b610ca681610ca08454610bf5565b84610c2d565b6020601f821160018114610cd8575f8315610cc15750848201515b5f19600385901b1c1916600184901b178455610c71565b5f84815260208120601f198516915b82811015610d075787850151825560209485019460019092019101610ce7565b5084821015610d2457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610d43575f5ffd5b6108c282610ae5565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610daf57808504811115610d9357610d93610d60565b6001841615610da157908102905b60019390931c928002610d78565b935093915050565b5f82610dc55750600161087e565b81610dd157505f61087e565b8160018114610de75760028114610df157610e0d565b600191505061087e565b60ff841115610e0257610e02610d60565b50506001821b61087e565b5060208310610133831016604e8410600b8410161715610e30575081810a61087e565b610e3c5f198484610d74565b805f1904821115610e4f57610e4f610d60565b029392505050565b5f6108c260ff841683610db7565b5f82518060208501845e5f920191825250919050565b5f60208284031215610e8b575f5ffd5b5051919050565b5f60208284031215610ea2575f5ffd5b81516001600160401b03811115610eb7575f5ffd5b8201601f81018413610ec7575f5ffd5b80516001600160401b03811115610ee057610ee0610a36565b8060051b610ef060208201610a4a565b91825260208184018101929081019087841115610f0b575f5ffd5b6020850194505b83851015610f395784519250610f2783610a22565b82825260209485019490910190610f12565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b8281526040810160548310610f7b57634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b60805160a0516144a3610fa65f395f50505f610e0301526144a35ff3fe608060405234801561000f575f5ffd5b50600436106102d7575f3560e01c806395d89b411161018157806395d89b411461051c57806397ee1144146105245780639908840c1461055a5780639adb298114610563578063a68a526714610576578063a9059cbb14610589578063aa2f892d1461059c578063acdb3d51146105af578063b3d7f6b914610352578063b460af94146105b8578063b6eba653146105c6578063ba087652146105b8578063bdca9165146105dc578063c0b568e1146105e5578063c392e58c146105f8578063c3f0d30e1461060b578063c63d75b61461045d578063c6e6f5921461061e578063ce96cb7714610631578063d1717c7d14610644578063d3d0345814610658578063d853365f14610660578063d905777e14610668578063da1f12ab1461067b578063dceb7e2814610683578063dd62ed3e14610690578063e51a85f6146106a3578063e5e97193146106b6578063e66f53b7146106c9578063ef8b30f714610352578063f64c6f32146106dc575f5ffd5b806301e1d114146102db57806303d44854146102f257806306fdde031461030757806307a2d13a1461031c578063095ea7b31461032f5780630a28a477146103525780630a605c6d146103655780630c6a62dd1461036d5780630d1e6667146103805780630df571f7146103935780630fdca94f146103a657806318160ddd146103b957806318c21949146103c15780631f52692b146103d457806323b872dd146103f4578063313ce56714610407578063348ec5c81461041c57806338d52e0f1461042f5780633a0dad8e146104375780633ab6d27c1461044a578063402d267d1461045d578063493a6e21146104715780634cdad506146103525780634e85b135146104845780636e553f651461049957806370a08231146104a75780637847ea53146104ba57806379502c55146104da57806380ceebfe146104ed5780638f5c94651461050057806394bf804d14610499575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b610305610300366004613aa9565b6106e4565b005b61030f61081e565b6040516102e99190613b46565b6102df61032a366004613b58565b6108ae565b61034261033d366004613b8a565b6108bf565b60405190151581526020016102e9565b6102df610360366004613b58565b6108d6565b6015546102df565b61030561037b366004613bb2565b6108f0565b61030561038e366004613b58565b61098b565b6103056103a1366004613bcb565b610bfc565b6103056103b4366004613c28565b610c77565b6002546102df565b6103056103cf366004613b58565b610d0d565b6006546103e7906001600160a01b031681565b6040516102e99190613c9f565b610342610402366004613cb3565b610ddc565b60125b60405160ff90911681526020016102e9565b6009546103e7906001600160a01b031681565b6103e7610e01565b600a546103e7906001600160a01b031681565b610305610458366004613d0a565b610e25565b6102df61046b366004613bb2565b505f1990565b61030561047f366004613b58565b610ff2565b61048c611339565b6040516102e99190613d95565b6102df610360366004613da7565b6102df6104b5366004613bb2565b61134a565b6104c56301e1338081565b60405163ffffffff90911681526020016102e9565b6008546103e7906001600160a01b031681565b6102df6104fb366004613dd1565b611364565b61050961271081565b60405161ffff90911681526020016102e9565b61030f6113a4565b60175460185461054a9160ff81169161ffff610100830481169263010000009004169084565b6040516102e99493929190613e13565b61050961012c81565b610305610571366004613e85565b6113b3565b6102df610584366004613dd1565b611585565b610342610597366004613b8a565b6115b4565b6103056105aa366004613b58565b6115c1565b6102df60165481565b6102df610360366004613ecc565b6105ce61179a565b6040516102e9929190613f05565b610509610bb881565b6103056105f3366004613b58565b61191b565b610305610606366004613f5d565b611ad5565b610305610619366004613b58565b611f45565b6102df61062c366004613b58565b612139565b6102df61063f366004613bb2565b612144565b600a5461040a90600160a01b900460ff1681565b6105ce612157565b61040a601281565b6102df610676366004613bb2565b6122bb565b6127116102df565b6021546103429060ff1681565b6102df61069e366004613fc7565b6122c5565b6102df6106b1366004613b58565b6122ef565b6103056106c4366004613b58565b612328565b6007546103e7906001600160a01b031681565b6014546102df565b6006546001600160a01b0316331461070f57604051631a27eac360e11b815260040160405180910390fd5b610719600b612600565b5f5b81811015610819575f83838381811061073657610736613fef565b905060200201602081019061074b9190613bb2565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf9061077c908490600401613c9f565b602060405180830381865afa158015610797573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107bb9190614010565b6107e3578060405163751dff9760e11b81526004016107da9190613c9f565b60405180910390fd5b5f6107ef600b83612609565b90508061080f57604051630ea075bf60e21b815260040160405180910390fd5b505060010161071b565b505050565b60606003805461082d9061402b565b80601f01602080910402602001604051908101604052809291908181526020018280546108599061402b565b80156108a45780601f1061087b576101008083540402835291602001916108a4565b820191905f5260205f20905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b5f6108b9825f61261d565b92915050565b5f336108cc81858561265e565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b0316331461091b57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0381166109425760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61099361266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a079190614010565b610a24576040516312aecd8160e01b815260040160405180910390fd5b805f03610a4d57610a33610e01565b604051636b30633560e01b81526004016107da9190613c9f565b5f610a56610e01565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a819190613c9f565b602060405180830381865afa158015610a9c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac09190614063565b905080821115610ae357604051632ca2f52b60e11b815260040160405180910390fd5b5f610aec610e01565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610b2292339290911690889060040161407a565b6020604051808303815f875af1158015610b3e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190614010565b905080610b82576040516312171d8360e31b815260040160405180910390fd5b5f610b8e600e33612695565b9150610ba9905033610ba086846140b2565b600e91906126bb565b508360145f828254610bbb91906140b2565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bf96001600555565b50565b6009546001600160a01b03163314610c2757604051631a27eac360e11b815260040160405180910390fd5b8015610c73578060165f828254610c3e91906140b2565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b610ce98585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284375f920191909152506126d092505050565b610cf5838501856140c5565b6021805460ff19169115159190911790555050505050565b6006546001600160a01b03163314610d3857604051631a27eac360e11b815260040160405180910390fd5b805f03610d4757610a33610e01565b601654811115610d6a57604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610d7b91906140e0565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610dc3575f5ffd5b505af1158015610dd5573d5f5f3e3d5ffd5b5050505050565b5f33610de9858285612739565b610df4858585612784565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610e5057604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec49190614010565b610ee1576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f06576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f2d576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610f54576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610f6957610f69613dff565b6017805460ff19166001836004811115610f8557610f85613dff565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461101d57604051631a27eac360e11b815260040160405180910390fd5b61102561266b565b5f61103060116127e1565b90508063ffffffff165f03611045575061132f565b5f8163ffffffff166001600160401b03811115611064576110646140f3565b60405190808252806020026020018201604052801561108d578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156110af576110af6140f3565b6040519080825280602002602001820160405280156110d8578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015611172575f80611107601163ffffffff808616906127eb16565b9150915081858463ffffffff168151811061112457611124613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061115d5761115d613fef565b602090810291909101015250506001016110dd565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156111c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e59190614107565b90505f5b8463ffffffff168163ffffffff161015611329575f848263ffffffff168151811061121657611216613fef565b602002602001015190505f848363ffffffff168151811061123957611239613fef565b602002602001015190506112578260116127f990919063ffffffff16565b505f611264828a5f611585565b9050611270308361280d565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906112a29086908590600401614122565b5f604051808303815f87803b1580156112b9575f5ffd5b505af11580156112cb573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a45050508060010190506111e9565b50505050505b610bf96001600555565b6060611345600b612841565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f61139c61137061284d565b61137b90600a61421e565b60025461138891906140b2565b6113938560016140b2565b869190856128c9565b949350505050565b60606004805461082d9061402b565b6009546001600160a01b031633146113de57604051631a27eac360e11b815260040160405180910390fd5b601a545f5b8161ffff168161ffff16101561143c57601e5460195f601a8461ffff168154811061141057611410613fef565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556001016113e3565b50611448601a5f613a39565b825f5b8161ffff168161ffff1610156115285785858261ffff1681811061147157611471613fef565b9050604002016020013560195f88888561ffff1681811061149457611494613fef565b6114aa9260206040909202019081019150613bb2565b6001600160a01b0316815260208101919091526040015f2055601a868661ffff84168181106114db576114db613fef565b6114f19260206040909202019081019150613bb2565b8154600180820184555f93845260209093200180546001600160a01b0319166001600160a01b03929092169190911790550161144b565b50600d8390555f61154060125b61032a90600a61421e565b6018549091508111156115535760188190555b60405184907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a2505050505050565b5f61139c6115948460016140b2565b61159c61284d565b6115a790600a61421e565b60025461139391906140b2565b5f336108cc818585612784565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611611573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116359190614010565b611652576040516312aecd8160e01b815260040160405180910390fd5b805f036116745730604051636b30633560e01b81526004016107da9190613c9f565b5f61167e3361134a565b9050808211156116a157604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd906116ca9033908490889060040161407a565b6020604051808303815f875af11580156116e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170a9190614010565b90508061172a576040516312171d8360e31b815260040160405180910390fd5b5f611736601133612695565b915061175190503361174886846140b2565b601191906126bb565b508360155f82825461176391906140b2565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b601c54606090819061ffff81166001600160401b038111156117be576117be6140f3565b6040519080825280602002602001820160405280156117e7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611806576118066140f3565b60405190808252806020026020018201604052801561182f578160200160208202803683370190505b5091505f5b8161ffff168161ffff16101561191557601c8161ffff168154811061185b5761185b613fef565b905f5260205f20015f9054906101000a90046001600160a01b0316848261ffff168151811061188c5761188c613fef565b60200260200101906001600160a01b031690816001600160a01b031681525050601b5f601c8361ffff16815481106118c6576118c6613fef565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548351849061ffff841690811061190257611902613fef565b6020908102919091010152600101611834565b50509091565b61192361266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611973573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119979190614010565b6119b4576040516312aecd8160e01b815260040160405180910390fd5b805f036119c357610a33610e01565b5f6119cf600e33612695565b915050818110156119f357604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611a259033908690600401614122565b5f604051808303815f87803b158015611a3c575f5ffd5b505af1158015611a4e573d5f5f3e3d5ffd5b505050505f8282611a5f91906140e0565b9050805f03611a7957611a73600e336127f9565b50611a87565b611a85600e33836126bb565b505b8260145f828254611a9891906140e0565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bf96001600555565b6007546001600160a01b03163314611b0057604051631a27eac360e11b815260040160405180910390fd5b611b0861266b565b5f839003611b2957604051631121aa8d60e01b815260040160405180910390fd5b6021805460ff19169055601e5483905f61ffff83166001600160401b03811115611b5557611b556140f3565b604051908082528060200260200182016040528015611b7e578160200160208202803683370190505b5090505f8361ffff166001600160401b03811115611b9e57611b9e6140f3565b604051908082528060200260200182016040528015611bc7578160200160208202803683370190505b5090505f8461ffff166001600160401b03811115611be757611be76140f3565b604051908082528060200260200182016040528015611c10578160200160208202803683370190505b5090505f5b8561ffff168161ffff161015611dc9575f8a8a8361ffff16818110611c3c57611c3c613fef565b611c529260206040909202019081019150613bb2565b905080838361ffff1681518110611c6b57611c6b613fef565b60200260200101906001600160a01b031690816001600160a01b0316815250505f611cea8c8c8561ffff16818110611ca557611ca5613fef565b905060400201602001358b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061290b92505050565b9050611cf581612918565b506001600160a01b0382165f908152601d602052604090205460ff1615611d3157816040516346bdabe160e01b81526004016107da9190613c9f565b6001600160a01b0382165f908152601d60205260409020805460ff1916600117905585518290879061ffff8616908110611d6d57611d6d613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611da457611da4613fef565b602002602001018181525050611dba8782612927565b96505050806001019050611c15565b50611dd48185612955565b5f5b601c5461ffff9081169082161015611e3157601e54601b5f601c8461ffff1681548110611e0557611e05613fef565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055600101611dd6565b50611e3d601c5f613a39565b5f5b8561ffff168161ffff161015611f05575f848261ffff1681518110611e6657611e66613fef565b60200260200101519050838261ffff1681518110611e8657611e86613fef565b6020908102919091018101516001600160a01b039092165f818152601b8352604080822094909455601c805460018181019092557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b03191684179055918152601d909252919020805460ff1916905501611e3f565b5060405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050611f3f6001600555565b50505050565b611f4d61266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f9d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc19190614010565b611fde576040516312aecd8160e01b815260040160405180910390fd5b805f036120005730604051636b30633560e01b81526004016107da9190613c9f565b5f61200c601133612695565b9150508181101561203057604051632ca2f52b60e11b815260040160405180910390fd5b5f61203b83836140e0565b9050805f036120555761204f6011336127f9565b50612063565b612061601133836126bb565b505b8260155f82825461207491906140e0565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb906120a09033908890600401614122565b6020604051808303815f875af11580156120bc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120e09190614010565b905080612100576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bf96001600555565b5f6108b9825f6129c7565b5f6108b96121518361134a565b5f61261d565b601a54606090819061ffff81166001600160401b0381111561217b5761217b6140f3565b6040519080825280602002602001820160405280156121a4578160200160208202803683370190505b5092508061ffff166001600160401b038111156121c3576121c36140f3565b6040519080825280602002602001820160405280156121ec578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611915575f601a8261ffff168154811061221957612219613fef565b905f5260205f20015f9054906101000a90046001600160a01b0316905080858361ffff168151811061224d5761224d613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505060195f826001600160a01b03166001600160a01b031681526020019081526020015f2054848361ffff16815181106122a7576122a7613fef565b6020908102919091010152506001016121f1565b5f6108b98261134a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f6122fa836129f9565b90505f61230782856140e0565b90505f61231382612ac3565b905061231f81846140b2565b95945050505050565b600a546001600160a01b0316331461235357604051631a27eac360e11b815260040160405180910390fd5b61235b61266b565b5f612366600e6127e1565b90508063ffffffff165f0361237b575061132f565b5f8163ffffffff166001600160401b0381111561239a5761239a6140f3565b6040519080825280602002602001820160405280156123c3578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156123e5576123e56140f3565b60405190808252806020026020018201604052801561240e578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156124a8575f8061243d600e63ffffffff808616906127eb16565b9150915081858463ffffffff168151811061245a5761245a613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061249357612493613fef565b60209081029190910101525050600101612413565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156124f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251b9190614107565b90505f5b8463ffffffff168163ffffffff161015611329575f848263ffffffff168151811061254c5761254c613fef565b602002602001015190505f848363ffffffff168151811061256f5761256f613fef565b6020026020010151905061258d82600e6127f990919063ffffffff16565b505f61259a828a5f611364565b90506125a68382612b53565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a450505080600101905061251f565b610bf981612b87565b5f610dfa836001600160a01b038416612be0565b5f610dfa61262a600d5490565b6126359060016140b2565b61263d61284d565b61264890600a61421e565b60025461265591906140b2565b859190856128c9565b6108198383836001612c27565b60026005540361268e57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f8080806126ac866001600160a01b038716612cf9565b909450925050505b9250929050565b5f61139c846001600160a01b03851684612d31565b5f6126da84612d4d565b90505f6126e8828585612de9565b9050806127085760405163cf6c44e960e01b815260040160405180910390fd5b60405185907f1af0453083661051f6e56e5c070792320652e612154bf9af8637bb1e7655b99d905f90a25050505050565b5f61274484846122c5565b90505f19811015611f3f578181101561277657828183604051637dc7a0d960e11b81526004016107da9392919061422c565b611f3f84848484035f612c27565b6001600160a01b0383166127ad575f604051634b637e8f60e11b81526004016107da9190613c9f565b6001600160a01b0382166127d6575f60405163ec442f0560e01b81526004016107da9190613c9f565b610819838383612eb6565b5f6108b982612fc9565b5f8080806126ac8686612fd3565b5f610dfa836001600160a01b038416612ffc565b6001600160a01b038216612836575f604051634b637e8f60e11b81526004016107da9190613c9f565b610c73825f83612eb6565b60605f610dfa83613018565b5f5f612857610e01565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612892573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b6919061424d565b90506128c3816012614268565b91505090565b5f6128f66128d683613071565b80156128f157505f84806128ec576128ec614281565b868809115b151590565b61290186868661309d565b61231f91906140b2565b5f610dfa8383600661314d565b5f6129238230613237565b5090565b5f82612939576129365f6132a4565b92505b8161294a576129475f6132a4565b91505b610dfa83835f6132b9565b61295e8261334f565b5f61296b826020546133c7565b905061297681612918565b506040805160018082528183019092525f916020808301908036833701905050905081815f815181106129ab576129ab613fef565b6020908102919091010152610dd581630fdca94f60e01b6133f5565b5f610dfa6129d361284d565b6129de90600a61421e565b6002546129eb91906140b2565b600d546126559060016140b2565b6017545f906301000000900461ffff168103612a1657505f919050565b6017545f90612a33906301000000900461ffff168461271061309d565b9050610dfa60095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aac9190614295565b829063ffffffff908116906301e133809061309d16565b6017545f90610100900461ffff168103612ade57505f919050565b5f612af5612aee6012600a61421e565b845f611585565b6017549091505f908190612b0b9060ff16613401565b9150915081831015612b2157505f949350505050565b6017545f90612b3a90610100900461ffff16858461309d565b9050612b49818761271061309d565b9695505050505050565b6001600160a01b038216612b7c575f60405163ec442f0560e01b81526004016107da9190613c9f565b610c735f8383612eb6565b5f612b90825490565b90505f5b81811015612bd957826001015f845f018381548110612bb557612bb5613fef565b905f5260205f20015481526020019081526020015f205f9055806001019050612b94565b50505f9055565b5f612beb83836134eb565b612c2057508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108b9565b505f6108b9565b6001600160a01b038416612c50575f60405163e602df0560e01b81526004016107da9190613c9f565b6001600160a01b038316612c79575f604051634a1406b160e11b81526004016107da9190613c9f565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611f3f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612ceb91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612d2657612d1a8585613502565b92505f91506126b49050565b6001925090506126b4565b5f828152600284016020526040812082905561139c848461350d565b60605f612d58613518565b5f84815260018201602052604081205491925003612d895760405163d66ca67560e01b815260040160405180910390fd5b5f83815260018201602090815260409182902080548351818402810184019094528084529091830182828015612ddc57602002820191905f5260205f20905b815481526020019060010190808311612dc8575b5050505050915050919050565b5f5f83516020612df991906140b2565b612e049060206140b2565b90505f8482604051602001612e1a9291906142b8565b60405160208183030381529060405290505f612e3461353c565b60038101546040516378542ead60e01b81529192506001600160a01b0316906378542ead90612e6b908a9086908a90600401614302565b6020604051808303815f875af1158015612e87573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eab9190614010565b979650505050505050565b6001600160a01b038316612ee0578060025f828254612ed591906140b2565b90915550612f3d9050565b6001600160a01b0383165f9081526020819052604090205481811015612f1f5783818360405163391434e360e21b81526004016107da9392919061422c565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612f5957600280548290039055612f77565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612fbc91815260200190565b60405180910390a3505050565b5f6108b982613560565b5f8080612fe08585613569565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610dfa8383613574565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561306557602002820191905f5260205f20905b815481526020019060010190808311613051575b50505050509050919050565b5f600282600381111561308657613086613dff565b613090919061433a565b60ff166001149050919050565b5f5f5f6130aa868661357f565b91509150815f036130ce578381816130c4576130c4614281565b0492505050610dfa565b8184116130e5576130e5600385150260111861359b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f5f61315761353c565b600181015460405163196d0b9b60e01b81529192506001600160a01b03169063196d0b9b9061319090889033908990899060040161437b565b6020604051808303815f875af11580156131ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614063565b8154604051630f8e573b60e21b81529193506001600160a01b031690633e395cec9061320290859033906004016143b3565b5f604051808303815f87803b158015613219575f5ffd5b505af115801561322b573d5f5f3e3d5ffd5b50505050509392505050565b5f61324061353c565b8054604051635ca4b5b160e11b81529192506001600160a01b03169063b9496b629061327290869086906004016143b3565b5f604051808303815f87803b158015613289575f5ffd5b505af115801561329b573d5f5f3e3d5ffd5b50505050505050565b5f6108b9826001600160801b031660066135ac565b5f5f82156132cc5750600160f81b6132cf565b505f5b5f6132d861353c565b600181015460405163022f65e760e31b81529192506001600160a01b03169063117b2f389061330f908990899087906004016143ca565b6020604051808303815f875af115801561332b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b499190614063565b5f5b8151811015610c735761338782828151811061336f5761336f613fef565b6020026020010151600b61362b90919063ffffffff16565b6133bf5781818151811061339d5761339d613fef565b602002602001015160405163751dff9760e11b81526004016107da9190613c9f565b600101613351565b5f826133d9576133d65f6132a4565b92505b816133ea576133e75f6132a4565b91505b610dfa83835f61363f565b5f610dfa83835f613695565b5f808061340e6012611535565b90505f84600481111561342357613423613dff565b03613433578092508291506134e5565b600384600481111561344757613447613dff565b036134595760185492508291506134e5565b600184600481111561346d5761346d613dff565b036134855761347b81613796565b92508091506134e5565b600284600481111561349957613499613dff565b036134b1576134a781613796565b92508291506134e5565b60048460048111156134c5576134c5613dff565b036134e5576018546134df906134da83613796565b6138bc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610dfa83836138cb565b5f610dfa8383612be0565b7f878245876662ba28a480c5ea71726db859fb50222b0a3d7cbbc21cfa336faf0090565b7f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e464970090565b5f6108b9825490565b5f610dfa83836138d6565b5f610dfa83836138fc565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f6135b661353c565b6001810154604051639cd07acb60e01b81529192506001600160a01b031690639cd07acb906135eb90879087906004016143ea565b6020604051808303815f875af1158015613607573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139c9190614063565b5f610dfa836001600160a01b0384166134eb565b5f5f82156136525750600160f81b613655565b505f5b5f61365e61353c565b600181015460405163f77f3f1d60e01b81529192506001600160a01b03169063f77f3f1d9061330f908990899087906004016143ca565b5f5f61369f613518565b8054925090505f6136ae61353c565b8054604051637d6e912360e11b81529192506001600160a01b03169063fadd2246906136de9089906004016143fe565b5f604051808303815f87803b1580156136f5575f5ffd5b505af1158015613707573d5f5f3e3d5ffd5b5050506002820154604051633263b83b60e01b81526001600160a01b039091169150633263b83b9086906137439087908b908b90600401614410565b5f604051808303818588803b15801561375a575f5ffd5b505af115801561376c573d5f5f3e3d5ffd5b505050505061377b83876139df565b8154825f61378883614441565b919050555050509392505050565b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061380c9190614107565b61ffff1690505f6138a160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613866573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061388a9190614295565b839063ffffffff908116906301e133809061309d16565b905061139c6138b2826127106140b2565b859061271061309d565b5f828218828411028218610dfa565b5f610dfa83836134eb565b5f825f0182815481106138eb576138eb613fef565b905f5260205f200154905092915050565b5f81815260018301602052604081205480156139d6575f61391e6001836140e0565b85549091505f90613931906001906140e0565b9050808214613990575f865f01828154811061394f5761394f613fef565b905f5260205f200154905080875f01848154811061396f5761396f613fef565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806139a1576139a1614459565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506108b9565b5f9150506108b9565b5f6139e8613518565b5f84815260018201602052604090205490915015613a1957604051633f06d22b60e01b815260040160405180910390fd5b5f83815260018201602090815260409091208351611f3f92850190613a54565b5080545f8255905f5260205f2090810190610bf99190613a95565b828054828255905f5260205f20908101928215613a8d579160200282015b82811115613a8d578251825591602001919060010190613a72565b506129239291505b5b80821115612923575f8155600101613a96565b5f5f60208385031215613aba575f5ffd5b82356001600160401b03811115613acf575f5ffd5b8301601f81018513613adf575f5ffd5b80356001600160401b03811115613af4575f5ffd5b8560208260051b8401011115613b08575f5ffd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610dfa6020830184613b18565b5f60208284031215613b68575f5ffd5b5035919050565b80356001600160a01b0381168114613b85575f5ffd5b919050565b5f5f60408385031215613b9b575f5ffd5b613ba483613b6f565b946020939093013593505050565b5f60208284031215613bc2575f5ffd5b610dfa82613b6f565b5f5f60408385031215613bdc575f5ffd5b50508035926020909101359150565b5f5f83601f840112613bfb575f5ffd5b5081356001600160401b03811115613c11575f5ffd5b6020830191508360208285010111156126b4575f5ffd5b5f5f5f5f5f60608688031215613c3c575f5ffd5b8535945060208601356001600160401b03811115613c58575f5ffd5b613c6488828901613beb565b90955093505060408601356001600160401b03811115613c82575f5ffd5b613c8e88828901613beb565b969995985093965092949392505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613cc5575f5ffd5b613cce84613b6f565b9250613cdc60208501613b6f565b929592945050506040919091013590565b60ff81168114610bf9575f5ffd5b61ffff81168114610bf9575f5ffd5b5f5f5f60608486031215613d1c575f5ffd5b8335613d2781613ced565b92506020840135613d3781613cfb565b91506040840135613d4781613cfb565b809150509250925092565b5f8151808452602084019350602083015f5b82811015613d8b5781516001600160a01b0316865260209586019590910190600101613d64565b5093949350505050565b602081525f610dfa6020830184613d52565b5f5f60408385031215613db8575f5ffd5b82359150613dc860208401613b6f565b90509250929050565b5f5f5f60608486031215613de3575f5ffd5b8335925060208401359150604084013560048110613d47575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b6080810160058610613e2757613e27613dff565b94815261ffff93841660208201529190921660408201526060015290565b5f5f83601f840112613e55575f5ffd5b5081356001600160401b03811115613e6b575f5ffd5b6020830191508360208260061b85010111156126b4575f5ffd5b5f5f5f60408486031215613e97575f5ffd5b83356001600160401b03811115613eac575f5ffd5b613eb886828701613e45565b909790965060209590950135949350505050565b5f5f5f60608486031215613ede575f5ffd5b83359250613eee60208501613b6f565b9150613efc60408501613b6f565b90509250925092565b604081525f613f176040830185613d52565b82810360208401528084518083526020830191506020860192505f5b81811015613f51578351835260209384019390920191600101613f33565b50909695505050505050565b5f5f5f5f60408587031215613f70575f5ffd5b84356001600160401b03811115613f85575f5ffd5b613f9187828801613e45565b90955093505060208501356001600160401b03811115613faf575f5ffd5b613fbb87828801613beb565b95989497509550505050565b5f5f60408385031215613fd8575f5ffd5b613fe183613b6f565b9150613dc860208401613b6f565b634e487b7160e01b5f52603260045260245ffd5b8015158114610bf9575f5ffd5b5f60208284031215614020575f5ffd5b8151610dfa81614003565b600181811c9082168061403f57607f821691505b60208210810361405d57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215614073575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108b9576108b961409e565b5f602082840312156140d5575f5ffd5b8135610dfa81614003565b818103818111156108b9576108b961409e565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215614117575f5ffd5b8151610dfa81613cfb565b6001600160a01b03929092168252602082015260400190565b6001815b60018411156141765780850481111561415a5761415a61409e565b600184161561416857908102905b60019390931c92800261413f565b935093915050565b5f8261418c575060016108b9565b8161419857505f6108b9565b81600181146141ae57600281146141b8576141d4565b60019150506108b9565b60ff8411156141c9576141c961409e565b50506001821b6108b9565b5060208310610133831016604e8410600b84101617156141f7575081810a6108b9565b6142035f19848461413b565b805f19048211156142165761421661409e565b029392505050565b5f610dfa60ff84168361417e565b6001600160a01b039390931683526020830191909152604082015260600190565b5f6020828403121561425d575f5ffd5b8151610dfa81613ced565b60ff82811682821603908111156108b9576108b961409e565b634e487b7160e01b5f52601260045260245ffd5b5f602082840312156142a5575f5ffd5b815163ffffffff81168114610dfa575f5ffd5b5f83518060208601845e9190910191825250602001919050565b5f8151808452602084019350602083015f5b82811015613d8b5781518652602095860195909101906001016142e4565b606081525f61431460608301866142d2565b82810360208401526143268186613b18565b90508281036040840152612b498185613b18565b5f60ff83168061435857634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b6054811061437757614377613dff565b9052565b8481526001600160a01b03841660208201526080604082018190525f906143a490830185613b18565b905061231f6060830184614367565b9182526001600160a01b0316602082015260400190565b92835260208301919091526001600160f81b031916604082015260600190565b82815260408101610dfa6020830184614367565b602081525f610dfa60208301846142d2565b838152606060208201525f61442860608301856142d2565b905063ffffffff60e01b83166040830152949350505050565b5f600182016144525761445261409e565b5060010190565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220502b403798751e8b4cb2e6144091da0ffead77b5fb53557b41e28cb02ae1240264736f6c634300081c00339e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497019e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e4649700a264697066735822122093eedef1c94a17a44776617e8c2899a718109973f4de7c1caf965f356d66eb8864736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610349565b610073565b604051610058919061040a565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a390849060040161040a565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041e565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041e565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e2565b6101f39a9998979695949392919061046c565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f54604051631e832de160e21b81529194508492506001600160a01b031690637a0cb784906102439084906001906004016104ff565b5f604051808303815f87803b15801561025a575f5ffd5b505af115801561026c573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d60016040516102cc98979695949392919061051c565b60405180910390a4505098975050505050505050565b6154898061057d83390190565b5f5f83601f8401126102ff575f5ffd5b5081356001600160401b03811115610315575f5ffd5b60208301915083602082850101111561032c575f5ffd5b9250929050565b803561ffff81168114610344575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b031215610360575f5ffd5b88356001600160a01b0381168114610376575f5ffd5b975060208901356001600160401b03811115610390575f5ffd5b61039c8b828c016102ef565b90985096505060408901356001600160401b038111156103ba575f5ffd5b6103c68b828c016102ef565b909650945050606089013560ff811681146103df575f5ffd5b92506103ed60808a01610333565b91506103fb60a08a01610333565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042e575f5ffd5b8151801515811461043d575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f906104a1908301898b610444565b82810360808401526104b481888a610444565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104fb57634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043d60208301846104df565b60c081525f61052f60c083018a8c610444565b828103602084015261054281898b610444565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056f60a08301846104df565b999850505050505050505056fe60c060405234801561000f575f5ffd5b5060405161548938038061548983398101604081905261002e91610b0b565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610bda565b858561013b610136604080516080810182525f80825260208201819052918101829052606081019190915250604080516080810182527350157cffd6bbfa2dece204a89ec419c23ef5755d815273cd3ab3bd6bcc0c0bf3e27912a92043e817b1cf69602082015273a02cda4ca3a71d7c46997716f4283aa851c2881291810191909152731364cbbf2cdf5032c47d8226a6f6fbd2afcdacac606082015290565b610605565b60036101478382610c79565b5060046101548282610c79565b5050505f5f610168836106be60201b60201c565b915091508161017857601261017a565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101b45760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101db5760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa15801561024f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102739190610bda565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f89190610bda565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d33565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103e9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040d9190610bda565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610448573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046c9190610d33565b9050601260ff8216111561049357604051631c03248960e11b815260040160405180910390fd5b600460ff851611156104b8576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff841611156104df576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610506576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561051b5761051b610d4c565b6017805460ff1916600183600481111561053757610537610d4c565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff00199092169190911717905561057a81600a610e57565b601855610585610794565b50505050505050505061059d5f61086960201b60201c565b601e556105aa6001610884565b601f55600a80546105ce916105c991600160a01b900460ff1690610e57565b610869565b602055601e546105dd9061089f565b50601f546105ea9061089f565b506020546105f79061089f565b505050505050505050610f88565b80515f5160206154695f395f51905f5280546001600160a01b03199081166001600160a01b039384161790915560208301515f5160206154495f395f51905f528054831691841691909117905560408301517f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497028054831691841691909117905560608301517f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497038054909216921691909117905550565b50565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161070491610e65565b5f60405180830381855afa9150503d805f811461073c576040519150601f19603f3d011682016040523d82523d5f602084013e610741565b606091505b509150915081801561075557506020815110155b15610788575f8180602001905181019061076f9190610e7b565b905060ff8111610786576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa1580156107da573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108019190810190610e92565b90505f5b8151811015610865575f61083c83838151811061082457610824610f44565b6020026020010151600b6108ae60201b90919060201c565b90508061085c57604051630ea075bf60e21b815260040160405180910390fd5b50600101610805565b5050565b5f61087e6001600160801b03831660066108c9565b92915050565b5f61087e82610893575f610896565b60015b60ff165f6108c9565b5f6108aa8230610960565b5090565b5f6108c2836001600160a01b0384166109d6565b9392505050565b5f5160206154495f395f51905f5254604051639cd07acb60e01b81525f915f5160206154695f395f51905f52916001600160a01b0390911690639cd07acb906109189087908790600401610f58565b6020604051808303815f875af1158015610934573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109589190610e7b565b949350505050565b5f5f5160206154695f395f51905f528054604051635ca4b5b160e11b8152600481018690526001600160a01b03858116602483015292935091169063b9496b62906044015f604051808303815f87803b1580156109bb575f5ffd5b505af11580156109cd573d5f5f3e3d5ffd5b50505050505050565b5f818152600183016020526040812054610a1b57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561087e565b505f61087e565b6001600160a01b03811681146106bb575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715610a7257610a72610a36565b604052919050565b5f82601f830112610a89575f5ffd5b81516001600160401b03811115610aa257610aa2610a36565b610ab5601f8201601f1916602001610a4a565b818152846020838601011115610ac9575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff81168114610af5575f5ffd5b919050565b805161ffff81168114610af5575f5ffd5b5f5f5f5f5f5f5f5f610100898b031215610b23575f5ffd5b8851610b2e81610a22565b60208a0151909850610b3f81610a22565b60408a0151909750610b5081610a22565b60608a01519096506001600160401b03811115610b6b575f5ffd5b610b778b828c01610a7a565b60808b015190965090506001600160401b03811115610b94575f5ffd5b610ba08b828c01610a7a565b945050610baf60a08a01610ae5565b9250610bbd60c08a01610afa565b9150610bcb60e08a01610afa565b90509295985092959890939650565b5f60208284031215610bea575f5ffd5b81516108c281610a22565b600181811c90821680610c0957607f821691505b602082108103610c2757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c7457805f5260205f20601f840160051c81016020851015610c525750805b601f840160051c820191505b81811015610c71575f8155600101610c5e565b50505b505050565b81516001600160401b03811115610c9257610c92610a36565b610ca681610ca08454610bf5565b84610c2d565b6020601f821160018114610cd8575f8315610cc15750848201515b5f19600385901b1c1916600184901b178455610c71565b5f84815260208120601f198516915b82811015610d075787850151825560209485019460019092019101610ce7565b5084821015610d2457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610d43575f5ffd5b6108c282610ae5565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610daf57808504811115610d9357610d93610d60565b6001841615610da157908102905b60019390931c928002610d78565b935093915050565b5f82610dc55750600161087e565b81610dd157505f61087e565b8160018114610de75760028114610df157610e0d565b600191505061087e565b60ff841115610e0257610e02610d60565b50506001821b61087e565b5060208310610133831016604e8410600b8410161715610e30575081810a61087e565b610e3c5f198484610d74565b805f1904821115610e4f57610e4f610d60565b029392505050565b5f6108c260ff841683610db7565b5f82518060208501845e5f920191825250919050565b5f60208284031215610e8b575f5ffd5b5051919050565b5f60208284031215610ea2575f5ffd5b81516001600160401b03811115610eb7575f5ffd5b8201601f81018413610ec7575f5ffd5b80516001600160401b03811115610ee057610ee0610a36565b8060051b610ef060208201610a4a565b91825260208184018101929081019087841115610f0b575f5ffd5b6020850194505b83851015610f395784519250610f2783610a22565b82825260209485019490910190610f12565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b8281526040810160548310610f7b57634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b60805160a0516144a3610fa65f395f50505f610e0301526144a35ff3fe608060405234801561000f575f5ffd5b50600436106102d7575f3560e01c806395d89b411161018157806395d89b411461051c57806397ee1144146105245780639908840c1461055a5780639adb298114610563578063a68a526714610576578063a9059cbb14610589578063aa2f892d1461059c578063acdb3d51146105af578063b3d7f6b914610352578063b460af94146105b8578063b6eba653146105c6578063ba087652146105b8578063bdca9165146105dc578063c0b568e1146105e5578063c392e58c146105f8578063c3f0d30e1461060b578063c63d75b61461045d578063c6e6f5921461061e578063ce96cb7714610631578063d1717c7d14610644578063d3d0345814610658578063d853365f14610660578063d905777e14610668578063da1f12ab1461067b578063dceb7e2814610683578063dd62ed3e14610690578063e51a85f6146106a3578063e5e97193146106b6578063e66f53b7146106c9578063ef8b30f714610352578063f64c6f32146106dc575f5ffd5b806301e1d114146102db57806303d44854146102f257806306fdde031461030757806307a2d13a1461031c578063095ea7b31461032f5780630a28a477146103525780630a605c6d146103655780630c6a62dd1461036d5780630d1e6667146103805780630df571f7146103935780630fdca94f146103a657806318160ddd146103b957806318c21949146103c15780631f52692b146103d457806323b872dd146103f4578063313ce56714610407578063348ec5c81461041c57806338d52e0f1461042f5780633a0dad8e146104375780633ab6d27c1461044a578063402d267d1461045d578063493a6e21146104715780634cdad506146103525780634e85b135146104845780636e553f651461049957806370a08231146104a75780637847ea53146104ba57806379502c55146104da57806380ceebfe146104ed5780638f5c94651461050057806394bf804d14610499575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b610305610300366004613aa9565b6106e4565b005b61030f61081e565b6040516102e99190613b46565b6102df61032a366004613b58565b6108ae565b61034261033d366004613b8a565b6108bf565b60405190151581526020016102e9565b6102df610360366004613b58565b6108d6565b6015546102df565b61030561037b366004613bb2565b6108f0565b61030561038e366004613b58565b61098b565b6103056103a1366004613bcb565b610bfc565b6103056103b4366004613c28565b610c77565b6002546102df565b6103056103cf366004613b58565b610d0d565b6006546103e7906001600160a01b031681565b6040516102e99190613c9f565b610342610402366004613cb3565b610ddc565b60125b60405160ff90911681526020016102e9565b6009546103e7906001600160a01b031681565b6103e7610e01565b600a546103e7906001600160a01b031681565b610305610458366004613d0a565b610e25565b6102df61046b366004613bb2565b505f1990565b61030561047f366004613b58565b610ff2565b61048c611339565b6040516102e99190613d95565b6102df610360366004613da7565b6102df6104b5366004613bb2565b61134a565b6104c56301e1338081565b60405163ffffffff90911681526020016102e9565b6008546103e7906001600160a01b031681565b6102df6104fb366004613dd1565b611364565b61050961271081565b60405161ffff90911681526020016102e9565b61030f6113a4565b60175460185461054a9160ff81169161ffff610100830481169263010000009004169084565b6040516102e99493929190613e13565b61050961012c81565b610305610571366004613e85565b6113b3565b6102df610584366004613dd1565b611585565b610342610597366004613b8a565b6115b4565b6103056105aa366004613b58565b6115c1565b6102df60165481565b6102df610360366004613ecc565b6105ce61179a565b6040516102e9929190613f05565b610509610bb881565b6103056105f3366004613b58565b61191b565b610305610606366004613f5d565b611ad5565b610305610619366004613b58565b611f45565b6102df61062c366004613b58565b612139565b6102df61063f366004613bb2565b612144565b600a5461040a90600160a01b900460ff1681565b6105ce612157565b61040a601281565b6102df610676366004613bb2565b6122bb565b6127116102df565b6021546103429060ff1681565b6102df61069e366004613fc7565b6122c5565b6102df6106b1366004613b58565b6122ef565b6103056106c4366004613b58565b612328565b6007546103e7906001600160a01b031681565b6014546102df565b6006546001600160a01b0316331461070f57604051631a27eac360e11b815260040160405180910390fd5b610719600b612600565b5f5b81811015610819575f83838381811061073657610736613fef565b905060200201602081019061074b9190613bb2565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf9061077c908490600401613c9f565b602060405180830381865afa158015610797573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107bb9190614010565b6107e3578060405163751dff9760e11b81526004016107da9190613c9f565b60405180910390fd5b5f6107ef600b83612609565b90508061080f57604051630ea075bf60e21b815260040160405180910390fd5b505060010161071b565b505050565b60606003805461082d9061402b565b80601f01602080910402602001604051908101604052809291908181526020018280546108599061402b565b80156108a45780601f1061087b576101008083540402835291602001916108a4565b820191905f5260205f20905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b5f6108b9825f61261d565b92915050565b5f336108cc81858561265e565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b0316331461091b57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0381166109425760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61099361266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a079190614010565b610a24576040516312aecd8160e01b815260040160405180910390fd5b805f03610a4d57610a33610e01565b604051636b30633560e01b81526004016107da9190613c9f565b5f610a56610e01565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a819190613c9f565b602060405180830381865afa158015610a9c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac09190614063565b905080821115610ae357604051632ca2f52b60e11b815260040160405180910390fd5b5f610aec610e01565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610b2292339290911690889060040161407a565b6020604051808303815f875af1158015610b3e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190614010565b905080610b82576040516312171d8360e31b815260040160405180910390fd5b5f610b8e600e33612695565b9150610ba9905033610ba086846140b2565b600e91906126bb565b508360145f828254610bbb91906140b2565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bf96001600555565b50565b6009546001600160a01b03163314610c2757604051631a27eac360e11b815260040160405180910390fd5b8015610c73578060165f828254610c3e91906140b2565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b610ce98585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284375f920191909152506126d092505050565b610cf5838501856140c5565b6021805460ff19169115159190911790555050505050565b6006546001600160a01b03163314610d3857604051631a27eac360e11b815260040160405180910390fd5b805f03610d4757610a33610e01565b601654811115610d6a57604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610d7b91906140e0565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610dc3575f5ffd5b505af1158015610dd5573d5f5f3e3d5ffd5b5050505050565b5f33610de9858285612739565b610df4858585612784565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610e5057604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec49190614010565b610ee1576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f06576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f2d576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610f54576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610f6957610f69613dff565b6017805460ff19166001836004811115610f8557610f85613dff565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461101d57604051631a27eac360e11b815260040160405180910390fd5b61102561266b565b5f61103060116127e1565b90508063ffffffff165f03611045575061132f565b5f8163ffffffff166001600160401b03811115611064576110646140f3565b60405190808252806020026020018201604052801561108d578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156110af576110af6140f3565b6040519080825280602002602001820160405280156110d8578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015611172575f80611107601163ffffffff808616906127eb16565b9150915081858463ffffffff168151811061112457611124613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061115d5761115d613fef565b602090810291909101015250506001016110dd565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156111c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e59190614107565b90505f5b8463ffffffff168163ffffffff161015611329575f848263ffffffff168151811061121657611216613fef565b602002602001015190505f848363ffffffff168151811061123957611239613fef565b602002602001015190506112578260116127f990919063ffffffff16565b505f611264828a5f611585565b9050611270308361280d565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906112a29086908590600401614122565b5f604051808303815f87803b1580156112b9575f5ffd5b505af11580156112cb573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a45050508060010190506111e9565b50505050505b610bf96001600555565b6060611345600b612841565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f61139c61137061284d565b61137b90600a61421e565b60025461138891906140b2565b6113938560016140b2565b869190856128c9565b949350505050565b60606004805461082d9061402b565b6009546001600160a01b031633146113de57604051631a27eac360e11b815260040160405180910390fd5b601a545f5b8161ffff168161ffff16101561143c57601e5460195f601a8461ffff168154811061141057611410613fef565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556001016113e3565b50611448601a5f613a39565b825f5b8161ffff168161ffff1610156115285785858261ffff1681811061147157611471613fef565b9050604002016020013560195f88888561ffff1681811061149457611494613fef565b6114aa9260206040909202019081019150613bb2565b6001600160a01b0316815260208101919091526040015f2055601a868661ffff84168181106114db576114db613fef565b6114f19260206040909202019081019150613bb2565b8154600180820184555f93845260209093200180546001600160a01b0319166001600160a01b03929092169190911790550161144b565b50600d8390555f61154060125b61032a90600a61421e565b6018549091508111156115535760188190555b60405184907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a2505050505050565b5f61139c6115948460016140b2565b61159c61284d565b6115a790600a61421e565b60025461139391906140b2565b5f336108cc818585612784565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611611573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116359190614010565b611652576040516312aecd8160e01b815260040160405180910390fd5b805f036116745730604051636b30633560e01b81526004016107da9190613c9f565b5f61167e3361134a565b9050808211156116a157604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd906116ca9033908490889060040161407a565b6020604051808303815f875af11580156116e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170a9190614010565b90508061172a576040516312171d8360e31b815260040160405180910390fd5b5f611736601133612695565b915061175190503361174886846140b2565b601191906126bb565b508360155f82825461176391906140b2565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b601c54606090819061ffff81166001600160401b038111156117be576117be6140f3565b6040519080825280602002602001820160405280156117e7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611806576118066140f3565b60405190808252806020026020018201604052801561182f578160200160208202803683370190505b5091505f5b8161ffff168161ffff16101561191557601c8161ffff168154811061185b5761185b613fef565b905f5260205f20015f9054906101000a90046001600160a01b0316848261ffff168151811061188c5761188c613fef565b60200260200101906001600160a01b031690816001600160a01b031681525050601b5f601c8361ffff16815481106118c6576118c6613fef565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548351849061ffff841690811061190257611902613fef565b6020908102919091010152600101611834565b50509091565b61192361266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611973573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119979190614010565b6119b4576040516312aecd8160e01b815260040160405180910390fd5b805f036119c357610a33610e01565b5f6119cf600e33612695565b915050818110156119f357604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611a259033908690600401614122565b5f604051808303815f87803b158015611a3c575f5ffd5b505af1158015611a4e573d5f5f3e3d5ffd5b505050505f8282611a5f91906140e0565b9050805f03611a7957611a73600e336127f9565b50611a87565b611a85600e33836126bb565b505b8260145f828254611a9891906140e0565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bf96001600555565b6007546001600160a01b03163314611b0057604051631a27eac360e11b815260040160405180910390fd5b611b0861266b565b5f839003611b2957604051631121aa8d60e01b815260040160405180910390fd5b6021805460ff19169055601e5483905f61ffff83166001600160401b03811115611b5557611b556140f3565b604051908082528060200260200182016040528015611b7e578160200160208202803683370190505b5090505f8361ffff166001600160401b03811115611b9e57611b9e6140f3565b604051908082528060200260200182016040528015611bc7578160200160208202803683370190505b5090505f8461ffff166001600160401b03811115611be757611be76140f3565b604051908082528060200260200182016040528015611c10578160200160208202803683370190505b5090505f5b8561ffff168161ffff161015611dc9575f8a8a8361ffff16818110611c3c57611c3c613fef565b611c529260206040909202019081019150613bb2565b905080838361ffff1681518110611c6b57611c6b613fef565b60200260200101906001600160a01b031690816001600160a01b0316815250505f611cea8c8c8561ffff16818110611ca557611ca5613fef565b905060400201602001358b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061290b92505050565b9050611cf581612918565b506001600160a01b0382165f908152601d602052604090205460ff1615611d3157816040516346bdabe160e01b81526004016107da9190613c9f565b6001600160a01b0382165f908152601d60205260409020805460ff1916600117905585518290879061ffff8616908110611d6d57611d6d613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611da457611da4613fef565b602002602001018181525050611dba8782612927565b96505050806001019050611c15565b50611dd48185612955565b5f5b601c5461ffff9081169082161015611e3157601e54601b5f601c8461ffff1681548110611e0557611e05613fef565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055600101611dd6565b50611e3d601c5f613a39565b5f5b8561ffff168161ffff161015611f05575f848261ffff1681518110611e6657611e66613fef565b60200260200101519050838261ffff1681518110611e8657611e86613fef565b6020908102919091018101516001600160a01b039092165f818152601b8352604080822094909455601c805460018181019092557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b03191684179055918152601d909252919020805460ff1916905501611e3f565b5060405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050611f3f6001600555565b50505050565b611f4d61266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f9d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc19190614010565b611fde576040516312aecd8160e01b815260040160405180910390fd5b805f036120005730604051636b30633560e01b81526004016107da9190613c9f565b5f61200c601133612695565b9150508181101561203057604051632ca2f52b60e11b815260040160405180910390fd5b5f61203b83836140e0565b9050805f036120555761204f6011336127f9565b50612063565b612061601133836126bb565b505b8260155f82825461207491906140e0565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb906120a09033908890600401614122565b6020604051808303815f875af11580156120bc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120e09190614010565b905080612100576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bf96001600555565b5f6108b9825f6129c7565b5f6108b96121518361134a565b5f61261d565b601a54606090819061ffff81166001600160401b0381111561217b5761217b6140f3565b6040519080825280602002602001820160405280156121a4578160200160208202803683370190505b5092508061ffff166001600160401b038111156121c3576121c36140f3565b6040519080825280602002602001820160405280156121ec578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611915575f601a8261ffff168154811061221957612219613fef565b905f5260205f20015f9054906101000a90046001600160a01b0316905080858361ffff168151811061224d5761224d613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505060195f826001600160a01b03166001600160a01b031681526020019081526020015f2054848361ffff16815181106122a7576122a7613fef565b6020908102919091010152506001016121f1565b5f6108b98261134a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f6122fa836129f9565b90505f61230782856140e0565b90505f61231382612ac3565b905061231f81846140b2565b95945050505050565b600a546001600160a01b0316331461235357604051631a27eac360e11b815260040160405180910390fd5b61235b61266b565b5f612366600e6127e1565b90508063ffffffff165f0361237b575061132f565b5f8163ffffffff166001600160401b0381111561239a5761239a6140f3565b6040519080825280602002602001820160405280156123c3578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156123e5576123e56140f3565b60405190808252806020026020018201604052801561240e578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156124a8575f8061243d600e63ffffffff808616906127eb16565b9150915081858463ffffffff168151811061245a5761245a613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061249357612493613fef565b60209081029190910101525050600101612413565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156124f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251b9190614107565b90505f5b8463ffffffff168163ffffffff161015611329575f848263ffffffff168151811061254c5761254c613fef565b602002602001015190505f848363ffffffff168151811061256f5761256f613fef565b6020026020010151905061258d82600e6127f990919063ffffffff16565b505f61259a828a5f611364565b90506125a68382612b53565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a450505080600101905061251f565b610bf981612b87565b5f610dfa836001600160a01b038416612be0565b5f610dfa61262a600d5490565b6126359060016140b2565b61263d61284d565b61264890600a61421e565b60025461265591906140b2565b859190856128c9565b6108198383836001612c27565b60026005540361268e57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f8080806126ac866001600160a01b038716612cf9565b909450925050505b9250929050565b5f61139c846001600160a01b03851684612d31565b5f6126da84612d4d565b90505f6126e8828585612de9565b9050806127085760405163cf6c44e960e01b815260040160405180910390fd5b60405185907f1af0453083661051f6e56e5c070792320652e612154bf9af8637bb1e7655b99d905f90a25050505050565b5f61274484846122c5565b90505f19811015611f3f578181101561277657828183604051637dc7a0d960e11b81526004016107da9392919061422c565b611f3f84848484035f612c27565b6001600160a01b0383166127ad575f604051634b637e8f60e11b81526004016107da9190613c9f565b6001600160a01b0382166127d6575f60405163ec442f0560e01b81526004016107da9190613c9f565b610819838383612eb6565b5f6108b982612fc9565b5f8080806126ac8686612fd3565b5f610dfa836001600160a01b038416612ffc565b6001600160a01b038216612836575f604051634b637e8f60e11b81526004016107da9190613c9f565b610c73825f83612eb6565b60605f610dfa83613018565b5f5f612857610e01565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612892573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b6919061424d565b90506128c3816012614268565b91505090565b5f6128f66128d683613071565b80156128f157505f84806128ec576128ec614281565b868809115b151590565b61290186868661309d565b61231f91906140b2565b5f610dfa8383600661314d565b5f6129238230613237565b5090565b5f82612939576129365f6132a4565b92505b8161294a576129475f6132a4565b91505b610dfa83835f6132b9565b61295e8261334f565b5f61296b826020546133c7565b905061297681612918565b506040805160018082528183019092525f916020808301908036833701905050905081815f815181106129ab576129ab613fef565b6020908102919091010152610dd581630fdca94f60e01b6133f5565b5f610dfa6129d361284d565b6129de90600a61421e565b6002546129eb91906140b2565b600d546126559060016140b2565b6017545f906301000000900461ffff168103612a1657505f919050565b6017545f90612a33906301000000900461ffff168461271061309d565b9050610dfa60095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aac9190614295565b829063ffffffff908116906301e133809061309d16565b6017545f90610100900461ffff168103612ade57505f919050565b5f612af5612aee6012600a61421e565b845f611585565b6017549091505f908190612b0b9060ff16613401565b9150915081831015612b2157505f949350505050565b6017545f90612b3a90610100900461ffff16858461309d565b9050612b49818761271061309d565b9695505050505050565b6001600160a01b038216612b7c575f60405163ec442f0560e01b81526004016107da9190613c9f565b610c735f8383612eb6565b5f612b90825490565b90505f5b81811015612bd957826001015f845f018381548110612bb557612bb5613fef565b905f5260205f20015481526020019081526020015f205f9055806001019050612b94565b50505f9055565b5f612beb83836134eb565b612c2057508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108b9565b505f6108b9565b6001600160a01b038416612c50575f60405163e602df0560e01b81526004016107da9190613c9f565b6001600160a01b038316612c79575f604051634a1406b160e11b81526004016107da9190613c9f565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611f3f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612ceb91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612d2657612d1a8585613502565b92505f91506126b49050565b6001925090506126b4565b5f828152600284016020526040812082905561139c848461350d565b60605f612d58613518565b5f84815260018201602052604081205491925003612d895760405163d66ca67560e01b815260040160405180910390fd5b5f83815260018201602090815260409182902080548351818402810184019094528084529091830182828015612ddc57602002820191905f5260205f20905b815481526020019060010190808311612dc8575b5050505050915050919050565b5f5f83516020612df991906140b2565b612e049060206140b2565b90505f8482604051602001612e1a9291906142b8565b60405160208183030381529060405290505f612e3461353c565b60038101546040516378542ead60e01b81529192506001600160a01b0316906378542ead90612e6b908a9086908a90600401614302565b6020604051808303815f875af1158015612e87573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eab9190614010565b979650505050505050565b6001600160a01b038316612ee0578060025f828254612ed591906140b2565b90915550612f3d9050565b6001600160a01b0383165f9081526020819052604090205481811015612f1f5783818360405163391434e360e21b81526004016107da9392919061422c565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612f5957600280548290039055612f77565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612fbc91815260200190565b60405180910390a3505050565b5f6108b982613560565b5f8080612fe08585613569565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610dfa8383613574565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561306557602002820191905f5260205f20905b815481526020019060010190808311613051575b50505050509050919050565b5f600282600381111561308657613086613dff565b613090919061433a565b60ff166001149050919050565b5f5f5f6130aa868661357f565b91509150815f036130ce578381816130c4576130c4614281565b0492505050610dfa565b8184116130e5576130e5600385150260111861359b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f5f61315761353c565b600181015460405163196d0b9b60e01b81529192506001600160a01b03169063196d0b9b9061319090889033908990899060040161437b565b6020604051808303815f875af11580156131ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614063565b8154604051630f8e573b60e21b81529193506001600160a01b031690633e395cec9061320290859033906004016143b3565b5f604051808303815f87803b158015613219575f5ffd5b505af115801561322b573d5f5f3e3d5ffd5b50505050509392505050565b5f61324061353c565b8054604051635ca4b5b160e11b81529192506001600160a01b03169063b9496b629061327290869086906004016143b3565b5f604051808303815f87803b158015613289575f5ffd5b505af115801561329b573d5f5f3e3d5ffd5b50505050505050565b5f6108b9826001600160801b031660066135ac565b5f5f82156132cc5750600160f81b6132cf565b505f5b5f6132d861353c565b600181015460405163022f65e760e31b81529192506001600160a01b03169063117b2f389061330f908990899087906004016143ca565b6020604051808303815f875af115801561332b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b499190614063565b5f5b8151811015610c735761338782828151811061336f5761336f613fef565b6020026020010151600b61362b90919063ffffffff16565b6133bf5781818151811061339d5761339d613fef565b602002602001015160405163751dff9760e11b81526004016107da9190613c9f565b600101613351565b5f826133d9576133d65f6132a4565b92505b816133ea576133e75f6132a4565b91505b610dfa83835f61363f565b5f610dfa83835f613695565b5f808061340e6012611535565b90505f84600481111561342357613423613dff565b03613433578092508291506134e5565b600384600481111561344757613447613dff565b036134595760185492508291506134e5565b600184600481111561346d5761346d613dff565b036134855761347b81613796565b92508091506134e5565b600284600481111561349957613499613dff565b036134b1576134a781613796565b92508291506134e5565b60048460048111156134c5576134c5613dff565b036134e5576018546134df906134da83613796565b6138bc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610dfa83836138cb565b5f610dfa8383612be0565b7f878245876662ba28a480c5ea71726db859fb50222b0a3d7cbbc21cfa336faf0090565b7f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e464970090565b5f6108b9825490565b5f610dfa83836138d6565b5f610dfa83836138fc565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f6135b661353c565b6001810154604051639cd07acb60e01b81529192506001600160a01b031690639cd07acb906135eb90879087906004016143ea565b6020604051808303815f875af1158015613607573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139c9190614063565b5f610dfa836001600160a01b0384166134eb565b5f5f82156136525750600160f81b613655565b505f5b5f61365e61353c565b600181015460405163f77f3f1d60e01b81529192506001600160a01b03169063f77f3f1d9061330f908990899087906004016143ca565b5f5f61369f613518565b8054925090505f6136ae61353c565b8054604051637d6e912360e11b81529192506001600160a01b03169063fadd2246906136de9089906004016143fe565b5f604051808303815f87803b1580156136f5575f5ffd5b505af1158015613707573d5f5f3e3d5ffd5b5050506002820154604051633263b83b60e01b81526001600160a01b039091169150633263b83b9086906137439087908b908b90600401614410565b5f604051808303818588803b15801561375a575f5ffd5b505af115801561376c573d5f5f3e3d5ffd5b505050505061377b83876139df565b8154825f61378883614441565b919050555050509392505050565b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061380c9190614107565b61ffff1690505f6138a160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613866573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061388a9190614295565b839063ffffffff908116906301e133809061309d16565b905061139c6138b2826127106140b2565b859061271061309d565b5f828218828411028218610dfa565b5f610dfa83836134eb565b5f825f0182815481106138eb576138eb613fef565b905f5260205f200154905092915050565b5f81815260018301602052604081205480156139d6575f61391e6001836140e0565b85549091505f90613931906001906140e0565b9050808214613990575f865f01828154811061394f5761394f613fef565b905f5260205f200154905080875f01848154811061396f5761396f613fef565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806139a1576139a1614459565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506108b9565b5f9150506108b9565b5f6139e8613518565b5f84815260018201602052604090205490915015613a1957604051633f06d22b60e01b815260040160405180910390fd5b5f83815260018201602090815260409091208351611f3f92850190613a54565b5080545f8255905f5260205f2090810190610bf99190613a95565b828054828255905f5260205f20908101928215613a8d579160200282015b82811115613a8d578251825591602001919060010190613a72565b506129239291505b5b80821115612923575f8155600101613a96565b5f5f60208385031215613aba575f5ffd5b82356001600160401b03811115613acf575f5ffd5b8301601f81018513613adf575f5ffd5b80356001600160401b03811115613af4575f5ffd5b8560208260051b8401011115613b08575f5ffd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610dfa6020830184613b18565b5f60208284031215613b68575f5ffd5b5035919050565b80356001600160a01b0381168114613b85575f5ffd5b919050565b5f5f60408385031215613b9b575f5ffd5b613ba483613b6f565b946020939093013593505050565b5f60208284031215613bc2575f5ffd5b610dfa82613b6f565b5f5f60408385031215613bdc575f5ffd5b50508035926020909101359150565b5f5f83601f840112613bfb575f5ffd5b5081356001600160401b03811115613c11575f5ffd5b6020830191508360208285010111156126b4575f5ffd5b5f5f5f5f5f60608688031215613c3c575f5ffd5b8535945060208601356001600160401b03811115613c58575f5ffd5b613c6488828901613beb565b90955093505060408601356001600160401b03811115613c82575f5ffd5b613c8e88828901613beb565b969995985093965092949392505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613cc5575f5ffd5b613cce84613b6f565b9250613cdc60208501613b6f565b929592945050506040919091013590565b60ff81168114610bf9575f5ffd5b61ffff81168114610bf9575f5ffd5b5f5f5f60608486031215613d1c575f5ffd5b8335613d2781613ced565b92506020840135613d3781613cfb565b91506040840135613d4781613cfb565b809150509250925092565b5f8151808452602084019350602083015f5b82811015613d8b5781516001600160a01b0316865260209586019590910190600101613d64565b5093949350505050565b602081525f610dfa6020830184613d52565b5f5f60408385031215613db8575f5ffd5b82359150613dc860208401613b6f565b90509250929050565b5f5f5f60608486031215613de3575f5ffd5b8335925060208401359150604084013560048110613d47575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b6080810160058610613e2757613e27613dff565b94815261ffff93841660208201529190921660408201526060015290565b5f5f83601f840112613e55575f5ffd5b5081356001600160401b03811115613e6b575f5ffd5b6020830191508360208260061b85010111156126b4575f5ffd5b5f5f5f60408486031215613e97575f5ffd5b83356001600160401b03811115613eac575f5ffd5b613eb886828701613e45565b909790965060209590950135949350505050565b5f5f5f60608486031215613ede575f5ffd5b83359250613eee60208501613b6f565b9150613efc60408501613b6f565b90509250925092565b604081525f613f176040830185613d52565b82810360208401528084518083526020830191506020860192505f5b81811015613f51578351835260209384019390920191600101613f33565b50909695505050505050565b5f5f5f5f60408587031215613f70575f5ffd5b84356001600160401b03811115613f85575f5ffd5b613f9187828801613e45565b90955093505060208501356001600160401b03811115613faf575f5ffd5b613fbb87828801613beb565b95989497509550505050565b5f5f60408385031215613fd8575f5ffd5b613fe183613b6f565b9150613dc860208401613b6f565b634e487b7160e01b5f52603260045260245ffd5b8015158114610bf9575f5ffd5b5f60208284031215614020575f5ffd5b8151610dfa81614003565b600181811c9082168061403f57607f821691505b60208210810361405d57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215614073575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108b9576108b961409e565b5f602082840312156140d5575f5ffd5b8135610dfa81614003565b818103818111156108b9576108b961409e565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215614117575f5ffd5b8151610dfa81613cfb565b6001600160a01b03929092168252602082015260400190565b6001815b60018411156141765780850481111561415a5761415a61409e565b600184161561416857908102905b60019390931c92800261413f565b935093915050565b5f8261418c575060016108b9565b8161419857505f6108b9565b81600181146141ae57600281146141b8576141d4565b60019150506108b9565b60ff8411156141c9576141c961409e565b50506001821b6108b9565b5060208310610133831016604e8410600b84101617156141f7575081810a6108b9565b6142035f19848461413b565b805f19048211156142165761421661409e565b029392505050565b5f610dfa60ff84168361417e565b6001600160a01b039390931683526020830191909152604082015260600190565b5f6020828403121561425d575f5ffd5b8151610dfa81613ced565b60ff82811682821603908111156108b9576108b961409e565b634e487b7160e01b5f52601260045260245ffd5b5f602082840312156142a5575f5ffd5b815163ffffffff81168114610dfa575f5ffd5b5f83518060208601845e9190910191825250602001919050565b5f8151808452602084019350602083015f5b82811015613d8b5781518652602095860195909101906001016142e4565b606081525f61431460608301866142d2565b82810360208401526143268186613b18565b90508281036040840152612b498185613b18565b5f60ff83168061435857634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b6054811061437757614377613dff565b9052565b8481526001600160a01b03841660208201526080604082018190525f906143a490830185613b18565b905061231f6060830184614367565b9182526001600160a01b0316602082015260400190565b92835260208301919091526001600160f81b031916604082015260600190565b82815260408101610dfa6020830184614367565b602081525f610dfa60208301846142d2565b838152606060208201525f61442860608301856142d2565b905063ffffffff60e01b83166040830152949350505050565b5f600182016144525761445261409e565b5060010190565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220502b403798751e8b4cb2e6144091da0ffead77b5fb53557b41e28cb02ae1240264736f6c634300081c00339e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497019e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e4649700a264697066735822122093eedef1c94a17a44776617e8c2899a718109973f4de7c1caf965f356d66eb8864736f6c634300081c0033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/factories/TransparentVaultFactory.sol/TransparentVaultFactory.json b/artifacts/contracts/factories/TransparentVaultFactory.sol/TransparentVaultFactory.json index 7cea4f3f..2e7e0aec 100644 --- a/artifacts/contracts/factories/TransparentVaultFactory.sol/TransparentVaultFactory.json +++ b/artifacts/contracts/factories/TransparentVaultFactory.sol/TransparentVaultFactory.json @@ -148,8 +148,8 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b50604051614fab380380614fab833981016040819052602b916074565b6001600160a01b03811660515760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0392909216919091179055609f565b5f602082840312156083575f5ffd5b81516001600160a01b03811681146098575f5ffd5b9392505050565b614eff806100ac5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610347565b610073565b6040516100589190610408565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a3908490600401610408565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041c565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041c565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e0565b6101f39a9998979695949392919061046a565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f8054604051631e832de160e21b81529295508593506001600160a01b031691637a0cb78491610242918591906004016104fd565b5f604051808303815f87803b158015610259575f5ffd5b505af115801561026b573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d5f6040516102ca98979695949392919061051a565b60405180910390a4505098975050505050505050565b61494f8061057b83390190565b5f5f83601f8401126102fd575f5ffd5b5081356001600160401b03811115610313575f5ffd5b60208301915083602082850101111561032a575f5ffd5b9250929050565b803561ffff81168114610342575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b03121561035e575f5ffd5b88356001600160a01b0381168114610374575f5ffd5b975060208901356001600160401b0381111561038e575f5ffd5b61039a8b828c016102ed565b90985096505060408901356001600160401b038111156103b8575f5ffd5b6103c48b828c016102ed565b909650945050606089013560ff811681146103dd575f5ffd5b92506103eb60808a01610331565b91506103f960a08a01610331565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042c575f5ffd5b8151801515811461043b575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f9061049f908301898b610442565b82810360808401526104b281888a610442565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104f957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043b60208301846104dd565b60c081525f61052d60c083018a8c610442565b828103602084015261054081898b610442565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056d60a08301846104dd565b999850505050505050505056fe60c060405234801561000f575f5ffd5b5060405161494f38038061494f83398101604081905261002e916108b3565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610982565b858560036100a48382610a28565b5060046100b18282610a28565b5050505f5f6100c58361050660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610982565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610982565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610ae2565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610982565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610ae2565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610afb565b6017805460ff1916600183600481111561049457610494610afb565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610c06565b6018556104e26105dc565b5050505050505050506104f96106b160201b60201c565b5050505050505050610d26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161054c91610c14565b5f60405180830381855afa9150503d805f8114610584576040519150601f19603f3d011682016040523d82523d5f602084013e610589565b606091505b509150915081801561059d57506020815110155b156105d0575f818060200190518101906105b79190610c2a565b905060ff81116105ce576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610622573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106499190810190610c41565b90505f5b81518110156106ad575f61068483838151811061066c5761066c610cf3565b6020026020010151600b61075e60201b90919060201c565b9050806106a457604051630ea075bf60e21b815260040160405180910390fd5b5060010161064d565b5050565b6007546001600160a01b03163b5f036106d057601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa92505050801561073b575060408051601f3d908101601f1916820190925261073891810190610d07565b60015b61074b57601f805460ff19169055565b601f805460ff1916911515919091179055565b5f610772836001600160a01b03841661077b565b90505b92915050565b5f8181526001830160205260408120546107c057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610775565b505f610775565b6001600160a01b03811681146107db575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561081a5761081a6107de565b604052919050565b5f82601f830112610831575f5ffd5b81516001600160401b0381111561084a5761084a6107de565b61085d601f8201601f19166020016107f2565b818152846020838601011115610871575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff8116811461089d575f5ffd5b919050565b805161ffff8116811461089d575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156108cb575f5ffd5b88516108d6816107c7565b60208a01519098506108e7816107c7565b60408a01519097506108f8816107c7565b60608a01519096506001600160401b03811115610913575f5ffd5b61091f8b828c01610822565b60808b015190965090506001600160401b0381111561093c575f5ffd5b6109488b828c01610822565b94505061095760a08a0161088d565b925061096560c08a016108a2565b915061097360e08a016108a2565b90509295985092959890939650565b5f60208284031215610992575f5ffd5b815161099d816107c7565b9392505050565b600181811c908216806109b857607f821691505b6020821081036109d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a2357805f5260205f20601f840160051c81016020851015610a015750805b601f840160051c820191505b81811015610a20575f8155600101610a0d565b50505b505050565b81516001600160401b03811115610a4157610a416107de565b610a5581610a4f84546109a4565b846109dc565b6020601f821160018114610a87575f8315610a705750848201515b5f19600385901b1c1916600184901b178455610a20565b5f84815260208120601f198516915b82811015610ab65787850151825560209485019460019092019101610a96565b5084821015610ad357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610af2575f5ffd5b6107728261088d565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610b5e57808504811115610b4257610b42610b0f565b6001841615610b5057908102905b60019390931c928002610b27565b935093915050565b5f82610b7457506001610775565b81610b8057505f610775565b8160018114610b965760028114610ba057610bbc565b6001915050610775565b60ff841115610bb157610bb1610b0f565b50506001821b610775565b5060208310610133831016604e8410600b8410161715610bdf575081810a610775565b610beb5f198484610b23565b805f1904821115610bfe57610bfe610b0f565b029392505050565b5f61077260ff841683610b66565b5f82518060208501845e5f920191825250919050565b5f60208284031215610c3a575f5ffd5b5051919050565b5f60208284031215610c51575f5ffd5b81516001600160401b03811115610c66575f5ffd5b8201601f81018413610c76575f5ffd5b80516001600160401b03811115610c8f57610c8f6107de565b8060051b610c9f602082016107f2565b91825260208184018101929081019087841115610cba575f5ffd5b6020850194505b83851015610ce85784519250610cd6836107c7565b82825260209485019490910190610cc1565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610d17575f5ffd5b8151801515811461099d575f5ffd5b60805160a051613c0b610d445f395f50505f610e6a0152613c0b5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c2410aa9736eee5a94c4be22fb1b0f8a2b5858dd773963efa321b52d28b7c36c64736f6c634300081c0033a2646970667358221220e16d22ab3f9822d0a67a7e2a7a92d9ff0b9d0d9201914ccf36bddafcaa5ae50364736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610347565b610073565b6040516100589190610408565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a3908490600401610408565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041c565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041c565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e0565b6101f39a9998979695949392919061046a565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f8054604051631e832de160e21b81529295508593506001600160a01b031691637a0cb78491610242918591906004016104fd565b5f604051808303815f87803b158015610259575f5ffd5b505af115801561026b573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d5f6040516102ca98979695949392919061051a565b60405180910390a4505098975050505050505050565b61494f8061057b83390190565b5f5f83601f8401126102fd575f5ffd5b5081356001600160401b03811115610313575f5ffd5b60208301915083602082850101111561032a575f5ffd5b9250929050565b803561ffff81168114610342575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b03121561035e575f5ffd5b88356001600160a01b0381168114610374575f5ffd5b975060208901356001600160401b0381111561038e575f5ffd5b61039a8b828c016102ed565b90985096505060408901356001600160401b038111156103b8575f5ffd5b6103c48b828c016102ed565b909650945050606089013560ff811681146103dd575f5ffd5b92506103eb60808a01610331565b91506103f960a08a01610331565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042c575f5ffd5b8151801515811461043b575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f9061049f908301898b610442565b82810360808401526104b281888a610442565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104f957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043b60208301846104dd565b60c081525f61052d60c083018a8c610442565b828103602084015261054081898b610442565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056d60a08301846104dd565b999850505050505050505056fe60c060405234801561000f575f5ffd5b5060405161494f38038061494f83398101604081905261002e916108b3565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610982565b858560036100a48382610a28565b5060046100b18282610a28565b5050505f5f6100c58361050660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610982565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610982565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610ae2565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610982565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610ae2565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610afb565b6017805460ff1916600183600481111561049457610494610afb565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610c06565b6018556104e26105dc565b5050505050505050506104f96106b160201b60201c565b5050505050505050610d26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161054c91610c14565b5f60405180830381855afa9150503d805f8114610584576040519150601f19603f3d011682016040523d82523d5f602084013e610589565b606091505b509150915081801561059d57506020815110155b156105d0575f818060200190518101906105b79190610c2a565b905060ff81116105ce576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610622573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106499190810190610c41565b90505f5b81518110156106ad575f61068483838151811061066c5761066c610cf3565b6020026020010151600b61075e60201b90919060201c565b9050806106a457604051630ea075bf60e21b815260040160405180910390fd5b5060010161064d565b5050565b6007546001600160a01b03163b5f036106d057601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa92505050801561073b575060408051601f3d908101601f1916820190925261073891810190610d07565b60015b61074b57601f805460ff19169055565b601f805460ff1916911515919091179055565b5f610772836001600160a01b03841661077b565b90505b92915050565b5f8181526001830160205260408120546107c057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610775565b505f610775565b6001600160a01b03811681146107db575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561081a5761081a6107de565b604052919050565b5f82601f830112610831575f5ffd5b81516001600160401b0381111561084a5761084a6107de565b61085d601f8201601f19166020016107f2565b818152846020838601011115610871575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff8116811461089d575f5ffd5b919050565b805161ffff8116811461089d575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156108cb575f5ffd5b88516108d6816107c7565b60208a01519098506108e7816107c7565b60408a01519097506108f8816107c7565b60608a01519096506001600160401b03811115610913575f5ffd5b61091f8b828c01610822565b60808b015190965090506001600160401b0381111561093c575f5ffd5b6109488b828c01610822565b94505061095760a08a0161088d565b925061096560c08a016108a2565b915061097360e08a016108a2565b90509295985092959890939650565b5f60208284031215610992575f5ffd5b815161099d816107c7565b9392505050565b600181811c908216806109b857607f821691505b6020821081036109d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a2357805f5260205f20601f840160051c81016020851015610a015750805b601f840160051c820191505b81811015610a20575f8155600101610a0d565b50505b505050565b81516001600160401b03811115610a4157610a416107de565b610a5581610a4f84546109a4565b846109dc565b6020601f821160018114610a87575f8315610a705750848201515b5f19600385901b1c1916600184901b178455610a20565b5f84815260208120601f198516915b82811015610ab65787850151825560209485019460019092019101610a96565b5084821015610ad357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610af2575f5ffd5b6107728261088d565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610b5e57808504811115610b4257610b42610b0f565b6001841615610b5057908102905b60019390931c928002610b27565b935093915050565b5f82610b7457506001610775565b81610b8057505f610775565b8160018114610b965760028114610ba057610bbc565b6001915050610775565b60ff841115610bb157610bb1610b0f565b50506001821b610775565b5060208310610133831016604e8410600b8410161715610bdf575081810a610775565b610beb5f198484610b23565b805f1904821115610bfe57610bfe610b0f565b029392505050565b5f61077260ff841683610b66565b5f82518060208501845e5f920191825250919050565b5f60208284031215610c3a575f5ffd5b5051919050565b5f60208284031215610c51575f5ffd5b81516001600160401b03811115610c66575f5ffd5b8201601f81018413610c76575f5ffd5b80516001600160401b03811115610c8f57610c8f6107de565b8060051b610c9f602082016107f2565b91825260208184018101929081019087841115610cba575f5ffd5b6020850194505b83851015610ce85784519250610cd6836107c7565b82825260209485019490910190610cc1565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610d17575f5ffd5b8151801515811461099d575f5ffd5b60805160a051613c0b610d445f395f50505f610e6a0152613c0b5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c2410aa9736eee5a94c4be22fb1b0f8a2b5858dd773963efa321b52d28b7c36c64736f6c634300081c0033a2646970667358221220e16d22ab3f9822d0a67a7e2a7a92d9ff0b9d0d9201914ccf36bddafcaa5ae50364736f6c634300081c0033", + "bytecode": "0x6080604052348015600e575f5ffd5b50604051614fab380380614fab833981016040819052602b916074565b6001600160a01b03811660515760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0392909216919091179055609f565b5f602082840312156083575f5ffd5b81516001600160a01b03811681146098575f5ffd5b9392505050565b614eff806100ac5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610347565b610073565b6040516100589190610408565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a3908490600401610408565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041c565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041c565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e0565b6101f39a9998979695949392919061046a565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f8054604051631e832de160e21b81529295508593506001600160a01b031691637a0cb78491610242918591906004016104fd565b5f604051808303815f87803b158015610259575f5ffd5b505af115801561026b573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d5f6040516102ca98979695949392919061051a565b60405180910390a4505098975050505050505050565b61494f8061057b83390190565b5f5f83601f8401126102fd575f5ffd5b5081356001600160401b03811115610313575f5ffd5b60208301915083602082850101111561032a575f5ffd5b9250929050565b803561ffff81168114610342575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b03121561035e575f5ffd5b88356001600160a01b0381168114610374575f5ffd5b975060208901356001600160401b0381111561038e575f5ffd5b61039a8b828c016102ed565b90985096505060408901356001600160401b038111156103b8575f5ffd5b6103c48b828c016102ed565b909650945050606089013560ff811681146103dd575f5ffd5b92506103eb60808a01610331565b91506103f960a08a01610331565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042c575f5ffd5b8151801515811461043b575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f9061049f908301898b610442565b82810360808401526104b281888a610442565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104f957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043b60208301846104dd565b60c081525f61052d60c083018a8c610442565b828103602084015261054081898b610442565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056d60a08301846104dd565b999850505050505050505056fe60c060405234801561000f575f5ffd5b5060405161494f38038061494f83398101604081905261002e916108b3565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610982565b858560036100a48382610a28565b5060046100b18282610a28565b5050505f5f6100c58361050660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610982565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610982565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610ae2565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610982565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610ae2565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610afb565b6017805460ff1916600183600481111561049457610494610afb565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610c06565b6018556104e26105dc565b5050505050505050506104f96106b160201b60201c565b5050505050505050610d26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161054c91610c14565b5f60405180830381855afa9150503d805f8114610584576040519150601f19603f3d011682016040523d82523d5f602084013e610589565b606091505b509150915081801561059d57506020815110155b156105d0575f818060200190518101906105b79190610c2a565b905060ff81116105ce576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610622573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106499190810190610c41565b90505f5b81518110156106ad575f61068483838151811061066c5761066c610cf3565b6020026020010151600b61075e60201b90919060201c565b9050806106a457604051630ea075bf60e21b815260040160405180910390fd5b5060010161064d565b5050565b6007546001600160a01b03163b5f036106d057601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa92505050801561073b575060408051601f3d908101601f1916820190925261073891810190610d07565b60015b61074b57601f805460ff19169055565b601f805460ff1916911515919091179055565b5f610772836001600160a01b03841661077b565b90505b92915050565b5f8181526001830160205260408120546107c057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610775565b505f610775565b6001600160a01b03811681146107db575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561081a5761081a6107de565b604052919050565b5f82601f830112610831575f5ffd5b81516001600160401b0381111561084a5761084a6107de565b61085d601f8201601f19166020016107f2565b818152846020838601011115610871575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff8116811461089d575f5ffd5b919050565b805161ffff8116811461089d575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156108cb575f5ffd5b88516108d6816107c7565b60208a01519098506108e7816107c7565b60408a01519097506108f8816107c7565b60608a01519096506001600160401b03811115610913575f5ffd5b61091f8b828c01610822565b60808b015190965090506001600160401b0381111561093c575f5ffd5b6109488b828c01610822565b94505061095760a08a0161088d565b925061096560c08a016108a2565b915061097360e08a016108a2565b90509295985092959890939650565b5f60208284031215610992575f5ffd5b815161099d816107c7565b9392505050565b600181811c908216806109b857607f821691505b6020821081036109d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a2357805f5260205f20601f840160051c81016020851015610a015750805b601f840160051c820191505b81811015610a20575f8155600101610a0d565b50505b505050565b81516001600160401b03811115610a4157610a416107de565b610a5581610a4f84546109a4565b846109dc565b6020601f821160018114610a87575f8315610a705750848201515b5f19600385901b1c1916600184901b178455610a20565b5f84815260208120601f198516915b82811015610ab65787850151825560209485019460019092019101610a96565b5084821015610ad357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610af2575f5ffd5b6107728261088d565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610b5e57808504811115610b4257610b42610b0f565b6001841615610b5057908102905b60019390931c928002610b27565b935093915050565b5f82610b7457506001610775565b81610b8057505f610775565b8160018114610b965760028114610ba057610bbc565b6001915050610775565b60ff841115610bb157610bb1610b0f565b50506001821b610775565b5060208310610133831016604e8410600b8410161715610bdf575081810a610775565b610beb5f198484610b23565b805f1904821115610bfe57610bfe610b0f565b029392505050565b5f61077260ff841683610b66565b5f82518060208501845e5f920191825250919050565b5f60208284031215610c3a575f5ffd5b5051919050565b5f60208284031215610c51575f5ffd5b81516001600160401b03811115610c66575f5ffd5b8201601f81018413610c76575f5ffd5b80516001600160401b03811115610c8f57610c8f6107de565b8060051b610c9f602082016107f2565b91825260208184018101929081019087841115610cba575f5ffd5b6020850194505b83851015610ce85784519250610cd6836107c7565b82825260209485019490910190610cc1565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610d17575f5ffd5b8151801515811461099d575f5ffd5b60805160a051613c0b610d445f395f50505f610e6a0152613c0b5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8e5b40e109f575781531ef89b26297cbc6aeecc383693fda6e6c6c96562a6ec64736f6c634300081c0033a264697066735822122027ef4225007531a710c9f5af4156dea4a31a2afd07dfe3edfd9c19812427b73764736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610347565b610073565b6040516100589190610408565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a3908490600401610408565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041c565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041c565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e0565b6101f39a9998979695949392919061046a565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f8054604051631e832de160e21b81529295508593506001600160a01b031691637a0cb78491610242918591906004016104fd565b5f604051808303815f87803b158015610259575f5ffd5b505af115801561026b573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d5f6040516102ca98979695949392919061051a565b60405180910390a4505098975050505050505050565b61494f8061057b83390190565b5f5f83601f8401126102fd575f5ffd5b5081356001600160401b03811115610313575f5ffd5b60208301915083602082850101111561032a575f5ffd5b9250929050565b803561ffff81168114610342575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b03121561035e575f5ffd5b88356001600160a01b0381168114610374575f5ffd5b975060208901356001600160401b0381111561038e575f5ffd5b61039a8b828c016102ed565b90985096505060408901356001600160401b038111156103b8575f5ffd5b6103c48b828c016102ed565b909650945050606089013560ff811681146103dd575f5ffd5b92506103eb60808a01610331565b91506103f960a08a01610331565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042c575f5ffd5b8151801515811461043b575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f9061049f908301898b610442565b82810360808401526104b281888a610442565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104f957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043b60208301846104dd565b60c081525f61052d60c083018a8c610442565b828103602084015261054081898b610442565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056d60a08301846104dd565b999850505050505050505056fe60c060405234801561000f575f5ffd5b5060405161494f38038061494f83398101604081905261002e916108b3565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610982565b858560036100a48382610a28565b5060046100b18282610a28565b5050505f5f6100c58361050660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610982565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610982565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610ae2565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610982565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610ae2565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610afb565b6017805460ff1916600183600481111561049457610494610afb565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610c06565b6018556104e26105dc565b5050505050505050506104f96106b160201b60201c565b5050505050505050610d26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161054c91610c14565b5f60405180830381855afa9150503d805f8114610584576040519150601f19603f3d011682016040523d82523d5f602084013e610589565b606091505b509150915081801561059d57506020815110155b156105d0575f818060200190518101906105b79190610c2a565b905060ff81116105ce576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610622573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106499190810190610c41565b90505f5b81518110156106ad575f61068483838151811061066c5761066c610cf3565b6020026020010151600b61075e60201b90919060201c565b9050806106a457604051630ea075bf60e21b815260040160405180910390fd5b5060010161064d565b5050565b6007546001600160a01b03163b5f036106d057601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa92505050801561073b575060408051601f3d908101601f1916820190925261073891810190610d07565b60015b61074b57601f805460ff19169055565b601f805460ff1916911515919091179055565b5f610772836001600160a01b03841661077b565b90505b92915050565b5f8181526001830160205260408120546107c057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610775565b505f610775565b6001600160a01b03811681146107db575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561081a5761081a6107de565b604052919050565b5f82601f830112610831575f5ffd5b81516001600160401b0381111561084a5761084a6107de565b61085d601f8201601f19166020016107f2565b818152846020838601011115610871575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff8116811461089d575f5ffd5b919050565b805161ffff8116811461089d575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156108cb575f5ffd5b88516108d6816107c7565b60208a01519098506108e7816107c7565b60408a01519097506108f8816107c7565b60608a01519096506001600160401b03811115610913575f5ffd5b61091f8b828c01610822565b60808b015190965090506001600160401b0381111561093c575f5ffd5b6109488b828c01610822565b94505061095760a08a0161088d565b925061096560c08a016108a2565b915061097360e08a016108a2565b90509295985092959890939650565b5f60208284031215610992575f5ffd5b815161099d816107c7565b9392505050565b600181811c908216806109b857607f821691505b6020821081036109d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a2357805f5260205f20601f840160051c81016020851015610a015750805b601f840160051c820191505b81811015610a20575f8155600101610a0d565b50505b505050565b81516001600160401b03811115610a4157610a416107de565b610a5581610a4f84546109a4565b846109dc565b6020601f821160018114610a87575f8315610a705750848201515b5f19600385901b1c1916600184901b178455610a20565b5f84815260208120601f198516915b82811015610ab65787850151825560209485019460019092019101610a96565b5084821015610ad357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610af2575f5ffd5b6107728261088d565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610b5e57808504811115610b4257610b42610b0f565b6001841615610b5057908102905b60019390931c928002610b27565b935093915050565b5f82610b7457506001610775565b81610b8057505f610775565b8160018114610b965760028114610ba057610bbc565b6001915050610775565b60ff841115610bb157610bb1610b0f565b50506001821b610775565b5060208310610133831016604e8410600b8410161715610bdf575081810a610775565b610beb5f198484610b23565b805f1904821115610bfe57610bfe610b0f565b029392505050565b5f61077260ff841683610b66565b5f82518060208501845e5f920191825250919050565b5f60208284031215610c3a575f5ffd5b5051919050565b5f60208284031215610c51575f5ffd5b81516001600160401b03811115610c66575f5ffd5b8201601f81018413610c76575f5ffd5b80516001600160401b03811115610c8f57610c8f6107de565b8060051b610c9f602082016107f2565b91825260208184018101929081019087841115610cba575f5ffd5b6020850194505b83851015610ce85784519250610cd6836107c7565b82825260209485019490910190610cc1565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610d17575f5ffd5b8151801515811461099d575f5ffd5b60805160a051613c0b610d445f395f50505f610e6a0152613c0b5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8e5b40e109f575781531ef89b26297cbc6aeecc383693fda6e6c6c96562a6ec64736f6c634300081c0033a264697066735822122027ef4225007531a710c9f5af4156dea4a31a2afd07dfe3edfd9c19812427b73764736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/interfaces/IInternalStateOrchestrator.sol/IInternalStateOrchestrator.json b/artifacts/contracts/interfaces/IInternalStateOrchestrator.sol/IInternalStateOrchestrator.json index c4ca4b47..fed79e56 100644 --- a/artifacts/contracts/interfaces/IInternalStateOrchestrator.sol/IInternalStateOrchestrator.json +++ b/artifacts/contracts/interfaces/IInternalStateOrchestrator.sol/IInternalStateOrchestrator.json @@ -16,29 +16,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "requestID", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "cleartexts", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "decryptionProof", - "type": "bytes" - } - ], - "name": "callbackPreProcessDecrypt", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -294,14 +271,9 @@ "internalType": "uint8", "name": "_transparentMinibatchSize", "type": "uint8" - }, - { - "internalType": "uint8", - "name": "_encryptedMinibatchSize", - "type": "uint8" } ], - "name": "updateMinibatchSizes", + "name": "updateMinibatchSize", "outputs": [], "stateMutability": "nonpayable", "type": "function" diff --git a/artifacts/contracts/interfaces/IOrionConfig.sol/IOrionConfig.json b/artifacts/contracts/interfaces/IOrionConfig.sol/IOrionConfig.json index 52a95dfa..513c2f16 100644 --- a/artifacts/contracts/interfaces/IOrionConfig.sol/IOrionConfig.json +++ b/artifacts/contracts/interfaces/IOrionConfig.sol/IOrionConfig.json @@ -345,14 +345,9 @@ "internalType": "address", "name": "transparentFactory", "type": "address" - }, - { - "internalType": "address", - "name": "encryptedFactory", - "type": "address" } ], - "name": "setVaultFactories", + "name": "setVaultFactory", "outputs": [], "stateMutability": "nonpayable", "type": "function" diff --git a/artifacts/contracts/interfaces/IOrionEncryptedVault.sol/IOrionEncryptedVault.json b/artifacts/contracts/interfaces/IOrionEncryptedVault.sol/IOrionEncryptedVault.json deleted file mode 100644 index 065b5d2e..00000000 --- a/artifacts/contracts/interfaces/IOrionEncryptedVault.sol/IOrionEncryptedVault.json +++ /dev/null @@ -1,1299 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "IOrionEncryptedVault", - "sourceName": "contracts/interfaces/IOrionEncryptedVault.sol", - "abi": [ - { - "inputs": [], - "name": "SynchronousCallDisabled", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "epoch", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "feeAmount", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "pendingCuratorFees", - "type": "uint256" - } - ], - "name": "CuratorFeesAccrued", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newCurator", - "type": "address" - } - ], - "name": "CuratorUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "vault", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "epoch", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "depositAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "sharesMinted", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "DepositRequest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "DepositRequestCancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint8", - "name": "mode", - "type": "uint8" - }, - { - "indexed": true, - "internalType": "uint16", - "name": "performanceFee", - "type": "uint16" - }, - { - "indexed": true, - "internalType": "uint16", - "name": "managementFee", - "type": "uint16" - } - ], - "name": "FeeModelUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "vault", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "epoch", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "redeemAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "sharesBurned", - "type": "uint256" - } - ], - "name": "Redeem", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "RedeemRequest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "RedeemRequestCancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Withdraw", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "epoch", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "feeAmount", - "type": "uint256" - } - ], - "name": "accrueCuratorFees", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "asset", - "outputs": [ - { - "internalType": "address", - "name": "assetTokenAddress", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "requestID", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "cleartexts", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "decryptionProof", - "type": "bytes" - } - ], - "name": "callbackDecryptSingleEbool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "cancelDepositRequest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "cancelRedeemRequest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "claimCuratorFees", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "config", - "outputs": [ - { - "internalType": "contract IOrionConfig", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "convertToAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "pointInTimeTotalAssets", - "type": "uint256" - }, - { - "internalType": "enum Math.Rounding", - "name": "rounding", - "type": "uint8" - } - ], - "name": "convertToAssetsWithPITTotalAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "convertToShares", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "pointInTimeTotalAssets", - "type": "uint256" - }, - { - "internalType": "enum Math.Rounding", - "name": "rounding", - "type": "uint8" - } - ], - "name": "convertToSharesWithPITTotalAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "curator", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "totalAssets", - "type": "uint256" - } - ], - "name": "curatorFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "deposit", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "depositTotalAssets", - "type": "uint256" - } - ], - "name": "fulfillDeposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "redeemTotalAssets", - "type": "uint256" - } - ], - "name": "fulfillRedeem", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getIntent", - "outputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - }, - { - "internalType": "euint128[]", - "name": "weights", - "type": "bytes32[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPortfolio", - "outputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - }, - { - "internalType": "euint128[]", - "name": "sharesPerAsset", - "type": "bytes32[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "isIntentValid", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "maxDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "maxAssets", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "maxMint", - "outputs": [ - { - "internalType": "uint256", - "name": "maxShares", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "maxRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "maxShares", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "maxWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "maxAssets", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingCuratorFees", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "previewDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "previewMint", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "previewRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "previewWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "requestDeposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "requestRedeem", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "externalEuint128", - "name": "weight", - "type": "bytes32" - } - ], - "internalType": "struct IOrionEncryptedVault.EncryptedIntent[]", - "name": "intent", - "type": "tuple[]" - }, - { - "internalType": "bytes", - "name": "inputProof", - "type": "bytes" - } - ], - "name": "submitIntent", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "totalManagedAssets", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newCurator", - "type": "address" - } - ], - "name": "updateCurator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "mode", - "type": "uint8" - }, - { - "internalType": "uint16", - "name": "performanceFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "managementFee", - "type": "uint16" - } - ], - "name": "updateFeeModel", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "euint128", - "name": "value", - "type": "bytes32" - } - ], - "internalType": "struct IOrionEncryptedVault.EncryptedPortfolio[]", - "name": "portfolio", - "type": "tuple[]" - }, - { - "internalType": "uint256", - "name": "newTotalAssets", - "type": "uint256" - } - ], - "name": "updateVaultState", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "assets", - "type": "address[]" - } - ], - "name": "updateVaultWhitelist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "vaultOwner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "vaultWhitelist", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "withdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x", - "deployedBytecode": "0x", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/libraries/UtilitiesLib.sol/UtilitiesLib.json b/artifacts/contracts/libraries/UtilitiesLib.sol/UtilitiesLib.json index 74a12b0e..19086bdd 100644 --- a/artifacts/contracts/libraries/UtilitiesLib.sol/UtilitiesLib.json +++ b/artifacts/contracts/libraries/UtilitiesLib.sol/UtilitiesLib.json @@ -3,8 +3,8 @@ "contractName": "UtilitiesLib", "sourceName": "contracts/libraries/UtilitiesLib.sol", "abi": [], - "bytecode": "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122001f023981e260dec5e4cd9698e21ffdc6d8c66da6886fb46c758b3238744913364736f6c634300081c0033", - "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122001f023981e260dec5e4cd9698e21ffdc6d8c66da6886fb46c758b3238744913364736f6c634300081c0033", + "bytecode": "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122093c8d68b4f9f24568b68ae13e3d041db3334c119412bb96f1af89f381b8d041864736f6c634300081c0033", + "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122093c8d68b4f9f24568b68ae13e3d041db3334c119412bb96f1af89f381b8d041864736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/orchestrators/InternalStatesOrchestrator.sol/InternalStatesOrchestrator.json b/artifacts/contracts/orchestrators/InternalStatesOrchestrator.sol/InternalStatesOrchestrator.json index 575a5f8f..2e1f462b 100644 --- a/artifacts/contracts/orchestrators/InternalStatesOrchestrator.sol/InternalStatesOrchestrator.json +++ b/artifacts/contracts/orchestrators/InternalStatesOrchestrator.sol/InternalStatesOrchestrator.json @@ -24,11 +24,6 @@ "stateMutability": "nonpayable", "type": "constructor" }, - { - "inputs": [], - "name": "HandlesAlreadySavedForRequestID", - "type": "error" - }, { "inputs": [], "name": "InsufficientAmount", @@ -39,21 +34,11 @@ "name": "InvalidArguments", "type": "error" }, - { - "inputs": [], - "name": "InvalidKMSSignatures", - "type": "error" - }, { "inputs": [], "name": "InvalidState", "type": "error" }, - { - "inputs": [], - "name": "NoHandleFoundForRequestID", - "type": "error" - }, { "inputs": [], "name": "NotAuthorized", @@ -114,19 +99,6 @@ "name": "AutomationRegistryUpdated", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "requestID", - "type": "uint256" - } - ], - "name": "DecryptionFulfilled", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -198,29 +170,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "requestID", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "cleartexts", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "decryptionProof", - "type": "bytes" - } - ], - "name": "callbackPreProcessDecrypt", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -284,38 +233,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "encryptedMinibatchSize", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "encryptedVaultsEpoch", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "epochCounter", @@ -528,19 +445,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "protocolId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, { "inputs": [], "name": "registry", @@ -703,14 +607,9 @@ "internalType": "uint8", "name": "_transparentMinibatchSize", "type": "uint8" - }, - { - "internalType": "uint8", - "name": "_encryptedMinibatchSize", - "type": "uint8" } ], - "name": "updateMinibatchSizes", + "name": "updateMinibatchSize", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -745,23 +644,10 @@ ], "stateMutability": "view", "type": "function" - }, - { - "inputs": [], - "name": "validEncryptedVaultsCount", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b5060405161597b38038061597b83398101604081905261002e9161075f565b826100d26100cd604080516080810182525f80825260208201819052918101829052606081019190915250604080516080810182527350157cffd6bbfa2dece204a89ec419c23ef5755d815273cd3ab3bd6bcc0c0bf3e27912a92043e817b1cf69602082015273a02cda4ca3a71d7c46997716f4283aa851c2881291810191909152731364cbbf2cdf5032c47d8226a6f6fbd2afcdacac606082015290565b61050c565b6001600160a01b0381166100ff57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b610108816105c5565b50600180556001600160a01b0382166101345760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03811661015b5760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0384169081179091556040805163015df99360e01b8152905163015df993916004808201926020929091908290030181865afa1580156101b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d691906107a9565b600580546001600160a01b0319166001600160a01b039283161790556003546040805163d1717c7d60e01b81529051919092169163d1717c7d9160048083019260209291908290030181865afa158015610232573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061025691906107cb565b61026190600a6108e2565b60075560035460408051631c56369f60e21b815290516001600160a01b0390921691637158da7c916004808201926020929091908290030181865afa1580156102ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d091906107a9565b600880546001600160a01b0319166001600160a01b03928316908117909155600354604051633c2e3e7b60e11b815260048101929092529091169063785c7cf690602401602060405180830381865afa15801561032f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035391906107cb565b600860146101000a81548160ff021916908360ff16021790555060035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e191906107cb565b6103ec90600a6108e2565b6006556019805463ffff000019166301010000179055600280546001600160a01b0319166001600160a01b038381169190911790915560035460408051631d06d6c760e11b815290519190921691633a0dad8e9160048281019260209291908290030181865afa158015610462573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048691906107a9565b600480546001600160a01b0319166001600160a01b0392909216919091179055601780546201518063ffffffff1990911681179091556104c690426108f0565b6018556019805465ffff0000ffff191690556104e15f610614565b601a8190556104ef9061062f565b50506008805463ffffffff60a81b1916905550505f601e5561094a565b80515f51602061595b5f395f51905f5280546001600160a01b03199081166001600160a01b039384161790915560208301515f51602061593b5f395f51905f528054831691841691909117905560408301517f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497028054831691841691909117905560608301517f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497038054909216921691909117905550565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6106296001600160801b038316600661063e565b92915050565b5f61063a82306106d5565b5090565b5f51602061593b5f395f51905f5254604051639cd07acb60e01b81525f915f51602061595b5f395f51905f52916001600160a01b0390911690639cd07acb9061068d9087908790600401610903565b6020604051808303815f875af11580156106a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106cd9190610933565b949350505050565b5f5f51602061595b5f395f51905f528054604051635ca4b5b160e11b8152600481018690526001600160a01b03858116602483015292935091169063b9496b62906044015f604051808303815f87803b158015610730575f5ffd5b505af1158015610742573d5f5f3e3d5ffd5b50505050505050565b6001600160a01b03811681146105c2575f5ffd5b5f5f5f60608486031215610771575f5ffd5b835161077c8161074b565b602085015190935061078d8161074b565b604085015190925061079e8161074b565b809150509250925092565b5f602082840312156107b9575f5ffd5b81516107c48161074b565b9392505050565b5f602082840312156107db575f5ffd5b815160ff811681146107c4575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561083a5780850481111561081e5761081e6107eb565b600184161561082c57908102905b60019390931c928002610803565b935093915050565b5f8261085057506001610629565b8161085c57505f610629565b8160018114610872576002811461087c57610898565b6001915050610629565b60ff84111561088d5761088d6107eb565b50506001821b610629565b5060208310610133831016604e8410600b84101617156108bb575081810a610629565b6108c75f1984846107ff565b805f19048211156108da576108da6107eb565b029392505050565b5f6107c460ff841683610842565b80820180821115610629576106296107eb565b828152604081016054831061092657634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b5f60208284031215610943575f5ffd5b5051919050565b614fe4806109575f395ff3fe608060405234801561000f575f5ffd5b50600436106101d5575f3560e01c8062bb07bb146101d9578063055ad42e146101ee5780630844697d1461021857806308af604d14610240578063132b1c921461026557806314b19c5a1461029b57806314b5d07f146102a957806325a760c2146102bc578063289a2f76146102d05780632b0088b4146102f05780632e2dc43e146102f957806336021ef4146103135780633a0dad8e146103275780634585e33b1461033a5780634ff0876a1461034d5780635488cd621461037257806358fac65b146103865780635dc228a0146103995780636e04ff0d146103ac5780636ff04153146103cd57806370604445146103e2578063715018a6146103f55780637158da7c146103fd57806379502c55146104105780637b103999146104235780637cdabf0a14610436578063800f9fad146104495780638da5cb5b146104525780638f5c94651461045a578063b8b2af7c14610463578063ba96ff1114610478578063be2683f01461048b578063c18e2a5c1461049e578063ca1f32f1146104a7578063d3f89f66146104b0578063da1f12ab146104be578063e2638ff1146104c6578063e2c4aaec146104ee578063eeb393c914610501578063f2fde38b14610514575b5f5ffd5b6101ec6101e73660046144ca565b610527565b005b60195461020290600160201b900460ff1681565b60405161020f9190614515565b60405180910390f35b60085461022d90600160b81b900461ffff1681565b60405161ffff909116815260200161020f565b6019546102539062010000900460ff1681565b60405160ff909116815260200161020f565b61028d610273366004614543565b6001600160a01b03165f9081526012602052604090205490565b60405190815260200161020f565b60195461022d9061ffff1681565b6101ec6102b7366004614543565b610621565b60085461025390600160a01b900460ff1681565b6102e36102de36600461455e565b61072a565b60405161020f9190614575565b61028d60075481565b610301610752565b60405161020f969594939291906145fc565b601954610253906301000000900460ff1681565b6004546102e3906001600160a01b031681565b6101ec6103483660046146ba565b6109ce565b60175461035d9063ffffffff1681565b60405163ffffffff909116815260200161020f565b60195461025390600160281b900460ff1681565b6102e361039436600461455e565b610b73565b6002546102e3906001600160a01b031681565b6103bf6103ba3660046146ba565b610b82565b60405161020f929190614726565b6103d5610f32565b60405161020f9190614740565b6101ec6103f036600461455e565b610fcc565b6101ec611033565b6008546102e3906001600160a01b031681565b6003546102e3906001600160a01b031681565b6005546102e3906001600160a01b031681565b6101ec610444366004614768565b611046565b61028d60095481565b6102e361114d565b61022d61271081565b60085461022d90600160a81b900461ffff1681565b61028d610486366004614543565b61115b565b6101ec610499366004614799565b6111b4565b61028d601e5481565b61028d60065481565b601d5461022d9061ffff1681565b61271161028d565b61028d6104d4366004614543565b6001600160a01b03165f9081526011602052604090205490565b6101ec6104fc36600461455e565b6112ba565b6101ec61050f366004614821565b61132d565b6101ec610522366004614543565b611414565b61052f611457565b60ff82161580610540575060ff8116155b1561055e576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d2919061483c565b6105ef576040516312aecd8160e01b815260040160405180910390fd5b6019805463ffff000019166201000060ff9485160263ff00000019161763010000009290931691909102919091179055565b610629611457565b6001600160a01b0381166106505760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c4919061483c565b6106e1576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b601c8181548110610739575f80fd5b5f918252602090912001546001600160a01b0316905081565b606080808080805f601954600160201b900460ff16600781111561077857610778614501565b14610796576040516312aecd8160e01b815260040160405180910390fd5b5f600a600b018054806020026020016040519081016040528092919081815260200182805480156107ee57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116107d0575b505050505090505f5f61080083611489565b915091508161ffff166001600160401b038111156108205761082061485b565b604051908082528060200260200182016040528015610849578160200160208202803683370190505b5098508161ffff166001600160401b038111156108685761086861485b565b604051908082528060200260200182016040528015610891578160200160208202803683370190505b5097508061ffff166001600160401b038111156108b0576108b061485b565b6040519080825280602002602001820160405280156108d9578160200160208202803683370190505b5096508061ffff166001600160401b038111156108f8576108f861485b565b604051908082528060200260200182016040528015610921578160200160208202803683370190505b5095508161ffff166001600160401b038111156109405761094061485b565b604051908082528060200260200182016040528015610969578160200160208202803683370190505b5094508061ffff166001600160401b038111156109885761098861485b565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5093506109c3838a8a888b8b8a61152a565b505050909192939495565b6109d661114d565b6001600160a01b0316336001600160a01b031614158015610a0257506002546001600160a01b03163314155b15610a205760405163ea8e4eb560e01b815260040160405180910390fd5b610a2861170d565b6005811015610a4a576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610a588385018561486f565b90925090506341659aab60e01b6001600160e01b0319831601610a8257610a7d611737565b610b64565b636ce38ed360e11b6001600160e01b0319831601610aa357610a7d81611927565b635954faa160e01b6001600160e01b0319831601610ac457610a7d816120d8565b63dbd33d3560e01b6001600160e01b0319831601610ae457610a7d6126b7565b6292a80f60e51b6001600160e01b0319831601610b0357610a7d612bb4565b6265e66b60e01b6001600160e01b0319831601610b2357610a7d81612eca565b63f4d3cc0960e01b6001600160e01b0319831601610b4457610a7d816133d3565b63c4b3cef760e01b6001600160e01b0319831601610b6457610b646134be565b5050610b6f60018055565b5050565b601b8181548110610739575f80fd5b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf9919061483c565b8015610c06575060185442115b15610c5857600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610c42929190614897565b6040516020818303038152906040529050610f2b565b6001601954600160201b900460ff166007811115610c7857610c78614501565b03610cc357600191507f2638e25a856cbfe28e0ae1857cb597cc2ceb873ce579b7d93c2258e45a754481601960059054906101000a900460ff16604051602001610c42929190614897565b6002601954600160201b900460ff166007811115610ce357610ce3614501565b03610d2e57600191507fa6ab055f7fc0612ad6e844f7e1dd3a6df793560cd68d707affa0dd01c39ec8f1601960059054906101000a900460ff16604051602001610c42929190614897565b6003601954600160201b900460ff166007811115610d4e57610d4e614501565b03610d8a57600191507f242cc2cba236b9c457bb86deb0ad1fb8fe60d5bcafd69d02041c9c62f3ea1fbd5f604051602001610c42929190614897565b6004601954600160201b900460ff166007811115610daa57610daa614501565b03610de657600191507fedaafe206508e00f40674bb87dda745bccfe8a3f3f6d6eaaf6db5f44021a1c135f604051602001610c42929190614897565b6005601954600160201b900460ff166007811115610e0657610e06614501565b03610e5157600191507fff9a199536c068c55c334e40ebfa355733f79152332d6586d615c5bb37fd5c17601960059054906101000a900460ff16604051602001610c42929190614897565b6006601954600160201b900460ff166007811115610e7157610e71614501565b03610ebc57600191507f0b2c33f7f9ce5cba78feb12c50c7fc97cbcfb655f151982783c0f2faf7567b0b601960059054906101000a900460ff16604051602001610c42929190614897565b6007601954600160201b900460ff166007811115610edc57610edc614501565b03610f1857600191507f3b4c310984a9fe486c05a56b52659c09d4bf9f3ef9b799ad52ee29a7d805741e5f604051602001610c42929190614897565b505060408051602081019091525f808252905b9250929050565b60605f601954600160201b900460ff166007811115610f5357610f53614501565b14610f71576040516312aecd8160e01b815260040160405180910390fd5b6015805460408051602080840282018101909252828152929190830182828015610fc257602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610fa4575b5050505050905090565b6004546001600160a01b03163314610ff75760405163ea8e4eb560e01b815260040160405180910390fd5b60095481111561101a57604051632ca2f52b60e11b815260040160405180910390fd5b8060095f82825461102b91906148c8565b909155505050565b61103b611457565b6110445f61368a565b565b61104e611457565b60328261ffff16118061106657506107d08161ffff16115b15611084576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f8919061483c565b611115576040516312aecd8160e01b815260040160405180910390fd5b6008805463ffffffff60a81b1916600160a81b61ffff9485160261ffff60b81b191617600160b81b9290931691909102919091179055565b5f546001600160a01b031690565b5f80601954600160201b900460ff16600781111561117b5761117b614501565b14611199576040516312aecd8160e01b815260040160405180910390fd5b506001600160a01b03165f908152600a602052604090205490565b6112268585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284375f920191909152506136d992505050565b604080515f6020820152016040516020818303038152906040528051906020012084846040516112579291906148db565b60405180910390200361127d576019805461ffff60201b1916600160221b1790556112b3565b6112898385018561493c565b805161129d91601f9160209091019061444c565b506019805461ffff60201b1916600360201b1790555b5050505050565b6004546001600160a01b031633146112e55760405163ea8e4eb560e01b815260040160405180910390fd5b5f8113156113095780601e5f8282546112fe91906149c7565b9091555061132a9050565b5f81121561132a5761131a816149da565b601e5f82825461102b91906148c8565b50565b611335611457565b8063ffffffff165f0361135b576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113cf919061483c565b6113ec576040516312aecd8160e01b815260040160405180910390fd5b6017805463ffffffff191663ffffffff831690811790915561140e90426149c7565b60185550565b61141c611457565b6001600160a01b03811661144e575f604051631e4fbdf760e01b81526004016114459190614575565b60405180910390fd5b61132a8161368a565b3361146061114d565b6001600160a01b031614611044573360405163118cdaa760e01b81526004016114459190614575565b80515f908190815b8161ffff168161ffff161015611523575f858261ffff16815181106114b8576114b86149f4565b6020908102919091018101516001600160a01b0381165f9081526013909252604090912054909150156114f1576114ee85614a08565b94505b6001600160a01b0381165f908152601460205260409020541561151a5761151784614a08565b93505b50600101611491565b5050915091565b86515f80805b8361ffff168161ffff161015611700575f8b8261ffff1681518110611557576115576149f4565b6020908102919091018101516001600160a01b0381165f908152601383526040808220546014909452902054909250811561163c57828d8761ffff16815181106115a3576115a36149f4565b60200260200101906001600160a01b031690816001600160a01b031681525050818c8761ffff16815181106115da576115da6149f4565b6020908102919091018101919091526001600160a01b0384165f908152600a909152604090205460065461160f918491613742565b8b8761ffff1681518110611625576116256149f4565b602090810291909101015261163986614a08565b95505b80156116f257828a8661ffff1681518110611659576116596149f4565b60200260200101906001600160a01b031690816001600160a01b03168152505080898661ffff1681518110611690576116906149f4565b6020908102919091018101919091526001600160a01b0384165f908152600a90915260409020546006546116c5918391613742565b888661ffff16815181106116db576116db6149f4565b60209081029190910101526116ef85614a08565b94505b505050806001019050611530565b5050505050505050505050565b60026001540361173057604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b601854421115806117b9575060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611793573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b7919061483c565b155b156117d75760405163085de62560e01b815260040160405180910390fd5b5f5b60155461ffff821610156118ac575f600a600b018261ffff1681548110611802576118026149f4565b5f9182526020808320909101546001600160a01b03168252600a81526040808320839055600b8252808320839055600d82528083208390556011825280832083905560128252808320839055600f8252808320839055601382528083208390556014825280832083905560168252808320805460ff19169055601a54600c8352818420819055600e8352818420819055601090925290912055506118a581614a08565b90506117d9565b506118b860155f614491565b6118c3601f5f614491565b6118cb6137f3565b6118d3613a4c565b601c54601d805461ffff191661ffff8316179055601b545f916118f691906149c7565b11156110445760175461190f9063ffffffff16426149c7565b6018556019805460ff60201b1916600160201b179055565b6001601954600160201b900460ff16600781111561194757611947614501565b146119655760405163baf3f0f760e01b815260040160405180910390fd5b6019805460059061197f90600160281b900460ff16614a28565b91906101000a81548160ff021916908360ff1602179055505f601960029054906101000a900460ff16826119b39190614a3d565b60195460ff91821692505f916119d0916201000090041683614a60565b601b5490915061ffff821611806119ec5750601b5461ffff8216145b15611a0a5750601b546019805461ffff60201b1916600160211b1790555b815b8161ffff168161ffff1610156120d2575f601b8261ffff1681548110611a3457611a346149f4565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa158015611a8e573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ab59190810190614ae8565b90925090505f805b83518161ffff161015611da1575f848261ffff1681518110611ae157611ae16149f4565b602002602001015190505f848361ffff1681518110611b0257611b026149f4565b6020026020010151905080600a6001015f846001600160a01b03166001600160a01b031681526020019081526020015f205f828254611b4191906149c7565b90915550506001600160a01b0382165f9081526016602052604090205460ff16611cc5576008546001600160a01b0390811690831603611c3d57600854611c2090611b9790600160a01b900460ff16600a614c89565b600860149054906101000a900460ff1660035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1b9190614c97565b613c9a565b6001600160a01b0383165f908152600a6020526040902055611cc5565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e0990611c6d908590600401614575565b602060405180830381865afa158015611c88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cac9190614cb2565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a6020526040812054600654909190611d7590611cf49084908690613742565b600354604051633c2e3e7b60e11b81526001600160a01b039091169063785c7cf690611d24908990600401614575565b602060405180830381865afa158015611d3f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d639190614c97565b600854600160a01b900460ff16613c9a565b9050611d8181876149c7565b9550611d8c84613d04565b5050505080611d9a90614a08565b9050611abd565b506008545f90611dbf90600160a81b900461ffff1683612710613742565b601754909150611de090829063ffffffff908116906301e133809061374216565b90508060095f828254611df391906149c7565b90915550611e03905081836148c8565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0387169063e51a85f690602401602060405180830381865afa158015611e4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6f9190614cb2565b9050611e7b81846148c8565b6008549093505f90611e9b90600160b81b900461ffff1683612710613742565b90508060095f828254611eae91906149c7565b90915550611ebe905081836148c8565b601954604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03881690630df571f7906044015f604051808303815f87803b158015611f0e575f5ffd5b505af1158015611f20573d5f5f3e3d5ffd5b505050505f876001600160a01b031663a68a5267896001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f70573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f949190614cb2565b875f6040518463ffffffff1660e01b8152600401611fb493929190614cc9565b602060405180830381865afa158015611fcf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff39190614cb2565b6001600160a01b0389165f908152601160205260409020869055905061201981866148c8565b94505f886001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612058573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061207c9190614cb2565b6001600160a01b038a165f90815260126020526040902087905590506120a281876149c7565b6001600160a01b039099165f908152600d6020526040902098909855505060019096019550611a0c945050505050565b50505050565b6002601954600160201b900460ff1660078111156120f8576120f8614501565b146121165760405163baf3f0f760e01b815260040160405180910390fd5b6019805460059061213090600160281b900460ff16614a28565b82546101009290920a60ff818102199093169183160217909155601c5460195490915f916121679163010000009091041684614a3d565b60195460ff91821692505f9161218591630100000090041683614a60565b90508261ffff168161ffff1611806121a457508261ffff168161ffff16145b156121ac5750815b815b8161ffff168161ffff1610156124f8575f601c8261ffff16815481106121d6576121d66149f4565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa158015612230573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122579190810190614ae8565b601a5491935091505f5b83518161ffff1610156124d1575f848261ffff1681518110612285576122856149f4565b602002602001015190505f848361ffff16815181106122a6576122a66149f4565b602002602001015190506122e0600a6002015f846001600160a01b03166001600160a01b031681526020019081526020015f205482613d89565b6001600160a01b0383165f908152600c602090815260408083209390935560169052205460ff166123e2576008546001600160a01b039081169083160361235a5760085461233d90611b9790600160a01b900460ff16600a614c89565b6001600160a01b0383165f908152600a60205260409020556123e2565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e099061238a908590600401614575565b602060405180830381865afa1580156123a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c99190614cb2565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120549061241861241061240a84613dc0565b85613dd5565b600654613e03565b600354604051633c2e3e7b60e11b81529192505f916124a49184916001600160a01b039091169063785c7cf690612453908a90600401614575565b602060405180830381865afa15801561246e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124929190614c97565b600854600160a01b900460ff16613e28565b90506124b08782613d89565b96506124bb85613d04565b5050505050806124ca90614a08565b9050612261565b506001600160a01b039093165f908152600e602052604090209290925550506001016121ae565b508261ffff168161ffff16036120d2578261ffff165f0361252c576019805461ffff60201b1916600160221b1790556120d2565b6015545f61253a8286614a60565b61ffff166001600160401b038111156125555761255561485b565b60405190808252806020026020018201604052801561257e578160200160208202803683370190505b5090505f5b8561ffff168161ffff161015612608575f601c8261ffff16815481106125ab576125ab6149f4565b5f9182526020808320909101546001600160a01b0316808352600e9091526040909120549091506125db81613e89565b5080848461ffff16815181106125f3576125f36149f4565b60209081029190910101525050600101612583565b505f5b8261ffff168161ffff16101561269c575f600a600b018261ffff1681548110612636576126366149f4565b5f9182526020808320909101546001600160a01b0316808352600c90915260409091205490915061266681613e89565b508084612673858b614a60565b61ffff1681518110612687576126876149f4565b6020908102919091010152505060010161260b565b506126ae81630be2683f60e41b613e98565b50505050505050565b6003601954600160201b900460ff1660078111156126d7576126d7614501565b146126f55760405163baf3f0f760e01b815260040160405180910390fd5b601c546015545f5b8261ffff168161ffff161015612aef575f601c8261ffff1681548110612725576127256149f4565b5f918252602091829020015460408051631b9d6fc560e31b815290516001600160a01b039092169350839263dceb7e28926004808401938290030181865afa158015612773573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612797919061483c565b6127a15750612ae7565b5f601f8361ffff16815481106127b9576127b96149f4565b5f9182526020822001546008549092506127e190600160a81b900461ffff1683612710613742565b60175490915061280290829063ffffffff908116906301e133809061374216565b90508060095f82825461281591906149c7565b90915550612825905081836148c8565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0385169063e51a85f690602401602060405180830381865afa15801561286d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128919190614cb2565b905061289d81846148c8565b6008549093505f906128bd90600160b81b900461ffff1683612710613742565b90508060095f8282546128d091906149c7565b909155506128e0905081836148c8565b601954604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03861690630df571f7906044015f604051808303815f87803b158015612930575f5ffd5b505af1158015612942573d5f5f3e3d5ffd5b505050505f856001600160a01b031663a68a5267876001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612992573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129b69190614cb2565b875f6040518463ffffffff1660e01b81526004016129d693929190614cc9565b602060405180830381865afa1580156129f1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a159190614cb2565b6001600160a01b0387165f9081526011602052604090208690559050612a3b81866148c8565b94505f866001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9e9190614cb2565b6001600160a01b0388165f9081526012602052604090208790559050612ac481876149c7565b6001600160a01b039097165f908152600d60205260409020969096555050505050505b6001016126fd565b505f5b8161ffff168161ffff161015612b9b575f600a600b018261ffff1681548110612b1d57612b1d6149f4565b5f9182526020822001546001600160a01b03169150601f612b3e8487614a60565b61ffff1681548110612b5257612b526149f4565b5f9182526020808320909101546001600160a01b0385168352600b90915260408220805491935083929091612b889084906149c7565b909155505060019092019150612af29050565b50506019805461ffff60201b1916600160221b17905550565b6004601954600160201b900460ff166007811115612bd457612bd4614501565b14612bf25760405163baf3f0f760e01b815260040160405180910390fd5b6019805460ff60201b1916600560201b179055601b54601c545f805b8361ffff168161ffff161015612c72575f601b8261ffff1681548110612c3657612c366149f4565b5f9182526020808320909101546001600160a01b0316808352600d909152604090912054909150612c6790846149c7565b925050600101612c0e565b505f5b8261ffff168161ffff161015612cd9575f601c8261ffff1681548110612c9d57612c9d6149f4565b5f9182526020808320909101546001600160a01b0316808352600d909152604090912054909150612cce90846149c7565b925050600101612c75565b50600480546040805163dab26e3b60e01b815290515f93612d50936001600160a01b03169263dab26e3b92818301926020928290030181865afa158015612d22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d469190614cb2565b8390612710613742565b905080601e541115612d625750505050565b5f601e5482612d7191906148c8565b90505f5b8561ffff168161ffff161015612e0f575f601b8261ffff1681548110612d9d57612d9d6149f4565b5f9182526020808320909101546001600160a01b0316808352600d909152604082205490925090612dcf858389613742565b6001600160a01b0384165f908152600d6020526040812080549293508392909190612dfb9084906148c8565b909155505060019093019250612d75915050565b505f5b8461ffff168161ffff161015612eac575f601c8261ffff1681548110612e3a57612e3a6149f4565b5f9182526020808320909101546001600160a01b0316808352600d909152604082205490925090612e6c858389613742565b6001600160a01b0384165f908152600d6020526040812080549293508392909190612e989084906148c8565b909155505060019093019250612e12915050565b5080601e5f828254612ebe91906149c7565b90915550505050505050565b6005601954600160201b900460ff166007811115612eea57612eea614501565b14612f085760405163baf3f0f760e01b815260040160405180910390fd5b60198054600590612f2290600160281b900460ff16614a28565b91906101000a81548160ff021916908360ff1602179055505f601960029054906101000a900460ff1682612f569190614a3d565b60195460ff91821692505f91612f73916201000090041683614a60565b601b5490915061ffff82161180612f8f5750601b5461ffff8216145b15612fad5750601b546019805461ffff60201b1916600360211b1790555b815b8161ffff168161ffff1610156120d2575f601b8261ffff1681548110612fd757612fd76149f4565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa158015613031573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526130589190810190614cf5565b6001600160a01b0385165f908152600d6020526040812054835193955091935090916001600160401b038111156130915761309161485b565b6040519080825280602002602001820160405280156130d557816020015b604080518082019091525f80825260208201528152602001906001900390816130af5790505b5090505f5b84518161ffff161015613367575f858261ffff16815181106130fe576130fe6149f4565b602002602001015190505f858361ffff168151811061311f5761311f6149f4565b6020908102919091018101516001600160a01b0384165f908152601690925260409091205490915060ff16613225576008546001600160a01b039081169083160361319d5760085461318090611b9790600160a01b900460ff16600a614c89565b6001600160a01b0383165f908152600a6020526040902055613225565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e09906131cd908590600401614575565b602060405180830381865afa1580156131e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061320c9190614cb2565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120546006546007549192916132c79161326d918590613266908c9063ffffffff808b16919061374216565b9190613742565b600854600354604051633c2e3e7b60e11b8152600160a01b90920460ff16916001600160a01b039091169063785c7cf6906132ac908a90600401614575565b602060405180830381865afa158015611bf7573d5f5f3e3d5ffd5b90506040518060400160405280856001600160a01b031681526020018263ffffffff16815250868661ffff1681518110613303576133036149f4565b602002602001018190525080600a6005015f866001600160a01b03166001600160a01b031681526020019081526020015f205f82825461334391906149c7565b90915550613352905084613d04565b505050508061336090614a08565b90506130da565b50604051630415112560e21b81526001600160a01b038616906310544494906133969084908690600401614dae565b5f604051808303815f87803b1580156133ad575f5ffd5b505af11580156133bf573d5f5f3e3d5ffd5b505050505050505050806001019050612faf565b6006601954600160201b900460ff1660078111156133f3576133f3614501565b146134115760405163baf3f0f760e01b815260040160405180910390fd5b6019805460059061342b90600160281b900460ff16614a28565b82546101009290920a60ff818102199093169183160217909155601c5460195490915f916134629163010000009091041684614a3d565b60195460ff91821692505f9161348091630100000090041683614a60565b90508261ffff168161ffff16118061349f57508261ffff168161ffff16145b156120d25750506019805461ffff60201b1916600760201b1790555050565b6007601954600160201b900460ff1660078111156134de576134de614501565b146134fc5760405163baf3f0f760e01b815260040160405180910390fd5b5f600a600b0180548060200260200160405190810160405280929190818152602001828054801561355457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613536575b505083519394505f925050505b8161ffff168161ffff16101561361f575f838261ffff1681518110613588576135886149f4565b6020908102919091018101516001600160a01b0381165f908152600b8352604080822054600f909452902054909250808211156135e6576135c981836148c8565b6001600160a01b0384165f90815260136020526040902055613611565b81811115613611576135f882826148c8565b6001600160a01b0384165f908152601460205260409020555b505050806001019050613561565b506019805460ff60201b19811682555f9061363d9061ffff16614a08565b82546101009290920a61ffff8181021990931691831602179091556019546040519116907f0bc12479581640d161e016cef21aa834cb6d6326bbc0d8445e58d56403adf2dc905f90a25050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6136e384613ea4565b90505f6136f1828585613f40565b9050806137115760405163cf6c44e960e01b815260040160405180910390fd5b60405185907f1af0453083661051f6e56e5c070792320652e612154bf9af8637bb1e7655b99d905f90a25050505050565b5f5f5f61374f868661400d565b91509150815f036137735783818161376957613769614e15565b04925050506137ec565b81841161378a5761378a6003851502601118614029565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150505b9392505050565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890613823908490600401614e29565b5f60405180830381865afa15801561383d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526138649190810190614e3d565b9050613871601b5f614491565b5f5b81518161ffff161015610b6f575f828261ffff1681518110613897576138976149f4565b60200260200101519050806001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138dd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139019190614cb2565b15801561396b5750806001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613945573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139699190614cb2565b155b156139765750613a3c565b5f816001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156139b2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526139d99190810190614cf5565b50905080515f036139eb575050613a3c565b50601b80546001810182555f919091527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10180546001600160a01b0319166001600160a01b03929092169190911790555b613a4581614a08565b9050613873565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890613a7d90600190600401614e29565b5f60405180830381865afa158015613a97573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613abe9190810190614e3d565b9050613acb601c5f614491565b5f5b81518161ffff161015610b6f575f828261ffff1681518110613af157613af16149f4565b60200260200101519050806001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b37573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b5b9190614cb2565b158015613bc55750806001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bc39190614cb2565b155b15613bd05750613c8a565b806001600160a01b031663dceb7e286040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c30919061483c565b613c3a5750613c8a565b601c80546001810182555f919091527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319166001600160a01b03929092169190911790555b613c9381614a08565b9050613acd565b5f8260ff168260ff161115613ccf57613cb38383614e6e565b613cbe90600a614c89565b613cc89085614e87565b90506137ec565b8260ff168260ff161015613cfc57613ce78284614e6e565b613cf290600a614c89565b613cc89085614e9e565b509192915050565b6001600160a01b0381165f9081526016602052604090205460ff1661132a576015805460018181019092557f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0384166001600160a01b031990911681179091555f908152601660205260409020805460ff1916909117905550565b5f82613d9b57613d985f613dc0565b92505b81613dac57613da95f613dc0565b91505b613db783835f61403a565b90505b92915050565b5f613dba826001600160801b031660066140da565b5f82613de757613de45f613dc0565b92505b81613df857613df55f613dc0565b91505b613db783835f614161565b5f82613e1557613e125f613dc0565b92505b613db7836001600160801b0384166141b7565b5f8260ff168260ff161115613e5d57613cc884613e58613e488686614e6e565b613e5390600a614c89565b613dc0565b613dd5565b8260ff168260ff161015613cfc57613cc884613e798486614e6e565b613e8490600a614c89565b613e03565b5f613e948230614246565b5090565b5f613db783835f6142ad565b60605f613eaf6143ae565b5f84815260018201602052604081205491925003613ee05760405163d66ca67560e01b815260040160405180910390fd5b5f83815260018201602090815260409182902080548351818402810184019094528084529091830182828015613f3357602002820191905f5260205f20905b815481526020019060010190808311613f1f575b5050505050915050919050565b5f5f83516020613f5091906149c7565b613f5b9060206149c7565b90505f8482604051602001613f71929190614ebd565b60405160208183030381529060405290505f613f8b6143d2565b60038101546040516378542ead60e01b81529192506001600160a01b0316906378542ead90613fc2908a9086908a90600401614ed7565b6020604051808303815f875af1158015613fde573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614002919061483c565b979650505050505050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f821561404d5750600160f81b614050565b505f5b5f6140596143d2565b600181015460405163022f65e760e31b81529192506001600160a01b03169063117b2f389061409090899089908790600401614f0f565b6020604051808303815f875af11580156140ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d09190614cb2565b9695505050505050565b5f5f6140e46143d2565b6001810154604051639cd07acb60e01b81529192506001600160a01b031690639cd07acb906141199087908790600401614f2f565b6020604051808303815f875af1158015614135573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141599190614cb2565b949350505050565b5f5f82156141745750600160f81b614177565b505f5b5f6141806143d2565b6001810154604051630afe14ad60e31b81529192506001600160a01b0316906357f0a5689061409090899089908790600401614f0f565b5f600160f81b816141c66143d2565b6001810154604051635a53accb60e01b81529192506001600160a01b031690635a53accb906141fd90889088908790600401614f0f565b6020604051808303815f875af1158015614219573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061423d9190614cb2565b95945050505050565b5f61424f6143d2565b8054604051635ca4b5b160e11b8152600481018690526001600160a01b03858116602483015292935091169063b9496b62906044015f604051808303815f87803b15801561429b575f5ffd5b505af11580156126ae573d5f5f3e3d5ffd5b5f5f6142b76143ae565b8054925090505f6142c66143d2565b8054604051637d6e912360e11b81529192506001600160a01b03169063fadd2246906142f6908990600401614f53565b5f604051808303815f87803b15801561430d575f5ffd5b505af115801561431f573d5f5f3e3d5ffd5b5050506002820154604051633263b83b60e01b81526001600160a01b039091169150633263b83b90869061435b9087908b908b90600401614f65565b5f604051808303818588803b158015614372575f5ffd5b505af1158015614384573d5f5f3e3d5ffd5b505050505061439383876143f6565b8154825f6143a083614f96565b919050555050509392505050565b7f878245876662ba28a480c5ea71726db859fb50222b0a3d7cbbc21cfa336faf0090565b7f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e464970090565b5f6143ff6143ae565b5f8481526001820160205260409020549091501561443057604051633f06d22b60e01b815260040160405180910390fd5b5f838152600182016020908152604090912083516120d2928501905b828054828255905f5260205f20908101928215614485579160200282015b8281111561448557825182559160200191906001019061446a565b50613e949291506144a8565b5080545f8255905f5260205f209081019061132a91905b5b80821115613e94575f81556001016144a9565b60ff8116811461132a575f5ffd5b5f5f604083850312156144db575f5ffd5b82356144e6816144bc565b915060208301356144f6816144bc565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016008831061452957614529614501565b91905290565b6001600160a01b038116811461132a575f5ffd5b5f60208284031215614553575f5ffd5b81356137ec8161452f565b5f6020828403121561456e575f5ffd5b5035919050565b6001600160a01b0391909116815260200190565b5f8151808452602084019350602083015f5b828110156145c25781516001600160a01b031686526020958601959091019060010161459b565b5093949350505050565b5f8151808452602084019350602083015f5b828110156145c25781518652602095860195909101906001016145de565b60c081525f61460e60c0830189614589565b828103602084015261462081896145cc565b905082810360408401526146348188614589565b9050828103606084015261464881876145cc565b9050828103608084015261465c81866145cc565b905082810360a084015261467081856145cc565b9998505050505050505050565b5f5f83601f84011261468d575f5ffd5b5081356001600160401b038111156146a3575f5ffd5b602083019150836020828501011115610f2b575f5ffd5b5f5f602083850312156146cb575f5ffd5b82356001600160401b038111156146e0575f5ffd5b6146ec8582860161467d565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8215158152604060208201525f61415960408301846146f8565b602081525f613db76020830184614589565b803561ffff81168114614763575f5ffd5b919050565b5f5f60408385031215614779575f5ffd5b61478283614752565b915061479060208401614752565b90509250929050565b5f5f5f5f5f606086880312156147ad575f5ffd5b8535945060208601356001600160401b038111156147c9575f5ffd5b6147d58882890161467d565b90955093505060408601356001600160401b038111156147f3575f5ffd5b6147ff8882890161467d565b969995985093965092949392505050565b63ffffffff8116811461132a575f5ffd5b5f60208284031215614831575f5ffd5b81356137ec81614810565b5f6020828403121561484c575f5ffd5b815180151581146137ec575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215614880575f5ffd5b82356001600160e01b0319811681146144e6575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115613dba57613dba6148b4565b818382375f9101908152919050565b604051601f8201601f191681016001600160401b03811182821017156149125761491261485b565b604052919050565b5f6001600160401b038211156149325761493261485b565b5060051b60200190565b5f6020828403121561494c575f5ffd5b81356001600160401b03811115614961575f5ffd5b8201601f81018413614971575f5ffd5b803561498461497f8261491a565b6148ea565b8082825260208201915060208360051b8501019250868311156149a5575f5ffd5b6020840193505b828410156140d05783358252602093840193909101906149ac565b80820180821115613dba57613dba6148b4565b5f600160ff1b82016149ee576149ee6148b4565b505f0390565b634e487b7160e01b5f52603260045260245ffd5b5f61ffff821661ffff8103614a1f57614a1f6148b4565b60010192915050565b5f60ff821660ff8103614a1f57614a1f6148b4565b60ff8181168382160290811690818114614a5957614a596148b4565b5092915050565b61ffff8181168382160190811115613dba57613dba6148b4565b5f82601f830112614a89575f5ffd5b8151614a9761497f8261491a565b8082825260208201915060208360051b860101925085831115614ab8575f5ffd5b602085015b83811015614ade578051614ad08161452f565b835260209283019201614abd565b5095945050505050565b5f5f60408385031215614af9575f5ffd5b82516001600160401b03811115614b0e575f5ffd5b614b1a85828601614a7a565b602085015190935090506001600160401b03811115614b37575f5ffd5b8301601f81018513614b47575f5ffd5b8051614b5561497f8261491a565b8082825260208201915060208360051b850101925087831115614b76575f5ffd5b6020840193505b82841015614b98578351825260209384019390910190614b7d565b809450505050509250929050565b6001815b6001841115614be157808504811115614bc557614bc56148b4565b6001841615614bd357908102905b60019390931c928002614baa565b935093915050565b5f82614bf757506001613dba565b81614c0357505f613dba565b8160018114614c195760028114614c2357614c3f565b6001915050613dba565b60ff841115614c3457614c346148b4565b50506001821b613dba565b5060208310610133831016604e8410600b8410161715614c62575081810a613dba565b614c6e5f198484614ba6565b805f1904821115614c8157614c816148b4565b029392505050565b5f613db760ff841683614be9565b5f60208284031215614ca7575f5ffd5b81516137ec816144bc565b5f60208284031215614cc2575f5ffd5b5051919050565b838152602081018390526060810160048310614ce757614ce7614501565b826040830152949350505050565b5f5f60408385031215614d06575f5ffd5b82516001600160401b03811115614d1b575f5ffd5b614d2785828601614a7a565b602085015190935090506001600160401b03811115614d44575f5ffd5b8301601f81018513614d54575f5ffd5b8051614d6261497f8261491a565b8082825260208201915060208360051b850101925087831115614d83575f5ffd5b6020840193505b82841015614b98578351614d9d81614810565b825260209384019390910190614d8a565b604080825283519082018190525f9060208501906060840190835b81811015614e0257835180516001600160a01b0316845260209081015163ffffffff168185015290930192604090920191600101614dc9565b5050602093909301939093525092915050565b634e487b7160e01b5f52601260045260245ffd5b602081016002831061452957614529614501565b5f60208284031215614e4d575f5ffd5b81516001600160401b03811115614e62575f5ffd5b61415984828501614a7a565b60ff8281168282160390811115613dba57613dba6148b4565b8082028115828204841417613dba57613dba6148b4565b5f82614eb857634e487b7160e01b5f52601260045260245ffd5b500490565b5f83518060208601845e9190910191825250602001919050565b606081525f614ee960608301866145cc565b8281036020840152614efb81866146f8565b905082810360408401526140d081856146f8565b92835260208301919091526001600160f81b031916604082015260600190565b8281526040810160548310614f4657614f46614501565b8260208301529392505050565b602081525f613db760208301846145cc565b838152606060208201525f614f7d60608301856145cc565b905063ffffffff60e01b83166040830152949350505050565b5f60018201614fa757614fa76148b4565b506001019056fea2646970667358221220c9115c832e7f634401aad0a99380be798ebc957af383471ac3bc17c19073779164736f6c634300081c00339e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497019e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e4649700", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106101d5575f3560e01c8062bb07bb146101d9578063055ad42e146101ee5780630844697d1461021857806308af604d14610240578063132b1c921461026557806314b19c5a1461029b57806314b5d07f146102a957806325a760c2146102bc578063289a2f76146102d05780632b0088b4146102f05780632e2dc43e146102f957806336021ef4146103135780633a0dad8e146103275780634585e33b1461033a5780634ff0876a1461034d5780635488cd621461037257806358fac65b146103865780635dc228a0146103995780636e04ff0d146103ac5780636ff04153146103cd57806370604445146103e2578063715018a6146103f55780637158da7c146103fd57806379502c55146104105780637b103999146104235780637cdabf0a14610436578063800f9fad146104495780638da5cb5b146104525780638f5c94651461045a578063b8b2af7c14610463578063ba96ff1114610478578063be2683f01461048b578063c18e2a5c1461049e578063ca1f32f1146104a7578063d3f89f66146104b0578063da1f12ab146104be578063e2638ff1146104c6578063e2c4aaec146104ee578063eeb393c914610501578063f2fde38b14610514575b5f5ffd5b6101ec6101e73660046144ca565b610527565b005b60195461020290600160201b900460ff1681565b60405161020f9190614515565b60405180910390f35b60085461022d90600160b81b900461ffff1681565b60405161ffff909116815260200161020f565b6019546102539062010000900460ff1681565b60405160ff909116815260200161020f565b61028d610273366004614543565b6001600160a01b03165f9081526012602052604090205490565b60405190815260200161020f565b60195461022d9061ffff1681565b6101ec6102b7366004614543565b610621565b60085461025390600160a01b900460ff1681565b6102e36102de36600461455e565b61072a565b60405161020f9190614575565b61028d60075481565b610301610752565b60405161020f969594939291906145fc565b601954610253906301000000900460ff1681565b6004546102e3906001600160a01b031681565b6101ec6103483660046146ba565b6109ce565b60175461035d9063ffffffff1681565b60405163ffffffff909116815260200161020f565b60195461025390600160281b900460ff1681565b6102e361039436600461455e565b610b73565b6002546102e3906001600160a01b031681565b6103bf6103ba3660046146ba565b610b82565b60405161020f929190614726565b6103d5610f32565b60405161020f9190614740565b6101ec6103f036600461455e565b610fcc565b6101ec611033565b6008546102e3906001600160a01b031681565b6003546102e3906001600160a01b031681565b6005546102e3906001600160a01b031681565b6101ec610444366004614768565b611046565b61028d60095481565b6102e361114d565b61022d61271081565b60085461022d90600160a81b900461ffff1681565b61028d610486366004614543565b61115b565b6101ec610499366004614799565b6111b4565b61028d601e5481565b61028d60065481565b601d5461022d9061ffff1681565b61271161028d565b61028d6104d4366004614543565b6001600160a01b03165f9081526011602052604090205490565b6101ec6104fc36600461455e565b6112ba565b6101ec61050f366004614821565b61132d565b6101ec610522366004614543565b611414565b61052f611457565b60ff82161580610540575060ff8116155b1561055e576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d2919061483c565b6105ef576040516312aecd8160e01b815260040160405180910390fd5b6019805463ffff000019166201000060ff9485160263ff00000019161763010000009290931691909102919091179055565b610629611457565b6001600160a01b0381166106505760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c4919061483c565b6106e1576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b601c8181548110610739575f80fd5b5f918252602090912001546001600160a01b0316905081565b606080808080805f601954600160201b900460ff16600781111561077857610778614501565b14610796576040516312aecd8160e01b815260040160405180910390fd5b5f600a600b018054806020026020016040519081016040528092919081815260200182805480156107ee57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116107d0575b505050505090505f5f61080083611489565b915091508161ffff166001600160401b038111156108205761082061485b565b604051908082528060200260200182016040528015610849578160200160208202803683370190505b5098508161ffff166001600160401b038111156108685761086861485b565b604051908082528060200260200182016040528015610891578160200160208202803683370190505b5097508061ffff166001600160401b038111156108b0576108b061485b565b6040519080825280602002602001820160405280156108d9578160200160208202803683370190505b5096508061ffff166001600160401b038111156108f8576108f861485b565b604051908082528060200260200182016040528015610921578160200160208202803683370190505b5095508161ffff166001600160401b038111156109405761094061485b565b604051908082528060200260200182016040528015610969578160200160208202803683370190505b5094508061ffff166001600160401b038111156109885761098861485b565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5093506109c3838a8a888b8b8a61152a565b505050909192939495565b6109d661114d565b6001600160a01b0316336001600160a01b031614158015610a0257506002546001600160a01b03163314155b15610a205760405163ea8e4eb560e01b815260040160405180910390fd5b610a2861170d565b6005811015610a4a576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610a588385018561486f565b90925090506341659aab60e01b6001600160e01b0319831601610a8257610a7d611737565b610b64565b636ce38ed360e11b6001600160e01b0319831601610aa357610a7d81611927565b635954faa160e01b6001600160e01b0319831601610ac457610a7d816120d8565b63dbd33d3560e01b6001600160e01b0319831601610ae457610a7d6126b7565b6292a80f60e51b6001600160e01b0319831601610b0357610a7d612bb4565b6265e66b60e01b6001600160e01b0319831601610b2357610a7d81612eca565b63f4d3cc0960e01b6001600160e01b0319831601610b4457610a7d816133d3565b63c4b3cef760e01b6001600160e01b0319831601610b6457610b646134be565b5050610b6f60018055565b5050565b601b8181548110610739575f80fd5b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf9919061483c565b8015610c06575060185442115b15610c5857600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610c42929190614897565b6040516020818303038152906040529050610f2b565b6001601954600160201b900460ff166007811115610c7857610c78614501565b03610cc357600191507f2638e25a856cbfe28e0ae1857cb597cc2ceb873ce579b7d93c2258e45a754481601960059054906101000a900460ff16604051602001610c42929190614897565b6002601954600160201b900460ff166007811115610ce357610ce3614501565b03610d2e57600191507fa6ab055f7fc0612ad6e844f7e1dd3a6df793560cd68d707affa0dd01c39ec8f1601960059054906101000a900460ff16604051602001610c42929190614897565b6003601954600160201b900460ff166007811115610d4e57610d4e614501565b03610d8a57600191507f242cc2cba236b9c457bb86deb0ad1fb8fe60d5bcafd69d02041c9c62f3ea1fbd5f604051602001610c42929190614897565b6004601954600160201b900460ff166007811115610daa57610daa614501565b03610de657600191507fedaafe206508e00f40674bb87dda745bccfe8a3f3f6d6eaaf6db5f44021a1c135f604051602001610c42929190614897565b6005601954600160201b900460ff166007811115610e0657610e06614501565b03610e5157600191507fff9a199536c068c55c334e40ebfa355733f79152332d6586d615c5bb37fd5c17601960059054906101000a900460ff16604051602001610c42929190614897565b6006601954600160201b900460ff166007811115610e7157610e71614501565b03610ebc57600191507f0b2c33f7f9ce5cba78feb12c50c7fc97cbcfb655f151982783c0f2faf7567b0b601960059054906101000a900460ff16604051602001610c42929190614897565b6007601954600160201b900460ff166007811115610edc57610edc614501565b03610f1857600191507f3b4c310984a9fe486c05a56b52659c09d4bf9f3ef9b799ad52ee29a7d805741e5f604051602001610c42929190614897565b505060408051602081019091525f808252905b9250929050565b60605f601954600160201b900460ff166007811115610f5357610f53614501565b14610f71576040516312aecd8160e01b815260040160405180910390fd5b6015805460408051602080840282018101909252828152929190830182828015610fc257602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610fa4575b5050505050905090565b6004546001600160a01b03163314610ff75760405163ea8e4eb560e01b815260040160405180910390fd5b60095481111561101a57604051632ca2f52b60e11b815260040160405180910390fd5b8060095f82825461102b91906148c8565b909155505050565b61103b611457565b6110445f61368a565b565b61104e611457565b60328261ffff16118061106657506107d08161ffff16115b15611084576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f8919061483c565b611115576040516312aecd8160e01b815260040160405180910390fd5b6008805463ffffffff60a81b1916600160a81b61ffff9485160261ffff60b81b191617600160b81b9290931691909102919091179055565b5f546001600160a01b031690565b5f80601954600160201b900460ff16600781111561117b5761117b614501565b14611199576040516312aecd8160e01b815260040160405180910390fd5b506001600160a01b03165f908152600a602052604090205490565b6112268585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284375f920191909152506136d992505050565b604080515f6020820152016040516020818303038152906040528051906020012084846040516112579291906148db565b60405180910390200361127d576019805461ffff60201b1916600160221b1790556112b3565b6112898385018561493c565b805161129d91601f9160209091019061444c565b506019805461ffff60201b1916600360201b1790555b5050505050565b6004546001600160a01b031633146112e55760405163ea8e4eb560e01b815260040160405180910390fd5b5f8113156113095780601e5f8282546112fe91906149c7565b9091555061132a9050565b5f81121561132a5761131a816149da565b601e5f82825461102b91906148c8565b50565b611335611457565b8063ffffffff165f0361135b576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113cf919061483c565b6113ec576040516312aecd8160e01b815260040160405180910390fd5b6017805463ffffffff191663ffffffff831690811790915561140e90426149c7565b60185550565b61141c611457565b6001600160a01b03811661144e575f604051631e4fbdf760e01b81526004016114459190614575565b60405180910390fd5b61132a8161368a565b3361146061114d565b6001600160a01b031614611044573360405163118cdaa760e01b81526004016114459190614575565b80515f908190815b8161ffff168161ffff161015611523575f858261ffff16815181106114b8576114b86149f4565b6020908102919091018101516001600160a01b0381165f9081526013909252604090912054909150156114f1576114ee85614a08565b94505b6001600160a01b0381165f908152601460205260409020541561151a5761151784614a08565b93505b50600101611491565b5050915091565b86515f80805b8361ffff168161ffff161015611700575f8b8261ffff1681518110611557576115576149f4565b6020908102919091018101516001600160a01b0381165f908152601383526040808220546014909452902054909250811561163c57828d8761ffff16815181106115a3576115a36149f4565b60200260200101906001600160a01b031690816001600160a01b031681525050818c8761ffff16815181106115da576115da6149f4565b6020908102919091018101919091526001600160a01b0384165f908152600a909152604090205460065461160f918491613742565b8b8761ffff1681518110611625576116256149f4565b602090810291909101015261163986614a08565b95505b80156116f257828a8661ffff1681518110611659576116596149f4565b60200260200101906001600160a01b031690816001600160a01b03168152505080898661ffff1681518110611690576116906149f4565b6020908102919091018101919091526001600160a01b0384165f908152600a90915260409020546006546116c5918391613742565b888661ffff16815181106116db576116db6149f4565b60209081029190910101526116ef85614a08565b94505b505050806001019050611530565b5050505050505050505050565b60026001540361173057604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b601854421115806117b9575060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611793573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b7919061483c565b155b156117d75760405163085de62560e01b815260040160405180910390fd5b5f5b60155461ffff821610156118ac575f600a600b018261ffff1681548110611802576118026149f4565b5f9182526020808320909101546001600160a01b03168252600a81526040808320839055600b8252808320839055600d82528083208390556011825280832083905560128252808320839055600f8252808320839055601382528083208390556014825280832083905560168252808320805460ff19169055601a54600c8352818420819055600e8352818420819055601090925290912055506118a581614a08565b90506117d9565b506118b860155f614491565b6118c3601f5f614491565b6118cb6137f3565b6118d3613a4c565b601c54601d805461ffff191661ffff8316179055601b545f916118f691906149c7565b11156110445760175461190f9063ffffffff16426149c7565b6018556019805460ff60201b1916600160201b179055565b6001601954600160201b900460ff16600781111561194757611947614501565b146119655760405163baf3f0f760e01b815260040160405180910390fd5b6019805460059061197f90600160281b900460ff16614a28565b91906101000a81548160ff021916908360ff1602179055505f601960029054906101000a900460ff16826119b39190614a3d565b60195460ff91821692505f916119d0916201000090041683614a60565b601b5490915061ffff821611806119ec5750601b5461ffff8216145b15611a0a5750601b546019805461ffff60201b1916600160211b1790555b815b8161ffff168161ffff1610156120d2575f601b8261ffff1681548110611a3457611a346149f4565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa158015611a8e573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ab59190810190614ae8565b90925090505f805b83518161ffff161015611da1575f848261ffff1681518110611ae157611ae16149f4565b602002602001015190505f848361ffff1681518110611b0257611b026149f4565b6020026020010151905080600a6001015f846001600160a01b03166001600160a01b031681526020019081526020015f205f828254611b4191906149c7565b90915550506001600160a01b0382165f9081526016602052604090205460ff16611cc5576008546001600160a01b0390811690831603611c3d57600854611c2090611b9790600160a01b900460ff16600a614c89565b600860149054906101000a900460ff1660035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bf7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1b9190614c97565b613c9a565b6001600160a01b0383165f908152600a6020526040902055611cc5565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e0990611c6d908590600401614575565b602060405180830381865afa158015611c88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cac9190614cb2565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a6020526040812054600654909190611d7590611cf49084908690613742565b600354604051633c2e3e7b60e11b81526001600160a01b039091169063785c7cf690611d24908990600401614575565b602060405180830381865afa158015611d3f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d639190614c97565b600854600160a01b900460ff16613c9a565b9050611d8181876149c7565b9550611d8c84613d04565b5050505080611d9a90614a08565b9050611abd565b506008545f90611dbf90600160a81b900461ffff1683612710613742565b601754909150611de090829063ffffffff908116906301e133809061374216565b90508060095f828254611df391906149c7565b90915550611e03905081836148c8565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0387169063e51a85f690602401602060405180830381865afa158015611e4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6f9190614cb2565b9050611e7b81846148c8565b6008549093505f90611e9b90600160b81b900461ffff1683612710613742565b90508060095f828254611eae91906149c7565b90915550611ebe905081836148c8565b601954604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03881690630df571f7906044015f604051808303815f87803b158015611f0e575f5ffd5b505af1158015611f20573d5f5f3e3d5ffd5b505050505f876001600160a01b031663a68a5267896001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f70573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f949190614cb2565b875f6040518463ffffffff1660e01b8152600401611fb493929190614cc9565b602060405180830381865afa158015611fcf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff39190614cb2565b6001600160a01b0389165f908152601160205260409020869055905061201981866148c8565b94505f886001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612058573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061207c9190614cb2565b6001600160a01b038a165f90815260126020526040902087905590506120a281876149c7565b6001600160a01b039099165f908152600d6020526040902098909855505060019096019550611a0c945050505050565b50505050565b6002601954600160201b900460ff1660078111156120f8576120f8614501565b146121165760405163baf3f0f760e01b815260040160405180910390fd5b6019805460059061213090600160281b900460ff16614a28565b82546101009290920a60ff818102199093169183160217909155601c5460195490915f916121679163010000009091041684614a3d565b60195460ff91821692505f9161218591630100000090041683614a60565b90508261ffff168161ffff1611806121a457508261ffff168161ffff16145b156121ac5750815b815b8161ffff168161ffff1610156124f8575f601c8261ffff16815481106121d6576121d66149f4565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa158015612230573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122579190810190614ae8565b601a5491935091505f5b83518161ffff1610156124d1575f848261ffff1681518110612285576122856149f4565b602002602001015190505f848361ffff16815181106122a6576122a66149f4565b602002602001015190506122e0600a6002015f846001600160a01b03166001600160a01b031681526020019081526020015f205482613d89565b6001600160a01b0383165f908152600c602090815260408083209390935560169052205460ff166123e2576008546001600160a01b039081169083160361235a5760085461233d90611b9790600160a01b900460ff16600a614c89565b6001600160a01b0383165f908152600a60205260409020556123e2565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e099061238a908590600401614575565b602060405180830381865afa1580156123a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123c99190614cb2565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120549061241861241061240a84613dc0565b85613dd5565b600654613e03565b600354604051633c2e3e7b60e11b81529192505f916124a49184916001600160a01b039091169063785c7cf690612453908a90600401614575565b602060405180830381865afa15801561246e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124929190614c97565b600854600160a01b900460ff16613e28565b90506124b08782613d89565b96506124bb85613d04565b5050505050806124ca90614a08565b9050612261565b506001600160a01b039093165f908152600e602052604090209290925550506001016121ae565b508261ffff168161ffff16036120d2578261ffff165f0361252c576019805461ffff60201b1916600160221b1790556120d2565b6015545f61253a8286614a60565b61ffff166001600160401b038111156125555761255561485b565b60405190808252806020026020018201604052801561257e578160200160208202803683370190505b5090505f5b8561ffff168161ffff161015612608575f601c8261ffff16815481106125ab576125ab6149f4565b5f9182526020808320909101546001600160a01b0316808352600e9091526040909120549091506125db81613e89565b5080848461ffff16815181106125f3576125f36149f4565b60209081029190910101525050600101612583565b505f5b8261ffff168161ffff16101561269c575f600a600b018261ffff1681548110612636576126366149f4565b5f9182526020808320909101546001600160a01b0316808352600c90915260409091205490915061266681613e89565b508084612673858b614a60565b61ffff1681518110612687576126876149f4565b6020908102919091010152505060010161260b565b506126ae81630be2683f60e41b613e98565b50505050505050565b6003601954600160201b900460ff1660078111156126d7576126d7614501565b146126f55760405163baf3f0f760e01b815260040160405180910390fd5b601c546015545f5b8261ffff168161ffff161015612aef575f601c8261ffff1681548110612725576127256149f4565b5f918252602091829020015460408051631b9d6fc560e31b815290516001600160a01b039092169350839263dceb7e28926004808401938290030181865afa158015612773573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612797919061483c565b6127a15750612ae7565b5f601f8361ffff16815481106127b9576127b96149f4565b5f9182526020822001546008549092506127e190600160a81b900461ffff1683612710613742565b60175490915061280290829063ffffffff908116906301e133809061374216565b90508060095f82825461281591906149c7565b90915550612825905081836148c8565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0385169063e51a85f690602401602060405180830381865afa15801561286d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128919190614cb2565b905061289d81846148c8565b6008549093505f906128bd90600160b81b900461ffff1683612710613742565b90508060095f8282546128d091906149c7565b909155506128e0905081836148c8565b601954604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03861690630df571f7906044015f604051808303815f87803b158015612930575f5ffd5b505af1158015612942573d5f5f3e3d5ffd5b505050505f856001600160a01b031663a68a5267876001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612992573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129b69190614cb2565b875f6040518463ffffffff1660e01b81526004016129d693929190614cc9565b602060405180830381865afa1580156129f1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a159190614cb2565b6001600160a01b0387165f9081526011602052604090208690559050612a3b81866148c8565b94505f866001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a7a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9e9190614cb2565b6001600160a01b0388165f9081526012602052604090208790559050612ac481876149c7565b6001600160a01b039097165f908152600d60205260409020969096555050505050505b6001016126fd565b505f5b8161ffff168161ffff161015612b9b575f600a600b018261ffff1681548110612b1d57612b1d6149f4565b5f9182526020822001546001600160a01b03169150601f612b3e8487614a60565b61ffff1681548110612b5257612b526149f4565b5f9182526020808320909101546001600160a01b0385168352600b90915260408220805491935083929091612b889084906149c7565b909155505060019092019150612af29050565b50506019805461ffff60201b1916600160221b17905550565b6004601954600160201b900460ff166007811115612bd457612bd4614501565b14612bf25760405163baf3f0f760e01b815260040160405180910390fd5b6019805460ff60201b1916600560201b179055601b54601c545f805b8361ffff168161ffff161015612c72575f601b8261ffff1681548110612c3657612c366149f4565b5f9182526020808320909101546001600160a01b0316808352600d909152604090912054909150612c6790846149c7565b925050600101612c0e565b505f5b8261ffff168161ffff161015612cd9575f601c8261ffff1681548110612c9d57612c9d6149f4565b5f9182526020808320909101546001600160a01b0316808352600d909152604090912054909150612cce90846149c7565b925050600101612c75565b50600480546040805163dab26e3b60e01b815290515f93612d50936001600160a01b03169263dab26e3b92818301926020928290030181865afa158015612d22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d469190614cb2565b8390612710613742565b905080601e541115612d625750505050565b5f601e5482612d7191906148c8565b90505f5b8561ffff168161ffff161015612e0f575f601b8261ffff1681548110612d9d57612d9d6149f4565b5f9182526020808320909101546001600160a01b0316808352600d909152604082205490925090612dcf858389613742565b6001600160a01b0384165f908152600d6020526040812080549293508392909190612dfb9084906148c8565b909155505060019093019250612d75915050565b505f5b8461ffff168161ffff161015612eac575f601c8261ffff1681548110612e3a57612e3a6149f4565b5f9182526020808320909101546001600160a01b0316808352600d909152604082205490925090612e6c858389613742565b6001600160a01b0384165f908152600d6020526040812080549293508392909190612e989084906148c8565b909155505060019093019250612e12915050565b5080601e5f828254612ebe91906149c7565b90915550505050505050565b6005601954600160201b900460ff166007811115612eea57612eea614501565b14612f085760405163baf3f0f760e01b815260040160405180910390fd5b60198054600590612f2290600160281b900460ff16614a28565b91906101000a81548160ff021916908360ff1602179055505f601960029054906101000a900460ff1682612f569190614a3d565b60195460ff91821692505f91612f73916201000090041683614a60565b601b5490915061ffff82161180612f8f5750601b5461ffff8216145b15612fad5750601b546019805461ffff60201b1916600360211b1790555b815b8161ffff168161ffff1610156120d2575f601b8261ffff1681548110612fd757612fd76149f4565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa158015613031573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526130589190810190614cf5565b6001600160a01b0385165f908152600d6020526040812054835193955091935090916001600160401b038111156130915761309161485b565b6040519080825280602002602001820160405280156130d557816020015b604080518082019091525f80825260208201528152602001906001900390816130af5790505b5090505f5b84518161ffff161015613367575f858261ffff16815181106130fe576130fe6149f4565b602002602001015190505f858361ffff168151811061311f5761311f6149f4565b6020908102919091018101516001600160a01b0384165f908152601690925260409091205490915060ff16613225576008546001600160a01b039081169083160361319d5760085461318090611b9790600160a01b900460ff16600a614c89565b6001600160a01b0383165f908152600a6020526040902055613225565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e09906131cd908590600401614575565b602060405180830381865afa1580156131e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061320c9190614cb2565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120546006546007549192916132c79161326d918590613266908c9063ffffffff808b16919061374216565b9190613742565b600854600354604051633c2e3e7b60e11b8152600160a01b90920460ff16916001600160a01b039091169063785c7cf6906132ac908a90600401614575565b602060405180830381865afa158015611bf7573d5f5f3e3d5ffd5b90506040518060400160405280856001600160a01b031681526020018263ffffffff16815250868661ffff1681518110613303576133036149f4565b602002602001018190525080600a6005015f866001600160a01b03166001600160a01b031681526020019081526020015f205f82825461334391906149c7565b90915550613352905084613d04565b505050508061336090614a08565b90506130da565b50604051630415112560e21b81526001600160a01b038616906310544494906133969084908690600401614dae565b5f604051808303815f87803b1580156133ad575f5ffd5b505af11580156133bf573d5f5f3e3d5ffd5b505050505050505050806001019050612faf565b6006601954600160201b900460ff1660078111156133f3576133f3614501565b146134115760405163baf3f0f760e01b815260040160405180910390fd5b6019805460059061342b90600160281b900460ff16614a28565b82546101009290920a60ff818102199093169183160217909155601c5460195490915f916134629163010000009091041684614a3d565b60195460ff91821692505f9161348091630100000090041683614a60565b90508261ffff168161ffff16118061349f57508261ffff168161ffff16145b156120d25750506019805461ffff60201b1916600760201b1790555050565b6007601954600160201b900460ff1660078111156134de576134de614501565b146134fc5760405163baf3f0f760e01b815260040160405180910390fd5b5f600a600b0180548060200260200160405190810160405280929190818152602001828054801561355457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613536575b505083519394505f925050505b8161ffff168161ffff16101561361f575f838261ffff1681518110613588576135886149f4565b6020908102919091018101516001600160a01b0381165f908152600b8352604080822054600f909452902054909250808211156135e6576135c981836148c8565b6001600160a01b0384165f90815260136020526040902055613611565b81811115613611576135f882826148c8565b6001600160a01b0384165f908152601460205260409020555b505050806001019050613561565b506019805460ff60201b19811682555f9061363d9061ffff16614a08565b82546101009290920a61ffff8181021990931691831602179091556019546040519116907f0bc12479581640d161e016cef21aa834cb6d6326bbc0d8445e58d56403adf2dc905f90a25050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6136e384613ea4565b90505f6136f1828585613f40565b9050806137115760405163cf6c44e960e01b815260040160405180910390fd5b60405185907f1af0453083661051f6e56e5c070792320652e612154bf9af8637bb1e7655b99d905f90a25050505050565b5f5f5f61374f868661400d565b91509150815f036137735783818161376957613769614e15565b04925050506137ec565b81841161378a5761378a6003851502601118614029565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150505b9392505050565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890613823908490600401614e29565b5f60405180830381865afa15801561383d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526138649190810190614e3d565b9050613871601b5f614491565b5f5b81518161ffff161015610b6f575f828261ffff1681518110613897576138976149f4565b60200260200101519050806001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138dd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139019190614cb2565b15801561396b5750806001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613945573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139699190614cb2565b155b156139765750613a3c565b5f816001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156139b2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526139d99190810190614cf5565b50905080515f036139eb575050613a3c565b50601b80546001810182555f919091527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10180546001600160a01b0319166001600160a01b03929092169190911790555b613a4581614a08565b9050613873565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890613a7d90600190600401614e29565b5f60405180830381865afa158015613a97573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613abe9190810190614e3d565b9050613acb601c5f614491565b5f5b81518161ffff161015610b6f575f828261ffff1681518110613af157613af16149f4565b60200260200101519050806001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b37573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b5b9190614cb2565b158015613bc55750806001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bc39190614cb2565b155b15613bd05750613c8a565b806001600160a01b031663dceb7e286040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c30919061483c565b613c3a5750613c8a565b601c80546001810182555f919091527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319166001600160a01b03929092169190911790555b613c9381614a08565b9050613acd565b5f8260ff168260ff161115613ccf57613cb38383614e6e565b613cbe90600a614c89565b613cc89085614e87565b90506137ec565b8260ff168260ff161015613cfc57613ce78284614e6e565b613cf290600a614c89565b613cc89085614e9e565b509192915050565b6001600160a01b0381165f9081526016602052604090205460ff1661132a576015805460018181019092557f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0384166001600160a01b031990911681179091555f908152601660205260409020805460ff1916909117905550565b5f82613d9b57613d985f613dc0565b92505b81613dac57613da95f613dc0565b91505b613db783835f61403a565b90505b92915050565b5f613dba826001600160801b031660066140da565b5f82613de757613de45f613dc0565b92505b81613df857613df55f613dc0565b91505b613db783835f614161565b5f82613e1557613e125f613dc0565b92505b613db7836001600160801b0384166141b7565b5f8260ff168260ff161115613e5d57613cc884613e58613e488686614e6e565b613e5390600a614c89565b613dc0565b613dd5565b8260ff168260ff161015613cfc57613cc884613e798486614e6e565b613e8490600a614c89565b613e03565b5f613e948230614246565b5090565b5f613db783835f6142ad565b60605f613eaf6143ae565b5f84815260018201602052604081205491925003613ee05760405163d66ca67560e01b815260040160405180910390fd5b5f83815260018201602090815260409182902080548351818402810184019094528084529091830182828015613f3357602002820191905f5260205f20905b815481526020019060010190808311613f1f575b5050505050915050919050565b5f5f83516020613f5091906149c7565b613f5b9060206149c7565b90505f8482604051602001613f71929190614ebd565b60405160208183030381529060405290505f613f8b6143d2565b60038101546040516378542ead60e01b81529192506001600160a01b0316906378542ead90613fc2908a9086908a90600401614ed7565b6020604051808303815f875af1158015613fde573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614002919061483c565b979650505050505050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f821561404d5750600160f81b614050565b505f5b5f6140596143d2565b600181015460405163022f65e760e31b81529192506001600160a01b03169063117b2f389061409090899089908790600401614f0f565b6020604051808303815f875af11580156140ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d09190614cb2565b9695505050505050565b5f5f6140e46143d2565b6001810154604051639cd07acb60e01b81529192506001600160a01b031690639cd07acb906141199087908790600401614f2f565b6020604051808303815f875af1158015614135573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141599190614cb2565b949350505050565b5f5f82156141745750600160f81b614177565b505f5b5f6141806143d2565b6001810154604051630afe14ad60e31b81529192506001600160a01b0316906357f0a5689061409090899089908790600401614f0f565b5f600160f81b816141c66143d2565b6001810154604051635a53accb60e01b81529192506001600160a01b031690635a53accb906141fd90889088908790600401614f0f565b6020604051808303815f875af1158015614219573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061423d9190614cb2565b95945050505050565b5f61424f6143d2565b8054604051635ca4b5b160e11b8152600481018690526001600160a01b03858116602483015292935091169063b9496b62906044015f604051808303815f87803b15801561429b575f5ffd5b505af11580156126ae573d5f5f3e3d5ffd5b5f5f6142b76143ae565b8054925090505f6142c66143d2565b8054604051637d6e912360e11b81529192506001600160a01b03169063fadd2246906142f6908990600401614f53565b5f604051808303815f87803b15801561430d575f5ffd5b505af115801561431f573d5f5f3e3d5ffd5b5050506002820154604051633263b83b60e01b81526001600160a01b039091169150633263b83b90869061435b9087908b908b90600401614f65565b5f604051808303818588803b158015614372575f5ffd5b505af1158015614384573d5f5f3e3d5ffd5b505050505061439383876143f6565b8154825f6143a083614f96565b919050555050509392505050565b7f878245876662ba28a480c5ea71726db859fb50222b0a3d7cbbc21cfa336faf0090565b7f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e464970090565b5f6143ff6143ae565b5f8481526001820160205260409020549091501561443057604051633f06d22b60e01b815260040160405180910390fd5b5f838152600182016020908152604090912083516120d2928501905b828054828255905f5260205f20908101928215614485579160200282015b8281111561448557825182559160200191906001019061446a565b50613e949291506144a8565b5080545f8255905f5260205f209081019061132a91905b5b80821115613e94575f81556001016144a9565b60ff8116811461132a575f5ffd5b5f5f604083850312156144db575f5ffd5b82356144e6816144bc565b915060208301356144f6816144bc565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016008831061452957614529614501565b91905290565b6001600160a01b038116811461132a575f5ffd5b5f60208284031215614553575f5ffd5b81356137ec8161452f565b5f6020828403121561456e575f5ffd5b5035919050565b6001600160a01b0391909116815260200190565b5f8151808452602084019350602083015f5b828110156145c25781516001600160a01b031686526020958601959091019060010161459b565b5093949350505050565b5f8151808452602084019350602083015f5b828110156145c25781518652602095860195909101906001016145de565b60c081525f61460e60c0830189614589565b828103602084015261462081896145cc565b905082810360408401526146348188614589565b9050828103606084015261464881876145cc565b9050828103608084015261465c81866145cc565b905082810360a084015261467081856145cc565b9998505050505050505050565b5f5f83601f84011261468d575f5ffd5b5081356001600160401b038111156146a3575f5ffd5b602083019150836020828501011115610f2b575f5ffd5b5f5f602083850312156146cb575f5ffd5b82356001600160401b038111156146e0575f5ffd5b6146ec8582860161467d565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b8215158152604060208201525f61415960408301846146f8565b602081525f613db76020830184614589565b803561ffff81168114614763575f5ffd5b919050565b5f5f60408385031215614779575f5ffd5b61478283614752565b915061479060208401614752565b90509250929050565b5f5f5f5f5f606086880312156147ad575f5ffd5b8535945060208601356001600160401b038111156147c9575f5ffd5b6147d58882890161467d565b90955093505060408601356001600160401b038111156147f3575f5ffd5b6147ff8882890161467d565b969995985093965092949392505050565b63ffffffff8116811461132a575f5ffd5b5f60208284031215614831575f5ffd5b81356137ec81614810565b5f6020828403121561484c575f5ffd5b815180151581146137ec575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215614880575f5ffd5b82356001600160e01b0319811681146144e6575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115613dba57613dba6148b4565b818382375f9101908152919050565b604051601f8201601f191681016001600160401b03811182821017156149125761491261485b565b604052919050565b5f6001600160401b038211156149325761493261485b565b5060051b60200190565b5f6020828403121561494c575f5ffd5b81356001600160401b03811115614961575f5ffd5b8201601f81018413614971575f5ffd5b803561498461497f8261491a565b6148ea565b8082825260208201915060208360051b8501019250868311156149a5575f5ffd5b6020840193505b828410156140d05783358252602093840193909101906149ac565b80820180821115613dba57613dba6148b4565b5f600160ff1b82016149ee576149ee6148b4565b505f0390565b634e487b7160e01b5f52603260045260245ffd5b5f61ffff821661ffff8103614a1f57614a1f6148b4565b60010192915050565b5f60ff821660ff8103614a1f57614a1f6148b4565b60ff8181168382160290811690818114614a5957614a596148b4565b5092915050565b61ffff8181168382160190811115613dba57613dba6148b4565b5f82601f830112614a89575f5ffd5b8151614a9761497f8261491a565b8082825260208201915060208360051b860101925085831115614ab8575f5ffd5b602085015b83811015614ade578051614ad08161452f565b835260209283019201614abd565b5095945050505050565b5f5f60408385031215614af9575f5ffd5b82516001600160401b03811115614b0e575f5ffd5b614b1a85828601614a7a565b602085015190935090506001600160401b03811115614b37575f5ffd5b8301601f81018513614b47575f5ffd5b8051614b5561497f8261491a565b8082825260208201915060208360051b850101925087831115614b76575f5ffd5b6020840193505b82841015614b98578351825260209384019390910190614b7d565b809450505050509250929050565b6001815b6001841115614be157808504811115614bc557614bc56148b4565b6001841615614bd357908102905b60019390931c928002614baa565b935093915050565b5f82614bf757506001613dba565b81614c0357505f613dba565b8160018114614c195760028114614c2357614c3f565b6001915050613dba565b60ff841115614c3457614c346148b4565b50506001821b613dba565b5060208310610133831016604e8410600b8410161715614c62575081810a613dba565b614c6e5f198484614ba6565b805f1904821115614c8157614c816148b4565b029392505050565b5f613db760ff841683614be9565b5f60208284031215614ca7575f5ffd5b81516137ec816144bc565b5f60208284031215614cc2575f5ffd5b5051919050565b838152602081018390526060810160048310614ce757614ce7614501565b826040830152949350505050565b5f5f60408385031215614d06575f5ffd5b82516001600160401b03811115614d1b575f5ffd5b614d2785828601614a7a565b602085015190935090506001600160401b03811115614d44575f5ffd5b8301601f81018513614d54575f5ffd5b8051614d6261497f8261491a565b8082825260208201915060208360051b850101925087831115614d83575f5ffd5b6020840193505b82841015614b98578351614d9d81614810565b825260209384019390910190614d8a565b604080825283519082018190525f9060208501906060840190835b81811015614e0257835180516001600160a01b0316845260209081015163ffffffff168185015290930192604090920191600101614dc9565b5050602093909301939093525092915050565b634e487b7160e01b5f52601260045260245ffd5b602081016002831061452957614529614501565b5f60208284031215614e4d575f5ffd5b81516001600160401b03811115614e62575f5ffd5b61415984828501614a7a565b60ff8281168282160390811115613dba57613dba6148b4565b8082028115828204841417613dba57613dba6148b4565b5f82614eb857634e487b7160e01b5f52601260045260245ffd5b500490565b5f83518060208601845e9190910191825250602001919050565b606081525f614ee960608301866145cc565b8281036020840152614efb81866146f8565b905082810360408401526140d081856146f8565b92835260208301919091526001600160f81b031916604082015260600190565b8281526040810160548310614f4657614f46614501565b8260208301529392505050565b602081525f613db760208301846145cc565b838152606060208201525f614f7d60608301856145cc565b905063ffffffff60e01b83166040830152949350505050565b5f60018201614fa757614fa76148b4565b506001019056fea2646970667358221220c9115c832e7f634401aad0a99380be798ebc957af383471ac3bc17c19073779164736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b50604051613a42380380613a4283398101604081905261002e916104b6565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610450565b50600180556001600160a01b0382166100915760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b85760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0384169081179091556040805163015df99360e01b8152905163015df993916004808201926020929091908290030181865afa15801561010f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101339190610500565b600580546001600160a01b0319166001600160a01b039283161790556003546040805163d1717c7d60e01b81529051919092169163d1717c7d9160048083019260209291908290030181865afa15801561018f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101b39190610522565b6101be90600a61063b565b60075560035460408051631c56369f60e21b815290516001600160a01b0390921691637158da7c916004808201926020929091908290030181865afa158015610209573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061022d9190610500565b600880546001600160a01b0319166001600160a01b03928316908117909155600354604051633c2e3e7b60e11b815260048101929092529091169063785c7cf690602401602060405180830381865afa15801561028c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b09190610522565b600860146101000a81548160ff021916908360ff16021790555060035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033e9190610522565b61034990600a61063b565b6006556016805462ff0000191662010000179055600280546001600160a01b038084166001600160a01b03199092169190911790915560035460408051631d06d6c760e11b815290519190921691633a0dad8e9160048281019260209291908290030181865afa1580156103bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e39190610500565b600480546001600160a01b0319166001600160a01b0392909216919091179055601480546201518063ffffffff1990911681179091556104239042610649565b60155550506016805464ffff00ffff19169055506008805463ffffffff60a81b191690555f60185561065c565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146104b3575f5ffd5b50565b5f5f5f606084860312156104c8575f5ffd5b83516104d38161049f565b60208501519093506104e48161049f565b60408501519092506104f58161049f565b809150509250925092565b5f60208284031215610510575f5ffd5b815161051b8161049f565b9392505050565b5f60208284031215610532575f5ffd5b815160ff8116811461051b575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156105915780850481111561057557610575610542565b600184161561058357908102905b60019390931c92800261055a565b935093915050565b5f826105a757506001610635565b816105b357505f610635565b81600181146105c957600281146105d3576105ef565b6001915050610635565b60ff8411156105e4576105e4610542565b50506001821b610635565b5060208310610133831016604e8410600b8410161715610612575081810a610635565b61061e5f198484610556565b805f190482111561063157610631610542565b0290505b92915050565b5f61051b60ff841683610599565b8082018082111561063557610635610542565b6133d9806106695f395ff3fe608060405234801561000f575f5ffd5b506004361061019f575f3560e01c8063055ad42e146101a35780630844697d146101cd57806308af604d146101f5578063132b1c921461021a57806314b19c5a1461025057806314b5d07f1461025e57806325a760c2146102735780632b0088b4146102875780632e2dc43e146102905780633a0dad8e146102aa5780634585e33b146102ca5780634ff0876a146102dd5780635488cd621461030257806358fac65b146103165780635dc228a0146103295780636e04ff0d1461033c5780636ff041531461035d5780637060444514610372578063715018a6146103855780637158da7c1461038d57806379502c55146103a05780637b103999146103b35780637cdabf0a146103c6578063800f9fad146103d95780638da5cb5b146103e25780638f5c9465146103ea578063b8b2af7c146103f3578063ba96ff1114610408578063c18e2a5c1461041b578063ca1f32f114610424578063e2638ff11461042d578063e2c4aaec14610455578063e6c3efd914610468578063eeb393c91461047b578063f2fde38b1461048e575b5f5ffd5b6016546101b7906301000000900460ff1681565b6040516101c49190612ace565b60405180910390f35b6008546101e290600160b81b900461ffff1681565b60405161ffff90911681526020016101c4565b6016546102089062010000900460ff1681565b60405160ff90911681526020016101c4565b610242610228366004612afc565b6001600160a01b03165f908152600f602052604090205490565b6040519081526020016101c4565b6016546101e29061ffff1681565b61027161026c366004612afc565b6104a1565b005b60085461020890600160a01b900460ff1681565b61024260075481565b6102986105aa565b6040516101c496959493929190612b8a565b6004546102bd906001600160a01b031681565b6040516101c49190612c0b565b6102716102d8366004612c1f565b610826565b6014546102ed9063ffffffff1681565b60405163ffffffff90911681526020016101c4565b60165461020890600160201b900460ff1681565b6102bd610324366004612c8b565b610969565b6002546102bd906001600160a01b031681565b61034f61034a366004612c1f565b610991565b6040516101c4929190612ca2565b610365610c0f565b6040516101c49190612ce0565b610271610380366004612c8b565b610ca9565b610271610d10565b6008546102bd906001600160a01b031681565b6003546102bd906001600160a01b031681565b6005546102bd906001600160a01b031681565b6102716103d4366004612d08565b610d23565b61024260095481565b6102bd610e2a565b6101e261271081565b6008546101e290600160a81b900461ffff1681565b610242610416366004612afc565b610e38565b61024260185481565b61024260065481565b61024261043b366004612afc565b6001600160a01b03165f908152600e602052604090205490565b610271610463366004612c8b565b610e91565b610271610476366004612d47565b610f04565b610271610489366004612d73565b610fde565b61027161049c366004612afc565b6110c5565b6104a9611108565b6001600160a01b0381166104d05760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610520573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105449190612d8e565b610561576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b606080808080805f6016546301000000900460ff1660048111156105d0576105d0612aba565b146105ee576040516312aecd8160e01b815260040160405180910390fd5b5f600a60080180548060200260200160405190810160405280929190818152602001828054801561064657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610628575b505050505090505f5f6106588361113a565b915091508161ffff166001600160401b0381111561067857610678612dad565b6040519080825280602002602001820160405280156106a1578160200160208202803683370190505b5098508161ffff166001600160401b038111156106c0576106c0612dad565b6040519080825280602002602001820160405280156106e9578160200160208202803683370190505b5097508061ffff166001600160401b0381111561070857610708612dad565b604051908082528060200260200182016040528015610731578160200160208202803683370190505b5096508061ffff166001600160401b0381111561075057610750612dad565b604051908082528060200260200182016040528015610779578160200160208202803683370190505b5095508161ffff166001600160401b0381111561079857610798612dad565b6040519080825280602002602001820160405280156107c1578160200160208202803683370190505b5094508061ffff166001600160401b038111156107e0576107e0612dad565b604051908082528060200260200182016040528015610809578160200160208202803683370190505b50935061081b838a8a888b8b8a6111db565b505050909192939495565b61082e610e2a565b6001600160a01b0316336001600160a01b03161415801561085a57506002546001600160a01b03163314155b156108785760405163ea8e4eb560e01b815260040160405180910390fd5b6108806113be565b60058110156108a2576040516317dbc4cb60e21b815260040160405180910390fd5b5f806108b083850185612dc1565b90925090506341659aab60e01b6001600160e01b03198316016108da576108d56113e8565b61095a565b636ce38ed360e11b6001600160e01b03198316016108fb576108d581611584565b6292a80f60e51b6001600160e01b031983160161091a576108d5611d35565b6265e66b60e01b6001600160e01b031983160161093a576108d581611f42565b63c4b3cef760e01b6001600160e01b031983160161095a5761095a61244b565b505061096560018055565b5050565b60178181548110610978575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a089190612d8e565b8015610a15575060155442115b15610a6757600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610a51929190612e04565b6040516020818303038152906040529050610c08565b60016016546301000000900460ff166004811115610a8757610a87612aba565b03610ad257600191507f2638e25a856cbfe28e0ae1857cb597cc2ceb873ce579b7d93c2258e45a754481601660049054906101000a900460ff16604051602001610a51929190612e04565b60026016546301000000900460ff166004811115610af257610af2612aba565b03610b2e57600191507fedaafe206508e00f40674bb87dda745bccfe8a3f3f6d6eaaf6db5f44021a1c135f604051602001610a51929190612e04565b60036016546301000000900460ff166004811115610b4e57610b4e612aba565b03610b9957600191507fff9a199536c068c55c334e40ebfa355733f79152332d6586d615c5bb37fd5c17601660049054906101000a900460ff16604051602001610a51929190612e04565b60046016546301000000900460ff166004811115610bb957610bb9612aba565b03610bf557600191507f3b4c310984a9fe486c05a56b52659c09d4bf9f3ef9b799ad52ee29a7d805741e5f604051602001610a51929190612e04565b505060408051602081019091525f808252905b9250929050565b60605f6016546301000000900460ff166004811115610c3057610c30612aba565b14610c4e576040516312aecd8160e01b815260040160405180910390fd5b6012805460408051602080840282018101909252828152929190830182828015610c9f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610c81575b5050505050905090565b6004546001600160a01b03163314610cd45760405163ea8e4eb560e01b815260040160405180910390fd5b600954811115610cf757604051632ca2f52b60e11b815260040160405180910390fd5b8060095f828254610d089190612e35565b909155505050565b610d18611108565b610d215f612617565b565b610d2b611108565b60328261ffff161180610d4357506107d08161ffff16115b15610d61576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd59190612d8e565b610df2576040516312aecd8160e01b815260040160405180910390fd5b6008805463ffffffff60a81b1916600160a81b61ffff9485160261ffff60b81b191617600160b81b9290931691909102919091179055565b5f546001600160a01b031690565b5f806016546301000000900460ff166004811115610e5857610e58612aba565b14610e76576040516312aecd8160e01b815260040160405180910390fd5b506001600160a01b03165f908152600a602052604090205490565b6004546001600160a01b03163314610ebc5760405163ea8e4eb560e01b815260040160405180910390fd5b5f811315610ee0578060185f828254610ed59190612e4e565b90915550610f019050565b5f811215610f0157610ef181612e61565b60185f828254610d089190612e35565b50565b610f0c611108565b8060ff165f03610f2f576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa39190612d8e565b610fc0576040516312aecd8160e01b815260040160405180910390fd5b6016805460ff909216620100000262ff000019909216919091179055565b610fe6611108565b8063ffffffff165f0361100c576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110809190612d8e565b61109d576040516312aecd8160e01b815260040160405180910390fd5b6014805463ffffffff191663ffffffff83169081179091556110bf9042612e4e565b60155550565b6110cd611108565b6001600160a01b0381166110ff575f604051631e4fbdf760e01b81526004016110f69190612c0b565b60405180910390fd5b610f0181612617565b33611111610e2a565b6001600160a01b031614610d21573360405163118cdaa760e01b81526004016110f69190612c0b565b80515f908190815b8161ffff168161ffff1610156111d4575f858261ffff168151811061116957611169612e7b565b6020908102919091018101516001600160a01b0381165f9081526010909252604090912054909150156111a25761119f85612e8f565b94505b6001600160a01b0381165f90815260116020526040902054156111cb576111c884612e8f565b93505b50600101611142565b5050915091565b86515f80805b8361ffff168161ffff1610156113b1575f8b8261ffff168151811061120857611208612e7b565b6020908102919091018101516001600160a01b0381165f90815260108352604080822054601190945290205490925081156112ed57828d8761ffff168151811061125457611254612e7b565b60200260200101906001600160a01b031690816001600160a01b031681525050818c8761ffff168151811061128b5761128b612e7b565b6020908102919091018101919091526001600160a01b0384165f908152600a90915260409020546006546112c0918491612666565b8b8761ffff16815181106112d6576112d6612e7b565b60209081029190910101526112ea86612e8f565b95505b80156113a357828a8661ffff168151811061130a5761130a612e7b565b60200260200101906001600160a01b031690816001600160a01b03168152505080898661ffff168151811061134157611341612e7b565b6020908102919091018101919091526001600160a01b0384165f908152600a9091526040902054600654611376918391612666565b888661ffff168151811061138c5761138c612e7b565b60209081029190910101526113a085612e8f565b94505b5050508060010190506111e1565b5050505050505050505050565b6002600154036113e157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6015544211158061146a575060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611444573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114689190612d8e565b155b156114885760405163085de62560e01b815260040160405180910390fd5b5f5b60125461ffff8216101561153d575f600a6008018261ffff16815481106114b3576114b3612e7b565b5f9182526020808320909101546001600160a01b03168252600a81526040808320839055600b8252808320839055600c8252808320839055600e8252808320839055600f8252808320839055600d8252808320839055601082528083208390556011825280832083905560139091529020805460ff191690555061153681612e8f565b905061148a565b5061154960125f612a8c565b611551612717565b60175415610d215760145461156c9063ffffffff1642612e4e565b6015556016805463ff00000019166301000000179055565b60016016546301000000900460ff1660048111156115a4576115a4612aba565b146115c25760405163baf3f0f760e01b815260040160405180910390fd5b601680546004906115dc90600160201b900460ff16612eaf565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff16826116109190612ec4565b60165460ff91821692505f9161162d916201000090041683612ee7565b60175490915061ffff82161180611649575060175461ffff8216145b1561166757506017546016805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061169157611691612e7b565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa1580156116eb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117129190810190612fc6565b90925090505f805b83518161ffff1610156119fe575f848261ffff168151811061173e5761173e612e7b565b602002602001015190505f848361ffff168151811061175f5761175f612e7b565b6020026020010151905080600a6001015f846001600160a01b03166001600160a01b031681526020019081526020015f205f82825461179e9190612e4e565b90915550506001600160a01b0382165f9081526013602052604090205460ff16611922576008546001600160a01b039081169083160361189a5760085461187d906117f490600160a01b900460ff16600a613167565b600860149054906101000a900460ff1660035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611854573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118789190613175565b612970565b6001600160a01b0383165f908152600a6020526040902055611922565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e09906118ca908590600401612c0b565b602060405180830381865afa1580156118e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119099190613190565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120546006549091906119d2906119519084908690612666565b600354604051633c2e3e7b60e11b81526001600160a01b039091169063785c7cf690611981908990600401612c0b565b602060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c09190613175565b600854600160a01b900460ff16612970565b90506119de8187612e4e565b95506119e9846129da565b50505050806119f790612e8f565b905061171a565b506008545f90611a1c90600160a81b900461ffff1683612710612666565b601454909150611a3d90829063ffffffff908116906301e133809061266616565b90508060095f828254611a509190612e4e565b90915550611a6090508183612e35565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0387169063e51a85f690602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc9190613190565b9050611ad88184612e35565b6008549093505f90611af890600160b81b900461ffff1683612710612666565b90508060095f828254611b0b9190612e4e565b90915550611b1b90508183612e35565b601654604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03881690630df571f7906044015f604051808303815f87803b158015611b6b575f5ffd5b505af1158015611b7d573d5f5f3e3d5ffd5b505050505f876001600160a01b031663a68a5267896001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bcd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf19190613190565b875f6040518463ffffffff1660e01b8152600401611c11939291906131a7565b602060405180830381865afa158015611c2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c509190613190565b6001600160a01b0389165f908152600e602052604090208690559050611c768186612e35565b94505f886001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd99190613190565b6001600160a01b038a165f908152600f602052604090208790559050611cff8187612e4e565b6001600160a01b039099165f908152600c6020526040902098909855505060019096019550611669945050505050565b50505050565b60026016546301000000900460ff166004811115611d5557611d55612aba565b14611d735760405163baf3f0f760e01b815260040160405180910390fd5b6016805463ff000000191663030000001790556017545f805b8261ffff168161ffff161015611df0575f60178261ffff1681548110611db457611db4612e7b565b5f9182526020808320909101546001600160a01b0316808352600c909152604090912054909150611de59084612e4e565b925050600101611d8c565b50600480546040805163dab26e3b60e01b815290515f93611e67936001600160a01b03169263dab26e3b92818301926020928290030181865afa158015611e39573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5d9190613190565b8390612710612666565b9050806018541115611e7857505050565b5f60185482611e879190612e35565b90505f5b8461ffff168161ffff161015611f25575f60178261ffff1681548110611eb357611eb3612e7b565b5f9182526020808320909101546001600160a01b0316808352600c909152604082205490925090611ee5858389612666565b6001600160a01b0384165f908152600c6020526040812080549293508392909190611f11908490612e35565b909155505060019093019250611e8b915050565b508060185f828254611f379190612e4e565b909155505050505050565b60036016546301000000900460ff166004811115611f6257611f62612aba565b14611f805760405163baf3f0f760e01b815260040160405180910390fd5b60168054600490611f9a90600160201b900460ff16612eaf565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff1682611fce9190612ec4565b60165460ff91821692505f91611feb916201000090041683612ee7565b60175490915061ffff82161180612007575060175461ffff8216145b1561202557506017546016805464ffff000000191663040000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061204f5761204f612e7b565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156120a9573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d091908101906131d3565b6001600160a01b0385165f908152600c6020526040812054835193955091935090916001600160401b0381111561210957612109612dad565b60405190808252806020026020018201604052801561214d57816020015b604080518082019091525f80825260208201528152602001906001900390816121275790505b5090505f5b84518161ffff1610156123df575f858261ffff168151811061217657612176612e7b565b602002602001015190505f858361ffff168151811061219757612197612e7b565b6020908102919091018101516001600160a01b0384165f908152601390925260409091205490915060ff1661229d576008546001600160a01b0390811690831603612215576008546121f8906117f490600160a01b900460ff16600a613167565b6001600160a01b0383165f908152600a602052604090205561229d565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e0990612245908590600401612c0b565b602060405180830381865afa158015612260573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122849190613190565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a602052604081205460065460075491929161233f916122e59185906122de908c9063ffffffff808b16919061266616565b9190612666565b600854600354604051633c2e3e7b60e11b8152600160a01b90920460ff16916001600160a01b039091169063785c7cf690612324908a90600401612c0b565b602060405180830381865afa158015611854573d5f5f3e3d5ffd5b90506040518060400160405280856001600160a01b031681526020018263ffffffff16815250868661ffff168151811061237b5761237b612e7b565b602002602001018190525080600a6003015f866001600160a01b03166001600160a01b031681526020019081526020015f205f8282546123bb9190612e4e565b909155506123ca9050846129da565b50505050806123d890612e8f565b9050612152565b50604051630415112560e21b81526001600160a01b0386169063105444949061240e908490869060040161328c565b5f604051808303815f87803b158015612425575f5ffd5b505af1158015612437573d5f5f3e3d5ffd5b505050505050505050806001019050612027565b60046016546301000000900460ff16600481111561246b5761246b612aba565b146124895760405163baf3f0f760e01b815260040160405180910390fd5b5f600a6008018054806020026020016040519081016040528092919081815260200182805480156124e157602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116124c3575b505083519394505f925050505b8161ffff168161ffff1610156125ac575f838261ffff168151811061251557612515612e7b565b6020908102919091018101516001600160a01b0381165f908152600b8352604080822054600d90945290205490925080821115612573576125568183612e35565b6001600160a01b0384165f9081526010602052604090205561259e565b8181111561259e576125858282612e35565b6001600160a01b0384165f908152601160205260409020555b5050508060010190506124ee565b506016805463ff00000019811682555f906125ca9061ffff16612e8f565b82546101009290920a61ffff8181021990931691831602179091556016546040519116907f0bc12479581640d161e016cef21aa834cb6d6326bbc0d8445e58d56403adf2dc905f90a25050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f5f6126738686612a5f565b91509150815f036126975783818161268d5761268d6132f3565b0492505050612710565b8184116126ae576126ae6003851502601118612a7b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150505b9392505050565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890612747908490600401613307565b5f60405180830381865afa158015612761573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612788919081019061331b565b905061279560175f612a8c565b5f5b81518161ffff161015610965575f828261ffff16815181106127bb576127bb612e7b565b60200260200101519050806001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612801573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128259190613190565b15801561288f5750806001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612869573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288d9190613190565b155b1561289a5750612960565b5f816001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156128d6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128fd91908101906131d3565b50905080515f0361290f575050612960565b50601780546001810182555f919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b03929092169190911790555b61296981612e8f565b9050612797565b5f8260ff168260ff1611156129a5576129898383613354565b61299490600a613167565b61299e908561336d565b9050612710565b8260ff168260ff1610156129d2576129bd8284613354565b6129c890600a613167565b61299e9085613384565b509192915050565b6001600160a01b0381165f9081526013602052604090205460ff16610f01576012805460018181019092557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0384166001600160a01b031990911681179091555f908152601360205260409020805460ff1916909117905550565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5080545f8255905f5260205f2090810190610f0191905b80821115612ab6575f8155600101612aa3565b5090565b634e487b7160e01b5f52602160045260245ffd5b6020810160058310612ae257612ae2612aba565b91905290565b6001600160a01b0381168114610f01575f5ffd5b5f60208284031215612b0c575f5ffd5b813561271081612ae8565b5f8151808452602084019350602083015f5b82811015612b505781516001600160a01b0316865260209586019590910190600101612b29565b5093949350505050565b5f8151808452602084019350602083015f5b82811015612b50578151865260209586019590910190600101612b6c565b60c081525f612b9c60c0830189612b17565b8281036020840152612bae8189612b5a565b90508281036040840152612bc28188612b17565b90508281036060840152612bd68187612b5a565b90508281036080840152612bea8186612b5a565b905082810360a0840152612bfe8185612b5a565b9998505050505050505050565b6001600160a01b0391909116815260200190565b5f5f60208385031215612c30575f5ffd5b82356001600160401b03811115612c45575f5ffd5b8301601f81018513612c55575f5ffd5b80356001600160401b03811115612c6a575f5ffd5b856020828401011115612c7b575f5ffd5b6020919091019590945092505050565b5f60208284031215612c9b575f5ffd5b5035919050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602081525f6127106020830184612b17565b803561ffff81168114612d03575f5ffd5b919050565b5f5f60408385031215612d19575f5ffd5b612d2283612cf2565b9150612d3060208401612cf2565b90509250929050565b60ff81168114610f01575f5ffd5b5f60208284031215612d57575f5ffd5b813561271081612d39565b63ffffffff81168114610f01575f5ffd5b5f60208284031215612d83575f5ffd5b813561271081612d62565b5f60208284031215612d9e575f5ffd5b81518015158114612710575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215612dd2575f5ffd5b82356001600160e01b031981168114612de9575f5ffd5b91506020830135612df981612d39565b809150509250929050565b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612e4857612e48612e21565b92915050565b80820180821115612e4857612e48612e21565b5f600160ff1b8201612e7557612e75612e21565b505f0390565b634e487b7160e01b5f52603260045260245ffd5b5f61ffff821661ffff8103612ea657612ea6612e21565b60010192915050565b5f60ff821660ff8103612ea657612ea6612e21565b60ff8181168382160290811690818114612ee057612ee0612e21565b5092915050565b61ffff8181168382160190811115612e4857612e48612e21565b604051601f8201601f191681016001600160401b0381118282101715612f2957612f29612dad565b604052919050565b5f6001600160401b03821115612f4957612f49612dad565b5060051b60200190565b5f82601f830112612f62575f5ffd5b8151612f75612f7082612f31565b612f01565b8082825260208201915060208360051b860101925085831115612f96575f5ffd5b602085015b83811015612fbc578051612fae81612ae8565b835260209283019201612f9b565b5095945050505050565b5f5f60408385031215612fd7575f5ffd5b82516001600160401b03811115612fec575f5ffd5b612ff885828601612f53565b602085015190935090506001600160401b03811115613015575f5ffd5b8301601f81018513613025575f5ffd5b8051613033612f7082612f31565b8082825260208201915060208360051b850101925087831115613054575f5ffd5b6020840193505b8284101561307657835182526020938401939091019061305b565b809450505050509250929050565b6001815b60018411156130bf578085048111156130a3576130a3612e21565b60018416156130b157908102905b60019390931c928002613088565b935093915050565b5f826130d557506001612e48565b816130e157505f612e48565b81600181146130f757600281146131015761311d565b6001915050612e48565b60ff84111561311257613112612e21565b50506001821b612e48565b5060208310610133831016604e8410600b8410161715613140575081810a612e48565b61314c5f198484613084565b805f190482111561315f5761315f612e21565b029392505050565b5f61271060ff8416836130c7565b5f60208284031215613185575f5ffd5b815161271081612d39565b5f602082840312156131a0575f5ffd5b5051919050565b8381526020810183905260608101600483106131c5576131c5612aba565b826040830152949350505050565b5f5f604083850312156131e4575f5ffd5b82516001600160401b038111156131f9575f5ffd5b61320585828601612f53565b602085015190935090506001600160401b03811115613222575f5ffd5b8301601f81018513613232575f5ffd5b8051613240612f7082612f31565b8082825260208201915060208360051b850101925087831115613261575f5ffd5b6020840193505b8284101561307657835161327b81612d62565b825260209384019390910190613268565b604080825283519082018190525f9060208501906060840190835b818110156132e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016132a7565b5050602093909301939093525092915050565b634e487b7160e01b5f52601260045260245ffd5b6020810160028310612ae257612ae2612aba565b5f6020828403121561332b575f5ffd5b81516001600160401b03811115613340575f5ffd5b61334c84828501612f53565b949350505050565b60ff8281168282160390811115612e4857612e48612e21565b8082028115828204841417612e4857612e48612e21565b5f8261339e57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212200f413788e8220fcbfa7a2e0261e604e5057a03bf734a9f9f6d94d6fda921639b64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061019f575f3560e01c8063055ad42e146101a35780630844697d146101cd57806308af604d146101f5578063132b1c921461021a57806314b19c5a1461025057806314b5d07f1461025e57806325a760c2146102735780632b0088b4146102875780632e2dc43e146102905780633a0dad8e146102aa5780634585e33b146102ca5780634ff0876a146102dd5780635488cd621461030257806358fac65b146103165780635dc228a0146103295780636e04ff0d1461033c5780636ff041531461035d5780637060444514610372578063715018a6146103855780637158da7c1461038d57806379502c55146103a05780637b103999146103b35780637cdabf0a146103c6578063800f9fad146103d95780638da5cb5b146103e25780638f5c9465146103ea578063b8b2af7c146103f3578063ba96ff1114610408578063c18e2a5c1461041b578063ca1f32f114610424578063e2638ff11461042d578063e2c4aaec14610455578063e6c3efd914610468578063eeb393c91461047b578063f2fde38b1461048e575b5f5ffd5b6016546101b7906301000000900460ff1681565b6040516101c49190612ace565b60405180910390f35b6008546101e290600160b81b900461ffff1681565b60405161ffff90911681526020016101c4565b6016546102089062010000900460ff1681565b60405160ff90911681526020016101c4565b610242610228366004612afc565b6001600160a01b03165f908152600f602052604090205490565b6040519081526020016101c4565b6016546101e29061ffff1681565b61027161026c366004612afc565b6104a1565b005b60085461020890600160a01b900460ff1681565b61024260075481565b6102986105aa565b6040516101c496959493929190612b8a565b6004546102bd906001600160a01b031681565b6040516101c49190612c0b565b6102716102d8366004612c1f565b610826565b6014546102ed9063ffffffff1681565b60405163ffffffff90911681526020016101c4565b60165461020890600160201b900460ff1681565b6102bd610324366004612c8b565b610969565b6002546102bd906001600160a01b031681565b61034f61034a366004612c1f565b610991565b6040516101c4929190612ca2565b610365610c0f565b6040516101c49190612ce0565b610271610380366004612c8b565b610ca9565b610271610d10565b6008546102bd906001600160a01b031681565b6003546102bd906001600160a01b031681565b6005546102bd906001600160a01b031681565b6102716103d4366004612d08565b610d23565b61024260095481565b6102bd610e2a565b6101e261271081565b6008546101e290600160a81b900461ffff1681565b610242610416366004612afc565b610e38565b61024260185481565b61024260065481565b61024261043b366004612afc565b6001600160a01b03165f908152600e602052604090205490565b610271610463366004612c8b565b610e91565b610271610476366004612d47565b610f04565b610271610489366004612d73565b610fde565b61027161049c366004612afc565b6110c5565b6104a9611108565b6001600160a01b0381166104d05760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610520573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105449190612d8e565b610561576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b606080808080805f6016546301000000900460ff1660048111156105d0576105d0612aba565b146105ee576040516312aecd8160e01b815260040160405180910390fd5b5f600a60080180548060200260200160405190810160405280929190818152602001828054801561064657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610628575b505050505090505f5f6106588361113a565b915091508161ffff166001600160401b0381111561067857610678612dad565b6040519080825280602002602001820160405280156106a1578160200160208202803683370190505b5098508161ffff166001600160401b038111156106c0576106c0612dad565b6040519080825280602002602001820160405280156106e9578160200160208202803683370190505b5097508061ffff166001600160401b0381111561070857610708612dad565b604051908082528060200260200182016040528015610731578160200160208202803683370190505b5096508061ffff166001600160401b0381111561075057610750612dad565b604051908082528060200260200182016040528015610779578160200160208202803683370190505b5095508161ffff166001600160401b0381111561079857610798612dad565b6040519080825280602002602001820160405280156107c1578160200160208202803683370190505b5094508061ffff166001600160401b038111156107e0576107e0612dad565b604051908082528060200260200182016040528015610809578160200160208202803683370190505b50935061081b838a8a888b8b8a6111db565b505050909192939495565b61082e610e2a565b6001600160a01b0316336001600160a01b03161415801561085a57506002546001600160a01b03163314155b156108785760405163ea8e4eb560e01b815260040160405180910390fd5b6108806113be565b60058110156108a2576040516317dbc4cb60e21b815260040160405180910390fd5b5f806108b083850185612dc1565b90925090506341659aab60e01b6001600160e01b03198316016108da576108d56113e8565b61095a565b636ce38ed360e11b6001600160e01b03198316016108fb576108d581611584565b6292a80f60e51b6001600160e01b031983160161091a576108d5611d35565b6265e66b60e01b6001600160e01b031983160161093a576108d581611f42565b63c4b3cef760e01b6001600160e01b031983160161095a5761095a61244b565b505061096560018055565b5050565b60178181548110610978575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a089190612d8e565b8015610a15575060155442115b15610a6757600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610a51929190612e04565b6040516020818303038152906040529050610c08565b60016016546301000000900460ff166004811115610a8757610a87612aba565b03610ad257600191507f2638e25a856cbfe28e0ae1857cb597cc2ceb873ce579b7d93c2258e45a754481601660049054906101000a900460ff16604051602001610a51929190612e04565b60026016546301000000900460ff166004811115610af257610af2612aba565b03610b2e57600191507fedaafe206508e00f40674bb87dda745bccfe8a3f3f6d6eaaf6db5f44021a1c135f604051602001610a51929190612e04565b60036016546301000000900460ff166004811115610b4e57610b4e612aba565b03610b9957600191507fff9a199536c068c55c334e40ebfa355733f79152332d6586d615c5bb37fd5c17601660049054906101000a900460ff16604051602001610a51929190612e04565b60046016546301000000900460ff166004811115610bb957610bb9612aba565b03610bf557600191507f3b4c310984a9fe486c05a56b52659c09d4bf9f3ef9b799ad52ee29a7d805741e5f604051602001610a51929190612e04565b505060408051602081019091525f808252905b9250929050565b60605f6016546301000000900460ff166004811115610c3057610c30612aba565b14610c4e576040516312aecd8160e01b815260040160405180910390fd5b6012805460408051602080840282018101909252828152929190830182828015610c9f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610c81575b5050505050905090565b6004546001600160a01b03163314610cd45760405163ea8e4eb560e01b815260040160405180910390fd5b600954811115610cf757604051632ca2f52b60e11b815260040160405180910390fd5b8060095f828254610d089190612e35565b909155505050565b610d18611108565b610d215f612617565b565b610d2b611108565b60328261ffff161180610d4357506107d08161ffff16115b15610d61576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd59190612d8e565b610df2576040516312aecd8160e01b815260040160405180910390fd5b6008805463ffffffff60a81b1916600160a81b61ffff9485160261ffff60b81b191617600160b81b9290931691909102919091179055565b5f546001600160a01b031690565b5f806016546301000000900460ff166004811115610e5857610e58612aba565b14610e76576040516312aecd8160e01b815260040160405180910390fd5b506001600160a01b03165f908152600a602052604090205490565b6004546001600160a01b03163314610ebc5760405163ea8e4eb560e01b815260040160405180910390fd5b5f811315610ee0578060185f828254610ed59190612e4e565b90915550610f019050565b5f811215610f0157610ef181612e61565b60185f828254610d089190612e35565b50565b610f0c611108565b8060ff165f03610f2f576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa39190612d8e565b610fc0576040516312aecd8160e01b815260040160405180910390fd5b6016805460ff909216620100000262ff000019909216919091179055565b610fe6611108565b8063ffffffff165f0361100c576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110809190612d8e565b61109d576040516312aecd8160e01b815260040160405180910390fd5b6014805463ffffffff191663ffffffff83169081179091556110bf9042612e4e565b60155550565b6110cd611108565b6001600160a01b0381166110ff575f604051631e4fbdf760e01b81526004016110f69190612c0b565b60405180910390fd5b610f0181612617565b33611111610e2a565b6001600160a01b031614610d21573360405163118cdaa760e01b81526004016110f69190612c0b565b80515f908190815b8161ffff168161ffff1610156111d4575f858261ffff168151811061116957611169612e7b565b6020908102919091018101516001600160a01b0381165f9081526010909252604090912054909150156111a25761119f85612e8f565b94505b6001600160a01b0381165f90815260116020526040902054156111cb576111c884612e8f565b93505b50600101611142565b5050915091565b86515f80805b8361ffff168161ffff1610156113b1575f8b8261ffff168151811061120857611208612e7b565b6020908102919091018101516001600160a01b0381165f90815260108352604080822054601190945290205490925081156112ed57828d8761ffff168151811061125457611254612e7b565b60200260200101906001600160a01b031690816001600160a01b031681525050818c8761ffff168151811061128b5761128b612e7b565b6020908102919091018101919091526001600160a01b0384165f908152600a90915260409020546006546112c0918491612666565b8b8761ffff16815181106112d6576112d6612e7b565b60209081029190910101526112ea86612e8f565b95505b80156113a357828a8661ffff168151811061130a5761130a612e7b565b60200260200101906001600160a01b031690816001600160a01b03168152505080898661ffff168151811061134157611341612e7b565b6020908102919091018101919091526001600160a01b0384165f908152600a9091526040902054600654611376918391612666565b888661ffff168151811061138c5761138c612e7b565b60209081029190910101526113a085612e8f565b94505b5050508060010190506111e1565b5050505050505050505050565b6002600154036113e157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6015544211158061146a575060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611444573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114689190612d8e565b155b156114885760405163085de62560e01b815260040160405180910390fd5b5f5b60125461ffff8216101561153d575f600a6008018261ffff16815481106114b3576114b3612e7b565b5f9182526020808320909101546001600160a01b03168252600a81526040808320839055600b8252808320839055600c8252808320839055600e8252808320839055600f8252808320839055600d8252808320839055601082528083208390556011825280832083905560139091529020805460ff191690555061153681612e8f565b905061148a565b5061154960125f612a8c565b611551612717565b60175415610d215760145461156c9063ffffffff1642612e4e565b6015556016805463ff00000019166301000000179055565b60016016546301000000900460ff1660048111156115a4576115a4612aba565b146115c25760405163baf3f0f760e01b815260040160405180910390fd5b601680546004906115dc90600160201b900460ff16612eaf565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff16826116109190612ec4565b60165460ff91821692505f9161162d916201000090041683612ee7565b60175490915061ffff82161180611649575060175461ffff8216145b1561166757506017546016805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061169157611691612e7b565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa1580156116eb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117129190810190612fc6565b90925090505f805b83518161ffff1610156119fe575f848261ffff168151811061173e5761173e612e7b565b602002602001015190505f848361ffff168151811061175f5761175f612e7b565b6020026020010151905080600a6001015f846001600160a01b03166001600160a01b031681526020019081526020015f205f82825461179e9190612e4e565b90915550506001600160a01b0382165f9081526013602052604090205460ff16611922576008546001600160a01b039081169083160361189a5760085461187d906117f490600160a01b900460ff16600a613167565b600860149054906101000a900460ff1660035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611854573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118789190613175565b612970565b6001600160a01b0383165f908152600a6020526040902055611922565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e09906118ca908590600401612c0b565b602060405180830381865afa1580156118e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119099190613190565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120546006549091906119d2906119519084908690612666565b600354604051633c2e3e7b60e11b81526001600160a01b039091169063785c7cf690611981908990600401612c0b565b602060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c09190613175565b600854600160a01b900460ff16612970565b90506119de8187612e4e565b95506119e9846129da565b50505050806119f790612e8f565b905061171a565b506008545f90611a1c90600160a81b900461ffff1683612710612666565b601454909150611a3d90829063ffffffff908116906301e133809061266616565b90508060095f828254611a509190612e4e565b90915550611a6090508183612e35565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0387169063e51a85f690602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc9190613190565b9050611ad88184612e35565b6008549093505f90611af890600160b81b900461ffff1683612710612666565b90508060095f828254611b0b9190612e4e565b90915550611b1b90508183612e35565b601654604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03881690630df571f7906044015f604051808303815f87803b158015611b6b575f5ffd5b505af1158015611b7d573d5f5f3e3d5ffd5b505050505f876001600160a01b031663a68a5267896001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bcd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf19190613190565b875f6040518463ffffffff1660e01b8152600401611c11939291906131a7565b602060405180830381865afa158015611c2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c509190613190565b6001600160a01b0389165f908152600e602052604090208690559050611c768186612e35565b94505f886001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd99190613190565b6001600160a01b038a165f908152600f602052604090208790559050611cff8187612e4e565b6001600160a01b039099165f908152600c6020526040902098909855505060019096019550611669945050505050565b50505050565b60026016546301000000900460ff166004811115611d5557611d55612aba565b14611d735760405163baf3f0f760e01b815260040160405180910390fd5b6016805463ff000000191663030000001790556017545f805b8261ffff168161ffff161015611df0575f60178261ffff1681548110611db457611db4612e7b565b5f9182526020808320909101546001600160a01b0316808352600c909152604090912054909150611de59084612e4e565b925050600101611d8c565b50600480546040805163dab26e3b60e01b815290515f93611e67936001600160a01b03169263dab26e3b92818301926020928290030181865afa158015611e39573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5d9190613190565b8390612710612666565b9050806018541115611e7857505050565b5f60185482611e879190612e35565b90505f5b8461ffff168161ffff161015611f25575f60178261ffff1681548110611eb357611eb3612e7b565b5f9182526020808320909101546001600160a01b0316808352600c909152604082205490925090611ee5858389612666565b6001600160a01b0384165f908152600c6020526040812080549293508392909190611f11908490612e35565b909155505060019093019250611e8b915050565b508060185f828254611f379190612e4e565b909155505050505050565b60036016546301000000900460ff166004811115611f6257611f62612aba565b14611f805760405163baf3f0f760e01b815260040160405180910390fd5b60168054600490611f9a90600160201b900460ff16612eaf565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff1682611fce9190612ec4565b60165460ff91821692505f91611feb916201000090041683612ee7565b60175490915061ffff82161180612007575060175461ffff8216145b1561202557506017546016805464ffff000000191663040000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061204f5761204f612e7b565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156120a9573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d091908101906131d3565b6001600160a01b0385165f908152600c6020526040812054835193955091935090916001600160401b0381111561210957612109612dad565b60405190808252806020026020018201604052801561214d57816020015b604080518082019091525f80825260208201528152602001906001900390816121275790505b5090505f5b84518161ffff1610156123df575f858261ffff168151811061217657612176612e7b565b602002602001015190505f858361ffff168151811061219757612197612e7b565b6020908102919091018101516001600160a01b0384165f908152601390925260409091205490915060ff1661229d576008546001600160a01b0390811690831603612215576008546121f8906117f490600160a01b900460ff16600a613167565b6001600160a01b0383165f908152600a602052604090205561229d565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e0990612245908590600401612c0b565b602060405180830381865afa158015612260573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122849190613190565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a602052604081205460065460075491929161233f916122e59185906122de908c9063ffffffff808b16919061266616565b9190612666565b600854600354604051633c2e3e7b60e11b8152600160a01b90920460ff16916001600160a01b039091169063785c7cf690612324908a90600401612c0b565b602060405180830381865afa158015611854573d5f5f3e3d5ffd5b90506040518060400160405280856001600160a01b031681526020018263ffffffff16815250868661ffff168151811061237b5761237b612e7b565b602002602001018190525080600a6003015f866001600160a01b03166001600160a01b031681526020019081526020015f205f8282546123bb9190612e4e565b909155506123ca9050846129da565b50505050806123d890612e8f565b9050612152565b50604051630415112560e21b81526001600160a01b0386169063105444949061240e908490869060040161328c565b5f604051808303815f87803b158015612425575f5ffd5b505af1158015612437573d5f5f3e3d5ffd5b505050505050505050806001019050612027565b60046016546301000000900460ff16600481111561246b5761246b612aba565b146124895760405163baf3f0f760e01b815260040160405180910390fd5b5f600a6008018054806020026020016040519081016040528092919081815260200182805480156124e157602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116124c3575b505083519394505f925050505b8161ffff168161ffff1610156125ac575f838261ffff168151811061251557612515612e7b565b6020908102919091018101516001600160a01b0381165f908152600b8352604080822054600d90945290205490925080821115612573576125568183612e35565b6001600160a01b0384165f9081526010602052604090205561259e565b8181111561259e576125858282612e35565b6001600160a01b0384165f908152601160205260409020555b5050508060010190506124ee565b506016805463ff00000019811682555f906125ca9061ffff16612e8f565b82546101009290920a61ffff8181021990931691831602179091556016546040519116907f0bc12479581640d161e016cef21aa834cb6d6326bbc0d8445e58d56403adf2dc905f90a25050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f5f6126738686612a5f565b91509150815f036126975783818161268d5761268d6132f3565b0492505050612710565b8184116126ae576126ae6003851502601118612a7b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150505b9392505050565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890612747908490600401613307565b5f60405180830381865afa158015612761573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612788919081019061331b565b905061279560175f612a8c565b5f5b81518161ffff161015610965575f828261ffff16815181106127bb576127bb612e7b565b60200260200101519050806001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612801573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128259190613190565b15801561288f5750806001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612869573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288d9190613190565b155b1561289a5750612960565b5f816001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156128d6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128fd91908101906131d3565b50905080515f0361290f575050612960565b50601780546001810182555f919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b03929092169190911790555b61296981612e8f565b9050612797565b5f8260ff168260ff1611156129a5576129898383613354565b61299490600a613167565b61299e908561336d565b9050612710565b8260ff168260ff1610156129d2576129bd8284613354565b6129c890600a613167565b61299e9085613384565b509192915050565b6001600160a01b0381165f9081526013602052604090205460ff16610f01576012805460018181019092557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0384166001600160a01b031990911681179091555f908152601360205260409020805460ff1916909117905550565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5080545f8255905f5260205f2090810190610f0191905b80821115612ab6575f8155600101612aa3565b5090565b634e487b7160e01b5f52602160045260245ffd5b6020810160058310612ae257612ae2612aba565b91905290565b6001600160a01b0381168114610f01575f5ffd5b5f60208284031215612b0c575f5ffd5b813561271081612ae8565b5f8151808452602084019350602083015f5b82811015612b505781516001600160a01b0316865260209586019590910190600101612b29565b5093949350505050565b5f8151808452602084019350602083015f5b82811015612b50578151865260209586019590910190600101612b6c565b60c081525f612b9c60c0830189612b17565b8281036020840152612bae8189612b5a565b90508281036040840152612bc28188612b17565b90508281036060840152612bd68187612b5a565b90508281036080840152612bea8186612b5a565b905082810360a0840152612bfe8185612b5a565b9998505050505050505050565b6001600160a01b0391909116815260200190565b5f5f60208385031215612c30575f5ffd5b82356001600160401b03811115612c45575f5ffd5b8301601f81018513612c55575f5ffd5b80356001600160401b03811115612c6a575f5ffd5b856020828401011115612c7b575f5ffd5b6020919091019590945092505050565b5f60208284031215612c9b575f5ffd5b5035919050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602081525f6127106020830184612b17565b803561ffff81168114612d03575f5ffd5b919050565b5f5f60408385031215612d19575f5ffd5b612d2283612cf2565b9150612d3060208401612cf2565b90509250929050565b60ff81168114610f01575f5ffd5b5f60208284031215612d57575f5ffd5b813561271081612d39565b63ffffffff81168114610f01575f5ffd5b5f60208284031215612d83575f5ffd5b813561271081612d62565b5f60208284031215612d9e575f5ffd5b81518015158114612710575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215612dd2575f5ffd5b82356001600160e01b031981168114612de9575f5ffd5b91506020830135612df981612d39565b809150509250929050565b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612e4857612e48612e21565b92915050565b80820180821115612e4857612e48612e21565b5f600160ff1b8201612e7557612e75612e21565b505f0390565b634e487b7160e01b5f52603260045260245ffd5b5f61ffff821661ffff8103612ea657612ea6612e21565b60010192915050565b5f60ff821660ff8103612ea657612ea6612e21565b60ff8181168382160290811690818114612ee057612ee0612e21565b5092915050565b61ffff8181168382160190811115612e4857612e48612e21565b604051601f8201601f191681016001600160401b0381118282101715612f2957612f29612dad565b604052919050565b5f6001600160401b03821115612f4957612f49612dad565b5060051b60200190565b5f82601f830112612f62575f5ffd5b8151612f75612f7082612f31565b612f01565b8082825260208201915060208360051b860101925085831115612f96575f5ffd5b602085015b83811015612fbc578051612fae81612ae8565b835260209283019201612f9b565b5095945050505050565b5f5f60408385031215612fd7575f5ffd5b82516001600160401b03811115612fec575f5ffd5b612ff885828601612f53565b602085015190935090506001600160401b03811115613015575f5ffd5b8301601f81018513613025575f5ffd5b8051613033612f7082612f31565b8082825260208201915060208360051b850101925087831115613054575f5ffd5b6020840193505b8284101561307657835182526020938401939091019061305b565b809450505050509250929050565b6001815b60018411156130bf578085048111156130a3576130a3612e21565b60018416156130b157908102905b60019390931c928002613088565b935093915050565b5f826130d557506001612e48565b816130e157505f612e48565b81600181146130f757600281146131015761311d565b6001915050612e48565b60ff84111561311257613112612e21565b50506001821b612e48565b5060208310610133831016604e8410600b8410161715613140575081810a612e48565b61314c5f198484613084565b805f190482111561315f5761315f612e21565b029392505050565b5f61271060ff8416836130c7565b5f60208284031215613185575f5ffd5b815161271081612d39565b5f602082840312156131a0575f5ffd5b5051919050565b8381526020810183905260608101600483106131c5576131c5612aba565b826040830152949350505050565b5f5f604083850312156131e4575f5ffd5b82516001600160401b038111156131f9575f5ffd5b61320585828601612f53565b602085015190935090506001600160401b03811115613222575f5ffd5b8301601f81018513613232575f5ffd5b8051613240612f7082612f31565b8082825260208201915060208360051b850101925087831115613261575f5ffd5b6020840193505b8284101561307657835161327b81612d62565b825260209384019390910190613268565b604080825283519082018190525f9060208501906060840190835b818110156132e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016132a7565b5050602093909301939093525092915050565b634e487b7160e01b5f52601260045260245ffd5b6020810160028310612ae257612ae2612aba565b5f6020828403121561332b575f5ffd5b81516001600160401b03811115613340575f5ffd5b61334c84828501612f53565b949350505050565b60ff8281168282160390811115612e4857612e48612e21565b8082028115828204841417612e4857612e48612e21565b5f8261339e57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212200f413788e8220fcbfa7a2e0261e604e5057a03bf734a9f9f6d94d6fda921639b64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/orchestrators/LiquidityOrchestrator.sol/LiquidityOrchestrator.json b/artifacts/contracts/orchestrators/LiquidityOrchestrator.sol/LiquidityOrchestrator.json index d6c20d22..ab6d43ca 100644 --- a/artifacts/contracts/orchestrators/LiquidityOrchestrator.sol/LiquidityOrchestrator.json +++ b/artifacts/contracts/orchestrators/LiquidityOrchestrator.sol/LiquidityOrchestrator.json @@ -669,8 +669,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b50604051612ecc380380612ecc83398101604081905261002e916101e3565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161017d565b50600180556001600160a01b0382166100915760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b85760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b03841690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa15801561010f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610133919061022d565b600580546001600160a01b03199081166001600160a01b0393841617909155600280549091169290911691909117905550506007805464ffffffffff19166201000017905561024f565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101e0575f5ffd5b50565b5f5f5f606084860312156101f5575f5ffd5b8351610200816101cc565b6020850151909350610211816101cc565b6040850151909250610222816101cc565b809150509250925092565b5f6020828403121561023d575f5ffd5b8151610248816101cc565b9392505050565b612c708061025c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610194575f3560e01c806301c621c114610198578063055ad42e146101ad57806309f2e19c146101d75780630a861f2a146101f75780630a8b78c71461020a57806314b5d07f1461021d5780633369921a14610230578063348ec5c8146102475780633af2a8c01461025a5780633e765a9e1461026d5780634585e33b146102805780634adfc2e71461029357806351edffb1146102a657806352e899fd146102b95780635488cd62146102cc57806357be01c1146102f257806359017aa9146103055780635dc228a0146103185780636e04ff0d1461032b578063715018a61461034c5780637158da7c14610354578063741fca4b1461036757806376d58e1a1461037a57806379502c551461038d5780638157c1ab146103a0578063841181ef146103b35780638a0b0d38146103c65780638da5cb5b146103d9578063bc504975146103e1578063be1b26a4146103f4578063d3f3506d14610407578063dab26e3b1461042f578063ee6713df14610438578063f2fde38b14610459575b5f5ffd5b6101ab6101a63660046125c3565b61046c565b005b6007546101c1906301000000900460ff1681565b6040516101ce91906125ee565b60405180910390f35b6101ea6101e53660046125c3565b610599565b6040516101ce9190612608565b6101ab6102053660046125c3565b6105c1565b6101ab610218366004612630565b61081d565b6101ab61022b366004612630565b610898565b610239600f5481565b6040519081526020016101ce565b6004546101ea906001600160a01b031681565b6101ab6102683660046125c3565b6109a1565b61023961027b3660046125c3565b610a82565b6101ab61028e366004612652565b610aa1565b6101ab6102a13660046126be565b610bea565b6101ab6102b43660046126be565b610cd5565b6102396102c73660046125c3565b610d61565b6007546102e090600160201b900460ff1681565b60405160ff90911681526020016101ce565b6007546102e09062010000900460ff1681565b6101ab6103133660046126e8565b610d70565b6002546101ea906001600160a01b031681565b61033e610339366004612652565b610e19565b6040516101ce92919061271f565b6101ab6110ae565b6005546101ea906001600160a01b031681565b6101ab6103753660046125c3565b6110c1565b6101ab6103883660046125c3565b611278565b6003546101ea906001600160a01b031681565b6101ea6103ae3660046125c3565b611431565b6101ab6103c1366004612630565b611440565b6101ab6103d4366004612772565b6114d1565b6101ea6115ab565b6102396103ef3660046125c3565b6115b9565b6102396104023660046125c3565b6115c8565b6101ea610415366004612630565b60066020525f90815260409020546001600160a01b031681565b61023960085481565b6007546104469061ffff1681565b60405161ffff90911681526020016101ce565b6101ab610467366004612630565b6115d7565b610474611614565b805f036104aa57600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b60405180910390fd5b60048054604051637060444560e01b81529182018390526001600160a01b0316906370604445906024015f604051808303815f87803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb90610535903390869060040161278b565b6020604051808303815f875af1158015610551573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057591906127a4565b905080610595576040516312171d8360e31b815260040160405180910390fd5b5050565b600c81815481106105a8575f80fd5b5f918252602090912001546001600160a01b0316905081565b6105c9611614565b805f036105f657600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a91906127a4565b610687576040516312aecd8160e01b815260040160405180910390fd5b5f60045f9054906101000a90046001600160a01b03166001600160a01b031663c18e2a5c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fc91906127c3565b90508082111561071f57604051632ca2f52b60e11b815260040160405180910390fd5b6004546001600160a01b031663e2c4aaec610739846127ee565b6040518263ffffffff1660e01b815260040161075791815260200190565b5f604051808303815f87803b15801561076e575f5ffd5b505af1158015610780573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906107b8903390879060040161278b565b6020604051808303815f875af11580156107d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f891906127a4565b905080610818576040516312171d8360e31b815260040160405180910390fd5b505050565b610825611614565b6001600160a01b03811661084c5760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561087657604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6108a0611614565b6001600160a01b0381166108c75760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b91906127a4565b610958576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b6109a9611614565b805f036109c9576040516317dbc4cb60e21b815260040160405180910390fd5b6101f48111156109ec576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6091906127a4565b610a7d576040516312aecd8160e01b815260040160405180910390fd5b600855565b600e8181548110610a91575f80fd5b5f91825260209091200154905081565b610aa96115ab565b6001600160a01b0316336001600160a01b031614158015610ad557506002546001600160a01b03163314155b15610af35760405163ea8e4eb560e01b815260040160405180910390fd5b610afb611646565b6005811015610b1d576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610b2b83850185612808565b90925090506341659aab60e01b6001600160e01b0319831601610b5557610b50611670565b610bb7565b63100597e960e31b6001600160e01b0319831601610b7657610b50816118a8565b63302c6bef60e21b6001600160e01b0319831601610b9757610b5081611a35565b6301c7bbc160e21b6001600160e01b0319831601610bb757610bb7611c2d565b6040517ff0094b59b7bc92e9fc611b14b5d3a34fe02530ac9bcf36c2c6f10147c3030c12905f90a1505061059560018055565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610c1a903390600401612608565b602060405180830381865afa158015610c35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5991906127a4565b610c765760405163ea8e4eb560e01b815260040160405180910390fd5b805f03610ca357600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b60055460405163a9059cbb60e01b81525f916001600160a01b03169063a9059cbb906107b8908690869060040161278b565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610d05903390600401612608565b602060405180830381865afa158015610d20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4491906127a4565b610ca35760405163ea8e4eb560e01b815260040160405180910390fd5b600b8181548110610a91575f80fd5b6003546001600160a01b03163314610d9b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382161580610db857506001600160a01b038116155b15610dd65760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526006602052604080822080546001600160a01b0319169486169485179055515f516020612c1b5f395f51905f529190a35050565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9091906127a4565b8015610f1057506007546004805460408051630a58ce2d60e11b8152905161ffff909416936001600160a01b03909216926314b19c5a9282820192602092908290030181865afa158015610ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0a9190612847565b61ffff16115b15610f6257600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610f4c929190612868565b60405160208183030381529060405290506110a7565b60016007546301000000900460ff166003811115610f8257610f826125da565b03610fcd57600191507f7fd340b8241a93f6a116f506d6171d4f585588564d777e1192babae55184f691600760049054906101000a900460ff16604051602001610f4c929190612868565b60026007546301000000900460ff166003811115610fed57610fed6125da565b0361103857600191507f3f4e50448465d8594e91c1038b22f277808696956455dacacb66f00f4df0b3a2600760049054906101000a900460ff16604051602001610f4c929190612868565b60036007546301000000900460ff166003811115611058576110586125da565b0361109457600191507ff8e110fcda2d74b2e1ced72f8e94b4510c922b70f786fd1064147a762fd812605f604051602001610f4c929190612868565b505060408051602081019091525f808252905b9250929050565b6110b6611614565b6110bf5f611fd0565b565b600354604051633821dad160e21b815233916001600160a01b03169063e0876b44906110f1908490600401612608565b602060405180830381865afa15801561110c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113091906127a4565b61114d5760405163ea8e4eb560e01b815260040160405180910390fd5b815f0361117a57600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b5f816001600160a01b0316631f52692b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db9190612885565b60055460405163a9059cbb60e01b81529192505f916001600160a01b039091169063a9059cbb90611212908590889060040161278b565b6020604051808303815f875af115801561122e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125291906127a4565b905080611272576040516312171d8360e31b815260040160405180910390fd5b50505050565b611280611614565b805f036112ad57600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132191906127a4565b61133e576040516312aecd8160e01b815260040160405180910390fd5b6005546040516323b872dd60e01b8152336004820152306024820152604481018390525f916001600160a01b0316906323b872dd906064016020604051808303815f875af1158015611392573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b691906127a4565b9050806113d6576040516312171d8360e31b815260040160405180910390fd5b600480546040516338b12abb60e21b81529182018490526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611417575f5ffd5b505af1158015611429573d5f5f3e3d5ffd5b505050505050565b600981815481106105a8575f80fd5b6003546001600160a01b0316331461146b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166114925760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526006602052604080822080546001600160a01b0319169055519091905f516020612c1b5f395f51905f52908390a350565b6114d9611614565b8060ff165f036114fc576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561154c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157091906127a4565b61158d576040516312aecd8160e01b815260040160405180910390fd5b6007805460ff909216620100000262ff000019909216919091179055565b5f546001600160a01b031690565b600d8181548110610a91575f80fd5b600a8181548110610a91575f80fd5b6115df611614565b6001600160a01b038116611608575f604051631e4fbdf760e01b81526004016104a19190612608565b61161181611fd0565b50565b3361161d6115ab565b6001600160a01b0316146110bf573360405163118cdaa760e01b81526004016104a19190612608565b60026001540361166957604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f60045f9054906101000a90046001600160a01b03166001600160a01b03166314b19c5a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e59190612847565b6007549091506116fa9061ffff1660016128a0565b61ffff168161ffff16101561170c5750565b6007805461ffff191661ffff831617905561172860095f6124f8565b611733600a5f6124f8565b61173e600c5f6124f8565b611749600d5f6124f8565b611754600b5f6124f8565b61175f600e5f6124f8565b5f600f8190556004805460408051631716e21f60e11b815290516001600160a01b0390921693632e2dc43e938281019391928290030181865afa1580156117a8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117cf91908101906129f4565b60095f600a5f600c5f600d5f600b5f600e5f8c91905090805190602001906117f8929190612513565b50508a5161180b919060208d0190612513565b5050895161181e919060208c0190612513565b50508851611831919060208b019061255c565b50508751611844919060208a0190612513565b505086516118579190602089019061255c565b50506007805463ff0000001916630100000017905550506009545f039250611611915050576007805463ff00000019166302000000179055600c545f0361161157506007805463ff00000019169055565b60016007546301000000900460ff1660038111156118c8576118c86125da565b146118e65760405163baf3f0f760e01b815260040160405180910390fd5b6007805460049061190090600160201b900460ff16612b04565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff16826119349190612b22565b60075460ff91821692505f916119519162010000900416836128a0565b60095490915061ffff8216118061196d575060095461ffff8216145b1561198b57506009546007805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611272575f60098261ffff16815481106119b5576119b5612b45565b5f918252602090912001546005546001600160a01b0391821692501681036119dd5750611a2d565b5f600a8361ffff16815481106119f5576119f5612b45565b905f5260205f2001549050611a2a8282600b8661ffff1681548110611a1c57611a1c612b45565b905f5260205f20015461201f565b50505b60010161198d565b60026007546301000000900460ff166003811115611a5557611a556125da565b14611a735760405163baf3f0f760e01b815260040160405180910390fd5b60078054600490611a8d90600160201b900460ff16612b04565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff1682611ac19190612b22565b60075460ff91821692505f91611ade9162010000900416836128a0565b600c5490915061ffff82161180611afa5750600c5461ffff8216145b15611b185750600c546007805464ffff000000191663030000001790555b815b8161ffff168161ffff161015611bc2575f600c8261ffff1681548110611b4257611b42612b45565b5f918252602090912001546005546001600160a01b039182169250168103611b6a5750611bba565b5f600d8361ffff1681548110611b8257611b82612b45565b905f5260205f2001549050611bb78282600e8661ffff1681548110611ba957611ba9612b45565b905f5260205f2001546121cd565b50505b600101611b1a565b50600c5461ffff8216036108185760048054600f546040516338b12abb60e21b8152928301526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611c12575f5ffd5b505af1158015611c24573d5f5f3e3d5ffd5b50505050505050565b60036007546301000000900460ff166003811115611c4d57611c4d6125da565b14611c6b5760405163baf3f0f760e01b815260040160405180910390fd5b6007805463ff00000019169055600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611ca8908490600401612b59565b5f60405180830381865afa158015611cc2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ce99190810190612b6d565b90505f5b81518161ffff161015611e23575f828261ffff1681518110611d1157611d11612b45565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611d5091869101612608565b602060405180830381865afa158015611d6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8f91906127c3565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611dc391879101612608565b602060405180830381865afa158015611dde573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0291906127c3565b9050611e0f83838361236f565b50505080611e1c90612ba6565b9050611ced565b50600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611e5590600190600401612b59565b5f60405180830381865afa158015611e6f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e969190810190612b6d565b90505f5b81518161ffff161015610818575f828261ffff1681518110611ebe57611ebe612b45565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611efd91869101612608565b602060405180830381865afa158015611f18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3c91906127c3565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611f7091879101612608565b602060405180830381865afa158015611f8b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611faf91906127c3565b9050611fbc83838361236f565b50505080611fc990612ba6565b9050611e9a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084165f90815260066020526040902054168061205757604051635048c2af60e11b815260040160405180910390fd5b60405163095ea7b360e01b81526001600160a01b0385169063095ea7b3906120859084905f9060040161278b565b6020604051808303815f875af11580156120a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120c591906127a4565b5060405163095ea7b360e01b81526001600160a01b0385169063095ea7b3906120f4908490879060040161278b565b6020604051808303815f875af1158015612110573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213491906127a4565b50604051636c197ff560e01b81525f906001600160a01b03831690636c197ff590612165908890889060040161278b565b6020604051808303815f875af1158015612181573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121a591906127c3565b90506121b18382612bbd565b600f5f8282546121c19190612bdc565b90915550505050505050565b6001600160a01b038084165f90815260066020526040902054168061220557604051635048c2af60e11b815260040160405180910390fd5b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906122379084905f9060040161278b565b6020604051808303815f875af1158015612253573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227791906127a4565b506005546001600160a01b031663095ea7b382612295856002612c03565b6040518363ffffffff1660e01b81526004016122b292919061278b565b6020604051808303815f875af11580156122ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122f291906127a4565b5060405163cce7ec1360e01b81525f906001600160a01b0383169063cce7ec1390612323908890889060040161278b565b6020604051808303815f875af115801561233f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061236391906127c3565b90506121b18184612bbd565b5f8390505f816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123d491906127c3565b90505f826001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612413573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243791906127c3565b905081156124955760405163e5e9719360e01b8152600481018690526001600160a01b0384169063e5e97193906024015f604051808303815f87803b15801561247e575f5ffd5b505af1158015612490573d5f5f3e3d5ffd5b505050505b80156114295760405163493a6e2160e01b8152600481018590526001600160a01b0384169063493a6e21906024015f604051808303815f87803b1580156124da575f5ffd5b505af11580156124ec573d5f5f3e3d5ffd5b50505050505050505050565b5080545f8255905f5260205f209081019061161191906125af565b828054828255905f5260205f2090810192821561254c579160200282015b8281111561254c578251825591602001919060010190612531565b506125589291506125af565b5090565b828054828255905f5260205f2090810192821561254c579160200282015b8281111561254c57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061257a565b5b80821115612558575f81556001016125b0565b5f602082840312156125d3575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b6020810160048310612602576126026125da565b91905290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611611575f5ffd5b5f60208284031215612640575f5ffd5b813561264b8161261c565b9392505050565b5f5f60208385031215612663575f5ffd5b82356001600160401b03811115612678575f5ffd5b8301601f81018513612688575f5ffd5b80356001600160401b0381111561269d575f5ffd5b8560208284010111156126ae575f5ffd5b6020919091019590945092505050565b5f5f604083850312156126cf575f5ffd5b82356126da8161261c565b946020939093013593505050565b5f5f604083850312156126f9575f5ffd5b82356127048161261c565b915060208301356127148161261c565b809150509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b803560ff8116811461276d575f5ffd5b919050565b5f60208284031215612782575f5ffd5b61264b8261275d565b6001600160a01b03929092168252602082015260400190565b5f602082840312156127b4575f5ffd5b8151801515811461264b575f5ffd5b5f602082840312156127d3575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201612802576128026127da565b505f0390565b5f5f60408385031215612819575f5ffd5b82356001600160e01b031981168114612830575f5ffd5b915061283e6020840161275d565b90509250929050565b5f60208284031215612857575f5ffd5b815161ffff8116811461264b575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b5f60208284031215612895575f5ffd5b815161264b8161261c565b61ffff81811683821601908111156128ba576128ba6127da565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156128fc576128fc6128c0565b604052919050565b5f6001600160401b0382111561291c5761291c6128c0565b5060051b60200190565b5f82601f830112612935575f5ffd5b815161294861294382612904565b6128d4565b8082825260208201915060208360051b860101925085831115612969575f5ffd5b602085015b8381101561298f5780516129818161261c565b83526020928301920161296e565b5095945050505050565b5f82601f8301126129a8575f5ffd5b81516129b661294382612904565b8082825260208201915060208360051b8601019250858311156129d7575f5ffd5b602085015b8381101561298f5780518352602092830192016129dc565b5f5f5f5f5f5f60c08789031215612a09575f5ffd5b86516001600160401b03811115612a1e575f5ffd5b612a2a89828a01612926565b602089015190975090506001600160401b03811115612a47575f5ffd5b612a5389828a01612999565b604089015190965090506001600160401b03811115612a70575f5ffd5b612a7c89828a01612926565b606089015190955090506001600160401b03811115612a99575f5ffd5b612aa589828a01612999565b608089015190945090506001600160401b03811115612ac2575f5ffd5b612ace89828a01612999565b60a089015190935090506001600160401b03811115612aeb575f5ffd5b612af789828a01612999565b9150509295509295509295565b5f60ff821660ff8103612b1957612b196127da565b60010192915050565b60ff8181168382160290811690818114612b3e57612b3e6127da565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b6020810160028310612602576126026125da565b5f60208284031215612b7d575f5ffd5b81516001600160401b03811115612b92575f5ffd5b612b9e84828501612926565b949350505050565b5f61ffff821661ffff8103612b1957612b196127da565b8181035f831280158383131683831282161715612b3e57612b3e6127da565b8082018281125f831280158216821582161715612bfb57612bfb6127da565b505092915050565b80820281158282048414176128ba576128ba6127da56fe2f2727c7b3d9ee55de5c114f0cb7997ac7251a4cbfca4f2b2dc6969d86cce4f4a2646970667358221220861dab4c125f18b95e0ffffd60fd5daf6b6fc6d28a623419745b066b9c7565f364736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610194575f3560e01c806301c621c114610198578063055ad42e146101ad57806309f2e19c146101d75780630a861f2a146101f75780630a8b78c71461020a57806314b5d07f1461021d5780633369921a14610230578063348ec5c8146102475780633af2a8c01461025a5780633e765a9e1461026d5780634585e33b146102805780634adfc2e71461029357806351edffb1146102a657806352e899fd146102b95780635488cd62146102cc57806357be01c1146102f257806359017aa9146103055780635dc228a0146103185780636e04ff0d1461032b578063715018a61461034c5780637158da7c14610354578063741fca4b1461036757806376d58e1a1461037a57806379502c551461038d5780638157c1ab146103a0578063841181ef146103b35780638a0b0d38146103c65780638da5cb5b146103d9578063bc504975146103e1578063be1b26a4146103f4578063d3f3506d14610407578063dab26e3b1461042f578063ee6713df14610438578063f2fde38b14610459575b5f5ffd5b6101ab6101a63660046125c3565b61046c565b005b6007546101c1906301000000900460ff1681565b6040516101ce91906125ee565b60405180910390f35b6101ea6101e53660046125c3565b610599565b6040516101ce9190612608565b6101ab6102053660046125c3565b6105c1565b6101ab610218366004612630565b61081d565b6101ab61022b366004612630565b610898565b610239600f5481565b6040519081526020016101ce565b6004546101ea906001600160a01b031681565b6101ab6102683660046125c3565b6109a1565b61023961027b3660046125c3565b610a82565b6101ab61028e366004612652565b610aa1565b6101ab6102a13660046126be565b610bea565b6101ab6102b43660046126be565b610cd5565b6102396102c73660046125c3565b610d61565b6007546102e090600160201b900460ff1681565b60405160ff90911681526020016101ce565b6007546102e09062010000900460ff1681565b6101ab6103133660046126e8565b610d70565b6002546101ea906001600160a01b031681565b61033e610339366004612652565b610e19565b6040516101ce92919061271f565b6101ab6110ae565b6005546101ea906001600160a01b031681565b6101ab6103753660046125c3565b6110c1565b6101ab6103883660046125c3565b611278565b6003546101ea906001600160a01b031681565b6101ea6103ae3660046125c3565b611431565b6101ab6103c1366004612630565b611440565b6101ab6103d4366004612772565b6114d1565b6101ea6115ab565b6102396103ef3660046125c3565b6115b9565b6102396104023660046125c3565b6115c8565b6101ea610415366004612630565b60066020525f90815260409020546001600160a01b031681565b61023960085481565b6007546104469061ffff1681565b60405161ffff90911681526020016101ce565b6101ab610467366004612630565b6115d7565b610474611614565b805f036104aa57600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b60405180910390fd5b60048054604051637060444560e01b81529182018390526001600160a01b0316906370604445906024015f604051808303815f87803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb90610535903390869060040161278b565b6020604051808303815f875af1158015610551573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057591906127a4565b905080610595576040516312171d8360e31b815260040160405180910390fd5b5050565b600c81815481106105a8575f80fd5b5f918252602090912001546001600160a01b0316905081565b6105c9611614565b805f036105f657600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a91906127a4565b610687576040516312aecd8160e01b815260040160405180910390fd5b5f60045f9054906101000a90046001600160a01b03166001600160a01b031663c18e2a5c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fc91906127c3565b90508082111561071f57604051632ca2f52b60e11b815260040160405180910390fd5b6004546001600160a01b031663e2c4aaec610739846127ee565b6040518263ffffffff1660e01b815260040161075791815260200190565b5f604051808303815f87803b15801561076e575f5ffd5b505af1158015610780573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906107b8903390879060040161278b565b6020604051808303815f875af11580156107d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f891906127a4565b905080610818576040516312171d8360e31b815260040160405180910390fd5b505050565b610825611614565b6001600160a01b03811661084c5760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561087657604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6108a0611614565b6001600160a01b0381166108c75760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b91906127a4565b610958576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b6109a9611614565b805f036109c9576040516317dbc4cb60e21b815260040160405180910390fd5b6101f48111156109ec576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6091906127a4565b610a7d576040516312aecd8160e01b815260040160405180910390fd5b600855565b600e8181548110610a91575f80fd5b5f91825260209091200154905081565b610aa96115ab565b6001600160a01b0316336001600160a01b031614158015610ad557506002546001600160a01b03163314155b15610af35760405163ea8e4eb560e01b815260040160405180910390fd5b610afb611646565b6005811015610b1d576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610b2b83850185612808565b90925090506341659aab60e01b6001600160e01b0319831601610b5557610b50611670565b610bb7565b63100597e960e31b6001600160e01b0319831601610b7657610b50816118a8565b63302c6bef60e21b6001600160e01b0319831601610b9757610b5081611a35565b6301c7bbc160e21b6001600160e01b0319831601610bb757610bb7611c2d565b6040517ff0094b59b7bc92e9fc611b14b5d3a34fe02530ac9bcf36c2c6f10147c3030c12905f90a1505061059560018055565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610c1a903390600401612608565b602060405180830381865afa158015610c35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5991906127a4565b610c765760405163ea8e4eb560e01b815260040160405180910390fd5b805f03610ca357600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b60055460405163a9059cbb60e01b81525f916001600160a01b03169063a9059cbb906107b8908690869060040161278b565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610d05903390600401612608565b602060405180830381865afa158015610d20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4491906127a4565b610ca35760405163ea8e4eb560e01b815260040160405180910390fd5b600b8181548110610a91575f80fd5b6003546001600160a01b03163314610d9b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382161580610db857506001600160a01b038116155b15610dd65760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526006602052604080822080546001600160a01b0319169486169485179055515f516020612c1b5f395f51905f529190a35050565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9091906127a4565b8015610f1057506007546004805460408051630a58ce2d60e11b8152905161ffff909416936001600160a01b03909216926314b19c5a9282820192602092908290030181865afa158015610ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0a9190612847565b61ffff16115b15610f6257600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610f4c929190612868565b60405160208183030381529060405290506110a7565b60016007546301000000900460ff166003811115610f8257610f826125da565b03610fcd57600191507f7fd340b8241a93f6a116f506d6171d4f585588564d777e1192babae55184f691600760049054906101000a900460ff16604051602001610f4c929190612868565b60026007546301000000900460ff166003811115610fed57610fed6125da565b0361103857600191507f3f4e50448465d8594e91c1038b22f277808696956455dacacb66f00f4df0b3a2600760049054906101000a900460ff16604051602001610f4c929190612868565b60036007546301000000900460ff166003811115611058576110586125da565b0361109457600191507ff8e110fcda2d74b2e1ced72f8e94b4510c922b70f786fd1064147a762fd812605f604051602001610f4c929190612868565b505060408051602081019091525f808252905b9250929050565b6110b6611614565b6110bf5f611fd0565b565b600354604051633821dad160e21b815233916001600160a01b03169063e0876b44906110f1908490600401612608565b602060405180830381865afa15801561110c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113091906127a4565b61114d5760405163ea8e4eb560e01b815260040160405180910390fd5b815f0361117a57600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b5f816001600160a01b0316631f52692b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db9190612885565b60055460405163a9059cbb60e01b81529192505f916001600160a01b039091169063a9059cbb90611212908590889060040161278b565b6020604051808303815f875af115801561122e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125291906127a4565b905080611272576040516312171d8360e31b815260040160405180910390fd5b50505050565b611280611614565b805f036112ad57600554604051636b30633560e01b81526104a1916001600160a01b031690600401612608565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132191906127a4565b61133e576040516312aecd8160e01b815260040160405180910390fd5b6005546040516323b872dd60e01b8152336004820152306024820152604481018390525f916001600160a01b0316906323b872dd906064016020604051808303815f875af1158015611392573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b691906127a4565b9050806113d6576040516312171d8360e31b815260040160405180910390fd5b600480546040516338b12abb60e21b81529182018490526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611417575f5ffd5b505af1158015611429573d5f5f3e3d5ffd5b505050505050565b600981815481106105a8575f80fd5b6003546001600160a01b0316331461146b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166114925760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526006602052604080822080546001600160a01b0319169055519091905f516020612c1b5f395f51905f52908390a350565b6114d9611614565b8060ff165f036114fc576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561154c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157091906127a4565b61158d576040516312aecd8160e01b815260040160405180910390fd5b6007805460ff909216620100000262ff000019909216919091179055565b5f546001600160a01b031690565b600d8181548110610a91575f80fd5b600a8181548110610a91575f80fd5b6115df611614565b6001600160a01b038116611608575f604051631e4fbdf760e01b81526004016104a19190612608565b61161181611fd0565b50565b3361161d6115ab565b6001600160a01b0316146110bf573360405163118cdaa760e01b81526004016104a19190612608565b60026001540361166957604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f60045f9054906101000a90046001600160a01b03166001600160a01b03166314b19c5a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e59190612847565b6007549091506116fa9061ffff1660016128a0565b61ffff168161ffff16101561170c5750565b6007805461ffff191661ffff831617905561172860095f6124f8565b611733600a5f6124f8565b61173e600c5f6124f8565b611749600d5f6124f8565b611754600b5f6124f8565b61175f600e5f6124f8565b5f600f8190556004805460408051631716e21f60e11b815290516001600160a01b0390921693632e2dc43e938281019391928290030181865afa1580156117a8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117cf91908101906129f4565b60095f600a5f600c5f600d5f600b5f600e5f8c91905090805190602001906117f8929190612513565b50508a5161180b919060208d0190612513565b5050895161181e919060208c0190612513565b50508851611831919060208b019061255c565b50508751611844919060208a0190612513565b505086516118579190602089019061255c565b50506007805463ff0000001916630100000017905550506009545f039250611611915050576007805463ff00000019166302000000179055600c545f0361161157506007805463ff00000019169055565b60016007546301000000900460ff1660038111156118c8576118c86125da565b146118e65760405163baf3f0f760e01b815260040160405180910390fd5b6007805460049061190090600160201b900460ff16612b04565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff16826119349190612b22565b60075460ff91821692505f916119519162010000900416836128a0565b60095490915061ffff8216118061196d575060095461ffff8216145b1561198b57506009546007805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611272575f60098261ffff16815481106119b5576119b5612b45565b5f918252602090912001546005546001600160a01b0391821692501681036119dd5750611a2d565b5f600a8361ffff16815481106119f5576119f5612b45565b905f5260205f2001549050611a2a8282600b8661ffff1681548110611a1c57611a1c612b45565b905f5260205f20015461201f565b50505b60010161198d565b60026007546301000000900460ff166003811115611a5557611a556125da565b14611a735760405163baf3f0f760e01b815260040160405180910390fd5b60078054600490611a8d90600160201b900460ff16612b04565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff1682611ac19190612b22565b60075460ff91821692505f91611ade9162010000900416836128a0565b600c5490915061ffff82161180611afa5750600c5461ffff8216145b15611b185750600c546007805464ffff000000191663030000001790555b815b8161ffff168161ffff161015611bc2575f600c8261ffff1681548110611b4257611b42612b45565b5f918252602090912001546005546001600160a01b039182169250168103611b6a5750611bba565b5f600d8361ffff1681548110611b8257611b82612b45565b905f5260205f2001549050611bb78282600e8661ffff1681548110611ba957611ba9612b45565b905f5260205f2001546121cd565b50505b600101611b1a565b50600c5461ffff8216036108185760048054600f546040516338b12abb60e21b8152928301526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611c12575f5ffd5b505af1158015611c24573d5f5f3e3d5ffd5b50505050505050565b60036007546301000000900460ff166003811115611c4d57611c4d6125da565b14611c6b5760405163baf3f0f760e01b815260040160405180910390fd5b6007805463ff00000019169055600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611ca8908490600401612b59565b5f60405180830381865afa158015611cc2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ce99190810190612b6d565b90505f5b81518161ffff161015611e23575f828261ffff1681518110611d1157611d11612b45565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611d5091869101612608565b602060405180830381865afa158015611d6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8f91906127c3565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611dc391879101612608565b602060405180830381865afa158015611dde573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0291906127c3565b9050611e0f83838361236f565b50505080611e1c90612ba6565b9050611ced565b50600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611e5590600190600401612b59565b5f60405180830381865afa158015611e6f573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e969190810190612b6d565b90505f5b81518161ffff161015610818575f828261ffff1681518110611ebe57611ebe612b45565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611efd91869101612608565b602060405180830381865afa158015611f18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3c91906127c3565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611f7091879101612608565b602060405180830381865afa158015611f8b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611faf91906127c3565b9050611fbc83838361236f565b50505080611fc990612ba6565b9050611e9a565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084165f90815260066020526040902054168061205757604051635048c2af60e11b815260040160405180910390fd5b60405163095ea7b360e01b81526001600160a01b0385169063095ea7b3906120859084905f9060040161278b565b6020604051808303815f875af11580156120a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120c591906127a4565b5060405163095ea7b360e01b81526001600160a01b0385169063095ea7b3906120f4908490879060040161278b565b6020604051808303815f875af1158015612110573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213491906127a4565b50604051636c197ff560e01b81525f906001600160a01b03831690636c197ff590612165908890889060040161278b565b6020604051808303815f875af1158015612181573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121a591906127c3565b90506121b18382612bbd565b600f5f8282546121c19190612bdc565b90915550505050505050565b6001600160a01b038084165f90815260066020526040902054168061220557604051635048c2af60e11b815260040160405180910390fd5b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906122379084905f9060040161278b565b6020604051808303815f875af1158015612253573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227791906127a4565b506005546001600160a01b031663095ea7b382612295856002612c03565b6040518363ffffffff1660e01b81526004016122b292919061278b565b6020604051808303815f875af11580156122ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122f291906127a4565b5060405163cce7ec1360e01b81525f906001600160a01b0383169063cce7ec1390612323908890889060040161278b565b6020604051808303815f875af115801561233f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061236391906127c3565b90506121b18184612bbd565b5f8390505f816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123d491906127c3565b90505f826001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612413573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243791906127c3565b905081156124955760405163e5e9719360e01b8152600481018690526001600160a01b0384169063e5e97193906024015f604051808303815f87803b15801561247e575f5ffd5b505af1158015612490573d5f5f3e3d5ffd5b505050505b80156114295760405163493a6e2160e01b8152600481018590526001600160a01b0384169063493a6e21906024015f604051808303815f87803b1580156124da575f5ffd5b505af11580156124ec573d5f5f3e3d5ffd5b50505050505050505050565b5080545f8255905f5260205f209081019061161191906125af565b828054828255905f5260205f2090810192821561254c579160200282015b8281111561254c578251825591602001919060010190612531565b506125589291506125af565b5090565b828054828255905f5260205f2090810192821561254c579160200282015b8281111561254c57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061257a565b5b80821115612558575f81556001016125b0565b5f602082840312156125d3575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b6020810160048310612602576126026125da565b91905290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611611575f5ffd5b5f60208284031215612640575f5ffd5b813561264b8161261c565b9392505050565b5f5f60208385031215612663575f5ffd5b82356001600160401b03811115612678575f5ffd5b8301601f81018513612688575f5ffd5b80356001600160401b0381111561269d575f5ffd5b8560208284010111156126ae575f5ffd5b6020919091019590945092505050565b5f5f604083850312156126cf575f5ffd5b82356126da8161261c565b946020939093013593505050565b5f5f604083850312156126f9575f5ffd5b82356127048161261c565b915060208301356127148161261c565b809150509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b803560ff8116811461276d575f5ffd5b919050565b5f60208284031215612782575f5ffd5b61264b8261275d565b6001600160a01b03929092168252602082015260400190565b5f602082840312156127b4575f5ffd5b8151801515811461264b575f5ffd5b5f602082840312156127d3575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201612802576128026127da565b505f0390565b5f5f60408385031215612819575f5ffd5b82356001600160e01b031981168114612830575f5ffd5b915061283e6020840161275d565b90509250929050565b5f60208284031215612857575f5ffd5b815161ffff8116811461264b575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b5f60208284031215612895575f5ffd5b815161264b8161261c565b61ffff81811683821601908111156128ba576128ba6127da565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156128fc576128fc6128c0565b604052919050565b5f6001600160401b0382111561291c5761291c6128c0565b5060051b60200190565b5f82601f830112612935575f5ffd5b815161294861294382612904565b6128d4565b8082825260208201915060208360051b860101925085831115612969575f5ffd5b602085015b8381101561298f5780516129818161261c565b83526020928301920161296e565b5095945050505050565b5f82601f8301126129a8575f5ffd5b81516129b661294382612904565b8082825260208201915060208360051b8601019250858311156129d7575f5ffd5b602085015b8381101561298f5780518352602092830192016129dc565b5f5f5f5f5f5f60c08789031215612a09575f5ffd5b86516001600160401b03811115612a1e575f5ffd5b612a2a89828a01612926565b602089015190975090506001600160401b03811115612a47575f5ffd5b612a5389828a01612999565b604089015190965090506001600160401b03811115612a70575f5ffd5b612a7c89828a01612926565b606089015190955090506001600160401b03811115612a99575f5ffd5b612aa589828a01612999565b608089015190945090506001600160401b03811115612ac2575f5ffd5b612ace89828a01612999565b60a089015190935090506001600160401b03811115612aeb575f5ffd5b612af789828a01612999565b9150509295509295509295565b5f60ff821660ff8103612b1957612b196127da565b60010192915050565b60ff8181168382160290811690818114612b3e57612b3e6127da565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b6020810160028310612602576126026125da565b5f60208284031215612b7d575f5ffd5b81516001600160401b03811115612b92575f5ffd5b612b9e84828501612926565b949350505050565b5f61ffff821661ffff8103612b1957612b196127da565b8181035f831280158383131683831282161715612b3e57612b3e6127da565b8082018281125f831280158216821582161715612bfb57612bfb6127da565b505092915050565b80820281158282048414176128ba576128ba6127da56fe2f2727c7b3d9ee55de5c114f0cb7997ac7251a4cbfca4f2b2dc6969d86cce4f4a2646970667358221220861dab4c125f18b95e0ffffd60fd5daf6b6fc6d28a623419745b066b9c7565f364736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b50604051612d1f380380612d1f83398101604081905261002e916101e3565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161017d565b50600180556001600160a01b0382166100915760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b85760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b03841690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa15801561010f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610133919061022d565b600580546001600160a01b03199081166001600160a01b0393841617909155600280549091169290911691909117905550506007805464ffffffffff19166201000017905561024f565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101e0575f5ffd5b50565b5f5f5f606084860312156101f5575f5ffd5b8351610200816101cc565b6020850151909350610211816101cc565b6040850151909250610222816101cc565b809150509250925092565b5f6020828403121561023d575f5ffd5b8151610248816101cc565b9392505050565b612ac38061025c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610194575f3560e01c806301c621c114610198578063055ad42e146101ad57806309f2e19c146101d75780630a861f2a146101f75780630a8b78c71461020a57806314b5d07f1461021d5780633369921a14610230578063348ec5c8146102475780633af2a8c01461025a5780633e765a9e1461026d5780634585e33b146102805780634adfc2e71461029357806351edffb1146102a657806352e899fd146102b95780635488cd62146102cc57806357be01c1146102f257806359017aa9146103055780635dc228a0146103185780636e04ff0d1461032b578063715018a61461034c5780637158da7c14610354578063741fca4b1461036757806376d58e1a1461037a57806379502c551461038d5780638157c1ab146103a0578063841181ef146103b35780638a0b0d38146103c65780638da5cb5b146103d9578063bc504975146103e1578063be1b26a4146103f4578063d3f3506d14610407578063dab26e3b1461042f578063ee6713df14610438578063f2fde38b14610459575b5f5ffd5b6101ab6101a6366004612416565b61046c565b005b6007546101c1906301000000900460ff1681565b6040516101ce9190612441565b60405180910390f35b6101ea6101e5366004612416565b610599565b6040516101ce919061245b565b6101ab610205366004612416565b6105c1565b6101ab610218366004612483565b61081d565b6101ab61022b366004612483565b610898565b610239600f5481565b6040519081526020016101ce565b6004546101ea906001600160a01b031681565b6101ab610268366004612416565b6109a1565b61023961027b366004612416565b610a82565b6101ab61028e3660046124a5565b610aa1565b6101ab6102a1366004612511565b610bea565b6101ab6102b4366004612511565b610cd5565b6102396102c7366004612416565b610d61565b6007546102e090600160201b900460ff1681565b60405160ff90911681526020016101ce565b6007546102e09062010000900460ff1681565b6101ab61031336600461253b565b610d70565b6002546101ea906001600160a01b031681565b61033e6103393660046124a5565b610e19565b6040516101ce929190612572565b6101ab6110ae565b6005546101ea906001600160a01b031681565b6101ab610375366004612416565b6110c1565b6101ab610388366004612416565b611278565b6003546101ea906001600160a01b031681565b6101ea6103ae366004612416565b611431565b6101ab6103c1366004612483565b611440565b6101ab6103d43660046125c5565b6114d1565b6101ea6115ab565b6102396103ef366004612416565b6115b9565b610239610402366004612416565b6115c8565b6101ea610415366004612483565b60066020525f90815260409020546001600160a01b031681565b61023960085481565b6007546104469061ffff1681565b60405161ffff90911681526020016101ce565b6101ab610467366004612483565b6115d7565b610474611614565b805f036104aa57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60405180910390fd5b60048054604051637060444560e01b81529182018390526001600160a01b0316906370604445906024015f604051808303815f87803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb9061053590339086906004016125de565b6020604051808303815f875af1158015610551573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057591906125f7565b905080610595576040516312171d8360e31b815260040160405180910390fd5b5050565b600c81815481106105a8575f80fd5b5f918252602090912001546001600160a01b0316905081565b6105c9611614565b805f036105f657600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a91906125f7565b610687576040516312aecd8160e01b815260040160405180910390fd5b5f60045f9054906101000a90046001600160a01b03166001600160a01b031663c18e2a5c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fc9190612616565b90508082111561071f57604051632ca2f52b60e11b815260040160405180910390fd5b6004546001600160a01b031663e2c4aaec61073984612641565b6040518263ffffffff1660e01b815260040161075791815260200190565b5f604051808303815f87803b15801561076e575f5ffd5b505af1158015610780573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906107b890339087906004016125de565b6020604051808303815f875af11580156107d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f891906125f7565b905080610818576040516312171d8360e31b815260040160405180910390fd5b505050565b610825611614565b6001600160a01b03811661084c5760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561087657604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6108a0611614565b6001600160a01b0381166108c75760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b91906125f7565b610958576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b6109a9611614565b805f036109c9576040516317dbc4cb60e21b815260040160405180910390fd5b6101f48111156109ec576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6091906125f7565b610a7d576040516312aecd8160e01b815260040160405180910390fd5b600855565b600e8181548110610a91575f80fd5b5f91825260209091200154905081565b610aa96115ab565b6001600160a01b0316336001600160a01b031614158015610ad557506002546001600160a01b03163314155b15610af35760405163ea8e4eb560e01b815260040160405180910390fd5b610afb611646565b6005811015610b1d576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610b2b8385018561265b565b90925090506341659aab60e01b6001600160e01b0319831601610b5557610b50611670565b610bb7565b63100597e960e31b6001600160e01b0319831601610b7657610b50816118a8565b63302c6bef60e21b6001600160e01b0319831601610b9757610b5081611a35565b6301c7bbc160e21b6001600160e01b0319831601610bb757610bb7611c2d565b6040517ff0094b59b7bc92e9fc611b14b5d3a34fe02530ac9bcf36c2c6f10147c3030c12905f90a1505061059560018055565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610c1a90339060040161245b565b602060405180830381865afa158015610c35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5991906125f7565b610c765760405163ea8e4eb560e01b815260040160405180910390fd5b805f03610ca357600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60055460405163a9059cbb60e01b81525f916001600160a01b03169063a9059cbb906107b890869086906004016125de565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610d0590339060040161245b565b602060405180830381865afa158015610d20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4491906125f7565b610ca35760405163ea8e4eb560e01b815260040160405180910390fd5b600b8181548110610a91575f80fd5b6003546001600160a01b03163314610d9b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382161580610db857506001600160a01b038116155b15610dd65760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526006602052604080822080546001600160a01b0319169486169485179055515f516020612a6e5f395f51905f529190a35050565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9091906125f7565b8015610f1057506007546004805460408051630a58ce2d60e11b8152905161ffff909416936001600160a01b03909216926314b19c5a9282820192602092908290030181865afa158015610ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0a919061269a565b61ffff16115b15610f6257600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610f4c9291906126bb565b60405160208183030381529060405290506110a7565b60016007546301000000900460ff166003811115610f8257610f8261242d565b03610fcd57600191507f7fd340b8241a93f6a116f506d6171d4f585588564d777e1192babae55184f691600760049054906101000a900460ff16604051602001610f4c9291906126bb565b60026007546301000000900460ff166003811115610fed57610fed61242d565b0361103857600191507f3f4e50448465d8594e91c1038b22f277808696956455dacacb66f00f4df0b3a2600760049054906101000a900460ff16604051602001610f4c9291906126bb565b60036007546301000000900460ff1660038111156110585761105861242d565b0361109457600191507ff8e110fcda2d74b2e1ced72f8e94b4510c922b70f786fd1064147a762fd812605f604051602001610f4c9291906126bb565b505060408051602081019091525f808252905b9250929050565b6110b6611614565b6110bf5f611e23565b565b600354604051633821dad160e21b815233916001600160a01b03169063e0876b44906110f190849060040161245b565b602060405180830381865afa15801561110c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113091906125f7565b61114d5760405163ea8e4eb560e01b815260040160405180910390fd5b815f0361117a57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b5f816001600160a01b0316631f52692b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db91906126d8565b60055460405163a9059cbb60e01b81529192505f916001600160a01b039091169063a9059cbb9061121290859088906004016125de565b6020604051808303815f875af115801561122e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125291906125f7565b905080611272576040516312171d8360e31b815260040160405180910390fd5b50505050565b611280611614565b805f036112ad57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132191906125f7565b61133e576040516312aecd8160e01b815260040160405180910390fd5b6005546040516323b872dd60e01b8152336004820152306024820152604481018390525f916001600160a01b0316906323b872dd906064016020604051808303815f875af1158015611392573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b691906125f7565b9050806113d6576040516312171d8360e31b815260040160405180910390fd5b600480546040516338b12abb60e21b81529182018490526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611417575f5ffd5b505af1158015611429573d5f5f3e3d5ffd5b505050505050565b600981815481106105a8575f80fd5b6003546001600160a01b0316331461146b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166114925760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526006602052604080822080546001600160a01b0319169055519091905f516020612a6e5f395f51905f52908390a350565b6114d9611614565b8060ff165f036114fc576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561154c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157091906125f7565b61158d576040516312aecd8160e01b815260040160405180910390fd5b6007805460ff909216620100000262ff000019909216919091179055565b5f546001600160a01b031690565b600d8181548110610a91575f80fd5b600a8181548110610a91575f80fd5b6115df611614565b6001600160a01b038116611608575f604051631e4fbdf760e01b81526004016104a1919061245b565b61161181611e23565b50565b3361161d6115ab565b6001600160a01b0316146110bf573360405163118cdaa760e01b81526004016104a1919061245b565b60026001540361166957604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f60045f9054906101000a90046001600160a01b03166001600160a01b03166314b19c5a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e5919061269a565b6007549091506116fa9061ffff1660016126f3565b61ffff168161ffff16101561170c5750565b6007805461ffff191661ffff831617905561172860095f61234b565b611733600a5f61234b565b61173e600c5f61234b565b611749600d5f61234b565b611754600b5f61234b565b61175f600e5f61234b565b5f600f8190556004805460408051631716e21f60e11b815290516001600160a01b0390921693632e2dc43e938281019391928290030181865afa1580156117a8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117cf9190810190612847565b60095f600a5f600c5f600d5f600b5f600e5f8c91905090805190602001906117f8929190612366565b50508a5161180b919060208d0190612366565b5050895161181e919060208c0190612366565b50508851611831919060208b01906123af565b50508751611844919060208a0190612366565b50508651611857919060208901906123af565b50506007805463ff0000001916630100000017905550506009545f039250611611915050576007805463ff00000019166302000000179055600c545f0361161157506007805463ff00000019169055565b60016007546301000000900460ff1660038111156118c8576118c861242d565b146118e65760405163baf3f0f760e01b815260040160405180910390fd5b6007805460049061190090600160201b900460ff16612957565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff16826119349190612975565b60075460ff91821692505f916119519162010000900416836126f3565b60095490915061ffff8216118061196d575060095461ffff8216145b1561198b57506009546007805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611272575f60098261ffff16815481106119b5576119b5612998565b5f918252602090912001546005546001600160a01b0391821692501681036119dd5750611a2d565b5f600a8361ffff16815481106119f5576119f5612998565b905f5260205f2001549050611a2a8282600b8661ffff1681548110611a1c57611a1c612998565b905f5260205f200154611e72565b50505b60010161198d565b60026007546301000000900460ff166003811115611a5557611a5561242d565b14611a735760405163baf3f0f760e01b815260040160405180910390fd5b60078054600490611a8d90600160201b900460ff16612957565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff1682611ac19190612975565b60075460ff91821692505f91611ade9162010000900416836126f3565b600c5490915061ffff82161180611afa5750600c5461ffff8216145b15611b185750600c546007805464ffff000000191663030000001790555b815b8161ffff168161ffff161015611bc2575f600c8261ffff1681548110611b4257611b42612998565b5f918252602090912001546005546001600160a01b039182169250168103611b6a5750611bba565b5f600d8361ffff1681548110611b8257611b82612998565b905f5260205f2001549050611bb78282600e8661ffff1681548110611ba957611ba9612998565b905f5260205f200154612020565b50505b600101611b1a565b50600c5461ffff8216036108185760048054600f546040516338b12abb60e21b8152928301526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611c12575f5ffd5b505af1158015611c24573d5f5f3e3d5ffd5b50505050505050565b60036007546301000000900460ff166003811115611c4d57611c4d61242d565b14611c6b5760405163baf3f0f760e01b815260040160405180910390fd5b6007805463ff00000019169055600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611ca89084906004016129ac565b5f60405180830381865afa158015611cc2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ce991908101906129c0565b90505f5b81518161ffff161015610595575f828261ffff1681518110611d1157611d11612998565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611d509186910161245b565b602060405180830381865afa158015611d6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612616565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611dc39187910161245b565b602060405180830381865afa158015611dde573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e029190612616565b9050611e0f8383836121c2565b50505080611e1c906129f9565b9050611ced565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084165f908152600660205260409020541680611eaa57604051635048c2af60e11b815260040160405180910390fd5b60405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611ed89084905f906004016125de565b6020604051808303815f875af1158015611ef4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1891906125f7565b5060405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611f4790849087906004016125de565b6020604051808303815f875af1158015611f63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8791906125f7565b50604051636c197ff560e01b81525f906001600160a01b03831690636c197ff590611fb890889088906004016125de565b6020604051808303815f875af1158015611fd4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff89190612616565b90506120048382612a10565b600f5f8282546120149190612a2f565b90915550505050505050565b6001600160a01b038084165f90815260066020526040902054168061205857604051635048c2af60e11b815260040160405180910390fd5b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061208a9084905f906004016125de565b6020604051808303815f875af11580156120a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ca91906125f7565b506005546001600160a01b031663095ea7b3826120e8856002612a56565b6040518363ffffffff1660e01b81526004016121059291906125de565b6020604051808303815f875af1158015612121573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214591906125f7565b5060405163cce7ec1360e01b81525f906001600160a01b0383169063cce7ec139061217690889088906004016125de565b6020604051808303815f875af1158015612192573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b69190612616565b90506120048184612a10565b5f8390505f816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122279190612616565b90505f826001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612266573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228a9190612616565b905081156122e85760405163e5e9719360e01b8152600481018690526001600160a01b0384169063e5e97193906024015f604051808303815f87803b1580156122d1575f5ffd5b505af11580156122e3573d5f5f3e3d5ffd5b505050505b80156114295760405163493a6e2160e01b8152600481018590526001600160a01b0384169063493a6e21906024015f604051808303815f87803b15801561232d575f5ffd5b505af115801561233f573d5f5f3e3d5ffd5b50505050505050505050565b5080545f8255905f5260205f20908101906116119190612402565b828054828255905f5260205f2090810192821561239f579160200282015b8281111561239f578251825591602001919060010190612384565b506123ab929150612402565b5090565b828054828255905f5260205f2090810192821561239f579160200282015b8281111561239f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906123cd565b5b808211156123ab575f8155600101612403565b5f60208284031215612426575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106124555761245561242d565b91905290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611611575f5ffd5b5f60208284031215612493575f5ffd5b813561249e8161246f565b9392505050565b5f5f602083850312156124b6575f5ffd5b82356001600160401b038111156124cb575f5ffd5b8301601f810185136124db575f5ffd5b80356001600160401b038111156124f0575f5ffd5b856020828401011115612501575f5ffd5b6020919091019590945092505050565b5f5f60408385031215612522575f5ffd5b823561252d8161246f565b946020939093013593505050565b5f5f6040838503121561254c575f5ffd5b82356125578161246f565b915060208301356125678161246f565b809150509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b803560ff811681146125c0575f5ffd5b919050565b5f602082840312156125d5575f5ffd5b61249e826125b0565b6001600160a01b03929092168252602082015260400190565b5f60208284031215612607575f5ffd5b8151801515811461249e575f5ffd5b5f60208284031215612626575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b82016126555761265561262d565b505f0390565b5f5f6040838503121561266c575f5ffd5b82356001600160e01b031981168114612683575f5ffd5b9150612691602084016125b0565b90509250929050565b5f602082840312156126aa575f5ffd5b815161ffff8116811461249e575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b5f602082840312156126e8575f5ffd5b815161249e8161246f565b61ffff818116838216019081111561270d5761270d61262d565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561274f5761274f612713565b604052919050565b5f6001600160401b0382111561276f5761276f612713565b5060051b60200190565b5f82601f830112612788575f5ffd5b815161279b61279682612757565b612727565b8082825260208201915060208360051b8601019250858311156127bc575f5ffd5b602085015b838110156127e25780516127d48161246f565b8352602092830192016127c1565b5095945050505050565b5f82601f8301126127fb575f5ffd5b815161280961279682612757565b8082825260208201915060208360051b86010192508583111561282a575f5ffd5b602085015b838110156127e257805183526020928301920161282f565b5f5f5f5f5f5f60c0878903121561285c575f5ffd5b86516001600160401b03811115612871575f5ffd5b61287d89828a01612779565b602089015190975090506001600160401b0381111561289a575f5ffd5b6128a689828a016127ec565b604089015190965090506001600160401b038111156128c3575f5ffd5b6128cf89828a01612779565b606089015190955090506001600160401b038111156128ec575f5ffd5b6128f889828a016127ec565b608089015190945090506001600160401b03811115612915575f5ffd5b61292189828a016127ec565b60a089015190935090506001600160401b0381111561293e575f5ffd5b61294a89828a016127ec565b9150509295509295509295565b5f60ff821660ff810361296c5761296c61262d565b60010192915050565b60ff81811683821602908116908181146129915761299161262d565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b60208101600283106124555761245561242d565b5f602082840312156129d0575f5ffd5b81516001600160401b038111156129e5575f5ffd5b6129f184828501612779565b949350505050565b5f61ffff821661ffff810361296c5761296c61262d565b8181035f8312801583831316838312821617156129915761299161262d565b8082018281125f831280158216821582161715612a4e57612a4e61262d565b505092915050565b808202811582820484141761270d5761270d61262d56fe2f2727c7b3d9ee55de5c114f0cb7997ac7251a4cbfca4f2b2dc6969d86cce4f4a2646970667358221220f4b8e0cc8055d112aa2130513aff423d3c0ddfd6da749b78d53afa30c24b6b2864736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610194575f3560e01c806301c621c114610198578063055ad42e146101ad57806309f2e19c146101d75780630a861f2a146101f75780630a8b78c71461020a57806314b5d07f1461021d5780633369921a14610230578063348ec5c8146102475780633af2a8c01461025a5780633e765a9e1461026d5780634585e33b146102805780634adfc2e71461029357806351edffb1146102a657806352e899fd146102b95780635488cd62146102cc57806357be01c1146102f257806359017aa9146103055780635dc228a0146103185780636e04ff0d1461032b578063715018a61461034c5780637158da7c14610354578063741fca4b1461036757806376d58e1a1461037a57806379502c551461038d5780638157c1ab146103a0578063841181ef146103b35780638a0b0d38146103c65780638da5cb5b146103d9578063bc504975146103e1578063be1b26a4146103f4578063d3f3506d14610407578063dab26e3b1461042f578063ee6713df14610438578063f2fde38b14610459575b5f5ffd5b6101ab6101a6366004612416565b61046c565b005b6007546101c1906301000000900460ff1681565b6040516101ce9190612441565b60405180910390f35b6101ea6101e5366004612416565b610599565b6040516101ce919061245b565b6101ab610205366004612416565b6105c1565b6101ab610218366004612483565b61081d565b6101ab61022b366004612483565b610898565b610239600f5481565b6040519081526020016101ce565b6004546101ea906001600160a01b031681565b6101ab610268366004612416565b6109a1565b61023961027b366004612416565b610a82565b6101ab61028e3660046124a5565b610aa1565b6101ab6102a1366004612511565b610bea565b6101ab6102b4366004612511565b610cd5565b6102396102c7366004612416565b610d61565b6007546102e090600160201b900460ff1681565b60405160ff90911681526020016101ce565b6007546102e09062010000900460ff1681565b6101ab61031336600461253b565b610d70565b6002546101ea906001600160a01b031681565b61033e6103393660046124a5565b610e19565b6040516101ce929190612572565b6101ab6110ae565b6005546101ea906001600160a01b031681565b6101ab610375366004612416565b6110c1565b6101ab610388366004612416565b611278565b6003546101ea906001600160a01b031681565b6101ea6103ae366004612416565b611431565b6101ab6103c1366004612483565b611440565b6101ab6103d43660046125c5565b6114d1565b6101ea6115ab565b6102396103ef366004612416565b6115b9565b610239610402366004612416565b6115c8565b6101ea610415366004612483565b60066020525f90815260409020546001600160a01b031681565b61023960085481565b6007546104469061ffff1681565b60405161ffff90911681526020016101ce565b6101ab610467366004612483565b6115d7565b610474611614565b805f036104aa57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60405180910390fd5b60048054604051637060444560e01b81529182018390526001600160a01b0316906370604445906024015f604051808303815f87803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb9061053590339086906004016125de565b6020604051808303815f875af1158015610551573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057591906125f7565b905080610595576040516312171d8360e31b815260040160405180910390fd5b5050565b600c81815481106105a8575f80fd5b5f918252602090912001546001600160a01b0316905081565b6105c9611614565b805f036105f657600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a91906125f7565b610687576040516312aecd8160e01b815260040160405180910390fd5b5f60045f9054906101000a90046001600160a01b03166001600160a01b031663c18e2a5c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fc9190612616565b90508082111561071f57604051632ca2f52b60e11b815260040160405180910390fd5b6004546001600160a01b031663e2c4aaec61073984612641565b6040518263ffffffff1660e01b815260040161075791815260200190565b5f604051808303815f87803b15801561076e575f5ffd5b505af1158015610780573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906107b890339087906004016125de565b6020604051808303815f875af11580156107d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f891906125f7565b905080610818576040516312171d8360e31b815260040160405180910390fd5b505050565b610825611614565b6001600160a01b03811661084c5760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561087657604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6108a0611614565b6001600160a01b0381166108c75760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b91906125f7565b610958576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b6109a9611614565b805f036109c9576040516317dbc4cb60e21b815260040160405180910390fd5b6101f48111156109ec576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6091906125f7565b610a7d576040516312aecd8160e01b815260040160405180910390fd5b600855565b600e8181548110610a91575f80fd5b5f91825260209091200154905081565b610aa96115ab565b6001600160a01b0316336001600160a01b031614158015610ad557506002546001600160a01b03163314155b15610af35760405163ea8e4eb560e01b815260040160405180910390fd5b610afb611646565b6005811015610b1d576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610b2b8385018561265b565b90925090506341659aab60e01b6001600160e01b0319831601610b5557610b50611670565b610bb7565b63100597e960e31b6001600160e01b0319831601610b7657610b50816118a8565b63302c6bef60e21b6001600160e01b0319831601610b9757610b5081611a35565b6301c7bbc160e21b6001600160e01b0319831601610bb757610bb7611c2d565b6040517ff0094b59b7bc92e9fc611b14b5d3a34fe02530ac9bcf36c2c6f10147c3030c12905f90a1505061059560018055565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610c1a90339060040161245b565b602060405180830381865afa158015610c35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5991906125f7565b610c765760405163ea8e4eb560e01b815260040160405180910390fd5b805f03610ca357600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60055460405163a9059cbb60e01b81525f916001600160a01b03169063a9059cbb906107b890869086906004016125de565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610d0590339060040161245b565b602060405180830381865afa158015610d20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4491906125f7565b610ca35760405163ea8e4eb560e01b815260040160405180910390fd5b600b8181548110610a91575f80fd5b6003546001600160a01b03163314610d9b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382161580610db857506001600160a01b038116155b15610dd65760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526006602052604080822080546001600160a01b0319169486169485179055515f516020612a6e5f395f51905f529190a35050565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9091906125f7565b8015610f1057506007546004805460408051630a58ce2d60e11b8152905161ffff909416936001600160a01b03909216926314b19c5a9282820192602092908290030181865afa158015610ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0a919061269a565b61ffff16115b15610f6257600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610f4c9291906126bb565b60405160208183030381529060405290506110a7565b60016007546301000000900460ff166003811115610f8257610f8261242d565b03610fcd57600191507f7fd340b8241a93f6a116f506d6171d4f585588564d777e1192babae55184f691600760049054906101000a900460ff16604051602001610f4c9291906126bb565b60026007546301000000900460ff166003811115610fed57610fed61242d565b0361103857600191507f3f4e50448465d8594e91c1038b22f277808696956455dacacb66f00f4df0b3a2600760049054906101000a900460ff16604051602001610f4c9291906126bb565b60036007546301000000900460ff1660038111156110585761105861242d565b0361109457600191507ff8e110fcda2d74b2e1ced72f8e94b4510c922b70f786fd1064147a762fd812605f604051602001610f4c9291906126bb565b505060408051602081019091525f808252905b9250929050565b6110b6611614565b6110bf5f611e23565b565b600354604051633821dad160e21b815233916001600160a01b03169063e0876b44906110f190849060040161245b565b602060405180830381865afa15801561110c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113091906125f7565b61114d5760405163ea8e4eb560e01b815260040160405180910390fd5b815f0361117a57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b5f816001600160a01b0316631f52692b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db91906126d8565b60055460405163a9059cbb60e01b81529192505f916001600160a01b039091169063a9059cbb9061121290859088906004016125de565b6020604051808303815f875af115801561122e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125291906125f7565b905080611272576040516312171d8360e31b815260040160405180910390fd5b50505050565b611280611614565b805f036112ad57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132191906125f7565b61133e576040516312aecd8160e01b815260040160405180910390fd5b6005546040516323b872dd60e01b8152336004820152306024820152604481018390525f916001600160a01b0316906323b872dd906064016020604051808303815f875af1158015611392573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b691906125f7565b9050806113d6576040516312171d8360e31b815260040160405180910390fd5b600480546040516338b12abb60e21b81529182018490526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611417575f5ffd5b505af1158015611429573d5f5f3e3d5ffd5b505050505050565b600981815481106105a8575f80fd5b6003546001600160a01b0316331461146b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166114925760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526006602052604080822080546001600160a01b0319169055519091905f516020612a6e5f395f51905f52908390a350565b6114d9611614565b8060ff165f036114fc576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561154c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157091906125f7565b61158d576040516312aecd8160e01b815260040160405180910390fd5b6007805460ff909216620100000262ff000019909216919091179055565b5f546001600160a01b031690565b600d8181548110610a91575f80fd5b600a8181548110610a91575f80fd5b6115df611614565b6001600160a01b038116611608575f604051631e4fbdf760e01b81526004016104a1919061245b565b61161181611e23565b50565b3361161d6115ab565b6001600160a01b0316146110bf573360405163118cdaa760e01b81526004016104a1919061245b565b60026001540361166957604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f60045f9054906101000a90046001600160a01b03166001600160a01b03166314b19c5a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e5919061269a565b6007549091506116fa9061ffff1660016126f3565b61ffff168161ffff16101561170c5750565b6007805461ffff191661ffff831617905561172860095f61234b565b611733600a5f61234b565b61173e600c5f61234b565b611749600d5f61234b565b611754600b5f61234b565b61175f600e5f61234b565b5f600f8190556004805460408051631716e21f60e11b815290516001600160a01b0390921693632e2dc43e938281019391928290030181865afa1580156117a8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117cf9190810190612847565b60095f600a5f600c5f600d5f600b5f600e5f8c91905090805190602001906117f8929190612366565b50508a5161180b919060208d0190612366565b5050895161181e919060208c0190612366565b50508851611831919060208b01906123af565b50508751611844919060208a0190612366565b50508651611857919060208901906123af565b50506007805463ff0000001916630100000017905550506009545f039250611611915050576007805463ff00000019166302000000179055600c545f0361161157506007805463ff00000019169055565b60016007546301000000900460ff1660038111156118c8576118c861242d565b146118e65760405163baf3f0f760e01b815260040160405180910390fd5b6007805460049061190090600160201b900460ff16612957565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff16826119349190612975565b60075460ff91821692505f916119519162010000900416836126f3565b60095490915061ffff8216118061196d575060095461ffff8216145b1561198b57506009546007805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611272575f60098261ffff16815481106119b5576119b5612998565b5f918252602090912001546005546001600160a01b0391821692501681036119dd5750611a2d565b5f600a8361ffff16815481106119f5576119f5612998565b905f5260205f2001549050611a2a8282600b8661ffff1681548110611a1c57611a1c612998565b905f5260205f200154611e72565b50505b60010161198d565b60026007546301000000900460ff166003811115611a5557611a5561242d565b14611a735760405163baf3f0f760e01b815260040160405180910390fd5b60078054600490611a8d90600160201b900460ff16612957565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff1682611ac19190612975565b60075460ff91821692505f91611ade9162010000900416836126f3565b600c5490915061ffff82161180611afa5750600c5461ffff8216145b15611b185750600c546007805464ffff000000191663030000001790555b815b8161ffff168161ffff161015611bc2575f600c8261ffff1681548110611b4257611b42612998565b5f918252602090912001546005546001600160a01b039182169250168103611b6a5750611bba565b5f600d8361ffff1681548110611b8257611b82612998565b905f5260205f2001549050611bb78282600e8661ffff1681548110611ba957611ba9612998565b905f5260205f200154612020565b50505b600101611b1a565b50600c5461ffff8216036108185760048054600f546040516338b12abb60e21b8152928301526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611c12575f5ffd5b505af1158015611c24573d5f5f3e3d5ffd5b50505050505050565b60036007546301000000900460ff166003811115611c4d57611c4d61242d565b14611c6b5760405163baf3f0f760e01b815260040160405180910390fd5b6007805463ff00000019169055600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611ca89084906004016129ac565b5f60405180830381865afa158015611cc2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ce991908101906129c0565b90505f5b81518161ffff161015610595575f828261ffff1681518110611d1157611d11612998565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611d509186910161245b565b602060405180830381865afa158015611d6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612616565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611dc39187910161245b565b602060405180830381865afa158015611dde573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e029190612616565b9050611e0f8383836121c2565b50505080611e1c906129f9565b9050611ced565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084165f908152600660205260409020541680611eaa57604051635048c2af60e11b815260040160405180910390fd5b60405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611ed89084905f906004016125de565b6020604051808303815f875af1158015611ef4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1891906125f7565b5060405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611f4790849087906004016125de565b6020604051808303815f875af1158015611f63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8791906125f7565b50604051636c197ff560e01b81525f906001600160a01b03831690636c197ff590611fb890889088906004016125de565b6020604051808303815f875af1158015611fd4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff89190612616565b90506120048382612a10565b600f5f8282546120149190612a2f565b90915550505050505050565b6001600160a01b038084165f90815260066020526040902054168061205857604051635048c2af60e11b815260040160405180910390fd5b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061208a9084905f906004016125de565b6020604051808303815f875af11580156120a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ca91906125f7565b506005546001600160a01b031663095ea7b3826120e8856002612a56565b6040518363ffffffff1660e01b81526004016121059291906125de565b6020604051808303815f875af1158015612121573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214591906125f7565b5060405163cce7ec1360e01b81525f906001600160a01b0383169063cce7ec139061217690889088906004016125de565b6020604051808303815f875af1158015612192573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b69190612616565b90506120048184612a10565b5f8390505f816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122279190612616565b90505f826001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612266573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228a9190612616565b905081156122e85760405163e5e9719360e01b8152600481018690526001600160a01b0384169063e5e97193906024015f604051808303815f87803b1580156122d1575f5ffd5b505af11580156122e3573d5f5f3e3d5ffd5b505050505b80156114295760405163493a6e2160e01b8152600481018590526001600160a01b0384169063493a6e21906024015f604051808303815f87803b15801561232d575f5ffd5b505af115801561233f573d5f5f3e3d5ffd5b50505050505050505050565b5080545f8255905f5260205f20908101906116119190612402565b828054828255905f5260205f2090810192821561239f579160200282015b8281111561239f578251825591602001919060010190612384565b506123ab929150612402565b5090565b828054828255905f5260205f2090810192821561239f579160200282015b8281111561239f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906123cd565b5b808211156123ab575f8155600101612403565b5f60208284031215612426575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106124555761245561242d565b91905290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611611575f5ffd5b5f60208284031215612493575f5ffd5b813561249e8161246f565b9392505050565b5f5f602083850312156124b6575f5ffd5b82356001600160401b038111156124cb575f5ffd5b8301601f810185136124db575f5ffd5b80356001600160401b038111156124f0575f5ffd5b856020828401011115612501575f5ffd5b6020919091019590945092505050565b5f5f60408385031215612522575f5ffd5b823561252d8161246f565b946020939093013593505050565b5f5f6040838503121561254c575f5ffd5b82356125578161246f565b915060208301356125678161246f565b809150509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b803560ff811681146125c0575f5ffd5b919050565b5f602082840312156125d5575f5ffd5b61249e826125b0565b6001600160a01b03929092168252602082015260400190565b5f60208284031215612607575f5ffd5b8151801515811461249e575f5ffd5b5f60208284031215612626575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b82016126555761265561262d565b505f0390565b5f5f6040838503121561266c575f5ffd5b82356001600160e01b031981168114612683575f5ffd5b9150612691602084016125b0565b90509250929050565b5f602082840312156126aa575f5ffd5b815161ffff8116811461249e575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b5f602082840312156126e8575f5ffd5b815161249e8161246f565b61ffff818116838216019081111561270d5761270d61262d565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561274f5761274f612713565b604052919050565b5f6001600160401b0382111561276f5761276f612713565b5060051b60200190565b5f82601f830112612788575f5ffd5b815161279b61279682612757565b612727565b8082825260208201915060208360051b8601019250858311156127bc575f5ffd5b602085015b838110156127e25780516127d48161246f565b8352602092830192016127c1565b5095945050505050565b5f82601f8301126127fb575f5ffd5b815161280961279682612757565b8082825260208201915060208360051b86010192508583111561282a575f5ffd5b602085015b838110156127e257805183526020928301920161282f565b5f5f5f5f5f5f60c0878903121561285c575f5ffd5b86516001600160401b03811115612871575f5ffd5b61287d89828a01612779565b602089015190975090506001600160401b0381111561289a575f5ffd5b6128a689828a016127ec565b604089015190965090506001600160401b038111156128c3575f5ffd5b6128cf89828a01612779565b606089015190955090506001600160401b038111156128ec575f5ffd5b6128f889828a016127ec565b608089015190945090506001600160401b03811115612915575f5ffd5b61292189828a016127ec565b60a089015190935090506001600160401b0381111561293e575f5ffd5b61294a89828a016127ec565b9150509295509295509295565b5f60ff821660ff810361296c5761296c61262d565b60010192915050565b60ff81811683821602908116908181146129915761299161262d565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b60208101600283106124555761245561242d565b5f602082840312156129d0575f5ffd5b81516001600160401b038111156129e5575f5ffd5b6129f184828501612779565b949350505050565b5f61ffff821661ffff810361296c5761296c61262d565b8181035f8312801583831316838312821617156129915761299161262d565b8082018281125f831280158216821582161715612a4e57612a4e61262d565b505092915050565b808202811582820484141761270d5761270d61262d56fe2f2727c7b3d9ee55de5c114f0cb7997ac7251a4cbfca4f2b2dc6969d86cce4f4a2646970667358221220f4b8e0cc8055d112aa2130513aff423d3c0ddfd6da749b78d53afa30c24b6b2864736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/price/OrionAssetERC4626PriceAdapter.sol/OrionAssetERC4626PriceAdapter.json b/artifacts/contracts/price/OrionAssetERC4626PriceAdapter.sol/OrionAssetERC4626PriceAdapter.json index c06cb385..37f861c8 100644 --- a/artifacts/contracts/price/OrionAssetERC4626PriceAdapter.sol/OrionAssetERC4626PriceAdapter.json +++ b/artifacts/contracts/price/OrionAssetERC4626PriceAdapter.sol/OrionAssetERC4626PriceAdapter.json @@ -88,8 +88,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b5060405161061638038061061683398101604081905261002e91610182565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa1580156100ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100cf9190610182565b600180546001600160a01b0319166001600160a01b039290921691821790556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015610127573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014b91906101a4565b600160146101000a81548160ff021916908360ff160217905550506101c4565b6001600160a01b038116811461017f575f5ffd5b50565b5f60208284031215610192575f5ffd5b815161019d8161016b565b9392505050565b5f602082840312156101b4575f5ffd5b815160ff8116811461019d575f5ffd5b610445806101d15f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80637158da7c1461004e57806372279ba11461007e57806379502c55146100a85780639a32c207146100ba575b5f5ffd5b600154610061906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61009161008c366004610294565b6100e0565b6040805192835260ff909116602083015201610075565b5f54610061906001600160a01b031681565b6001546100ce90600160a01b900460ff1681565b60405160ff9091168152602001610075565b5f5f826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561013c575060408051601f3d908101601f19168201909252610139918101906102b6565b60015b6101595760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101875760405163e6c4247b60e01b815260040160405180910390fd5b505f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e991906102d1565b90505f6101f782600a6103ea565b6040516303d1689d60e11b8152600481018290529091505f906001600160a01b038716906307a2d13a90602401602060405180830381865afa15801561023f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026391906103f8565b6001549097600160a01b90910460ff169650945050505050565b6001600160a01b0381168114610291575f5ffd5b50565b5f602082840312156102a4575f5ffd5b81356102af8161027d565b9392505050565b5f602082840312156102c6575f5ffd5b81516102af8161027d565b5f602082840312156102e1575f5ffd5b815160ff811681146102af575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561034057808504811115610324576103246102f1565b600184161561033257908102905b60019390931c928002610309565b935093915050565b5f82610356575060016103e4565b8161036257505f6103e4565b816001811461037857600281146103825761039e565b60019150506103e4565b60ff841115610393576103936102f1565b50506001821b6103e4565b5060208310610133831016604e8410600b84101617156103c1575081810a6103e4565b6103cd5f198484610305565b805f19048211156103e0576103e06102f1565b0290505b92915050565b5f6102af60ff841683610348565b5f60208284031215610408575f5ffd5b505191905056fea2646970667358221220cab4eb787b8691030a056b90177d9eae07a042ad872efc9278aa32156bfb543764736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80637158da7c1461004e57806372279ba11461007e57806379502c55146100a85780639a32c207146100ba575b5f5ffd5b600154610061906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61009161008c366004610294565b6100e0565b6040805192835260ff909116602083015201610075565b5f54610061906001600160a01b031681565b6001546100ce90600160a01b900460ff1681565b60405160ff9091168152602001610075565b5f5f826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561013c575060408051601f3d908101601f19168201909252610139918101906102b6565b60015b6101595760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101875760405163e6c4247b60e01b815260040160405180910390fd5b505f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e991906102d1565b90505f6101f782600a6103ea565b6040516303d1689d60e11b8152600481018290529091505f906001600160a01b038716906307a2d13a90602401602060405180830381865afa15801561023f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026391906103f8565b6001549097600160a01b90910460ff169650945050505050565b6001600160a01b0381168114610291575f5ffd5b50565b5f602082840312156102a4575f5ffd5b81356102af8161027d565b9392505050565b5f602082840312156102c6575f5ffd5b81516102af8161027d565b5f602082840312156102e1575f5ffd5b815160ff811681146102af575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561034057808504811115610324576103246102f1565b600184161561033257908102905b60019390931c928002610309565b935093915050565b5f82610356575060016103e4565b8161036257505f6103e4565b816001811461037857600281146103825761039e565b60019150506103e4565b60ff841115610393576103936102f1565b50506001821b6103e4565b5060208310610133831016604e8410600b84101617156103c1575081810a6103e4565b6103cd5f198484610305565b805f19048211156103e0576103e06102f1565b0290505b92915050565b5f6102af60ff841683610348565b5f60208284031215610408575f5ffd5b505191905056fea2646970667358221220cab4eb787b8691030a056b90177d9eae07a042ad872efc9278aa32156bfb543764736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b5060405161061638038061061683398101604081905261002e91610182565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa1580156100ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100cf9190610182565b600180546001600160a01b0319166001600160a01b039290921691821790556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015610127573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014b91906101a4565b600160146101000a81548160ff021916908360ff160217905550506101c4565b6001600160a01b038116811461017f575f5ffd5b50565b5f60208284031215610192575f5ffd5b815161019d8161016b565b9392505050565b5f602082840312156101b4575f5ffd5b815160ff8116811461019d575f5ffd5b610445806101d15f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80637158da7c1461004e57806372279ba11461007e57806379502c55146100a85780639a32c207146100ba575b5f5ffd5b600154610061906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61009161008c366004610294565b6100e0565b6040805192835260ff909116602083015201610075565b5f54610061906001600160a01b031681565b6001546100ce90600160a01b900460ff1681565b60405160ff9091168152602001610075565b5f5f826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561013c575060408051601f3d908101601f19168201909252610139918101906102b6565b60015b6101595760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101875760405163e6c4247b60e01b815260040160405180910390fd5b505f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e991906102d1565b90505f6101f782600a6103ea565b6040516303d1689d60e11b8152600481018290529091505f906001600160a01b038716906307a2d13a90602401602060405180830381865afa15801561023f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026391906103f8565b6001549097600160a01b90910460ff169650945050505050565b6001600160a01b0381168114610291575f5ffd5b50565b5f602082840312156102a4575f5ffd5b81356102af8161027d565b9392505050565b5f602082840312156102c6575f5ffd5b81516102af8161027d565b5f602082840312156102e1575f5ffd5b815160ff811681146102af575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561034057808504811115610324576103246102f1565b600184161561033257908102905b60019390931c928002610309565b935093915050565b5f82610356575060016103e4565b8161036257505f6103e4565b816001811461037857600281146103825761039e565b60019150506103e4565b60ff841115610393576103936102f1565b50506001821b6103e4565b5060208310610133831016604e8410600b84101617156103c1575081810a6103e4565b6103cd5f198484610305565b805f19048211156103e0576103e06102f1565b0290505b92915050565b5f6102af60ff841683610348565b5f60208284031215610408575f5ffd5b505191905056fea2646970667358221220466071d29d15aaff9da084ed6c9143100e30e8502a7581a7b9ce0b4384e6899464736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80637158da7c1461004e57806372279ba11461007e57806379502c55146100a85780639a32c207146100ba575b5f5ffd5b600154610061906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61009161008c366004610294565b6100e0565b6040805192835260ff909116602083015201610075565b5f54610061906001600160a01b031681565b6001546100ce90600160a01b900460ff1681565b60405160ff9091168152602001610075565b5f5f826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561013c575060408051601f3d908101601f19168201909252610139918101906102b6565b60015b6101595760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101875760405163e6c4247b60e01b815260040160405180910390fd5b505f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e991906102d1565b90505f6101f782600a6103ea565b6040516303d1689d60e11b8152600481018290529091505f906001600160a01b038716906307a2d13a90602401602060405180830381865afa15801561023f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026391906103f8565b6001549097600160a01b90910460ff169650945050505050565b6001600160a01b0381168114610291575f5ffd5b50565b5f602082840312156102a4575f5ffd5b81356102af8161027d565b9392505050565b5f602082840312156102c6575f5ffd5b81516102af8161027d565b5f602082840312156102e1575f5ffd5b815160ff811681146102af575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561034057808504811115610324576103246102f1565b600184161561033257908102905b60019390931c928002610309565b935093915050565b5f82610356575060016103e4565b8161036257505f6103e4565b816001811461037857600281146103825761039e565b60019150506103e4565b60ff841115610393576103936102f1565b50506001821b6103e4565b5060208310610133831016604e8410600b84101617156103c1575081810a6103e4565b6103cd5f198484610305565b805f19048211156103e0576103e06102f1565b0290505b92915050565b5f6102af60ff841683610348565b5f60208284031215610408575f5ffd5b505191905056fea2646970667358221220466071d29d15aaff9da084ed6c9143100e30e8502a7581a7b9ce0b4384e6899464736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/price/PriceAdapterRegistry.sol/PriceAdapterRegistry.json b/artifacts/contracts/price/PriceAdapterRegistry.sol/PriceAdapterRegistry.json index 01ef2e56..f52376b1 100644 --- a/artifacts/contracts/price/PriceAdapterRegistry.sol/PriceAdapterRegistry.json +++ b/artifacts/contracts/price/PriceAdapterRegistry.sol/PriceAdapterRegistry.json @@ -223,8 +223,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b5060405161093038038061093083398101604081905261002e916101ba565b816001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610150565b506001600160a01b03821661008d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b45760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040805163567ba71360e01b8152905163567ba713916004808201926020929091908290030181865afa15801561010b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061012f91906101eb565b600160146101000a81548160ff021916908360ff1602179055505050610212565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146101b5575f5ffd5b919050565b5f5f604083850312156101cb575f5ffd5b6101d48361019f565b91506101e26020840161019f565b90509250929050565b5f602082840312156101fb575f5ffd5b815160ff8116811461020b575f5ffd5b9392505050565b6107118061021f5f395ff3fe608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806341976e091461008557806343860175146100ab5780634e0fdde0146100c0578063567ba713146100d3578063715018a6146100f95780638da5cb5b14610101578063c2b7a3e614610116578063d6c318711461013e578063f2fde38b14610151575b5f5ffd5b6100986100933660046104d3565b610164565b6040519081526020015b60405180910390f35b6100be6100b93660046104d3565b610231565b005b6100be6100ce3660046104ee565b6102c2565b6001546100e790600160a01b900460ff1681565b60405160ff90911681526020016100a2565b6100be61036b565b61010961037e565b6040516100a29190610525565b6101096101243660046104d3565b60026020525f90815260409020546001600160a01b031681565b600154610109906001600160a01b031681565b6100be61015f3660046104d3565b61038c565b6001600160a01b038082165f908152600260205260408120549091168061019e57604051635048c2af60e11b815260040160405180910390fd5b5f5f826001600160a01b03166372279ba1866040518263ffffffff1660e01b81526004016101cc9190610525565b6040805180830381865afa1580156101e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020a9190610539565b915091506102288282600160149054906101000a900460ff166103d2565b95945050505050565b6001546001600160a01b0316331461025c5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166102835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526002602052604080822080546001600160a01b0319169055519091905f5160206106bc5f395f51905f52908390a350565b6001546001600160a01b031633146102ed5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b038216158061030a57506001600160a01b038116155b156103285760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526002602052604080822080546001600160a01b0319169486169485179055515f5160206106bc5f395f51905f529190a35050565b61037361043e565b61037c5f610470565b565b5f546001600160a01b031690565b61039461043e565b6001600160a01b0381166103c6575f604051631e4fbdf760e01b81526004016103bd9190610525565b60405180910390fd5b6103cf81610470565b50565b5f8260ff168260ff161115610407576103eb8383610575565b6103f690600a610677565b6104009085610685565b9050610437565b8260ff168260ff1610156104345761041f8284610575565b61042a90600a610677565b610400908561069c565b50825b9392505050565b3361044761037e565b6001600160a01b03161461037c573360405163118cdaa760e01b81526004016103bd9190610525565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103cf575f5ffd5b5f602082840312156104e3575f5ffd5b8135610437816104bf565b5f5f604083850312156104ff575f5ffd5b823561050a816104bf565b9150602083013561051a816104bf565b809150509250929050565b6001600160a01b0391909116815260200190565b5f5f6040838503121561054a575f5ffd5b82519150602083015160ff8116811461051a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561058e5761058e610561565b92915050565b6001815b60018411156105cf578085048111156105b3576105b3610561565b60018416156105c157908102905b60019390931c928002610598565b935093915050565b5f826105e55750600161058e565b816105f157505f61058e565b816001811461060757600281146106115761062d565b600191505061058e565b60ff84111561062257610622610561565b50506001821b61058e565b5060208310610133831016604e8410600b8410161715610650575081810a61058e565b61065c5f198484610594565b805f190482111561066f5761066f610561565b029392505050565b5f61043760ff8416836105d7565b808202811582820484141761058e5761058e610561565b5f826106b657634e487b7160e01b5f52601260045260245ffd5b50049056fe53a93b0b200b6adfbf749bc775b2872ba3ff61fb09c81a53a5d0c4723c169f25a26469706673582212203d3fced24a791a1d7b5bfa32761d56d4c903926e51fe3dc26f394d041c45e5f564736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806341976e091461008557806343860175146100ab5780634e0fdde0146100c0578063567ba713146100d3578063715018a6146100f95780638da5cb5b14610101578063c2b7a3e614610116578063d6c318711461013e578063f2fde38b14610151575b5f5ffd5b6100986100933660046104d3565b610164565b6040519081526020015b60405180910390f35b6100be6100b93660046104d3565b610231565b005b6100be6100ce3660046104ee565b6102c2565b6001546100e790600160a01b900460ff1681565b60405160ff90911681526020016100a2565b6100be61036b565b61010961037e565b6040516100a29190610525565b6101096101243660046104d3565b60026020525f90815260409020546001600160a01b031681565b600154610109906001600160a01b031681565b6100be61015f3660046104d3565b61038c565b6001600160a01b038082165f908152600260205260408120549091168061019e57604051635048c2af60e11b815260040160405180910390fd5b5f5f826001600160a01b03166372279ba1866040518263ffffffff1660e01b81526004016101cc9190610525565b6040805180830381865afa1580156101e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020a9190610539565b915091506102288282600160149054906101000a900460ff166103d2565b95945050505050565b6001546001600160a01b0316331461025c5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166102835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526002602052604080822080546001600160a01b0319169055519091905f5160206106bc5f395f51905f52908390a350565b6001546001600160a01b031633146102ed5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b038216158061030a57506001600160a01b038116155b156103285760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526002602052604080822080546001600160a01b0319169486169485179055515f5160206106bc5f395f51905f529190a35050565b61037361043e565b61037c5f610470565b565b5f546001600160a01b031690565b61039461043e565b6001600160a01b0381166103c6575f604051631e4fbdf760e01b81526004016103bd9190610525565b60405180910390fd5b6103cf81610470565b50565b5f8260ff168260ff161115610407576103eb8383610575565b6103f690600a610677565b6104009085610685565b9050610437565b8260ff168260ff1610156104345761041f8284610575565b61042a90600a610677565b610400908561069c565b50825b9392505050565b3361044761037e565b6001600160a01b03161461037c573360405163118cdaa760e01b81526004016103bd9190610525565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103cf575f5ffd5b5f602082840312156104e3575f5ffd5b8135610437816104bf565b5f5f604083850312156104ff575f5ffd5b823561050a816104bf565b9150602083013561051a816104bf565b809150509250929050565b6001600160a01b0391909116815260200190565b5f5f6040838503121561054a575f5ffd5b82519150602083015160ff8116811461051a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561058e5761058e610561565b92915050565b6001815b60018411156105cf578085048111156105b3576105b3610561565b60018416156105c157908102905b60019390931c928002610598565b935093915050565b5f826105e55750600161058e565b816105f157505f61058e565b816001811461060757600281146106115761062d565b600191505061058e565b60ff84111561062257610622610561565b50506001821b61058e565b5060208310610133831016604e8410600b8410161715610650575081810a61058e565b61065c5f198484610594565b805f190482111561066f5761066f610561565b029392505050565b5f61043760ff8416836105d7565b808202811582820484141761058e5761058e610561565b5f826106b657634e487b7160e01b5f52601260045260245ffd5b50049056fe53a93b0b200b6adfbf749bc775b2872ba3ff61fb09c81a53a5d0c4723c169f25a26469706673582212203d3fced24a791a1d7b5bfa32761d56d4c903926e51fe3dc26f394d041c45e5f564736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b5060405161093038038061093083398101604081905261002e916101ba565b816001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610150565b506001600160a01b03821661008d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b45760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040805163567ba71360e01b8152905163567ba713916004808201926020929091908290030181865afa15801561010b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061012f91906101eb565b600160146101000a81548160ff021916908360ff1602179055505050610212565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146101b5575f5ffd5b919050565b5f5f604083850312156101cb575f5ffd5b6101d48361019f565b91506101e26020840161019f565b90509250929050565b5f602082840312156101fb575f5ffd5b815160ff8116811461020b575f5ffd5b9392505050565b6107118061021f5f395ff3fe608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806341976e091461008557806343860175146100ab5780634e0fdde0146100c0578063567ba713146100d3578063715018a6146100f95780638da5cb5b14610101578063c2b7a3e614610116578063d6c318711461013e578063f2fde38b14610151575b5f5ffd5b6100986100933660046104d3565b610164565b6040519081526020015b60405180910390f35b6100be6100b93660046104d3565b610231565b005b6100be6100ce3660046104ee565b6102c2565b6001546100e790600160a01b900460ff1681565b60405160ff90911681526020016100a2565b6100be61036b565b61010961037e565b6040516100a29190610525565b6101096101243660046104d3565b60026020525f90815260409020546001600160a01b031681565b600154610109906001600160a01b031681565b6100be61015f3660046104d3565b61038c565b6001600160a01b038082165f908152600260205260408120549091168061019e57604051635048c2af60e11b815260040160405180910390fd5b5f5f826001600160a01b03166372279ba1866040518263ffffffff1660e01b81526004016101cc9190610525565b6040805180830381865afa1580156101e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020a9190610539565b915091506102288282600160149054906101000a900460ff166103d2565b95945050505050565b6001546001600160a01b0316331461025c5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166102835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526002602052604080822080546001600160a01b0319169055519091905f5160206106bc5f395f51905f52908390a350565b6001546001600160a01b031633146102ed5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b038216158061030a57506001600160a01b038116155b156103285760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526002602052604080822080546001600160a01b0319169486169485179055515f5160206106bc5f395f51905f529190a35050565b61037361043e565b61037c5f610470565b565b5f546001600160a01b031690565b61039461043e565b6001600160a01b0381166103c6575f604051631e4fbdf760e01b81526004016103bd9190610525565b60405180910390fd5b6103cf81610470565b50565b5f8260ff168260ff161115610407576103eb8383610575565b6103f690600a610677565b6104009085610685565b9050610437565b8260ff168260ff1610156104345761041f8284610575565b61042a90600a610677565b610400908561069c565b50825b9392505050565b3361044761037e565b6001600160a01b03161461037c573360405163118cdaa760e01b81526004016103bd9190610525565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103cf575f5ffd5b5f602082840312156104e3575f5ffd5b8135610437816104bf565b5f5f604083850312156104ff575f5ffd5b823561050a816104bf565b9150602083013561051a816104bf565b809150509250929050565b6001600160a01b0391909116815260200190565b5f5f6040838503121561054a575f5ffd5b82519150602083015160ff8116811461051a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561058e5761058e610561565b92915050565b6001815b60018411156105cf578085048111156105b3576105b3610561565b60018416156105c157908102905b60019390931c928002610598565b935093915050565b5f826105e55750600161058e565b816105f157505f61058e565b816001811461060757600281146106115761062d565b600191505061058e565b60ff84111561062257610622610561565b50506001821b61058e565b5060208310610133831016604e8410600b8410161715610650575081810a61058e565b61065c5f198484610594565b805f190482111561066f5761066f610561565b029392505050565b5f61043760ff8416836105d7565b808202811582820484141761058e5761058e610561565b5f826106b657634e487b7160e01b5f52601260045260245ffd5b50049056fe53a93b0b200b6adfbf749bc775b2872ba3ff61fb09c81a53a5d0c4723c169f25a26469706673582212203a80a8bcc1ed1a844ee9073ac48c4d5c9b4afb5feb49b6c5d29c6af534f461bc64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806341976e091461008557806343860175146100ab5780634e0fdde0146100c0578063567ba713146100d3578063715018a6146100f95780638da5cb5b14610101578063c2b7a3e614610116578063d6c318711461013e578063f2fde38b14610151575b5f5ffd5b6100986100933660046104d3565b610164565b6040519081526020015b60405180910390f35b6100be6100b93660046104d3565b610231565b005b6100be6100ce3660046104ee565b6102c2565b6001546100e790600160a01b900460ff1681565b60405160ff90911681526020016100a2565b6100be61036b565b61010961037e565b6040516100a29190610525565b6101096101243660046104d3565b60026020525f90815260409020546001600160a01b031681565b600154610109906001600160a01b031681565b6100be61015f3660046104d3565b61038c565b6001600160a01b038082165f908152600260205260408120549091168061019e57604051635048c2af60e11b815260040160405180910390fd5b5f5f826001600160a01b03166372279ba1866040518263ffffffff1660e01b81526004016101cc9190610525565b6040805180830381865afa1580156101e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020a9190610539565b915091506102288282600160149054906101000a900460ff166103d2565b95945050505050565b6001546001600160a01b0316331461025c5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166102835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526002602052604080822080546001600160a01b0319169055519091905f5160206106bc5f395f51905f52908390a350565b6001546001600160a01b031633146102ed5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b038216158061030a57506001600160a01b038116155b156103285760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526002602052604080822080546001600160a01b0319169486169485179055515f5160206106bc5f395f51905f529190a35050565b61037361043e565b61037c5f610470565b565b5f546001600160a01b031690565b61039461043e565b6001600160a01b0381166103c6575f604051631e4fbdf760e01b81526004016103bd9190610525565b60405180910390fd5b6103cf81610470565b50565b5f8260ff168260ff161115610407576103eb8383610575565b6103f690600a610677565b6104009085610685565b9050610437565b8260ff168260ff1610156104345761041f8284610575565b61042a90600a610677565b610400908561069c565b50825b9392505050565b3361044761037e565b6001600160a01b03161461037c573360405163118cdaa760e01b81526004016103bd9190610525565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103cf575f5ffd5b5f602082840312156104e3575f5ffd5b8135610437816104bf565b5f5f604083850312156104ff575f5ffd5b823561050a816104bf565b9150602083013561051a816104bf565b809150509250929050565b6001600160a01b0391909116815260200190565b5f5f6040838503121561054a575f5ffd5b82519150602083015160ff8116811461051a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561058e5761058e610561565b92915050565b6001815b60018411156105cf578085048111156105b3576105b3610561565b60018416156105c157908102905b60019390931c928002610598565b935093915050565b5f826105e55750600161058e565b816105f157505f61058e565b816001811461060757600281146106115761062d565b600191505061058e565b60ff84111561062257610622610561565b50506001821b61058e565b5060208310610133831016604e8410600b8410161715610650575081810a61058e565b61065c5f198484610594565b805f190482111561066f5761066f610561565b029392505050565b5f61043760ff8416836105d7565b808202811582820484141761058e5761058e610561565b5f826106b657634e487b7160e01b5f52601260045260245ffd5b50049056fe53a93b0b200b6adfbf749bc775b2872ba3ff61fb09c81a53a5d0c4723c169f25a26469706673582212203a80a8bcc1ed1a844ee9073ac48c4d5c9b4afb5feb49b6c5d29c6af534f461bc64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/strategies/KBestTvlWeightedAverage.sol/KBestTvlWeightedAverage.json b/artifacts/contracts/strategies/KBestTvlWeightedAverage.sol/KBestTvlWeightedAverage.json index 88348dba..aff9eced 100644 --- a/artifacts/contracts/strategies/KBestTvlWeightedAverage.sol/KBestTvlWeightedAverage.json +++ b/artifacts/contracts/strategies/KBestTvlWeightedAverage.sol/KBestTvlWeightedAverage.json @@ -193,8 +193,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b50604051610dfd380380610dfd83398101604081905261002e9161012a565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b610065816100c0565b506001600160a01b03821661008d5760405163d92e233d60e01b815260040160405180910390fd5b6001805460ff909216600160a01b026001600160a81b03199092166001600160a01b039093169290921717905550610173565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114610125575f5ffd5b919050565b5f5f5f6060848603121561013c575f5ffd5b6101458461010f565b92506101536020850161010f565b9150604084015160ff81168114610168575f5ffd5b809150509250925092565b610c7d806101805f395ff3fe608060405234801561000f575f5ffd5b5060043610610076575f3560e01c806301ffc9a71461007a578063701a8185146100a2578063715018a6146100c257806379502c55146100cc5780638da5cb5b146100ec578063b4f40c61146100f4578063cbe307a21461011a578063f2fde38b1461012d575b5f5ffd5b61008d6100883660046108f8565b610140565b60405190151581526020015b60405180910390f35b6100b56100b036600461091f565b610176565b604051610099919061098e565b6100ca6101d1565b005b6001546100df906001600160a01b031681565b60405161009991906109eb565b6100df6101e4565b60015461010890600160a01b900460ff1681565b60405160ff9091168152602001610099565b6100ca610128366004610a0d565b6101f2565b6100ca61013b366004610a28565b61021a565b5f6001600160e01b0319821663701a818560e01b148061017057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060815f610185858380610260565b6001549091505f906101a59060ff600160a01b9091048116908516610372565b90505f5f6101b68888868887610384565b915091506101c58282856105c8565b98975050505050505050565b6101d9610877565b6101e25f6108a9565b565b5f546001600160a01b031690565b6101fa610877565b6001805460ff909216600160a01b0260ff60a01b19909216919091179055565b610222610877565b6001600160a01b038116610254575f604051631e4fbdf760e01b815260040161024b91906109eb565b60405180910390fd5b61025d816108a9565b50565b60608160ff166001600160401b0381111561027d5761027d610a4e565b6040519080825280602002602001820160405280156102a6578160200160208202803683370190505b5090505f5b8260ff168160ff16101561036a5784848260ff168181106102ce576102ce610a62565b90506020020160208101906102e39190610a28565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103429190610a76565b828260ff168151811061035757610357610a62565b60209081029190910101526001016102ab565b509392505050565b5f8282188284100282185b9392505050565b6060808260ff166001600160401b038111156103a2576103a2610a4e565b6040519080825280602002602001820160405280156103cb578160200160208202803683370190505b5091508260ff166001600160401b038111156103e9576103e9610a4e565b604051908082528060200260200182016040528015610412578160200160208202803683370190505b5090505f8460ff166001600160401b0381111561043157610431610a4e565b60405190808252806020026020018201604052801561045a578160200160208202803683370190505b5090505f5b8460ff168160ff1610156105bc575f80805b8860ff168160ff1610156104f757848160ff168151811061049457610494610a62565b60200260200101511580156104c45750828a8260ff16815181106104ba576104ba610a62565b6020026020010151115b156104ef57898160ff16815181106104de576104de610a62565b602002602001015192508060ff1691505b600101610471565b50600184828151811061050c5761050c610a62565b911515602092830291909101909101528a8a8281811061052e5761052e610a62565b90506020020160208101906105439190610a28565b868460ff168151811061055857610558610a62565b60200260200101906001600160a01b031690816001600160a01b03168152505088818151811061058a5761058a610a62565b6020026020010151858460ff16815181106105a7576105a7610a62565b6020908102919091010152505060010161045f565b50509550959350505050565b60605f805b8360ff168160ff16101561060d57848160ff16815181106105f0576105f0610a62565b6020026020010151826106039190610aa1565b91506001016105cd565b506001546040805163d1717c7d60e01b815290515f926001600160a01b03169163d1717c7d9160048083019260209291908290030181865afa158015610655573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106799190610ab4565b61068490600a610bb2565b90508360ff166001600160401b038111156106a1576106a1610a4e565b6040519080825280602002602001820160405280156106e557816020015b604080518082019091525f80825260208201528152602001906001900390816106bf5790505b5092505f805b8560ff168160ff1610156107aa575f848463ffffffff16898460ff168151811061071757610717610a62565b60200260200101516107299190610bc0565b6107339190610bd7565b905060405180604001604052808a8460ff168151811061075557610755610a62565b60200260200101516001600160a01b031681526020018263ffffffff16815250868360ff168151811061078a5761078a610a62565b602090810291909101015261079f8184610bf6565b9250506001016106eb565b508163ffffffff168163ffffffff16101561080e576107c98183610c12565b846107d5600188610c2e565b60ff16815181106107e8576107e8610a62565b60200260200101516020018181516108009190610bf6565b63ffffffff1690525061086d565b8163ffffffff168163ffffffff16111561086d5761082c8282610c12565b84610838600188610c2e565b60ff168151811061084b5761084b610a62565b60200260200101516020018181516108639190610c12565b63ffffffff169052505b5050509392505050565b336108806101e4565b6001600160a01b0316146101e2573360405163118cdaa760e01b815260040161024b91906109eb565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610908575f5ffd5b81356001600160e01b03198116811461037d575f5ffd5b5f5f60208385031215610930575f5ffd5b82356001600160401b03811115610945575f5ffd5b8301601f81018513610955575f5ffd5b80356001600160401b0381111561096a575f5ffd5b8560208260051b840101111561097e575f5ffd5b6020919091019590945092505050565b602080825282518282018190525f918401906040840190835b818110156109e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016109a7565b509095945050505050565b6001600160a01b0391909116815260200190565b60ff8116811461025d575f5ffd5b5f60208284031215610a1d575f5ffd5b813561037d816109ff565b5f60208284031215610a38575f5ffd5b81356001600160a01b038116811461037d575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610a86575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561017057610170610a8d565b5f60208284031215610ac4575f5ffd5b815161037d816109ff565b6001815b6001841115610b0a57808504811115610aee57610aee610a8d565b6001841615610afc57908102905b60019390931c928002610ad3565b935093915050565b5f82610b2057506001610170565b81610b2c57505f610170565b8160018114610b425760028114610b4c57610b68565b6001915050610170565b60ff841115610b5d57610b5d610a8d565b50506001821b610170565b5060208310610133831016604e8410600b8410161715610b8b575081810a610170565b610b975f198484610acf565b805f1904821115610baa57610baa610a8d565b029392505050565b5f61037d60ff841683610b12565b808202811582820484141761017057610170610a8d565b5f82610bf157634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff818116838216019081111561017057610170610a8d565b63ffffffff828116828216039081111561017057610170610a8d565b60ff828116828216039081111561017057610170610a8d56fea2646970667358221220747be7e12117666e6e0f6c9f256a6bb904e86a677aaa01f4b11367fd5b1a28f764736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610076575f3560e01c806301ffc9a71461007a578063701a8185146100a2578063715018a6146100c257806379502c55146100cc5780638da5cb5b146100ec578063b4f40c61146100f4578063cbe307a21461011a578063f2fde38b1461012d575b5f5ffd5b61008d6100883660046108f8565b610140565b60405190151581526020015b60405180910390f35b6100b56100b036600461091f565b610176565b604051610099919061098e565b6100ca6101d1565b005b6001546100df906001600160a01b031681565b60405161009991906109eb565b6100df6101e4565b60015461010890600160a01b900460ff1681565b60405160ff9091168152602001610099565b6100ca610128366004610a0d565b6101f2565b6100ca61013b366004610a28565b61021a565b5f6001600160e01b0319821663701a818560e01b148061017057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060815f610185858380610260565b6001549091505f906101a59060ff600160a01b9091048116908516610372565b90505f5f6101b68888868887610384565b915091506101c58282856105c8565b98975050505050505050565b6101d9610877565b6101e25f6108a9565b565b5f546001600160a01b031690565b6101fa610877565b6001805460ff909216600160a01b0260ff60a01b19909216919091179055565b610222610877565b6001600160a01b038116610254575f604051631e4fbdf760e01b815260040161024b91906109eb565b60405180910390fd5b61025d816108a9565b50565b60608160ff166001600160401b0381111561027d5761027d610a4e565b6040519080825280602002602001820160405280156102a6578160200160208202803683370190505b5090505f5b8260ff168160ff16101561036a5784848260ff168181106102ce576102ce610a62565b90506020020160208101906102e39190610a28565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103429190610a76565b828260ff168151811061035757610357610a62565b60209081029190910101526001016102ab565b509392505050565b5f8282188284100282185b9392505050565b6060808260ff166001600160401b038111156103a2576103a2610a4e565b6040519080825280602002602001820160405280156103cb578160200160208202803683370190505b5091508260ff166001600160401b038111156103e9576103e9610a4e565b604051908082528060200260200182016040528015610412578160200160208202803683370190505b5090505f8460ff166001600160401b0381111561043157610431610a4e565b60405190808252806020026020018201604052801561045a578160200160208202803683370190505b5090505f5b8460ff168160ff1610156105bc575f80805b8860ff168160ff1610156104f757848160ff168151811061049457610494610a62565b60200260200101511580156104c45750828a8260ff16815181106104ba576104ba610a62565b6020026020010151115b156104ef57898160ff16815181106104de576104de610a62565b602002602001015192508060ff1691505b600101610471565b50600184828151811061050c5761050c610a62565b911515602092830291909101909101528a8a8281811061052e5761052e610a62565b90506020020160208101906105439190610a28565b868460ff168151811061055857610558610a62565b60200260200101906001600160a01b031690816001600160a01b03168152505088818151811061058a5761058a610a62565b6020026020010151858460ff16815181106105a7576105a7610a62565b6020908102919091010152505060010161045f565b50509550959350505050565b60605f805b8360ff168160ff16101561060d57848160ff16815181106105f0576105f0610a62565b6020026020010151826106039190610aa1565b91506001016105cd565b506001546040805163d1717c7d60e01b815290515f926001600160a01b03169163d1717c7d9160048083019260209291908290030181865afa158015610655573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106799190610ab4565b61068490600a610bb2565b90508360ff166001600160401b038111156106a1576106a1610a4e565b6040519080825280602002602001820160405280156106e557816020015b604080518082019091525f80825260208201528152602001906001900390816106bf5790505b5092505f805b8560ff168160ff1610156107aa575f848463ffffffff16898460ff168151811061071757610717610a62565b60200260200101516107299190610bc0565b6107339190610bd7565b905060405180604001604052808a8460ff168151811061075557610755610a62565b60200260200101516001600160a01b031681526020018263ffffffff16815250868360ff168151811061078a5761078a610a62565b602090810291909101015261079f8184610bf6565b9250506001016106eb565b508163ffffffff168163ffffffff16101561080e576107c98183610c12565b846107d5600188610c2e565b60ff16815181106107e8576107e8610a62565b60200260200101516020018181516108009190610bf6565b63ffffffff1690525061086d565b8163ffffffff168163ffffffff16111561086d5761082c8282610c12565b84610838600188610c2e565b60ff168151811061084b5761084b610a62565b60200260200101516020018181516108639190610c12565b63ffffffff169052505b5050509392505050565b336108806101e4565b6001600160a01b0316146101e2573360405163118cdaa760e01b815260040161024b91906109eb565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610908575f5ffd5b81356001600160e01b03198116811461037d575f5ffd5b5f5f60208385031215610930575f5ffd5b82356001600160401b03811115610945575f5ffd5b8301601f81018513610955575f5ffd5b80356001600160401b0381111561096a575f5ffd5b8560208260051b840101111561097e575f5ffd5b6020919091019590945092505050565b602080825282518282018190525f918401906040840190835b818110156109e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016109a7565b509095945050505050565b6001600160a01b0391909116815260200190565b60ff8116811461025d575f5ffd5b5f60208284031215610a1d575f5ffd5b813561037d816109ff565b5f60208284031215610a38575f5ffd5b81356001600160a01b038116811461037d575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610a86575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561017057610170610a8d565b5f60208284031215610ac4575f5ffd5b815161037d816109ff565b6001815b6001841115610b0a57808504811115610aee57610aee610a8d565b6001841615610afc57908102905b60019390931c928002610ad3565b935093915050565b5f82610b2057506001610170565b81610b2c57505f610170565b8160018114610b425760028114610b4c57610b68565b6001915050610170565b60ff841115610b5d57610b5d610a8d565b50506001821b610170565b5060208310610133831016604e8410600b8410161715610b8b575081810a610170565b610b975f198484610acf565b805f1904821115610baa57610baa610a8d565b029392505050565b5f61037d60ff841683610b12565b808202811582820484141761017057610170610a8d565b5f82610bf157634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff818116838216019081111561017057610170610a8d565b63ffffffff828116828216039081111561017057610170610a8d565b60ff828116828216039081111561017057610170610a8d56fea2646970667358221220747be7e12117666e6e0f6c9f256a6bb904e86a677aaa01f4b11367fd5b1a28f764736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b50604051610dfd380380610dfd83398101604081905261002e9161012a565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b610065816100c0565b506001600160a01b03821661008d5760405163d92e233d60e01b815260040160405180910390fd5b6001805460ff909216600160a01b026001600160a81b03199092166001600160a01b039093169290921717905550610173565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114610125575f5ffd5b919050565b5f5f5f6060848603121561013c575f5ffd5b6101458461010f565b92506101536020850161010f565b9150604084015160ff81168114610168575f5ffd5b809150509250925092565b610c7d806101805f395ff3fe608060405234801561000f575f5ffd5b5060043610610076575f3560e01c806301ffc9a71461007a578063701a8185146100a2578063715018a6146100c257806379502c55146100cc5780638da5cb5b146100ec578063b4f40c61146100f4578063cbe307a21461011a578063f2fde38b1461012d575b5f5ffd5b61008d6100883660046108f8565b610140565b60405190151581526020015b60405180910390f35b6100b56100b036600461091f565b610176565b604051610099919061098e565b6100ca6101d1565b005b6001546100df906001600160a01b031681565b60405161009991906109eb565b6100df6101e4565b60015461010890600160a01b900460ff1681565b60405160ff9091168152602001610099565b6100ca610128366004610a0d565b6101f2565b6100ca61013b366004610a28565b61021a565b5f6001600160e01b0319821663701a818560e01b148061017057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060815f610185858380610260565b6001549091505f906101a59060ff600160a01b9091048116908516610372565b90505f5f6101b68888868887610384565b915091506101c58282856105c8565b98975050505050505050565b6101d9610877565b6101e25f6108a9565b565b5f546001600160a01b031690565b6101fa610877565b6001805460ff909216600160a01b0260ff60a01b19909216919091179055565b610222610877565b6001600160a01b038116610254575f604051631e4fbdf760e01b815260040161024b91906109eb565b60405180910390fd5b61025d816108a9565b50565b60608160ff166001600160401b0381111561027d5761027d610a4e565b6040519080825280602002602001820160405280156102a6578160200160208202803683370190505b5090505f5b8260ff168160ff16101561036a5784848260ff168181106102ce576102ce610a62565b90506020020160208101906102e39190610a28565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103429190610a76565b828260ff168151811061035757610357610a62565b60209081029190910101526001016102ab565b509392505050565b5f8282188284100282185b9392505050565b6060808260ff166001600160401b038111156103a2576103a2610a4e565b6040519080825280602002602001820160405280156103cb578160200160208202803683370190505b5091508260ff166001600160401b038111156103e9576103e9610a4e565b604051908082528060200260200182016040528015610412578160200160208202803683370190505b5090505f8460ff166001600160401b0381111561043157610431610a4e565b60405190808252806020026020018201604052801561045a578160200160208202803683370190505b5090505f5b8460ff168160ff1610156105bc575f80805b8860ff168160ff1610156104f757848160ff168151811061049457610494610a62565b60200260200101511580156104c45750828a8260ff16815181106104ba576104ba610a62565b6020026020010151115b156104ef57898160ff16815181106104de576104de610a62565b602002602001015192508060ff1691505b600101610471565b50600184828151811061050c5761050c610a62565b911515602092830291909101909101528a8a8281811061052e5761052e610a62565b90506020020160208101906105439190610a28565b868460ff168151811061055857610558610a62565b60200260200101906001600160a01b031690816001600160a01b03168152505088818151811061058a5761058a610a62565b6020026020010151858460ff16815181106105a7576105a7610a62565b6020908102919091010152505060010161045f565b50509550959350505050565b60605f805b8360ff168160ff16101561060d57848160ff16815181106105f0576105f0610a62565b6020026020010151826106039190610aa1565b91506001016105cd565b506001546040805163d1717c7d60e01b815290515f926001600160a01b03169163d1717c7d9160048083019260209291908290030181865afa158015610655573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106799190610ab4565b61068490600a610bb2565b90508360ff166001600160401b038111156106a1576106a1610a4e565b6040519080825280602002602001820160405280156106e557816020015b604080518082019091525f80825260208201528152602001906001900390816106bf5790505b5092505f805b8560ff168160ff1610156107aa575f848463ffffffff16898460ff168151811061071757610717610a62565b60200260200101516107299190610bc0565b6107339190610bd7565b905060405180604001604052808a8460ff168151811061075557610755610a62565b60200260200101516001600160a01b031681526020018263ffffffff16815250868360ff168151811061078a5761078a610a62565b602090810291909101015261079f8184610bf6565b9250506001016106eb565b508163ffffffff168163ffffffff16101561080e576107c98183610c12565b846107d5600188610c2e565b60ff16815181106107e8576107e8610a62565b60200260200101516020018181516108009190610bf6565b63ffffffff1690525061086d565b8163ffffffff168163ffffffff16111561086d5761082c8282610c12565b84610838600188610c2e565b60ff168151811061084b5761084b610a62565b60200260200101516020018181516108639190610c12565b63ffffffff169052505b5050509392505050565b336108806101e4565b6001600160a01b0316146101e2573360405163118cdaa760e01b815260040161024b91906109eb565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610908575f5ffd5b81356001600160e01b03198116811461037d575f5ffd5b5f5f60208385031215610930575f5ffd5b82356001600160401b03811115610945575f5ffd5b8301601f81018513610955575f5ffd5b80356001600160401b0381111561096a575f5ffd5b8560208260051b840101111561097e575f5ffd5b6020919091019590945092505050565b602080825282518282018190525f918401906040840190835b818110156109e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016109a7565b509095945050505050565b6001600160a01b0391909116815260200190565b60ff8116811461025d575f5ffd5b5f60208284031215610a1d575f5ffd5b813561037d816109ff565b5f60208284031215610a38575f5ffd5b81356001600160a01b038116811461037d575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610a86575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561017057610170610a8d565b5f60208284031215610ac4575f5ffd5b815161037d816109ff565b6001815b6001841115610b0a57808504811115610aee57610aee610a8d565b6001841615610afc57908102905b60019390931c928002610ad3565b935093915050565b5f82610b2057506001610170565b81610b2c57505f610170565b8160018114610b425760028114610b4c57610b68565b6001915050610170565b60ff841115610b5d57610b5d610a8d565b50506001821b610170565b5060208310610133831016604e8410600b8410161715610b8b575081810a610170565b610b975f198484610acf565b805f1904821115610baa57610baa610a8d565b029392505050565b5f61037d60ff841683610b12565b808202811582820484141761017057610170610a8d565b5f82610bf157634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff818116838216019081111561017057610170610a8d565b63ffffffff828116828216039081111561017057610170610a8d565b60ff828116828216039081111561017057610170610a8d56fea2646970667358221220e5df41c3afe31b9e292dd2319a3be313c4974ddfdda82dce04edd726e2826aa464736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610076575f3560e01c806301ffc9a71461007a578063701a8185146100a2578063715018a6146100c257806379502c55146100cc5780638da5cb5b146100ec578063b4f40c61146100f4578063cbe307a21461011a578063f2fde38b1461012d575b5f5ffd5b61008d6100883660046108f8565b610140565b60405190151581526020015b60405180910390f35b6100b56100b036600461091f565b610176565b604051610099919061098e565b6100ca6101d1565b005b6001546100df906001600160a01b031681565b60405161009991906109eb565b6100df6101e4565b60015461010890600160a01b900460ff1681565b60405160ff9091168152602001610099565b6100ca610128366004610a0d565b6101f2565b6100ca61013b366004610a28565b61021a565b5f6001600160e01b0319821663701a818560e01b148061017057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060815f610185858380610260565b6001549091505f906101a59060ff600160a01b9091048116908516610372565b90505f5f6101b68888868887610384565b915091506101c58282856105c8565b98975050505050505050565b6101d9610877565b6101e25f6108a9565b565b5f546001600160a01b031690565b6101fa610877565b6001805460ff909216600160a01b0260ff60a01b19909216919091179055565b610222610877565b6001600160a01b038116610254575f604051631e4fbdf760e01b815260040161024b91906109eb565b60405180910390fd5b61025d816108a9565b50565b60608160ff166001600160401b0381111561027d5761027d610a4e565b6040519080825280602002602001820160405280156102a6578160200160208202803683370190505b5090505f5b8260ff168160ff16101561036a5784848260ff168181106102ce576102ce610a62565b90506020020160208101906102e39190610a28565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103429190610a76565b828260ff168151811061035757610357610a62565b60209081029190910101526001016102ab565b509392505050565b5f8282188284100282185b9392505050565b6060808260ff166001600160401b038111156103a2576103a2610a4e565b6040519080825280602002602001820160405280156103cb578160200160208202803683370190505b5091508260ff166001600160401b038111156103e9576103e9610a4e565b604051908082528060200260200182016040528015610412578160200160208202803683370190505b5090505f8460ff166001600160401b0381111561043157610431610a4e565b60405190808252806020026020018201604052801561045a578160200160208202803683370190505b5090505f5b8460ff168160ff1610156105bc575f80805b8860ff168160ff1610156104f757848160ff168151811061049457610494610a62565b60200260200101511580156104c45750828a8260ff16815181106104ba576104ba610a62565b6020026020010151115b156104ef57898160ff16815181106104de576104de610a62565b602002602001015192508060ff1691505b600101610471565b50600184828151811061050c5761050c610a62565b911515602092830291909101909101528a8a8281811061052e5761052e610a62565b90506020020160208101906105439190610a28565b868460ff168151811061055857610558610a62565b60200260200101906001600160a01b031690816001600160a01b03168152505088818151811061058a5761058a610a62565b6020026020010151858460ff16815181106105a7576105a7610a62565b6020908102919091010152505060010161045f565b50509550959350505050565b60605f805b8360ff168160ff16101561060d57848160ff16815181106105f0576105f0610a62565b6020026020010151826106039190610aa1565b91506001016105cd565b506001546040805163d1717c7d60e01b815290515f926001600160a01b03169163d1717c7d9160048083019260209291908290030181865afa158015610655573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106799190610ab4565b61068490600a610bb2565b90508360ff166001600160401b038111156106a1576106a1610a4e565b6040519080825280602002602001820160405280156106e557816020015b604080518082019091525f80825260208201528152602001906001900390816106bf5790505b5092505f805b8560ff168160ff1610156107aa575f848463ffffffff16898460ff168151811061071757610717610a62565b60200260200101516107299190610bc0565b6107339190610bd7565b905060405180604001604052808a8460ff168151811061075557610755610a62565b60200260200101516001600160a01b031681526020018263ffffffff16815250868360ff168151811061078a5761078a610a62565b602090810291909101015261079f8184610bf6565b9250506001016106eb565b508163ffffffff168163ffffffff16101561080e576107c98183610c12565b846107d5600188610c2e565b60ff16815181106107e8576107e8610a62565b60200260200101516020018181516108009190610bf6565b63ffffffff1690525061086d565b8163ffffffff168163ffffffff16111561086d5761082c8282610c12565b84610838600188610c2e565b60ff168151811061084b5761084b610a62565b60200260200101516020018181516108639190610c12565b63ffffffff169052505b5050509392505050565b336108806101e4565b6001600160a01b0316146101e2573360405163118cdaa760e01b815260040161024b91906109eb565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610908575f5ffd5b81356001600160e01b03198116811461037d575f5ffd5b5f5f60208385031215610930575f5ffd5b82356001600160401b03811115610945575f5ffd5b8301601f81018513610955575f5ffd5b80356001600160401b0381111561096a575f5ffd5b8560208260051b840101111561097e575f5ffd5b6020919091019590945092505050565b602080825282518282018190525f918401906040840190835b818110156109e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016109a7565b509095945050505050565b6001600160a01b0391909116815260200190565b60ff8116811461025d575f5ffd5b5f60208284031215610a1d575f5ffd5b813561037d816109ff565b5f60208284031215610a38575f5ffd5b81356001600160a01b038116811461037d575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610a86575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561017057610170610a8d565b5f60208284031215610ac4575f5ffd5b815161037d816109ff565b6001815b6001841115610b0a57808504811115610aee57610aee610a8d565b6001841615610afc57908102905b60019390931c928002610ad3565b935093915050565b5f82610b2057506001610170565b81610b2c57505f610170565b8160018114610b425760028114610b4c57610b68565b6001915050610170565b60ff841115610b5d57610b5d610a8d565b50506001821b610170565b5060208310610133831016604e8410600b8410161715610b8b575081810a610170565b610b975f198484610acf565b805f1904821115610baa57610baa610a8d565b029392505050565b5f61037d60ff841683610b12565b808202811582820484141761017057610170610a8d565b5f82610bf157634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff818116838216019081111561017057610170610a8d565b63ffffffff828116828216039081111561017057610170610a8d565b60ff828116828216039081111561017057610170610a8d56fea2646970667358221220e5df41c3afe31b9e292dd2319a3be313c4974ddfdda82dce04edd726e2826aa464736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/vaults/OrionEncryptedVault.sol/OrionEncryptedVault.json b/artifacts/contracts/vaults/OrionEncryptedVault.sol/OrionEncryptedVault.json deleted file mode 100644 index a26efdf6..00000000 --- a/artifacts/contracts/vaults/OrionEncryptedVault.sol/OrionEncryptedVault.json +++ /dev/null @@ -1,1797 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "OrionEncryptedVault", - "sourceName": "contracts/vaults/OrionEncryptedVault.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "vaultOwner", - "type": "address" - }, - { - "internalType": "address", - "name": "curator", - "type": "address" - }, - { - "internalType": "contract IOrionConfig", - "name": "configAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "string", - "name": "symbol", - "type": "string" - }, - { - "internalType": "uint8", - "name": "feeType", - "type": "uint8" - }, - { - "internalType": "uint16", - "name": "performanceFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "managementFee", - "type": "uint16" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AlreadyRegistered", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "AmountMustBeGreaterThanZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "allowance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "needed", - "type": "uint256" - } - ], - "name": "ERC20InsufficientAllowance", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "balance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "needed", - "type": "uint256" - } - ], - "name": "ERC20InsufficientBalance", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "approver", - "type": "address" - } - ], - "name": "ERC20InvalidApprover", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "ERC20InvalidReceiver", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "ERC20InvalidSender", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "ERC20InvalidSpender", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "max", - "type": "uint256" - } - ], - "name": "ERC4626ExceededMaxDeposit", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "max", - "type": "uint256" - } - ], - "name": "ERC4626ExceededMaxMint", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "max", - "type": "uint256" - } - ], - "name": "ERC4626ExceededMaxRedeem", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "max", - "type": "uint256" - } - ], - "name": "ERC4626ExceededMaxWithdraw", - "type": "error" - }, - { - "inputs": [], - "name": "HandlesAlreadySavedForRequestID", - "type": "error" - }, - { - "inputs": [], - "name": "InsufficientAmount", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidAddress", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidArguments", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidKMSSignatures", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidUnderlyingDecimals", - "type": "error" - }, - { - "inputs": [], - "name": "NoHandleFoundForRequestID", - "type": "error" - }, - { - "inputs": [], - "name": "OrderIntentCannotBeEmpty", - "type": "error" - }, - { - "inputs": [], - "name": "ReentrancyGuardReentrantCall", - "type": "error" - }, - { - "inputs": [], - "name": "SynchronousCallDisabled", - "type": "error" - }, - { - "inputs": [], - "name": "SystemNotIdle", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenAlreadyInOrder", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenNotWhitelisted", - "type": "error" - }, - { - "inputs": [], - "name": "TransferFailed", - "type": "error" - }, - { - "inputs": [], - "name": "UnauthorizedAccess", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "epoch", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "feeAmount", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "pendingCuratorFees", - "type": "uint256" - } - ], - "name": "CuratorFeesAccrued", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newCurator", - "type": "address" - } - ], - "name": "CuratorUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "requestID", - "type": "uint256" - } - ], - "name": "DecryptionFulfilled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "vault", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "epoch", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "depositAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "sharesMinted", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "DepositRequest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "DepositRequestCancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint8", - "name": "mode", - "type": "uint8" - }, - { - "indexed": true, - "internalType": "uint16", - "name": "performanceFee", - "type": "uint16" - }, - { - "indexed": true, - "internalType": "uint16", - "name": "managementFee", - "type": "uint16" - } - ], - "name": "FeeModelUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "curator", - "type": "address" - } - ], - "name": "OrderSubmitted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "vault", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "epoch", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "redeemAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "sharesBurned", - "type": "uint256" - } - ], - "name": "Redeem", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "RedeemRequest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "RedeemRequestCancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "newTotalAssets", - "type": "uint256" - } - ], - "name": "VaultStateUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Withdraw", - "type": "event" - }, - { - "inputs": [], - "name": "BASIS_POINTS_FACTOR", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_MANAGEMENT_FEE", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_PERFORMANCE_FEE", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SHARE_DECIMALS", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "YEAR_IN_SECONDS", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "epoch", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "feeAmount", - "type": "uint256" - } - ], - "name": "accrueCuratorFees", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "asset", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "requestID", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "cleartexts", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "decryptionProof", - "type": "bytes" - } - ], - "name": "callbackDecryptSingleEbool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "cancelDepositRequest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "cancelRedeemRequest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "claimCuratorFees", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "config", - "outputs": [ - { - "internalType": "contract IOrionConfig", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "convertToAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "pointInTimeTotalAssets", - "type": "uint256" - }, - { - "internalType": "enum Math.Rounding", - "name": "rounding", - "type": "uint8" - } - ], - "name": "convertToAssetsWithPITTotalAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "convertToShares", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "pointInTimeTotalAssets", - "type": "uint256" - }, - { - "internalType": "enum Math.Rounding", - "name": "rounding", - "type": "uint8" - } - ], - "name": "convertToSharesWithPITTotalAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "curator", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "activeTotalAssets", - "type": "uint256" - } - ], - "name": "curatorFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "curatorIntentDecimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "deposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "feeModel", - "outputs": [ - { - "internalType": "enum OrionVault.FeeType", - "name": "feeType", - "type": "uint8" - }, - { - "internalType": "uint16", - "name": "performanceFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "managementFee", - "type": "uint16" - }, - { - "internalType": "uint256", - "name": "highWaterMark", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "depositTotalAssets", - "type": "uint256" - } - ], - "name": "fulfillDeposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "redeemTotalAssets", - "type": "uint256" - } - ], - "name": "fulfillRedeem", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getIntent", - "outputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - }, - { - "internalType": "euint128[]", - "name": "weights", - "type": "bytes32[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPortfolio", - "outputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - }, - { - "internalType": "euint128[]", - "name": "sharesPerAsset", - "type": "bytes32[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "internalStatesOrchestrator", - "outputs": [ - { - "internalType": "contract IInternalStateOrchestrator", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "isIntentValid", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "liquidityOrchestrator", - "outputs": [ - { - "internalType": "contract ILiquidityOrchestrator", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "maxDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "maxMint", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "maxRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "maxWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingCuratorFees", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "previewDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "previewMint", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "previewRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "previewWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "protocolId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "requestDeposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "requestRedeem", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "externalEuint128", - "name": "weight", - "type": "bytes32" - } - ], - "internalType": "struct IOrionEncryptedVault.EncryptedIntent[]", - "name": "intent", - "type": "tuple[]" - }, - { - "internalType": "bytes", - "name": "inputProof", - "type": "bytes" - } - ], - "name": "submitIntent", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newCurator", - "type": "address" - } - ], - "name": "updateCurator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "feeType", - "type": "uint8" - }, - { - "internalType": "uint16", - "name": "performanceFee", - "type": "uint16" - }, - { - "internalType": "uint16", - "name": "managementFee", - "type": "uint16" - } - ], - "name": "updateFeeModel", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "euint128", - "name": "value", - "type": "bytes32" - } - ], - "internalType": "struct IOrionEncryptedVault.EncryptedPortfolio[]", - "name": "portfolio", - "type": "tuple[]" - }, - { - "internalType": "uint256", - "name": "newTotalAssets", - "type": "uint256" - } - ], - "name": "updateVaultState", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "assets", - "type": "address[]" - } - ], - "name": "updateVaultWhitelist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "vaultOwner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "vaultWhitelist", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "withdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - } - ], - "bytecode": "0x60c060405234801561000f575f5ffd5b5060405161548938038061548983398101604081905261002e91610b0b565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610bda565b858561013b610136604080516080810182525f80825260208201819052918101829052606081019190915250604080516080810182527350157cffd6bbfa2dece204a89ec419c23ef5755d815273cd3ab3bd6bcc0c0bf3e27912a92043e817b1cf69602082015273a02cda4ca3a71d7c46997716f4283aa851c2881291810191909152731364cbbf2cdf5032c47d8226a6f6fbd2afcdacac606082015290565b610605565b60036101478382610c79565b5060046101548282610c79565b5050505f5f610168836106be60201b60201c565b915091508161017857601261017a565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101b45760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101db5760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa15801561024f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102739190610bda565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f89190610bda565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d33565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103e9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040d9190610bda565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610448573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046c9190610d33565b9050601260ff8216111561049357604051631c03248960e11b815260040160405180910390fd5b600460ff851611156104b8576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff841611156104df576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610506576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561051b5761051b610d4c565b6017805460ff1916600183600481111561053757610537610d4c565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff00199092169190911717905561057a81600a610e57565b601855610585610794565b50505050505050505061059d5f61086960201b60201c565b601e556105aa6001610884565b601f55600a80546105ce916105c991600160a01b900460ff1690610e57565b610869565b602055601e546105dd9061089f565b50601f546105ea9061089f565b506020546105f79061089f565b505050505050505050610f88565b80515f5160206154695f395f51905f5280546001600160a01b03199081166001600160a01b039384161790915560208301515f5160206154495f395f51905f528054831691841691909117905560408301517f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497028054831691841691909117905560608301517f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497038054909216921691909117905550565b50565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161070491610e65565b5f60405180830381855afa9150503d805f811461073c576040519150601f19603f3d011682016040523d82523d5f602084013e610741565b606091505b509150915081801561075557506020815110155b15610788575f8180602001905181019061076f9190610e7b565b905060ff8111610786576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa1580156107da573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108019190810190610e92565b90505f5b8151811015610865575f61083c83838151811061082457610824610f44565b6020026020010151600b6108ae60201b90919060201c565b90508061085c57604051630ea075bf60e21b815260040160405180910390fd5b50600101610805565b5050565b5f61087e6001600160801b03831660066108c9565b92915050565b5f61087e82610893575f610896565b60015b60ff165f6108c9565b5f6108aa8230610960565b5090565b5f6108c2836001600160a01b0384166109d6565b9392505050565b5f5160206154495f395f51905f5254604051639cd07acb60e01b81525f915f5160206154695f395f51905f52916001600160a01b0390911690639cd07acb906109189087908790600401610f58565b6020604051808303815f875af1158015610934573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109589190610e7b565b949350505050565b5f5f5160206154695f395f51905f528054604051635ca4b5b160e11b8152600481018690526001600160a01b03858116602483015292935091169063b9496b62906044015f604051808303815f87803b1580156109bb575f5ffd5b505af11580156109cd573d5f5f3e3d5ffd5b50505050505050565b5f818152600183016020526040812054610a1b57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561087e565b505f61087e565b6001600160a01b03811681146106bb575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715610a7257610a72610a36565b604052919050565b5f82601f830112610a89575f5ffd5b81516001600160401b03811115610aa257610aa2610a36565b610ab5601f8201601f1916602001610a4a565b818152846020838601011115610ac9575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff81168114610af5575f5ffd5b919050565b805161ffff81168114610af5575f5ffd5b5f5f5f5f5f5f5f5f610100898b031215610b23575f5ffd5b8851610b2e81610a22565b60208a0151909850610b3f81610a22565b60408a0151909750610b5081610a22565b60608a01519096506001600160401b03811115610b6b575f5ffd5b610b778b828c01610a7a565b60808b015190965090506001600160401b03811115610b94575f5ffd5b610ba08b828c01610a7a565b945050610baf60a08a01610ae5565b9250610bbd60c08a01610afa565b9150610bcb60e08a01610afa565b90509295985092959890939650565b5f60208284031215610bea575f5ffd5b81516108c281610a22565b600181811c90821680610c0957607f821691505b602082108103610c2757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610c7457805f5260205f20601f840160051c81016020851015610c525750805b601f840160051c820191505b81811015610c71575f8155600101610c5e565b50505b505050565b81516001600160401b03811115610c9257610c92610a36565b610ca681610ca08454610bf5565b84610c2d565b6020601f821160018114610cd8575f8315610cc15750848201515b5f19600385901b1c1916600184901b178455610c71565b5f84815260208120601f198516915b82811015610d075787850151825560209485019460019092019101610ce7565b5084821015610d2457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610d43575f5ffd5b6108c282610ae5565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610daf57808504811115610d9357610d93610d60565b6001841615610da157908102905b60019390931c928002610d78565b935093915050565b5f82610dc55750600161087e565b81610dd157505f61087e565b8160018114610de75760028114610df157610e0d565b600191505061087e565b60ff841115610e0257610e02610d60565b50506001821b61087e565b5060208310610133831016604e8410600b8410161715610e30575081810a61087e565b610e3c5f198484610d74565b805f1904821115610e4f57610e4f610d60565b029392505050565b5f6108c260ff841683610db7565b5f82518060208501845e5f920191825250919050565b5f60208284031215610e8b575f5ffd5b5051919050565b5f60208284031215610ea2575f5ffd5b81516001600160401b03811115610eb7575f5ffd5b8201601f81018413610ec7575f5ffd5b80516001600160401b03811115610ee057610ee0610a36565b8060051b610ef060208201610a4a565b91825260208184018101929081019087841115610f0b575f5ffd5b6020850194505b83851015610f395784519250610f2783610a22565b82825260209485019490910190610f12565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b8281526040810160548310610f7b57634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b60805160a0516144a3610fa65f395f50505f610e0301526144a35ff3fe608060405234801561000f575f5ffd5b50600436106102d7575f3560e01c806395d89b411161018157806395d89b411461051c57806397ee1144146105245780639908840c1461055a5780639adb298114610563578063a68a526714610576578063a9059cbb14610589578063aa2f892d1461059c578063acdb3d51146105af578063b3d7f6b914610352578063b460af94146105b8578063b6eba653146105c6578063ba087652146105b8578063bdca9165146105dc578063c0b568e1146105e5578063c392e58c146105f8578063c3f0d30e1461060b578063c63d75b61461045d578063c6e6f5921461061e578063ce96cb7714610631578063d1717c7d14610644578063d3d0345814610658578063d853365f14610660578063d905777e14610668578063da1f12ab1461067b578063dceb7e2814610683578063dd62ed3e14610690578063e51a85f6146106a3578063e5e97193146106b6578063e66f53b7146106c9578063ef8b30f714610352578063f64c6f32146106dc575f5ffd5b806301e1d114146102db57806303d44854146102f257806306fdde031461030757806307a2d13a1461031c578063095ea7b31461032f5780630a28a477146103525780630a605c6d146103655780630c6a62dd1461036d5780630d1e6667146103805780630df571f7146103935780630fdca94f146103a657806318160ddd146103b957806318c21949146103c15780631f52692b146103d457806323b872dd146103f4578063313ce56714610407578063348ec5c81461041c57806338d52e0f1461042f5780633a0dad8e146104375780633ab6d27c1461044a578063402d267d1461045d578063493a6e21146104715780634cdad506146103525780634e85b135146104845780636e553f651461049957806370a08231146104a75780637847ea53146104ba57806379502c55146104da57806380ceebfe146104ed5780638f5c94651461050057806394bf804d14610499575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b610305610300366004613aa9565b6106e4565b005b61030f61081e565b6040516102e99190613b46565b6102df61032a366004613b58565b6108ae565b61034261033d366004613b8a565b6108bf565b60405190151581526020016102e9565b6102df610360366004613b58565b6108d6565b6015546102df565b61030561037b366004613bb2565b6108f0565b61030561038e366004613b58565b61098b565b6103056103a1366004613bcb565b610bfc565b6103056103b4366004613c28565b610c77565b6002546102df565b6103056103cf366004613b58565b610d0d565b6006546103e7906001600160a01b031681565b6040516102e99190613c9f565b610342610402366004613cb3565b610ddc565b60125b60405160ff90911681526020016102e9565b6009546103e7906001600160a01b031681565b6103e7610e01565b600a546103e7906001600160a01b031681565b610305610458366004613d0a565b610e25565b6102df61046b366004613bb2565b505f1990565b61030561047f366004613b58565b610ff2565b61048c611339565b6040516102e99190613d95565b6102df610360366004613da7565b6102df6104b5366004613bb2565b61134a565b6104c56301e1338081565b60405163ffffffff90911681526020016102e9565b6008546103e7906001600160a01b031681565b6102df6104fb366004613dd1565b611364565b61050961271081565b60405161ffff90911681526020016102e9565b61030f6113a4565b60175460185461054a9160ff81169161ffff610100830481169263010000009004169084565b6040516102e99493929190613e13565b61050961012c81565b610305610571366004613e85565b6113b3565b6102df610584366004613dd1565b611585565b610342610597366004613b8a565b6115b4565b6103056105aa366004613b58565b6115c1565b6102df60165481565b6102df610360366004613ecc565b6105ce61179a565b6040516102e9929190613f05565b610509610bb881565b6103056105f3366004613b58565b61191b565b610305610606366004613f5d565b611ad5565b610305610619366004613b58565b611f45565b6102df61062c366004613b58565b612139565b6102df61063f366004613bb2565b612144565b600a5461040a90600160a01b900460ff1681565b6105ce612157565b61040a601281565b6102df610676366004613bb2565b6122bb565b6127116102df565b6021546103429060ff1681565b6102df61069e366004613fc7565b6122c5565b6102df6106b1366004613b58565b6122ef565b6103056106c4366004613b58565b612328565b6007546103e7906001600160a01b031681565b6014546102df565b6006546001600160a01b0316331461070f57604051631a27eac360e11b815260040160405180910390fd5b610719600b612600565b5f5b81811015610819575f83838381811061073657610736613fef565b905060200201602081019061074b9190613bb2565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf9061077c908490600401613c9f565b602060405180830381865afa158015610797573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107bb9190614010565b6107e3578060405163751dff9760e11b81526004016107da9190613c9f565b60405180910390fd5b5f6107ef600b83612609565b90508061080f57604051630ea075bf60e21b815260040160405180910390fd5b505060010161071b565b505050565b60606003805461082d9061402b565b80601f01602080910402602001604051908101604052809291908181526020018280546108599061402b565b80156108a45780601f1061087b576101008083540402835291602001916108a4565b820191905f5260205f20905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b5f6108b9825f61261d565b92915050565b5f336108cc81858561265e565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b0316331461091b57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0381166109425760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61099361266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a079190614010565b610a24576040516312aecd8160e01b815260040160405180910390fd5b805f03610a4d57610a33610e01565b604051636b30633560e01b81526004016107da9190613c9f565b5f610a56610e01565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a819190613c9f565b602060405180830381865afa158015610a9c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac09190614063565b905080821115610ae357604051632ca2f52b60e11b815260040160405180910390fd5b5f610aec610e01565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610b2292339290911690889060040161407a565b6020604051808303815f875af1158015610b3e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190614010565b905080610b82576040516312171d8360e31b815260040160405180910390fd5b5f610b8e600e33612695565b9150610ba9905033610ba086846140b2565b600e91906126bb565b508360145f828254610bbb91906140b2565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bf96001600555565b50565b6009546001600160a01b03163314610c2757604051631a27eac360e11b815260040160405180910390fd5b8015610c73578060165f828254610c3e91906140b2565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b610ce98585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284375f920191909152506126d092505050565b610cf5838501856140c5565b6021805460ff19169115159190911790555050505050565b6006546001600160a01b03163314610d3857604051631a27eac360e11b815260040160405180910390fd5b805f03610d4757610a33610e01565b601654811115610d6a57604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610d7b91906140e0565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610dc3575f5ffd5b505af1158015610dd5573d5f5f3e3d5ffd5b5050505050565b5f33610de9858285612739565b610df4858585612784565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610e5057604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec49190614010565b610ee1576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f06576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f2d576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610f54576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610f6957610f69613dff565b6017805460ff19166001836004811115610f8557610f85613dff565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461101d57604051631a27eac360e11b815260040160405180910390fd5b61102561266b565b5f61103060116127e1565b90508063ffffffff165f03611045575061132f565b5f8163ffffffff166001600160401b03811115611064576110646140f3565b60405190808252806020026020018201604052801561108d578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156110af576110af6140f3565b6040519080825280602002602001820160405280156110d8578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015611172575f80611107601163ffffffff808616906127eb16565b9150915081858463ffffffff168151811061112457611124613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061115d5761115d613fef565b602090810291909101015250506001016110dd565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156111c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e59190614107565b90505f5b8463ffffffff168163ffffffff161015611329575f848263ffffffff168151811061121657611216613fef565b602002602001015190505f848363ffffffff168151811061123957611239613fef565b602002602001015190506112578260116127f990919063ffffffff16565b505f611264828a5f611585565b9050611270308361280d565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906112a29086908590600401614122565b5f604051808303815f87803b1580156112b9575f5ffd5b505af11580156112cb573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a45050508060010190506111e9565b50505050505b610bf96001600555565b6060611345600b612841565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f61139c61137061284d565b61137b90600a61421e565b60025461138891906140b2565b6113938560016140b2565b869190856128c9565b949350505050565b60606004805461082d9061402b565b6009546001600160a01b031633146113de57604051631a27eac360e11b815260040160405180910390fd5b601a545f5b8161ffff168161ffff16101561143c57601e5460195f601a8461ffff168154811061141057611410613fef565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556001016113e3565b50611448601a5f613a39565b825f5b8161ffff168161ffff1610156115285785858261ffff1681811061147157611471613fef565b9050604002016020013560195f88888561ffff1681811061149457611494613fef565b6114aa9260206040909202019081019150613bb2565b6001600160a01b0316815260208101919091526040015f2055601a868661ffff84168181106114db576114db613fef565b6114f19260206040909202019081019150613bb2565b8154600180820184555f93845260209093200180546001600160a01b0319166001600160a01b03929092169190911790550161144b565b50600d8390555f61154060125b61032a90600a61421e565b6018549091508111156115535760188190555b60405184907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a2505050505050565b5f61139c6115948460016140b2565b61159c61284d565b6115a790600a61421e565b60025461139391906140b2565b5f336108cc818585612784565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611611573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116359190614010565b611652576040516312aecd8160e01b815260040160405180910390fd5b805f036116745730604051636b30633560e01b81526004016107da9190613c9f565b5f61167e3361134a565b9050808211156116a157604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd906116ca9033908490889060040161407a565b6020604051808303815f875af11580156116e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170a9190614010565b90508061172a576040516312171d8360e31b815260040160405180910390fd5b5f611736601133612695565b915061175190503361174886846140b2565b601191906126bb565b508360155f82825461176391906140b2565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b601c54606090819061ffff81166001600160401b038111156117be576117be6140f3565b6040519080825280602002602001820160405280156117e7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611806576118066140f3565b60405190808252806020026020018201604052801561182f578160200160208202803683370190505b5091505f5b8161ffff168161ffff16101561191557601c8161ffff168154811061185b5761185b613fef565b905f5260205f20015f9054906101000a90046001600160a01b0316848261ffff168151811061188c5761188c613fef565b60200260200101906001600160a01b031690816001600160a01b031681525050601b5f601c8361ffff16815481106118c6576118c6613fef565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548351849061ffff841690811061190257611902613fef565b6020908102919091010152600101611834565b50509091565b61192361266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611973573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119979190614010565b6119b4576040516312aecd8160e01b815260040160405180910390fd5b805f036119c357610a33610e01565b5f6119cf600e33612695565b915050818110156119f357604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611a259033908690600401614122565b5f604051808303815f87803b158015611a3c575f5ffd5b505af1158015611a4e573d5f5f3e3d5ffd5b505050505f8282611a5f91906140e0565b9050805f03611a7957611a73600e336127f9565b50611a87565b611a85600e33836126bb565b505b8260145f828254611a9891906140e0565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bf96001600555565b6007546001600160a01b03163314611b0057604051631a27eac360e11b815260040160405180910390fd5b611b0861266b565b5f839003611b2957604051631121aa8d60e01b815260040160405180910390fd5b6021805460ff19169055601e5483905f61ffff83166001600160401b03811115611b5557611b556140f3565b604051908082528060200260200182016040528015611b7e578160200160208202803683370190505b5090505f8361ffff166001600160401b03811115611b9e57611b9e6140f3565b604051908082528060200260200182016040528015611bc7578160200160208202803683370190505b5090505f8461ffff166001600160401b03811115611be757611be76140f3565b604051908082528060200260200182016040528015611c10578160200160208202803683370190505b5090505f5b8561ffff168161ffff161015611dc9575f8a8a8361ffff16818110611c3c57611c3c613fef565b611c529260206040909202019081019150613bb2565b905080838361ffff1681518110611c6b57611c6b613fef565b60200260200101906001600160a01b031690816001600160a01b0316815250505f611cea8c8c8561ffff16818110611ca557611ca5613fef565b905060400201602001358b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061290b92505050565b9050611cf581612918565b506001600160a01b0382165f908152601d602052604090205460ff1615611d3157816040516346bdabe160e01b81526004016107da9190613c9f565b6001600160a01b0382165f908152601d60205260409020805460ff1916600117905585518290879061ffff8616908110611d6d57611d6d613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611da457611da4613fef565b602002602001018181525050611dba8782612927565b96505050806001019050611c15565b50611dd48185612955565b5f5b601c5461ffff9081169082161015611e3157601e54601b5f601c8461ffff1681548110611e0557611e05613fef565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055600101611dd6565b50611e3d601c5f613a39565b5f5b8561ffff168161ffff161015611f05575f848261ffff1681518110611e6657611e66613fef565b60200260200101519050838261ffff1681518110611e8657611e86613fef565b6020908102919091018101516001600160a01b039092165f818152601b8352604080822094909455601c805460018181019092557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b03191684179055918152601d909252919020805460ff1916905501611e3f565b5060405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050611f3f6001600555565b50505050565b611f4d61266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f9d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc19190614010565b611fde576040516312aecd8160e01b815260040160405180910390fd5b805f036120005730604051636b30633560e01b81526004016107da9190613c9f565b5f61200c601133612695565b9150508181101561203057604051632ca2f52b60e11b815260040160405180910390fd5b5f61203b83836140e0565b9050805f036120555761204f6011336127f9565b50612063565b612061601133836126bb565b505b8260155f82825461207491906140e0565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb906120a09033908890600401614122565b6020604051808303815f875af11580156120bc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120e09190614010565b905080612100576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bf96001600555565b5f6108b9825f6129c7565b5f6108b96121518361134a565b5f61261d565b601a54606090819061ffff81166001600160401b0381111561217b5761217b6140f3565b6040519080825280602002602001820160405280156121a4578160200160208202803683370190505b5092508061ffff166001600160401b038111156121c3576121c36140f3565b6040519080825280602002602001820160405280156121ec578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611915575f601a8261ffff168154811061221957612219613fef565b905f5260205f20015f9054906101000a90046001600160a01b0316905080858361ffff168151811061224d5761224d613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505060195f826001600160a01b03166001600160a01b031681526020019081526020015f2054848361ffff16815181106122a7576122a7613fef565b6020908102919091010152506001016121f1565b5f6108b98261134a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f6122fa836129f9565b90505f61230782856140e0565b90505f61231382612ac3565b905061231f81846140b2565b95945050505050565b600a546001600160a01b0316331461235357604051631a27eac360e11b815260040160405180910390fd5b61235b61266b565b5f612366600e6127e1565b90508063ffffffff165f0361237b575061132f565b5f8163ffffffff166001600160401b0381111561239a5761239a6140f3565b6040519080825280602002602001820160405280156123c3578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156123e5576123e56140f3565b60405190808252806020026020018201604052801561240e578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156124a8575f8061243d600e63ffffffff808616906127eb16565b9150915081858463ffffffff168151811061245a5761245a613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061249357612493613fef565b60209081029190910101525050600101612413565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156124f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251b9190614107565b90505f5b8463ffffffff168163ffffffff161015611329575f848263ffffffff168151811061254c5761254c613fef565b602002602001015190505f848363ffffffff168151811061256f5761256f613fef565b6020026020010151905061258d82600e6127f990919063ffffffff16565b505f61259a828a5f611364565b90506125a68382612b53565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a450505080600101905061251f565b610bf981612b87565b5f610dfa836001600160a01b038416612be0565b5f610dfa61262a600d5490565b6126359060016140b2565b61263d61284d565b61264890600a61421e565b60025461265591906140b2565b859190856128c9565b6108198383836001612c27565b60026005540361268e57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f8080806126ac866001600160a01b038716612cf9565b909450925050505b9250929050565b5f61139c846001600160a01b03851684612d31565b5f6126da84612d4d565b90505f6126e8828585612de9565b9050806127085760405163cf6c44e960e01b815260040160405180910390fd5b60405185907f1af0453083661051f6e56e5c070792320652e612154bf9af8637bb1e7655b99d905f90a25050505050565b5f61274484846122c5565b90505f19811015611f3f578181101561277657828183604051637dc7a0d960e11b81526004016107da9392919061422c565b611f3f84848484035f612c27565b6001600160a01b0383166127ad575f604051634b637e8f60e11b81526004016107da9190613c9f565b6001600160a01b0382166127d6575f60405163ec442f0560e01b81526004016107da9190613c9f565b610819838383612eb6565b5f6108b982612fc9565b5f8080806126ac8686612fd3565b5f610dfa836001600160a01b038416612ffc565b6001600160a01b038216612836575f604051634b637e8f60e11b81526004016107da9190613c9f565b610c73825f83612eb6565b60605f610dfa83613018565b5f5f612857610e01565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612892573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b6919061424d565b90506128c3816012614268565b91505090565b5f6128f66128d683613071565b80156128f157505f84806128ec576128ec614281565b868809115b151590565b61290186868661309d565b61231f91906140b2565b5f610dfa8383600661314d565b5f6129238230613237565b5090565b5f82612939576129365f6132a4565b92505b8161294a576129475f6132a4565b91505b610dfa83835f6132b9565b61295e8261334f565b5f61296b826020546133c7565b905061297681612918565b506040805160018082528183019092525f916020808301908036833701905050905081815f815181106129ab576129ab613fef565b6020908102919091010152610dd581630fdca94f60e01b6133f5565b5f610dfa6129d361284d565b6129de90600a61421e565b6002546129eb91906140b2565b600d546126559060016140b2565b6017545f906301000000900461ffff168103612a1657505f919050565b6017545f90612a33906301000000900461ffff168461271061309d565b9050610dfa60095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aac9190614295565b829063ffffffff908116906301e133809061309d16565b6017545f90610100900461ffff168103612ade57505f919050565b5f612af5612aee6012600a61421e565b845f611585565b6017549091505f908190612b0b9060ff16613401565b9150915081831015612b2157505f949350505050565b6017545f90612b3a90610100900461ffff16858461309d565b9050612b49818761271061309d565b9695505050505050565b6001600160a01b038216612b7c575f60405163ec442f0560e01b81526004016107da9190613c9f565b610c735f8383612eb6565b5f612b90825490565b90505f5b81811015612bd957826001015f845f018381548110612bb557612bb5613fef565b905f5260205f20015481526020019081526020015f205f9055806001019050612b94565b50505f9055565b5f612beb83836134eb565b612c2057508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108b9565b505f6108b9565b6001600160a01b038416612c50575f60405163e602df0560e01b81526004016107da9190613c9f565b6001600160a01b038316612c79575f604051634a1406b160e11b81526004016107da9190613c9f565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611f3f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612ceb91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612d2657612d1a8585613502565b92505f91506126b49050565b6001925090506126b4565b5f828152600284016020526040812082905561139c848461350d565b60605f612d58613518565b5f84815260018201602052604081205491925003612d895760405163d66ca67560e01b815260040160405180910390fd5b5f83815260018201602090815260409182902080548351818402810184019094528084529091830182828015612ddc57602002820191905f5260205f20905b815481526020019060010190808311612dc8575b5050505050915050919050565b5f5f83516020612df991906140b2565b612e049060206140b2565b90505f8482604051602001612e1a9291906142b8565b60405160208183030381529060405290505f612e3461353c565b60038101546040516378542ead60e01b81529192506001600160a01b0316906378542ead90612e6b908a9086908a90600401614302565b6020604051808303815f875af1158015612e87573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eab9190614010565b979650505050505050565b6001600160a01b038316612ee0578060025f828254612ed591906140b2565b90915550612f3d9050565b6001600160a01b0383165f9081526020819052604090205481811015612f1f5783818360405163391434e360e21b81526004016107da9392919061422c565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612f5957600280548290039055612f77565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612fbc91815260200190565b60405180910390a3505050565b5f6108b982613560565b5f8080612fe08585613569565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610dfa8383613574565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561306557602002820191905f5260205f20905b815481526020019060010190808311613051575b50505050509050919050565b5f600282600381111561308657613086613dff565b613090919061433a565b60ff166001149050919050565b5f5f5f6130aa868661357f565b91509150815f036130ce578381816130c4576130c4614281565b0492505050610dfa565b8184116130e5576130e5600385150260111861359b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f5f61315761353c565b600181015460405163196d0b9b60e01b81529192506001600160a01b03169063196d0b9b9061319090889033908990899060040161437b565b6020604051808303815f875af11580156131ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614063565b8154604051630f8e573b60e21b81529193506001600160a01b031690633e395cec9061320290859033906004016143b3565b5f604051808303815f87803b158015613219575f5ffd5b505af115801561322b573d5f5f3e3d5ffd5b50505050509392505050565b5f61324061353c565b8054604051635ca4b5b160e11b81529192506001600160a01b03169063b9496b629061327290869086906004016143b3565b5f604051808303815f87803b158015613289575f5ffd5b505af115801561329b573d5f5f3e3d5ffd5b50505050505050565b5f6108b9826001600160801b031660066135ac565b5f5f82156132cc5750600160f81b6132cf565b505f5b5f6132d861353c565b600181015460405163022f65e760e31b81529192506001600160a01b03169063117b2f389061330f908990899087906004016143ca565b6020604051808303815f875af115801561332b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b499190614063565b5f5b8151811015610c735761338782828151811061336f5761336f613fef565b6020026020010151600b61362b90919063ffffffff16565b6133bf5781818151811061339d5761339d613fef565b602002602001015160405163751dff9760e11b81526004016107da9190613c9f565b600101613351565b5f826133d9576133d65f6132a4565b92505b816133ea576133e75f6132a4565b91505b610dfa83835f61363f565b5f610dfa83835f613695565b5f808061340e6012611535565b90505f84600481111561342357613423613dff565b03613433578092508291506134e5565b600384600481111561344757613447613dff565b036134595760185492508291506134e5565b600184600481111561346d5761346d613dff565b036134855761347b81613796565b92508091506134e5565b600284600481111561349957613499613dff565b036134b1576134a781613796565b92508291506134e5565b60048460048111156134c5576134c5613dff565b036134e5576018546134df906134da83613796565b6138bc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610dfa83836138cb565b5f610dfa8383612be0565b7f878245876662ba28a480c5ea71726db859fb50222b0a3d7cbbc21cfa336faf0090565b7f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e464970090565b5f6108b9825490565b5f610dfa83836138d6565b5f610dfa83836138fc565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f6135b661353c565b6001810154604051639cd07acb60e01b81529192506001600160a01b031690639cd07acb906135eb90879087906004016143ea565b6020604051808303815f875af1158015613607573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139c9190614063565b5f610dfa836001600160a01b0384166134eb565b5f5f82156136525750600160f81b613655565b505f5b5f61365e61353c565b600181015460405163f77f3f1d60e01b81529192506001600160a01b03169063f77f3f1d9061330f908990899087906004016143ca565b5f5f61369f613518565b8054925090505f6136ae61353c565b8054604051637d6e912360e11b81529192506001600160a01b03169063fadd2246906136de9089906004016143fe565b5f604051808303815f87803b1580156136f5575f5ffd5b505af1158015613707573d5f5f3e3d5ffd5b5050506002820154604051633263b83b60e01b81526001600160a01b039091169150633263b83b9086906137439087908b908b90600401614410565b5f604051808303818588803b15801561375a575f5ffd5b505af115801561376c573d5f5f3e3d5ffd5b505050505061377b83876139df565b8154825f61378883614441565b919050555050509392505050565b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061380c9190614107565b61ffff1690505f6138a160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613866573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061388a9190614295565b839063ffffffff908116906301e133809061309d16565b905061139c6138b2826127106140b2565b859061271061309d565b5f828218828411028218610dfa565b5f610dfa83836134eb565b5f825f0182815481106138eb576138eb613fef565b905f5260205f200154905092915050565b5f81815260018301602052604081205480156139d6575f61391e6001836140e0565b85549091505f90613931906001906140e0565b9050808214613990575f865f01828154811061394f5761394f613fef565b905f5260205f200154905080875f01848154811061396f5761396f613fef565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806139a1576139a1614459565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506108b9565b5f9150506108b9565b5f6139e8613518565b5f84815260018201602052604090205490915015613a1957604051633f06d22b60e01b815260040160405180910390fd5b5f83815260018201602090815260409091208351611f3f92850190613a54565b5080545f8255905f5260205f2090810190610bf99190613a95565b828054828255905f5260205f20908101928215613a8d579160200282015b82811115613a8d578251825591602001919060010190613a72565b506129239291505b5b80821115612923575f8155600101613a96565b5f5f60208385031215613aba575f5ffd5b82356001600160401b03811115613acf575f5ffd5b8301601f81018513613adf575f5ffd5b80356001600160401b03811115613af4575f5ffd5b8560208260051b8401011115613b08575f5ffd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610dfa6020830184613b18565b5f60208284031215613b68575f5ffd5b5035919050565b80356001600160a01b0381168114613b85575f5ffd5b919050565b5f5f60408385031215613b9b575f5ffd5b613ba483613b6f565b946020939093013593505050565b5f60208284031215613bc2575f5ffd5b610dfa82613b6f565b5f5f60408385031215613bdc575f5ffd5b50508035926020909101359150565b5f5f83601f840112613bfb575f5ffd5b5081356001600160401b03811115613c11575f5ffd5b6020830191508360208285010111156126b4575f5ffd5b5f5f5f5f5f60608688031215613c3c575f5ffd5b8535945060208601356001600160401b03811115613c58575f5ffd5b613c6488828901613beb565b90955093505060408601356001600160401b03811115613c82575f5ffd5b613c8e88828901613beb565b969995985093965092949392505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613cc5575f5ffd5b613cce84613b6f565b9250613cdc60208501613b6f565b929592945050506040919091013590565b60ff81168114610bf9575f5ffd5b61ffff81168114610bf9575f5ffd5b5f5f5f60608486031215613d1c575f5ffd5b8335613d2781613ced565b92506020840135613d3781613cfb565b91506040840135613d4781613cfb565b809150509250925092565b5f8151808452602084019350602083015f5b82811015613d8b5781516001600160a01b0316865260209586019590910190600101613d64565b5093949350505050565b602081525f610dfa6020830184613d52565b5f5f60408385031215613db8575f5ffd5b82359150613dc860208401613b6f565b90509250929050565b5f5f5f60608486031215613de3575f5ffd5b8335925060208401359150604084013560048110613d47575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b6080810160058610613e2757613e27613dff565b94815261ffff93841660208201529190921660408201526060015290565b5f5f83601f840112613e55575f5ffd5b5081356001600160401b03811115613e6b575f5ffd5b6020830191508360208260061b85010111156126b4575f5ffd5b5f5f5f60408486031215613e97575f5ffd5b83356001600160401b03811115613eac575f5ffd5b613eb886828701613e45565b909790965060209590950135949350505050565b5f5f5f60608486031215613ede575f5ffd5b83359250613eee60208501613b6f565b9150613efc60408501613b6f565b90509250925092565b604081525f613f176040830185613d52565b82810360208401528084518083526020830191506020860192505f5b81811015613f51578351835260209384019390920191600101613f33565b50909695505050505050565b5f5f5f5f60408587031215613f70575f5ffd5b84356001600160401b03811115613f85575f5ffd5b613f9187828801613e45565b90955093505060208501356001600160401b03811115613faf575f5ffd5b613fbb87828801613beb565b95989497509550505050565b5f5f60408385031215613fd8575f5ffd5b613fe183613b6f565b9150613dc860208401613b6f565b634e487b7160e01b5f52603260045260245ffd5b8015158114610bf9575f5ffd5b5f60208284031215614020575f5ffd5b8151610dfa81614003565b600181811c9082168061403f57607f821691505b60208210810361405d57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215614073575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108b9576108b961409e565b5f602082840312156140d5575f5ffd5b8135610dfa81614003565b818103818111156108b9576108b961409e565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215614117575f5ffd5b8151610dfa81613cfb565b6001600160a01b03929092168252602082015260400190565b6001815b60018411156141765780850481111561415a5761415a61409e565b600184161561416857908102905b60019390931c92800261413f565b935093915050565b5f8261418c575060016108b9565b8161419857505f6108b9565b81600181146141ae57600281146141b8576141d4565b60019150506108b9565b60ff8411156141c9576141c961409e565b50506001821b6108b9565b5060208310610133831016604e8410600b84101617156141f7575081810a6108b9565b6142035f19848461413b565b805f19048211156142165761421661409e565b029392505050565b5f610dfa60ff84168361417e565b6001600160a01b039390931683526020830191909152604082015260600190565b5f6020828403121561425d575f5ffd5b8151610dfa81613ced565b60ff82811682821603908111156108b9576108b961409e565b634e487b7160e01b5f52601260045260245ffd5b5f602082840312156142a5575f5ffd5b815163ffffffff81168114610dfa575f5ffd5b5f83518060208601845e9190910191825250602001919050565b5f8151808452602084019350602083015f5b82811015613d8b5781518652602095860195909101906001016142e4565b606081525f61431460608301866142d2565b82810360208401526143268186613b18565b90508281036040840152612b498185613b18565b5f60ff83168061435857634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b6054811061437757614377613dff565b9052565b8481526001600160a01b03841660208201526080604082018190525f906143a490830185613b18565b905061231f6060830184614367565b9182526001600160a01b0316602082015260400190565b92835260208301919091526001600160f81b031916604082015260600190565b82815260408101610dfa6020830184614367565b602081525f610dfa60208301846142d2565b838152606060208201525f61442860608301856142d2565b905063ffffffff60e01b83166040830152949350505050565b5f600182016144525761445261409e565b5060010190565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220502b403798751e8b4cb2e6144091da0ffead77b5fb53557b41e28cb02ae1240264736f6c634300081c00339e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e46497019e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e4649700", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106102d7575f3560e01c806395d89b411161018157806395d89b411461051c57806397ee1144146105245780639908840c1461055a5780639adb298114610563578063a68a526714610576578063a9059cbb14610589578063aa2f892d1461059c578063acdb3d51146105af578063b3d7f6b914610352578063b460af94146105b8578063b6eba653146105c6578063ba087652146105b8578063bdca9165146105dc578063c0b568e1146105e5578063c392e58c146105f8578063c3f0d30e1461060b578063c63d75b61461045d578063c6e6f5921461061e578063ce96cb7714610631578063d1717c7d14610644578063d3d0345814610658578063d853365f14610660578063d905777e14610668578063da1f12ab1461067b578063dceb7e2814610683578063dd62ed3e14610690578063e51a85f6146106a3578063e5e97193146106b6578063e66f53b7146106c9578063ef8b30f714610352578063f64c6f32146106dc575f5ffd5b806301e1d114146102db57806303d44854146102f257806306fdde031461030757806307a2d13a1461031c578063095ea7b31461032f5780630a28a477146103525780630a605c6d146103655780630c6a62dd1461036d5780630d1e6667146103805780630df571f7146103935780630fdca94f146103a657806318160ddd146103b957806318c21949146103c15780631f52692b146103d457806323b872dd146103f4578063313ce56714610407578063348ec5c81461041c57806338d52e0f1461042f5780633a0dad8e146104375780633ab6d27c1461044a578063402d267d1461045d578063493a6e21146104715780634cdad506146103525780634e85b135146104845780636e553f651461049957806370a08231146104a75780637847ea53146104ba57806379502c55146104da57806380ceebfe146104ed5780638f5c94651461050057806394bf804d14610499575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b610305610300366004613aa9565b6106e4565b005b61030f61081e565b6040516102e99190613b46565b6102df61032a366004613b58565b6108ae565b61034261033d366004613b8a565b6108bf565b60405190151581526020016102e9565b6102df610360366004613b58565b6108d6565b6015546102df565b61030561037b366004613bb2565b6108f0565b61030561038e366004613b58565b61098b565b6103056103a1366004613bcb565b610bfc565b6103056103b4366004613c28565b610c77565b6002546102df565b6103056103cf366004613b58565b610d0d565b6006546103e7906001600160a01b031681565b6040516102e99190613c9f565b610342610402366004613cb3565b610ddc565b60125b60405160ff90911681526020016102e9565b6009546103e7906001600160a01b031681565b6103e7610e01565b600a546103e7906001600160a01b031681565b610305610458366004613d0a565b610e25565b6102df61046b366004613bb2565b505f1990565b61030561047f366004613b58565b610ff2565b61048c611339565b6040516102e99190613d95565b6102df610360366004613da7565b6102df6104b5366004613bb2565b61134a565b6104c56301e1338081565b60405163ffffffff90911681526020016102e9565b6008546103e7906001600160a01b031681565b6102df6104fb366004613dd1565b611364565b61050961271081565b60405161ffff90911681526020016102e9565b61030f6113a4565b60175460185461054a9160ff81169161ffff610100830481169263010000009004169084565b6040516102e99493929190613e13565b61050961012c81565b610305610571366004613e85565b6113b3565b6102df610584366004613dd1565b611585565b610342610597366004613b8a565b6115b4565b6103056105aa366004613b58565b6115c1565b6102df60165481565b6102df610360366004613ecc565b6105ce61179a565b6040516102e9929190613f05565b610509610bb881565b6103056105f3366004613b58565b61191b565b610305610606366004613f5d565b611ad5565b610305610619366004613b58565b611f45565b6102df61062c366004613b58565b612139565b6102df61063f366004613bb2565b612144565b600a5461040a90600160a01b900460ff1681565b6105ce612157565b61040a601281565b6102df610676366004613bb2565b6122bb565b6127116102df565b6021546103429060ff1681565b6102df61069e366004613fc7565b6122c5565b6102df6106b1366004613b58565b6122ef565b6103056106c4366004613b58565b612328565b6007546103e7906001600160a01b031681565b6014546102df565b6006546001600160a01b0316331461070f57604051631a27eac360e11b815260040160405180910390fd5b610719600b612600565b5f5b81811015610819575f83838381811061073657610736613fef565b905060200201602081019061074b9190613bb2565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf9061077c908490600401613c9f565b602060405180830381865afa158015610797573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107bb9190614010565b6107e3578060405163751dff9760e11b81526004016107da9190613c9f565b60405180910390fd5b5f6107ef600b83612609565b90508061080f57604051630ea075bf60e21b815260040160405180910390fd5b505060010161071b565b505050565b60606003805461082d9061402b565b80601f01602080910402602001604051908101604052809291908181526020018280546108599061402b565b80156108a45780601f1061087b576101008083540402835291602001916108a4565b820191905f5260205f20905b81548152906001019060200180831161088757829003601f168201915b5050505050905090565b5f6108b9825f61261d565b92915050565b5f336108cc81858561265e565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b0316331461091b57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0381166109425760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61099361266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a079190614010565b610a24576040516312aecd8160e01b815260040160405180910390fd5b805f03610a4d57610a33610e01565b604051636b30633560e01b81526004016107da9190613c9f565b5f610a56610e01565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a819190613c9f565b602060405180830381865afa158015610a9c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac09190614063565b905080821115610ae357604051632ca2f52b60e11b815260040160405180910390fd5b5f610aec610e01565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610b2292339290911690889060040161407a565b6020604051808303815f875af1158015610b3e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190614010565b905080610b82576040516312171d8360e31b815260040160405180910390fd5b5f610b8e600e33612695565b9150610ba9905033610ba086846140b2565b600e91906126bb565b508360145f828254610bbb91906140b2565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bf96001600555565b50565b6009546001600160a01b03163314610c2757604051631a27eac360e11b815260040160405180910390fd5b8015610c73578060165f828254610c3e91906140b2565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b610ce98585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020601f890181900481028201810190925287815292508791508690819084018382808284375f920191909152506126d092505050565b610cf5838501856140c5565b6021805460ff19169115159190911790555050505050565b6006546001600160a01b03163314610d3857604051631a27eac360e11b815260040160405180910390fd5b805f03610d4757610a33610e01565b601654811115610d6a57604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610d7b91906140e0565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610dc3575f5ffd5b505af1158015610dd5573d5f5f3e3d5ffd5b5050505050565b5f33610de9858285612739565b610df4858585612784565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610e5057604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec49190614010565b610ee1576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f06576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f2d576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610f54576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610f6957610f69613dff565b6017805460ff19166001836004811115610f8557610f85613dff565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461101d57604051631a27eac360e11b815260040160405180910390fd5b61102561266b565b5f61103060116127e1565b90508063ffffffff165f03611045575061132f565b5f8163ffffffff166001600160401b03811115611064576110646140f3565b60405190808252806020026020018201604052801561108d578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156110af576110af6140f3565b6040519080825280602002602001820160405280156110d8578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015611172575f80611107601163ffffffff808616906127eb16565b9150915081858463ffffffff168151811061112457611124613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061115d5761115d613fef565b602090810291909101015250506001016110dd565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156111c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e59190614107565b90505f5b8463ffffffff168163ffffffff161015611329575f848263ffffffff168151811061121657611216613fef565b602002602001015190505f848363ffffffff168151811061123957611239613fef565b602002602001015190506112578260116127f990919063ffffffff16565b505f611264828a5f611585565b9050611270308361280d565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906112a29086908590600401614122565b5f604051808303815f87803b1580156112b9575f5ffd5b505af11580156112cb573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a45050508060010190506111e9565b50505050505b610bf96001600555565b6060611345600b612841565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f61139c61137061284d565b61137b90600a61421e565b60025461138891906140b2565b6113938560016140b2565b869190856128c9565b949350505050565b60606004805461082d9061402b565b6009546001600160a01b031633146113de57604051631a27eac360e11b815260040160405180910390fd5b601a545f5b8161ffff168161ffff16101561143c57601e5460195f601a8461ffff168154811061141057611410613fef565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556001016113e3565b50611448601a5f613a39565b825f5b8161ffff168161ffff1610156115285785858261ffff1681811061147157611471613fef565b9050604002016020013560195f88888561ffff1681811061149457611494613fef565b6114aa9260206040909202019081019150613bb2565b6001600160a01b0316815260208101919091526040015f2055601a868661ffff84168181106114db576114db613fef565b6114f19260206040909202019081019150613bb2565b8154600180820184555f93845260209093200180546001600160a01b0319166001600160a01b03929092169190911790550161144b565b50600d8390555f61154060125b61032a90600a61421e565b6018549091508111156115535760188190555b60405184907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a2505050505050565b5f61139c6115948460016140b2565b61159c61284d565b6115a790600a61421e565b60025461139391906140b2565b5f336108cc818585612784565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611611573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116359190614010565b611652576040516312aecd8160e01b815260040160405180910390fd5b805f036116745730604051636b30633560e01b81526004016107da9190613c9f565b5f61167e3361134a565b9050808211156116a157604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd906116ca9033908490889060040161407a565b6020604051808303815f875af11580156116e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170a9190614010565b90508061172a576040516312171d8360e31b815260040160405180910390fd5b5f611736601133612695565b915061175190503361174886846140b2565b601191906126bb565b508360155f82825461176391906140b2565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b601c54606090819061ffff81166001600160401b038111156117be576117be6140f3565b6040519080825280602002602001820160405280156117e7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611806576118066140f3565b60405190808252806020026020018201604052801561182f578160200160208202803683370190505b5091505f5b8161ffff168161ffff16101561191557601c8161ffff168154811061185b5761185b613fef565b905f5260205f20015f9054906101000a90046001600160a01b0316848261ffff168151811061188c5761188c613fef565b60200260200101906001600160a01b031690816001600160a01b031681525050601b5f601c8361ffff16815481106118c6576118c6613fef565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548351849061ffff841690811061190257611902613fef565b6020908102919091010152600101611834565b50509091565b61192361266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611973573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119979190614010565b6119b4576040516312aecd8160e01b815260040160405180910390fd5b805f036119c357610a33610e01565b5f6119cf600e33612695565b915050818110156119f357604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611a259033908690600401614122565b5f604051808303815f87803b158015611a3c575f5ffd5b505af1158015611a4e573d5f5f3e3d5ffd5b505050505f8282611a5f91906140e0565b9050805f03611a7957611a73600e336127f9565b50611a87565b611a85600e33836126bb565b505b8260145f828254611a9891906140e0565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bf96001600555565b6007546001600160a01b03163314611b0057604051631a27eac360e11b815260040160405180910390fd5b611b0861266b565b5f839003611b2957604051631121aa8d60e01b815260040160405180910390fd5b6021805460ff19169055601e5483905f61ffff83166001600160401b03811115611b5557611b556140f3565b604051908082528060200260200182016040528015611b7e578160200160208202803683370190505b5090505f8361ffff166001600160401b03811115611b9e57611b9e6140f3565b604051908082528060200260200182016040528015611bc7578160200160208202803683370190505b5090505f8461ffff166001600160401b03811115611be757611be76140f3565b604051908082528060200260200182016040528015611c10578160200160208202803683370190505b5090505f5b8561ffff168161ffff161015611dc9575f8a8a8361ffff16818110611c3c57611c3c613fef565b611c529260206040909202019081019150613bb2565b905080838361ffff1681518110611c6b57611c6b613fef565b60200260200101906001600160a01b031690816001600160a01b0316815250505f611cea8c8c8561ffff16818110611ca557611ca5613fef565b905060400201602001358b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061290b92505050565b9050611cf581612918565b506001600160a01b0382165f908152601d602052604090205460ff1615611d3157816040516346bdabe160e01b81526004016107da9190613c9f565b6001600160a01b0382165f908152601d60205260409020805460ff1916600117905585518290879061ffff8616908110611d6d57611d6d613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611da457611da4613fef565b602002602001018181525050611dba8782612927565b96505050806001019050611c15565b50611dd48185612955565b5f5b601c5461ffff9081169082161015611e3157601e54601b5f601c8461ffff1681548110611e0557611e05613fef565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055600101611dd6565b50611e3d601c5f613a39565b5f5b8561ffff168161ffff161015611f05575f848261ffff1681518110611e6657611e66613fef565b60200260200101519050838261ffff1681518110611e8657611e86613fef565b6020908102919091018101516001600160a01b039092165f818152601b8352604080822094909455601c805460018181019092557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b03191684179055918152601d909252919020805460ff1916905501611e3f565b5060405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050611f3f6001600555565b50505050565b611f4d61266b565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f9d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc19190614010565b611fde576040516312aecd8160e01b815260040160405180910390fd5b805f036120005730604051636b30633560e01b81526004016107da9190613c9f565b5f61200c601133612695565b9150508181101561203057604051632ca2f52b60e11b815260040160405180910390fd5b5f61203b83836140e0565b9050805f036120555761204f6011336127f9565b50612063565b612061601133836126bb565b505b8260155f82825461207491906140e0565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb906120a09033908890600401614122565b6020604051808303815f875af11580156120bc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120e09190614010565b905080612100576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bf96001600555565b5f6108b9825f6129c7565b5f6108b96121518361134a565b5f61261d565b601a54606090819061ffff81166001600160401b0381111561217b5761217b6140f3565b6040519080825280602002602001820160405280156121a4578160200160208202803683370190505b5092508061ffff166001600160401b038111156121c3576121c36140f3565b6040519080825280602002602001820160405280156121ec578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611915575f601a8261ffff168154811061221957612219613fef565b905f5260205f20015f9054906101000a90046001600160a01b0316905080858361ffff168151811061224d5761224d613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505060195f826001600160a01b03166001600160a01b031681526020019081526020015f2054848361ffff16815181106122a7576122a7613fef565b6020908102919091010152506001016121f1565b5f6108b98261134a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f6122fa836129f9565b90505f61230782856140e0565b90505f61231382612ac3565b905061231f81846140b2565b95945050505050565b600a546001600160a01b0316331461235357604051631a27eac360e11b815260040160405180910390fd5b61235b61266b565b5f612366600e6127e1565b90508063ffffffff165f0361237b575061132f565b5f8163ffffffff166001600160401b0381111561239a5761239a6140f3565b6040519080825280602002602001820160405280156123c3578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156123e5576123e56140f3565b60405190808252806020026020018201604052801561240e578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156124a8575f8061243d600e63ffffffff808616906127eb16565b9150915081858463ffffffff168151811061245a5761245a613fef565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061249357612493613fef565b60209081029190910101525050600101612413565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156124f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251b9190614107565b90505f5b8463ffffffff168163ffffffff161015611329575f848263ffffffff168151811061254c5761254c613fef565b602002602001015190505f848363ffffffff168151811061256f5761256f613fef565b6020026020010151905061258d82600e6127f990919063ffffffff16565b505f61259a828a5f611364565b90506125a68382612b53565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a450505080600101905061251f565b610bf981612b87565b5f610dfa836001600160a01b038416612be0565b5f610dfa61262a600d5490565b6126359060016140b2565b61263d61284d565b61264890600a61421e565b60025461265591906140b2565b859190856128c9565b6108198383836001612c27565b60026005540361268e57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f8080806126ac866001600160a01b038716612cf9565b909450925050505b9250929050565b5f61139c846001600160a01b03851684612d31565b5f6126da84612d4d565b90505f6126e8828585612de9565b9050806127085760405163cf6c44e960e01b815260040160405180910390fd5b60405185907f1af0453083661051f6e56e5c070792320652e612154bf9af8637bb1e7655b99d905f90a25050505050565b5f61274484846122c5565b90505f19811015611f3f578181101561277657828183604051637dc7a0d960e11b81526004016107da9392919061422c565b611f3f84848484035f612c27565b6001600160a01b0383166127ad575f604051634b637e8f60e11b81526004016107da9190613c9f565b6001600160a01b0382166127d6575f60405163ec442f0560e01b81526004016107da9190613c9f565b610819838383612eb6565b5f6108b982612fc9565b5f8080806126ac8686612fd3565b5f610dfa836001600160a01b038416612ffc565b6001600160a01b038216612836575f604051634b637e8f60e11b81526004016107da9190613c9f565b610c73825f83612eb6565b60605f610dfa83613018565b5f5f612857610e01565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612892573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b6919061424d565b90506128c3816012614268565b91505090565b5f6128f66128d683613071565b80156128f157505f84806128ec576128ec614281565b868809115b151590565b61290186868661309d565b61231f91906140b2565b5f610dfa8383600661314d565b5f6129238230613237565b5090565b5f82612939576129365f6132a4565b92505b8161294a576129475f6132a4565b91505b610dfa83835f6132b9565b61295e8261334f565b5f61296b826020546133c7565b905061297681612918565b506040805160018082528183019092525f916020808301908036833701905050905081815f815181106129ab576129ab613fef565b6020908102919091010152610dd581630fdca94f60e01b6133f5565b5f610dfa6129d361284d565b6129de90600a61421e565b6002546129eb91906140b2565b600d546126559060016140b2565b6017545f906301000000900461ffff168103612a1657505f919050565b6017545f90612a33906301000000900461ffff168461271061309d565b9050610dfa60095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aac9190614295565b829063ffffffff908116906301e133809061309d16565b6017545f90610100900461ffff168103612ade57505f919050565b5f612af5612aee6012600a61421e565b845f611585565b6017549091505f908190612b0b9060ff16613401565b9150915081831015612b2157505f949350505050565b6017545f90612b3a90610100900461ffff16858461309d565b9050612b49818761271061309d565b9695505050505050565b6001600160a01b038216612b7c575f60405163ec442f0560e01b81526004016107da9190613c9f565b610c735f8383612eb6565b5f612b90825490565b90505f5b81811015612bd957826001015f845f018381548110612bb557612bb5613fef565b905f5260205f20015481526020019081526020015f205f9055806001019050612b94565b50505f9055565b5f612beb83836134eb565b612c2057508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108b9565b505f6108b9565b6001600160a01b038416612c50575f60405163e602df0560e01b81526004016107da9190613c9f565b6001600160a01b038316612c79575f604051634a1406b160e11b81526004016107da9190613c9f565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611f3f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612ceb91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612d2657612d1a8585613502565b92505f91506126b49050565b6001925090506126b4565b5f828152600284016020526040812082905561139c848461350d565b60605f612d58613518565b5f84815260018201602052604081205491925003612d895760405163d66ca67560e01b815260040160405180910390fd5b5f83815260018201602090815260409182902080548351818402810184019094528084529091830182828015612ddc57602002820191905f5260205f20905b815481526020019060010190808311612dc8575b5050505050915050919050565b5f5f83516020612df991906140b2565b612e049060206140b2565b90505f8482604051602001612e1a9291906142b8565b60405160208183030381529060405290505f612e3461353c565b60038101546040516378542ead60e01b81529192506001600160a01b0316906378542ead90612e6b908a9086908a90600401614302565b6020604051808303815f875af1158015612e87573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eab9190614010565b979650505050505050565b6001600160a01b038316612ee0578060025f828254612ed591906140b2565b90915550612f3d9050565b6001600160a01b0383165f9081526020819052604090205481811015612f1f5783818360405163391434e360e21b81526004016107da9392919061422c565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612f5957600280548290039055612f77565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612fbc91815260200190565b60405180910390a3505050565b5f6108b982613560565b5f8080612fe08585613569565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610dfa8383613574565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561306557602002820191905f5260205f20905b815481526020019060010190808311613051575b50505050509050919050565b5f600282600381111561308657613086613dff565b613090919061433a565b60ff166001149050919050565b5f5f5f6130aa868661357f565b91509150815f036130ce578381816130c4576130c4614281565b0492505050610dfa565b8184116130e5576130e5600385150260111861359b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f5f61315761353c565b600181015460405163196d0b9b60e01b81529192506001600160a01b03169063196d0b9b9061319090889033908990899060040161437b565b6020604051808303815f875af11580156131ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d09190614063565b8154604051630f8e573b60e21b81529193506001600160a01b031690633e395cec9061320290859033906004016143b3565b5f604051808303815f87803b158015613219575f5ffd5b505af115801561322b573d5f5f3e3d5ffd5b50505050509392505050565b5f61324061353c565b8054604051635ca4b5b160e11b81529192506001600160a01b03169063b9496b629061327290869086906004016143b3565b5f604051808303815f87803b158015613289575f5ffd5b505af115801561329b573d5f5f3e3d5ffd5b50505050505050565b5f6108b9826001600160801b031660066135ac565b5f5f82156132cc5750600160f81b6132cf565b505f5b5f6132d861353c565b600181015460405163022f65e760e31b81529192506001600160a01b03169063117b2f389061330f908990899087906004016143ca565b6020604051808303815f875af115801561332b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b499190614063565b5f5b8151811015610c735761338782828151811061336f5761336f613fef565b6020026020010151600b61362b90919063ffffffff16565b6133bf5781818151811061339d5761339d613fef565b602002602001015160405163751dff9760e11b81526004016107da9190613c9f565b600101613351565b5f826133d9576133d65f6132a4565b92505b816133ea576133e75f6132a4565b91505b610dfa83835f61363f565b5f610dfa83835f613695565b5f808061340e6012611535565b90505f84600481111561342357613423613dff565b03613433578092508291506134e5565b600384600481111561344757613447613dff565b036134595760185492508291506134e5565b600184600481111561346d5761346d613dff565b036134855761347b81613796565b92508091506134e5565b600284600481111561349957613499613dff565b036134b1576134a781613796565b92508291506134e5565b60048460048111156134c5576134c5613dff565b036134e5576018546134df906134da83613796565b6138bc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610dfa83836138cb565b5f610dfa8383612be0565b7f878245876662ba28a480c5ea71726db859fb50222b0a3d7cbbc21cfa336faf0090565b7f9e7b61f58c47dc699ac88507c4f5bb9f121c03808c5676a8078fe583e464970090565b5f6108b9825490565b5f610dfa83836138d6565b5f610dfa83836138fc565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f6135b661353c565b6001810154604051639cd07acb60e01b81529192506001600160a01b031690639cd07acb906135eb90879087906004016143ea565b6020604051808303815f875af1158015613607573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139c9190614063565b5f610dfa836001600160a01b0384166134eb565b5f5f82156136525750600160f81b613655565b505f5b5f61365e61353c565b600181015460405163f77f3f1d60e01b81529192506001600160a01b03169063f77f3f1d9061330f908990899087906004016143ca565b5f5f61369f613518565b8054925090505f6136ae61353c565b8054604051637d6e912360e11b81529192506001600160a01b03169063fadd2246906136de9089906004016143fe565b5f604051808303815f87803b1580156136f5575f5ffd5b505af1158015613707573d5f5f3e3d5ffd5b5050506002820154604051633263b83b60e01b81526001600160a01b039091169150633263b83b9086906137439087908b908b90600401614410565b5f604051808303818588803b15801561375a575f5ffd5b505af115801561376c573d5f5f3e3d5ffd5b505050505061377b83876139df565b8154825f61378883614441565b919050555050509392505050565b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061380c9190614107565b61ffff1690505f6138a160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613866573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061388a9190614295565b839063ffffffff908116906301e133809061309d16565b905061139c6138b2826127106140b2565b859061271061309d565b5f828218828411028218610dfa565b5f610dfa83836134eb565b5f825f0182815481106138eb576138eb613fef565b905f5260205f200154905092915050565b5f81815260018301602052604081205480156139d6575f61391e6001836140e0565b85549091505f90613931906001906140e0565b9050808214613990575f865f01828154811061394f5761394f613fef565b905f5260205f200154905080875f01848154811061396f5761396f613fef565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806139a1576139a1614459565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506108b9565b5f9150506108b9565b5f6139e8613518565b5f84815260018201602052604090205490915015613a1957604051633f06d22b60e01b815260040160405180910390fd5b5f83815260018201602090815260409091208351611f3f92850190613a54565b5080545f8255905f5260205f2090810190610bf99190613a95565b828054828255905f5260205f20908101928215613a8d579160200282015b82811115613a8d578251825591602001919060010190613a72565b506129239291505b5b80821115612923575f8155600101613a96565b5f5f60208385031215613aba575f5ffd5b82356001600160401b03811115613acf575f5ffd5b8301601f81018513613adf575f5ffd5b80356001600160401b03811115613af4575f5ffd5b8560208260051b8401011115613b08575f5ffd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610dfa6020830184613b18565b5f60208284031215613b68575f5ffd5b5035919050565b80356001600160a01b0381168114613b85575f5ffd5b919050565b5f5f60408385031215613b9b575f5ffd5b613ba483613b6f565b946020939093013593505050565b5f60208284031215613bc2575f5ffd5b610dfa82613b6f565b5f5f60408385031215613bdc575f5ffd5b50508035926020909101359150565b5f5f83601f840112613bfb575f5ffd5b5081356001600160401b03811115613c11575f5ffd5b6020830191508360208285010111156126b4575f5ffd5b5f5f5f5f5f60608688031215613c3c575f5ffd5b8535945060208601356001600160401b03811115613c58575f5ffd5b613c6488828901613beb565b90955093505060408601356001600160401b03811115613c82575f5ffd5b613c8e88828901613beb565b969995985093965092949392505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613cc5575f5ffd5b613cce84613b6f565b9250613cdc60208501613b6f565b929592945050506040919091013590565b60ff81168114610bf9575f5ffd5b61ffff81168114610bf9575f5ffd5b5f5f5f60608486031215613d1c575f5ffd5b8335613d2781613ced565b92506020840135613d3781613cfb565b91506040840135613d4781613cfb565b809150509250925092565b5f8151808452602084019350602083015f5b82811015613d8b5781516001600160a01b0316865260209586019590910190600101613d64565b5093949350505050565b602081525f610dfa6020830184613d52565b5f5f60408385031215613db8575f5ffd5b82359150613dc860208401613b6f565b90509250929050565b5f5f5f60608486031215613de3575f5ffd5b8335925060208401359150604084013560048110613d47575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b6080810160058610613e2757613e27613dff565b94815261ffff93841660208201529190921660408201526060015290565b5f5f83601f840112613e55575f5ffd5b5081356001600160401b03811115613e6b575f5ffd5b6020830191508360208260061b85010111156126b4575f5ffd5b5f5f5f60408486031215613e97575f5ffd5b83356001600160401b03811115613eac575f5ffd5b613eb886828701613e45565b909790965060209590950135949350505050565b5f5f5f60608486031215613ede575f5ffd5b83359250613eee60208501613b6f565b9150613efc60408501613b6f565b90509250925092565b604081525f613f176040830185613d52565b82810360208401528084518083526020830191506020860192505f5b81811015613f51578351835260209384019390920191600101613f33565b50909695505050505050565b5f5f5f5f60408587031215613f70575f5ffd5b84356001600160401b03811115613f85575f5ffd5b613f9187828801613e45565b90955093505060208501356001600160401b03811115613faf575f5ffd5b613fbb87828801613beb565b95989497509550505050565b5f5f60408385031215613fd8575f5ffd5b613fe183613b6f565b9150613dc860208401613b6f565b634e487b7160e01b5f52603260045260245ffd5b8015158114610bf9575f5ffd5b5f60208284031215614020575f5ffd5b8151610dfa81614003565b600181811c9082168061403f57607f821691505b60208210810361405d57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215614073575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108b9576108b961409e565b5f602082840312156140d5575f5ffd5b8135610dfa81614003565b818103818111156108b9576108b961409e565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215614117575f5ffd5b8151610dfa81613cfb565b6001600160a01b03929092168252602082015260400190565b6001815b60018411156141765780850481111561415a5761415a61409e565b600184161561416857908102905b60019390931c92800261413f565b935093915050565b5f8261418c575060016108b9565b8161419857505f6108b9565b81600181146141ae57600281146141b8576141d4565b60019150506108b9565b60ff8411156141c9576141c961409e565b50506001821b6108b9565b5060208310610133831016604e8410600b84101617156141f7575081810a6108b9565b6142035f19848461413b565b805f19048211156142165761421661409e565b029392505050565b5f610dfa60ff84168361417e565b6001600160a01b039390931683526020830191909152604082015260600190565b5f6020828403121561425d575f5ffd5b8151610dfa81613ced565b60ff82811682821603908111156108b9576108b961409e565b634e487b7160e01b5f52601260045260245ffd5b5f602082840312156142a5575f5ffd5b815163ffffffff81168114610dfa575f5ffd5b5f83518060208601845e9190910191825250602001919050565b5f8151808452602084019350602083015f5b82811015613d8b5781518652602095860195909101906001016142e4565b606081525f61431460608301866142d2565b82810360208401526143268186613b18565b90508281036040840152612b498185613b18565b5f60ff83168061435857634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b6054811061437757614377613dff565b9052565b8481526001600160a01b03841660208201526080604082018190525f906143a490830185613b18565b905061231f6060830184614367565b9182526001600160a01b0316602082015260400190565b92835260208301919091526001600160f81b031916604082015260600190565b82815260408101610dfa6020830184614367565b602081525f610dfa60208301846142d2565b838152606060208201525f61442860608301856142d2565b905063ffffffff60e01b83166040830152949350505050565b5f600182016144525761445261409e565b5060010190565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220502b403798751e8b4cb2e6144091da0ffead77b5fb53557b41e28cb02ae1240264736f6c634300081c0033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/artifacts/contracts/vaults/OrionTransparentVault.sol/OrionTransparentVault.json b/artifacts/contracts/vaults/OrionTransparentVault.sol/OrionTransparentVault.json index b051f175..99134187 100644 --- a/artifacts/contracts/vaults/OrionTransparentVault.sol/OrionTransparentVault.json +++ b/artifacts/contracts/vaults/OrionTransparentVault.sol/OrionTransparentVault.json @@ -1726,8 +1726,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561000f575f5ffd5b5060405161494f38038061494f83398101604081905261002e916108b3565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610982565b858560036100a48382610a28565b5060046100b18282610a28565b5050505f5f6100c58361050660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610982565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610982565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610ae2565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610982565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610ae2565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610afb565b6017805460ff1916600183600481111561049457610494610afb565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610c06565b6018556104e26105dc565b5050505050505050506104f96106b160201b60201c565b5050505050505050610d26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161054c91610c14565b5f60405180830381855afa9150503d805f8114610584576040519150601f19603f3d011682016040523d82523d5f602084013e610589565b606091505b509150915081801561059d57506020815110155b156105d0575f818060200190518101906105b79190610c2a565b905060ff81116105ce576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610622573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106499190810190610c41565b90505f5b81518110156106ad575f61068483838151811061066c5761066c610cf3565b6020026020010151600b61075e60201b90919060201c565b9050806106a457604051630ea075bf60e21b815260040160405180910390fd5b5060010161064d565b5050565b6007546001600160a01b03163b5f036106d057601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa92505050801561073b575060408051601f3d908101601f1916820190925261073891810190610d07565b60015b61074b57601f805460ff19169055565b601f805460ff1916911515919091179055565b5f610772836001600160a01b03841661077b565b90505b92915050565b5f8181526001830160205260408120546107c057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610775565b505f610775565b6001600160a01b03811681146107db575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561081a5761081a6107de565b604052919050565b5f82601f830112610831575f5ffd5b81516001600160401b0381111561084a5761084a6107de565b61085d601f8201601f19166020016107f2565b818152846020838601011115610871575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff8116811461089d575f5ffd5b919050565b805161ffff8116811461089d575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156108cb575f5ffd5b88516108d6816107c7565b60208a01519098506108e7816107c7565b60408a01519097506108f8816107c7565b60608a01519096506001600160401b03811115610913575f5ffd5b61091f8b828c01610822565b60808b015190965090506001600160401b0381111561093c575f5ffd5b6109488b828c01610822565b94505061095760a08a0161088d565b925061096560c08a016108a2565b915061097360e08a016108a2565b90509295985092959890939650565b5f60208284031215610992575f5ffd5b815161099d816107c7565b9392505050565b600181811c908216806109b857607f821691505b6020821081036109d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a2357805f5260205f20601f840160051c81016020851015610a015750805b601f840160051c820191505b81811015610a20575f8155600101610a0d565b50505b505050565b81516001600160401b03811115610a4157610a416107de565b610a5581610a4f84546109a4565b846109dc565b6020601f821160018114610a87575f8315610a705750848201515b5f19600385901b1c1916600184901b178455610a20565b5f84815260208120601f198516915b82811015610ab65787850151825560209485019460019092019101610a96565b5084821015610ad357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610af2575f5ffd5b6107728261088d565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610b5e57808504811115610b4257610b42610b0f565b6001841615610b5057908102905b60019390931c928002610b27565b935093915050565b5f82610b7457506001610775565b81610b8057505f610775565b8160018114610b965760028114610ba057610bbc565b6001915050610775565b60ff841115610bb157610bb1610b0f565b50506001821b610775565b5060208310610133831016604e8410600b8410161715610bdf575081810a610775565b610beb5f198484610b23565b805f1904821115610bfe57610bfe610b0f565b029392505050565b5f61077260ff841683610b66565b5f82518060208501845e5f920191825250919050565b5f60208284031215610c3a575f5ffd5b5051919050565b5f60208284031215610c51575f5ffd5b81516001600160401b03811115610c66575f5ffd5b8201601f81018413610c76575f5ffd5b80516001600160401b03811115610c8f57610c8f6107de565b8060051b610c9f602082016107f2565b91825260208184018101929081019087841115610cba575f5ffd5b6020850194505b83851015610ce85784519250610cd6836107c7565b82825260209485019490910190610cc1565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610d17575f5ffd5b8151801515811461099d575f5ffd5b60805160a051613c0b610d445f395f50505f610e6a0152613c0b5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c2410aa9736eee5a94c4be22fb1b0f8a2b5858dd773963efa321b52d28b7c36c64736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c2410aa9736eee5a94c4be22fb1b0f8a2b5858dd773963efa321b52d28b7c36c64736f6c634300081c0033", + "bytecode": "0x60c060405234801561000f575f5ffd5b5060405161494f38038061494f83398101604081905261002e916108b3565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610982565b858560036100a48382610a28565b5060046100b18282610a28565b5050505f5f6100c58361050660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610982565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610982565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610ae2565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610982565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610ae2565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610afb565b6017805460ff1916600183600481111561049457610494610afb565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610c06565b6018556104e26105dc565b5050505050505050506104f96106b160201b60201c565b5050505050505050610d26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161054c91610c14565b5f60405180830381855afa9150503d805f8114610584576040519150601f19603f3d011682016040523d82523d5f602084013e610589565b606091505b509150915081801561059d57506020815110155b156105d0575f818060200190518101906105b79190610c2a565b905060ff81116105ce576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610622573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106499190810190610c41565b90505f5b81518110156106ad575f61068483838151811061066c5761066c610cf3565b6020026020010151600b61075e60201b90919060201c565b9050806106a457604051630ea075bf60e21b815260040160405180910390fd5b5060010161064d565b5050565b6007546001600160a01b03163b5f036106d057601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa92505050801561073b575060408051601f3d908101601f1916820190925261073891810190610d07565b60015b61074b57601f805460ff19169055565b601f805460ff1916911515919091179055565b5f610772836001600160a01b03841661077b565b90505b92915050565b5f8181526001830160205260408120546107c057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610775565b505f610775565b6001600160a01b03811681146107db575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561081a5761081a6107de565b604052919050565b5f82601f830112610831575f5ffd5b81516001600160401b0381111561084a5761084a6107de565b61085d601f8201601f19166020016107f2565b818152846020838601011115610871575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff8116811461089d575f5ffd5b919050565b805161ffff8116811461089d575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156108cb575f5ffd5b88516108d6816107c7565b60208a01519098506108e7816107c7565b60408a01519097506108f8816107c7565b60608a01519096506001600160401b03811115610913575f5ffd5b61091f8b828c01610822565b60808b015190965090506001600160401b0381111561093c575f5ffd5b6109488b828c01610822565b94505061095760a08a0161088d565b925061096560c08a016108a2565b915061097360e08a016108a2565b90509295985092959890939650565b5f60208284031215610992575f5ffd5b815161099d816107c7565b9392505050565b600181811c908216806109b857607f821691505b6020821081036109d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a2357805f5260205f20601f840160051c81016020851015610a015750805b601f840160051c820191505b81811015610a20575f8155600101610a0d565b50505b505050565b81516001600160401b03811115610a4157610a416107de565b610a5581610a4f84546109a4565b846109dc565b6020601f821160018114610a87575f8315610a705750848201515b5f19600385901b1c1916600184901b178455610a20565b5f84815260208120601f198516915b82811015610ab65787850151825560209485019460019092019101610a96565b5084821015610ad357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610af2575f5ffd5b6107728261088d565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610b5e57808504811115610b4257610b42610b0f565b6001841615610b5057908102905b60019390931c928002610b27565b935093915050565b5f82610b7457506001610775565b81610b8057505f610775565b8160018114610b965760028114610ba057610bbc565b6001915050610775565b60ff841115610bb157610bb1610b0f565b50506001821b610775565b5060208310610133831016604e8410600b8410161715610bdf575081810a610775565b610beb5f198484610b23565b805f1904821115610bfe57610bfe610b0f565b029392505050565b5f61077260ff841683610b66565b5f82518060208501845e5f920191825250919050565b5f60208284031215610c3a575f5ffd5b5051919050565b5f60208284031215610c51575f5ffd5b81516001600160401b03811115610c66575f5ffd5b8201601f81018413610c76575f5ffd5b80516001600160401b03811115610c8f57610c8f6107de565b8060051b610c9f602082016107f2565b91825260208184018101929081019087841115610cba575f5ffd5b6020850194505b83851015610ce85784519250610cd6836107c7565b82825260209485019490910190610cc1565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610d17575f5ffd5b8151801515811461099d575f5ffd5b60805160a051613c0b610d445f395f50505f610e6a0152613c0b5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8e5b40e109f575781531ef89b26297cbc6aeecc383693fda6e6c6c96562a6ec64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8e5b40e109f575781531ef89b26297cbc6aeecc383693fda6e6c6c96562a6ec64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/OrionConfig.sol b/contracts/OrionConfig.sol index 176a0bb9..3e85a8b3 100644 --- a/contracts/OrionConfig.sol +++ b/contracts/OrionConfig.sol @@ -36,8 +36,6 @@ contract OrionConfig is Ownable, IOrionConfig { address public liquidityOrchestrator; /// @notice Address of the transparent vault factory address public transparentVaultFactory; - /// @notice Address of the encrypted vault factory - address public encryptedVaultFactory; /// @notice Address of the price adapter registry address public priceAdapterRegistry; @@ -61,8 +59,7 @@ contract OrionConfig is Ownable, IOrionConfig { EnumerableSet.AddressSet private encryptedVaults; modifier onlyFactories() { - if (msg.sender != transparentVaultFactory && msg.sender != encryptedVaultFactory) - revert ErrorsLib.UnauthorizedAccess(); + if (msg.sender != transparentVaultFactory) revert ErrorsLib.UnauthorizedAccess(); _; } @@ -106,14 +103,11 @@ contract OrionConfig is Ownable, IOrionConfig { } /// @inheritdoc IOrionConfig - function setVaultFactories(address transparentFactory, address encryptedFactory) external onlyOwner { + function setVaultFactory(address transparentFactory) external onlyOwner { if (!isSystemIdle()) revert ErrorsLib.SystemNotIdle(); if (transparentFactory == address(0)) revert ErrorsLib.ZeroAddress(); - if (encryptedFactory == address(0)) revert ErrorsLib.ZeroAddress(); - if (transparentVaultFactory != address(0) || encryptedVaultFactory != address(0)) - revert ErrorsLib.AlreadyRegistered(); + if (transparentVaultFactory != address(0)) revert ErrorsLib.AlreadyRegistered(); transparentVaultFactory = transparentFactory; - encryptedVaultFactory = encryptedFactory; } /// @inheritdoc IOrionConfig diff --git a/contracts/factories/EncryptedVaultFactory.sol b/contracts/factories/EncryptedVaultFactory.sol deleted file mode 100644 index 25bc6f0e..00000000 --- a/contracts/factories/EncryptedVaultFactory.sol +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.28; - -import "../interfaces/IOrionConfig.sol"; -import "../vaults/OrionEncryptedVault.sol"; -import { ErrorsLib } from "../libraries/ErrorsLib.sol"; -import { EventsLib } from "../libraries/EventsLib.sol"; - -/** - * @title EncryptedVaultFactory - * @notice A factory contract for creating Orion encrypted vaults - * @author Orion Finance - * @dev This contract is responsible for creating new encrypted vaults only. - */ -contract EncryptedVaultFactory { - /// @notice Orion Config contract address - IOrionConfig public config; - - /// @notice Constructor - /// @param configAddress The address of the OrionConfig contract - constructor(address configAddress) { - if (configAddress == address(0)) revert ErrorsLib.ZeroAddress(); - - config = IOrionConfig(configAddress); - } - - /// @notice Creates a new encrypted vault - /// @param curator The address of the curator - /// @param name The name of the vault - /// @param symbol The symbol of the vault - /// @param feeType The fee type - /// @param performanceFee The performance fee - /// @param managementFee The management fee - /// @return vault The address of the new encrypted vault - function createVault( - address curator, - string calldata name, - string calldata symbol, - uint8 feeType, - uint16 performanceFee, - uint16 managementFee - ) external returns (address vault) { - address vaultOwner = msg.sender; - - if (!config.isWhitelistedVaultOwner(vaultOwner)) revert ErrorsLib.UnauthorizedAccess(); - if (curator == address(0)) revert ErrorsLib.ZeroAddress(); - if (!config.isSystemIdle()) revert ErrorsLib.SystemNotIdle(); - - OrionEncryptedVault encryptedVault = new OrionEncryptedVault( - vaultOwner, - curator, - config, - name, - symbol, - feeType, - performanceFee, - managementFee - ); - vault = address(encryptedVault); - - config.addOrionVault(vault, EventsLib.VaultType.Encrypted); - emit EventsLib.OrionVaultCreated( - vault, - vaultOwner, - curator, - name, - symbol, - feeType, - performanceFee, - managementFee, - EventsLib.VaultType.Encrypted - ); - } -} diff --git a/contracts/interfaces/IInternalStateOrchestrator.sol b/contracts/interfaces/IInternalStateOrchestrator.sol index dc170eaf..12557783 100644 --- a/contracts/interfaces/IInternalStateOrchestrator.sol +++ b/contracts/interfaces/IInternalStateOrchestrator.sol @@ -12,11 +12,8 @@ interface IInternalStateOrchestrator is AutomationCompatibleInterface { enum InternalUpkeepPhase { Idle, PreprocessingTransparentVaults, - PreprocessingEncryptedVaults, - ProcessingDecryptedValues, Buffering, PostprocessingTransparentVaults, - PostprocessingEncryptedVaults, BuildingOrders } @@ -42,8 +39,7 @@ interface IInternalStateOrchestrator is AutomationCompatibleInterface { /// @notice Updates the minibatch sizes /// @param _transparentMinibatchSize The new transparent minibatch size - /// @param _encryptedMinibatchSize The new encrypted minibatch size - function updateMinibatchSizes(uint8 _transparentMinibatchSize, uint8 _encryptedMinibatchSize) external; + function updateMinibatchSize(uint8 _transparentMinibatchSize) external; /// @notice Updates the protocol fees /// @param _vFeeCoefficient The new volume fee coefficient @@ -62,16 +58,6 @@ interface IInternalStateOrchestrator is AutomationCompatibleInterface { /// @param amount The amount to subtract from pending protocol fees function subtractPendingProtocolFees(uint256 amount) external; - /// @notice Callback function to decrypt the encrypted values - /// @param requestID The request ID - /// @param cleartexts The cleartexts - /// @param decryptionProof The decryption proof - function callbackPreProcessDecrypt( - uint256 requestID, - bytes calldata cleartexts, - bytes calldata decryptionProof - ) external; - /// @notice Get selling and buying orders /// @return sellingTokens The tokens to sell /// @return sellingAmounts The amounts to sell in shares diff --git a/contracts/interfaces/IOrionConfig.sol b/contracts/interfaces/IOrionConfig.sol index f0647e79..93cc156e 100644 --- a/contracts/interfaces/IOrionConfig.sol +++ b/contracts/interfaces/IOrionConfig.sol @@ -52,11 +52,10 @@ interface IOrionConfig { /// @param orchestrator The address of the liquidity orchestrator function setLiquidityOrchestrator(address orchestrator) external; - /// @notice Sets the vault factories for the protocol + /// @notice Sets the vault factory for the protocol /// @dev Can only be called by the contract owner /// @param transparentFactory The address of the transparent vault factory - /// @param encryptedFactory The address of the encrypted vault factory - function setVaultFactories(address transparentFactory, address encryptedFactory) external; + function setVaultFactory(address transparentFactory) external; /// @notice Sets the price adapter registry for the protocol /// @dev Can only be called by the contract owner diff --git a/contracts/interfaces/IOrionEncryptedVault.sol b/contracts/interfaces/IOrionEncryptedVault.sol deleted file mode 100644 index 40b7e61e..00000000 --- a/contracts/interfaces/IOrionEncryptedVault.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.28; - -import { euint128, externalEuint128 } from "@fhevm/solidity/lib/FHE.sol"; - -import "./IOrionVault.sol"; - -/// @title IOrionEncryptedVault -/// @notice Interface for the Orion encrypted vault -/// @author Orion Finance -interface IOrionEncryptedVault is IOrionVault { - struct EncryptedIntent { - address token; - externalEuint128 weight; - } - - struct EncryptedPortfolio { - address token; - euint128 value; - } - - /// @notice Submit an encrypted portfolio intent. - /// @param intent EncryptedIntent struct containing the tokens and encrypted weights. - /// @param inputProof contains the ZKPoK to validate the authenticity of the encrypted inputs. - /// https://docs.zama.ai/protocol/solidity-guides/smart-contract/inputs#validating-encrypted-inputs - /// @dev The weights are interpreted as percentage of total supply. - function submitIntent(EncryptedIntent[] calldata intent, bytes calldata inputProof) external; - - /// @notice Returns the current encrypted portfolio (w_0) - /// @return tokens The tokens in the portfolio. - /// @return sharesPerAsset The shares per asset in the portfolio. - function getPortfolio() external view returns (address[] memory tokens, euint128[] memory sharesPerAsset); - - /// @notice Get the encrypted intent. - /// @return tokens The tokens in the intent. - /// @return weights The weights in the intent. - function getIntent() external view returns (address[] memory tokens, euint128[] memory weights); - - /// @notice Get the intent validity. - /// @return isIntentValid Whether the intent is valid. - function isIntentValid() external view returns (bool); - - /// @notice Updates the vault's portfolio state and total assets - /// @dev Can only be called by the liquidity orchestrator. - /// Clears the previous portfolio and replaces it with the new one. - /// @param portfolio Array of EncryptedPortfolio structs - /// It contains the new portfolio token addresses and encrypted number of shares per asset. - /// @param newTotalAssets The new total assets value for the vault - function updateVaultState(EncryptedPortfolio[] calldata portfolio, uint256 newTotalAssets) external; - - /// @notice Callback function to decrypt a single ebool - /// @param requestID The request ID - /// @param cleartexts The cleartexts - /// @param decryptionProof The decryption proof - function callbackDecryptSingleEbool( - uint256 requestID, - bytes calldata cleartexts, - bytes calldata decryptionProof - ) external; -} diff --git a/contracts/libraries/UtilitiesLib.sol b/contracts/libraries/UtilitiesLib.sol index 20422cec..8e7c5be0 100644 --- a/contracts/libraries/UtilitiesLib.sol +++ b/contracts/libraries/UtilitiesLib.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.28; -import { FHE, euint128 } from "@fhevm/solidity/lib/FHE.sol"; - /** * @title UtilitiesLib * @notice Library for utility functions @@ -33,31 +31,4 @@ library UtilitiesLib { convertedValue = value; } } - - /** - * @notice Converts an encrypted value from one decimal precision to another - * @param encryptedValue The encrypted value to convert - * @param fromDecimals The number of decimals in the source value - * @param toDecimals The number of decimals to convert to - * @return convertedEncryptedValue The encrypted value converted to the target decimals - */ - function convertEncryptedDecimals( - euint128 encryptedValue, - uint8 fromDecimals, - uint8 toDecimals - ) internal returns (euint128 convertedEncryptedValue) { - if (toDecimals > fromDecimals) { - // Scale up: multiply by the difference - convertedEncryptedValue = FHE.mul( - encryptedValue, - FHE.asEuint128(uint128(10 ** (toDecimals - fromDecimals))) - ); - } else if (toDecimals < fromDecimals) { - // Scale down: divide by the difference - convertedEncryptedValue = FHE.div(encryptedValue, uint128(10 ** (fromDecimals - toDecimals))); - } else { - // No conversion needed if decimals are the same - convertedEncryptedValue = encryptedValue; - } - } } diff --git a/contracts/orchestrators/InternalStatesOrchestrator.sol b/contracts/orchestrators/InternalStatesOrchestrator.sol index 2b3a85c1..b796296f 100644 --- a/contracts/orchestrators/InternalStatesOrchestrator.sol +++ b/contracts/orchestrators/InternalStatesOrchestrator.sol @@ -8,15 +8,13 @@ import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "../interfaces/IOrionConfig.sol"; import "../interfaces/IOrionVault.sol"; import "../interfaces/IOrionTransparentVault.sol"; -import "../interfaces/IOrionEncryptedVault.sol"; import "../interfaces/IPriceAdapterRegistry.sol"; import "../interfaces/IInternalStateOrchestrator.sol"; import "../interfaces/ILiquidityOrchestrator.sol"; import { ErrorsLib } from "../libraries/ErrorsLib.sol"; import { EventsLib } from "../libraries/EventsLib.sol"; import { UtilitiesLib } from "../libraries/UtilitiesLib.sol"; -import { FHE, euint128 } from "@fhevm/solidity/lib/FHE.sol"; -import { SepoliaConfig } from "@fhevm/solidity/config/ZamaConfig.sol"; + /** * @title Internal States Orchestrator * @notice Contract that orchestrates internal state management @@ -28,7 +26,7 @@ import { SepoliaConfig } from "@fhevm/solidity/config/ZamaConfig.sol"; * - Computing state estimations for Liquidity Orchestrator; * - Trigger the Liquidity Orchestrator. */ -contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, IInternalStateOrchestrator { +contract InternalStatesOrchestrator is Ownable, ReentrancyGuard, IInternalStateOrchestrator { using Math for uint256; /// @notice Chainlink Automation Registry address @@ -69,11 +67,8 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, /// @notice Action constants for checkUpkeep and performUpkeep bytes4 private constant ACTION_START = bytes4(keccak256("start()")); bytes4 private constant ACTION_PREPROCESS_T_VAULTS = bytes4(keccak256("preprocessTV(uint8)")); - bytes4 private constant ACTION_PREPROCESS_E_VAULTS = bytes4(keccak256("preprocessEV(uint8)")); - bytes4 private constant ACTION_PROCESS_DECRYPTED_VALUES = bytes4(keccak256("processDecryptedValues()")); bytes4 private constant ACTION_BUFFER = bytes4(keccak256("buffer()")); bytes4 private constant ACTION_POSTPROCESS_T_VAULTS = bytes4(keccak256("postprocessTV(uint8)")); - bytes4 private constant ACTION_POSTPROCESS_E_VAULTS = bytes4(keccak256("postprocessEV(uint8)")); bytes4 private constant ACTION_BUILD_ORDERS = bytes4(keccak256("buildOrders()")); /* -------------------------------------------------------------------------- */ @@ -85,16 +80,10 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, mapping(address => uint256) priceArray; /// @notice Initial batch portfolio - token address to estimated value [shares] mapping(address => uint256) initialBatchPortfolio; - /// @notice Encrypted initial batch portfolio - token address to encrypted estimated value [shares] - mapping(address => euint128) encryptedInitialBatchPortfolio; /// @notice Total assets - Orion vault address to estimated value [assets] mapping(address => uint256) vaultsTotalAssets; - /// @notice Encrypted total assets - Orion vault address to encrypted estimated value [assets] - mapping(address => euint128) encryptedVaultsTotalAssets; /// @notice Final batch portfolio - token address to estimated value [shares] mapping(address => uint256) finalBatchPortfolio; - /// @notice Encrypted final batch portfolio - token address to encrypted estimated value [shares] - mapping(address => euint128) encryptedFinalBatchPortfolio; /// @notice Total assets for fulfill redeem - vault address to total assets for fulfillRedeem [assets] mapping(address => uint256) vaultsTotalAssetsForFulfillRedeem; /// @notice Total assets for fulfill deposit - vault address to total assets for fulfillDeposit [assets] @@ -125,8 +114,6 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, /// @notice Transparent minibatch size uint8 public transparentMinibatchSize; - /// @notice Encrypted minibatch size - uint8 public encryptedMinibatchSize; /// @notice Upkeep phase InternalUpkeepPhase public currentPhase; @@ -134,22 +121,12 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, /// @notice Current minibatch index uint8 public currentMinibatchIndex; - /// @notice FHE zero - euint128 internal _ezero; - /// @notice Transparent vaults associated to the current epoch address[] public transparentVaultsEpoch; - /// @notice Encrypted vaults associated to the current epoch - address[] public encryptedVaultsEpoch; - /// @notice Number of valid encrypted vaults processed in current epoch - uint16 public validEncryptedVaultsCount; /// @notice Buffer amount [assets] uint256 public bufferAmount; - /// @notice Decrypted values from the FHEVM callback - uint256[] internal _decryptedValues; - /// @dev Restricts function to only owner or automation registry modifier onlyAuthorizedTrigger() { if (msg.sender != owner() && msg.sender != automationRegistry) { @@ -182,7 +159,6 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, underlyingDecimals = config.getTokenDecimals(underlyingAsset); priceAdapterPrecision = 10 ** config.priceAdapterDecimals(); transparentMinibatchSize = 1; - encryptedMinibatchSize = 1; automationRegistry = automationRegistry_; liquidityOrchestrator = ILiquidityOrchestrator(config.liquidityOrchestrator()); @@ -194,10 +170,6 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, epochCounter = 0; currentMinibatchIndex = 0; - _ezero = FHE.asEuint128(0); - // slither-disable-next-line unused-return - FHE.allowThis(_ezero); - vFeeCoefficient = 0; rsFeeCoefficient = 0; @@ -223,12 +195,11 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, } /// @inheritdoc IInternalStateOrchestrator - function updateMinibatchSizes(uint8 _transparentMinibatchSize, uint8 _encryptedMinibatchSize) external onlyOwner { - if (_transparentMinibatchSize == 0 || _encryptedMinibatchSize == 0) revert ErrorsLib.InvalidArguments(); + function updateMinibatchSize(uint8 _transparentMinibatchSize) external onlyOwner { + if (_transparentMinibatchSize == 0) revert ErrorsLib.InvalidArguments(); if (!config.isSystemIdle()) revert ErrorsLib.SystemNotIdle(); transparentMinibatchSize = _transparentMinibatchSize; - encryptedMinibatchSize = _encryptedMinibatchSize; } /// @inheritdoc IInternalStateOrchestrator @@ -254,21 +225,12 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, } else if (currentPhase == InternalUpkeepPhase.PreprocessingTransparentVaults) { upkeepNeeded = true; performData = abi.encode(ACTION_PREPROCESS_T_VAULTS, currentMinibatchIndex); - } else if (currentPhase == InternalUpkeepPhase.PreprocessingEncryptedVaults) { - upkeepNeeded = true; - performData = abi.encode(ACTION_PREPROCESS_E_VAULTS, currentMinibatchIndex); - } else if (currentPhase == InternalUpkeepPhase.ProcessingDecryptedValues) { - upkeepNeeded = true; - performData = abi.encode(ACTION_PROCESS_DECRYPTED_VALUES, uint8(0)); } else if (currentPhase == InternalUpkeepPhase.Buffering) { upkeepNeeded = true; performData = abi.encode(ACTION_BUFFER, uint8(0)); } else if (currentPhase == InternalUpkeepPhase.PostprocessingTransparentVaults) { upkeepNeeded = true; performData = abi.encode(ACTION_POSTPROCESS_T_VAULTS, currentMinibatchIndex); - } else if (currentPhase == InternalUpkeepPhase.PostprocessingEncryptedVaults) { - upkeepNeeded = true; - performData = abi.encode(ACTION_POSTPROCESS_E_VAULTS, currentMinibatchIndex); } else if (currentPhase == InternalUpkeepPhase.BuildingOrders) { upkeepNeeded = true; performData = abi.encode(ACTION_BUILD_ORDERS, uint8(0)); @@ -289,16 +251,10 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, _handleStart(); } else if (action == ACTION_PREPROCESS_T_VAULTS) { _preprocessTransparentMinibatch(minibatchIndex); - } else if (action == ACTION_PREPROCESS_E_VAULTS) { - _preprocessEncryptedMinibatch(minibatchIndex); - } else if (action == ACTION_PROCESS_DECRYPTED_VALUES) { - _processDecryptedValues(); } else if (action == ACTION_BUFFER) { _buffer(); } else if (action == ACTION_POSTPROCESS_T_VAULTS) { _postprocessTransparentMinibatch(minibatchIndex); - } else if (action == ACTION_POSTPROCESS_E_VAULTS) { - _postprocessEncryptedMinibatch(minibatchIndex); } else if (action == ACTION_BUILD_ORDERS) { _buildOrders(); } @@ -331,19 +287,6 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, } } - /// @notice Build filtered encrypted vaults list for the epoch - /// @dev Include only vaults with pending LP activity and valid intents - function _buildEncryptedVaultsEpoch() internal { - address[] memory allEncrypted = config.getAllOrionVaults(EventsLib.VaultType.Encrypted); - delete encryptedVaultsEpoch; - for (uint16 i = 0; i < allEncrypted.length; ++i) { - address v = allEncrypted[i]; - if (IOrionVault(v).pendingDeposit() == 0 && IOrionVault(v).pendingRedeem() == 0) continue; - if (!IOrionEncryptedVault(v).isIntentValid()) continue; - encryptedVaultsEpoch.push(v); - } - } - /// @notice Updates the next update time and resets the previous epoch state variables function _handleStart() internal { // Validate current phase @@ -360,19 +303,13 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, delete _currentEpoch.sellingOrders[token]; delete _currentEpoch.buyingOrders[token]; delete _currentEpoch.tokenExists[token]; - _currentEpoch.encryptedInitialBatchPortfolio[token] = _ezero; - _currentEpoch.encryptedVaultsTotalAssets[token] = _ezero; - _currentEpoch.encryptedFinalBatchPortfolio[token] = _ezero; } delete _currentEpoch.tokens; - delete _decryptedValues; // Build filtered vault lists for this epoch _buildTransparentVaultsEpoch(); - _buildEncryptedVaultsEpoch(); - validEncryptedVaultsCount = uint16(encryptedVaultsEpoch.length); - if (encryptedVaultsEpoch.length + transparentVaultsEpoch.length > 0) { + if (transparentVaultsEpoch.length > 0) { _nextUpdateTime = block.timestamp + epochDuration; currentPhase = InternalUpkeepPhase.PreprocessingTransparentVaults; } @@ -392,7 +329,7 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, uint16 i1 = i0 + transparentMinibatchSize; if (i1 > transparentVaultsEpoch.length || i1 == transparentVaultsEpoch.length) { i1 = uint16(transparentVaultsEpoch.length); - currentPhase = InternalUpkeepPhase.PreprocessingEncryptedVaults; + currentPhase = InternalUpkeepPhase.Buffering; currentMinibatchIndex = 0; } @@ -465,181 +402,6 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, } } - /* solhint-disable code-complexity */ - /// @notice Preprocesses minibatch of encrypted vaults - /// @param minibatchIndex The index of the minibatch to process - function _preprocessEncryptedMinibatch(uint8 minibatchIndex) internal { - if (currentPhase != InternalUpkeepPhase.PreprocessingEncryptedVaults) { - revert ErrorsLib.InvalidState(); - } - ++currentMinibatchIndex; - - uint16 nVaults = uint16(encryptedVaultsEpoch.length); - uint16 i0 = minibatchIndex * encryptedMinibatchSize; - uint16 i1 = i0 + encryptedMinibatchSize; - if (i1 > nVaults || i1 == nVaults) { - i1 = nVaults; - } - - for (uint16 i = i0; i < i1; ++i) { - IOrionEncryptedVault vault = IOrionEncryptedVault(encryptedVaultsEpoch[i]); - - (address[] memory portfolioTokens, euint128[] memory sharesPerAsset) = vault.getPortfolio(); - - // STEP 1: LIVE PORTFOLIO - euint128 totalAssets = _ezero; - for (uint16 j = 0; j < portfolioTokens.length; ++j) { - address token = portfolioTokens[j]; - euint128 shares = sharesPerAsset[j]; - - _currentEpoch.encryptedInitialBatchPortfolio[token] = FHE.add( - _currentEpoch.encryptedInitialBatchPortfolio[token], - shares - ); - - // Get and cache prices if not already cached - if (!_currentEpoch.tokenExists[token]) { - if (token == underlyingAsset) { - _currentEpoch.priceArray[token] = UtilitiesLib.convertDecimals( - 10 ** underlyingDecimals, - underlyingDecimals, - config.priceAdapterDecimals() - ); - } else { - _currentEpoch.priceArray[token] = registry.getPrice(token); - } - } - uint256 price = _currentEpoch.priceArray[token]; - - // Calculate estimated value of the asset in underlying asset decimals - // TODO(fhevm): implement FHEVM mulDiv: upcast from euintX to euint256, - // perform operations, downcast to euintX. - // No trivial to support more than 256 for intermediate operation, - // so still less powerful than regular mulDiv. - // Measure gas impact on euint128 to euint64/32 at intent level and consider using different types. - euint128 unscaledValue = FHE.div( - FHE.mul(FHE.asEuint128(uint128(price)), shares), - uint128(priceAdapterPrecision) - ); - euint128 value = UtilitiesLib.convertEncryptedDecimals( - unscaledValue, - config.getTokenDecimals(token), - underlyingDecimals - ); - - totalAssets = FHE.add(totalAssets, value); - _addTokenIfNotExists(token); - } - _currentEpoch.encryptedVaultsTotalAssets[address(vault)] = totalAssets; - } - - if (i1 == nVaults) { - if (nVaults == 0) { - // No encryptedVaults in current Epoch or no valid encrypted intents, go directly to Buffering. - currentPhase = InternalUpkeepPhase.Buffering; - currentMinibatchIndex = 0; - } else { - uint16 mTokens = uint16(_currentEpoch.tokens.length); - bytes32[] memory cipherTexts = new bytes32[](nVaults + mTokens); - for (uint16 i = 0; i < nVaults; ++i) { - address vault = encryptedVaultsEpoch[i]; - euint128 totalAssets = _currentEpoch.encryptedVaultsTotalAssets[vault]; - // slither-disable-next-line unused-return - FHE.allowThis(totalAssets); - cipherTexts[i] = FHE.toBytes32(totalAssets); - } - for (uint16 i = 0; i < mTokens; ++i) { - address token = _currentEpoch.tokens[i]; - euint128 position = _currentEpoch.encryptedInitialBatchPortfolio[token]; - // slither-disable-next-line unused-return - FHE.allowThis(position); - cipherTexts[nVaults + i] = FHE.toBytes32(position); - } - - // slither-disable-next-line unused-return - FHE.requestDecryption(cipherTexts, this.callbackPreProcessDecrypt.selector); - } - } - } - /* solhint-enable code-complexity */ - - /// @inheritdoc IInternalStateOrchestrator - function callbackPreProcessDecrypt( - uint256 requestID, - bytes calldata cleartexts, - bytes calldata decryptionProof - ) external { - FHE.checkSignatures(requestID, cleartexts, decryptionProof); - - if (keccak256(cleartexts) == keccak256(abi.encode(uint256(0)))) { - currentPhase = InternalUpkeepPhase.Buffering; - currentMinibatchIndex = 0; - return; - } - - // Store decrypted values for processing in the next phase. - _decryptedValues = abi.decode(cleartexts, (uint256[])); - - currentPhase = InternalUpkeepPhase.ProcessingDecryptedValues; - currentMinibatchIndex = 0; - } - - /// @notice Processes decrypted values from encrypted vaults to complete preprocessing - /// @dev This function completes the fee calculations and state updates for encrypted vaults - /// using the decrypted values from the FHEVM callback - function _processDecryptedValues() internal { - if (currentPhase != InternalUpkeepPhase.ProcessingDecryptedValues) { - revert ErrorsLib.InvalidState(); - } - uint16 nVaults = uint16(encryptedVaultsEpoch.length); - uint16 mTokens = uint16(_currentEpoch.tokens.length); - - for (uint16 i = 0; i < nVaults; ++i) { - IOrionEncryptedVault vault = IOrionEncryptedVault(encryptedVaultsEpoch[i]); - if (!vault.isIntentValid()) { - continue; // Skip if intent is invalid - } - uint256 totalAssets = _decryptedValues[i]; - - // STEP 2: PROTOCOL VOLUME FEE - uint256 protocolVolumeFee = uint256(vFeeCoefficient).mulDiv(totalAssets, BASIS_POINTS_FACTOR); - protocolVolumeFee = protocolVolumeFee.mulDiv(epochDuration, 365 days); - pendingProtocolFees += protocolVolumeFee; - totalAssets -= protocolVolumeFee; - - // STEP 3 & 4: CURATOR + PROTOCOL REVENUE SHARE FEES - uint256 curatorFee = vault.curatorFee(totalAssets); - totalAssets -= curatorFee; - uint256 protocolRevenueShareFee = uint256(rsFeeCoefficient).mulDiv(curatorFee, BASIS_POINTS_FACTOR); - pendingProtocolFees += protocolRevenueShareFee; - curatorFee -= protocolRevenueShareFee; - vault.accrueCuratorFees(epochCounter, curatorFee); - - // STEP 5: WITHDRAWAL EXCHANGE RATE (based on post-fee totalAssets) - uint256 pendingRedeem = vault.convertToAssetsWithPITTotalAssets( - vault.pendingRedeem(), - totalAssets, - Math.Rounding.Floor - ); - _currentEpoch.vaultsTotalAssetsForFulfillRedeem[address(vault)] = totalAssets; - - // STEP 6: DEPOSIT PROCESSING (add deposits, subtract withdrawals) - totalAssets -= pendingRedeem; - uint256 pendingDeposit = vault.pendingDeposit(); - _currentEpoch.vaultsTotalAssetsForFulfillDeposit[address(vault)] = totalAssets; - totalAssets += pendingDeposit; - _currentEpoch.vaultsTotalAssets[address(vault)] = totalAssets; - } - - for (uint16 i = 0; i < mTokens; ++i) { - address token = _currentEpoch.tokens[i]; - uint256 decryptedValue = _decryptedValues[nVaults + i]; - _currentEpoch.initialBatchPortfolio[token] += decryptedValue; - } - currentPhase = InternalUpkeepPhase.Buffering; - currentMinibatchIndex = 0; - } - /** * @notice Updates the protocol buffer to maintain solvency and capital efficiency * @dev In general, this function implements a stochastic optimal control framework for buffer management @@ -664,17 +426,12 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, currentPhase = InternalUpkeepPhase.PostprocessingTransparentVaults; uint16 nTransparentVaults = uint16(transparentVaultsEpoch.length); - uint16 nEncryptedVaults = uint16(encryptedVaultsEpoch.length); uint256 protocolTotalAssets = 0; for (uint16 i = 0; i < nTransparentVaults; ++i) { address vault = transparentVaultsEpoch[i]; protocolTotalAssets += _currentEpoch.vaultsTotalAssets[address(vault)]; } - for (uint16 i = 0; i < nEncryptedVaults; ++i) { - address vault = encryptedVaultsEpoch[i]; - protocolTotalAssets += _currentEpoch.vaultsTotalAssets[address(vault)]; - } uint256 targetBufferAmount = protocolTotalAssets.mulDiv( liquidityOrchestrator.targetBufferRatio(), @@ -691,12 +448,6 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, uint256 vaultBufferCost = deltaBufferAmount.mulDiv(vaultAssets, protocolTotalAssets); _currentEpoch.vaultsTotalAssets[address(vault)] -= vaultBufferCost; } - for (uint16 i = 0; i < nEncryptedVaults; ++i) { - address vault = encryptedVaultsEpoch[i]; - uint256 vaultAssets = _currentEpoch.vaultsTotalAssets[address(vault)]; - uint256 vaultBufferCost = deltaBufferAmount.mulDiv(vaultAssets, protocolTotalAssets); - _currentEpoch.vaultsTotalAssets[address(vault)] -= vaultBufferCost; - } bufferAmount += deltaBufferAmount; } @@ -714,7 +465,7 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, if (i1 > transparentVaultsEpoch.length || i1 == transparentVaultsEpoch.length) { i1 = uint16(transparentVaultsEpoch.length); // Last minibatch, go to next phase. - currentPhase = InternalUpkeepPhase.PostprocessingEncryptedVaults; + currentPhase = InternalUpkeepPhase.BuildingOrders; currentMinibatchIndex = 0; } @@ -760,29 +511,6 @@ contract InternalStatesOrchestrator is SepoliaConfig, Ownable, ReentrancyGuard, } } - /// @notice Postprocesses minibatch of encrypted vaults - /// @param minibatchIndex The index of the minibatch to postprocess - function _postprocessEncryptedMinibatch(uint8 minibatchIndex) internal { - if (currentPhase != InternalUpkeepPhase.PostprocessingEncryptedVaults) { - revert ErrorsLib.InvalidState(); - } - // TODO(fhevm): Populate function body. - ++currentMinibatchIndex; - uint16 nVaults = uint16(encryptedVaultsEpoch.length); - uint16 i0 = minibatchIndex * encryptedMinibatchSize; - uint16 i1 = i0 + encryptedMinibatchSize; - if (i1 > nVaults || i1 == nVaults) { - i1 = nVaults; - // Last minibatch, go to next phase. - // TODO(fhevm): integrate Zama callback in performUpkeep logic breakdown - // (the decryption callback, not the encrypted computation here, updates the phase). - // TODO(fhevm): the state is updated in _preprocessEncryptedMinibatch only if there are no encrypted vaults - // in the minibatch and currentMinibatchIndex == 0. - currentPhase = InternalUpkeepPhase.BuildingOrders; - currentMinibatchIndex = 0; - } - } - // slither-disable-end reentrancy-no-eth /// @notice Adds a token to the current epoch if it doesn't exist diff --git a/contracts/orchestrators/LiquidityOrchestrator.sol b/contracts/orchestrators/LiquidityOrchestrator.sol index 43a66f5b..e9a8b1d4 100644 --- a/contracts/orchestrators/LiquidityOrchestrator.sol +++ b/contracts/orchestrators/LiquidityOrchestrator.sol @@ -9,7 +9,6 @@ import "../interfaces/IOrionConfig.sol"; import "../interfaces/IInternalStateOrchestrator.sol"; import "../libraries/EventsLib.sol"; import "../interfaces/IOrionTransparentVault.sol"; -import "../interfaces/IOrionEncryptedVault.sol"; import { ErrorsLib } from "../libraries/ErrorsLib.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../interfaces/IOrionVault.sol"; @@ -463,16 +462,6 @@ contract LiquidityOrchestrator is Ownable, ReentrancyGuard, ILiquidityOrchestrat _processVaultDepositAndRedeem(vault, totalAssetsForDeposit, totalAssetsForRedeem); } - - // Process encrypted vaults - address[] memory encryptedVaults = config.getAllOrionVaults(EventsLib.VaultType.Encrypted); - for (uint16 i = 0; i < encryptedVaults.length; ++i) { - address vault = encryptedVaults[i]; - uint256 totalAssetsForDeposit = internalStatesOrchestrator.getVaultTotalAssetsForFulfillDeposit(vault); - uint256 totalAssetsForRedeem = internalStatesOrchestrator.getVaultTotalAssetsForFulfillRedeem(vault); - - _processVaultDepositAndRedeem(vault, totalAssetsForDeposit, totalAssetsForRedeem); - } } /// @notice Processes deposit and redeem operations for a single vault diff --git a/contracts/vaults/OrionEncryptedVault.sol b/contracts/vaults/OrionEncryptedVault.sol deleted file mode 100644 index bea168f2..00000000 --- a/contracts/vaults/OrionEncryptedVault.sol +++ /dev/null @@ -1,209 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.28; - -import { SepoliaConfig } from "@fhevm/solidity/config/ZamaConfig.sol"; -import { euint128, ebool, FHE } from "@fhevm/solidity/lib/FHE.sol"; -import "./OrionVault.sol"; -import "../interfaces/IOrionConfig.sol"; -import "../interfaces/IOrionEncryptedVault.sol"; -import { ErrorsLib } from "../libraries/ErrorsLib.sol"; -import { EventsLib } from "../libraries/EventsLib.sol"; - -/** - * @title OrionEncryptedVault - * @notice A privacy-preserving implementation of OrionVault where curator intents are submitted in encrypted form - * @author Orion Finance - * @dev - * This implementation stores curator intents as a mapping of token addresses to encrypted allocation percentages. - * The intents are submitted and stored in encrypted form using FHEVM, making this suitable for use cases requiring - * privacy of the portfolio allocation strategy, while maintaining capital efficiency. - */ -contract OrionEncryptedVault is SepoliaConfig, OrionVault, IOrionEncryptedVault { - /// @notice Current portfolio shares per asset (w_0) - mapping of token address to live allocation - mapping(address => euint128) internal _portfolio; - address[] internal _portfolioKeys; - - /// @notice Curator intent (w_1) - mapping of token address to target allocation - mapping(address => euint128) internal _intent; - address[] internal _intentKeys; - - /// @notice Temporary mapping to track seen tokens during submitIntent to check for duplicates - mapping(address => bool) internal _seenTokens; - - euint128 internal _ezero; - ebool internal _eTrue; - euint128 internal _encryptedTotalWeight; - - /// @notice Whether the intent is valid - bool public isIntentValid; - - /// @notice Constructor - /// @param vaultOwner The address of the vault owner - /// @param curator The address of the vault curator - /// @param configAddress The address of the OrionConfig contract - /// @param name The name of the vault - /// @param symbol The symbol of the vault - /// @param feeType The fee type - /// @param performanceFee The performance fee - /// @param managementFee The management fee - constructor( - address vaultOwner, - address curator, - IOrionConfig configAddress, - string memory name, - string memory symbol, - uint8 feeType, - uint16 performanceFee, - uint16 managementFee - ) OrionVault(vaultOwner, curator, configAddress, name, symbol, feeType, performanceFee, managementFee) { - _ezero = FHE.asEuint128(0); - _eTrue = FHE.asEbool(true); - _encryptedTotalWeight = FHE.asEuint128(uint128(10 ** curatorIntentDecimals)); - // slither-disable-next-line unused-return - FHE.allowThis(_ezero); - // slither-disable-next-line unused-return - FHE.allowThis(_eTrue); - // slither-disable-next-line unused-return - FHE.allowThis(_encryptedTotalWeight); - } - - /// --------- CURATOR FUNCTIONS --------- - - /// @inheritdoc IOrionEncryptedVault - function submitIntent( - EncryptedIntent[] calldata intent, - bytes calldata inputProof - ) external onlyCurator nonReentrant { - if (intent.length == 0) revert ErrorsLib.OrderIntentCannotBeEmpty(); - - isIntentValid = false; // Reset intent validity flag, asynchronous callback can update it. - - uint16 intentLength = uint16(intent.length); - euint128 totalWeight = _ezero; - - address[] memory tempKeys = new address[](intentLength); - euint128[] memory tempWeights = new euint128[](intentLength); - - address[] memory assets = new address[](intentLength); - for (uint16 i = 0; i < intentLength; ++i) { - address token = intent[i].token; - assets[i] = token; - - euint128 weight = FHE.fromExternal(intent[i].weight, inputProof); - // slither-disable-next-line unused-return - FHE.allowThis(weight); - - if (_seenTokens[token]) revert ErrorsLib.TokenAlreadyInOrder(token); - - _seenTokens[token] = true; - tempKeys[i] = token; - tempWeights[i] = weight; - totalWeight = FHE.add(totalWeight, weight); - } - - _validateIntent(assets, totalWeight); - - // Clear previous intent by setting weights to zero (state write after all external calls) - for (uint16 i = 0; i < uint16(_intentKeys.length); ++i) { - _intent[_intentKeys[i]] = _ezero; - } - delete _intentKeys; - - for (uint16 i = 0; i < intentLength; ++i) { - address token = tempKeys[i]; - _intent[token] = tempWeights[i]; - _intentKeys.push(token); - delete _seenTokens[token]; - } - - emit EventsLib.OrderSubmitted(msg.sender); - } - - /// @notice Validates the intent - /// @param assets The assets in the intent - /// @param totalWeight The total weight of the intent - function _validateIntent(address[] memory assets, euint128 totalWeight) internal { - _validateIntentAssets(assets); - - ebool isIntentEValid = FHE.eq(totalWeight, _encryptedTotalWeight); - - // slither-disable-next-line unused-return - FHE.allowThis(isIntentEValid); - - bytes32[] memory cipherTexts = new bytes32[](1); - cipherTexts[0] = FHE.toBytes32(isIntentEValid); - - // slither-disable-next-line unused-return - FHE.requestDecryption(cipherTexts, this.callbackDecryptSingleEbool.selector); - } - - // --------- INTERNAL STATES ORCHESTRATOR FUNCTIONS --------- - - /// @inheritdoc IOrionEncryptedVault - function getPortfolio() external view returns (address[] memory tokens, euint128[] memory sharesPerAsset) { - uint16 length = uint16(_portfolioKeys.length); - tokens = new address[](length); - sharesPerAsset = new euint128[](length); - for (uint16 i = 0; i < length; ++i) { - address token = _portfolioKeys[i]; - tokens[i] = token; - sharesPerAsset[i] = _portfolio[token]; - } - } - - /// @inheritdoc IOrionEncryptedVault - function getIntent() external view returns (address[] memory tokens, euint128[] memory weights) { - uint16 length = uint16(_intentKeys.length); - tokens = new address[](length); - weights = new euint128[](length); - for (uint16 i = 0; i < length; ++i) { - tokens[i] = _intentKeys[i]; - weights[i] = _intent[_intentKeys[i]]; - } - } - - /// @inheritdoc IOrionEncryptedVault - function updateVaultState( - EncryptedPortfolio[] calldata portfolio, - uint256 newTotalAssets - ) external onlyInternalStatesOrchestrator { - // Clear previous portfolio by setting weights to zero - uint16 portfolioLength = uint16(_portfolioKeys.length); - for (uint16 i = 0; i < portfolioLength; ++i) { - _portfolio[_portfolioKeys[i]] = _ezero; - } - delete _portfolioKeys; - - // Update portfolio - uint16 newPortfolioLength = uint16(portfolio.length); - for (uint16 i = 0; i < newPortfolioLength; ++i) { - _portfolio[portfolio[i].token] = portfolio[i].value; - _portfolioKeys.push(portfolio[i].token); - } - - _totalAssets = newTotalAssets; - - // Update high watermark if current price is higher - uint256 currentSharePrice = convertToAssets(10 ** decimals()); - - if (currentSharePrice > feeModel.highWaterMark) { - feeModel.highWaterMark = currentSharePrice; - } - - // Emit event for tracking state updates - emit EventsLib.VaultStateUpdated(newTotalAssets); - } - - // --------- ZAMA COPROCESSOR FUNCTIONS --------- - - /// @inheritdoc IOrionEncryptedVault - function callbackDecryptSingleEbool( - uint256 requestID, - bytes calldata cleartexts, - bytes calldata decryptionProof - ) external { - FHE.checkSignatures(requestID, cleartexts, decryptionProof); - - isIntentValid = abi.decode(cleartexts, (bool)); - } -} diff --git a/test/EncryptedVault.test.ts b/test/EncryptedVault.test.ts deleted file mode 100644 index 93a4772b..00000000 --- a/test/EncryptedVault.test.ts +++ /dev/null @@ -1,686 +0,0 @@ -import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; -import { expect } from "chai"; -import { ethers, fhevm } from "hardhat"; - -import { - MockUnderlyingAsset, - MockERC4626Asset, - MockPriceAdapter, - MockExecutionAdapter, - OrionConfig, - InternalStatesOrchestrator, - LiquidityOrchestrator, - EncryptedVaultFactory, - OrionEncryptedVault, - PriceAdapterRegistry, -} from "../typechain-types"; - -let encryptedVaultFactory: EncryptedVaultFactory; -let orionConfig: OrionConfig; -let underlyingAsset: MockUnderlyingAsset; -let mockAsset1: MockERC4626Asset; -let mockAsset2: MockERC4626Asset; -let mockPriceAdapter1: MockPriceAdapter; -let mockPriceAdapter2: MockPriceAdapter; -let mockExecutionAdapter1: MockExecutionAdapter; -let mockExecutionAdapter2: MockExecutionAdapter; -let priceAdapterRegistry: PriceAdapterRegistry; -let internalStatesOrchestrator: InternalStatesOrchestrator; -let liquidityOrchestrator: LiquidityOrchestrator; -let encryptedVault: OrionEncryptedVault; - -let owner: SignerWithAddress, curator: SignerWithAddress, other: SignerWithAddress; - -beforeEach(async function () { - [owner, curator, other] = await ethers.getSigners(); - - const MockUnderlyingAssetFactory = await ethers.getContractFactory("MockUnderlyingAsset"); - const underlyingAssetDeployed = await MockUnderlyingAssetFactory.deploy(6); - await underlyingAssetDeployed.waitForDeployment(); - underlyingAsset = underlyingAssetDeployed as unknown as MockUnderlyingAsset; - - const MockERC4626AssetFactory = await ethers.getContractFactory("MockERC4626Asset"); - const mockAsset1Deployed = await MockERC4626AssetFactory.deploy( - await underlyingAsset.getAddress(), - "Mock Asset 1", - "MA1", - ); - await mockAsset1Deployed.waitForDeployment(); - mockAsset1 = mockAsset1Deployed as unknown as MockERC4626Asset; - - const mockAsset2Deployed = await MockERC4626AssetFactory.deploy( - await underlyingAsset.getAddress(), - "Mock Asset 2", - "MA2", - ); - await mockAsset2Deployed.waitForDeployment(); - mockAsset2 = mockAsset2Deployed as unknown as MockERC4626Asset; - - // Deploy OrionConfig - const OrionConfigFactory = await ethers.getContractFactory("OrionConfig"); - const orionConfigDeployed = await OrionConfigFactory.deploy(owner.address, await underlyingAsset.getAddress()); - await orionConfigDeployed.waitForDeployment(); - orionConfig = orionConfigDeployed as unknown as OrionConfig; - - const EncryptedVaultFactoryFactory = await ethers.getContractFactory("EncryptedVaultFactory"); - const encryptedVaultFactoryDeployed = await EncryptedVaultFactoryFactory.deploy(await orionConfig.getAddress()); - await encryptedVaultFactoryDeployed.waitForDeployment(); - encryptedVaultFactory = encryptedVaultFactoryDeployed as unknown as EncryptedVaultFactory; - - const InternalStatesOrchestratorFactory = await ethers.getContractFactory("InternalStatesOrchestrator"); - const internalStatesOrchestratorDeployed = await InternalStatesOrchestratorFactory.deploy( - owner.address, - await orionConfig.getAddress(), - await other.address, - ); - await internalStatesOrchestratorDeployed.waitForDeployment(); - internalStatesOrchestrator = internalStatesOrchestratorDeployed as unknown as InternalStatesOrchestrator; - - const LiquidityOrchestratorFactory = await ethers.getContractFactory("LiquidityOrchestrator"); - const liquidityOrchestratorDeployed = await LiquidityOrchestratorFactory.deploy( - owner.address, - await orionConfig.getAddress(), - await other.address, - ); - await liquidityOrchestratorDeployed.waitForDeployment(); - liquidityOrchestrator = liquidityOrchestratorDeployed as unknown as LiquidityOrchestrator; - - const MockPriceAdapterFactory = await ethers.getContractFactory("MockPriceAdapter"); - mockPriceAdapter1 = (await MockPriceAdapterFactory.deploy()) as unknown as MockPriceAdapter; - await mockPriceAdapter1.waitForDeployment(); - - mockPriceAdapter2 = (await MockPriceAdapterFactory.deploy()) as unknown as MockPriceAdapter; - await mockPriceAdapter2.waitForDeployment(); - - const MockExecutionAdapterFactory = await ethers.getContractFactory("MockExecutionAdapter"); - mockExecutionAdapter1 = (await MockExecutionAdapterFactory.deploy()) as unknown as MockExecutionAdapter; - await mockExecutionAdapter1.waitForDeployment(); - - mockExecutionAdapter2 = (await MockExecutionAdapterFactory.deploy()) as unknown as MockExecutionAdapter; - await mockExecutionAdapter2.waitForDeployment(); - - const PriceAdapterRegistryFactory = await ethers.getContractFactory("PriceAdapterRegistry"); - const priceAdapterRegistryDeployed = await PriceAdapterRegistryFactory.deploy( - owner.address, - await orionConfig.getAddress(), - ); - await priceAdapterRegistryDeployed.waitForDeployment(); - priceAdapterRegistry = priceAdapterRegistryDeployed as unknown as PriceAdapterRegistry; - - await orionConfig.setInternalStatesOrchestrator(await internalStatesOrchestrator.getAddress()); - await orionConfig.setLiquidityOrchestrator(await liquidityOrchestrator.getAddress()); - await orionConfig.setVaultFactories(other.address, await encryptedVaultFactory.getAddress()); - await orionConfig.setPriceAdapterRegistry(await priceAdapterRegistry.getAddress()); - await orionConfig.setProtocolRiskFreeRate(0.0423 * 10_000); - - await orionConfig.addWhitelistedAsset( - await mockAsset1.getAddress(), - await mockPriceAdapter1.getAddress(), - await mockExecutionAdapter1.getAddress(), - ); - await orionConfig.addWhitelistedAsset( - await mockAsset2.getAddress(), - await mockPriceAdapter2.getAddress(), - await mockExecutionAdapter2.getAddress(), - ); -}); - -describe("EncryptedVault - Curator Pipeline", function () { - describe("Vault Creation", function () { - it("Should create an encrypted vault with correct parameters", async function () { - const tx = await encryptedVaultFactory.connect(owner).createVault(curator.address, "Test Vault", "TV", 0, 0, 0); - const receipt = await tx.wait(); - - // Find the vault creation event - const event = receipt?.logs.find((log) => { - try { - const parsed = encryptedVaultFactory.interface.parseLog(log); - return parsed?.name === "OrionVaultCreated"; - } catch { - return false; - } - }); - - void expect(event).to.not.be.undefined; - const parsedEvent = encryptedVaultFactory.interface.parseLog(event!); - const vaultAddress = parsedEvent?.args[0]; - - void expect(vaultAddress).to.not.equal(ethers.ZeroAddress); - - // Get the vault contract - encryptedVault = (await ethers.getContractAt( - "OrionEncryptedVault", - vaultAddress, - )) as unknown as OrionEncryptedVault; - - // Verify vault properties - void expect(await encryptedVault.vaultOwner()).to.equal(owner.address); - void expect(await encryptedVault.curator()).to.equal(curator.address); - void expect(await encryptedVault.config()).to.equal(await orionConfig.getAddress()); - }); - - it("Should initialize vault whitelist to match config whitelist after deployment", async function () { - const tx = await encryptedVaultFactory.connect(owner).createVault(curator.address, "Test Vault", "TV", 0, 0, 0); - const receipt = await tx.wait(); - - // Find the vault creation event - const event = receipt?.logs.find((log) => { - try { - const parsed = encryptedVaultFactory.interface.parseLog(log); - return parsed?.name === "OrionVaultCreated"; - } catch { - return false; - } - }); - - const parsedEvent = encryptedVaultFactory.interface.parseLog(event!); - const vaultAddress = parsedEvent?.args[0]; - - // Get the vault contract - encryptedVault = (await ethers.getContractAt( - "OrionEncryptedVault", - vaultAddress, - )) as unknown as OrionEncryptedVault; - - // Get config whitelist - const configWhitelist = await orionConfig.getAllWhitelistedAssets(); - - // Get vault whitelist - const vaultWhitelist = await encryptedVault.vaultWhitelist(); - - // Compare the whitelists - expect(vaultWhitelist.length).to.equal(configWhitelist.length); - - // Sort both arrays to ensure order doesn't affect comparison - const sortedConfigWhitelist = [...configWhitelist].sort(); - const sortedVaultWhitelist = [...vaultWhitelist].sort(); - - for (let i = 0; i < sortedConfigWhitelist.length; i++) { - expect(sortedVaultWhitelist[i]).to.equal(sortedConfigWhitelist[i]); - } - }); - }); - - describe("Curator Operations", function () { - beforeEach(async function () { - // Create a vault first - const tx = await encryptedVaultFactory.connect(owner).createVault(curator.address, "Test Vault", "TV", 0, 0, 0); - const receipt = await tx.wait(); - const event = receipt?.logs.find((log) => { - try { - const parsed = encryptedVaultFactory.interface.parseLog(log); - return parsed?.name === "OrionVaultCreated"; - } catch { - return false; - } - }); - const parsedEvent = encryptedVaultFactory.interface.parseLog(event!); - const vaultAddress = parsedEvent?.args[0]; - encryptedVault = (await ethers.getContractAt( - "OrionEncryptedVault", - vaultAddress, - )) as unknown as OrionEncryptedVault; - }); - - it("Should allow vault owner to update vault whitelist", async function () { - const newWhitelist = [await mockAsset1.getAddress(), await mockAsset2.getAddress()]; - - await expect(encryptedVault.connect(owner).updateVaultWhitelist(newWhitelist)).to.not.be.reverted; - }); - - it("Should allow vault owner to update fee model", async function () { - const feeType = 0; // Performance fee mode - const performanceFee = 2000; // 20% in basis points - const managementFee = 100; // 1% in basis points - - await expect(encryptedVault.connect(owner).updateFeeModel(feeType, performanceFee, managementFee)).to.not.be - .reverted; - }); - - it("Should allow vault owner to claim curator fees", async function () { - // Note: In a real scenario, fees would be accrued by the liquidity orchestrator - // For testing purposes, we'll skip the fee accrual step and just test the claim function - // The claim function requires pendingCuratorFees > 0, so we'll test the revert case - - const claimAmount = ethers.parseUnits("50", 6); // Try to claim 50 USDC - - await expect(encryptedVault.connect(owner).claimCuratorFees(claimAmount)).to.be.revertedWithCustomError( - encryptedVault, - "InsufficientAmount", - ); - }); - - it("Should allow curator to submit encrypted intent", async function () { - // First update the whitelist to include the assets we want to use - const whitelist = [await mockAsset1.getAddress(), await mockAsset2.getAddress()]; - await encryptedVault.connect(owner).updateVaultWhitelist(whitelist); - - // Create encrypted intent with 60% in asset1 and 40% in asset2 - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - // Add encrypted weights (60% and 40% in curator intent decimals) - encryptedIntentBuffer.add128(600000000); // 60% * 10^9 - encryptedIntentBuffer.add128(400000000); // 40% * 10^9 - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent = [ - { - token: await mockAsset1.getAddress(), - weight: encryptedIntentCiphertexts.handles[0], - }, - { - token: await mockAsset2.getAddress(), - weight: encryptedIntentCiphertexts.handles[1], - }, - ]; - - await encryptedVault.connect(curator).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof); - }); - - it("Should reject encrypted intent with invalid total weight", async function () { - const whitelist = [await mockAsset1.getAddress(), await mockAsset2.getAddress()]; - await encryptedVault.connect(owner).updateVaultWhitelist(whitelist); - - // Create encrypted intent with total weight != 100% - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - // Add encrypted weights (60% and 30% - total = 90%) - encryptedIntentBuffer.add128(600000000); // 60% * 10^9 - encryptedIntentBuffer.add128(300000000); // 30% * 10^9 - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - // Convert proof and handles to hex - const handlesHex = encryptedIntentCiphertexts.handles.map((h) => "0x" + Buffer.from(h).toString("hex")); - const inputProofHex = "0x" + Buffer.from(encryptedIntentCiphertexts.inputProof).toString("hex"); - - const encryptedIntent = [ - { - token: await mockAsset1.getAddress(), - weight: handlesHex[0], - }, - { - token: await mockAsset2.getAddress(), - weight: handlesHex[1], - }, - ]; - - // This should fail validation in the FHE callback - await expect(encryptedVault.connect(curator).submitIntent(encryptedIntent, inputProofHex)).to.not.be.reverted; // The transaction succeeds, but intent validity will be false - }); - - it("Should reject encrypted intent with non-whitelisted assets", async function () { - // Create a new mock asset that's not in the protocol whitelist - const MockERC4626AssetFactory = await ethers.getContractFactory("MockERC4626Asset"); - const nonWhitelistedAsset = await MockERC4626AssetFactory.deploy( - await underlyingAsset.getAddress(), - "Non Whitelisted Asset", - "NWA", - ); - await nonWhitelistedAsset.waitForDeployment(); - - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - encryptedIntentBuffer.add128(1000000000); // 100% * 10^9 - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent = [ - { - token: await nonWhitelistedAsset.getAddress(), - weight: encryptedIntentCiphertexts.handles[0], - }, - ]; - - await expect( - encryptedVault.connect(curator).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof), - ).to.be.revertedWithCustomError(encryptedVault, "TokenNotWhitelisted"); - }); - - it("Should reject encrypted intent from non-curator", async function () { - const whitelist = [await mockAsset1.getAddress(), await mockAsset2.getAddress()]; - await encryptedVault.connect(owner).updateVaultWhitelist(whitelist); - - const encryptedIntentBuffer = fhevm.createEncryptedInput( - await encryptedVault.getAddress(), - other.address, // Using other address instead of curator - ); - - encryptedIntentBuffer.add128(1000000000); // 100% * 10^9 - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent = [ - { - token: await mockAsset1.getAddress(), - weight: encryptedIntentCiphertexts.handles[0], - }, - ]; - - await expect( - encryptedVault.connect(other).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof), - ).to.be.revertedWithCustomError(encryptedVault, "UnauthorizedAccess"); - }); - - it("Should reject empty encrypted intent", async function () { - const whitelist = [await mockAsset1.getAddress(), await mockAsset2.getAddress()]; - await encryptedVault.connect(owner).updateVaultWhitelist(whitelist); - - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent: Array<{ token: string; weight: string }> = []; // Empty intent - - await expect( - encryptedVault.connect(curator).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof), - ).to.be.revertedWithCustomError(encryptedVault, "OrderIntentCannotBeEmpty"); - }); - - it("Should reject encrypted intent with duplicate tokens", async function () { - const whitelist = [await mockAsset1.getAddress(), await mockAsset2.getAddress()]; - await encryptedVault.connect(owner).updateVaultWhitelist(whitelist); - - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - // Add encrypted weights - encryptedIntentBuffer.add128(500000000); // 50% * 10^9 - encryptedIntentBuffer.add128(500000000); // 50% * 10^9 - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent = [ - { - token: await mockAsset1.getAddress(), - weight: encryptedIntentCiphertexts.handles[0], - }, - { - token: await mockAsset1.getAddress(), // Duplicate token - weight: encryptedIntentCiphertexts.handles[1], - }, - ]; - - await expect( - encryptedVault.connect(curator).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof), - ).to.be.revertedWithCustomError(encryptedVault, "TokenAlreadyInOrder"); - }); - }); - - describe("Vault State Management", function () { - beforeEach(async function () { - // Create a vault first - const tx = await encryptedVaultFactory.connect(owner).createVault(curator.address, "Test Vault", "TV", 0, 0, 0); - const receipt = await tx.wait(); - const event = receipt?.logs.find((log) => { - try { - const parsed = encryptedVaultFactory.interface.parseLog(log); - return parsed?.name === "OrionVaultCreated"; - } catch { - return false; - } - }); - const parsedEvent = encryptedVaultFactory.interface.parseLog(event!); - const vaultAddress = parsedEvent?.args[0]; - encryptedVault = (await ethers.getContractAt( - "OrionEncryptedVault", - vaultAddress, - )) as unknown as OrionEncryptedVault; - }); - - it("Should reject vault state update from non-liquidity orchestrator", async function () { - const newTotalAssets = ethers.parseUnits("1000", 6); - - const encryptedPortfolio = [ - { - token: await mockAsset1.getAddress(), - value: "0x0000000000000000000000000000000000000000000000000000000000000001", - }, - ]; - - await expect( - encryptedVault.connect(other).updateVaultState(encryptedPortfolio, newTotalAssets), - ).to.be.revertedWithCustomError(encryptedVault, "UnauthorizedAccess"); - }); - - it("Should return encrypted portfolio data", async function () { - const [tokens, sharesPerAsset] = await encryptedVault.getPortfolio(); - - // Initially, portfolio should be empty - void expect(tokens).to.deep.equal([]); - void expect(sharesPerAsset).to.deep.equal([]); - }); - - it("Should return encrypted intent data", async function () { - const [tokens, weights] = await encryptedVault.getIntent(); - - // Initially, intent should be empty - void expect(tokens).to.deep.equal([]); - void expect(weights).to.deep.equal([]); - }); - - it("Should return intent validity status", async function () { - const isValid = await encryptedVault.isIntentValid(); - - // Initially, intent should be invalid - void expect(isValid).to.be.false; - }); - }); - - describe("Full Pipeline Integration", function () { - it("Should execute complete encrypted curator pipeline successfully", async function () { - // 1. Create vault - const tx = await encryptedVaultFactory - .connect(owner) - .createVault(curator.address, "Integration Test Vault", "ITV", 0, 0, 0); - const receipt = await tx.wait(); - const event = receipt?.logs.find((log) => { - try { - const parsed = encryptedVaultFactory.interface.parseLog(log); - return parsed?.name === "OrionVaultCreated"; - } catch { - return false; - } - }); - const parsedEvent = encryptedVaultFactory.interface.parseLog(event!); - const vaultAddress = parsedEvent?.args[0]; - encryptedVault = (await ethers.getContractAt( - "OrionEncryptedVault", - vaultAddress, - )) as unknown as OrionEncryptedVault; - - // 2. Update vault whitelist - const whitelist = [await mockAsset1.getAddress(), await mockAsset2.getAddress()]; - await encryptedVault.connect(owner).updateVaultWhitelist(whitelist); - - // 3. Update fee model - await encryptedVault.connect(owner).updateFeeModel(0, 2000, 100); - - // 4. Submit encrypted intent - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - // Add encrypted weights (70% and 30%) - encryptedIntentBuffer.add128(700000000); // 70% * 10^9 - encryptedIntentBuffer.add128(300000000); // 30% * 10^9 - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent = [ - { - token: await mockAsset1.getAddress(), - weight: encryptedIntentCiphertexts.handles[0], - }, - { - token: await mockAsset2.getAddress(), - weight: encryptedIntentCiphertexts.handles[1], - }, - ]; - - await encryptedVault.connect(curator).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof); - - // 5. Verify the encrypted intent was stored (we can only check the tokens, not the encrypted weights) - const [tokens, weights] = await encryptedVault.getIntent(); - void expect(tokens).to.deep.equal([await mockAsset1.getAddress(), await mockAsset2.getAddress()]); - void expect(weights.length).to.equal(2); // Weights are encrypted, so we just check the length - - // Use the built-in `awaitDecryptionOracle` helper to wait for the FHEVM decryption oracle - // to complete all pending Solidity decryption requests. - await fhevm.awaitDecryptionOracle(); - - // At this point, the Solidity callback should have been invoked by the FHEVM backend. - // We can now retrieve the decrypted (clear) value. - const isIntentValid = await encryptedVault.isIntentValid(); - void expect(isIntentValid).to.be.true; - }); - }); - - describe("FHE Integration Tests", function () { - beforeEach(async function () { - // Create a vault first - const tx = await encryptedVaultFactory - .connect(owner) - .createVault(curator.address, "FHE Test Vault", "FTV", 0, 0, 0); - const receipt = await tx.wait(); - const event = receipt?.logs.find((log) => { - try { - const parsed = encryptedVaultFactory.interface.parseLog(log); - return parsed?.name === "OrionVaultCreated"; - } catch { - return false; - } - }); - const parsedEvent = encryptedVaultFactory.interface.parseLog(event!); - const vaultAddress = parsedEvent?.args[0]; - encryptedVault = (await ethers.getContractAt( - "OrionEncryptedVault", - vaultAddress, - )) as unknown as OrionEncryptedVault; - - // Update whitelist - const whitelist = [await mockAsset1.getAddress(), await mockAsset2.getAddress()]; - await encryptedVault.connect(owner).updateVaultWhitelist(whitelist); - }); - - it("Should handle single asset encrypted intent", async function () { - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - encryptedIntentBuffer.add128(1000000000); // 100% * 10^9 - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent = [ - { - token: await mockAsset1.getAddress(), - weight: encryptedIntentCiphertexts.handles[0], - }, - ]; - - await expect(encryptedVault.connect(curator).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof)) - .to.not.be.reverted; - - const [tokens, weights] = await encryptedVault.getIntent(); - void expect(tokens).to.deep.equal([await mockAsset1.getAddress()]); - void expect(weights.length).to.equal(1); - }); - - it("Should handle multiple asset encrypted intent with equal weights", async function () { - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - // Add equal weights (50% each) - encryptedIntentBuffer.add128(500000000); // 50% * 10^9 - encryptedIntentBuffer.add128(500000000); // 50% * 10^9 - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent = [ - { - token: await mockAsset1.getAddress(), - weight: encryptedIntentCiphertexts.handles[0], - }, - { - token: await mockAsset2.getAddress(), - weight: encryptedIntentCiphertexts.handles[1], - }, - ]; - - await expect(encryptedVault.connect(curator).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof)) - .to.not.be.reverted; - - const [tokens, weights] = await encryptedVault.getIntent(); - void expect(tokens).to.deep.equal([await mockAsset1.getAddress(), await mockAsset2.getAddress()]); - void expect(weights.length).to.equal(2); - }); - - it("Should handle encrypted intent with zero weights", async function () { - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - // Add weights including zero - encryptedIntentBuffer.add128(1000000000); // 100% * 10^9 - encryptedIntentBuffer.add128(0); // 0% - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent = [ - { - token: await mockAsset1.getAddress(), - weight: encryptedIntentCiphertexts.handles[0], - }, - { - token: await mockAsset2.getAddress(), - weight: encryptedIntentCiphertexts.handles[1], - }, - ]; - - // This should fail validation in the FHE callback due to zero weight - await expect(encryptedVault.connect(curator).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof)) - .to.not.be.reverted; // Transaction succeeds, but intent validity will be false - }); - - it("Should properly cleanup previous intent when submitting new intent", async function () { - // Submit first intent with asset1 only (100%) - const firstIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - firstIntentBuffer.add128(1000000000); // 100% * 10^9 - const firstIntentCiphertexts = await firstIntentBuffer.encrypt(); - - const firstIntent = [ - { - token: await mockAsset1.getAddress(), - weight: firstIntentCiphertexts.handles[0], - }, - ]; - - // Submit first intent - await expect(encryptedVault.connect(curator).submitIntent(firstIntent, firstIntentCiphertexts.inputProof)).to.not - .be.reverted; - - // Verify first intent was stored - let [tokens, weights] = await encryptedVault.getIntent(); - expect(tokens).to.deep.equal([await mockAsset1.getAddress()]); - expect(weights.length).to.equal(1); - - // Submit second intent with asset2 only (100%) - different asset - const secondIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - secondIntentBuffer.add128(1000000000); // 100% * 10^9 - const secondIntentCiphertexts = await secondIntentBuffer.encrypt(); - - const secondIntent = [ - { - token: await mockAsset2.getAddress(), - weight: secondIntentCiphertexts.handles[0], - }, - ]; - - // Submit second intent - this should cleanup the previous intent - await expect(encryptedVault.connect(curator).submitIntent(secondIntent, secondIntentCiphertexts.inputProof)).to - .not.be.reverted; - - // Verify second intent replaced the first intent - [tokens, weights] = await encryptedVault.getIntent(); - expect(tokens).to.deep.equal([await mockAsset2.getAddress()]); - expect(weights.length).to.equal(1); - - // Verify that asset1 is no longer in the intent (cleanup worked) - expect(tokens).to.not.include(await mockAsset1.getAddress()); - }); - }); -}); diff --git a/test/Orchestrators.test.ts b/test/Orchestrators.test.ts index 789dea30..2f47bc53 100644 --- a/test/Orchestrators.test.ts +++ b/test/Orchestrators.test.ts @@ -1,6 +1,6 @@ import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; -import { ethers, fhevm } from "hardhat"; +import { ethers } from "hardhat"; import { time } from "@nomicfoundation/hardhat-network-helpers"; import { @@ -11,16 +11,13 @@ import { InternalStatesOrchestrator, LiquidityOrchestrator, TransparentVaultFactory, - EncryptedVaultFactory, OrionTransparentVault, - OrionEncryptedVault, PriceAdapterRegistry, OrionAssetERC4626PriceAdapter, } from "../typechain-types"; describe("Orchestrators", function () { let transparentVaultFactory: TransparentVaultFactory; - let encryptedVaultFactory: EncryptedVaultFactory; let orionConfig: OrionConfig; let underlyingAsset: MockUnderlyingAsset; let mockAsset1: MockERC4626Asset; @@ -32,7 +29,6 @@ describe("Orchestrators", function () { let internalStatesOrchestrator: InternalStatesOrchestrator; let liquidityOrchestrator: LiquidityOrchestrator; let transparentVault: OrionTransparentVault; - let encryptedVault: OrionEncryptedVault; let owner: SignerWithAddress; let curator: SignerWithAddress; @@ -123,12 +119,6 @@ describe("Orchestrators", function () { await transparentVaultFactoryDeployed.waitForDeployment(); transparentVaultFactory = transparentVaultFactoryDeployed as unknown as TransparentVaultFactory; - // Deploy EncryptedVaultFactory - const EncryptedVaultFactoryFactory = await ethers.getContractFactory("EncryptedVaultFactory"); - const encryptedVaultFactoryDeployed = await EncryptedVaultFactoryFactory.deploy(await orionConfig.getAddress()); - await encryptedVaultFactoryDeployed.waitForDeployment(); - encryptedVaultFactory = encryptedVaultFactoryDeployed as unknown as EncryptedVaultFactory; - // Deploy LiquidityOrchestrator first const LiquidityOrchestratorFactory = await ethers.getContractFactory("LiquidityOrchestrator"); const liquidityOrchestratorDeployed = await LiquidityOrchestratorFactory.deploy( @@ -155,10 +145,7 @@ describe("Orchestrators", function () { // Configure OrionConfig await orionConfig.setInternalStatesOrchestrator(await internalStatesOrchestrator.getAddress()); - await orionConfig.setVaultFactories( - await transparentVaultFactory.getAddress(), - await encryptedVaultFactory.getAddress(), - ); + await orionConfig.setVaultFactory(await transparentVaultFactory.getAddress()); await internalStatesOrchestrator.connect(owner).updateProtocolFees(10, 1000); @@ -264,65 +251,6 @@ describe("Orchestrators", function () { await underlyingAsset.connect(user).approve(await transparentVault.getAddress(), ethers.parseUnits("10000", 12)); const depositAmount = ethers.parseUnits("100", 12); await transparentVault.connect(user).requestDeposit(depositAmount); - - // Create an encrypted vault - const tx2 = await encryptedVaultFactory - .connect(owner) - .createVault(curator.address, "Test Encrypted Vault", "TEV", 0, 0, 0); - const receipt2 = await tx2.wait(); - - // Find the vault creation event - const event2 = receipt2?.logs.find((log) => { - try { - const parsed = encryptedVaultFactory.interface.parseLog(log); - return parsed?.name === "OrionVaultCreated"; - } catch { - return false; - } - }); - - void expect(event2).to.not.be.undefined; - const parsedEvent2 = encryptedVaultFactory.interface.parseLog(event2!); - const vaultAddress2 = parsedEvent2?.args[0]; - - // Get the vault contract - encryptedVault = (await ethers.getContractAt( - "OrionEncryptedVault", - vaultAddress2, - )) as unknown as OrionEncryptedVault; - - const encryptedIntentBuffer = fhevm.createEncryptedInput(await encryptedVault.getAddress(), curator.address); - - encryptedIntentBuffer.add128(400000000); // 40% * 10^9 - encryptedIntentBuffer.add128(350000000); // 35% * 10^9 - encryptedIntentBuffer.add128(240000000); // 24% * 10^9 - encryptedIntentBuffer.add128(10000000); // 1% * 10^9 - - const encryptedIntentCiphertexts = await encryptedIntentBuffer.encrypt(); - - const encryptedIntent = [ - { - token: await mockAsset1.getAddress(), - weight: encryptedIntentCiphertexts.handles[0], - }, - { - token: await mockAsset2.getAddress(), - weight: encryptedIntentCiphertexts.handles[1], - }, - { - token: await mockAsset3.getAddress(), - weight: encryptedIntentCiphertexts.handles[2], - }, - { - token: await underlyingAsset.getAddress(), - weight: encryptedIntentCiphertexts.handles[3], - }, - ]; - - await encryptedVault.connect(curator).submitIntent(encryptedIntent, encryptedIntentCiphertexts.inputProof); - - await underlyingAsset.connect(user).approve(await encryptedVault.getAddress(), ethers.parseUnits("100", 12)); - await encryptedVault.connect(user).requestDeposit(depositAmount); }); describe("Idle-only functionality", function () { @@ -336,17 +264,14 @@ describe("Orchestrators", function () { await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // Not idle anymore - const vaultAddress = await encryptedVault.getAddress(); + const vaultAddress = await transparentVault.getAddress(); await expect(orionConfig.removeOrionVault(vaultAddress, 1)).to.be.revertedWithCustomError( orionConfig, "SystemNotIdle", ); await expect( - orionConfig.setVaultFactories( - await transparentVaultFactory.getAddress(), - await encryptedVaultFactory.getAddress(), - ), + orionConfig.setVaultFactory(await transparentVaultFactory.getAddress()), ).to.be.revertedWithCustomError(orionConfig, "SystemNotIdle"); await expect(orionConfig.setProtocolRiskFreeRate(1000)).to.be.revertedWithCustomError( @@ -367,7 +292,7 @@ describe("Orchestrators", function () { "SystemNotIdle", ); - await expect(orionConfig.removeOrionVault(await encryptedVault.getAddress(), 1)).to.be.revertedWithCustomError( + await expect(orionConfig.removeOrionVault(await transparentVault.getAddress(), 0)).to.be.revertedWithCustomError( orionConfig, "SystemNotIdle", ); @@ -378,7 +303,7 @@ describe("Orchestrators", function () { "SystemNotIdle", ); - await expect(internalStatesOrchestrator.updateMinibatchSizes(5, 3)).to.be.revertedWithCustomError( + await expect(internalStatesOrchestrator.updateMinibatchSize(5)).to.be.revertedWithCustomError( internalStatesOrchestrator, "SystemNotIdle", ); @@ -406,37 +331,33 @@ describe("Orchestrators", function () { // Test vault functions const depositAmount = ethers.parseUnits("100", 12); - await expect(encryptedVault.connect(user).requestDeposit(depositAmount)).to.be.revertedWithCustomError( - encryptedVault, + await expect(transparentVault.connect(user).requestDeposit(depositAmount)).to.be.revertedWithCustomError( + transparentVault, "SystemNotIdle", ); - await expect(encryptedVault.connect(user).cancelDepositRequest(depositAmount)).to.be.revertedWithCustomError( - encryptedVault, + await expect(transparentVault.connect(user).cancelDepositRequest(depositAmount)).to.be.revertedWithCustomError( + transparentVault, "SystemNotIdle", ); const redeemAmount = ethers.parseUnits("50", 18); - await expect(encryptedVault.connect(user).requestRedeem(redeemAmount)).to.be.revertedWithCustomError( - encryptedVault, + await expect(transparentVault.connect(user).requestRedeem(redeemAmount)).to.be.revertedWithCustomError( + transparentVault, "SystemNotIdle", ); - await expect(encryptedVault.connect(user).cancelRedeemRequest(redeemAmount)).to.be.revertedWithCustomError( - encryptedVault, + await expect(transparentVault.connect(user).cancelRedeemRequest(redeemAmount)).to.be.revertedWithCustomError( + transparentVault, "SystemNotIdle", ); - await expect(encryptedVault.connect(owner).updateFeeModel(0, 1000, 200)).to.be.revertedWithCustomError( - encryptedVault, + await expect(transparentVault.connect(owner).updateFeeModel(0, 1000, 200)).to.be.revertedWithCustomError( + transparentVault, "SystemNotIdle", ); - // Test factory functions - await expect( - encryptedVaultFactory.createVault(curator.address, "Test Encrypted Vault", "TEV", 0, 0, 0), - ).to.be.revertedWithCustomError(encryptedVaultFactory, "SystemNotIdle"); - + // Test factory function await expect( transparentVaultFactory.createVault(curator.address, "Test Transparent Vault", "TTV", 0, 0, 0), ).to.be.revertedWithCustomError(transparentVaultFactory, "SystemNotIdle"); @@ -444,58 +365,6 @@ describe("Orchestrators", function () { }); describe("performUpkeep", function () { - it("should complete full upkeep cycle with intent decryption", async function () { - // Await decryption oracle and verify intent is valid - await fhevm.awaitDecryptionOracle(); - const isIntentValid = await encryptedVault.isIntentValid(); - void expect(isIntentValid).to.be.true; - - // Fast forward time to trigger upkeep - expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Idle - - const epochDuration = await internalStatesOrchestrator.epochDuration(); - await time.increase(epochDuration + 1n); - - let [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // PreprocessingTransparentVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // PreprocessingEncryptedVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - await fhevm.awaitDecryptionOracle(); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // Buffering - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(5); // PostprocessingTransparentVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(6); // PostprocessingEncryptedVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(7); // BuildingOrders - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Back to Idle - expect(await internalStatesOrchestrator.epochCounter()).to.equal(1); // Epoch incremented - - // Check that orders were built - const [sellingTokens, _sellingAmounts, buyingTokens, _buyingAmounts] = - await internalStatesOrchestrator.getOrders(); - - // Should have all three assets in the orders arrays - expect(sellingTokens.length).to.equal(0); - expect(buyingTokens.length).to.equal(4); - }); - it("should complete full upkeep cycles without intent decryption", async function () { // Skip intent decryption - don't await decryption oracle // Encrypted Vault intents is invalid, so they are not processed @@ -512,24 +381,15 @@ describe("Orchestrators", function () { [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // PreprocessingEncryptedVaults + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // Buffering + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(5); // PostprocessingTransparentVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(6); // PostprocessingEncryptedVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(7); // BuildingOrders + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); @@ -629,24 +489,15 @@ describe("Orchestrators", function () { [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // PreprocessingEncryptedVaults + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // Buffering + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(5); // PostprocessingTransparentVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(6); // PostprocessingEncryptedVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(7); // BuildingOrders + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); @@ -832,7 +683,7 @@ describe("Orchestrators", function () { }); it("should allow owner to update minibatch sizes", async function () { - await expect(internalStatesOrchestrator.updateMinibatchSizes(2, 2)).to.not.be.reverted; + await expect(internalStatesOrchestrator.updateMinibatchSize(2)).to.not.be.reverted; }); it("should allow owner to update protocol fees", async function () { @@ -916,26 +767,6 @@ describe("Orchestrators", function () { ).to.be.revertedWithCustomError(internalStatesOrchestrator, "InvalidState"); }); - it("should revert with InvalidState when calling preprocessEV in wrong phase", async function () { - expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Idle - - const maliciousData = createMaliciousPerformData("preprocessEV(uint8)", 0); - - await expect( - internalStatesOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), - ).to.be.revertedWithCustomError(internalStatesOrchestrator, "InvalidState"); - }); - - it("should revert with InvalidState when calling processDecryptedValues in wrong phase", async function () { - expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Idle - - const maliciousData = createMaliciousPerformData("processDecryptedValues()", 0); - - await expect( - internalStatesOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), - ).to.be.revertedWithCustomError(internalStatesOrchestrator, "InvalidState"); - }); - it("should revert with InvalidState when calling buffer in wrong phase", async function () { expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Idle @@ -956,16 +787,6 @@ describe("Orchestrators", function () { ).to.be.revertedWithCustomError(internalStatesOrchestrator, "InvalidState"); }); - it("should revert with InvalidState when calling postprocessEV in wrong phase", async function () { - expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Idle - - const maliciousData = createMaliciousPerformData("postprocessEV(uint8)", 0); - - await expect( - internalStatesOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), - ).to.be.revertedWithCustomError(internalStatesOrchestrator, "InvalidState"); - }); - it("should revert with InvalidState when calling buildOrders in wrong phase", async function () { expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Idle @@ -1001,24 +822,15 @@ describe("Orchestrators", function () { [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // PreprocessingEncryptedVaults + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - await fhevm.awaitDecryptionOracle(); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // Buffering + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(5); // PostprocessingTransparentVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(6); // PostprocessingEncryptedVaults - - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(7); // BuildingOrders + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); @@ -1039,7 +851,7 @@ describe("Orchestrators", function () { await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // PreprocessingTransparentVaults - const maliciousData = createMaliciousPerformData("preprocessEV(uint8)", 0); + const maliciousData = createMaliciousPerformData("buffer()", 0); await expect( internalStatesOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), diff --git a/test/OrchestratorsZeroState.test.ts b/test/OrchestratorsZeroState.test.ts index ec30cf57..486ea223 100644 --- a/test/OrchestratorsZeroState.test.ts +++ b/test/OrchestratorsZeroState.test.ts @@ -8,9 +8,7 @@ import { InternalStatesOrchestrator, LiquidityOrchestrator, TransparentVaultFactory, - EncryptedVaultFactory, OrionTransparentVault, - OrionEncryptedVault, MockUnderlyingAsset, } from "../typechain-types"; @@ -19,9 +17,7 @@ describe("Orchestrators - zero deposits and zero intents", function () { let internalStatesOrchestrator: InternalStatesOrchestrator; let liquidityOrchestrator: LiquidityOrchestrator; let transparentVaultFactory: TransparentVaultFactory; - let encryptedVaultFactory: EncryptedVaultFactory; let transparentVault: OrionTransparentVault; - let encryptedVault: OrionEncryptedVault; let underlyingAsset: MockUnderlyingAsset; let owner: SignerWithAddress; @@ -68,15 +64,7 @@ describe("Orchestrators - zero deposits and zero intents", function () { await transparentVaultFactoryDeployed.waitForDeployment(); transparentVaultFactory = transparentVaultFactoryDeployed as unknown as TransparentVaultFactory; - const EncryptedVaultFactoryFactory = await ethers.getContractFactory("EncryptedVaultFactory"); - const encryptedVaultFactoryDeployed = await EncryptedVaultFactoryFactory.deploy(await orionConfig.getAddress()); - await encryptedVaultFactoryDeployed.waitForDeployment(); - encryptedVaultFactory = encryptedVaultFactoryDeployed as unknown as EncryptedVaultFactory; - - await orionConfig.setVaultFactories( - await transparentVaultFactory.getAddress(), - await encryptedVaultFactory.getAddress(), - ); + await orionConfig.setVaultFactory(await transparentVaultFactory.getAddress()); await liquidityOrchestrator.setInternalStatesOrchestrator(await internalStatesOrchestrator.getAddress()); await liquidityOrchestrator.setTargetBufferRatio(100); // 1% @@ -101,26 +89,9 @@ describe("Orchestrators - zero deposits and zero intents", function () { tvAddress, )) as unknown as OrionTransparentVault; - // Create encrypted vault (no intent submitted => invalid by default) - const tx2 = await encryptedVaultFactory.connect(owner).createVault(curator.address, "ZeroState EV", "ZEV", 0, 0, 0); - const rcpt2 = await tx2.wait(); - const ev2 = rcpt2?.logs.find((log) => { - try { - const parsed = encryptedVaultFactory.interface.parseLog(log); - return parsed?.name === "OrionVaultCreated"; - } catch { - return false; - } - }); - const parsedEvent2 = encryptedVaultFactory.interface.parseLog(ev2!); - const evAddress = parsedEvent2?.args[0]; - encryptedVault = (await ethers.getContractAt("OrionEncryptedVault", evAddress)) as unknown as OrionEncryptedVault; - // Ensure no deposits or intents present expect(await transparentVault.pendingDeposit()).to.equal(0); expect(await transparentVault.pendingRedeem()).to.equal(0); - expect(await encryptedVault.pendingDeposit()).to.equal(0); - expect(await encryptedVault.pendingRedeem()).to.equal(0); }); it("completes upkeep with zero TVL and zero intents without errors", async function () { diff --git a/test/OrionConfigVault.test.ts b/test/OrionConfigVault.test.ts index 1a576db0..e23964c3 100644 --- a/test/OrionConfigVault.test.ts +++ b/test/OrionConfigVault.test.ts @@ -10,15 +10,13 @@ import { OrionConfig, InternalStatesOrchestrator, LiquidityOrchestrator, - EncryptedVaultFactory, - OrionEncryptedVault, TransparentVaultFactory, PriceAdapterRegistry, + OrionTransparentVault, } from "../typechain-types"; import { Log } from "ethers"; let transparentVaultFactory: TransparentVaultFactory; -let encryptedVaultFactory: EncryptedVaultFactory; let orionConfig: OrionConfig; let underlyingAsset: MockUnderlyingAsset; let mockAsset1: MockERC4626Asset; @@ -30,7 +28,7 @@ let mockExecutionAdapter2: MockExecutionAdapter; let priceAdapterRegistry: PriceAdapterRegistry; let internalStatesOrchestrator: InternalStatesOrchestrator; let liquidityOrchestrator: LiquidityOrchestrator; -let vault: OrionEncryptedVault; // Using encrypted vault as the test subject +let vault: OrionTransparentVault; // Using transparent vault as the test subject let owner: SignerWithAddress, curator: SignerWithAddress, other: SignerWithAddress, user: SignerWithAddress; @@ -70,11 +68,6 @@ beforeEach(async function () { await transparentVaultFactoryDeployed.waitForDeployment(); transparentVaultFactory = transparentVaultFactoryDeployed as unknown as TransparentVaultFactory; - const EncryptedVaultFactoryFactory = await ethers.getContractFactory("EncryptedVaultFactory"); - const encryptedVaultFactoryDeployed = await EncryptedVaultFactoryFactory.deploy(await orionConfig.getAddress()); - await encryptedVaultFactoryDeployed.waitForDeployment(); - encryptedVaultFactory = encryptedVaultFactoryDeployed as unknown as EncryptedVaultFactory; - const InternalStatesOrchestratorFactory = await ethers.getContractFactory("InternalStatesOrchestrator"); const internalStatesOrchestratorDeployed = await InternalStatesOrchestratorFactory.deploy( owner.address, @@ -117,10 +110,7 @@ beforeEach(async function () { await orionConfig.setInternalStatesOrchestrator(await internalStatesOrchestrator.getAddress()); await orionConfig.setLiquidityOrchestrator(await liquidityOrchestrator.getAddress()); - await orionConfig.setVaultFactories( - await transparentVaultFactory.getAddress(), - await encryptedVaultFactory.getAddress(), - ); + await orionConfig.setVaultFactory(await transparentVaultFactory.getAddress()); await orionConfig.setPriceAdapterRegistry(await priceAdapterRegistry.getAddress()); await orionConfig.setProtocolRiskFreeRate(0.0423 * 10_000); @@ -136,19 +126,19 @@ beforeEach(async function () { ); // Create a vault for testing - const tx = await encryptedVaultFactory.connect(owner).createVault(curator.address, "Test Vault", "TV", 0, 0, 0); + const tx = await transparentVaultFactory.connect(owner).createVault(curator.address, "Test Vault", "TV", 0, 0, 0); const receipt = await tx.wait(); const event = receipt?.logs.find((log) => { try { - const parsed = encryptedVaultFactory.interface.parseLog(log); + const parsed = transparentVaultFactory.interface.parseLog(log); return parsed?.name === "OrionVaultCreated"; } catch { return false; } }); - const parsedEvent = encryptedVaultFactory.interface.parseLog(event!); + const parsedEvent = transparentVaultFactory.interface.parseLog(event!); const vaultAddress = parsedEvent?.args[0]; - vault = (await ethers.getContractAt("OrionEncryptedVault", vaultAddress)) as unknown as OrionEncryptedVault; + vault = (await ethers.getContractAt("OrionTransparentVault", vaultAddress)) as unknown as OrionTransparentVault; // Give user some underlying assets for testing await underlyingAsset.mint(user.address, ethers.parseUnits("10000", 6)); @@ -156,14 +146,14 @@ beforeEach(async function () { }); describe("Config", function () { - describe("setVaultFactories", function () { - it("Should revert as factories are immutable for the owner as well", async function () { + describe("setVaultFactory", function () { + it("Should revert as factory is immutable for the owner as well", async function () { const maliciousTransparentVault = other.address; - const maliciousEncryptedVault = other.address; - await expect( - orionConfig.connect(owner).setVaultFactories(maliciousTransparentVault, maliciousEncryptedVault), - ).to.be.revertedWithCustomError(orionConfig, "AlreadyRegistered"); + await expect(orionConfig.connect(owner).setVaultFactory(maliciousTransparentVault)).to.be.revertedWithCustomError( + orionConfig, + "AlreadyRegistered", + ); }); }); describe("removeWhitelistedAsset", function () { @@ -265,14 +255,14 @@ describe("Config", function () { }); describe("removeOrionVault", function () { - it("Should successfully remove an encrypted vault", async function () { + it("Should successfully remove a transparent vault", async function () { const vaultAddress = await vault.getAddress(); // Verify vault is initially registered expect(await orionConfig.isOrionVault(vaultAddress)).to.equal(true); // Remove the vault - await expect(orionConfig.removeOrionVault(vaultAddress, 1)).to.not.be.reverted; // 1 = EventsLib.VaultType.Encrypted + await expect(orionConfig.removeOrionVault(vaultAddress, 0)).to.not.be.reverted; // 0 = EventsLib.VaultType.Transparent // Verify vault is no longer registered expect(await orionConfig.isOrionVault(vaultAddress)).to.equal(false); @@ -308,7 +298,7 @@ describe("Config", function () { it("Should emit OrionVaultRemoved event when removing vault", async function () { const vaultAddress = await vault.getAddress(); - await expect(orionConfig.removeOrionVault(vaultAddress, 1)) // 1 = EventsLib.VaultType.Encrypted + await expect(orionConfig.removeOrionVault(vaultAddress, 0)) // 0 = EventsLib.VaultType.Transparent .to.emit(orionConfig, "OrionVaultRemoved") .withArgs(vaultAddress); }); @@ -316,7 +306,7 @@ describe("Config", function () { it("Should revert when called by non-owner", async function () { const vaultAddress = await vault.getAddress(); - await expect(orionConfig.connect(user).removeOrionVault(vaultAddress, 1)) + await expect(orionConfig.connect(user).removeOrionVault(vaultAddress, 0)) .to.be.revertedWithCustomError(orionConfig, "OwnableUnauthorizedAccount") .withArgs(user.address); }); @@ -324,14 +314,14 @@ describe("Config", function () { it("Should revert when trying to remove non-registered vault", async function () { const nonRegisteredVault = other.address; - await expect(orionConfig.removeOrionVault(nonRegisteredVault, 1)).to.be.revertedWithCustomError( + await expect(orionConfig.removeOrionVault(nonRegisteredVault, 0)).to.be.revertedWithCustomError( orionConfig, "UnauthorizedAccess", ); }); it("Should revert when trying to remove vault with zero address", async function () { - await expect(orionConfig.removeOrionVault(ethers.ZeroAddress, 1)).to.be.revertedWithCustomError( + await expect(orionConfig.removeOrionVault(ethers.ZeroAddress, 0)).to.be.revertedWithCustomError( orionConfig, "UnauthorizedAccess", ); @@ -340,16 +330,16 @@ describe("Config", function () { it("Should update vault count after removal", async function () { const vaultAddress = await vault.getAddress(); - // Get initial count of encrypted vaults - const initialVaults = await orionConfig.getAllOrionVaults(1); // 1 = EventsLib.VaultType.Encrypted + // Get initial count of transparent vaults + const initialVaults = await orionConfig.getAllOrionVaults(0); // 0 = EventsLib.VaultType.Transparent const initialCount = initialVaults.length; expect(initialCount).to.be.greaterThan(0); // Remove the vault - await orionConfig.removeOrionVault(vaultAddress, 1); + await orionConfig.removeOrionVault(vaultAddress, 0); - // Get final count of encrypted vaults - const finalVaults = await orionConfig.getAllOrionVaults(1); + // Get final count of transparent vaults + const finalVaults = await orionConfig.getAllOrionVaults(0); const finalCount = finalVaults.length; expect(finalCount).to.equal(initialCount - 1); }); @@ -358,14 +348,14 @@ describe("Config", function () { const vaultAddress = await vault.getAddress(); // Verify vault is in the array initially - const initialVaults = await orionConfig.getAllOrionVaults(1); // 1 = EventsLib.VaultType.Encrypted + const initialVaults = await orionConfig.getAllOrionVaults(0); // 0 = EventsLib.VaultType.Transparent expect(initialVaults).to.include(vaultAddress); // Remove the vault - await orionConfig.removeOrionVault(vaultAddress, 1); + await orionConfig.removeOrionVault(vaultAddress, 0); // Verify vault is no longer in the array - const finalVaults = await orionConfig.getAllOrionVaults(1); + const finalVaults = await orionConfig.getAllOrionVaults(0); expect(finalVaults).to.not.include(vaultAddress); }); @@ -376,7 +366,7 @@ describe("Config", function () { expect(await orionConfig.isOrionVault(vaultAddress)).to.equal(true); // Remove the vault - await orionConfig.removeOrionVault(vaultAddress, 1); + await orionConfig.removeOrionVault(vaultAddress, 0); // Verify vault is no longer registered expect(await orionConfig.isOrionVault(vaultAddress)).to.equal(false); @@ -385,8 +375,8 @@ describe("Config", function () { it("Should handle removal of vault with wrong vault type", async function () { const vaultAddress = await vault.getAddress(); - // Try to remove encrypted vault as transparent vault (wrong type) - await expect(orionConfig.removeOrionVault(vaultAddress, 0)) // 0 = EventsLib.VaultType.Transparent + // Try to remove transparent vault as encrypted vault (wrong type) + await expect(orionConfig.removeOrionVault(vaultAddress, 1)) // 1 = EventsLib.VaultType.Encrypted .to.be.revertedWithCustomError(orionConfig, "UnauthorizedAccess"); // Verify vault is still registered @@ -394,18 +384,20 @@ describe("Config", function () { }); it("Should allow removal of multiple vaults", async function () { - // Create another encrypted vault - const tx = await encryptedVaultFactory.connect(owner).createVault(other.address, "Test Vault 2", "TV2", 0, 0, 0); + // Create another transparent vault + const tx = await transparentVaultFactory + .connect(owner) + .createVault(other.address, "Test Vault 2", "TV2", 0, 0, 0); const receipt = await tx.wait(); const event = receipt?.logs.find((log: Log) => { try { - const parsed = encryptedVaultFactory.interface.parseLog(log); + const parsed = transparentVaultFactory.interface.parseLog(log); return parsed?.name === "OrionVaultCreated"; } catch { return false; } }); - const parsedEvent = encryptedVaultFactory.interface.parseLog(event!); + const parsedEvent = transparentVaultFactory.interface.parseLog(event!); const vault2Address = parsedEvent?.args[0]; // Verify both vaults are registered @@ -413,12 +405,12 @@ describe("Config", function () { expect(await orionConfig.isOrionVault(vault2Address)).to.equal(true); // Remove first vault - await orionConfig.removeOrionVault(await vault.getAddress(), 1); + await orionConfig.removeOrionVault(await vault.getAddress(), 0); // 0 = EventsLib.VaultType.Transparent expect(await orionConfig.isOrionVault(await vault.getAddress())).to.equal(false); expect(await orionConfig.isOrionVault(vault2Address)).to.equal(true); // Remove second vault - await orionConfig.removeOrionVault(vault2Address, 1); + await orionConfig.removeOrionVault(vault2Address, 0); // 0 = EventsLib.VaultType.Transparent expect(await orionConfig.isOrionVault(vault2Address)).to.equal(false); }); }); diff --git a/test/PassiveCuratorStrategy.test.ts b/test/PassiveCuratorStrategy.test.ts index 8dded19e..f88babea 100644 --- a/test/PassiveCuratorStrategy.test.ts +++ b/test/PassiveCuratorStrategy.test.ts @@ -11,7 +11,6 @@ import { InternalStatesOrchestrator, LiquidityOrchestrator, TransparentVaultFactory, - EncryptedVaultFactory, OrionTransparentVault, PriceAdapterRegistry, OrionAssetERC4626PriceAdapter, @@ -20,7 +19,6 @@ import { describe("Passive Curator Strategy", function () { let transparentVaultFactory: TransparentVaultFactory; - let encryptedVaultFactory: EncryptedVaultFactory; let orionConfig: OrionConfig; let underlyingAsset: MockUnderlyingAsset; let mockAsset1: MockERC4626Asset; @@ -134,11 +132,6 @@ describe("Passive Curator Strategy", function () { await transparentVaultFactoryDeployed.waitForDeployment(); transparentVaultFactory = transparentVaultFactoryDeployed as unknown as TransparentVaultFactory; - const EncryptedVaultFactoryFactory = await ethers.getContractFactory("EncryptedVaultFactory"); - const encryptedVaultFactoryDeployed = await EncryptedVaultFactoryFactory.deploy(await orionConfig.getAddress()); - await encryptedVaultFactoryDeployed.waitForDeployment(); - encryptedVaultFactory = encryptedVaultFactoryDeployed as unknown as EncryptedVaultFactory; - const LiquidityOrchestratorFactory = await ethers.getContractFactory("LiquidityOrchestrator"); const liquidityOrchestratorDeployed = await LiquidityOrchestratorFactory.deploy( owner.address, @@ -161,10 +154,7 @@ describe("Passive Curator Strategy", function () { internalStatesOrchestrator = internalStatesOrchestratorDeployed as unknown as InternalStatesOrchestrator; await orionConfig.setInternalStatesOrchestrator(await internalStatesOrchestrator.getAddress()); - await orionConfig.setVaultFactories( - await transparentVaultFactory.getAddress(), - await encryptedVaultFactory.getAddress(), - ); + await orionConfig.setVaultFactory(await transparentVaultFactory.getAddress()); await internalStatesOrchestrator.connect(owner).updateProtocolFees(10, 1000); @@ -377,31 +367,22 @@ describe("Passive Curator Strategy", function () { await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // PreprocessingTransparentVaults - // Continue with preprocessing - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // PreprocessingEncryptedVaults - - // Skip encrypted vaults (no encrypted vaults in this test) + // Continue with buffering [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // Buffering + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering // Continue with postprocessing [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(5); // PostprocessingTransparentVaults + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults // This is where the vault's getIntent() is called, which should call the strategy [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(6); // PostprocessingEncryptedVaults + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders // Complete the cycle - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); - await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); - expect(await internalStatesOrchestrator.currentPhase()).to.equal(7); // BuildingOrders - [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Back to Idle diff --git a/test/TransparentVault.test.ts b/test/TransparentVault.test.ts index 7564c53c..4c3e750b 100644 --- a/test/TransparentVault.test.ts +++ b/test/TransparentVault.test.ts @@ -109,7 +109,7 @@ beforeEach(async function () { await orionConfig.setInternalStatesOrchestrator(await internalStatesOrchestrator.getAddress()); await orionConfig.setLiquidityOrchestrator(await liquidityOrchestrator.getAddress()); - await orionConfig.setVaultFactories(await transparentVaultFactory.getAddress(), other.address); + await orionConfig.setVaultFactory(await transparentVaultFactory.getAddress()); await orionConfig.setPriceAdapterRegistry(await priceAdapterRegistry.getAddress()); await orionConfig.setProtocolRiskFreeRate(0.0423 * 10_000);