diff --git a/contracts/Makefile b/contracts/Makefile index 42518728e..03cd57175 100644 --- a/contracts/Makefile +++ b/contracts/Makefile @@ -27,7 +27,8 @@ all: install-deps build bindings allocs ## Build contracts, generate bindings an CORE_CONTRACTS := OmniPortal FeeOracleV1 Create3 TransparentUpgradeableProxy \ Staking Slashing OmniBridgeL1 OmniBridgeNative Omni WOmni \ - PortalRegistry AllocPredeploys PingPong ProxyAdmin Admin \ + PortalRegistry AllocPredeploys PingPong ProxyAdmin \ + PortalAdmin StakingAdmin \ OmniGasPump OmniGasStation AVS_CONTRACTS := OmniAVS DelegationManager StrategyManager StrategyBase AVSDirectory \ diff --git a/contracts/allocs/devnet.json b/contracts/allocs/devnet.json index de258654c..029832c55 100644 --- a/contracts/allocs/devnet.json +++ b/contracts/allocs/devnet.json @@ -12612,7 +12612,7 @@ }, "0x333333fffffffffffffffffffffffffffffffffe": { "balance": "0x0", - "code": "0x6080604052600436106100dd5760003560e01c806384768b7a1161007f578063c6a2aac811610059578063c6a2aac814610252578063cf8e629a14610267578063d146fd1b1461027c578063f2fde38b1461029657600080fd5b806384768b7a146101b85780638da5cb5b146101f8578063a5a470ad1461023f57600080fd5b8063400ada75116100bb578063400ada751461015457806359bcddde146101745780635c19a95c14610190578063715018a6146101a357600080fd5b8063117407e3146100e257806311bcd830146101045780633f0b1edf14610134575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046108b2565b6102b6565b005b34801561011057600080fd5b5061012168056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561014057600080fd5b5061010261014f3660046108b2565b61032a565b34801561016057600080fd5b5061010261016f366004610943565b61039a565b34801561018057600080fd5b50610121670de0b6b3a764000081565b61010261019e36600461097f565b6104b9565b3480156101af57600080fd5b506101026105b1565b3480156101c457600080fd5b506101e86101d336600461097f565b60016020526000908152604090205460ff1681565b604051901515815260200161012b565b34801561020457600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b03909116815260200161012b565b61010261024d3660046109a1565b6105c5565b34801561025e57600080fd5b5061010261071b565b34801561027357600080fd5b50610102610732565b34801561028857600080fd5b506000546101e89060ff1681565b3480156102a257600080fd5b506101026102b136600461097f565b610746565b6102be610784565b60005b818110156103255760018060008585858181106102e0576102e0610a01565b90506020020160208101906102f5919061097f565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016102c1565b505050565b610332610784565b60005b818110156103255760006001600085858581811061035557610355610a01565b905060200201602081019061036a919061097f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610335565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156103e05750825b905060008267ffffffffffffffff1660011480156103fd5750303b155b90508115801561040b575080155b156104295760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045357845460ff60401b1916600160401b1785555b61045c876107df565b6000805460ff191687151517905583156104b057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b670de0b6b3a76400003410156105165760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b0382161461056e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e000000604482015260640161050d565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6105b9610784565b6105c360006107f0565b565b60005460ff1615806105e657503360009081526001602052604090205460ff165b6106295760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b604482015260640161050d565b602181146106795760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e6774680000604482015260640161050d565b68056bc75e2d631000003410156106d25760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f736974000000604482015260640161050d565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161070f93929190610a17565b60405180910390a25050565b610723610784565b6000805460ff19166001179055565b61073a610784565b6000805460ff19169055565b61074e610784565b6001600160a01b03811661077857604051631e4fbdf760e01b81526000600482015260240161050d565b610781816107f0565b50565b336107b67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c35760405163118cdaa760e01b815233600482015260240161050d565b6107e7610861565b610781816108aa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c357604051631afcd79f60e31b815260040160405180910390fd5b61074e610861565b600080602083850312156108c557600080fd5b823567ffffffffffffffff808211156108dd57600080fd5b818501915085601f8301126108f157600080fd5b81358181111561090057600080fd5b8660208260051b850101111561091557600080fd5b60209290920196919550909350505050565b80356001600160a01b038116811461093e57600080fd5b919050565b6000806040838503121561095657600080fd5b61095f83610927565b91506020830135801515811461097457600080fd5b809150509250929050565b60006020828403121561099157600080fd5b61099a82610927565b9392505050565b600080602083850312156109b457600080fd5b823567ffffffffffffffff808211156109cc57600080fd5b818501915085601f8301126109e057600080fd5b8135818111156109ef57600080fd5b86602082850101111561091557600080fd5b634e487b7160e01b600052603260045260246000fd5b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212201ad1d9aad3c7d43b13774db3308d59675ed3c15f01a079646644a291ecce45c964736f6c63430008180033", + "code": "0x6080604052600436106100c25760003560e01c8063715018a61161007f578063a5a470ad11610059578063a5a470ad14610226578063d146fd1b14610239578063d7644ba214610253578063f2fde38b1461027357600080fd5b8063715018a61461018a57806384768b7a1461019f5780638da5cb5b146101df57600080fd5b806311bcd830146100c75780632b47da52146100f7578063400ada7514610119578063552b818b1461013b57806359bcddde1461015b5780635c19a95c14610177575b600080fd5b3480156100d357600080fd5b506100e468056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561010357600080fd5b5061010c610293565b6040516100ee9190610a3d565b34801561012557600080fd5b50610139610134366004610ab6565b6102f5565b005b34801561014757600080fd5b50610139610156366004610ae9565b610414565b34801561016757600080fd5b506100e4670de0b6b3a764000081565b610139610185366004610b5e565b610531565b34801561019657600080fd5b50610139610629565b3480156101ab57600080fd5b506101cf6101ba366004610b5e565b60016020526000908152604090205460ff1681565b60405190151581526020016100ee565b3480156101eb57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016100ee565b610139610234366004610b80565b61063d565b34801561024557600080fd5b506000546101cf9060ff1681565b34801561025f57600080fd5b5061013961026e366004610be0565b610793565b34801561027f57600080fd5b5061013961028e366004610b5e565b61085c565b606060028054806020026020016040519081016040528092919081815260200182805480156102eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102cd575b5050505050905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff1660008115801561033b5750825b905060008267ffffffffffffffff1660011480156103585750303b155b905081158015610366575080155b156103845760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103ae57845460ff60401b1916600160401b1785555b6103b787610897565b6000805460ff1916871515179055831561040b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61041c6108a8565b60005b60025481101561047e576000600160006002848154811061044257610442610bfb565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905560010161041f565b5061048b600283836109c5565b5060005b818110156104f35760018060008585858181106104ae576104ae610bfb565b90506020020160208101906104c39190610b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161048f565b507f27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf8282604051610525929190610c11565b60405180910390a15050565b670de0b6b3a764000034101561058e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b038216146105e65760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e0000006044820152606401610585565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6106316108a8565b61063b6000610903565b565b60005460ff16158061065e57503360009081526001602052604090205460ff165b6106a15760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b6044820152606401610585565b602181146106f15760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e67746800006044820152606401610585565b68056bc75e2d6310000034101561074a5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f7369740000006044820152606401610585565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161078793929190610c5d565b60405180910390a25050565b61079b6108a8565b60005481151560ff9091161515036107ec5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce88185b1c9958591e481cd95d60621b6044820152606401610585565b6000805460ff1916821580159190911790915561082f576040517f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec390600090a150565b6040517f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0790600090a15b50565b6108646108a8565b6001600160a01b03811661088e57604051631e4fbdf760e01b815260006004820152602401610585565b61085981610903565b61089f610974565b610859816109bd565b336108da7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461063b5760405163118cdaa760e01b8152336004820152602401610585565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661063b57604051631afcd79f60e31b815260040160405180910390fd5b610864610974565b828054828255906000526020600020908101928215610a18579160200282015b82811115610a185781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906109e5565b50610a24929150610a28565b5090565b5b80821115610a245760008155600101610a29565b6020808252825182820181905260009190848201906040850190845b81811015610a7e5783516001600160a01b031683529284019291840191600101610a59565b50909695505050505050565b80356001600160a01b0381168114610aa157600080fd5b919050565b80358015158114610aa157600080fd5b60008060408385031215610ac957600080fd5b610ad283610a8a565b9150610ae060208401610aa6565b90509250929050565b60008060208385031215610afc57600080fd5b823567ffffffffffffffff80821115610b1457600080fd5b818501915085601f830112610b2857600080fd5b813581811115610b3757600080fd5b8660208260051b8501011115610b4c57600080fd5b60209290920196919550909350505050565b600060208284031215610b7057600080fd5b610b7982610a8a565b9392505050565b60008060208385031215610b9357600080fd5b823567ffffffffffffffff80821115610bab57600080fd5b818501915085601f830112610bbf57600080fd5b813581811115610bce57600080fd5b866020828501011115610b4c57600080fd5b600060208284031215610bf257600080fd5b610b7982610aa6565b634e487b7160e01b600052603260045260246000fd5b60208082528181018390526000908460408401835b86811015610c52576001600160a01b03610c3f84610a8a565b1682529183019190830190600101610c26565b509695505050505050565b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212209626a613dbfb7e12830784942389803c43dd0de89220444072e10a535d8573cc64736f6c63430008180033", "nonce": "0x0", "storage": { "0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00": "0x000000000000000000000000000000000000000000000000ffffffffffffffff" diff --git a/contracts/allocs/mainnet.json b/contracts/allocs/mainnet.json index bc6852f88..463553df2 100644 --- a/contracts/allocs/mainnet.json +++ b/contracts/allocs/mainnet.json @@ -12612,7 +12612,7 @@ }, "0x333333fffffffffffffffffffffffffffffffffe": { "balance": "0x0", - "code": "0x6080604052600436106100dd5760003560e01c806384768b7a1161007f578063c6a2aac811610059578063c6a2aac814610252578063cf8e629a14610267578063d146fd1b1461027c578063f2fde38b1461029657600080fd5b806384768b7a146101b85780638da5cb5b146101f8578063a5a470ad1461023f57600080fd5b8063400ada75116100bb578063400ada751461015457806359bcddde146101745780635c19a95c14610190578063715018a6146101a357600080fd5b8063117407e3146100e257806311bcd830146101045780633f0b1edf14610134575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046108b2565b6102b6565b005b34801561011057600080fd5b5061012168056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561014057600080fd5b5061010261014f3660046108b2565b61032a565b34801561016057600080fd5b5061010261016f366004610943565b61039a565b34801561018057600080fd5b50610121670de0b6b3a764000081565b61010261019e36600461097f565b6104b9565b3480156101af57600080fd5b506101026105b1565b3480156101c457600080fd5b506101e86101d336600461097f565b60016020526000908152604090205460ff1681565b604051901515815260200161012b565b34801561020457600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b03909116815260200161012b565b61010261024d3660046109a1565b6105c5565b34801561025e57600080fd5b5061010261071b565b34801561027357600080fd5b50610102610732565b34801561028857600080fd5b506000546101e89060ff1681565b3480156102a257600080fd5b506101026102b136600461097f565b610746565b6102be610784565b60005b818110156103255760018060008585858181106102e0576102e0610a01565b90506020020160208101906102f5919061097f565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016102c1565b505050565b610332610784565b60005b818110156103255760006001600085858581811061035557610355610a01565b905060200201602081019061036a919061097f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610335565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156103e05750825b905060008267ffffffffffffffff1660011480156103fd5750303b155b90508115801561040b575080155b156104295760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045357845460ff60401b1916600160401b1785555b61045c876107df565b6000805460ff191687151517905583156104b057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b670de0b6b3a76400003410156105165760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b0382161461056e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e000000604482015260640161050d565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6105b9610784565b6105c360006107f0565b565b60005460ff1615806105e657503360009081526001602052604090205460ff165b6106295760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b604482015260640161050d565b602181146106795760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e6774680000604482015260640161050d565b68056bc75e2d631000003410156106d25760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f736974000000604482015260640161050d565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161070f93929190610a17565b60405180910390a25050565b610723610784565b6000805460ff19166001179055565b61073a610784565b6000805460ff19169055565b61074e610784565b6001600160a01b03811661077857604051631e4fbdf760e01b81526000600482015260240161050d565b610781816107f0565b50565b336107b67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c35760405163118cdaa760e01b815233600482015260240161050d565b6107e7610861565b610781816108aa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c357604051631afcd79f60e31b815260040160405180910390fd5b61074e610861565b600080602083850312156108c557600080fd5b823567ffffffffffffffff808211156108dd57600080fd5b818501915085601f8301126108f157600080fd5b81358181111561090057600080fd5b8660208260051b850101111561091557600080fd5b60209290920196919550909350505050565b80356001600160a01b038116811461093e57600080fd5b919050565b6000806040838503121561095657600080fd5b61095f83610927565b91506020830135801515811461097457600080fd5b809150509250929050565b60006020828403121561099157600080fd5b61099a82610927565b9392505050565b600080602083850312156109b457600080fd5b823567ffffffffffffffff808211156109cc57600080fd5b818501915085601f8301126109e057600080fd5b8135818111156109ef57600080fd5b86602082850101111561091557600080fd5b634e487b7160e01b600052603260045260246000fd5b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212201ad1d9aad3c7d43b13774db3308d59675ed3c15f01a079646644a291ecce45c964736f6c63430008180033", + "code": "0x6080604052600436106100c25760003560e01c8063715018a61161007f578063a5a470ad11610059578063a5a470ad14610226578063d146fd1b14610239578063d7644ba214610253578063f2fde38b1461027357600080fd5b8063715018a61461018a57806384768b7a1461019f5780638da5cb5b146101df57600080fd5b806311bcd830146100c75780632b47da52146100f7578063400ada7514610119578063552b818b1461013b57806359bcddde1461015b5780635c19a95c14610177575b600080fd5b3480156100d357600080fd5b506100e468056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561010357600080fd5b5061010c610293565b6040516100ee9190610a3d565b34801561012557600080fd5b50610139610134366004610ab6565b6102f5565b005b34801561014757600080fd5b50610139610156366004610ae9565b610414565b34801561016757600080fd5b506100e4670de0b6b3a764000081565b610139610185366004610b5e565b610531565b34801561019657600080fd5b50610139610629565b3480156101ab57600080fd5b506101cf6101ba366004610b5e565b60016020526000908152604090205460ff1681565b60405190151581526020016100ee565b3480156101eb57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016100ee565b610139610234366004610b80565b61063d565b34801561024557600080fd5b506000546101cf9060ff1681565b34801561025f57600080fd5b5061013961026e366004610be0565b610793565b34801561027f57600080fd5b5061013961028e366004610b5e565b61085c565b606060028054806020026020016040519081016040528092919081815260200182805480156102eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102cd575b5050505050905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff1660008115801561033b5750825b905060008267ffffffffffffffff1660011480156103585750303b155b905081158015610366575080155b156103845760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103ae57845460ff60401b1916600160401b1785555b6103b787610897565b6000805460ff1916871515179055831561040b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61041c6108a8565b60005b60025481101561047e576000600160006002848154811061044257610442610bfb565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905560010161041f565b5061048b600283836109c5565b5060005b818110156104f35760018060008585858181106104ae576104ae610bfb565b90506020020160208101906104c39190610b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161048f565b507f27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf8282604051610525929190610c11565b60405180910390a15050565b670de0b6b3a764000034101561058e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b038216146105e65760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e0000006044820152606401610585565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6106316108a8565b61063b6000610903565b565b60005460ff16158061065e57503360009081526001602052604090205460ff165b6106a15760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b6044820152606401610585565b602181146106f15760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e67746800006044820152606401610585565b68056bc75e2d6310000034101561074a5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f7369740000006044820152606401610585565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161078793929190610c5d565b60405180910390a25050565b61079b6108a8565b60005481151560ff9091161515036107ec5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce88185b1c9958591e481cd95d60621b6044820152606401610585565b6000805460ff1916821580159190911790915561082f576040517f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec390600090a150565b6040517f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0790600090a15b50565b6108646108a8565b6001600160a01b03811661088e57604051631e4fbdf760e01b815260006004820152602401610585565b61085981610903565b61089f610974565b610859816109bd565b336108da7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461063b5760405163118cdaa760e01b8152336004820152602401610585565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661063b57604051631afcd79f60e31b815260040160405180910390fd5b610864610974565b828054828255906000526020600020908101928215610a18579160200282015b82811115610a185781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906109e5565b50610a24929150610a28565b5090565b5b80821115610a245760008155600101610a29565b6020808252825182820181905260009190848201906040850190845b81811015610a7e5783516001600160a01b031683529284019291840191600101610a59565b50909695505050505050565b80356001600160a01b0381168114610aa157600080fd5b919050565b80358015158114610aa157600080fd5b60008060408385031215610ac957600080fd5b610ad283610a8a565b9150610ae060208401610aa6565b90509250929050565b60008060208385031215610afc57600080fd5b823567ffffffffffffffff80821115610b1457600080fd5b818501915085601f830112610b2857600080fd5b813581811115610b3757600080fd5b8660208260051b8501011115610b4c57600080fd5b60209290920196919550909350505050565b600060208284031215610b7057600080fd5b610b7982610a8a565b9392505050565b60008060208385031215610b9357600080fd5b823567ffffffffffffffff80821115610bab57600080fd5b818501915085601f830112610bbf57600080fd5b813581811115610bce57600080fd5b866020828501011115610b4c57600080fd5b600060208284031215610bf257600080fd5b610b7982610aa6565b634e487b7160e01b600052603260045260246000fd5b60208082528181018390526000908460408401835b86811015610c52576001600160a01b03610c3f84610a8a565b1682529183019190830190600101610c26565b509695505050505050565b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212209626a613dbfb7e12830784942389803c43dd0de89220444072e10a535d8573cc64736f6c63430008180033", "nonce": "0x0", "storage": { "0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00": "0x000000000000000000000000000000000000000000000000ffffffffffffffff" diff --git a/contracts/allocs/omega.json b/contracts/allocs/omega.json index 0bc8d52b3..b338186b3 100644 --- a/contracts/allocs/omega.json +++ b/contracts/allocs/omega.json @@ -12612,7 +12612,7 @@ }, "0x333333fffffffffffffffffffffffffffffffffe": { "balance": "0x0", - "code": "0x6080604052600436106100dd5760003560e01c806384768b7a1161007f578063c6a2aac811610059578063c6a2aac814610252578063cf8e629a14610267578063d146fd1b1461027c578063f2fde38b1461029657600080fd5b806384768b7a146101b85780638da5cb5b146101f8578063a5a470ad1461023f57600080fd5b8063400ada75116100bb578063400ada751461015457806359bcddde146101745780635c19a95c14610190578063715018a6146101a357600080fd5b8063117407e3146100e257806311bcd830146101045780633f0b1edf14610134575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046108b2565b6102b6565b005b34801561011057600080fd5b5061012168056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561014057600080fd5b5061010261014f3660046108b2565b61032a565b34801561016057600080fd5b5061010261016f366004610943565b61039a565b34801561018057600080fd5b50610121670de0b6b3a764000081565b61010261019e36600461097f565b6104b9565b3480156101af57600080fd5b506101026105b1565b3480156101c457600080fd5b506101e86101d336600461097f565b60016020526000908152604090205460ff1681565b604051901515815260200161012b565b34801561020457600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b03909116815260200161012b565b61010261024d3660046109a1565b6105c5565b34801561025e57600080fd5b5061010261071b565b34801561027357600080fd5b50610102610732565b34801561028857600080fd5b506000546101e89060ff1681565b3480156102a257600080fd5b506101026102b136600461097f565b610746565b6102be610784565b60005b818110156103255760018060008585858181106102e0576102e0610a01565b90506020020160208101906102f5919061097f565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016102c1565b505050565b610332610784565b60005b818110156103255760006001600085858581811061035557610355610a01565b905060200201602081019061036a919061097f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610335565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156103e05750825b905060008267ffffffffffffffff1660011480156103fd5750303b155b90508115801561040b575080155b156104295760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045357845460ff60401b1916600160401b1785555b61045c876107df565b6000805460ff191687151517905583156104b057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b670de0b6b3a76400003410156105165760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b0382161461056e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e000000604482015260640161050d565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6105b9610784565b6105c360006107f0565b565b60005460ff1615806105e657503360009081526001602052604090205460ff165b6106295760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b604482015260640161050d565b602181146106795760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e6774680000604482015260640161050d565b68056bc75e2d631000003410156106d25760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f736974000000604482015260640161050d565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161070f93929190610a17565b60405180910390a25050565b610723610784565b6000805460ff19166001179055565b61073a610784565b6000805460ff19169055565b61074e610784565b6001600160a01b03811661077857604051631e4fbdf760e01b81526000600482015260240161050d565b610781816107f0565b50565b336107b67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c35760405163118cdaa760e01b815233600482015260240161050d565b6107e7610861565b610781816108aa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c357604051631afcd79f60e31b815260040160405180910390fd5b61074e610861565b600080602083850312156108c557600080fd5b823567ffffffffffffffff808211156108dd57600080fd5b818501915085601f8301126108f157600080fd5b81358181111561090057600080fd5b8660208260051b850101111561091557600080fd5b60209290920196919550909350505050565b80356001600160a01b038116811461093e57600080fd5b919050565b6000806040838503121561095657600080fd5b61095f83610927565b91506020830135801515811461097457600080fd5b809150509250929050565b60006020828403121561099157600080fd5b61099a82610927565b9392505050565b600080602083850312156109b457600080fd5b823567ffffffffffffffff808211156109cc57600080fd5b818501915085601f8301126109e057600080fd5b8135818111156109ef57600080fd5b86602082850101111561091557600080fd5b634e487b7160e01b600052603260045260246000fd5b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212201ad1d9aad3c7d43b13774db3308d59675ed3c15f01a079646644a291ecce45c964736f6c63430008180033", + "code": "0x6080604052600436106100c25760003560e01c8063715018a61161007f578063a5a470ad11610059578063a5a470ad14610226578063d146fd1b14610239578063d7644ba214610253578063f2fde38b1461027357600080fd5b8063715018a61461018a57806384768b7a1461019f5780638da5cb5b146101df57600080fd5b806311bcd830146100c75780632b47da52146100f7578063400ada7514610119578063552b818b1461013b57806359bcddde1461015b5780635c19a95c14610177575b600080fd5b3480156100d357600080fd5b506100e468056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561010357600080fd5b5061010c610293565b6040516100ee9190610a3d565b34801561012557600080fd5b50610139610134366004610ab6565b6102f5565b005b34801561014757600080fd5b50610139610156366004610ae9565b610414565b34801561016757600080fd5b506100e4670de0b6b3a764000081565b610139610185366004610b5e565b610531565b34801561019657600080fd5b50610139610629565b3480156101ab57600080fd5b506101cf6101ba366004610b5e565b60016020526000908152604090205460ff1681565b60405190151581526020016100ee565b3480156101eb57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016100ee565b610139610234366004610b80565b61063d565b34801561024557600080fd5b506000546101cf9060ff1681565b34801561025f57600080fd5b5061013961026e366004610be0565b610793565b34801561027f57600080fd5b5061013961028e366004610b5e565b61085c565b606060028054806020026020016040519081016040528092919081815260200182805480156102eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102cd575b5050505050905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff1660008115801561033b5750825b905060008267ffffffffffffffff1660011480156103585750303b155b905081158015610366575080155b156103845760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103ae57845460ff60401b1916600160401b1785555b6103b787610897565b6000805460ff1916871515179055831561040b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61041c6108a8565b60005b60025481101561047e576000600160006002848154811061044257610442610bfb565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905560010161041f565b5061048b600283836109c5565b5060005b818110156104f35760018060008585858181106104ae576104ae610bfb565b90506020020160208101906104c39190610b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161048f565b507f27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf8282604051610525929190610c11565b60405180910390a15050565b670de0b6b3a764000034101561058e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b038216146105e65760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e0000006044820152606401610585565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6106316108a8565b61063b6000610903565b565b60005460ff16158061065e57503360009081526001602052604090205460ff165b6106a15760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b6044820152606401610585565b602181146106f15760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e67746800006044820152606401610585565b68056bc75e2d6310000034101561074a5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f7369740000006044820152606401610585565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161078793929190610c5d565b60405180910390a25050565b61079b6108a8565b60005481151560ff9091161515036107ec5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce88185b1c9958591e481cd95d60621b6044820152606401610585565b6000805460ff1916821580159190911790915561082f576040517f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec390600090a150565b6040517f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0790600090a15b50565b6108646108a8565b6001600160a01b03811661088e57604051631e4fbdf760e01b815260006004820152602401610585565b61085981610903565b61089f610974565b610859816109bd565b336108da7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461063b5760405163118cdaa760e01b8152336004820152602401610585565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661063b57604051631afcd79f60e31b815260040160405180910390fd5b610864610974565b828054828255906000526020600020908101928215610a18579160200282015b82811115610a185781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906109e5565b50610a24929150610a28565b5090565b5b80821115610a245760008155600101610a29565b6020808252825182820181905260009190848201906040850190845b81811015610a7e5783516001600160a01b031683529284019291840191600101610a59565b50909695505050505050565b80356001600160a01b0381168114610aa157600080fd5b919050565b80358015158114610aa157600080fd5b60008060408385031215610ac957600080fd5b610ad283610a8a565b9150610ae060208401610aa6565b90509250929050565b60008060208385031215610afc57600080fd5b823567ffffffffffffffff80821115610b1457600080fd5b818501915085601f830112610b2857600080fd5b813581811115610b3757600080fd5b8660208260051b8501011115610b4c57600080fd5b60209290920196919550909350505050565b600060208284031215610b7057600080fd5b610b7982610a8a565b9392505050565b60008060208385031215610b9357600080fd5b823567ffffffffffffffff80821115610bab57600080fd5b818501915085601f830112610bbf57600080fd5b813581811115610bce57600080fd5b866020828501011115610b4c57600080fd5b600060208284031215610bf257600080fd5b610b7982610aa6565b634e487b7160e01b600052603260045260246000fd5b60208082528181018390526000908460408401835b86811015610c52576001600160a01b03610c3f84610a8a565b1682529183019190830190600101610c26565b509695505050505050565b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212209626a613dbfb7e12830784942389803c43dd0de89220444072e10a535d8573cc64736f6c63430008180033", "nonce": "0x0", "storage": { "0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00": "0x000000000000000000000000000000000000000000000000ffffffffffffffff" diff --git a/contracts/allocs/staging.json b/contracts/allocs/staging.json index 2d882badc..47bb86a5c 100644 --- a/contracts/allocs/staging.json +++ b/contracts/allocs/staging.json @@ -12612,7 +12612,7 @@ }, "0x333333fffffffffffffffffffffffffffffffffe": { "balance": "0x0", - "code": "0x6080604052600436106100dd5760003560e01c806384768b7a1161007f578063c6a2aac811610059578063c6a2aac814610252578063cf8e629a14610267578063d146fd1b1461027c578063f2fde38b1461029657600080fd5b806384768b7a146101b85780638da5cb5b146101f8578063a5a470ad1461023f57600080fd5b8063400ada75116100bb578063400ada751461015457806359bcddde146101745780635c19a95c14610190578063715018a6146101a357600080fd5b8063117407e3146100e257806311bcd830146101045780633f0b1edf14610134575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046108b2565b6102b6565b005b34801561011057600080fd5b5061012168056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561014057600080fd5b5061010261014f3660046108b2565b61032a565b34801561016057600080fd5b5061010261016f366004610943565b61039a565b34801561018057600080fd5b50610121670de0b6b3a764000081565b61010261019e36600461097f565b6104b9565b3480156101af57600080fd5b506101026105b1565b3480156101c457600080fd5b506101e86101d336600461097f565b60016020526000908152604090205460ff1681565b604051901515815260200161012b565b34801561020457600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b03909116815260200161012b565b61010261024d3660046109a1565b6105c5565b34801561025e57600080fd5b5061010261071b565b34801561027357600080fd5b50610102610732565b34801561028857600080fd5b506000546101e89060ff1681565b3480156102a257600080fd5b506101026102b136600461097f565b610746565b6102be610784565b60005b818110156103255760018060008585858181106102e0576102e0610a01565b90506020020160208101906102f5919061097f565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016102c1565b505050565b610332610784565b60005b818110156103255760006001600085858581811061035557610355610a01565b905060200201602081019061036a919061097f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610335565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156103e05750825b905060008267ffffffffffffffff1660011480156103fd5750303b155b90508115801561040b575080155b156104295760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045357845460ff60401b1916600160401b1785555b61045c876107df565b6000805460ff191687151517905583156104b057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b670de0b6b3a76400003410156105165760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b0382161461056e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e000000604482015260640161050d565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6105b9610784565b6105c360006107f0565b565b60005460ff1615806105e657503360009081526001602052604090205460ff165b6106295760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b604482015260640161050d565b602181146106795760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e6774680000604482015260640161050d565b68056bc75e2d631000003410156106d25760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f736974000000604482015260640161050d565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161070f93929190610a17565b60405180910390a25050565b610723610784565b6000805460ff19166001179055565b61073a610784565b6000805460ff19169055565b61074e610784565b6001600160a01b03811661077857604051631e4fbdf760e01b81526000600482015260240161050d565b610781816107f0565b50565b336107b67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c35760405163118cdaa760e01b815233600482015260240161050d565b6107e7610861565b610781816108aa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c357604051631afcd79f60e31b815260040160405180910390fd5b61074e610861565b600080602083850312156108c557600080fd5b823567ffffffffffffffff808211156108dd57600080fd5b818501915085601f8301126108f157600080fd5b81358181111561090057600080fd5b8660208260051b850101111561091557600080fd5b60209290920196919550909350505050565b80356001600160a01b038116811461093e57600080fd5b919050565b6000806040838503121561095657600080fd5b61095f83610927565b91506020830135801515811461097457600080fd5b809150509250929050565b60006020828403121561099157600080fd5b61099a82610927565b9392505050565b600080602083850312156109b457600080fd5b823567ffffffffffffffff808211156109cc57600080fd5b818501915085601f8301126109e057600080fd5b8135818111156109ef57600080fd5b86602082850101111561091557600080fd5b634e487b7160e01b600052603260045260246000fd5b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212201ad1d9aad3c7d43b13774db3308d59675ed3c15f01a079646644a291ecce45c964736f6c63430008180033", + "code": "0x6080604052600436106100c25760003560e01c8063715018a61161007f578063a5a470ad11610059578063a5a470ad14610226578063d146fd1b14610239578063d7644ba214610253578063f2fde38b1461027357600080fd5b8063715018a61461018a57806384768b7a1461019f5780638da5cb5b146101df57600080fd5b806311bcd830146100c75780632b47da52146100f7578063400ada7514610119578063552b818b1461013b57806359bcddde1461015b5780635c19a95c14610177575b600080fd5b3480156100d357600080fd5b506100e468056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561010357600080fd5b5061010c610293565b6040516100ee9190610a3d565b34801561012557600080fd5b50610139610134366004610ab6565b6102f5565b005b34801561014757600080fd5b50610139610156366004610ae9565b610414565b34801561016757600080fd5b506100e4670de0b6b3a764000081565b610139610185366004610b5e565b610531565b34801561019657600080fd5b50610139610629565b3480156101ab57600080fd5b506101cf6101ba366004610b5e565b60016020526000908152604090205460ff1681565b60405190151581526020016100ee565b3480156101eb57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016100ee565b610139610234366004610b80565b61063d565b34801561024557600080fd5b506000546101cf9060ff1681565b34801561025f57600080fd5b5061013961026e366004610be0565b610793565b34801561027f57600080fd5b5061013961028e366004610b5e565b61085c565b606060028054806020026020016040519081016040528092919081815260200182805480156102eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102cd575b5050505050905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff1660008115801561033b5750825b905060008267ffffffffffffffff1660011480156103585750303b155b905081158015610366575080155b156103845760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103ae57845460ff60401b1916600160401b1785555b6103b787610897565b6000805460ff1916871515179055831561040b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61041c6108a8565b60005b60025481101561047e576000600160006002848154811061044257610442610bfb565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905560010161041f565b5061048b600283836109c5565b5060005b818110156104f35760018060008585858181106104ae576104ae610bfb565b90506020020160208101906104c39190610b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161048f565b507f27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf8282604051610525929190610c11565b60405180910390a15050565b670de0b6b3a764000034101561058e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b038216146105e65760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e0000006044820152606401610585565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6106316108a8565b61063b6000610903565b565b60005460ff16158061065e57503360009081526001602052604090205460ff165b6106a15760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b6044820152606401610585565b602181146106f15760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e67746800006044820152606401610585565b68056bc75e2d6310000034101561074a5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f7369740000006044820152606401610585565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161078793929190610c5d565b60405180910390a25050565b61079b6108a8565b60005481151560ff9091161515036107ec5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce88185b1c9958591e481cd95d60621b6044820152606401610585565b6000805460ff1916821580159190911790915561082f576040517f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec390600090a150565b6040517f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0790600090a15b50565b6108646108a8565b6001600160a01b03811661088e57604051631e4fbdf760e01b815260006004820152602401610585565b61085981610903565b61089f610974565b610859816109bd565b336108da7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461063b5760405163118cdaa760e01b8152336004820152602401610585565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661063b57604051631afcd79f60e31b815260040160405180910390fd5b610864610974565b828054828255906000526020600020908101928215610a18579160200282015b82811115610a185781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906109e5565b50610a24929150610a28565b5090565b5b80821115610a245760008155600101610a29565b6020808252825182820181905260009190848201906040850190845b81811015610a7e5783516001600160a01b031683529284019291840191600101610a59565b50909695505050505050565b80356001600160a01b0381168114610aa157600080fd5b919050565b80358015158114610aa157600080fd5b60008060408385031215610ac957600080fd5b610ad283610a8a565b9150610ae060208401610aa6565b90509250929050565b60008060208385031215610afc57600080fd5b823567ffffffffffffffff80821115610b1457600080fd5b818501915085601f830112610b2857600080fd5b813581811115610b3757600080fd5b8660208260051b8501011115610b4c57600080fd5b60209290920196919550909350505050565b600060208284031215610b7057600080fd5b610b7982610a8a565b9392505050565b60008060208385031215610b9357600080fd5b823567ffffffffffffffff80821115610bab57600080fd5b818501915085601f830112610bbf57600080fd5b813581811115610bce57600080fd5b866020828501011115610b4c57600080fd5b600060208284031215610bf257600080fd5b610b7982610aa6565b634e487b7160e01b600052603260045260246000fd5b60208082528181018390526000908460408401835b86811015610c52576001600160a01b03610c3f84610a8a565b1682529183019190830190600101610c26565b509695505050505050565b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212209626a613dbfb7e12830784942389803c43dd0de89220444072e10a535d8573cc64736f6c63430008180033", "nonce": "0x0", "storage": { "0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00": "0x000000000000000000000000000000000000000000000000ffffffffffffffff" diff --git a/contracts/bindings/allocpredeploys.go b/contracts/bindings/allocpredeploys.go index 565346e90..0f1c0d707 100644 --- a/contracts/bindings/allocpredeploys.go +++ b/contracts/bindings/allocpredeploys.go @@ -40,7 +40,7 @@ type AllocPredeploysConfig struct { // AllocPredeploysMetaData contains all meta data concerning the AllocPredeploys contract. var AllocPredeploysMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"IS_SCRIPT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"run\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structAllocPredeploys.Config\",\"components\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"enableStakingAllowlist\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"output\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"runNoStateDump\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structAllocPredeploys.Config\",\"components\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"enableStakingAllowlist\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"output\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", - Bin: "0x6080604052600c80546201000162ff00ff19909116179055601180546001600160a01b03191673dddddddddddddddddddddddddddddddddddddddd17905534801561004957600080fd5b506201d924806200005b6000396000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c806332dc6934146200004b578063a7c15bfc1462000064578063f8ccbf47146200007b575b600080fd5b620000626200005c366004620027dd565b620000a3565b005b6200006262000075366004620027dd565b6200024b565b600c546200008f9062010000900460ff1681565b604051901515815260200160405180910390f35b620000ae8162000259565b604051635a6b63c160e11b815260008051602062003bc08339815191529063b4d6c78290620000e290339060040162002822565b600060405180830381600087803b158015620000fd57600080fd5b505af115801562000112573d6000803e3d6000fd5b5050604051631c72346d60e01b815233600482015260008051602062003bc08339815191529250631c72346d9150602401600060405180830381600087803b1580156200015e57600080fd5b505af115801562000173573d6000803e3d6000fd5b505060405163c88a5e6d60e01b81523360048201526000602482015260008051602062003bc0833981519152925063c88a5e6d9150604401600060405180830381600087803b158015620001c657600080fd5b505af1158015620001db573d6000803e3d6000fd5b505060405163709ecd3f60e01b815260008051602062003bc0833981519152925063709ecd3f9150620002149060109060040162002881565b600060405180830381600087803b1580156200022f57600080fd5b505af115801562000244573d6000803e3d6000fd5b5050505050565b620002568162000259565b50565b80600d62000268828262002a4d565b5050600e54604051632024eee960e11b8152600481019190915260008051602062003bc083398151915290634049ddd290602401600060405180830381600087803b158015620002b757600080fd5b505af1158015620002cc573d6000803e3d6000fd5b50506011546040516303223eab60e11b81526001600160a01b03909116600482015260008051602062003bc083398151915292506306447d569150602401600060405180830381600087803b1580156200032557600080fd5b505af11580156200033a573d6000803e3d6000fd5b5050505062000348620003a0565b62000352620003e8565b6000805160206200e5d283398151915260001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200022f57600080fd5b620003aa6200155f565b620003b4620015ae565b620003be62001716565b620003c862001993565b620003d262001a5a565b620003dc62001bbb565b620003e662001c98565b565b6000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273ca11bde05977b3631167028862be2a173976ca1160405180610f000160405280610ee081526020016201bfe9610ee091396040518363ffffffff1660e01b81526004016200045a92919062002b2a565b600060405180830381600087803b1580156200047557600080fd5b505af11580156200048a573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c7827313b0d85ccb8bf860b6b79af3029fca081ae9bef260405180610660016040528061063081526020016200dfa261063091396040518363ffffffff1660e01b81526004016200050092919062002b2a565b600060405180830381600087803b1580156200051b57600080fd5b505af115801562000530573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c7827369f4d1788e39c87893c980c06edf4b7f686e2938604051806159e001604052806159ae81526020016200e5f26159ae91396040518363ffffffff1660e01b8152600401620005a692919062002b2a565b600060405180830381600087803b158015620005c157600080fd5b505af1158015620005d6573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273fb1bffc9d739b8d520daf37df666da4c687191ea60405180615d200160405280615cf8815260200162003be0615cf891396040518363ffffffff1660e01b81526004016200064c92919062002b2a565b600060405180830381600087803b1580156200066757600080fd5b505af11580156200067c573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273a1dabef33b3b82c7814b6d82a79e50f4ac44102b604051806101c0016040528061019a81526020016200dbf861019a91396040518363ffffffff1660e01b8152600401620006f292919062002b2a565b600060405180830381600087803b1580156200070d57600080fd5b505af115801562000722573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273914d7fec6aac8cd542e72bca78b30650d45643d760405180608001604052806045815260200162009a9b604591396040518363ffffffff1660e01b81526004016200079592919062002b2a565b600060405180830381600087803b158015620007b057600080fd5b505af1158015620007c5573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782734e59b44847b379578588920ca78fbf26c0b4956c60405180608001604052806045815260200162009a9b604591396040518363ffffffff1660e01b81526004016200083892919062002b2a565b600060405180830381600087803b1580156200085357600080fd5b505af115801562000868573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273998739bfdaadde7c933b942a68053933098f9eda604051806102a00160405280610275815260200162009ae061027591396040518363ffffffff1660e01b8152600401620008de92919062002b2a565b600060405180830381600087803b158015620008f957600080fd5b505af11580156200090e573d6000803e3d6000fd5b5050600e5460008051602062003bc0833981519152925063b4d6c78291506e22d473030f116ddee9f6b43ac78ba390620009489062001dec565b6040518363ffffffff1660e01b81526004016200096792919062002b2a565b600060405180830381600087803b1580156200098257600080fd5b505af115801562000997573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782737fc98430eaedbb6070b35b39d79872504908834860405180610240016040528061021081526020016200dd9261021091396040518363ffffffff1660e01b815260040162000a0d92919062002b2a565b600060405180830381600087803b15801562000a2857600080fd5b505af115801562000a3d573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782735ff137d4b0fdcd49dca30c7cf57e578a026d278960405180615cc00160405280615c89815260200162016360615c8991396040518363ffffffff1660e01b815260040162000ab392919062002b2a565b600060405180830381600087803b15801562000ace57600080fd5b505af115801562000ae3573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273efc2c1444ebcc4db75e7613d20c6a62ff67a167c6040518061020001604052806101c38152602001620098d86101c391396040518363ffffffff1660e01b815260040162000b5992919062002b2a565b600060405180830381600087803b15801562000b7457600080fd5b505af115801562000b89573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c7826f71727de22e5e9d8baf0edac6f37da03260405180613ee00160405280613ea3815260200162009d55613ea391396040518363ffffffff1660e01b815260040162000bfb92919062002b2a565b600060405180830381600087803b15801562000c1657600080fd5b505af115801562000c2b573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782731820a4b7618bde71dce8cdc73aab6c95905fad2460405180610a0001604052806109c581526020016201cec96109c591396040518363ffffffff1660e01b815260040162000ca192919062002b2a565b600060405180830381600087803b15801562000cbc57600080fd5b505af115801562000cd1573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782720f3df6d732807ef1319fb7b8bb8522d0beac026040518060a00160405280606181526020016201d88e606191396040518363ffffffff1660e01b815260040162000d4392919062002b2a565b600060405180830381600087803b15801562000d5e57600080fd5b505af115801562000d73573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000dc290730b799c86a49deeb90402691f1041aa3af2d3c8759060019060040162002b6e565b600060405180830381600087803b15801562000ddd57600080fd5b505af115801562000df2573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000e419073ca11bde05977b3631167028862be2a173976ca119060019060040162002b6e565b600060405180830381600087803b15801562000e5c57600080fd5b505af115801562000e71573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000ec0907313b0d85ccb8bf860b6b79af3029fca081ae9bef29060019060040162002b6e565b600060405180830381600087803b15801562000edb57600080fd5b505af115801562000ef0573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000f3f907369f4d1788e39c87893c980c06edf4b7f686e29389060019060040162002b6e565b600060405180830381600087803b15801562000f5a57600080fd5b505af115801562000f6f573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000fbe9073fb1bffc9d739b8d520daf37df666da4c687191ea9060019060040162002b6e565b600060405180830381600087803b15801562000fd957600080fd5b505af115801562000fee573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200103d9073a1dabef33b3b82c7814b6d82a79e50f4ac44102b9060019060040162002b6e565b600060405180830381600087803b1580156200105857600080fd5b505af11580156200106d573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620010bc9073914d7fec6aac8cd542e72bca78b30650d45643d79060019060040162002b6e565b600060405180830381600087803b158015620010d757600080fd5b505af1158015620010ec573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200113b90734e59b44847b379578588920ca78fbf26c0b4956c9060019060040162002b6e565b600060405180830381600087803b1580156200115657600080fd5b505af11580156200116b573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620011ba9073998739bfdaadde7c933b942a68053933098f9eda9060019060040162002b6e565b600060405180830381600087803b158015620011d557600080fd5b505af1158015620011ea573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062001234906e22d473030f116ddee9f6b43ac78ba39060019060040162002b6e565b600060405180830381600087803b1580156200124f57600080fd5b505af115801562001264573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620012b390737fc98430eaedbb6070b35b39d7987250490883489060019060040162002b6e565b600060405180830381600087803b158015620012ce57600080fd5b505af1158015620012e3573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200133290735ff137d4b0fdcd49dca30c7cf57e578a026d27899060019060040162002b6e565b600060405180830381600087803b1580156200134d57600080fd5b505af115801562001362573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620013b19073efc2c1444ebcc4db75e7613d20c6a62ff67a167c9060019060040162002b6e565b600060405180830381600087803b158015620013cc57600080fd5b505af1158015620013e1573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200142c906f71727de22e5e9d8baf0edac6f37da0329060019060040162002b6e565b600060405180830381600087803b1580156200144757600080fd5b505af11580156200145c573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620014ab90731820a4b7618bde71dce8cdc73aab6c95905fad249060019060040162002b6e565b600060405180830381600087803b158015620014c657600080fd5b505af1158015620014db573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200152990720f3df6d732807ef1319fb7b8bb8522d0beac029060019060040162002b6e565b600060405180830381600087803b1580156200154457600080fd5b505af115801562001559573d6000803e3d6000fd5b50505050565b60006200156b62001f22565b905060005b8151811015620015aa57620015a182828151811062001593576200159362002b91565b602002602001015162001fbf565b60010162001570565b5050565b6000620015c4600162048789608a1b01620023f7565b604051630fafdced60e21b815260206004820152602160248201527f506f7274616c52656769737472792e736f6c3a506f7274616c526567697374726044820152607960f81b606482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490608401600060405180830381865afa15801562001654573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200167e919081019062002ba7565b6040518363ffffffff1660e01b81526004016200169d92919062002b2a565b600060405180830381600087803b158015620016b857600080fd5b505af1158015620016cd573d6000803e3d6000fd5b50505050620016dc81620024ce565b600d5460405163189acdbd60e31b81526001600160a01b039091166004820152600162048789608a1b019063c4d66de89060240162000214565b60405163c88a5e6d60e01b8152600262048789608a1b0160048201526a52b7d2dcc80cd2e4000000602482018190529060008051602062003bc08339815191529063c88a5e6d90604401600060405180830381600087803b1580156200177b57600080fd5b505af115801562001790573d6000803e3d6000fd5b505050506000620017aa600262048789608a1b01620023f7565b604051630fafdced60e21b815260206004820152602560248201527f4f6d6e694272696467654e61746976652e736f6c3a4f6d6e694272696467654e604482015264617469766560d81b606482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490608401600060405180830381865afa1580156200183e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001868919081019062002ba7565b6040518363ffffffff1660e01b81526004016200188792919062002b2a565b600060405180830381600087803b158015620018a257600080fd5b505af1158015620018b7573d6000803e3d6000fd5b50505050620018c681620024ce565b600d5460405163189acdbd60e31b81526001600160a01b039091166004820152600262048789608a1b019063c4d66de890602401600060405180830381600087803b1580156200191557600080fd5b505af11580156200192a573d6000803e3d6000fd5b50505050600262048789608a1b016001600160a01b0316316a52b7d2dcc80cd2e400000014620015aa5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c69642062616c616e636560881b60448201526064015b60405180910390fd5b604051630fafdced60e21b815260206004820152600f60248201526e574f6d6e692e736f6c3a574f6d6e6960881b604482015260008051602062003bc08339815191529063b4d6c78290600362048789608a1b01908390633ebf73b490606401600060405180830381865afa15801562001a11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001a3b919081019062002ba7565b6040518363ffffffff1660e01b81526004016200152992919062002b2a565b600062001a70600162333333608a1b01620023f7565b604051630fafdced60e21b81526020600482015260136024820152725374616b696e672e736f6c3a5374616b696e6760681b604482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490606401600060405180830381865afa15801562001aec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001b16919081019062002ba7565b6040518363ffffffff1660e01b815260040162001b3592919062002b2a565b600060405180830381600087803b15801562001b5057600080fd5b505af115801562001b65573d6000803e3d6000fd5b5050505062001b7481620024ce565b600d54600f5460405163400ada7560e01b81526001600160a01b03909216600483015260ff1615156024820152600162333333608a1b019063400ada759060440162000214565b600062001bd1600262333333608a1b01620023f7565b604051630fafdced60e21b8152602060048201526015602482015274536c617368696e672e736f6c3a536c617368696e6760581b604482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490606401600060405180830381865afa15801562001c4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001c79919081019062002ba7565b6040518363ffffffff1660e01b81526004016200021492919062002b2a565b600062001cae600362333333608a1b01620023f7565b604051630fafdced60e21b8152602060048201526013602482015272557067726164652e736f6c3a5570677261646560681b604482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490606401600060405180830381865afa15801562001d2a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001d54919081019062002ba7565b6040518363ffffffff1660e01b815260040162001d7392919062002b2a565b600060405180830381600087803b15801562001d8e57600080fd5b505af115801562001da3573d6000803e3d6000fd5b5050505062001db281620024ce565b600d5460405163189acdbd60e31b81526001600160a01b039091166004820152600362333333608a1b019063c4d66de89060240162000214565b6060600060405160200162001e0e90662832b936b4ba1960c91b815260070190565b604051602081830303815290604052805190602001209050600060405160200162001e8e907f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430190565b60408051601f198184030181528282528051602091820120908301819052908201849052606082018690526e22d473030f116ddee9f6b43ac78ba36080830152915060009060a001604051602081830303815290604052805190602001209050604051806123e001604052806123c0815260200162013fa06123c09139611b41810195909552611b67850152509192915050565b604080516002808252606080830184529260208301908036833701905050905062048789608a1b8160008151811062001f5f5762001f5f62002b91565b60200260200101906001600160a01b031690816001600160a01b03168152505062333333608a1b8160018151811062001f9c5762001f9c62002b91565b60200260200101906001600160a01b031690816001600160a01b03168152505090565b63ffffffff811615620020095760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964206e616d65737061636560781b60448201526064016200198a565b60015b610400816001600160a01b031611620023c15760006200202d828462002c76565b9050600362048789608a1b016001600160a01b03821603620020505750620023ac565b60006200205d826200253e565b6200206a57600062002075565b6200207582620023f7565b90506001600160a01b0381163b15620020c45760405162461bcd60e51b815260206004820152601060248201526f1a5b5c1b08185b1c9958591e481cd95d60821b60448201526064016200198a565b60408051635a6b63c160e11b81526001600160a01b038316600482015260248101919091526002604482015261030360f41b606482015260008051602062003bc08339815191529063b4d6c78290608401600060405180830381600087803b1580156200213057600080fd5b505af115801562002145573d6000803e3d6000fd5b5050600d54604051600093508492506001600160a01b03909116906200216b90620027cf565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f080158015620021ae573d6000803e3d6000fd5b5090506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78284836001600160a01b0316803b806020016040519081016040528181526000908060200190933c6040518363ffffffff1660e01b81526004016200221892919062002b2a565b600060405180830381600087803b1580156200223357600080fd5b505af115801562002248573d6000803e3d6000fd5b50505050620022588383620025eb565b6200226e83620022688362002688565b6200272b565b604051635a6b63c160e11b815260008051602062003bc08339815191529063b4d6c78290620022a290859060040162002822565b600060405180830381600087803b158015620022bd57600080fd5b505af1158015620022d2573d6000803e3d6000fd5b5050604051635a6b63c160e11b815260008051602062003bc0833981519152925063b4d6c78291506200230a90849060040162002822565b600060405180830381600087803b1580156200232557600080fd5b505af11580156200233a573d6000803e3d6000fd5b5050604051631c72346d60e01b81526001600160a01b038416600482015260008051602062003bc08339815191529250631c72346d9150602401600060405180830381600087803b1580156200238f57600080fd5b505af1158015620023a4573d6000803e3d6000fd5b505050505050505b80620023b88162002ca0565b9150506200200c565b50604051635a6b63c160e11b815260008051602062003bc08339815191529063b4d6c78290620002149060009060040162002822565b6000620024048262002795565b620024525760405162461bcd60e51b815260206004820152601b60248201527f5072656465706c6f79733a206e6f742061207072656465706c6f79000000000060448201526064016200198a565b600362048789608a1b016001600160a01b03831603620024b55760405162461bcd60e51b815260206004820152601760248201527f5072656465706c6f79733a206e6f742070726f7869656400000000000000000060448201526064016200198a565b620024c8826001600160a01b0362002cd1565b92915050565b6040516370ca10bb60e01b81526001600160a01b03821660048201527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00602482015267ffffffffffffffff604482015260008051602062003bc0833981519152906370ca10bb9060640162000214565b60006001600160a01b038216600162048789608a1b0114806200257257506001600160a01b038216600262048789608a1b01145b806200258f57506001600160a01b038216600362048789608a1b01145b80620025ac57506001600160a01b038216600162333333608a1b01145b80620025c957506001600160a01b038216600262333333608a1b01145b80620024c857506001600160a01b038216600362333333608a1b011492915050565b6040516370ca10bb60e01b81526001600160a01b0380841660048301527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60248301528216604482015260008051602062003bc0833981519152906370ca10bb906064015b600060405180830381600087803b1580156200266b57600080fd5b505af115801562002680573d6000803e3d6000fd5b505050505050565b604051630667f9d760e41b81526001600160a01b03821660048201527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103602482015260009060008051602062003bc08339815191529063667f9d7090604401602060405180830381865afa15801562002705573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024c8919062002cf4565b6040516370ca10bb60e01b81526001600160a01b0380841660048301527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360248301528216604482015260008051602062003bc0833981519152906370ca10bb9060640162002650565b60006001600160951b03600b83901c1662048789607f1b1480620024c857505062333333607f1b600b9190911c6001600160951b03161490565b610eb18062002d0f83390190565b600060208284031215620027f057600080fd5b813567ffffffffffffffff8111156200280857600080fd5b8201608081850312156200281b57600080fd5b9392505050565b6001600160a01b0391909116815260406020820181905260009082015260600190565b600181811c908216806200285a57607f821691505b6020821081036200287b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000602080835260008454620028978162002845565b8060208701526040600180841660008114620028bc5760018114620028d9576200290b565b60ff19851660408a0152604084151560051b8a010195506200290b565b89600052602060002060005b85811015620029025781548b8201860152908301908801620028e5565b8a016040019650505b509398975050505050505050565b634e487b7160e01b600052604160045260246000fd5b601f8211156200297b576000816000526020600020601f850160051c810160208610156200295a5750805b601f850160051c820191505b81811015620026805782815560010162002966565b505050565b67ffffffffffffffff8311156200299b576200299b62002919565b620029b383620029ac835462002845565b836200292f565b6000601f841160018114620029ea5760008515620029d15750838201355b600019600387901b1c1916600186901b17835562000244565b600083815260209020601f19861690835b8281101562002a1d5786850135825560209485019460019092019101620029fb565b508682101562002a3b5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81356001600160a01b03811680821462002a6657600080fd5b82546001600160a01b031916178255506020820135600182015560028101604083013580151580821462002a9957600080fd5b60ff19835416915060ff8116821783555050506060820135601e1983360301811262002ac457600080fd5b8201803567ffffffffffffffff81111562002ade57600080fd5b60208201915080360382131562002af457600080fd5b6200155981836003860162002980565b60005b8381101562002b2157818101518382015260200162002b07565b50506000910152565b60018060a01b0383168152604060208201526000825180604084015262002b5981606085016020870162002b04565b601f01601f1916919091016060019392505050565b6001600160a01b0392909216825267ffffffffffffffff16602082015260400190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562002bba57600080fd5b815167ffffffffffffffff8082111562002bd357600080fd5b818401915084601f83011262002be857600080fd5b81518181111562002bfd5762002bfd62002919565b604051601f8201601f19908116603f0116810190838211818310171562002c285762002c2862002919565b8160405282815287602084870101111562002c4257600080fd5b62002c5583602083016020880162002b04565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381811683821601908082111562002c995762002c9962002c60565b5092915050565b60006001600160a01b038281166002600160a01b0319810162002cc75762002cc762002c60565b6001019392505050565b6001600160a01b0382811682821603908082111562002c995762002c9962002c60565b60006020828403121562002d0757600080fd5b505191905056fe60a060405260405162000eb138038062000eb18339810160408190526200002691620003cd565b82816200003482826200009c565b505081604051620000459062000366565b6001600160a01b039091168152602001604051809103906000f08015801562000072573d6000803e3d6000fd5b506001600160a01b0316608052620000936200008d60805190565b62000102565b505050620004cb565b620000a78262000174565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000f457620000ef8282620001f4565b505050565b620000fe62000271565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200014460008051602062000e91833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001718162000293565b50565b806001600160a01b03163b600003620001b057604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620002139190620004ad565b600060405180830381855af49150503d806000811462000250576040519150601f19603f3d011682016040523d82523d6000602084013e62000255565b606091505b50909250905062000268858383620002d6565b95945050505050565b3415620002915760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002bf57604051633173bdd160e11b815260006004820152602401620001a7565b8060008051602062000e91833981519152620001d3565b606082620002ef57620002e9826200033c565b62000335565b81511580156200030757506001600160a01b0384163b155b156200033257604051639996b31560e01b81526001600160a01b0385166004820152602401620001a7565b50805b9392505050565b8051156200034d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610524806200096d83390190565b80516001600160a01b03811681146200038c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620003c4578181015183820152602001620003aa565b50506000910152565b600080600060608486031215620003e357600080fd5b620003ee8462000374565b9250620003fe6020850162000374565b60408501519092506001600160401b03808211156200041c57600080fd5b818601915086601f8301126200043157600080fd5b81518181111562000446576200044662000391565b604051601f8201601f19908116603f0116810190838211818310171562000471576200047162000391565b816040528281528960208487010111156200048b57600080fd5b6200049e836020830160208801620003a7565b80955050505050509250925092565b60008251620004c1818460208701620003a7565b9190910192915050565b608051610487620004e66000396000601001526104876000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610312565b8101906100a09190610352565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f5565b505050565b6100ae61026b565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101b457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516102129190610422565b600060405180830381855af49150503d806000811461024d576040519150601f19603f3d011682016040523d82523d6000602084013e610252565b606091505b509150915061026285838361028a565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029f5761029a826102e9565b6102e2565b81511580156102b657506001600160a01b0384163b155b156102df57604051639996b31560e01b81526001600160a01b03851660048201526024016101ab565b50805b9392505050565b8051156102f95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561032257600080fd5b8386111561032f57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561036557600080fd5b82356001600160a01b038116811461037c57600080fd5b9150602083013567ffffffffffffffff8082111561039957600080fd5b818501915085601f8301126103ad57600080fd5b8135818111156103bf576103bf61033c565b604051601f8201601f19908116603f011681019083821181831017156103e7576103e761033c565b8160405282815288602084870101111561040057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b818110156104435760208186018101518583015201610429565b50600092019182525091905056fea264697066735822122050fc77c91d584c02c0e0b72a5eba22ad71f9a2b88784c34d65184ca2ba02195064736f6c63430008180033608060405234801561001057600080fd5b5060405161052438038061052483398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610427806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610093578063ad3cb1cc146100a6578063f2fde38b146100e4575b600080fd5b34801561005b57600080fd5b50610064610104565b005b34801561007257600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b6100646100a1366004610272565b610118565b3480156100b257600080fd5b506100d7604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008a919061038e565b3480156100f057600080fd5b506100646100ff3660046103a8565b610187565b61010c6101ca565b61011660006101f7565b565b6101206101ca565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015090869086906004016103c5565b6000604051808303818588803b15801561016957600080fd5b505af115801561017d573d6000803e3d6000fd5b5050505050505050565b61018f6101ca565b6001600160a01b0381166101be57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6101c7816101f7565b50565b6000546001600160a01b031633146101165760405163118cdaa760e01b81523360048201526024016101b5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101c757600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561028757600080fd5b833561029281610247565b925060208401356102a281610247565b9150604084013567ffffffffffffffff808211156102bf57600080fd5b818601915086601f8301126102d357600080fd5b8135818111156102e5576102e561025c565b604051601f8201601f19908116603f0116810190838211818310171561030d5761030d61025c565b8160405282815289602084870101111561032657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000815180845260005b8181101561036e57602081850181015186830182015201610352565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103a16020830184610348565b9392505050565b6000602082840312156103ba57600080fd5b81356103a181610247565b6001600160a01b03831681526040602082018190526000906103e990830184610348565b94935050505056fea26469706673582212204e6c3564458e40536cebf1d675d2ad7af11c5352eae442784c5e053dcf005af164736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000007109709ecfa91a80626ff3989d68f67f5b1dd12d6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506126fc565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b810190808035906020019092919080359060200190929190505050612732565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b81019080803590602001909291905050506127b9565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d1565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612b63565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c9d565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612edc565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612f01565b005b348015610d3457600080fd5b50610d3d612f90565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613139565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061313f565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613161565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff16906020019092919050505061331f565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613447565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613639565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137d8565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613805565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b96565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b34801561148957600080fd5b5061149261428c565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614296565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061443e565b005b3480156116a457600080fd5b506116ad61449f565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061451d565b005b34801561174a57600080fd5b50611753614950565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614989565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612b63565b5b5050565b611bd2604182614a2c90919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614a66565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614a2c90919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614a9590919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614a9590919063ffffffff16565b614a9590919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b60007fb648d3644f584ed1c2232d53c46d87e693586486ad0d1175f8656013110b714e3386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183600181111561266b57fe5b8152602001828103825284818151815260200191508051906020019080838360005b838110156126a857808201518184015260208101905061268d565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a16126f285858585614ab4565b9050949350505050565b6000606061270c868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561275057600080fd5b506040519080825280601f01601f1916602001820160405280156127835781602001600182028036833780820191505090505b50905060005b838110156127ae57808501548060208302602085010152508080600101915050612789565b508091505092915050565b60076020528060005260406000206000915090505481565b6127d9614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128435750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612b6b614989565b600354811115612be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612c5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000606060055433600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed8d8d8d8d8d8d8d8d8d8d8d8c604051808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612d5057fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528e8e82818152602001925080828437600081840152601f19601f820116905080830192505050848103835286818151815260200191508051906020019080838360005b83811015612e0a578082015181840152602081019050612def565b50505050905090810190601f168015612e375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612e70578082015181840152602081019050612e55565b50505050905090810190601f168015612e9d5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390a1612eca8d8d8d8d8d8d8d8d8d8d8d614c9a565b9150509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612f7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612f8a84848484611bbe565b50505050565b6060600060035467ffffffffffffffff81118015612fad57600080fd5b50604051908082528060200260200182016040528015612fdc5781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613130578083838151811061308757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050613046565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6131ac8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050896151d7565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131ea576131e9846156d7565b5b6132388787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615706565b60008211156132525761325082600060018685615941565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a9050613376878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615b47565b61337f57600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340c5780820151818401526020810190506133f1565b50505050905090810190601f1680156134395780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561346257600080fd5b506040519080825280602002602001820160405280156134915781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135645750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561356f57508482105b1561362a578084838151811061358157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506134fa565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006137ed8c8c8c8c8c8c8c8c8c8c8c614296565b8051906020012090509b9a5050505050505050505050565b61380d614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156138775750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6138e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613b9e614989565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613c22614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c8c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613cc457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613ea15750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561432757fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6143b361449f565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b614446614989565b61444f816156d7565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6144cd6125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b614525614989565b8060016003540310156145a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561460a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61467c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461477c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1806004541461494b5761494a81612b63565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614a3f5760009050614a60565b6000828402905082848281614a5057fe5b0414614a5b57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614aaa57600080fd5b8091505092915050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015614b7f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b614bf1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b614bfe858585855a615b47565b90508015614c4e573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2614c92565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000806000614cb48e8e8e8e8e8e8e8e8e8e600554614296565b905060056000815480929190600101919050555080805190602001209150614cdd828286612f01565b506000614ce8615b93565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ece578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115614d8b57fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015614e5d578082015181840152602081019050614e42565b50505050905090810190601f168015614e8a5780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015614eb557600080fd5b505af1158015614ec9573d6000803e3d6000fd5b505050505b6101f4614ef56109c48b01603f60408d0281614ee657fe5b04615bc490919063ffffffff16565b015a1015614f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a9050614fd48f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d14614fc9578e614fcf565b6109c45a035b615b47565b9350614fe95a82615bde90919063ffffffff16565b90508380614ff8575060008a14155b80615004575060008814155b615076576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156150905761508d828b8b8b8b615941565b90505b84156150da577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a161511a565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146151c6578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156151ad57600080fd5b505af11580156151c1573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b60006004541461524f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81518111156152c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600181101561533d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b835181101561564357600084828151811061535d57fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153d15750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561540957503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561544157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6154b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809250508080600101915050615346565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461593d576158ca8260008360015a615b47565b61593c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461597e5782615980565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615a98576159ea3a86106159c7573a6159c9565b855b6159dc888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615b3d565b615abd85615aaf888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b9150615aca848284615bfe565b615b3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600180811115615b5557fe5b836001811115615b6157fe5b1415615b7a576000808551602087018986f49050615b8a565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015615bd45781615bd6565b825b905092915050565b600082821115615bed57600080fd5b600082840390508091505092915050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615ca55760208114615cad5760009350615cb8565b819350615cb8565b600051158215171593505b505050939250505056fea2646970667358221220047fac33099ca576d1c4f1ac6a8abdb0396e42ad6a397d2cb2f4dc1624cc0c5b64736f6c634300070600336080600436101561000f57600080fd5b6000803560e01c63570e1a361461002557600080fd5b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576004359167ffffffffffffffff9081841161018657366023850112156101865783600401358281116101825736602482870101116101825780601411610182577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec810192808411610155577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8501160116830190838210908211176101555792846024819482600c60209a968b9960405286845289840196603889018837830101525193013560601c5af1908051911561014d575b5073ffffffffffffffffffffffffffffffffffffffff60405191168152f35b90503861012e565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8380fd5b8280fd5b80fdfea26469706673582212207adef8895ad3393b02fab10a111d85ea80ff35366aa43995f4ea20e67f29200664736f6c634300081700337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf360806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000998739bfdaadde7c933b942a68053933098f9eda73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c6343000706003360806040526004361015610024575b361561001957600080fd5b61002233612748565b005b60003560e01c806242dc5314611b0057806301ffc9a7146119ae5780630396cb60146116765780630bd28e3b146115fa5780631b2e01b814611566578063205c2878146113d157806322cdde4c1461136b57806335567e1a146112b35780635287ce12146111a557806370a0823114611140578063765e827f14610e82578063850aaf6214610dc35780639b249f6914610c74578063b760faf914610c3a578063bb9fe6bf14610a68578063c23a5cea146107c4578063dbed18e0146101a15763fc7e286d0361000e573461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5773ffffffffffffffffffffffffffffffffffffffff61013a61229f565b16600052600060205260a0604060002065ffffffffffff6001825492015460405192835260ff8116151560208401526dffffffffffffffffffffffffffff8160081c16604084015263ffffffff8160781c16606084015260981c166080820152f35b600080fd5b3461019c576101af36612317565b906101b86129bd565b60009160005b82811061056f57506101d08493612588565b6000805b8481106102fc5750507fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000809360005b81811061024757610240868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2613ba7565b6001600255005b6102a261025582848a612796565b73ffffffffffffffffffffffffffffffffffffffff6102766020830161282a565b167f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a2806127d6565b906000915b8083106102b957505050600101610209565b909194976102f36102ed6001926102e78c8b6102e0826102da8e8b8d61269d565b9261265a565b5191613597565b90612409565b99612416565b950191906102a7565b6020610309828789612796565b61031f61031682806127d6565b9390920161282a565b9160009273ffffffffffffffffffffffffffffffffffffffff8091165b8285106103505750505050506001016101d4565b909192939561037f83610378610366848c61265a565b516103728b898b61269d565b856129f6565b9290613dd7565b9116840361050a576104a5576103958491613dd7565b9116610440576103b5576103aa600191612416565b96019392919061033c565b60a487604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b608488604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b608488604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b608489604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b61057a818487612796565b9361058585806127d6565b919095602073ffffffffffffffffffffffffffffffffffffffff6105aa82840161282a565b1697600192838a1461076657896105da575b5050505060019293949550906105d191612409565b939291016101be565b8060406105e892019061284b565b918a3b1561019c57929391906040519485937f2dd8113300000000000000000000000000000000000000000000000000000000855288604486016040600488015252606490818601918a60051b8701019680936000915b8c83106106e657505050505050838392610684927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8560009803016024860152612709565b03818a5afa90816106d7575b506106c657602486604051907f86a9f7500000000000000000000000000000000000000000000000000000000082526004820152fd5b93945084936105d1600189806105bc565b6106e0906121bd565b88610690565b91939596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c908a9294969a0301865288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee18336030181121561019c57836107538793858394016128ec565b9a0196019301909189979695949261063f565b606483604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b3461019c576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c576107fc61229f565b33600052600082526001604060002001908154916dffffffffffffffffffffffffffff8360081c16928315610a0a5765ffffffffffff8160981c1680156109ac57421061094e5760009373ffffffffffffffffffffffffffffffffffffffff859485947fffffffffffffff000000000000000000000000000000000000000000000000ff86951690556040517fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda33391806108da8786836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0390a2165af16108e8612450565b50156108f057005b606490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b606485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b606486604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b606485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b3461019c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c573360005260006020526001604060002001805463ffffffff8160781c16908115610bdc5760ff1615610b7e5765ffffffffffff908142160191818311610b4f5780547fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff001678ffffffffffff00000000000000000000000000000000000000609885901b161790556040519116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a2005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c57610022610c6f61229f565b612748565b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760043567ffffffffffffffff811161019c576020610cc8610d1b9236906004016122c2565b919073ffffffffffffffffffffffffffffffffffffffff9260405194859283927f570e1a360000000000000000000000000000000000000000000000000000000084528560048501526024840191612709565b03816000857f000000000000000000000000efc2c1444ebcc4db75e7613d20c6a62ff67a167c165af1908115610db757602492600092610d86575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b610da991925060203d602011610db0575b610da181836121ed565b8101906126dd565b9083610d56565b503d610d97565b6040513d6000823e3d90fd5b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c57610dfa61229f565b60243567ffffffffffffffff811161019c57600091610e1e839236906004016122c2565b90816040519283928337810184815203915af4610e39612450565b90610e7e6040519283927f99410554000000000000000000000000000000000000000000000000000000008452151560048401526040602484015260448301906123c6565b0390fd5b3461019c57610e9036612317565b610e9b9291926129bd565b610ea483612588565b60005b848110610f1c57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000915b858310610eec576102408585613ba7565b909193600190610f12610f0087898761269d565b610f0a888661265a565b519088613597565b0194019190610edb565b610f47610f40610f2e8385979561265a565b51610f3a84898761269d565b846129f6565b9190613dd7565b73ffffffffffffffffffffffffffffffffffffffff929183166110db5761107657610f7190613dd7565b911661101157610f8657600101929092610ea7565b60a490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b608482604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b608483604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b608484604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5773ffffffffffffffffffffffffffffffffffffffff61118c61229f565b1660005260006020526020604060002054604051908152f35b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5773ffffffffffffffffffffffffffffffffffffffff6111f161229f565b6000608060405161120181612155565b828152826020820152826040820152826060820152015216600052600060205260a06040600020608060405161123681612155565b6001835493848352015490602081019060ff8316151582526dffffffffffffffffffffffffffff60408201818560081c16815263ffffffff936060840193858760781c16855265ffffffffffff978891019660981c1686526040519788525115156020880152511660408601525116606084015251166080820152f35b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760206112ec61229f565b73ffffffffffffffffffffffffffffffffffffffff6113096122f0565b911660005260018252604060002077ffffffffffffffffffffffffffffffffffffffffffffffff821660005282526040600020547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b3461019c577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60208136011261019c576004359067ffffffffffffffff821161019c5761012090823603011261019c576113c9602091600401612480565b604051908152f35b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5761140861229f565b60243590336000526000602052604060002090815491828411611508576000808573ffffffffffffffffffffffffffffffffffffffff8295839561144c848a612443565b90556040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af16114a2612450565b50156114aa57005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5761159d61229f565b73ffffffffffffffffffffffffffffffffffffffff6115ba6122f0565b9116600052600160205277ffffffffffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760043577ffffffffffffffffffffffffffffffffffffffffffffffff811680910361019c5733600052600160205260406000209060005260205260406000206116728154612416565b9055005b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760043563ffffffff9182821680920361019c5733600052600081526040600020928215611950576001840154908160781c1683106118f2576116f86dffffffffffffffffffffffffffff9182349160081c16612409565b93841561189457818511611836579065ffffffffffff61180592546040519061172082612155565b8152848101926001845260408201908816815260608201878152600160808401936000855233600052600089526040600020905181550194511515917fffffffffffffffffffffffffff0000000000000000000000000000000000000060ff72ffffffff0000000000000000000000000000006effffffffffffffffffffffffffff008954945160081b16945160781b1694169116171717835551167fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff78ffffffffffff0000000000000000000000000000000000000083549260981b169116179055565b6040519283528201527fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c0160403392a2005b606483604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b606483604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b606482604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b606482604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019c57807f60fc6b6e0000000000000000000000000000000000000000000000000000000060209214908115611ad6575b8115611aac575b8115611a82575b8115611a58575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482611a4d565b7f3e84f0210000000000000000000000000000000000000000000000000000000081149150611a46565b7fcf28ef970000000000000000000000000000000000000000000000000000000081149150611a3f565b7f915074d80000000000000000000000000000000000000000000000000000000081149150611a38565b3461019c576102007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5767ffffffffffffffff60043581811161019c573660238201121561019c57611b62903690602481600401359101612268565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101c0811261019c5761014060405191611b9e83612155565b1261019c5760405192611bb0846121a0565b60243573ffffffffffffffffffffffffffffffffffffffff8116810361019c578452602093604435858201526064356040820152608435606082015260a435608082015260c43560a082015260e43560c08201526101043573ffffffffffffffffffffffffffffffffffffffff8116810361019c5760e08201526101243561010082015261014435610120820152825261016435848301526101843560408301526101a43560608301526101c43560808301526101e43590811161019c57611c7c9036906004016122c2565b905a3033036120f7578351606081015195603f5a0260061c61271060a0840151890101116120ce5760009681519182611ff0575b5050505090611cca915a9003608085015101923691612268565b925a90600094845193611cdc85613ccc565b9173ffffffffffffffffffffffffffffffffffffffff60e0870151168015600014611ea957505073ffffffffffffffffffffffffffffffffffffffff855116935b5a9003019360a06060820151910151016080860151850390818111611e95575b50508302604085015192818410600014611dce5750506003811015611da157600203611d79576113c99293508093611d7481613d65565b613cf6565b5050507fdeadaa51000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b81611dde92979396940390613c98565b506003841015611e6857507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f60808683015192519473ffffffffffffffffffffffffffffffffffffffff865116948873ffffffffffffffffffffffffffffffffffffffff60e0890151169701519160405192835215898301528760408301526060820152a46113c9565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526021600452fd5b6064919003600a0204909301928780611d3d565b8095918051611eba575b5050611d1d565b6003861015611fc1576002860315611eb35760a088015190823b1561019c57600091611f2491836040519586809581947f7c627b210000000000000000000000000000000000000000000000000000000083528d60048401526080602484015260848301906123c6565b8b8b0260448301528b60648301520393f19081611fad575b50611fa65787893d610800808211611f9e575b506040519282828501016040528184528284013e610e7e6040519283927fad7954bc000000000000000000000000000000000000000000000000000000008452600484015260248301906123c6565b905083611f4f565b8980611eb3565b611fb89199506121bd565b6000978a611f3c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91600092918380938c73ffffffffffffffffffffffffffffffffffffffff885116910192f115612023575b808080611cb0565b611cca929195503d6108008082116120c6575b5060405190888183010160405280825260008983013e805161205f575b5050600194909161201b565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20188870151918973ffffffffffffffffffffffffffffffffffffffff8551169401516120bc604051928392835260408d84015260408301906123c6565b0390a38680612053565b905088612036565b877fdeaddead000000000000000000000000000000000000000000000000000000006000526000fd5b606486604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b60a0810190811067ffffffffffffffff82111761217157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610140810190811067ffffffffffffffff82111761217157604052565b67ffffffffffffffff811161217157604052565b6060810190811067ffffffffffffffff82111761217157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761217157604052565b67ffffffffffffffff811161217157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926122748261222e565b9161228260405193846121ed565b82948184528183011161019c578281602093846000960137010152565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361019c57565b9181601f8401121561019c5782359167ffffffffffffffff831161019c576020838186019501011161019c57565b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361019c57565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261019c5760043567ffffffffffffffff9283821161019c578060238301121561019c57816004013593841161019c5760248460051b8301011161019c57602401919060243573ffffffffffffffffffffffffffffffffffffffff8116810361019c5790565b60005b8381106123b65750506000910152565b81810151838201526020016123a6565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612402815180928187528780880191016123a3565b0116010190565b91908201809211610b4f57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610b4f5760010190565b91908203918211610b4f57565b3d1561247b573d906124618261222e565b9161246f60405193846121ed565b82523d6000602084013e565b606090565b604061248e8183018361284b565b90818351918237206124a3606084018461284b565b90818451918237209260c06124bb60e083018361284b565b908186519182372091845195602087019473ffffffffffffffffffffffffffffffffffffffff833516865260208301358789015260608801526080870152608081013560a087015260a081013582870152013560e08501526101009081850152835261012083019167ffffffffffffffff918484108385111761217157838252845190206101408501908152306101608601524661018086015260608452936101a00191821183831017612171575251902090565b67ffffffffffffffff81116121715760051b60200190565b9061259282612570565b6040906125a260405191826121ed565b8381527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06125d08295612570565b019160005b8381106125e25750505050565b60209082516125f081612155565b83516125fb816121a0565b600081526000849181838201528187820152816060818184015260809282848201528260a08201528260c08201528260e082015282610100820152826101208201528652818587015281898701528501528301528286010152016125d5565b805182101561266e5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919081101561266e5760051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee18136030182121561019c570190565b9081602091031261019c575173ffffffffffffffffffffffffffffffffffffffff8116810361019c5790565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b7f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4602073ffffffffffffffffffffffffffffffffffffffff61278a3485613c98565b936040519485521692a2565b919081101561266e5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18136030182121561019c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561019c570180359067ffffffffffffffff821161019c57602001918160051b3603831361019c57565b3573ffffffffffffffffffffffffffffffffffffffff8116810361019c5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561019c570180359067ffffffffffffffff821161019c5760200191813603831361019c57565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561019c57016020813591019167ffffffffffffffff821161019c57813603831361019c57565b61012091813573ffffffffffffffffffffffffffffffffffffffff811680910361019c576129626129476129ba9561299b93855260208601356020860152612937604087018761289c565b9091806040880152860191612709565b612954606086018661289c565b908583036060870152612709565b6080840135608084015260a084013560a084015260c084013560c084015261298d60e085018561289c565b9084830360e0860152612709565b916129ac610100918281019061289c565b929091818503910152612709565b90565b60028054146129cc5760028055565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b926000905a93805194843573ffffffffffffffffffffffffffffffffffffffff811680910361019c5786526020850135602087015260808501356fffffffffffffffffffffffffffffffff90818116606089015260801c604088015260a086013560c088015260c086013590811661010088015260801c610120870152612a8060e086018661284b565b801561357b576034811061351d578060141161019c578060241161019c5760341161019c57602481013560801c60a0880152601481013560801c60808801523560601c60e08701525b612ad285612480565b60208301526040860151946effffffffffffffffffffffffffffff8660c08901511760608901511760808901511760a0890151176101008901511761012089015117116134bf57604087015160608801510160808801510160a08801510160c0880151016101008801510296835173ffffffffffffffffffffffffffffffffffffffff81511690612b66604085018561284b565b806131e4575b505060e0015173ffffffffffffffffffffffffffffffffffffffff1690600082156131ac575b6020612bd7918b828a01516000868a604051978896879586937f19822f7c00000000000000000000000000000000000000000000000000000000855260048501613db5565b0393f160009181613178575b50612c8b573d8c610800808311612c83575b50604051916020818401016040528083526000602084013e610e7e6040519283927f65c8fd4d000000000000000000000000000000000000000000000000000000008452600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a48301906123c6565b915082612bf5565b9a92939495969798999a91156130f2575b509773ffffffffffffffffffffffffffffffffffffffff835116602084015190600052600160205260406000208160401c60005260205267ffffffffffffffff604060002091825492612cee84612416565b9055160361308d575a8503116130285773ffffffffffffffffffffffffffffffffffffffff60e0606093015116612d42575b509060a09184959697986040608096015260608601520135905a900301910152565b969550505a9683519773ffffffffffffffffffffffffffffffffffffffff60e08a01511680600052600060205260406000208054848110612fc3576080612dcd9a9b9c600093878094039055015192602089015183604051809d819582947f52b7512c0000000000000000000000000000000000000000000000000000000084528c60048501613db5565b039286f1978860009160009a612f36575b50612e86573d8b610800808311612e7e575b50604051916020818401016040528083526000602084013e610e7e6040519283927f65c8fd4d000000000000000000000000000000000000000000000000000000008452600484015260606024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a48301906123c6565b915082612df0565b9991929394959697989998925a900311612eab57509096959094939291906080612d20565b60a490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602760448201527f41413336206f766572207061796d6173746572566572696669636174696f6e4760648201527f61734c696d6974000000000000000000000000000000000000000000000000006084820152fd5b915098503d90816000823e612f4b82826121ed565b604081838101031261019c5780519067ffffffffffffffff821161019c57828101601f83830101121561019c578181015191612f868361222e565b93612f9460405195866121ed565b838552820160208483850101011161019c57602092612fba9184808701918501016123a3565b01519838612dde565b60848b604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601e60448201527f41413331207061796d6173746572206465706f73697420746f6f206c6f7700006064820152fd5b608490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601e60448201527f41413236206f76657220766572696669636174696f6e4761734c696d697400006064820152fd5b608482604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601a60448201527f4141323520696e76616c6964206163636f756e74206e6f6e63650000000000006064820152fd5b600052600060205260406000208054808c11613113578b9003905538612c9c565b608484604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152fd5b9091506020813d6020116131a4575b81613194602093836121ed565b8101031261019c57519038612be3565b3d9150613187565b508060005260006020526040600020548a81116000146131d75750612bd7602060005b915050612b92565b6020612bd7918c036131cf565b833b61345a57604088510151602060405180927f570e1a360000000000000000000000000000000000000000000000000000000082528260048301528160008161323260248201898b612709565b039273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000efc2c1444ebcc4db75e7613d20c6a62ff67a167c1690f1908115610db75760009161343b575b5073ffffffffffffffffffffffffffffffffffffffff811680156133d6578503613371573b1561330c5760141161019c5773ffffffffffffffffffffffffffffffffffffffff9183887fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d604060e0958787602086015195510151168251913560601c82526020820152a391612b6c565b60848d604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152fd5b60848e604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602060448201527f4141313420696e6974436f6465206d7573742072657475726e2073656e6465726064820152fd5b60848f604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601b60448201527f4141313320696e6974436f6465206661696c6564206f72204f4f4700000000006064820152fd5b613454915060203d602011610db057610da181836121ed565b3861327c565b60848d604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b5050600060e087015260006080870152600060a0870152612ac9565b9092915a906060810151916040928351967fffffffff00000000000000000000000000000000000000000000000000000000886135d7606084018461284b565b600060038211613b9f575b7f8dd7712f0000000000000000000000000000000000000000000000000000000094168403613a445750505061379d6000926136b292602088015161363a8a5193849360208501528b602485015260648401906128ec565b90604483015203906136727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0928381018352826121ed565b61379189519485927e42dc5300000000000000000000000000000000000000000000000000000000602085015261020060248501526102248401906123c6565b613760604484018b60806101a091805173ffffffffffffffffffffffffffffffffffffffff808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83820301610204840152876123c6565b039081018352826121ed565b6020918183809351910182305af1600051988652156137bf575b505050505050565b909192939495965060003d8214613a3a575b7fdeaddead00000000000000000000000000000000000000000000000000000000810361385b57608487878051917f220266b600000000000000000000000000000000000000000000000000000000835260048301526024820152600f60448201527f41413935206f7574206f662067617300000000000000000000000000000000006064820152fd5b7fdeadaa510000000000000000000000000000000000000000000000000000000091929395949650146000146138c55750506138a961389e6138b8935a90612443565b608085015190612409565b9083015183611d748295613d65565b905b3880808080806137b7565b909261395290828601518651907ff62676f440ff169a3a9afdbf812e89e7f95975ee8e5c31214ffdef631c5f479273ffffffffffffffffffffffffffffffffffffffff9580878551169401516139483d610800808211613a32575b508a519084818301018c5280825260008583013e8a805194859485528401528a8301906123c6565b0390a35a90612443565b916139636080860193845190612409565b926000905a94829488519761397789613ccc565b948260e08b0151168015600014613a1857505050875116955b5a9003019560a06060820151910151019051860390818111613a04575b5050840290850151928184106000146139de57505080611e68575090816139d89293611d7481613d65565b906138ba565b6139ee9082849397950390613c98565b50611e68575090826139ff92613cf6565b6139d8565b6064919003600a02049094019338806139ad565b90919892509751613a2a575b50613990565b955038613a24565b905038613920565b8181803e516137d1565b613b97945082935090613a8c917e42dc53000000000000000000000000000000000000000000000000000000006020613b6b9501526102006024860152610224850191612709565b613b3a604484018860806101a091805173ffffffffffffffffffffffffffffffffffffffff808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83820301610204840152846123c6565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018952886121ed565b60008761379d565b5081356135e2565b73ffffffffffffffffffffffffffffffffffffffff168015613c3a57600080809381935af1613bd4612450565b5015613bdc57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b73ffffffffffffffffffffffffffffffffffffffff166000526000602052613cc66040600020918254612409565b80915590565b610120610100820151910151808214613cf257480180821015613ced575090565b905090565b5090565b9190917f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f6080602083015192519473ffffffffffffffffffffffffffffffffffffffff946020868851169660e089015116970151916040519283526000602084015260408301526060820152a4565b60208101519051907f67b4fa9642f42120bf031f3051d1824b0fe25627945b27b8a6a65d5761d5482e60208073ffffffffffffffffffffffffffffffffffffffff855116940151604051908152a3565b613dcd604092959493956060835260608301906128ec565b9460208201520152565b8015613e6457600060408051613dec816121d1565b828152826020820152015273ffffffffffffffffffffffffffffffffffffffff811690604065ffffffffffff91828160a01c16908115613e5c575b60d01c92825191613e37836121d1565b8583528460208401521691829101524211908115613e5457509091565b905042109091565b839150613e27565b5060009060009056fea2646970667358221220b094fd69f04977ae9458e5ba422d01cd2d20dbcfca0992ff37f19aa07deec25464736f6c6343000817003360806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b805160205b8181101561015f578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461012857600181146101385761013d565b6000808585888a5af1915061013d565b600080fd5b50600081141561014c57600080fd5b82605501870196505050505050506100e3565b50505056fea264697066735822122035246402746c96964495cae5b36461fd44dfb89f8e6cf6f6b8d60c0aa89f414864736f6c634300070600336080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c634300081100336080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c634300070600336040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000103611b69577f866a5aba21966af95d6c7ab78eb2b2fc913915c28be3b9aa07cc04ff903e3f2890565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000007fc98430eaedbb6070b35b39d798725049088348165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00293373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500a264697066735822122044076f0f3d3e98cb630a498fc0a2c912f7ad287242b118dc449bc36b1fc9d47464736f6c63430008180033", + Bin: "0x6080604052600c80546201000162ff00ff19909116179055601180546001600160a01b03191673dddddddddddddddddddddddddddddddddddddddd17905534801561004957600080fd5b506201d924806200005b6000396000f3fe60806040523480156200001157600080fd5b5060043610620000465760003560e01c806332dc6934146200004b578063a7c15bfc1462000064578063f8ccbf47146200007b575b600080fd5b620000626200005c366004620027dd565b620000a3565b005b6200006262000075366004620027dd565b6200024b565b600c546200008f9062010000900460ff1681565b604051901515815260200160405180910390f35b620000ae8162000259565b604051635a6b63c160e11b815260008051602062003bc08339815191529063b4d6c78290620000e290339060040162002822565b600060405180830381600087803b158015620000fd57600080fd5b505af115801562000112573d6000803e3d6000fd5b5050604051631c72346d60e01b815233600482015260008051602062003bc08339815191529250631c72346d9150602401600060405180830381600087803b1580156200015e57600080fd5b505af115801562000173573d6000803e3d6000fd5b505060405163c88a5e6d60e01b81523360048201526000602482015260008051602062003bc0833981519152925063c88a5e6d9150604401600060405180830381600087803b158015620001c657600080fd5b505af1158015620001db573d6000803e3d6000fd5b505060405163709ecd3f60e01b815260008051602062003bc0833981519152925063709ecd3f9150620002149060109060040162002881565b600060405180830381600087803b1580156200022f57600080fd5b505af115801562000244573d6000803e3d6000fd5b5050505050565b620002568162000259565b50565b80600d62000268828262002a4d565b5050600e54604051632024eee960e11b8152600481019190915260008051602062003bc083398151915290634049ddd290602401600060405180830381600087803b158015620002b757600080fd5b505af1158015620002cc573d6000803e3d6000fd5b50506011546040516303223eab60e11b81526001600160a01b03909116600482015260008051602062003bc083398151915292506306447d569150602401600060405180830381600087803b1580156200032557600080fd5b505af11580156200033a573d6000803e3d6000fd5b5050505062000348620003a0565b62000352620003e8565b6000805160206200e5d283398151915260001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200022f57600080fd5b620003aa6200155f565b620003b4620015ae565b620003be62001716565b620003c862001993565b620003d262001a5a565b620003dc62001bbb565b620003e662001c98565b565b6000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273ca11bde05977b3631167028862be2a173976ca1160405180610f000160405280610ee081526020016201bfe9610ee091396040518363ffffffff1660e01b81526004016200045a92919062002b2a565b600060405180830381600087803b1580156200047557600080fd5b505af11580156200048a573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c7827313b0d85ccb8bf860b6b79af3029fca081ae9bef260405180610660016040528061063081526020016200dfa261063091396040518363ffffffff1660e01b81526004016200050092919062002b2a565b600060405180830381600087803b1580156200051b57600080fd5b505af115801562000530573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c7827369f4d1788e39c87893c980c06edf4b7f686e2938604051806159e001604052806159ae81526020016200e5f26159ae91396040518363ffffffff1660e01b8152600401620005a692919062002b2a565b600060405180830381600087803b158015620005c157600080fd5b505af1158015620005d6573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273fb1bffc9d739b8d520daf37df666da4c687191ea60405180615d200160405280615cf8815260200162003be0615cf891396040518363ffffffff1660e01b81526004016200064c92919062002b2a565b600060405180830381600087803b1580156200066757600080fd5b505af11580156200067c573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273a1dabef33b3b82c7814b6d82a79e50f4ac44102b604051806101c0016040528061019a81526020016200dbf861019a91396040518363ffffffff1660e01b8152600401620006f292919062002b2a565b600060405180830381600087803b1580156200070d57600080fd5b505af115801562000722573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273914d7fec6aac8cd542e72bca78b30650d45643d760405180608001604052806045815260200162009a9b604591396040518363ffffffff1660e01b81526004016200079592919062002b2a565b600060405180830381600087803b158015620007b057600080fd5b505af1158015620007c5573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782734e59b44847b379578588920ca78fbf26c0b4956c60405180608001604052806045815260200162009a9b604591396040518363ffffffff1660e01b81526004016200083892919062002b2a565b600060405180830381600087803b1580156200085357600080fd5b505af115801562000868573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273998739bfdaadde7c933b942a68053933098f9eda604051806102a00160405280610275815260200162009ae061027591396040518363ffffffff1660e01b8152600401620008de92919062002b2a565b600060405180830381600087803b158015620008f957600080fd5b505af11580156200090e573d6000803e3d6000fd5b5050600e5460008051602062003bc0833981519152925063b4d6c78291506e22d473030f116ddee9f6b43ac78ba390620009489062001dec565b6040518363ffffffff1660e01b81526004016200096792919062002b2a565b600060405180830381600087803b1580156200098257600080fd5b505af115801562000997573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782737fc98430eaedbb6070b35b39d79872504908834860405180610240016040528061021081526020016200dd9261021091396040518363ffffffff1660e01b815260040162000a0d92919062002b2a565b600060405180830381600087803b15801562000a2857600080fd5b505af115801562000a3d573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782735ff137d4b0fdcd49dca30c7cf57e578a026d278960405180615cc00160405280615c89815260200162016360615c8991396040518363ffffffff1660e01b815260040162000ab392919062002b2a565b600060405180830381600087803b15801562000ace57600080fd5b505af115801562000ae3573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78273efc2c1444ebcc4db75e7613d20c6a62ff67a167c6040518061020001604052806101c38152602001620098d86101c391396040518363ffffffff1660e01b815260040162000b5992919062002b2a565b600060405180830381600087803b15801562000b7457600080fd5b505af115801562000b89573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c7826f71727de22e5e9d8baf0edac6f37da03260405180613ee00160405280613ea3815260200162009d55613ea391396040518363ffffffff1660e01b815260040162000bfb92919062002b2a565b600060405180830381600087803b15801562000c1657600080fd5b505af115801562000c2b573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782731820a4b7618bde71dce8cdc73aab6c95905fad2460405180610a0001604052806109c581526020016201cec96109c591396040518363ffffffff1660e01b815260040162000ca192919062002b2a565b600060405180830381600087803b15801562000cbc57600080fd5b505af115801562000cd1573d6000803e3d6000fd5b505050506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c782720f3df6d732807ef1319fb7b8bb8522d0beac026040518060a00160405280606181526020016201d88e606191396040518363ffffffff1660e01b815260040162000d4392919062002b2a565b600060405180830381600087803b15801562000d5e57600080fd5b505af115801562000d73573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000dc290730b799c86a49deeb90402691f1041aa3af2d3c8759060019060040162002b6e565b600060405180830381600087803b15801562000ddd57600080fd5b505af115801562000df2573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000e419073ca11bde05977b3631167028862be2a173976ca119060019060040162002b6e565b600060405180830381600087803b15801562000e5c57600080fd5b505af115801562000e71573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000ec0907313b0d85ccb8bf860b6b79af3029fca081ae9bef29060019060040162002b6e565b600060405180830381600087803b15801562000edb57600080fd5b505af115801562000ef0573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000f3f907369f4d1788e39c87893c980c06edf4b7f686e29389060019060040162002b6e565b600060405180830381600087803b15801562000f5a57600080fd5b505af115801562000f6f573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062000fbe9073fb1bffc9d739b8d520daf37df666da4c687191ea9060019060040162002b6e565b600060405180830381600087803b15801562000fd957600080fd5b505af115801562000fee573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200103d9073a1dabef33b3b82c7814b6d82a79e50f4ac44102b9060019060040162002b6e565b600060405180830381600087803b1580156200105857600080fd5b505af11580156200106d573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620010bc9073914d7fec6aac8cd542e72bca78b30650d45643d79060019060040162002b6e565b600060405180830381600087803b158015620010d757600080fd5b505af1158015620010ec573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200113b90734e59b44847b379578588920ca78fbf26c0b4956c9060019060040162002b6e565b600060405180830381600087803b1580156200115657600080fd5b505af11580156200116b573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620011ba9073998739bfdaadde7c933b942a68053933098f9eda9060019060040162002b6e565b600060405180830381600087803b158015620011d557600080fd5b505af1158015620011ea573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b57915062001234906e22d473030f116ddee9f6b43ac78ba39060019060040162002b6e565b600060405180830381600087803b1580156200124f57600080fd5b505af115801562001264573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620012b390737fc98430eaedbb6070b35b39d7987250490883489060019060040162002b6e565b600060405180830381600087803b158015620012ce57600080fd5b505af1158015620012e3573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200133290735ff137d4b0fdcd49dca30c7cf57e578a026d27899060019060040162002b6e565b600060405180830381600087803b1580156200134d57600080fd5b505af115801562001362573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620013b19073efc2c1444ebcc4db75e7613d20c6a62ff67a167c9060019060040162002b6e565b600060405180830381600087803b158015620013cc57600080fd5b505af1158015620013e1573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200142c906f71727de22e5e9d8baf0edac6f37da0329060019060040162002b6e565b600060405180830381600087803b1580156200144757600080fd5b505af11580156200145c573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b579150620014ab90731820a4b7618bde71dce8cdc73aab6c95905fad249060019060040162002b6e565b600060405180830381600087803b158015620014c657600080fd5b505af1158015620014db573d6000803e3d6000fd5b505060405163f8e18b5760e01b815260008051602062003bc0833981519152925063f8e18b5791506200152990720f3df6d732807ef1319fb7b8bb8522d0beac029060019060040162002b6e565b600060405180830381600087803b1580156200154457600080fd5b505af115801562001559573d6000803e3d6000fd5b50505050565b60006200156b62001f22565b905060005b8151811015620015aa57620015a182828151811062001593576200159362002b91565b602002602001015162001fbf565b60010162001570565b5050565b6000620015c4600162048789608a1b01620023f7565b604051630fafdced60e21b815260206004820152602160248201527f506f7274616c52656769737472792e736f6c3a506f7274616c526567697374726044820152607960f81b606482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490608401600060405180830381865afa15801562001654573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200167e919081019062002ba7565b6040518363ffffffff1660e01b81526004016200169d92919062002b2a565b600060405180830381600087803b158015620016b857600080fd5b505af1158015620016cd573d6000803e3d6000fd5b50505050620016dc81620024ce565b600d5460405163189acdbd60e31b81526001600160a01b039091166004820152600162048789608a1b019063c4d66de89060240162000214565b60405163c88a5e6d60e01b8152600262048789608a1b0160048201526a52b7d2dcc80cd2e4000000602482018190529060008051602062003bc08339815191529063c88a5e6d90604401600060405180830381600087803b1580156200177b57600080fd5b505af115801562001790573d6000803e3d6000fd5b505050506000620017aa600262048789608a1b01620023f7565b604051630fafdced60e21b815260206004820152602560248201527f4f6d6e694272696467654e61746976652e736f6c3a4f6d6e694272696467654e604482015264617469766560d81b606482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490608401600060405180830381865afa1580156200183e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001868919081019062002ba7565b6040518363ffffffff1660e01b81526004016200188792919062002b2a565b600060405180830381600087803b158015620018a257600080fd5b505af1158015620018b7573d6000803e3d6000fd5b50505050620018c681620024ce565b600d5460405163189acdbd60e31b81526001600160a01b039091166004820152600262048789608a1b019063c4d66de890602401600060405180830381600087803b1580156200191557600080fd5b505af11580156200192a573d6000803e3d6000fd5b50505050600262048789608a1b016001600160a01b0316316a52b7d2dcc80cd2e400000014620015aa5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c69642062616c616e636560881b60448201526064015b60405180910390fd5b604051630fafdced60e21b815260206004820152600f60248201526e574f6d6e692e736f6c3a574f6d6e6960881b604482015260008051602062003bc08339815191529063b4d6c78290600362048789608a1b01908390633ebf73b490606401600060405180830381865afa15801562001a11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001a3b919081019062002ba7565b6040518363ffffffff1660e01b81526004016200152992919062002b2a565b600062001a70600162333333608a1b01620023f7565b604051630fafdced60e21b81526020600482015260136024820152725374616b696e672e736f6c3a5374616b696e6760681b604482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490606401600060405180830381865afa15801562001aec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001b16919081019062002ba7565b6040518363ffffffff1660e01b815260040162001b3592919062002b2a565b600060405180830381600087803b15801562001b5057600080fd5b505af115801562001b65573d6000803e3d6000fd5b5050505062001b7481620024ce565b600d54600f5460405163400ada7560e01b81526001600160a01b03909216600483015260ff1615156024820152600162333333608a1b019063400ada759060440162000214565b600062001bd1600262333333608a1b01620023f7565b604051630fafdced60e21b8152602060048201526015602482015274536c617368696e672e736f6c3a536c617368696e6760581b604482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490606401600060405180830381865afa15801562001c4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001c79919081019062002ba7565b6040518363ffffffff1660e01b81526004016200021492919062002b2a565b600062001cae600362333333608a1b01620023f7565b604051630fafdced60e21b8152602060048201526013602482015272557067726164652e736f6c3a5570677261646560681b604482015290915060008051602062003bc08339815191529063b4d6c7829083908390633ebf73b490606401600060405180830381865afa15801562001d2a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001d54919081019062002ba7565b6040518363ffffffff1660e01b815260040162001d7392919062002b2a565b600060405180830381600087803b15801562001d8e57600080fd5b505af115801562001da3573d6000803e3d6000fd5b5050505062001db281620024ce565b600d5460405163189acdbd60e31b81526001600160a01b039091166004820152600362333333608a1b019063c4d66de89060240162000214565b6060600060405160200162001e0e90662832b936b4ba1960c91b815260070190565b604051602081830303815290604052805190602001209050600060405160200162001e8e907f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430190565b60408051601f198184030181528282528051602091820120908301819052908201849052606082018690526e22d473030f116ddee9f6b43ac78ba36080830152915060009060a001604051602081830303815290604052805190602001209050604051806123e001604052806123c0815260200162013fa06123c09139611b41810195909552611b67850152509192915050565b604080516002808252606080830184529260208301908036833701905050905062048789608a1b8160008151811062001f5f5762001f5f62002b91565b60200260200101906001600160a01b031690816001600160a01b03168152505062333333608a1b8160018151811062001f9c5762001f9c62002b91565b60200260200101906001600160a01b031690816001600160a01b03168152505090565b63ffffffff811615620020095760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964206e616d65737061636560781b60448201526064016200198a565b60015b610400816001600160a01b031611620023c15760006200202d828462002c76565b9050600362048789608a1b016001600160a01b03821603620020505750620023ac565b60006200205d826200253e565b6200206a57600062002075565b6200207582620023f7565b90506001600160a01b0381163b15620020c45760405162461bcd60e51b815260206004820152601060248201526f1a5b5c1b08185b1c9958591e481cd95d60821b60448201526064016200198a565b60408051635a6b63c160e11b81526001600160a01b038316600482015260248101919091526002604482015261030360f41b606482015260008051602062003bc08339815191529063b4d6c78290608401600060405180830381600087803b1580156200213057600080fd5b505af115801562002145573d6000803e3d6000fd5b5050600d54604051600093508492506001600160a01b03909116906200216b90620027cf565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f080158015620021ae573d6000803e3d6000fd5b5090506000805160206200e5d283398151915260001c6001600160a01b031663b4d6c78284836001600160a01b0316803b806020016040519081016040528181526000908060200190933c6040518363ffffffff1660e01b81526004016200221892919062002b2a565b600060405180830381600087803b1580156200223357600080fd5b505af115801562002248573d6000803e3d6000fd5b50505050620022588383620025eb565b6200226e83620022688362002688565b6200272b565b604051635a6b63c160e11b815260008051602062003bc08339815191529063b4d6c78290620022a290859060040162002822565b600060405180830381600087803b158015620022bd57600080fd5b505af1158015620022d2573d6000803e3d6000fd5b5050604051635a6b63c160e11b815260008051602062003bc0833981519152925063b4d6c78291506200230a90849060040162002822565b600060405180830381600087803b1580156200232557600080fd5b505af11580156200233a573d6000803e3d6000fd5b5050604051631c72346d60e01b81526001600160a01b038416600482015260008051602062003bc08339815191529250631c72346d9150602401600060405180830381600087803b1580156200238f57600080fd5b505af1158015620023a4573d6000803e3d6000fd5b505050505050505b80620023b88162002ca0565b9150506200200c565b50604051635a6b63c160e11b815260008051602062003bc08339815191529063b4d6c78290620002149060009060040162002822565b6000620024048262002795565b620024525760405162461bcd60e51b815260206004820152601b60248201527f5072656465706c6f79733a206e6f742061207072656465706c6f79000000000060448201526064016200198a565b600362048789608a1b016001600160a01b03831603620024b55760405162461bcd60e51b815260206004820152601760248201527f5072656465706c6f79733a206e6f742070726f7869656400000000000000000060448201526064016200198a565b620024c8826001600160a01b0362002cd1565b92915050565b6040516370ca10bb60e01b81526001600160a01b03821660048201527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00602482015267ffffffffffffffff604482015260008051602062003bc0833981519152906370ca10bb9060640162000214565b60006001600160a01b038216600162048789608a1b0114806200257257506001600160a01b038216600262048789608a1b01145b806200258f57506001600160a01b038216600362048789608a1b01145b80620025ac57506001600160a01b038216600162333333608a1b01145b80620025c957506001600160a01b038216600262333333608a1b01145b80620024c857506001600160a01b038216600362333333608a1b011492915050565b6040516370ca10bb60e01b81526001600160a01b0380841660048301527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60248301528216604482015260008051602062003bc0833981519152906370ca10bb906064015b600060405180830381600087803b1580156200266b57600080fd5b505af115801562002680573d6000803e3d6000fd5b505050505050565b604051630667f9d760e41b81526001600160a01b03821660048201527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103602482015260009060008051602062003bc08339815191529063667f9d7090604401602060405180830381865afa15801562002705573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024c8919062002cf4565b6040516370ca10bb60e01b81526001600160a01b0380841660048301527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360248301528216604482015260008051602062003bc0833981519152906370ca10bb9060640162002650565b60006001600160951b03600b83901c1662048789607f1b1480620024c857505062333333607f1b600b9190911c6001600160951b03161490565b610eb18062002d0f83390190565b600060208284031215620027f057600080fd5b813567ffffffffffffffff8111156200280857600080fd5b8201608081850312156200281b57600080fd5b9392505050565b6001600160a01b0391909116815260406020820181905260009082015260600190565b600181811c908216806200285a57607f821691505b6020821081036200287b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000602080835260008454620028978162002845565b8060208701526040600180841660008114620028bc5760018114620028d9576200290b565b60ff19851660408a0152604084151560051b8a010195506200290b565b89600052602060002060005b85811015620029025781548b8201860152908301908801620028e5565b8a016040019650505b509398975050505050505050565b634e487b7160e01b600052604160045260246000fd5b601f8211156200297b576000816000526020600020601f850160051c810160208610156200295a5750805b601f850160051c820191505b81811015620026805782815560010162002966565b505050565b67ffffffffffffffff8311156200299b576200299b62002919565b620029b383620029ac835462002845565b836200292f565b6000601f841160018114620029ea5760008515620029d15750838201355b600019600387901b1c1916600186901b17835562000244565b600083815260209020601f19861690835b8281101562002a1d5786850135825560209485019460019092019101620029fb565b508682101562002a3b5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81356001600160a01b03811680821462002a6657600080fd5b82546001600160a01b031916178255506020820135600182015560028101604083013580151580821462002a9957600080fd5b60ff19835416915060ff8116821783555050506060820135601e1983360301811262002ac457600080fd5b8201803567ffffffffffffffff81111562002ade57600080fd5b60208201915080360382131562002af457600080fd5b6200155981836003860162002980565b60005b8381101562002b2157818101518382015260200162002b07565b50506000910152565b60018060a01b0383168152604060208201526000825180604084015262002b5981606085016020870162002b04565b601f01601f1916919091016060019392505050565b6001600160a01b0392909216825267ffffffffffffffff16602082015260400190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562002bba57600080fd5b815167ffffffffffffffff8082111562002bd357600080fd5b818401915084601f83011262002be857600080fd5b81518181111562002bfd5762002bfd62002919565b604051601f8201601f19908116603f0116810190838211818310171562002c285762002c2862002919565b8160405282815287602084870101111562002c4257600080fd5b62002c5583602083016020880162002b04565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381811683821601908082111562002c995762002c9962002c60565b5092915050565b60006001600160a01b038281166002600160a01b0319810162002cc75762002cc762002c60565b6001019392505050565b6001600160a01b0382811682821603908082111562002c995762002c9962002c60565b60006020828403121562002d0757600080fd5b505191905056fe60a060405260405162000eb138038062000eb18339810160408190526200002691620003cd565b82816200003482826200009c565b505081604051620000459062000366565b6001600160a01b039091168152602001604051809103906000f08015801562000072573d6000803e3d6000fd5b506001600160a01b0316608052620000936200008d60805190565b62000102565b505050620004cb565b620000a78262000174565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000f457620000ef8282620001f4565b505050565b620000fe62000271565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200014460008051602062000e91833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001718162000293565b50565b806001600160a01b03163b600003620001b057604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620002139190620004ad565b600060405180830381855af49150503d806000811462000250576040519150601f19603f3d011682016040523d82523d6000602084013e62000255565b606091505b50909250905062000268858383620002d6565b95945050505050565b3415620002915760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002bf57604051633173bdd160e11b815260006004820152602401620001a7565b8060008051602062000e91833981519152620001d3565b606082620002ef57620002e9826200033c565b62000335565b81511580156200030757506001600160a01b0384163b155b156200033257604051639996b31560e01b81526001600160a01b0385166004820152602401620001a7565b50805b9392505050565b8051156200034d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610524806200096d83390190565b80516001600160a01b03811681146200038c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620003c4578181015183820152602001620003aa565b50506000910152565b600080600060608486031215620003e357600080fd5b620003ee8462000374565b9250620003fe6020850162000374565b60408501519092506001600160401b03808211156200041c57600080fd5b818601915086601f8301126200043157600080fd5b81518181111562000446576200044662000391565b604051601f8201601f19908116603f0116810190838211818310171562000471576200047162000391565b816040528281528960208487010111156200048b57600080fd5b6200049e836020830160208801620003a7565b80955050505050509250925092565b60008251620004c1818460208701620003a7565b9190910192915050565b608051610487620004e66000396000601001526104876000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610312565b8101906100a09190610352565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f5565b505050565b6100ae61026b565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101b457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516102129190610422565b600060405180830381855af49150503d806000811461024d576040519150601f19603f3d011682016040523d82523d6000602084013e610252565b606091505b509150915061026285838361028a565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029f5761029a826102e9565b6102e2565b81511580156102b657506001600160a01b0384163b155b156102df57604051639996b31560e01b81526001600160a01b03851660048201526024016101ab565b50805b9392505050565b8051156102f95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561032257600080fd5b8386111561032f57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561036557600080fd5b82356001600160a01b038116811461037c57600080fd5b9150602083013567ffffffffffffffff8082111561039957600080fd5b818501915085601f8301126103ad57600080fd5b8135818111156103bf576103bf61033c565b604051601f8201601f19908116603f011681019083821181831017156103e7576103e761033c565b8160405282815288602084870101111561040057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b818110156104435760208186018101518583015201610429565b50600092019182525091905056fea264697066735822122050fc77c91d584c02c0e0b72a5eba22ad71f9a2b88784c34d65184ca2ba02195064736f6c63430008180033608060405234801561001057600080fd5b5060405161052438038061052483398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610427806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610093578063ad3cb1cc146100a6578063f2fde38b146100e4575b600080fd5b34801561005b57600080fd5b50610064610104565b005b34801561007257600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b6100646100a1366004610272565b610118565b3480156100b257600080fd5b506100d7604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008a919061038e565b3480156100f057600080fd5b506100646100ff3660046103a8565b610187565b61010c6101ca565b61011660006101f7565b565b6101206101ca565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015090869086906004016103c5565b6000604051808303818588803b15801561016957600080fd5b505af115801561017d573d6000803e3d6000fd5b5050505050505050565b61018f6101ca565b6001600160a01b0381166101be57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6101c7816101f7565b50565b6000546001600160a01b031633146101165760405163118cdaa760e01b81523360048201526024016101b5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101c757600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561028757600080fd5b833561029281610247565b925060208401356102a281610247565b9150604084013567ffffffffffffffff808211156102bf57600080fd5b818601915086601f8301126102d357600080fd5b8135818111156102e5576102e561025c565b604051601f8201601f19908116603f0116810190838211818310171561030d5761030d61025c565b8160405282815289602084870101111561032657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000815180845260005b8181101561036e57602081850181015186830182015201610352565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103a16020830184610348565b9392505050565b6000602082840312156103ba57600080fd5b81356103a181610247565b6001600160a01b03831681526040602082018190526000906103e990830184610348565b94935050505056fea26469706673582212204e6c3564458e40536cebf1d675d2ad7af11c5352eae442784c5e053dcf005af164736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000007109709ecfa91a80626ff3989d68f67f5b1dd12d6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506126fc565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b810190808035906020019092919080359060200190929190505050612732565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b81019080803590602001909291905050506127b9565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127d1565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612b63565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c9d565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612edc565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612f01565b005b348015610d3457600080fd5b50610d3d612f90565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613139565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061313f565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613161565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff16906020019092919050505061331f565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613447565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613639565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506137d8565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613805565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b96565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613c1a565b005b34801561148957600080fd5b5061149261428c565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614296565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061443e565b005b3480156116a457600080fd5b506116ad61449f565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061451d565b005b34801561174a57600080fd5b50611753614950565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614989565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612b63565b5b5050565b611bd2604182614a2c90919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614a66565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614a2c90919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614a9590919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614a9590919063ffffffff16565b614a9590919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b60007fb648d3644f584ed1c2232d53c46d87e693586486ad0d1175f8656013110b714e3386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183600181111561266b57fe5b8152602001828103825284818151815260200191508051906020019080838360005b838110156126a857808201518184015260208101905061268d565b50505050905090810190601f1680156126d55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a16126f285858585614ab4565b9050949350505050565b6000606061270c868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561275057600080fd5b506040519080825280601f01601f1916602001820160405280156127835781602001600182028036833780820191505090505b50905060005b838110156127ae57808501548060208302602085010152508080600101915050612789565b508091505092915050565b60076020528060005260406000206000915090505481565b6127d9614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128435750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612b6b614989565b600354811115612be3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612c5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000606060055433600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed8d8d8d8d8d8d8d8d8d8d8d8c604051808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612d5057fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528e8e82818152602001925080828437600081840152601f19601f820116905080830192505050848103835286818151815260200191508051906020019080838360005b83811015612e0a578082015181840152602081019050612def565b50505050905090810190601f168015612e375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612e70578082015181840152602081019050612e55565b50505050905090810190601f168015612e9d5780820380516001836020036101000a031916815260200191505b509f5050505050505050505050505050505060405180910390a1612eca8d8d8d8d8d8d8d8d8d8d8d614c9a565b9150509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612f7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612f8a84848484611bbe565b50505050565b6060600060035467ffffffffffffffff81118015612fad57600080fd5b50604051908082528060200260200182016040528015612fdc5781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613130578083838151811061308757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050613046565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6131ac8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050896151d7565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131ea576131e9846156d7565b5b6132388787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615706565b60008211156132525761325082600060018685615941565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a9050613376878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615b47565b61337f57600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340c5780820151818401526020810190506133f1565b50505050905090810190601f1680156134395780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561346257600080fd5b506040519080825280602002602001820160405280156134915781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135645750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561356f57508482105b1561362a578084838151811061358157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506134fa565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561373b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006137ed8c8c8c8c8c8c8c8c8c8c8c614296565b8051906020012090509b9a5050505050505050505050565b61380d614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156138775750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6138e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613b9e614989565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613c22614989565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c8c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015613cc457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613ea15750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614013576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561432757fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6143b361449f565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b614446614989565b61444f816156d7565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6144cd6125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b614525614989565b8060016003540310156145a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561460a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61467c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461477c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1806004541461494b5761494a81612b63565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614a3f5760009050614a60565b6000828402905082848281614a5057fe5b0414614a5b57600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614aaa57600080fd5b8091505092915050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015614b7f5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b614bf1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b614bfe858585855a615b47565b90508015614c4e573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2614c92565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000806000614cb48e8e8e8e8e8e8e8e8e8e600554614296565b905060056000815480929190600101919050555080805190602001209150614cdd828286612f01565b506000614ce8615b93565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614ece578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115614d8b57fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015614e5d578082015181840152602081019050614e42565b50505050905090810190601f168015614e8a5780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015614eb557600080fd5b505af1158015614ec9573d6000803e3d6000fd5b505050505b6101f4614ef56109c48b01603f60408d0281614ee657fe5b04615bc490919063ffffffff16565b015a1015614f6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a9050614fd48f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d14614fc9578e614fcf565b6109c45a035b615b47565b9350614fe95a82615bde90919063ffffffff16565b90508380614ff8575060008a14155b80615004575060008814155b615076576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156150905761508d828b8b8b8b615941565b90505b84156150da577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a161511a565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146151c6578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156151ad57600080fd5b505af11580156151c1573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b60006004541461524f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b81518111156152c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600181101561533d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b835181101561564357600084828151811061535d57fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153d15750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561540957503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561544157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b6154b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146155b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809250508080600101915050615346565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461593d576158ca8260008360015a615b47565b61593c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461597e5782615980565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615a98576159ea3a86106159c7573a6159c9565b855b6159dc888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615b3d565b615abd85615aaf888a614a9590919063ffffffff16565b614a2c90919063ffffffff16565b9150615aca848284615bfe565b615b3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600180811115615b5557fe5b836001811115615b6157fe5b1415615b7a576000808551602087018986f49050615b8a565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015615bd45781615bd6565b825b905092915050565b600082821115615bed57600080fd5b600082840390508091505092915050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615ca55760208114615cad5760009350615cb8565b819350615cb8565b600051158215171593505b505050939250505056fea2646970667358221220047fac33099ca576d1c4f1ac6a8abdb0396e42ad6a397d2cb2f4dc1624cc0c5b64736f6c634300070600336080600436101561000f57600080fd5b6000803560e01c63570e1a361461002557600080fd5b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576004359167ffffffffffffffff9081841161018657366023850112156101865783600401358281116101825736602482870101116101825780601411610182577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec810192808411610155577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8501160116830190838210908211176101555792846024819482600c60209a968b9960405286845289840196603889018837830101525193013560601c5af1908051911561014d575b5073ffffffffffffffffffffffffffffffffffffffff60405191168152f35b90503861012e565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8380fd5b8280fd5b80fdfea26469706673582212207adef8895ad3393b02fab10a111d85ea80ff35366aa43995f4ea20e67f29200664736f6c634300081700337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf360806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000998739bfdaadde7c933b942a68053933098f9eda73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c6343000706003360806040526004361015610024575b361561001957600080fd5b61002233612748565b005b60003560e01c806242dc5314611b0057806301ffc9a7146119ae5780630396cb60146116765780630bd28e3b146115fa5780631b2e01b814611566578063205c2878146113d157806322cdde4c1461136b57806335567e1a146112b35780635287ce12146111a557806370a0823114611140578063765e827f14610e82578063850aaf6214610dc35780639b249f6914610c74578063b760faf914610c3a578063bb9fe6bf14610a68578063c23a5cea146107c4578063dbed18e0146101a15763fc7e286d0361000e573461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5773ffffffffffffffffffffffffffffffffffffffff61013a61229f565b16600052600060205260a0604060002065ffffffffffff6001825492015460405192835260ff8116151560208401526dffffffffffffffffffffffffffff8160081c16604084015263ffffffff8160781c16606084015260981c166080820152f35b600080fd5b3461019c576101af36612317565b906101b86129bd565b60009160005b82811061056f57506101d08493612588565b6000805b8481106102fc5750507fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000809360005b81811061024757610240868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2613ba7565b6001600255005b6102a261025582848a612796565b73ffffffffffffffffffffffffffffffffffffffff6102766020830161282a565b167f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a2806127d6565b906000915b8083106102b957505050600101610209565b909194976102f36102ed6001926102e78c8b6102e0826102da8e8b8d61269d565b9261265a565b5191613597565b90612409565b99612416565b950191906102a7565b6020610309828789612796565b61031f61031682806127d6565b9390920161282a565b9160009273ffffffffffffffffffffffffffffffffffffffff8091165b8285106103505750505050506001016101d4565b909192939561037f83610378610366848c61265a565b516103728b898b61269d565b856129f6565b9290613dd7565b9116840361050a576104a5576103958491613dd7565b9116610440576103b5576103aa600191612416565b96019392919061033c565b60a487604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b608488604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b608488604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b608489604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b61057a818487612796565b9361058585806127d6565b919095602073ffffffffffffffffffffffffffffffffffffffff6105aa82840161282a565b1697600192838a1461076657896105da575b5050505060019293949550906105d191612409565b939291016101be565b8060406105e892019061284b565b918a3b1561019c57929391906040519485937f2dd8113300000000000000000000000000000000000000000000000000000000855288604486016040600488015252606490818601918a60051b8701019680936000915b8c83106106e657505050505050838392610684927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8560009803016024860152612709565b03818a5afa90816106d7575b506106c657602486604051907f86a9f7500000000000000000000000000000000000000000000000000000000082526004820152fd5b93945084936105d1600189806105bc565b6106e0906121bd565b88610690565b91939596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c908a9294969a0301865288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee18336030181121561019c57836107538793858394016128ec565b9a0196019301909189979695949261063f565b606483604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b3461019c576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c576107fc61229f565b33600052600082526001604060002001908154916dffffffffffffffffffffffffffff8360081c16928315610a0a5765ffffffffffff8160981c1680156109ac57421061094e5760009373ffffffffffffffffffffffffffffffffffffffff859485947fffffffffffffff000000000000000000000000000000000000000000000000ff86951690556040517fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda33391806108da8786836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0390a2165af16108e8612450565b50156108f057005b606490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b606485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b606486604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b606485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b3461019c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c573360005260006020526001604060002001805463ffffffff8160781c16908115610bdc5760ff1615610b7e5765ffffffffffff908142160191818311610b4f5780547fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff001678ffffffffffff00000000000000000000000000000000000000609885901b161790556040519116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a2005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c57610022610c6f61229f565b612748565b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760043567ffffffffffffffff811161019c576020610cc8610d1b9236906004016122c2565b919073ffffffffffffffffffffffffffffffffffffffff9260405194859283927f570e1a360000000000000000000000000000000000000000000000000000000084528560048501526024840191612709565b03816000857f000000000000000000000000efc2c1444ebcc4db75e7613d20c6a62ff67a167c165af1908115610db757602492600092610d86575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b610da991925060203d602011610db0575b610da181836121ed565b8101906126dd565b9083610d56565b503d610d97565b6040513d6000823e3d90fd5b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c57610dfa61229f565b60243567ffffffffffffffff811161019c57600091610e1e839236906004016122c2565b90816040519283928337810184815203915af4610e39612450565b90610e7e6040519283927f99410554000000000000000000000000000000000000000000000000000000008452151560048401526040602484015260448301906123c6565b0390fd5b3461019c57610e9036612317565b610e9b9291926129bd565b610ea483612588565b60005b848110610f1c57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000915b858310610eec576102408585613ba7565b909193600190610f12610f0087898761269d565b610f0a888661265a565b519088613597565b0194019190610edb565b610f47610f40610f2e8385979561265a565b51610f3a84898761269d565b846129f6565b9190613dd7565b73ffffffffffffffffffffffffffffffffffffffff929183166110db5761107657610f7190613dd7565b911661101157610f8657600101929092610ea7565b60a490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b608482604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b608483604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b608484604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5773ffffffffffffffffffffffffffffffffffffffff61118c61229f565b1660005260006020526020604060002054604051908152f35b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5773ffffffffffffffffffffffffffffffffffffffff6111f161229f565b6000608060405161120181612155565b828152826020820152826040820152826060820152015216600052600060205260a06040600020608060405161123681612155565b6001835493848352015490602081019060ff8316151582526dffffffffffffffffffffffffffff60408201818560081c16815263ffffffff936060840193858760781c16855265ffffffffffff978891019660981c1686526040519788525115156020880152511660408601525116606084015251166080820152f35b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760206112ec61229f565b73ffffffffffffffffffffffffffffffffffffffff6113096122f0565b911660005260018252604060002077ffffffffffffffffffffffffffffffffffffffffffffffff821660005282526040600020547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b3461019c577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60208136011261019c576004359067ffffffffffffffff821161019c5761012090823603011261019c576113c9602091600401612480565b604051908152f35b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5761140861229f565b60243590336000526000602052604060002090815491828411611508576000808573ffffffffffffffffffffffffffffffffffffffff8295839561144c848a612443565b90556040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af16114a2612450565b50156114aa57005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5761159d61229f565b73ffffffffffffffffffffffffffffffffffffffff6115ba6122f0565b9116600052600160205277ffffffffffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760043577ffffffffffffffffffffffffffffffffffffffffffffffff811680910361019c5733600052600160205260406000209060005260205260406000206116728154612416565b9055005b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760043563ffffffff9182821680920361019c5733600052600081526040600020928215611950576001840154908160781c1683106118f2576116f86dffffffffffffffffffffffffffff9182349160081c16612409565b93841561189457818511611836579065ffffffffffff61180592546040519061172082612155565b8152848101926001845260408201908816815260608201878152600160808401936000855233600052600089526040600020905181550194511515917fffffffffffffffffffffffffff0000000000000000000000000000000000000060ff72ffffffff0000000000000000000000000000006effffffffffffffffffffffffffff008954945160081b16945160781b1694169116171717835551167fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff78ffffffffffff0000000000000000000000000000000000000083549260981b169116179055565b6040519283528201527fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c0160403392a2005b606483604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b606483604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b606482604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b606482604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019c57807f60fc6b6e0000000000000000000000000000000000000000000000000000000060209214908115611ad6575b8115611aac575b8115611a82575b8115611a58575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482611a4d565b7f3e84f0210000000000000000000000000000000000000000000000000000000081149150611a46565b7fcf28ef970000000000000000000000000000000000000000000000000000000081149150611a3f565b7f915074d80000000000000000000000000000000000000000000000000000000081149150611a38565b3461019c576102007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5767ffffffffffffffff60043581811161019c573660238201121561019c57611b62903690602481600401359101612268565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101c0811261019c5761014060405191611b9e83612155565b1261019c5760405192611bb0846121a0565b60243573ffffffffffffffffffffffffffffffffffffffff8116810361019c578452602093604435858201526064356040820152608435606082015260a435608082015260c43560a082015260e43560c08201526101043573ffffffffffffffffffffffffffffffffffffffff8116810361019c5760e08201526101243561010082015261014435610120820152825261016435848301526101843560408301526101a43560608301526101c43560808301526101e43590811161019c57611c7c9036906004016122c2565b905a3033036120f7578351606081015195603f5a0260061c61271060a0840151890101116120ce5760009681519182611ff0575b5050505090611cca915a9003608085015101923691612268565b925a90600094845193611cdc85613ccc565b9173ffffffffffffffffffffffffffffffffffffffff60e0870151168015600014611ea957505073ffffffffffffffffffffffffffffffffffffffff855116935b5a9003019360a06060820151910151016080860151850390818111611e95575b50508302604085015192818410600014611dce5750506003811015611da157600203611d79576113c99293508093611d7481613d65565b613cf6565b5050507fdeadaa51000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b81611dde92979396940390613c98565b506003841015611e6857507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f60808683015192519473ffffffffffffffffffffffffffffffffffffffff865116948873ffffffffffffffffffffffffffffffffffffffff60e0890151169701519160405192835215898301528760408301526060820152a46113c9565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526021600452fd5b6064919003600a0204909301928780611d3d565b8095918051611eba575b5050611d1d565b6003861015611fc1576002860315611eb35760a088015190823b1561019c57600091611f2491836040519586809581947f7c627b210000000000000000000000000000000000000000000000000000000083528d60048401526080602484015260848301906123c6565b8b8b0260448301528b60648301520393f19081611fad575b50611fa65787893d610800808211611f9e575b506040519282828501016040528184528284013e610e7e6040519283927fad7954bc000000000000000000000000000000000000000000000000000000008452600484015260248301906123c6565b905083611f4f565b8980611eb3565b611fb89199506121bd565b6000978a611f3c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91600092918380938c73ffffffffffffffffffffffffffffffffffffffff885116910192f115612023575b808080611cb0565b611cca929195503d6108008082116120c6575b5060405190888183010160405280825260008983013e805161205f575b5050600194909161201b565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20188870151918973ffffffffffffffffffffffffffffffffffffffff8551169401516120bc604051928392835260408d84015260408301906123c6565b0390a38680612053565b905088612036565b877fdeaddead000000000000000000000000000000000000000000000000000000006000526000fd5b606486604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b60a0810190811067ffffffffffffffff82111761217157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610140810190811067ffffffffffffffff82111761217157604052565b67ffffffffffffffff811161217157604052565b6060810190811067ffffffffffffffff82111761217157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761217157604052565b67ffffffffffffffff811161217157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926122748261222e565b9161228260405193846121ed565b82948184528183011161019c578281602093846000960137010152565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361019c57565b9181601f8401121561019c5782359167ffffffffffffffff831161019c576020838186019501011161019c57565b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361019c57565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261019c5760043567ffffffffffffffff9283821161019c578060238301121561019c57816004013593841161019c5760248460051b8301011161019c57602401919060243573ffffffffffffffffffffffffffffffffffffffff8116810361019c5790565b60005b8381106123b65750506000910152565b81810151838201526020016123a6565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612402815180928187528780880191016123a3565b0116010190565b91908201809211610b4f57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610b4f5760010190565b91908203918211610b4f57565b3d1561247b573d906124618261222e565b9161246f60405193846121ed565b82523d6000602084013e565b606090565b604061248e8183018361284b565b90818351918237206124a3606084018461284b565b90818451918237209260c06124bb60e083018361284b565b908186519182372091845195602087019473ffffffffffffffffffffffffffffffffffffffff833516865260208301358789015260608801526080870152608081013560a087015260a081013582870152013560e08501526101009081850152835261012083019167ffffffffffffffff918484108385111761217157838252845190206101408501908152306101608601524661018086015260608452936101a00191821183831017612171575251902090565b67ffffffffffffffff81116121715760051b60200190565b9061259282612570565b6040906125a260405191826121ed565b8381527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06125d08295612570565b019160005b8381106125e25750505050565b60209082516125f081612155565b83516125fb816121a0565b600081526000849181838201528187820152816060818184015260809282848201528260a08201528260c08201528260e082015282610100820152826101208201528652818587015281898701528501528301528286010152016125d5565b805182101561266e5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919081101561266e5760051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee18136030182121561019c570190565b9081602091031261019c575173ffffffffffffffffffffffffffffffffffffffff8116810361019c5790565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b7f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4602073ffffffffffffffffffffffffffffffffffffffff61278a3485613c98565b936040519485521692a2565b919081101561266e5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18136030182121561019c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561019c570180359067ffffffffffffffff821161019c57602001918160051b3603831361019c57565b3573ffffffffffffffffffffffffffffffffffffffff8116810361019c5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561019c570180359067ffffffffffffffff821161019c5760200191813603831361019c57565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561019c57016020813591019167ffffffffffffffff821161019c57813603831361019c57565b61012091813573ffffffffffffffffffffffffffffffffffffffff811680910361019c576129626129476129ba9561299b93855260208601356020860152612937604087018761289c565b9091806040880152860191612709565b612954606086018661289c565b908583036060870152612709565b6080840135608084015260a084013560a084015260c084013560c084015261298d60e085018561289c565b9084830360e0860152612709565b916129ac610100918281019061289c565b929091818503910152612709565b90565b60028054146129cc5760028055565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b926000905a93805194843573ffffffffffffffffffffffffffffffffffffffff811680910361019c5786526020850135602087015260808501356fffffffffffffffffffffffffffffffff90818116606089015260801c604088015260a086013560c088015260c086013590811661010088015260801c610120870152612a8060e086018661284b565b801561357b576034811061351d578060141161019c578060241161019c5760341161019c57602481013560801c60a0880152601481013560801c60808801523560601c60e08701525b612ad285612480565b60208301526040860151946effffffffffffffffffffffffffffff8660c08901511760608901511760808901511760a0890151176101008901511761012089015117116134bf57604087015160608801510160808801510160a08801510160c0880151016101008801510296835173ffffffffffffffffffffffffffffffffffffffff81511690612b66604085018561284b565b806131e4575b505060e0015173ffffffffffffffffffffffffffffffffffffffff1690600082156131ac575b6020612bd7918b828a01516000868a604051978896879586937f19822f7c00000000000000000000000000000000000000000000000000000000855260048501613db5565b0393f160009181613178575b50612c8b573d8c610800808311612c83575b50604051916020818401016040528083526000602084013e610e7e6040519283927f65c8fd4d000000000000000000000000000000000000000000000000000000008452600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a48301906123c6565b915082612bf5565b9a92939495969798999a91156130f2575b509773ffffffffffffffffffffffffffffffffffffffff835116602084015190600052600160205260406000208160401c60005260205267ffffffffffffffff604060002091825492612cee84612416565b9055160361308d575a8503116130285773ffffffffffffffffffffffffffffffffffffffff60e0606093015116612d42575b509060a09184959697986040608096015260608601520135905a900301910152565b969550505a9683519773ffffffffffffffffffffffffffffffffffffffff60e08a01511680600052600060205260406000208054848110612fc3576080612dcd9a9b9c600093878094039055015192602089015183604051809d819582947f52b7512c0000000000000000000000000000000000000000000000000000000084528c60048501613db5565b039286f1978860009160009a612f36575b50612e86573d8b610800808311612e7e575b50604051916020818401016040528083526000602084013e610e7e6040519283927f65c8fd4d000000000000000000000000000000000000000000000000000000008452600484015260606024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a48301906123c6565b915082612df0565b9991929394959697989998925a900311612eab57509096959094939291906080612d20565b60a490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602760448201527f41413336206f766572207061796d6173746572566572696669636174696f6e4760648201527f61734c696d6974000000000000000000000000000000000000000000000000006084820152fd5b915098503d90816000823e612f4b82826121ed565b604081838101031261019c5780519067ffffffffffffffff821161019c57828101601f83830101121561019c578181015191612f868361222e565b93612f9460405195866121ed565b838552820160208483850101011161019c57602092612fba9184808701918501016123a3565b01519838612dde565b60848b604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601e60448201527f41413331207061796d6173746572206465706f73697420746f6f206c6f7700006064820152fd5b608490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601e60448201527f41413236206f76657220766572696669636174696f6e4761734c696d697400006064820152fd5b608482604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601a60448201527f4141323520696e76616c6964206163636f756e74206e6f6e63650000000000006064820152fd5b600052600060205260406000208054808c11613113578b9003905538612c9c565b608484604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152fd5b9091506020813d6020116131a4575b81613194602093836121ed565b8101031261019c57519038612be3565b3d9150613187565b508060005260006020526040600020548a81116000146131d75750612bd7602060005b915050612b92565b6020612bd7918c036131cf565b833b61345a57604088510151602060405180927f570e1a360000000000000000000000000000000000000000000000000000000082528260048301528160008161323260248201898b612709565b039273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000efc2c1444ebcc4db75e7613d20c6a62ff67a167c1690f1908115610db75760009161343b575b5073ffffffffffffffffffffffffffffffffffffffff811680156133d6578503613371573b1561330c5760141161019c5773ffffffffffffffffffffffffffffffffffffffff9183887fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d604060e0958787602086015195510151168251913560601c82526020820152a391612b6c565b60848d604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152fd5b60848e604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602060448201527f4141313420696e6974436f6465206d7573742072657475726e2073656e6465726064820152fd5b60848f604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601b60448201527f4141313320696e6974436f6465206661696c6564206f72204f4f4700000000006064820152fd5b613454915060203d602011610db057610da181836121ed565b3861327c565b60848d604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b5050600060e087015260006080870152600060a0870152612ac9565b9092915a906060810151916040928351967fffffffff00000000000000000000000000000000000000000000000000000000886135d7606084018461284b565b600060038211613b9f575b7f8dd7712f0000000000000000000000000000000000000000000000000000000094168403613a445750505061379d6000926136b292602088015161363a8a5193849360208501528b602485015260648401906128ec565b90604483015203906136727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0928381018352826121ed565b61379189519485927e42dc5300000000000000000000000000000000000000000000000000000000602085015261020060248501526102248401906123c6565b613760604484018b60806101a091805173ffffffffffffffffffffffffffffffffffffffff808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83820301610204840152876123c6565b039081018352826121ed565b6020918183809351910182305af1600051988652156137bf575b505050505050565b909192939495965060003d8214613a3a575b7fdeaddead00000000000000000000000000000000000000000000000000000000810361385b57608487878051917f220266b600000000000000000000000000000000000000000000000000000000835260048301526024820152600f60448201527f41413935206f7574206f662067617300000000000000000000000000000000006064820152fd5b7fdeadaa510000000000000000000000000000000000000000000000000000000091929395949650146000146138c55750506138a961389e6138b8935a90612443565b608085015190612409565b9083015183611d748295613d65565b905b3880808080806137b7565b909261395290828601518651907ff62676f440ff169a3a9afdbf812e89e7f95975ee8e5c31214ffdef631c5f479273ffffffffffffffffffffffffffffffffffffffff9580878551169401516139483d610800808211613a32575b508a519084818301018c5280825260008583013e8a805194859485528401528a8301906123c6565b0390a35a90612443565b916139636080860193845190612409565b926000905a94829488519761397789613ccc565b948260e08b0151168015600014613a1857505050875116955b5a9003019560a06060820151910151019051860390818111613a04575b5050840290850151928184106000146139de57505080611e68575090816139d89293611d7481613d65565b906138ba565b6139ee9082849397950390613c98565b50611e68575090826139ff92613cf6565b6139d8565b6064919003600a02049094019338806139ad565b90919892509751613a2a575b50613990565b955038613a24565b905038613920565b8181803e516137d1565b613b97945082935090613a8c917e42dc53000000000000000000000000000000000000000000000000000000006020613b6b9501526102006024860152610224850191612709565b613b3a604484018860806101a091805173ffffffffffffffffffffffffffffffffffffffff808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83820301610204840152846123c6565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018952886121ed565b60008761379d565b5081356135e2565b73ffffffffffffffffffffffffffffffffffffffff168015613c3a57600080809381935af1613bd4612450565b5015613bdc57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b73ffffffffffffffffffffffffffffffffffffffff166000526000602052613cc66040600020918254612409565b80915590565b610120610100820151910151808214613cf257480180821015613ced575090565b905090565b5090565b9190917f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f6080602083015192519473ffffffffffffffffffffffffffffffffffffffff946020868851169660e089015116970151916040519283526000602084015260408301526060820152a4565b60208101519051907f67b4fa9642f42120bf031f3051d1824b0fe25627945b27b8a6a65d5761d5482e60208073ffffffffffffffffffffffffffffffffffffffff855116940151604051908152a3565b613dcd604092959493956060835260608301906128ec565b9460208201520152565b8015613e6457600060408051613dec816121d1565b828152826020820152015273ffffffffffffffffffffffffffffffffffffffff811690604065ffffffffffff91828160a01c16908115613e5c575b60d01c92825191613e37836121d1565b8583528460208401521691829101524211908115613e5457509091565b905042109091565b839150613e27565b5060009060009056fea2646970667358221220b094fd69f04977ae9458e5ba422d01cd2d20dbcfca0992ff37f19aa07deec25464736f6c6343000817003360806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b805160205b8181101561015f578083015160f81c6001820184015160601c60158301850151603584018601516055850187016000856000811461012857600181146101385761013d565b6000808585888a5af1915061013d565b600080fd5b50600081141561014c57600080fd5b82605501870196505050505050506100e3565b50505056fea264697066735822122035246402746c96964495cae5b36461fd44dfb89f8e6cf6f6b8d60c0aa89f414864736f6c634300070600336080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c634300081100336080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d6080604052600436106101dc5760003560e01c8063affed0e011610102578063e19a9dd911610095578063f08a032311610064578063f08a032314611647578063f698da2514611698578063f8dc5dd9146116c3578063ffa1ad741461173e57610231565b8063e19a9dd91461139b578063e318b52b146113ec578063e75235b81461147d578063e86637db146114a857610231565b8063cc2f8452116100d1578063cc2f8452146110e8578063d4d9bdcd146111b5578063d8d11f78146111f0578063e009cfde1461132a57610231565b8063affed0e014610d94578063b4faba0914610dbf578063b63e800d14610ea7578063c4ca3a9c1461101757610231565b80635624b25b1161017a5780636a761202116101495780636a761202146109945780637d83297414610b50578063934f3a1114610bbf578063a0e67e2b14610d2857610231565b80635624b25b146107fb5780635ae6bd37146108b9578063610b592514610908578063694e80c31461095957610231565b80632f54bf6e116101b65780632f54bf6e146104d35780633408e4701461053a578063468721a7146105655780635229073f1461067a57610231565b80630d582f131461029e57806312fb68e0146102f95780632d9ad53d1461046c57610231565b36610231573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561023d57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905080548061027257600080f35b36600080373360601b365260008060143601600080855af13d6000803e80610299573d6000fd5b3d6000f35b3480156102aa57600080fd5b506102f7600480360360408110156102c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ce565b005b34801561030557600080fd5b5061046a6004803603608081101561031c57600080fd5b81019080803590602001909291908035906020019064010000000081111561034357600080fd5b82018360208201111561035557600080fd5b8035906020019184600183028401116401000000008311171561037757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156103da57600080fd5b8201836020820111156103ec57600080fd5b8035906020019184600183028401116401000000008311171561040e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611bbe565b005b34801561047857600080fd5b506104bb6004803603602081101561048f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612440565b60405180821515815260200191505060405180910390f35b3480156104df57600080fd5b50610522600480360360208110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612512565b60405180821515815260200191505060405180910390f35b34801561054657600080fd5b5061054f6125e4565b6040518082815260200191505060405180910390f35b34801561057157600080fd5b506106626004803603608081101561058857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184600183028401116401000000008311171561060357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506125f1565b60405180821515815260200191505060405180910390f35b34801561068657600080fd5b506107776004803603608081101561069d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156106e457600080fd5b8201836020820111156106f657600080fd5b8035906020019184600183028401116401000000008311171561071857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff1690602001909291905050506127d7565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107bf5780820151818401526020810190506107a4565b50505050905090810190601f1680156107ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561080757600080fd5b5061083e6004803603604081101561081e57600080fd5b81019080803590602001909291908035906020019092919050505061280d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561087e578082015181840152602081019050610863565b50505050905090810190601f1680156108ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c557600080fd5b506108f2600480360360208110156108dc57600080fd5b8101908080359060200190929190505050612894565b6040518082815260200191505060405180910390f35b34801561091457600080fd5b506109576004803603602081101561092b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ac565b005b34801561096557600080fd5b506109926004803603602081101561097c57600080fd5b8101908080359060200190929190505050612c3e565b005b610b3860048036036101408110156109ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156109f257600080fd5b820183602082011115610a0457600080fd5b80359060200191846001830284011164010000000083111715610a2657600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610ab257600080fd5b820183602082011115610ac457600080fd5b80359060200191846001830284011164010000000083111715610ae657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d78565b60405180821515815260200191505060405180910390f35b348015610b5c57600080fd5b50610ba960048036036040811015610b7357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132b5565b6040518082815260200191505060405180910390f35b348015610bcb57600080fd5b50610d2660048036036060811015610be257600080fd5b810190808035906020019092919080359060200190640100000000811115610c0957600080fd5b820183602082011115610c1b57600080fd5b80359060200191846001830284011164010000000083111715610c3d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ca057600080fd5b820183602082011115610cb257600080fd5b80359060200191846001830284011164010000000083111715610cd457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506132da565b005b348015610d3457600080fd5b50610d3d613369565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d80578082015181840152602081019050610d65565b505050509050019250505060405180910390f35b348015610da057600080fd5b50610da9613512565b6040518082815260200191505060405180910390f35b348015610dcb57600080fd5b50610ea560048036036040811015610de257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e1f57600080fd5b820183602082011115610e3157600080fd5b80359060200191846001830284011164010000000083111715610e5357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613518565b005b348015610eb357600080fd5b506110156004803603610100811015610ecb57600080fd5b8101908080359060200190640100000000811115610ee857600080fd5b820183602082011115610efa57600080fd5b80359060200191846020830284011164010000000083111715610f1c57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610f6757600080fd5b820183602082011115610f7957600080fd5b80359060200191846001830284011164010000000083111715610f9b57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061353a565b005b34801561102357600080fd5b506110d26004803603608081101561103a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108157600080fd5b82018360208201111561109357600080fd5b803590602001918460018302840111640100000000831117156110b557600080fd5b9091929391929390803560ff1690602001909291905050506136f8565b6040518082815260200191505060405180910390f35b3480156110f457600080fd5b506111416004803603604081101561110b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613820565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b838110156111a0578082015181840152602081019050611185565b50505050905001935050505060405180910390f35b3480156111c157600080fd5b506111ee600480360360208110156111d857600080fd5b8101908080359060200190929190505050613a12565b005b3480156111fc57600080fd5b50611314600480360361014081101561121457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561125b57600080fd5b82018360208201111561126d57600080fd5b8035906020019184600183028401116401000000008311171561128f57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613bb1565b6040518082815260200191505060405180910390f35b34801561133657600080fd5b506113996004803603604081101561134d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613bde565b005b3480156113a757600080fd5b506113ea600480360360208110156113be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f6f565b005b3480156113f857600080fd5b5061147b6004803603606081101561140f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ff3565b005b34801561148957600080fd5b50611492614665565b6040518082815260200191505060405180910390f35b3480156114b457600080fd5b506115cc60048036036101408110156114cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561151357600080fd5b82018360208201111561152557600080fd5b8035906020019184600183028401116401000000008311171561154757600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061466f565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561160c5780820151818401526020810190506115f1565b50505050905090810190601f1680156116395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561165357600080fd5b506116966004803603602081101561166a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614817565b005b3480156116a457600080fd5b506116ad614878565b6040518082815260200191505060405180910390f35b3480156116cf57600080fd5b5061173c600480360360608110156116e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506148f6565b005b34801561174a57600080fd5b50611753614d29565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611793578082015181840152602081019050611778565b50505050905090810190601f1680156117c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6117d6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118405750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561187857503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611bba57611bb981612c3e565b5b5050565b611bd2604182614e0590919063ffffffff16565b82511015611c48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b8681101561243457611c648882614e3f565b80945081955082965050505060008460ff16141561206d578260001c9450611c96604188614e0590919063ffffffff16565b8260001c1015611d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8751611d2760208460001c614e6e90919063ffffffff16565b1115611d9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a01015190508851611dd182611dc360208760001c614e6e90919063ffffffff16565b614e6e90919063ffffffff16565b1115611e45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8d846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015611ee7578082015181840152602081019050611ecc565b50505050905090810190601f168015611f145780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015611f4d578082015181840152602081019050611f32565b50505050905090810190601f168015611f7a5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d6020811015611fc357600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612066576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506122b2565b60018460ff161415612181578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210a57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b61217c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122b1565b601e8460ff1611156122495760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612238573d6000803e3d6000fd5b5050506020604051035194506122b0565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156122a3573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156123795750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123b25750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050611c52565b50505050505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561250b5750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156125dd5750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000804690508091505090565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156126bc5750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b61272e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61273b858585855a614e8d565b9050801561278b573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a26127cf565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b600060606127e7868686866125f1565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff8111801561282b57600080fd5b506040519080825280601f01601f19166020018201604052801561285e5781602001600182028036833780820191505090505b50905060005b8381101561288957808501548060208302602085010152508080600101915050612864565b508091505092915050565b60076020528060005260406000206000915090505481565b6128b4614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561291e5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b612c46614d62565b600354811115612cbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612d35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806000612d928e8e8e8e8e8e8e8e8e8e60055461466f565b905060056000815480929190600101919050555080805190602001209150612dbb8282866132da565b506000612dc6614ed9565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fac578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a6001811115612e6957fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b83811015612f3b578082015181840152602081019050612f20565b50505050905090810190601f168015612f685780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b158015612f9357600080fd5b505af1158015612fa7573d6000803e3d6000fd5b505050505b6101f4612fd36109c48b01603f60408d0281612fc457fe5b04614f0a90919063ffffffff16565b015a1015613049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506130b28f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146130a7578e6130ad565b6109c45a035b614e8d565b93506130c75a82614f2490919063ffffffff16565b905083806130d6575060008a14155b806130e2575060008814155b613154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008089111561316e5761316b828b8b8b8b614f44565b90505b84156131b8577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8482604051808381526020018281526020019250505060405180910390a16131f8565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238482604051808381526020018281526020019250505060405180910390a15b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146132a4578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111613357576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61336384848484611bbe565b50505050565b6060600060035467ffffffffffffffff8111801561338657600080fd5b506040519080825280602002602001820160405280156133b55781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613509578083838151811061346057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818060010192505061341f565b82935050505090565b60055481565b600080825160208401855af4806000523d6020523d600060403e60403d016000fd5b6135858a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961514a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146135c3576135c28461564a565b5b6136118787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615679565b600082111561362b5761362982600060018685614f44565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b6000805a905061374f878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a614e8d565b61375857600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137e55780820151818401526020810190506137ca565b50505050905090810190601f1680156138125780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b606060008267ffffffffffffffff8111801561383b57600080fd5b5060405190808252806020026020018201604052801561386a5781602001602082028036833780820191505090505b509150600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561393d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561394857508482105b15613a03578084838151811061395a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081806001019250506138d3565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613b14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613bc68c8c8c8c8c8c8c8c8c8c8c61466f565b8051906020012090509b9a5050505050505050505050565b613be6614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613c505750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613cc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613dc2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613f77614d62565b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181557f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa282604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b613ffb614d62565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156140655750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561409d57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61410f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561427a5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6142ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146143ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561470057fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b61478c614878565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b61481f614d62565b6148288161564a565b7f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b081604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b6148a66125e4565b30604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905090565b6148fe614d62565b806001600354031015614979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149e35750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614b55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414614d2457614d2381612c3e565b5b505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614e03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b600080831415614e185760009050614e39565b6000828402905082848281614e2957fe5b0414614e3457600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015614e8357600080fd5b8091505092915050565b6000600180811115614e9b57fe5b836001811115614ea757fe5b1415614ec0576000808551602087018986f49050614ed0565b600080855160208701888a87f190505b95945050505050565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b600081831015614f1a5781614f1c565b825b905092915050565b600082821115614f3357600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614f815782614f83565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561509b57614fed3a8610614fca573a614fcc565b855b614fdf888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b615140565b6150c0856150b2888a614e6e90919063ffffffff16565b614e0590919063ffffffff16565b91506150cd8482846158b4565b61513f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146151c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8151811115615239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60018110156152b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156155b65760008482815181106152d057fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156153445750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561537c57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156153b457508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508092505080806001019150506152b9565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461577b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158b05761583d8260008360015a614e8d565b6158af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d6000811461595b5760208114615963576000935061596e565b81935061596e565b600051158215171593505b505050939250505056fea26469706673582212203874bcf92e1722cc7bfa0cef1a0985cf0dc3485ba0663db3747ccdf1605df53464736f6c634300070600336040608081526004908136101561001557600080fd5b600090813560e01c80630d58b1db1461126c578063137c29fe146110755780632a2d80d114610db75780632b67b57014610bde57806330f28b7a14610ade5780633644e51514610a9d57806336c7851614610a285780633ff9dcb1146109a85780634fe02b441461093f57806365d9723c146107ac57806387517c451461067a578063927da105146105c3578063cc53287f146104a3578063edd9444b1461033a5763fe8ec1a7146100c657600080fd5b346103365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff833581811161033257610114903690860161164b565b60243582811161032e5761012b903690870161161a565b6101336114e6565b9160843585811161032a5761014b9036908a016115c1565b98909560a43590811161032657610164913691016115c1565b969095815190610173826113ff565b606b82527f5065726d697442617463685769746e6573735472616e7366657246726f6d285460208301527f6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472838301527f657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323560608301527f3620646561646c696e652c000000000000000000000000000000000000000000608083015282519a8b9181610222602085018096611f93565b918237018a8152039961025b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09b8c8101835282611437565b5190209085515161026b81611ebb565b908a5b8181106102f95750506102f6999a6102ed9183516102a081610294602082018095611f66565b03848101835282611437565b519020602089810151858b015195519182019687526040820192909252336060820152608081019190915260a081019390935260643560c08401528260e081015b03908101835282611437565b51902093611cf7565b80f35b8061031161030b610321938c5161175e565b51612054565b61031b828661175e565b52611f0a565b61026e565b8880fd5b8780fd5b8480fd5b8380fd5b5080fd5b5091346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103365767ffffffffffffffff9080358281116103325761038b903690830161164b565b60243583811161032e576103a2903690840161161a565b9390926103ad6114e6565b9160643590811161049f576103c4913691016115c1565b949093835151976103d489611ebb565b98885b81811061047d5750506102f697988151610425816103f9602082018095611f66565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611437565b5190206020860151828701519083519260208401947ffcf35f5ac6a2c28868dc44c302166470266239195f02b0ee408334829333b7668652840152336060840152608083015260a082015260a081526102ed8161141b565b808b61031b8261049461030b61049a968d5161175e565b9261175e565b6103d7565b8680fd5b5082346105bf57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103325780359067ffffffffffffffff821161032e576104f49136910161161a565b929091845b848110610504578580f35b8061051a610515600193888861196c565b61197c565b61052f84610529848a8a61196c565b0161197c565b3389528385528589209173ffffffffffffffffffffffffffffffffffffffff80911692838b528652868a20911690818a5285528589207fffffffffffffffffffffffff000000000000000000000000000000000000000081541690558551918252848201527f89b1add15eff56b3dfe299ad94e01f2b52fbcb80ae1a3baea6ae8c04cb2b98a4853392a2016104f9565b8280fd5b50346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610676816105ff6114a0565b936106086114c3565b6106106114e6565b73ffffffffffffffffffffffffffffffffffffffff968716835260016020908152848420928816845291825283832090871683528152919020549251938316845260a083901c65ffffffffffff169084015260d09190911c604083015281906060820190565b0390f35b50346103365760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336576106b26114a0565b906106bb6114c3565b916106c46114e6565b65ffffffffffff926064358481169081810361032a5779ffffffffffff0000000000000000000000000000000000000000947fda9fa7c1b00402c17d0161b249b1ab8bbec047c5a52207b9c112deffd817036b94338a5260016020527fffffffffffff0000000000000000000000000000000000000000000000000000858b209873ffffffffffffffffffffffffffffffffffffffff809416998a8d5260205283878d209b169a8b8d52602052868c209486156000146107a457504216925b8454921697889360a01b16911617179055815193845260208401523392a480f35b905092610783565b5082346105bf5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576107e56114a0565b906107ee6114c3565b9265ffffffffffff604435818116939084810361032a57338852602091600183528489209673ffffffffffffffffffffffffffffffffffffffff80911697888b528452858a20981697888a5283528489205460d01c93848711156109175761ffff9085840316116108f05750907f55eb90d810e1700b35a8e7e25395ff7f2b2259abd7415ca2284dfb1c246418f393929133895260018252838920878a528252838920888a5282528389209079ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff000000000000000000000000000000000000000000000000000083549260d01b16911617905582519485528401523392a480f35b84517f24d35a26000000000000000000000000000000000000000000000000000000008152fd5b5084517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b503461033657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610336578060209273ffffffffffffffffffffffffffffffffffffffff61098f6114a0565b1681528084528181206024358252845220549051908152f35b5082346105bf57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf577f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d90359160243533855284602052818520848652602052818520818154179055815193845260208401523392a280f35b8234610a9a5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a9a57610a606114a0565b610a686114c3565b610a706114e6565b6064359173ffffffffffffffffffffffffffffffffffffffff8316830361032e576102f6936117a1565b80fd5b503461033657817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657602090610ad7611b1e565b9051908152f35b508290346105bf576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf57610b1a3661152a565b90807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c36011261033257610b4c611478565b9160e43567ffffffffffffffff8111610bda576102f694610b6f913691016115c1565b939092610b7c8351612054565b6020840151828501519083519260208401947f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d801068652840152336060840152608083015260a082015260a08152610bd18161141b565b51902091611c25565b8580fd5b509134610336576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033657610c186114a0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360160c08112610332576080855191610c51836113e3565b1261033257845190610c6282611398565b73ffffffffffffffffffffffffffffffffffffffff91602435838116810361049f578152604435838116810361049f57602082015265ffffffffffff606435818116810361032a5788830152608435908116810361049f576060820152815260a435938285168503610bda576020820194855260c4359087830182815260e43567ffffffffffffffff811161032657610cfe90369084016115c1565b929093804211610d88575050918591610d786102f6999a610d7e95610d238851611fbe565b90898c511690519083519260208401947ff3841cd1ff0085026a6327b620b67997ce40f282c88a8e905a7a5626e310f3d086528401526060830152608082015260808152610d70816113ff565b519020611bd9565b916120c7565b519251169161199d565b602492508a51917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b5091346103365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc93818536011261033257610df36114a0565b9260249081359267ffffffffffffffff9788851161032a578590853603011261049f578051978589018981108282111761104a578252848301358181116103265785019036602383011215610326578382013591610e50836115ef565b90610e5d85519283611437565b838252602093878584019160071b83010191368311611046578801905b828210610fe9575050508a526044610e93868801611509565b96838c01978852013594838b0191868352604435908111610fe557610ebb90369087016115c1565b959096804211610fba575050508998995151610ed681611ebb565b908b5b818110610f9757505092889492610d7892610f6497958351610f02816103f98682018095611f66565b5190209073ffffffffffffffffffffffffffffffffffffffff9a8b8b51169151928551948501957faf1b0d30d2cab0380e68f0689007e3254993c596f2fdd0aaa7f4d04f794408638752850152830152608082015260808152610d70816113ff565b51169082515192845b848110610f78578580f35b80610f918585610f8b600195875161175e565b5161199d565b01610f6d565b80610311610fac8e9f9e93610fb2945161175e565b51611fbe565b9b9a9b610ed9565b8551917fcd21db4f000000000000000000000000000000000000000000000000000000008352820152fd5b8a80fd5b6080823603126110465785608091885161100281611398565b61100b85611509565b8152611018838601611509565b838201526110278a8601611607565b8a8201528d611037818701611607565b90820152815201910190610e7a565b8c80fd5b84896041867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5082346105bf576101407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105bf576110b03661152a565b91807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610332576110e2611478565b67ffffffffffffffff93906101043585811161049f5761110590369086016115c1565b90936101243596871161032a57611125610bd1966102f6983691016115c1565b969095825190611134826113ff565b606482527f5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5060208301527f65726d697373696f6e73207065726d69747465642c6164647265737320737065848301527f6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c60608301527f696e652c0000000000000000000000000000000000000000000000000000000060808301528351948591816111e3602085018096611f93565b918237018b8152039361121c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe095868101835282611437565b5190209261122a8651612054565b6020878101518589015195519182019687526040820192909252336060820152608081019190915260a081019390935260e43560c08401528260e081016102e1565b5082346105bf576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261033257813567ffffffffffffffff92838211610bda5736602383011215610bda5781013592831161032e576024906007368386831b8401011161049f57865b8581106112e5578780f35b80821b83019060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83360301126103265761139288876001946060835161132c81611398565b611368608461133c8d8601611509565b9485845261134c60448201611509565b809785015261135d60648201611509565b809885015201611509565b918291015273ffffffffffffffffffffffffffffffffffffffff80808093169516931691166117a1565b016112da565b6080810190811067ffffffffffffffff8211176113b457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176113b457604052565b60a0810190811067ffffffffffffffff8211176113b457604052565b60c0810190811067ffffffffffffffff8211176113b457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176113b457604052565b60c4359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b359073ffffffffffffffffffffffffffffffffffffffff8216820361149b57565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01906080821261149b576040805190611563826113e3565b8082941261149b57805181810181811067ffffffffffffffff8211176113b457825260043573ffffffffffffffffffffffffffffffffffffffff8116810361149b578152602435602082015282526044356020830152606435910152565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020838186019501011161149b57565b67ffffffffffffffff81116113b45760051b60200190565b359065ffffffffffff8216820361149b57565b9181601f8401121561149b5782359167ffffffffffffffff831161149b576020808501948460061b01011161149b57565b91909160608184031261149b576040805191611666836113e3565b8294813567ffffffffffffffff9081811161149b57830182601f8201121561149b578035611693816115ef565b926116a087519485611437565b818452602094858086019360061b8501019381851161149b579086899897969594939201925b8484106116e3575050505050855280820135908501520135910152565b90919293949596978483031261149b578851908982019082821085831117611730578a928992845261171487611509565b81528287013583820152815201930191908897969594936116c6565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b80518210156117725760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b92919273ffffffffffffffffffffffffffffffffffffffff604060008284168152600160205282828220961695868252602052818120338252602052209485549565ffffffffffff8760a01c16804211611884575082871696838803611812575b5050611810955016926118b5565b565b878484161160001461184f57602488604051907ff96fb0710000000000000000000000000000000000000000000000000000000082526004820152fd5b7fffffffffffffffffffffffff000000000000000000000000000000000000000084846118109a031691161790553880611802565b602490604051907fd81b2f2e0000000000000000000000000000000000000000000000000000000082526004820152fd5b9060006064926020958295604051947f23b872dd0000000000000000000000000000000000000000000000000000000086526004860152602485015260448401525af13d15601f3d116001600051141617161561190e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152fd5b91908110156117725760061b0190565b3573ffffffffffffffffffffffffffffffffffffffff8116810361149b5790565b9065ffffffffffff908160608401511673ffffffffffffffffffffffffffffffffffffffff908185511694826020820151169280866040809401511695169560009187835260016020528383208984526020528383209916988983526020528282209184835460d01c03611af5579185611ace94927fc6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708ec98979694508715600014611ad35779ffffffffffff00000000000000000000000000000000000000009042165b60a01b167fffffffffffff00000000000000000000000000000000000000000000000000006001860160d01b1617179055519384938491604091949373ffffffffffffffffffffffffffffffffffffffff606085019616845265ffffffffffff809216602085015216910152565b0390a4565b5079ffffffffffff000000000000000000000000000000000000000087611a60565b600484517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b467f000000000000000000000000000000000000000000000000000000000000000103611b69577f866a5aba21966af95d6c7ab78eb2b2fc913915c28be3b9aa07cc04ff903e3f2890565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a604082015246606082015230608082015260808152611bd3816113ff565b51902090565b611be1611b1e565b906040519060208201927f190100000000000000000000000000000000000000000000000000000000000084526022830152604282015260428152611bd381611398565b9192909360a435936040840151804211611cc65750602084510151808611611c955750918591610d78611c6594611c60602088015186611e47565b611bd9565b73ffffffffffffffffffffffffffffffffffffffff809151511692608435918216820361149b57611810936118b5565b602490604051907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b602490604051907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b959093958051519560409283830151804211611e175750848803611dee57611d2e918691610d7860209b611c608d88015186611e47565b60005b868110611d42575050505050505050565b611d4d81835161175e565b5188611d5a83878a61196c565b01359089810151808311611dbe575091818888886001968596611d84575b50505050505001611d31565b611db395611dad9273ffffffffffffffffffffffffffffffffffffffff6105159351169561196c565b916118b5565b803888888883611d78565b6024908651907f3728b83d0000000000000000000000000000000000000000000000000000000082526004820152fd5b600484517fff633a38000000000000000000000000000000000000000000000000000000008152fd5b6024908551907fcd21db4f0000000000000000000000000000000000000000000000000000000082526004820152fd5b9073ffffffffffffffffffffffffffffffffffffffff600160ff83161b9216600052600060205260406000209060081c6000526020526040600020818154188091551615611e9157565b60046040517f756688fe000000000000000000000000000000000000000000000000000000008152fd5b90611ec5826115ef565b611ed26040519182611437565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611f0082946115ef565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f375760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b805160208092019160005b828110611f7f575050505090565b835185529381019392810192600101611f71565b9081519160005b838110611fab575050016000815290565b8060208092840101518185015201611f9a565b60405160208101917f65626cad6cb96493bf6f5ebea28756c966f023ab9e8a83a7101849d5573b3678835273ffffffffffffffffffffffffffffffffffffffff8082511660408401526020820151166060830152606065ffffffffffff9182604082015116608085015201511660a082015260a0815260c0810181811067ffffffffffffffff8211176113b45760405251902090565b6040516020808201927f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1845273ffffffffffffffffffffffffffffffffffffffff81511660408401520151606082015260608152611bd381611398565b919082604091031261149b576020823592013590565b6000843b61222e5750604182036121ac576120e4828201826120b1565b939092604010156117725760209360009360ff6040608095013560f81c5b60405194855216868401526040830152606082015282805260015afa156121a05773ffffffffffffffffffffffffffffffffffffffff806000511691821561217657160361214c57565b60046040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b60408203612204576121c0918101906120b1565b91601b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c019060ff8211611f375760209360009360ff608094612102565b60046040517f4be6321b000000000000000000000000000000000000000000000000000000008152fd5b929391601f928173ffffffffffffffffffffffffffffffffffffffff60646020957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0604051988997889687947f1626ba7e000000000000000000000000000000000000000000000000000000009e8f8752600487015260406024870152816044870152868601378b85828601015201168101030192165afa9081156123a857829161232a575b507fffffffff000000000000000000000000000000000000000000000000000000009150160361230057565b60046040517fb0669cbc000000000000000000000000000000000000000000000000000000008152fd5b90506020813d82116123a0575b8161234460209383611437565b810103126103365751907fffffffff0000000000000000000000000000000000000000000000000000000082168203610a9a57507fffffffff0000000000000000000000000000000000000000000000000000000090386122d4565b3d9150612337565b6040513d84823e3d90fdfea164736f6c6343000811000a60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000007fc98430eaedbb6070b35b39d798725049088348165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00293373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500a2646970667358221220c81508169226a2ddd4195e0f3faba5021863577716a7f57e111d4f5af811cfea64736f6c63430008180033", } // AllocPredeploysABI is the input ABI used to generate the binding from. diff --git a/contracts/bindings/admin.go b/contracts/bindings/portaladmin.go similarity index 75% rename from contracts/bindings/admin.go rename to contracts/bindings/portaladmin.go index 6063aebf1..ecccc1b41 100644 --- a/contracts/bindings/admin.go +++ b/contracts/bindings/portaladmin.go @@ -29,23 +29,23 @@ var ( _ = abi.ConvertType ) -// AdminMetaData contains all meta data concerning the Admin contract. -var AdminMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"IS_SCRIPT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pausePortal\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"portal\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpausePortal\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"portal\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradePortal\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"deployer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"portal\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", - Bin: "0x6080604052600c805462ff00ff19166201000117905534801561002157600080fd5b50615527806100316000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80636e7a983314610051578063b90b3ffb14610066578063cfbf9af714610079578063f8ccbf471461008c575b600080fd5b61006461005f366004610746565b6100b3565b005b6100646100743660046107e8565b61037b565b6100646100873660046107e8565b6104b5565b600c5461009f9062010000900460ff1681565b604051901515815260200160405180910390f35b604051637fec2a8d60e01b81526001600160a01b0385166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561010857600080fd5b505af115801561011c573d6000803e3d6000fd5b50505050600060405161012e9061071d565b604051809103906000f08015801561014a573d6000803e3d6000fd5b5090507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156101ab57600080fd5b505af11580156101bf573d6000803e3d6000fd5b5050604051637fec2a8d60e01b81526001600160a01b0389166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9250637fec2a8d9150602401600060405180830381600087803b15801561021857600080fd5b505af115801561022c573d6000803e3d6000fd5b50505050600061023b8561055d565b604051639623609d60e01b81529091506001600160a01b03821690639623609d9061027090889086908990899060040161081b565b600060405180830381600087803b15801561028a57600080fd5b505af115801561029e573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561030057600080fd5b505af1158015610314573d6000803e3d6000fd5b5050505061032182610608565b6103725760405162461bcd60e51b815260206004820152601960248201527f696e697469616c697a657273206e6f742064697361626c65640000000000000060448201526064015b60405180910390fd5b50505050505050565b604051637fec2a8d60e01b81526001600160a01b0383166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b1580156103d057600080fd5b505af11580156103e4573d6000803e3d6000fd5b50505050806001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561042357600080fd5b505af1158015610437573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561049957600080fd5b505af11580156104ad573d6000803e3d6000fd5b505050505050565b604051637fec2a8d60e01b81526001600160a01b0383166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561050a57600080fd5b505af115801561051e573d6000803e3d6000fd5b50505050806001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561042357600080fd5b604051630667f9d760e41b81526001600160a01b03821660048201527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036024820152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa1580156105de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106029190610867565b92915050565b600067ffffffffffffffff61061c8361062d565b67ffffffffffffffff161492915050565b604051630667f9d760e41b81526001600160a01b03821660048201527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0060248201526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa1580156106b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d49190610867565b905067ffffffffffffffff8111156106025760405162461bcd60e51b815260206004820152600c60248201526b696e697469616c697a696e6760a01b6044820152606401610369565b614c718061088183390190565b80356001600160a01b038116811461074157600080fd5b919050565b60008060008060006080868803121561075e57600080fd5b6107678661072a565b94506107756020870161072a565b93506107836040870161072a565b9250606086013567ffffffffffffffff808211156107a057600080fd5b818801915088601f8301126107b457600080fd5b8135818111156107c357600080fd5b8960208285010111156107d557600080fd5b9699959850939650602001949392505050565b600080604083850312156107fb57600080fd5b6108048361072a565b91506108126020840161072a565b90509250929050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b60006020828403121561087957600080fd5b505191905056fe60806040523480156200001157600080fd5b506200001c62000022565b620000d6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000735760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d35780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b614b8b80620000e66000396000f3fe60806040526004361061036b5760003560e01c80638532eb9f116101c6578063b4d5afd1116100f7578063c3d8ad6711610095578063d051c97d1161006f578063d051c97d14610af6578063d533b44514610b37578063f2fde38b14610b57578063f45cc7b814610b7757600080fd5b8063c3d8ad6714610a98578063c4ab80bc14610aad578063cf84c81814610acd57600080fd5b8063bff0e84d116100d1578063bff0e84d14610a25578063c21dda4f14610a45578063c26dfc0514610a58578063c2f9b96814610a7857600080fd5b8063b4d5afd1146109b0578063b521466d146109e5578063bb8590ad14610a0557600080fd5b8063a480ca7911610164578063afe821981161013e578063afe8219814610923578063afe8af9c14610943578063b187bd2614610979578063b2b2f5bd1461098e57600080fd5b8063a480ca79146108b3578063a8a98962146108d3578063aaf1bc97146108f357600080fd5b806397b52062116101a057806397b520621461083c5780639a8a05921461085c578063a10ac97a1461086f578063a32eb7c61461089157600080fd5b80638532eb9f146107b15780638da5cb5b146107d15780638dd9523c1461080e57600080fd5b80633f4ba83a116102a0578063575420501161023e57806374eba9391161021857806374eba9391461074057806378fe53071461076057806383d0cbd9146107875780638456cb591461079c57600080fd5b806357542050146106ca57806366a1eaf31461070b578063715018a61461072b57600080fd5b806349cc3bf61161027a57806349cc3bf614610643578063500b19e71461065d57806354d26bba1461069557806355e2448e146106aa57600080fd5b80633f4ba83a146105cd5780633fd3b15e146105e2578063461ab4881461062357600080fd5b8063241b71bb1161030d57806330632e8b116102e757806330632e8b1461052557806336d219121461054557806336d853f91461056c5780633aa873301461058c57600080fd5b8063241b71bb1461046057806324278bbe146104905780632f32700e146104c057600080fd5b806310a5a7f71161034957806310a5a7f7146103d3578063110ff5f1146103f35780631d3eb6e31461042b57806323dbce501461044b57600080fd5b80630360d20f1461037057806306c3dc5f1461039c578063103ba701146103b1575b600080fd5b34801561037c57600080fd5b50610385600281565b60405160ff90911681526020015b60405180910390f35b3480156103a857600080fd5b50610385600381565b3480156103bd57600080fd5b506103d16103cc366004613d44565b610b9e565b005b3480156103df57600080fd5b506103d16103ee366004613d7f565b610bb2565b3480156103ff57600080fd5b50600154610413906001600160401b031681565b6040516001600160401b039091168152602001610393565b34801561043757600080fd5b506103d1610446366004613d9c565b610c11565b34801561045757600080fd5b506103d1610d2c565b34801561046c57600080fd5b5061048061047b366004613e10565b610d76565b6040519015158152602001610393565b34801561049c57600080fd5b506104806104ab366004613d7f565b60056020526000908152604090205460ff1681565b3480156104cc57600080fd5b50604080518082018252600080825260209182015281518083018352600b546001600160401b0381168083526001600160a01b03600160401b909204821692840192835284519081529151169181019190915201610393565b34801561053157600080fd5b506103d1610540366004613e29565b610d87565b34801561055157600080fd5b5060015461041390600160401b90046001600160401b031681565b34801561057857600080fd5b506103d1610587366004613d7f565b61109e565b34801561059857600080fd5b506104136105a7366004613e64565b60066020908152600092835260408084209091529082529020546001600160401b031681565b3480156105d957600080fd5b506103d16110af565b3480156105ee57600080fd5b506104136105fd366004613e64565b60086020908152600092835260408084209091529082529020546001600160401b031681565b34801561062f57600080fd5b5061048061063e366004613e9d565b6110ea565b34801561064f57600080fd5b506000546103859060ff1681565b34801561066957600080fd5b5060025461067d906001600160a01b031681565b6040516001600160a01b039091168152602001610393565b3480156106a157600080fd5b506103d1611106565b3480156106b657600080fd5b50600b546001600160401b03161515610480565b3480156106d657600080fd5b506104136106e5366004613ed9565b600a6020908152600092835260408084209091529082529020546001600160401b031681565b34801561071757600080fd5b506103d1610726366004613f0e565b611150565b34801561073757600080fd5b506103d16114fe565b34801561074c57600080fd5b5061041361075b366004613e10565b611512565b34801561076c57600080fd5b5060005461041390600160681b90046001600160401b031681565b34801561079357600080fd5b506103d1611541565b3480156107a857600080fd5b506103d161158b565b3480156107bd57600080fd5b506103d16107cc366004613f49565b6115c6565b3480156107dd57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661067d565b34801561081a57600080fd5b5061082e610829366004614018565b6116d9565b604051908152602001610393565b34801561084857600080fd5b506103d161085736600461407f565b61175a565b34801561086857600080fd5b5046610413565b34801561087b57600080fd5b5061082e600080516020614af683398151915281565b34801561089d57600080fd5b5061082e600080516020614b3683398151915281565b3480156108bf57600080fd5b506103d16108ce3660046140ca565b6117d7565b3480156108df57600080fd5b506103d16108ee3660046140ca565b61185f565b3480156108ff57600080fd5b5061048061090e366004613d7f565b60046020526000908152604090205460ff1681565b34801561092f57600080fd5b506103d161093e366004613d7f565b611870565b34801561094f57600080fd5b5061041361095e366004613d7f565b6009602052600090815260409020546001600160401b031681565b34801561098557600080fd5b506104806118ca565b34801561099a57600080fd5b5061082e600080516020614ad683398151915281565b3480156109bc57600080fd5b506000546109d2906301000000900461ffff1681565b60405161ffff9091168152602001610393565b3480156109f157600080fd5b506103d1610a003660046140e5565b611920565b348015610a1157600080fd5b506103d1610a20366004613d7f565b611931565b348015610a3157600080fd5b506103d1610a403660046140e5565b611942565b6103d1610a53366004614109565b611953565b348015610a6457600080fd5b506000546109d290610100900461ffff1681565b348015610a8457600080fd5b506103d1610a93366004613d7f565b611d2d565b348015610aa457600080fd5b506103d1611d8c565b348015610ab957600080fd5b506103d1610ac836600461407f565b611dd6565b348015610ad957600080fd5b50600054610413906501000000000090046001600160401b031681565b348015610b0257600080fd5b50610413610b11366004613e64565b60076020908152600092835260408084209091529082529020546001600160401b031681565b348015610b4357600080fd5b506103d1610b52366004613d7f565b611e4a565b348015610b6357600080fd5b506103d1610b723660046140ca565b611ea4565b348015610b8357600080fd5b5060005461041390600160a81b90046001600160401b031681565b610ba6611edf565b610baf81611f3a565b50565b610bba611edf565b610bda610bd5600080516020614ad683398151915283611fd6565b61201f565b6040516001600160401b038216907fcd7910e1c5569d8433ce4ef8e5d51c1bdc03168f614b576da47dc3d2b51d033a90600090a250565b333014610c5d5760405162461bcd60e51b815260206004820152601560248201527427b6b734a837b93a30b61d1037b7363c9039b2b63360591b60448201526064015b60405180910390fd5b600154600b546001600160401b03908116600160401b9092041614610cbe5760405162461bcd60e51b815260206004820152601760248201527627b6b734a837b93a30b61d1037b7363c9031b1b430b4b760491b6044820152606401610c54565b600b54600160401b90046001600160a01b031615610d1e5760405162461bcd60e51b815260206004820152601e60248201527f4f6d6e69506f7274616c3a206f6e6c792063636861696e2073656e64657200006044820152606401610c54565b610d28828261209a565b5050565b610d34611edf565b610d4b600080516020614b3683398151915261201f565b6040517f3d0f9c56dac46156a2db0aa09ee7804770ad9fc9549d21023164f22d69475ed890600090a1565b6000610d8182612214565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610dcc5750825b90506000826001600160401b03166001148015610de85750303b155b905081158015610df6575080155b15610e145760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3e57845460ff60401b1916600160401b1785555b610e53610e4e60208801886140ca565b61227b565b610e6b610e6660408801602089016140ca565b61228c565b610e83610e7e60a0880160808901613d7f565b612330565b610e9b610e9660c0880160a08901613d7f565b6123e8565b610eb3610eae60e0880160c089016140e5565b61249c565b610ecc610ec7610100880160e089016140e5565b612540565b610ee6610ee161012088016101008901613d44565b611f3a565b610f0e610efb61018088016101608901613d7f565b610f09610180890189614192565b6125e0565b610f1e6060870160408801613d7f565b6001805467ffffffffffffffff19166001600160401b0392909216919091179055610f4f6080870160608801613d7f565b600180546001600160401b0392909216600160401b026fffffffffffffffff000000000000000019909216919091179055610104610f9561014088016101208901613d7f565b60076000610fa960808b0160608c01613d7f565b6001600160401b0390811682526020808301939093526040918201600090812086831682529093529120805467ffffffffffffffff191692909116919091179055610ffc61016088016101408901613d7f565b6008600061101060808b0160608c01613d7f565b6001600160401b03908116825260208083019390935260409182016000908120958216815294909252909220805467ffffffffffffffff191691909216179055831561109657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6110a6611edf565b610baf81612330565b6110b7611edf565b6110bf61290f565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60006110ff836110fa8585611fd6565b612926565b9392505050565b61110e611edf565b611125600080516020614ad68339815191526129ad565b6040517f4c48c7b71557216a3192842746bdfc381f98d7536d9eb1c6764f3b45e679482790600090a1565b600080516020614b3683398151915261116f6060830160408401613d7f565b61117d826110fa8484611fd6565b156111bf5760405162461bcd60e51b815260206004820152601260248201527113db5b9a541bdc9d185b0e881c185d5cd95960721b6044820152606401610c54565b6111c7612a28565b3660006111d86101008601866141db565b90925090506040850160006111f08260208901613d7f565b600154909150600160401b90046001600160401b03166112166040840160208501613d7f565b6001600160401b03161461126c5760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a2077726f6e672063636861696e20494400000000006044820152606401610c54565b826112b05760405162461bcd60e51b81526020600482015260146024820152734f6d6e69506f7274616c3a206e6f20786d73677360601b6044820152606401610c54565b6001600160401b03808216600090815260096020526040902054166113175760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a20756e6b6e6f776e2076616c2073657400000000006044820152606401610c54565b61131f612a72565b6001600160401b0316816001600160401b031610156113805760405162461bcd60e51b815260206004820152601760248201527f4f6d6e69506f7274616c3a206f6c642076616c207365740000000000000000006044820152606401610c54565b6113c487356113936101608a018a6141db565b6001600160401b038086166000908152600a6020908152604080832060099092529091205490911660026003612ac2565b6114085760405162461bcd60e51b81526020600482015260156024820152744f6d6e69506f7274616c3a206e6f2071756f72756d60581b6044820152606401610c54565b611431873583868661141e6101208d018d6141db565b61142c6101408f018f6141db565b612ce4565b61147d5760405162461bcd60e51b815260206004820152601960248201527f4f6d6e69506f7274616c3a20696e76616c69642070726f6f66000000000000006044820152606401610c54565b60005b838110156114cb576114c361149a36859003850185614292565b8686848181106114ac576114ac614333565b90506020028101906114be9190614349565b612d5f565b600101611480565b50505050506114f960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b611506611edf565b611510600061324a565b565b6003818154811061152257600080fd5b60009182526020909120600290910201546001600160401b0316905081565b611549611edf565b611560600080516020614ad683398151915261201f565b6040517f5f335a4032d4cfb6aca7835b0c2225f36d4d9eaa4ed43ee59ed537e02dff6b3990600090a1565b611593611edf565b61159b6132bb565b6040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b33301461160d5760405162461bcd60e51b815260206004820152601560248201527427b6b734a837b93a30b61d1037b7363c9039b2b63360591b6044820152606401610c54565b600154600b546001600160401b03908116600160401b909204161461166e5760405162461bcd60e51b815260206004820152601760248201527627b6b734a837b93a30b61d1037b7363c9031b1b430b4b760491b6044820152606401610c54565b600b54600160401b90046001600160a01b0316156116ce5760405162461bcd60e51b815260206004820152601e60248201527f4f6d6e69506f7274616c3a206f6e6c792063636861696e2073656e64657200006044820152606401610c54565b6114f98383836125e0565b600254604051632376548f60e21b81526000916001600160a01b031690638dd9523c90611710908890889088908890600401614392565b602060405180830381865afa15801561172d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175191906143ca565b95945050505050565b611762611edf565b6001600160401b03838116600081815260086020908152604080832087861680855290835292819020805467ffffffffffffffff191695871695861790555193845290927fe070f08cae8464c91238e8cbea64ccee5e7b48dd79a843f144e3721ee6bdd9b591015b60405180910390a3505050565b6117df611edf565b60405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611817573d6000803e3d6000fd5b50816001600160a01b03167f9dc46f23cfb5ddcad0ae7ea2be38d47fec07bb9382ec7e564efc69e036dd66ce8260405161185391815260200190565b60405180910390a25050565b611867611edf565b610baf8161228c565b611878611edf565b611893610bd5600080516020614b3683398151915283611fd6565b6040516001600160401b038216907fab78810a0515df65f9f10bfbcb92d03d5df71d9fd3b9414e9ad831a5117d6daa90600090a250565b600061191b600080516020614af6833981519152600052600080516020614b168339815191526020527ffae9838a178d7f201aa98e2ce5340158edda60bb1e8f168f46503bf3e99f13be5460ff1690565b905090565b611928611edf565b610baf8161249c565b611939611edf565b610baf816123e8565b61194a611edf565b610baf81612540565b600080516020614ad683398151915286611971826110fa8484611fd6565b156119b35760405162461bcd60e51b815260206004820152601260248201527113db5b9a541bdc9d185b0e881c185d5cd95960721b6044820152606401610c54565b6001600160401b03881660009081526005602052604090205460ff16611a1b5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a20756e737570706f727465642064657374000000006044820152606401610c54565b6001600160a01b038616611a715760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a206e6f20706f7274616c207863616c6c00000000006044820152606401610c54565b6000546001600160401b036501000000000090910481169084161115611ad95760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a206761734c696d697420746f6f20686967680000006044820152606401610c54565b6000546001600160401b03600160681b90910481169084161015611b3f5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a206761734c696d697420746f6f206c6f77000000006044820152606401610c54565b6000546301000000900461ffff16841115611b9c5760405162461bcd60e51b815260206004820152601a60248201527f4f6d6e69506f7274616c3a206461746120746f6f206c617267650000000000006044820152606401610c54565b60ff808816600081815260046020526040902054909116611bff5760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a20756e737570706f727465642073686172640000006044820152606401610c54565b6000611c0d8a8888886116d9565b905080341015611c5f5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a20696e73756666696369656e7420666565000000006044820152606401610c54565b6001600160401b03808b166000908152600660209081526040808320868516845290915281208054600193919291611c99918591166143f9565b82546101009290920a6001600160401b038181021990931691831602179091558b811660008181526006602090815260408083208886168085529252918290205491519190931693507fb7c8eb9d7a7fbcdab809ab7b8a7c41701eb3115e3fe99d30ff490d8552f72bfa90611d199033908e908e908e908e908b90614420565b60405180910390a450505050505050505050565b611d35611edf565b611d55611d50600080516020614b3683398151915283611fd6565b6129ad565b6040516001600160401b038216907fc551305d9bd408be4327b7f8aba28b04ccf6b6c76925392d195ecf9cc764294d90600090a250565b611d94611edf565b611dab600080516020614b368339815191526129ad565b6040517f2cb9d71d4c31860b70e9b707c69aa2f5953e03474f00cfcfff205c4745f8287590600090a1565b611dde611edf565b6001600160401b03838116600081815260076020908152604080832087861680855290835292819020805467ffffffffffffffff191695871695861790555193845290927f8647aae68c8456a1dcbfaf5eaadc94278ae423526d3f09c7b972bff7355d55c791016117ca565b611e52611edf565b611e6d611d50600080516020614ad683398151915283611fd6565b6040516001600160401b038216907f1ed9223556fb0971076c30172f1f00630efd313b6a05290a562aef95928e712590600090a250565b611eac611edf565b6001600160a01b038116611ed657604051631e4fbdf760e01b815260006004820152602401610c54565b610baf8161324a565b33611f117f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146115105760405163118cdaa760e01b8152336004820152602401610c54565b60008160ff1611611f8d5760405162461bcd60e51b815260206004820152601a60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206375746f66660000000000006044820152606401610c54565b6000805460ff191660ff83169081179091556040519081527f1683dc51426224f6e37a3b41dd5849e2db1bfe22366d1d913fa0ef6f757e828f906020015b60405180910390a150565b6000828260405160200161200192919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905092915050565b6000818152600080516020614b16833981519152602081905260409091205460ff16156120815760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c54565b600091825260205260409020805460ff19166001179055565b6120a26132d2565b3660005b8281101561220e578383828181106120c0576120c0614333565b90506020028101906120d2919061446b565b6003805460018101825560009190915290925082906002027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b016121168282614507565b505061211f4690565b6001600160401b03166121356020840184613d7f565b6001600160401b031614612183576001600560006121566020860186613d7f565b6001600160401b031681526020810191909152604001600020805460ff1916911515919091179055612206565b60005b61219360208401846141db565b9050811015612204576001600460006121af60208701876141db565b858181106121bf576121bf614333565b90506020020160208101906121d49190613d7f565b6001600160401b031681526020810191909152604001600020805460ff1916911515919091179055600101612186565b505b6001016120a6565b50505050565b600080516020614af68339815191526000908152600080516020614b1683398151915260208190527ffae9838a178d7f201aa98e2ce5340158edda60bb1e8f168f46503bf3e99f13be5460ff16806110ff5750600092835260205250604090205460ff1690565b6122836133d1565b610baf8161341a565b6001600160a01b0381166122e25760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206665654f7261636c650000006044820152606401610c54565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd97bdb0db82b52a85aa07f8da78033b1d6e159d94f1e3cbd4109d946c3bcfd3290602001611fcb565b6000816001600160401b0316116123895760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206d61782067617300000000006044820152606401610c54565b600080546cffffffffffffffff00000000001916650100000000006001600160401b038416908102919091179091556040519081527f1153561ac5effc2926ba6c612f86a397c997bc43dfbfc718da08065be0c5fe4d90602001611fcb565b6000816001600160401b0316116124415760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206d696e2067617300000000006044820152606401610c54565b6000805467ffffffffffffffff60681b1916600160681b6001600160401b038416908102919091179091556040519081527f8c852a6291aa436654b167353bca4a4b0c3d024c7562cb5082e7c869bddabf3e90602001611fcb565b60008161ffff16116124f05760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206d61782073697a65000000006044820152606401610c54565b6000805464ffff0000001916630100000061ffff8416908102919091179091556040519081527f65923e04419dc810d0ea08a94a7f608d4c4d949818d95c3788f895e575dd206490602001611fcb565b60008161ffff16116125945760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206d61782073697a65000000006044820152606401610c54565b6000805462ffff00191661010061ffff8416908102919091179091556040519081527f620bbea084306b66a8cc6b5b63830d6b3874f9d2438914e259ffd5065c33f7b090602001611fcb565b808061262e5760405162461bcd60e51b815260206004820152601960248201527f4f6d6e69506f7274616c3a206e6f2076616c696461746f7273000000000000006044820152606401610c54565b6001600160401b0380851660009081526009602052604090205416156126965760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a206475706c69636174652076616c207365740000006044820152606401610c54565b604080518082018252600080825260208083018290526001600160401b0388168252600a9052918220825b8481101561286e578686828181106126db576126db614333565b9050604002018036038101906126f1919061462f565b80519093506001600160a01b031661274b5760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a206e6f207a65726f2076616c696461746f720000006044820152606401610c54565b600083602001516001600160401b0316116127a85760405162461bcd60e51b815260206004820152601960248201527f4f6d6e69506f7274616c3a206e6f207a65726f20706f776572000000000000006044820152606401610c54565b82516001600160a01b03166000908152602083905260409020546001600160401b0316156128185760405162461bcd60e51b815260206004820152601f60248201527f4f6d6e69506f7274616c3a206475706c69636174652076616c696461746f72006044820152606401610c54565b602083015161282790856143f9565b60208481015185516001600160a01b03166000908152918590526040909120805467ffffffffffffffff19166001600160401b0390921691909117905593506001016126c1565b506001600160401b038781166000818152600960205260408120805467ffffffffffffffff191687851617905554600160a81b900490911610156128d2576000805467ffffffffffffffff60a81b1916600160a81b6001600160401b038a16021790555b6040516001600160401b038816907f3a7c2f997a87ba92aedaecd1127f4129cae1283e2809ebf5304d321b943fd10790600090a250505050505050565b611510600080516020614af68339815191526129ad565b600080516020614af68339815191526000908152600080516020614b1683398151915260208190527ffae9838a178d7f201aa98e2ce5340158edda60bb1e8f168f46503bf3e99f13be5460ff168061298c575060008481526020829052604090205460ff165b806129a5575060008381526020829052604090205460ff165b949350505050565b6000818152600080516020614b16833981519152602081905260409091205460ff16612a125760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c54565b600091825260205260409020805460ff19169055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901612a6c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6000805460ff8116600160a81b9091046001600160401b031611612a965750600190565b600054612ab79060ff811690600160a81b90046001600160401b031661466e565b61191b9060016143f9565b6000803660005b88811015612cd157898982818110612ae357612ae3614333565b9050602002810190612af5919061446b565b91508015612c175760008a8a612b0c60018561468e565b818110612b1b57612b1b614333565b9050602002810190612b2d919061446b565b612b36906146a1565b80519091506001600160a01b0316612b5160208501856140ca565b6001600160a01b031603612ba75760405162461bcd60e51b815260206004820152601b60248201527f51756f72756d3a206475706c69636174652076616c696461746f7200000000006044820152606401610c54565b80516001600160a01b0316612bbf60208501856140ca565b6001600160a01b031611612c155760405162461bcd60e51b815260206004820152601760248201527f51756f72756d3a2073696773206e6f7420736f727465640000000000000000006044820152606401610c54565b505b612c21828c613422565b612c6d5760405162461bcd60e51b815260206004820152601960248201527f51756f72756d3a20696e76616c6964207369676e6174757265000000000000006044820152606401610c54565b876000612c7d60208501856140ca565b6001600160a01b03168152602081019190915260400160002054612caa906001600160401b0316846143f9565b9250612cb883888888613496565b15612cc95760019350505050612cd9565b600101612ac9565b506000925050505b979650505050505050565b60408051600180825281830190925260009182919060208083019080368337019050509050612d1f86868686612d1a8d8d6134d3565b6135a0565b81600081518110612d3257612d32614333565b602002602001018181525050612d51818b612d4c8c613801565b613819565b9a9950505050505050505050565b81516000612d706020840184613d7f565b90506000612d846040850160208601613d7f565b90506000612d986060860160408701613d7f565b9050466001600160401b0316836001600160401b03161480612dc157506001600160401b038316155b612e0d5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a2077726f6e67206465737420636861696e000000006044820152606401610c54565b6001600160401b0380851660009081526007602090815260408083208685168452909152902054612e40911660016143f9565b6001600160401b0316816001600160401b031614612ea05760405162461bcd60e51b815260206004820152601860248201527f4f6d6e69506f7274616c3a2077726f6e67206f666673657400000000000000006044820152606401610c54565b856040015160ff16600460ff161480612ec257508160ff16866040015160ff16145b612f0e5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a2077726f6e6720636f6e66206c6576656c000000006044820152606401610c54565b60608601516001600160401b038581166000908152600860209081526040808320878516845290915290205491811691161015612f855760608601516001600160401b03858116600090815260086020908152604080832087851684529091529020805467ffffffffffffffff1916919092161790555b6001600160401b038085166000908152600760209081526040808320868516845290915281208054600193919291612fbf918591166143f9565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550306001600160a01b031685608001602081019061300091906140ca565b6001600160a01b0316036130da57806001600160401b0316826001600160401b0316856001600160401b03167f8277cab1f0fa69b34674f64a7d43f242b0bacece6f5b7e8652f1e0d88a9b873b6000336000604051602401613093906020808252601e908201527f4f6d6e69506f7274616c3a206e6f207863616c6c20746f20706f7274616c0000604082015260600190565b60408051601f198184030181529181526020820180516001600160e01b031662461bcd60e51b179052516130ca949392919061479c565b60405180910390a4505050505050565b604080518082019091526001600160401b03851681526020810161310460808801606089016140ca565b6001600160a01b039081169091528151600b8054602090940151909216600160401b026001600160e01b03199093166001600160401b0390911617919091179055600080808061315a60a08a0160808b016140ca565b6001600160a01b0316146131ab576131a661317b60a08a0160808b016140ca565b61318b60e08b0160c08c01613d7f565b6001600160401b03166131a160a08c018c6147d8565b61382f565b6131c0565b6131c06131bb60a08a018a6147d8565b6138ef565b600b80546001600160e01b0319169055919450925090506000836131e457826131f5565b604051806020016040528060008152505b9050846001600160401b0316866001600160401b0316896001600160401b03167f8277cab1f0fa69b34674f64a7d43f242b0bacece6f5b7e8652f1e0d88a9b873b85338987604051611d19949392919061479c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b611510600080516020614af683398151915261201f565b6000805b6003548110156133c457600381815481106132f3576132f3614333565b9060005260206000209060020201915061330a4690565b82546001600160401b039081169116146133445781546001600160401b03166000908152600560205260409020805460ff191690556133bc565b60005b60018301548110156133ba5760006004600085600101848154811061336e5761336e614333565b6000918252602080832060048304015460039092166008026101000a9091046001600160401b031683528201929092526040019020805460ff1916911515919091179055600101613347565b505b6001016132d6565b50610baf60036000613ca9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661151057604051631afcd79f60e31b815260040160405180910390fd5b611eac6133d1565b600061343160208401846140ca565b6001600160a01b03166134858361344b60208701876147d8565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061398692505050565b6001600160a01b0316149392505050565b60008160ff168360ff16856134ab919061481e565b6134b5919061485f565b6001600160401b0316856001600160401b0316119050949350505050565b60606000826001600160401b038111156134ef576134ef614224565b604051908082528060200260200182016040528015613518578160200160208202803683370190505b50905060005b8381101561359857613573600286868481811061353d5761353d614333565b905060200281019061354f9190614349565b60405160200161355f91906148ca565b6040516020818303038152906040526139b0565b82828151811061358557613585614333565b602090810291909101015260010161351e565b509392505050565b805160009085846135b2816001614999565b6135bc8385614999565b146135da57604051631a8a024960e11b815260040160405180910390fd5b6000816001600160401b038111156135f4576135f4614224565b60405190808252806020026020018201604052801561361d578160200160208202803683370190505b5090506000806000805b8581101561376a576000888510613662578584613643816149ac565b95508151811061365557613655614333565b6020026020010151613688565b8a8561366d816149ac565b96508151811061367f5761367f614333565b60200260200101515b905060008d8d8481811061369e5761369e614333565b90506020020160208101906136b391906149c5565b6136e0578f8f856136c3816149ac565b96508181106136d4576136d4614333565b90506020020135613737565b8986106137115786856136f2816149ac565b96508151811061370457613704614333565b6020026020010151613737565b8b8661371c816149ac565b97508151811061372e5761372e614333565b60200260200101515b905061374382826139e7565b87848151811061375557613755614333565b60209081029190910101525050600101613627565b5084156137bc5785811461379157604051631a8a024960e11b815260040160405180910390fd5b8360018603815181106137a6576137a6614333565b6020026020010151975050505050505050611751565b86156137d557886000815181106137a6576137a6614333565b8c8c60008181106137e8576137e8614333565b9050602002013597505050505050505095945050505050565b6000610d8160018360405160200161355f91906149e7565b6000826138268584613a16565b14949350505050565b600060606000805a90506000806138b28960008060019054906101000a900461ffff168b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e6001600160a01b0316613a5190949392919063ffffffff16565b9150915060005a90506138c6603f8b614a6c565b81116138ce57fe5b82826138da838761468e565b965096509650505050505b9450945094915050565b600060606000805a9050600080306001600160a01b03168888604051613916929190614a80565b6000604051808303816000865af19150503d8060008114613953576040519150601f19603f3d011682016040523d82523d6000602084013e613958565b606091505b50915091505a613968908461468e565b92508161397757805160208201fd5b909450925090505b9250925092565b6000806000806139968686613adb565b9250925092506139a68282613b25565b5090949350505050565b600082826040516020016139c5929190614a90565b60408051601f1981840301815282825280516020918201209083015201612001565b6000818310613a035760008281526020849052604090206110ff565b60008381526020839052604090206110ff565b600081815b845181101561359857613a4782868381518110613a3a57613a3a614333565b60200260200101516139e7565b9150600101613a1b565b6000606060008060008661ffff166001600160401b03811115613a7657613a76614224565b6040519080825280601f01601f191660200182016040528015613aa0576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115613ac1578692505b828152826000602083013e90999098509650505050505050565b60008060008351604103613b155760208401516040850151606086015160001a613b0788828585613bde565b95509550955050505061397f565b505081516000915060029061397f565b6000826003811115613b3957613b39614abf565b03613b42575050565b6001826003811115613b5657613b56614abf565b03613b745760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115613b8857613b88614abf565b03613ba95760405163fce698f760e01b815260048101829052602401610c54565b6003826003811115613bbd57613bbd614abf565b03610d28576040516335e2f38360e21b815260048101829052602401610c54565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115613c1957506000915060039050826138e5565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015613c6d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613c99575060009250600191508290506138e5565b9760009750879650945050505050565b5080546000825560020290600052602060002090810190610baf91905b80821115613cf557805467ffffffffffffffff191681556000613cec6001830182613cf9565b50600201613cc6565b5090565b508054600082556003016004900490600052602060002090810190610baf91905b80821115613cf55760008155600101613d1a565b803560ff81168114613d3f57600080fd5b919050565b600060208284031215613d5657600080fd5b6110ff82613d2e565b6001600160401b0381168114610baf57600080fd5b8035613d3f81613d5f565b600060208284031215613d9157600080fd5b81356110ff81613d5f565b60008060208385031215613daf57600080fd5b82356001600160401b0380821115613dc657600080fd5b818501915085601f830112613dda57600080fd5b813581811115613de957600080fd5b8660208260051b8501011115613dfe57600080fd5b60209290920196919550909350505050565b600060208284031215613e2257600080fd5b5035919050565b600060208284031215613e3b57600080fd5b81356001600160401b03811115613e5157600080fd5b82016101a081850312156110ff57600080fd5b60008060408385031215613e7757600080fd5b8235613e8281613d5f565b91506020830135613e9281613d5f565b809150509250929050565b60008060408385031215613eb057600080fd5b823591506020830135613e9281613d5f565b80356001600160a01b0381168114613d3f57600080fd5b60008060408385031215613eec57600080fd5b8235613ef781613d5f565b9150613f0560208401613ec2565b90509250929050565b600060208284031215613f2057600080fd5b81356001600160401b03811115613f3657600080fd5b820161018081850312156110ff57600080fd5b600080600060408486031215613f5e57600080fd5b8335613f6981613d5f565b925060208401356001600160401b0380821115613f8557600080fd5b818601915086601f830112613f9957600080fd5b813581811115613fa857600080fd5b8760208260061b8501011115613fbd57600080fd5b6020830194508093505050509250925092565b60008083601f840112613fe257600080fd5b5081356001600160401b03811115613ff957600080fd5b60208301915083602082850101111561401157600080fd5b9250929050565b6000806000806060858703121561402e57600080fd5b843561403981613d5f565b935060208501356001600160401b0381111561405457600080fd5b61406087828801613fd0565b909450925050604085013561407481613d5f565b939692955090935050565b60008060006060848603121561409457600080fd5b833561409f81613d5f565b925060208401356140af81613d5f565b915060408401356140bf81613d5f565b809150509250925092565b6000602082840312156140dc57600080fd5b6110ff82613ec2565b6000602082840312156140f757600080fd5b813561ffff811681146110ff57600080fd5b60008060008060008060a0878903121561412257600080fd5b863561412d81613d5f565b955061413b60208801613d2e565b945061414960408801613ec2565b935060608701356001600160401b0381111561416457600080fd5b61417089828a01613fd0565b909450925050608087013561418481613d5f565b809150509295509295509295565b6000808335601e198436030181126141a957600080fd5b8301803591506001600160401b038211156141c357600080fd5b6020019150600681901b360382131561401157600080fd5b6000808335601e198436030181126141f257600080fd5b8301803591506001600160401b0382111561420c57600080fd5b6020019150600581901b360382131561401157600080fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561425c5761425c614224565b60405290565b604051601f8201601f191681016001600160401b038111828210171561428a5761428a614224565b604052919050565b600060c082840312156142a457600080fd5b60405160c081018181106001600160401b03821117156142c6576142c6614224565b60405282356142d481613d5f565b815260208301356142e481613d5f565b60208201526142f560408401613d2e565b6040820152606083013561430881613d5f565b6060820152608083013561431b81613d5f565b608082015260a0928301359281019290925250919050565b634e487b7160e01b600052603260045260246000fd5b6000823560de1983360301811261435f57600080fd5b9190910192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160401b038087168352606060208401526143b6606084018688614369565b915080841660408401525095945050505050565b6000602082840312156143dc57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115614419576144196143e3565b5092915050565b6001600160a01b0387811682528616602082015260a06040820181905260009061444d9083018688614369565b6001600160401b039490941660608301525060800152949350505050565b60008235603e1983360301811261435f57600080fd5b60008135610d8181613d5f565b600160401b8211156144a2576144a2614224565b8054828255808310156114f95760008260005260206000206003850160021c81016003840160021c8201915060188660031b1680156144f2576000198083018054828460200360031b1c16815550505b505b81811015611096578281556001016144f4565b813561451281613d5f565b815467ffffffffffffffff19166001600160401b0391821617825560019081830160208581013536879003601e1901811261454c57600080fd5b860180358481111561455d57600080fd5b6020820194508060051b360385131561457557600080fd5b61457f818561448e565b60009384526020842093600282901c92505b828110156145e8576000805b60048110156145dc576145cf6145b289614481565b6001600160401b03908116600684901b90811b91901b1984161790565b978601979150880161459d565b50858201558601614591565b506003198116808203818314614623576000805b8281101561461d576146106145b28a614481565b98870198915089016145fc565b50868501555b50505050505050505050565b60006040828403121561464157600080fd5b61464961423a565b61465283613ec2565b8152602083013561466281613d5f565b60208201529392505050565b6001600160401b03828116828216039080821115614419576144196143e3565b81810381811115610d8157610d816143e3565b6000604082360312156146b357600080fd5b6146bb61423a565b6146c483613ec2565b81526020808401356001600160401b03808211156146e157600080fd5b9085019036601f8301126146f457600080fd5b81358181111561470657614706614224565b614718601f8201601f19168501614262565b9150808252368482850101111561472e57600080fd5b80848401858401376000908201840152918301919091525092915050565b60005b8381101561476757818101518382015260200161474f565b50506000910152565b6000815180845261478881602086016020860161474c565b601f01601f19169290920160200192915050565b8481526001600160a01b038416602082015282151560408201526080606082018190526000906147ce90830184614770565b9695505050505050565b6000808335601e198436030181126147ef57600080fd5b8301803591506001600160401b0382111561480957600080fd5b60200191503681900382131561401157600080fd5b6001600160401b03818116838216028082169190828114614841576148416143e3565b505092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b038084168061487957614879614849565b92169190910492915050565b6000808335601e1984360301811261489c57600080fd5b83016020810192503590506001600160401b038111156148bb57600080fd5b80360382131561401157600080fd5b60208152600082356148db81613d5f565b6001600160401b038082166020850152602085013591506148fb82613d5f565b80821660408501526040850135915061491382613d5f565b166060838101919091526001600160a01b0390614931908501613ec2565b16608083015261494360808401613ec2565b6001600160a01b03811660a08401525061496060a0840184614885565b60e060c085015261497661010085018284614369565b91505061498560c08501613d74565b6001600160401b03811660e0850152613598565b80820180821115610d8157610d816143e3565b6000600182016149be576149be6143e3565b5060010190565b6000602082840312156149d757600080fd5b813580151581146110ff57600080fd5b60c0810182356149f681613d5f565b6001600160401b039081168352602084013590614a1282613d5f565b808216602085015260ff614a2860408701613d2e565b16604085015260608501359150614a3e82613d5f565b9081166060840152608084013590614a5582613d5f565b16608083015260a092830135929091019190915290565b600082614a7b57614a7b614849565b500490565b8183823760009101908152919050565b60ff60f81b8360f81b16815260008251614ab181600185016020870161474c565b919091016001019392505050565b634e487b7160e01b600052602160045260246000fdfea06a0c1264badca141841b5f52470407dac9adaaa539dd445540986341b73a6876e8952e4b09b8d505aa08998d716721a1dbf0884ac74202e33985da1ed005e9ff37105740f03695c8f3597f3aff2b92fbe1c80abea3c28731ecff2efd693400feccba1cfc4544bf9cd83b76f36ae5c464750b6c43f682e26744ee21ec31fc1ea26469706673582212201c64c08802f39c0e27372221fce0d485982b7e409e5c3a6983f7458916a6bb9c64736f6c63430008180033a26469706673582212208c382482653f9c64e822773ab87a1b28d50314bea1154482737f3d1ff8f3f6ee64736f6c63430008180033", +// PortalAdminMetaData contains all meta data concerning the PortalAdmin contract. +var PortalAdminMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"IS_SCRIPT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"portal\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"portal\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgrade\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"deployer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"portal\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", + Bin: "0x6080604052600c805462ff00ff19166201000117905534801561002157600080fd5b50615527806100316000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633c4a374014610051578063590308a5146100665780639cded26d14610079578063f8ccbf471461008c575b600080fd5b61006461005f366004610746565b6100b3565b005b610064610074366004610746565b6101ed565b610064610087366004610779565b610295565b600c5461009f9062010000900460ff1681565b604051901515815260200160405180910390f35b604051637fec2a8d60e01b81526001600160a01b0383166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561010857600080fd5b505af115801561011c573d6000803e3d6000fd5b50505050806001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561015b57600080fd5b505af115801561016f573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156101d157600080fd5b505af11580156101e5573d6000803e3d6000fd5b505050505050565b604051637fec2a8d60e01b81526001600160a01b0383166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561024257600080fd5b505af1158015610256573d6000803e3d6000fd5b50505050806001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561015b57600080fd5b604051637fec2a8d60e01b81526001600160a01b0385166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b1580156102ea57600080fd5b505af11580156102fe573d6000803e3d6000fd5b5050505060006040516103109061071d565b604051809103906000f08015801561032c573d6000803e3d6000fd5b5090507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561038d57600080fd5b505af11580156103a1573d6000803e3d6000fd5b5050604051637fec2a8d60e01b81526001600160a01b0389166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9250637fec2a8d9150602401600060405180830381600087803b1580156103fa57600080fd5b505af115801561040e573d6000803e3d6000fd5b50505050600061041d8561055d565b604051639623609d60e01b81529091506001600160a01b03821690639623609d9061045290889086908990899060040161081b565b600060405180830381600087803b15801561046c57600080fd5b505af1158015610480573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156104e257600080fd5b505af11580156104f6573d6000803e3d6000fd5b5050505061050382610608565b6105545760405162461bcd60e51b815260206004820152601960248201527f696e697469616c697a657273206e6f742064697361626c65640000000000000060448201526064015b60405180910390fd5b50505050505050565b604051630667f9d760e41b81526001600160a01b03821660048201527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036024820152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa1580156105de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106029190610867565b92915050565b600067ffffffffffffffff61061c8361062d565b67ffffffffffffffff161492915050565b604051630667f9d760e41b81526001600160a01b03821660048201527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0060248201526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa1580156106b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d49190610867565b905067ffffffffffffffff8111156106025760405162461bcd60e51b815260206004820152600c60248201526b696e697469616c697a696e6760a01b604482015260640161054b565b614c718061088183390190565b80356001600160a01b038116811461074157600080fd5b919050565b6000806040838503121561075957600080fd5b6107628361072a565b91506107706020840161072a565b90509250929050565b60008060008060006080868803121561079157600080fd5b61079a8661072a565b94506107a86020870161072a565b93506107b66040870161072a565b9250606086013567ffffffffffffffff808211156107d357600080fd5b818801915088601f8301126107e757600080fd5b8135818111156107f657600080fd5b89602082850101111561080857600080fd5b9699959850939650602001949392505050565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b60006020828403121561087957600080fd5b505191905056fe60806040523480156200001157600080fd5b506200001c62000022565b620000d6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000735760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d35780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b614b8b80620000e66000396000f3fe60806040526004361061036b5760003560e01c80638532eb9f116101c6578063b4d5afd1116100f7578063c3d8ad6711610095578063d051c97d1161006f578063d051c97d14610af6578063d533b44514610b37578063f2fde38b14610b57578063f45cc7b814610b7757600080fd5b8063c3d8ad6714610a98578063c4ab80bc14610aad578063cf84c81814610acd57600080fd5b8063bff0e84d116100d1578063bff0e84d14610a25578063c21dda4f14610a45578063c26dfc0514610a58578063c2f9b96814610a7857600080fd5b8063b4d5afd1146109b0578063b521466d146109e5578063bb8590ad14610a0557600080fd5b8063a480ca7911610164578063afe821981161013e578063afe8219814610923578063afe8af9c14610943578063b187bd2614610979578063b2b2f5bd1461098e57600080fd5b8063a480ca79146108b3578063a8a98962146108d3578063aaf1bc97146108f357600080fd5b806397b52062116101a057806397b520621461083c5780639a8a05921461085c578063a10ac97a1461086f578063a32eb7c61461089157600080fd5b80638532eb9f146107b15780638da5cb5b146107d15780638dd9523c1461080e57600080fd5b80633f4ba83a116102a0578063575420501161023e57806374eba9391161021857806374eba9391461074057806378fe53071461076057806383d0cbd9146107875780638456cb591461079c57600080fd5b806357542050146106ca57806366a1eaf31461070b578063715018a61461072b57600080fd5b806349cc3bf61161027a57806349cc3bf614610643578063500b19e71461065d57806354d26bba1461069557806355e2448e146106aa57600080fd5b80633f4ba83a146105cd5780633fd3b15e146105e2578063461ab4881461062357600080fd5b8063241b71bb1161030d57806330632e8b116102e757806330632e8b1461052557806336d219121461054557806336d853f91461056c5780633aa873301461058c57600080fd5b8063241b71bb1461046057806324278bbe146104905780632f32700e146104c057600080fd5b806310a5a7f71161034957806310a5a7f7146103d3578063110ff5f1146103f35780631d3eb6e31461042b57806323dbce501461044b57600080fd5b80630360d20f1461037057806306c3dc5f1461039c578063103ba701146103b1575b600080fd5b34801561037c57600080fd5b50610385600281565b60405160ff90911681526020015b60405180910390f35b3480156103a857600080fd5b50610385600381565b3480156103bd57600080fd5b506103d16103cc366004613d44565b610b9e565b005b3480156103df57600080fd5b506103d16103ee366004613d7f565b610bb2565b3480156103ff57600080fd5b50600154610413906001600160401b031681565b6040516001600160401b039091168152602001610393565b34801561043757600080fd5b506103d1610446366004613d9c565b610c11565b34801561045757600080fd5b506103d1610d2c565b34801561046c57600080fd5b5061048061047b366004613e10565b610d76565b6040519015158152602001610393565b34801561049c57600080fd5b506104806104ab366004613d7f565b60056020526000908152604090205460ff1681565b3480156104cc57600080fd5b50604080518082018252600080825260209182015281518083018352600b546001600160401b0381168083526001600160a01b03600160401b909204821692840192835284519081529151169181019190915201610393565b34801561053157600080fd5b506103d1610540366004613e29565b610d87565b34801561055157600080fd5b5060015461041390600160401b90046001600160401b031681565b34801561057857600080fd5b506103d1610587366004613d7f565b61109e565b34801561059857600080fd5b506104136105a7366004613e64565b60066020908152600092835260408084209091529082529020546001600160401b031681565b3480156105d957600080fd5b506103d16110af565b3480156105ee57600080fd5b506104136105fd366004613e64565b60086020908152600092835260408084209091529082529020546001600160401b031681565b34801561062f57600080fd5b5061048061063e366004613e9d565b6110ea565b34801561064f57600080fd5b506000546103859060ff1681565b34801561066957600080fd5b5060025461067d906001600160a01b031681565b6040516001600160a01b039091168152602001610393565b3480156106a157600080fd5b506103d1611106565b3480156106b657600080fd5b50600b546001600160401b03161515610480565b3480156106d657600080fd5b506104136106e5366004613ed9565b600a6020908152600092835260408084209091529082529020546001600160401b031681565b34801561071757600080fd5b506103d1610726366004613f0e565b611150565b34801561073757600080fd5b506103d16114fe565b34801561074c57600080fd5b5061041361075b366004613e10565b611512565b34801561076c57600080fd5b5060005461041390600160681b90046001600160401b031681565b34801561079357600080fd5b506103d1611541565b3480156107a857600080fd5b506103d161158b565b3480156107bd57600080fd5b506103d16107cc366004613f49565b6115c6565b3480156107dd57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661067d565b34801561081a57600080fd5b5061082e610829366004614018565b6116d9565b604051908152602001610393565b34801561084857600080fd5b506103d161085736600461407f565b61175a565b34801561086857600080fd5b5046610413565b34801561087b57600080fd5b5061082e600080516020614af683398151915281565b34801561089d57600080fd5b5061082e600080516020614b3683398151915281565b3480156108bf57600080fd5b506103d16108ce3660046140ca565b6117d7565b3480156108df57600080fd5b506103d16108ee3660046140ca565b61185f565b3480156108ff57600080fd5b5061048061090e366004613d7f565b60046020526000908152604090205460ff1681565b34801561092f57600080fd5b506103d161093e366004613d7f565b611870565b34801561094f57600080fd5b5061041361095e366004613d7f565b6009602052600090815260409020546001600160401b031681565b34801561098557600080fd5b506104806118ca565b34801561099a57600080fd5b5061082e600080516020614ad683398151915281565b3480156109bc57600080fd5b506000546109d2906301000000900461ffff1681565b60405161ffff9091168152602001610393565b3480156109f157600080fd5b506103d1610a003660046140e5565b611920565b348015610a1157600080fd5b506103d1610a20366004613d7f565b611931565b348015610a3157600080fd5b506103d1610a403660046140e5565b611942565b6103d1610a53366004614109565b611953565b348015610a6457600080fd5b506000546109d290610100900461ffff1681565b348015610a8457600080fd5b506103d1610a93366004613d7f565b611d2d565b348015610aa457600080fd5b506103d1611d8c565b348015610ab957600080fd5b506103d1610ac836600461407f565b611dd6565b348015610ad957600080fd5b50600054610413906501000000000090046001600160401b031681565b348015610b0257600080fd5b50610413610b11366004613e64565b60076020908152600092835260408084209091529082529020546001600160401b031681565b348015610b4357600080fd5b506103d1610b52366004613d7f565b611e4a565b348015610b6357600080fd5b506103d1610b723660046140ca565b611ea4565b348015610b8357600080fd5b5060005461041390600160a81b90046001600160401b031681565b610ba6611edf565b610baf81611f3a565b50565b610bba611edf565b610bda610bd5600080516020614ad683398151915283611fd6565b61201f565b6040516001600160401b038216907fcd7910e1c5569d8433ce4ef8e5d51c1bdc03168f614b576da47dc3d2b51d033a90600090a250565b333014610c5d5760405162461bcd60e51b815260206004820152601560248201527427b6b734a837b93a30b61d1037b7363c9039b2b63360591b60448201526064015b60405180910390fd5b600154600b546001600160401b03908116600160401b9092041614610cbe5760405162461bcd60e51b815260206004820152601760248201527627b6b734a837b93a30b61d1037b7363c9031b1b430b4b760491b6044820152606401610c54565b600b54600160401b90046001600160a01b031615610d1e5760405162461bcd60e51b815260206004820152601e60248201527f4f6d6e69506f7274616c3a206f6e6c792063636861696e2073656e64657200006044820152606401610c54565b610d28828261209a565b5050565b610d34611edf565b610d4b600080516020614b3683398151915261201f565b6040517f3d0f9c56dac46156a2db0aa09ee7804770ad9fc9549d21023164f22d69475ed890600090a1565b6000610d8182612214565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610dcc5750825b90506000826001600160401b03166001148015610de85750303b155b905081158015610df6575080155b15610e145760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3e57845460ff60401b1916600160401b1785555b610e53610e4e60208801886140ca565b61227b565b610e6b610e6660408801602089016140ca565b61228c565b610e83610e7e60a0880160808901613d7f565b612330565b610e9b610e9660c0880160a08901613d7f565b6123e8565b610eb3610eae60e0880160c089016140e5565b61249c565b610ecc610ec7610100880160e089016140e5565b612540565b610ee6610ee161012088016101008901613d44565b611f3a565b610f0e610efb61018088016101608901613d7f565b610f09610180890189614192565b6125e0565b610f1e6060870160408801613d7f565b6001805467ffffffffffffffff19166001600160401b0392909216919091179055610f4f6080870160608801613d7f565b600180546001600160401b0392909216600160401b026fffffffffffffffff000000000000000019909216919091179055610104610f9561014088016101208901613d7f565b60076000610fa960808b0160608c01613d7f565b6001600160401b0390811682526020808301939093526040918201600090812086831682529093529120805467ffffffffffffffff191692909116919091179055610ffc61016088016101408901613d7f565b6008600061101060808b0160608c01613d7f565b6001600160401b03908116825260208083019390935260409182016000908120958216815294909252909220805467ffffffffffffffff191691909216179055831561109657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6110a6611edf565b610baf81612330565b6110b7611edf565b6110bf61290f565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60006110ff836110fa8585611fd6565b612926565b9392505050565b61110e611edf565b611125600080516020614ad68339815191526129ad565b6040517f4c48c7b71557216a3192842746bdfc381f98d7536d9eb1c6764f3b45e679482790600090a1565b600080516020614b3683398151915261116f6060830160408401613d7f565b61117d826110fa8484611fd6565b156111bf5760405162461bcd60e51b815260206004820152601260248201527113db5b9a541bdc9d185b0e881c185d5cd95960721b6044820152606401610c54565b6111c7612a28565b3660006111d86101008601866141db565b90925090506040850160006111f08260208901613d7f565b600154909150600160401b90046001600160401b03166112166040840160208501613d7f565b6001600160401b03161461126c5760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a2077726f6e672063636861696e20494400000000006044820152606401610c54565b826112b05760405162461bcd60e51b81526020600482015260146024820152734f6d6e69506f7274616c3a206e6f20786d73677360601b6044820152606401610c54565b6001600160401b03808216600090815260096020526040902054166113175760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a20756e6b6e6f776e2076616c2073657400000000006044820152606401610c54565b61131f612a72565b6001600160401b0316816001600160401b031610156113805760405162461bcd60e51b815260206004820152601760248201527f4f6d6e69506f7274616c3a206f6c642076616c207365740000000000000000006044820152606401610c54565b6113c487356113936101608a018a6141db565b6001600160401b038086166000908152600a6020908152604080832060099092529091205490911660026003612ac2565b6114085760405162461bcd60e51b81526020600482015260156024820152744f6d6e69506f7274616c3a206e6f2071756f72756d60581b6044820152606401610c54565b611431873583868661141e6101208d018d6141db565b61142c6101408f018f6141db565b612ce4565b61147d5760405162461bcd60e51b815260206004820152601960248201527f4f6d6e69506f7274616c3a20696e76616c69642070726f6f66000000000000006044820152606401610c54565b60005b838110156114cb576114c361149a36859003850185614292565b8686848181106114ac576114ac614333565b90506020028101906114be9190614349565b612d5f565b600101611480565b50505050506114f960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b611506611edf565b611510600061324a565b565b6003818154811061152257600080fd5b60009182526020909120600290910201546001600160401b0316905081565b611549611edf565b611560600080516020614ad683398151915261201f565b6040517f5f335a4032d4cfb6aca7835b0c2225f36d4d9eaa4ed43ee59ed537e02dff6b3990600090a1565b611593611edf565b61159b6132bb565b6040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b33301461160d5760405162461bcd60e51b815260206004820152601560248201527427b6b734a837b93a30b61d1037b7363c9039b2b63360591b6044820152606401610c54565b600154600b546001600160401b03908116600160401b909204161461166e5760405162461bcd60e51b815260206004820152601760248201527627b6b734a837b93a30b61d1037b7363c9031b1b430b4b760491b6044820152606401610c54565b600b54600160401b90046001600160a01b0316156116ce5760405162461bcd60e51b815260206004820152601e60248201527f4f6d6e69506f7274616c3a206f6e6c792063636861696e2073656e64657200006044820152606401610c54565b6114f98383836125e0565b600254604051632376548f60e21b81526000916001600160a01b031690638dd9523c90611710908890889088908890600401614392565b602060405180830381865afa15801561172d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175191906143ca565b95945050505050565b611762611edf565b6001600160401b03838116600081815260086020908152604080832087861680855290835292819020805467ffffffffffffffff191695871695861790555193845290927fe070f08cae8464c91238e8cbea64ccee5e7b48dd79a843f144e3721ee6bdd9b591015b60405180910390a3505050565b6117df611edf565b60405147906001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611817573d6000803e3d6000fd5b50816001600160a01b03167f9dc46f23cfb5ddcad0ae7ea2be38d47fec07bb9382ec7e564efc69e036dd66ce8260405161185391815260200190565b60405180910390a25050565b611867611edf565b610baf8161228c565b611878611edf565b611893610bd5600080516020614b3683398151915283611fd6565b6040516001600160401b038216907fab78810a0515df65f9f10bfbcb92d03d5df71d9fd3b9414e9ad831a5117d6daa90600090a250565b600061191b600080516020614af6833981519152600052600080516020614b168339815191526020527ffae9838a178d7f201aa98e2ce5340158edda60bb1e8f168f46503bf3e99f13be5460ff1690565b905090565b611928611edf565b610baf8161249c565b611939611edf565b610baf816123e8565b61194a611edf565b610baf81612540565b600080516020614ad683398151915286611971826110fa8484611fd6565b156119b35760405162461bcd60e51b815260206004820152601260248201527113db5b9a541bdc9d185b0e881c185d5cd95960721b6044820152606401610c54565b6001600160401b03881660009081526005602052604090205460ff16611a1b5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a20756e737570706f727465642064657374000000006044820152606401610c54565b6001600160a01b038616611a715760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a206e6f20706f7274616c207863616c6c00000000006044820152606401610c54565b6000546001600160401b036501000000000090910481169084161115611ad95760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a206761734c696d697420746f6f20686967680000006044820152606401610c54565b6000546001600160401b03600160681b90910481169084161015611b3f5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a206761734c696d697420746f6f206c6f77000000006044820152606401610c54565b6000546301000000900461ffff16841115611b9c5760405162461bcd60e51b815260206004820152601a60248201527f4f6d6e69506f7274616c3a206461746120746f6f206c617267650000000000006044820152606401610c54565b60ff808816600081815260046020526040902054909116611bff5760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a20756e737570706f727465642073686172640000006044820152606401610c54565b6000611c0d8a8888886116d9565b905080341015611c5f5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a20696e73756666696369656e7420666565000000006044820152606401610c54565b6001600160401b03808b166000908152600660209081526040808320868516845290915281208054600193919291611c99918591166143f9565b82546101009290920a6001600160401b038181021990931691831602179091558b811660008181526006602090815260408083208886168085529252918290205491519190931693507fb7c8eb9d7a7fbcdab809ab7b8a7c41701eb3115e3fe99d30ff490d8552f72bfa90611d199033908e908e908e908e908b90614420565b60405180910390a450505050505050505050565b611d35611edf565b611d55611d50600080516020614b3683398151915283611fd6565b6129ad565b6040516001600160401b038216907fc551305d9bd408be4327b7f8aba28b04ccf6b6c76925392d195ecf9cc764294d90600090a250565b611d94611edf565b611dab600080516020614b368339815191526129ad565b6040517f2cb9d71d4c31860b70e9b707c69aa2f5953e03474f00cfcfff205c4745f8287590600090a1565b611dde611edf565b6001600160401b03838116600081815260076020908152604080832087861680855290835292819020805467ffffffffffffffff191695871695861790555193845290927f8647aae68c8456a1dcbfaf5eaadc94278ae423526d3f09c7b972bff7355d55c791016117ca565b611e52611edf565b611e6d611d50600080516020614ad683398151915283611fd6565b6040516001600160401b038216907f1ed9223556fb0971076c30172f1f00630efd313b6a05290a562aef95928e712590600090a250565b611eac611edf565b6001600160a01b038116611ed657604051631e4fbdf760e01b815260006004820152602401610c54565b610baf8161324a565b33611f117f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146115105760405163118cdaa760e01b8152336004820152602401610c54565b60008160ff1611611f8d5760405162461bcd60e51b815260206004820152601a60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206375746f66660000000000006044820152606401610c54565b6000805460ff191660ff83169081179091556040519081527f1683dc51426224f6e37a3b41dd5849e2db1bfe22366d1d913fa0ef6f757e828f906020015b60405180910390a150565b6000828260405160200161200192919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905092915050565b6000818152600080516020614b16833981519152602081905260409091205460ff16156120815760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c54565b600091825260205260409020805460ff19166001179055565b6120a26132d2565b3660005b8281101561220e578383828181106120c0576120c0614333565b90506020028101906120d2919061446b565b6003805460018101825560009190915290925082906002027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b016121168282614507565b505061211f4690565b6001600160401b03166121356020840184613d7f565b6001600160401b031614612183576001600560006121566020860186613d7f565b6001600160401b031681526020810191909152604001600020805460ff1916911515919091179055612206565b60005b61219360208401846141db565b9050811015612204576001600460006121af60208701876141db565b858181106121bf576121bf614333565b90506020020160208101906121d49190613d7f565b6001600160401b031681526020810191909152604001600020805460ff1916911515919091179055600101612186565b505b6001016120a6565b50505050565b600080516020614af68339815191526000908152600080516020614b1683398151915260208190527ffae9838a178d7f201aa98e2ce5340158edda60bb1e8f168f46503bf3e99f13be5460ff16806110ff5750600092835260205250604090205460ff1690565b6122836133d1565b610baf8161341a565b6001600160a01b0381166122e25760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206665654f7261636c650000006044820152606401610c54565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd97bdb0db82b52a85aa07f8da78033b1d6e159d94f1e3cbd4109d946c3bcfd3290602001611fcb565b6000816001600160401b0316116123895760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206d61782067617300000000006044820152606401610c54565b600080546cffffffffffffffff00000000001916650100000000006001600160401b038416908102919091179091556040519081527f1153561ac5effc2926ba6c612f86a397c997bc43dfbfc718da08065be0c5fe4d90602001611fcb565b6000816001600160401b0316116124415760405162461bcd60e51b815260206004820152601b60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206d696e2067617300000000006044820152606401610c54565b6000805467ffffffffffffffff60681b1916600160681b6001600160401b038416908102919091179091556040519081527f8c852a6291aa436654b167353bca4a4b0c3d024c7562cb5082e7c869bddabf3e90602001611fcb565b60008161ffff16116124f05760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206d61782073697a65000000006044820152606401610c54565b6000805464ffff0000001916630100000061ffff8416908102919091179091556040519081527f65923e04419dc810d0ea08a94a7f608d4c4d949818d95c3788f895e575dd206490602001611fcb565b60008161ffff16116125945760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a206e6f207a65726f206d61782073697a65000000006044820152606401610c54565b6000805462ffff00191661010061ffff8416908102919091179091556040519081527f620bbea084306b66a8cc6b5b63830d6b3874f9d2438914e259ffd5065c33f7b090602001611fcb565b808061262e5760405162461bcd60e51b815260206004820152601960248201527f4f6d6e69506f7274616c3a206e6f2076616c696461746f7273000000000000006044820152606401610c54565b6001600160401b0380851660009081526009602052604090205416156126965760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a206475706c69636174652076616c207365740000006044820152606401610c54565b604080518082018252600080825260208083018290526001600160401b0388168252600a9052918220825b8481101561286e578686828181106126db576126db614333565b9050604002018036038101906126f1919061462f565b80519093506001600160a01b031661274b5760405162461bcd60e51b815260206004820152601d60248201527f4f6d6e69506f7274616c3a206e6f207a65726f2076616c696461746f720000006044820152606401610c54565b600083602001516001600160401b0316116127a85760405162461bcd60e51b815260206004820152601960248201527f4f6d6e69506f7274616c3a206e6f207a65726f20706f776572000000000000006044820152606401610c54565b82516001600160a01b03166000908152602083905260409020546001600160401b0316156128185760405162461bcd60e51b815260206004820152601f60248201527f4f6d6e69506f7274616c3a206475706c69636174652076616c696461746f72006044820152606401610c54565b602083015161282790856143f9565b60208481015185516001600160a01b03166000908152918590526040909120805467ffffffffffffffff19166001600160401b0390921691909117905593506001016126c1565b506001600160401b038781166000818152600960205260408120805467ffffffffffffffff191687851617905554600160a81b900490911610156128d2576000805467ffffffffffffffff60a81b1916600160a81b6001600160401b038a16021790555b6040516001600160401b038816907f3a7c2f997a87ba92aedaecd1127f4129cae1283e2809ebf5304d321b943fd10790600090a250505050505050565b611510600080516020614af68339815191526129ad565b600080516020614af68339815191526000908152600080516020614b1683398151915260208190527ffae9838a178d7f201aa98e2ce5340158edda60bb1e8f168f46503bf3e99f13be5460ff168061298c575060008481526020829052604090205460ff165b806129a5575060008381526020829052604090205460ff165b949350505050565b6000818152600080516020614b16833981519152602081905260409091205460ff16612a125760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c54565b600091825260205260409020805460ff19169055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901612a6c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6000805460ff8116600160a81b9091046001600160401b031611612a965750600190565b600054612ab79060ff811690600160a81b90046001600160401b031661466e565b61191b9060016143f9565b6000803660005b88811015612cd157898982818110612ae357612ae3614333565b9050602002810190612af5919061446b565b91508015612c175760008a8a612b0c60018561468e565b818110612b1b57612b1b614333565b9050602002810190612b2d919061446b565b612b36906146a1565b80519091506001600160a01b0316612b5160208501856140ca565b6001600160a01b031603612ba75760405162461bcd60e51b815260206004820152601b60248201527f51756f72756d3a206475706c69636174652076616c696461746f7200000000006044820152606401610c54565b80516001600160a01b0316612bbf60208501856140ca565b6001600160a01b031611612c155760405162461bcd60e51b815260206004820152601760248201527f51756f72756d3a2073696773206e6f7420736f727465640000000000000000006044820152606401610c54565b505b612c21828c613422565b612c6d5760405162461bcd60e51b815260206004820152601960248201527f51756f72756d3a20696e76616c6964207369676e6174757265000000000000006044820152606401610c54565b876000612c7d60208501856140ca565b6001600160a01b03168152602081019190915260400160002054612caa906001600160401b0316846143f9565b9250612cb883888888613496565b15612cc95760019350505050612cd9565b600101612ac9565b506000925050505b979650505050505050565b60408051600180825281830190925260009182919060208083019080368337019050509050612d1f86868686612d1a8d8d6134d3565b6135a0565b81600081518110612d3257612d32614333565b602002602001018181525050612d51818b612d4c8c613801565b613819565b9a9950505050505050505050565b81516000612d706020840184613d7f565b90506000612d846040850160208601613d7f565b90506000612d986060860160408701613d7f565b9050466001600160401b0316836001600160401b03161480612dc157506001600160401b038316155b612e0d5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a2077726f6e67206465737420636861696e000000006044820152606401610c54565b6001600160401b0380851660009081526007602090815260408083208685168452909152902054612e40911660016143f9565b6001600160401b0316816001600160401b031614612ea05760405162461bcd60e51b815260206004820152601860248201527f4f6d6e69506f7274616c3a2077726f6e67206f666673657400000000000000006044820152606401610c54565b856040015160ff16600460ff161480612ec257508160ff16866040015160ff16145b612f0e5760405162461bcd60e51b815260206004820152601c60248201527f4f6d6e69506f7274616c3a2077726f6e6720636f6e66206c6576656c000000006044820152606401610c54565b60608601516001600160401b038581166000908152600860209081526040808320878516845290915290205491811691161015612f855760608601516001600160401b03858116600090815260086020908152604080832087851684529091529020805467ffffffffffffffff1916919092161790555b6001600160401b038085166000908152600760209081526040808320868516845290915281208054600193919291612fbf918591166143f9565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550306001600160a01b031685608001602081019061300091906140ca565b6001600160a01b0316036130da57806001600160401b0316826001600160401b0316856001600160401b03167f8277cab1f0fa69b34674f64a7d43f242b0bacece6f5b7e8652f1e0d88a9b873b6000336000604051602401613093906020808252601e908201527f4f6d6e69506f7274616c3a206e6f207863616c6c20746f20706f7274616c0000604082015260600190565b60408051601f198184030181529181526020820180516001600160e01b031662461bcd60e51b179052516130ca949392919061479c565b60405180910390a4505050505050565b604080518082019091526001600160401b03851681526020810161310460808801606089016140ca565b6001600160a01b039081169091528151600b8054602090940151909216600160401b026001600160e01b03199093166001600160401b0390911617919091179055600080808061315a60a08a0160808b016140ca565b6001600160a01b0316146131ab576131a661317b60a08a0160808b016140ca565b61318b60e08b0160c08c01613d7f565b6001600160401b03166131a160a08c018c6147d8565b61382f565b6131c0565b6131c06131bb60a08a018a6147d8565b6138ef565b600b80546001600160e01b0319169055919450925090506000836131e457826131f5565b604051806020016040528060008152505b9050846001600160401b0316866001600160401b0316896001600160401b03167f8277cab1f0fa69b34674f64a7d43f242b0bacece6f5b7e8652f1e0d88a9b873b85338987604051611d19949392919061479c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b611510600080516020614af683398151915261201f565b6000805b6003548110156133c457600381815481106132f3576132f3614333565b9060005260206000209060020201915061330a4690565b82546001600160401b039081169116146133445781546001600160401b03166000908152600560205260409020805460ff191690556133bc565b60005b60018301548110156133ba5760006004600085600101848154811061336e5761336e614333565b6000918252602080832060048304015460039092166008026101000a9091046001600160401b031683528201929092526040019020805460ff1916911515919091179055600101613347565b505b6001016132d6565b50610baf60036000613ca9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661151057604051631afcd79f60e31b815260040160405180910390fd5b611eac6133d1565b600061343160208401846140ca565b6001600160a01b03166134858361344b60208701876147d8565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061398692505050565b6001600160a01b0316149392505050565b60008160ff168360ff16856134ab919061481e565b6134b5919061485f565b6001600160401b0316856001600160401b0316119050949350505050565b60606000826001600160401b038111156134ef576134ef614224565b604051908082528060200260200182016040528015613518578160200160208202803683370190505b50905060005b8381101561359857613573600286868481811061353d5761353d614333565b905060200281019061354f9190614349565b60405160200161355f91906148ca565b6040516020818303038152906040526139b0565b82828151811061358557613585614333565b602090810291909101015260010161351e565b509392505050565b805160009085846135b2816001614999565b6135bc8385614999565b146135da57604051631a8a024960e11b815260040160405180910390fd5b6000816001600160401b038111156135f4576135f4614224565b60405190808252806020026020018201604052801561361d578160200160208202803683370190505b5090506000806000805b8581101561376a576000888510613662578584613643816149ac565b95508151811061365557613655614333565b6020026020010151613688565b8a8561366d816149ac565b96508151811061367f5761367f614333565b60200260200101515b905060008d8d8481811061369e5761369e614333565b90506020020160208101906136b391906149c5565b6136e0578f8f856136c3816149ac565b96508181106136d4576136d4614333565b90506020020135613737565b8986106137115786856136f2816149ac565b96508151811061370457613704614333565b6020026020010151613737565b8b8661371c816149ac565b97508151811061372e5761372e614333565b60200260200101515b905061374382826139e7565b87848151811061375557613755614333565b60209081029190910101525050600101613627565b5084156137bc5785811461379157604051631a8a024960e11b815260040160405180910390fd5b8360018603815181106137a6576137a6614333565b6020026020010151975050505050505050611751565b86156137d557886000815181106137a6576137a6614333565b8c8c60008181106137e8576137e8614333565b9050602002013597505050505050505095945050505050565b6000610d8160018360405160200161355f91906149e7565b6000826138268584613a16565b14949350505050565b600060606000805a90506000806138b28960008060019054906101000a900461ffff168b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e6001600160a01b0316613a5190949392919063ffffffff16565b9150915060005a90506138c6603f8b614a6c565b81116138ce57fe5b82826138da838761468e565b965096509650505050505b9450945094915050565b600060606000805a9050600080306001600160a01b03168888604051613916929190614a80565b6000604051808303816000865af19150503d8060008114613953576040519150601f19603f3d011682016040523d82523d6000602084013e613958565b606091505b50915091505a613968908461468e565b92508161397757805160208201fd5b909450925090505b9250925092565b6000806000806139968686613adb565b9250925092506139a68282613b25565b5090949350505050565b600082826040516020016139c5929190614a90565b60408051601f1981840301815282825280516020918201209083015201612001565b6000818310613a035760008281526020849052604090206110ff565b60008381526020839052604090206110ff565b600081815b845181101561359857613a4782868381518110613a3a57613a3a614333565b60200260200101516139e7565b9150600101613a1b565b6000606060008060008661ffff166001600160401b03811115613a7657613a76614224565b6040519080825280601f01601f191660200182016040528015613aa0576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115613ac1578692505b828152826000602083013e90999098509650505050505050565b60008060008351604103613b155760208401516040850151606086015160001a613b0788828585613bde565b95509550955050505061397f565b505081516000915060029061397f565b6000826003811115613b3957613b39614abf565b03613b42575050565b6001826003811115613b5657613b56614abf565b03613b745760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115613b8857613b88614abf565b03613ba95760405163fce698f760e01b815260048101829052602401610c54565b6003826003811115613bbd57613bbd614abf565b03610d28576040516335e2f38360e21b815260048101829052602401610c54565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115613c1957506000915060039050826138e5565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015613c6d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613c99575060009250600191508290506138e5565b9760009750879650945050505050565b5080546000825560020290600052602060002090810190610baf91905b80821115613cf557805467ffffffffffffffff191681556000613cec6001830182613cf9565b50600201613cc6565b5090565b508054600082556003016004900490600052602060002090810190610baf91905b80821115613cf55760008155600101613d1a565b803560ff81168114613d3f57600080fd5b919050565b600060208284031215613d5657600080fd5b6110ff82613d2e565b6001600160401b0381168114610baf57600080fd5b8035613d3f81613d5f565b600060208284031215613d9157600080fd5b81356110ff81613d5f565b60008060208385031215613daf57600080fd5b82356001600160401b0380821115613dc657600080fd5b818501915085601f830112613dda57600080fd5b813581811115613de957600080fd5b8660208260051b8501011115613dfe57600080fd5b60209290920196919550909350505050565b600060208284031215613e2257600080fd5b5035919050565b600060208284031215613e3b57600080fd5b81356001600160401b03811115613e5157600080fd5b82016101a081850312156110ff57600080fd5b60008060408385031215613e7757600080fd5b8235613e8281613d5f565b91506020830135613e9281613d5f565b809150509250929050565b60008060408385031215613eb057600080fd5b823591506020830135613e9281613d5f565b80356001600160a01b0381168114613d3f57600080fd5b60008060408385031215613eec57600080fd5b8235613ef781613d5f565b9150613f0560208401613ec2565b90509250929050565b600060208284031215613f2057600080fd5b81356001600160401b03811115613f3657600080fd5b820161018081850312156110ff57600080fd5b600080600060408486031215613f5e57600080fd5b8335613f6981613d5f565b925060208401356001600160401b0380821115613f8557600080fd5b818601915086601f830112613f9957600080fd5b813581811115613fa857600080fd5b8760208260061b8501011115613fbd57600080fd5b6020830194508093505050509250925092565b60008083601f840112613fe257600080fd5b5081356001600160401b03811115613ff957600080fd5b60208301915083602082850101111561401157600080fd5b9250929050565b6000806000806060858703121561402e57600080fd5b843561403981613d5f565b935060208501356001600160401b0381111561405457600080fd5b61406087828801613fd0565b909450925050604085013561407481613d5f565b939692955090935050565b60008060006060848603121561409457600080fd5b833561409f81613d5f565b925060208401356140af81613d5f565b915060408401356140bf81613d5f565b809150509250925092565b6000602082840312156140dc57600080fd5b6110ff82613ec2565b6000602082840312156140f757600080fd5b813561ffff811681146110ff57600080fd5b60008060008060008060a0878903121561412257600080fd5b863561412d81613d5f565b955061413b60208801613d2e565b945061414960408801613ec2565b935060608701356001600160401b0381111561416457600080fd5b61417089828a01613fd0565b909450925050608087013561418481613d5f565b809150509295509295509295565b6000808335601e198436030181126141a957600080fd5b8301803591506001600160401b038211156141c357600080fd5b6020019150600681901b360382131561401157600080fd5b6000808335601e198436030181126141f257600080fd5b8301803591506001600160401b0382111561420c57600080fd5b6020019150600581901b360382131561401157600080fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561425c5761425c614224565b60405290565b604051601f8201601f191681016001600160401b038111828210171561428a5761428a614224565b604052919050565b600060c082840312156142a457600080fd5b60405160c081018181106001600160401b03821117156142c6576142c6614224565b60405282356142d481613d5f565b815260208301356142e481613d5f565b60208201526142f560408401613d2e565b6040820152606083013561430881613d5f565b6060820152608083013561431b81613d5f565b608082015260a0928301359281019290925250919050565b634e487b7160e01b600052603260045260246000fd5b6000823560de1983360301811261435f57600080fd5b9190910192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160401b038087168352606060208401526143b6606084018688614369565b915080841660408401525095945050505050565b6000602082840312156143dc57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115614419576144196143e3565b5092915050565b6001600160a01b0387811682528616602082015260a06040820181905260009061444d9083018688614369565b6001600160401b039490941660608301525060800152949350505050565b60008235603e1983360301811261435f57600080fd5b60008135610d8181613d5f565b600160401b8211156144a2576144a2614224565b8054828255808310156114f95760008260005260206000206003850160021c81016003840160021c8201915060188660031b1680156144f2576000198083018054828460200360031b1c16815550505b505b81811015611096578281556001016144f4565b813561451281613d5f565b815467ffffffffffffffff19166001600160401b0391821617825560019081830160208581013536879003601e1901811261454c57600080fd5b860180358481111561455d57600080fd5b6020820194508060051b360385131561457557600080fd5b61457f818561448e565b60009384526020842093600282901c92505b828110156145e8576000805b60048110156145dc576145cf6145b289614481565b6001600160401b03908116600684901b90811b91901b1984161790565b978601979150880161459d565b50858201558601614591565b506003198116808203818314614623576000805b8281101561461d576146106145b28a614481565b98870198915089016145fc565b50868501555b50505050505050505050565b60006040828403121561464157600080fd5b61464961423a565b61465283613ec2565b8152602083013561466281613d5f565b60208201529392505050565b6001600160401b03828116828216039080821115614419576144196143e3565b81810381811115610d8157610d816143e3565b6000604082360312156146b357600080fd5b6146bb61423a565b6146c483613ec2565b81526020808401356001600160401b03808211156146e157600080fd5b9085019036601f8301126146f457600080fd5b81358181111561470657614706614224565b614718601f8201601f19168501614262565b9150808252368482850101111561472e57600080fd5b80848401858401376000908201840152918301919091525092915050565b60005b8381101561476757818101518382015260200161474f565b50506000910152565b6000815180845261478881602086016020860161474c565b601f01601f19169290920160200192915050565b8481526001600160a01b038416602082015282151560408201526080606082018190526000906147ce90830184614770565b9695505050505050565b6000808335601e198436030181126147ef57600080fd5b8301803591506001600160401b0382111561480957600080fd5b60200191503681900382131561401157600080fd5b6001600160401b03818116838216028082169190828114614841576148416143e3565b505092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b038084168061487957614879614849565b92169190910492915050565b6000808335601e1984360301811261489c57600080fd5b83016020810192503590506001600160401b038111156148bb57600080fd5b80360382131561401157600080fd5b60208152600082356148db81613d5f565b6001600160401b038082166020850152602085013591506148fb82613d5f565b80821660408501526040850135915061491382613d5f565b166060838101919091526001600160a01b0390614931908501613ec2565b16608083015261494360808401613ec2565b6001600160a01b03811660a08401525061496060a0840184614885565b60e060c085015261497661010085018284614369565b91505061498560c08501613d74565b6001600160401b03811660e0850152613598565b80820180821115610d8157610d816143e3565b6000600182016149be576149be6143e3565b5060010190565b6000602082840312156149d757600080fd5b813580151581146110ff57600080fd5b60c0810182356149f681613d5f565b6001600160401b039081168352602084013590614a1282613d5f565b808216602085015260ff614a2860408701613d2e565b16604085015260608501359150614a3e82613d5f565b9081166060840152608084013590614a5582613d5f565b16608083015260a092830135929091019190915290565b600082614a7b57614a7b614849565b500490565b8183823760009101908152919050565b60ff60f81b8360f81b16815260008251614ab181600185016020870161474c565b919091016001019392505050565b634e487b7160e01b600052602160045260246000fdfea06a0c1264badca141841b5f52470407dac9adaaa539dd445540986341b73a6876e8952e4b09b8d505aa08998d716721a1dbf0884ac74202e33985da1ed005e9ff37105740f03695c8f3597f3aff2b92fbe1c80abea3c28731ecff2efd693400feccba1cfc4544bf9cd83b76f36ae5c464750b6c43f682e26744ee21ec31fc1ea26469706673582212201c64c08802f39c0e27372221fce0d485982b7e409e5c3a6983f7458916a6bb9c64736f6c63430008180033a264697066735822122018db8a58a0873857e197ce1ac327817bfab006aba30cdf5be251a3caff5a612264736f6c63430008180033", } -// AdminABI is the input ABI used to generate the binding from. -// Deprecated: Use AdminMetaData.ABI instead. -var AdminABI = AdminMetaData.ABI +// PortalAdminABI is the input ABI used to generate the binding from. +// Deprecated: Use PortalAdminMetaData.ABI instead. +var PortalAdminABI = PortalAdminMetaData.ABI -// AdminBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use AdminMetaData.Bin instead. -var AdminBin = AdminMetaData.Bin +// PortalAdminBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use PortalAdminMetaData.Bin instead. +var PortalAdminBin = PortalAdminMetaData.Bin -// DeployAdmin deploys a new Ethereum contract, binding an instance of Admin to it. -func DeployAdmin(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Admin, error) { - parsed, err := AdminMetaData.GetAbi() +// DeployPortalAdmin deploys a new Ethereum contract, binding an instance of PortalAdmin to it. +func DeployPortalAdmin(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *PortalAdmin, error) { + parsed, err := PortalAdminMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err } @@ -53,111 +53,111 @@ func DeployAdmin(auth *bind.TransactOpts, backend bind.ContractBackend) (common. return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AdminBin), backend) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PortalAdminBin), backend) if err != nil { return common.Address{}, nil, nil, err } - return address, tx, &Admin{AdminCaller: AdminCaller{contract: contract}, AdminTransactor: AdminTransactor{contract: contract}, AdminFilterer: AdminFilterer{contract: contract}}, nil + return address, tx, &PortalAdmin{PortalAdminCaller: PortalAdminCaller{contract: contract}, PortalAdminTransactor: PortalAdminTransactor{contract: contract}, PortalAdminFilterer: PortalAdminFilterer{contract: contract}}, nil } -// Admin is an auto generated Go binding around an Ethereum contract. -type Admin struct { - AdminCaller // Read-only binding to the contract - AdminTransactor // Write-only binding to the contract - AdminFilterer // Log filterer for contract events +// PortalAdmin is an auto generated Go binding around an Ethereum contract. +type PortalAdmin struct { + PortalAdminCaller // Read-only binding to the contract + PortalAdminTransactor // Write-only binding to the contract + PortalAdminFilterer // Log filterer for contract events } -// AdminCaller is an auto generated read-only Go binding around an Ethereum contract. -type AdminCaller struct { +// PortalAdminCaller is an auto generated read-only Go binding around an Ethereum contract. +type PortalAdminCaller struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } -// AdminTransactor is an auto generated write-only Go binding around an Ethereum contract. -type AdminTransactor struct { +// PortalAdminTransactor is an auto generated write-only Go binding around an Ethereum contract. +type PortalAdminTransactor struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } -// AdminFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type AdminFilterer struct { +// PortalAdminFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type PortalAdminFilterer struct { contract *bind.BoundContract // Generic contract wrapper for the low level calls } -// AdminSession is an auto generated Go binding around an Ethereum contract, +// PortalAdminSession is an auto generated Go binding around an Ethereum contract, // with pre-set call and transact options. -type AdminSession struct { - Contract *Admin // Generic contract binding to set the session for +type PortalAdminSession struct { + Contract *PortalAdmin // Generic contract binding to set the session for CallOpts bind.CallOpts // Call options to use throughout this session TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } -// AdminCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// PortalAdminCallerSession is an auto generated read-only Go binding around an Ethereum contract, // with pre-set call options. -type AdminCallerSession struct { - Contract *AdminCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session +type PortalAdminCallerSession struct { + Contract *PortalAdminCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session } -// AdminTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// PortalAdminTransactorSession is an auto generated write-only Go binding around an Ethereum contract, // with pre-set transact options. -type AdminTransactorSession struct { - Contract *AdminTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +type PortalAdminTransactorSession struct { + Contract *PortalAdminTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session } -// AdminRaw is an auto generated low-level Go binding around an Ethereum contract. -type AdminRaw struct { - Contract *Admin // Generic contract binding to access the raw methods on +// PortalAdminRaw is an auto generated low-level Go binding around an Ethereum contract. +type PortalAdminRaw struct { + Contract *PortalAdmin // Generic contract binding to access the raw methods on } -// AdminCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type AdminCallerRaw struct { - Contract *AdminCaller // Generic read-only contract binding to access the raw methods on +// PortalAdminCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type PortalAdminCallerRaw struct { + Contract *PortalAdminCaller // Generic read-only contract binding to access the raw methods on } -// AdminTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type AdminTransactorRaw struct { - Contract *AdminTransactor // Generic write-only contract binding to access the raw methods on +// PortalAdminTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type PortalAdminTransactorRaw struct { + Contract *PortalAdminTransactor // Generic write-only contract binding to access the raw methods on } -// NewAdmin creates a new instance of Admin, bound to a specific deployed contract. -func NewAdmin(address common.Address, backend bind.ContractBackend) (*Admin, error) { - contract, err := bindAdmin(address, backend, backend, backend) +// NewPortalAdmin creates a new instance of PortalAdmin, bound to a specific deployed contract. +func NewPortalAdmin(address common.Address, backend bind.ContractBackend) (*PortalAdmin, error) { + contract, err := bindPortalAdmin(address, backend, backend, backend) if err != nil { return nil, err } - return &Admin{AdminCaller: AdminCaller{contract: contract}, AdminTransactor: AdminTransactor{contract: contract}, AdminFilterer: AdminFilterer{contract: contract}}, nil + return &PortalAdmin{PortalAdminCaller: PortalAdminCaller{contract: contract}, PortalAdminTransactor: PortalAdminTransactor{contract: contract}, PortalAdminFilterer: PortalAdminFilterer{contract: contract}}, nil } -// NewAdminCaller creates a new read-only instance of Admin, bound to a specific deployed contract. -func NewAdminCaller(address common.Address, caller bind.ContractCaller) (*AdminCaller, error) { - contract, err := bindAdmin(address, caller, nil, nil) +// NewPortalAdminCaller creates a new read-only instance of PortalAdmin, bound to a specific deployed contract. +func NewPortalAdminCaller(address common.Address, caller bind.ContractCaller) (*PortalAdminCaller, error) { + contract, err := bindPortalAdmin(address, caller, nil, nil) if err != nil { return nil, err } - return &AdminCaller{contract: contract}, nil + return &PortalAdminCaller{contract: contract}, nil } -// NewAdminTransactor creates a new write-only instance of Admin, bound to a specific deployed contract. -func NewAdminTransactor(address common.Address, transactor bind.ContractTransactor) (*AdminTransactor, error) { - contract, err := bindAdmin(address, nil, transactor, nil) +// NewPortalAdminTransactor creates a new write-only instance of PortalAdmin, bound to a specific deployed contract. +func NewPortalAdminTransactor(address common.Address, transactor bind.ContractTransactor) (*PortalAdminTransactor, error) { + contract, err := bindPortalAdmin(address, nil, transactor, nil) if err != nil { return nil, err } - return &AdminTransactor{contract: contract}, nil + return &PortalAdminTransactor{contract: contract}, nil } -// NewAdminFilterer creates a new log filterer instance of Admin, bound to a specific deployed contract. -func NewAdminFilterer(address common.Address, filterer bind.ContractFilterer) (*AdminFilterer, error) { - contract, err := bindAdmin(address, nil, nil, filterer) +// NewPortalAdminFilterer creates a new log filterer instance of PortalAdmin, bound to a specific deployed contract. +func NewPortalAdminFilterer(address common.Address, filterer bind.ContractFilterer) (*PortalAdminFilterer, error) { + contract, err := bindPortalAdmin(address, nil, nil, filterer) if err != nil { return nil, err } - return &AdminFilterer{contract: contract}, nil + return &PortalAdminFilterer{contract: contract}, nil } -// bindAdmin binds a generic wrapper to an already deployed contract. -func bindAdmin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := AdminMetaData.GetAbi() +// bindPortalAdmin binds a generic wrapper to an already deployed contract. +func bindPortalAdmin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := PortalAdminMetaData.GetAbi() if err != nil { return nil, err } @@ -168,46 +168,46 @@ func bindAdmin(address common.Address, caller bind.ContractCaller, transactor bi // sets the output to result. The result type might be a single field for simple // returns, a slice of interfaces for anonymous returns and a struct for named // returns. -func (_Admin *AdminRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _Admin.Contract.AdminCaller.contract.Call(opts, result, method, params...) +func (_PortalAdmin *PortalAdminRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PortalAdmin.Contract.PortalAdminCaller.contract.Call(opts, result, method, params...) } // Transfer initiates a plain transaction to move funds to the contract, calling // its default method if one is available. -func (_Admin *AdminRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Admin.Contract.AdminTransactor.contract.Transfer(opts) +func (_PortalAdmin *PortalAdminRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PortalAdmin.Contract.PortalAdminTransactor.contract.Transfer(opts) } // Transact invokes the (paid) contract method with params as input values. -func (_Admin *AdminRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Admin.Contract.AdminTransactor.contract.Transact(opts, method, params...) +func (_PortalAdmin *PortalAdminRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PortalAdmin.Contract.PortalAdminTransactor.contract.Transact(opts, method, params...) } // Call invokes the (constant) contract method with params as input values and // sets the output to result. The result type might be a single field for simple // returns, a slice of interfaces for anonymous returns and a struct for named // returns. -func (_Admin *AdminCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _Admin.Contract.contract.Call(opts, result, method, params...) +func (_PortalAdmin *PortalAdminCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PortalAdmin.Contract.contract.Call(opts, result, method, params...) } // Transfer initiates a plain transaction to move funds to the contract, calling // its default method if one is available. -func (_Admin *AdminTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Admin.Contract.contract.Transfer(opts) +func (_PortalAdmin *PortalAdminTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PortalAdmin.Contract.contract.Transfer(opts) } // Transact invokes the (paid) contract method with params as input values. -func (_Admin *AdminTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Admin.Contract.contract.Transact(opts, method, params...) +func (_PortalAdmin *PortalAdminTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PortalAdmin.Contract.contract.Transact(opts, method, params...) } // ISSCRIPT is a free data retrieval call binding the contract method 0xf8ccbf47. // // Solidity: function IS_SCRIPT() view returns(bool) -func (_Admin *AdminCaller) ISSCRIPT(opts *bind.CallOpts) (bool, error) { +func (_PortalAdmin *PortalAdminCaller) ISSCRIPT(opts *bind.CallOpts) (bool, error) { var out []interface{} - err := _Admin.contract.Call(opts, &out, "IS_SCRIPT") + err := _PortalAdmin.contract.Call(opts, &out, "IS_SCRIPT") if err != nil { return *new(bool), err @@ -222,76 +222,76 @@ func (_Admin *AdminCaller) ISSCRIPT(opts *bind.CallOpts) (bool, error) { // ISSCRIPT is a free data retrieval call binding the contract method 0xf8ccbf47. // // Solidity: function IS_SCRIPT() view returns(bool) -func (_Admin *AdminSession) ISSCRIPT() (bool, error) { - return _Admin.Contract.ISSCRIPT(&_Admin.CallOpts) +func (_PortalAdmin *PortalAdminSession) ISSCRIPT() (bool, error) { + return _PortalAdmin.Contract.ISSCRIPT(&_PortalAdmin.CallOpts) } // ISSCRIPT is a free data retrieval call binding the contract method 0xf8ccbf47. // // Solidity: function IS_SCRIPT() view returns(bool) -func (_Admin *AdminCallerSession) ISSCRIPT() (bool, error) { - return _Admin.Contract.ISSCRIPT(&_Admin.CallOpts) +func (_PortalAdmin *PortalAdminCallerSession) ISSCRIPT() (bool, error) { + return _PortalAdmin.Contract.ISSCRIPT(&_PortalAdmin.CallOpts) } -// PausePortal is a paid mutator transaction binding the contract method 0xcfbf9af7. +// Pause is a paid mutator transaction binding the contract method 0x590308a5. // -// Solidity: function pausePortal(address admin, address portal) returns() -func (_Admin *AdminTransactor) PausePortal(opts *bind.TransactOpts, admin common.Address, portal common.Address) (*types.Transaction, error) { - return _Admin.contract.Transact(opts, "pausePortal", admin, portal) +// Solidity: function pause(address admin, address portal) returns() +func (_PortalAdmin *PortalAdminTransactor) Pause(opts *bind.TransactOpts, admin common.Address, portal common.Address) (*types.Transaction, error) { + return _PortalAdmin.contract.Transact(opts, "pause", admin, portal) } -// PausePortal is a paid mutator transaction binding the contract method 0xcfbf9af7. +// Pause is a paid mutator transaction binding the contract method 0x590308a5. // -// Solidity: function pausePortal(address admin, address portal) returns() -func (_Admin *AdminSession) PausePortal(admin common.Address, portal common.Address) (*types.Transaction, error) { - return _Admin.Contract.PausePortal(&_Admin.TransactOpts, admin, portal) +// Solidity: function pause(address admin, address portal) returns() +func (_PortalAdmin *PortalAdminSession) Pause(admin common.Address, portal common.Address) (*types.Transaction, error) { + return _PortalAdmin.Contract.Pause(&_PortalAdmin.TransactOpts, admin, portal) } -// PausePortal is a paid mutator transaction binding the contract method 0xcfbf9af7. +// Pause is a paid mutator transaction binding the contract method 0x590308a5. // -// Solidity: function pausePortal(address admin, address portal) returns() -func (_Admin *AdminTransactorSession) PausePortal(admin common.Address, portal common.Address) (*types.Transaction, error) { - return _Admin.Contract.PausePortal(&_Admin.TransactOpts, admin, portal) +// Solidity: function pause(address admin, address portal) returns() +func (_PortalAdmin *PortalAdminTransactorSession) Pause(admin common.Address, portal common.Address) (*types.Transaction, error) { + return _PortalAdmin.Contract.Pause(&_PortalAdmin.TransactOpts, admin, portal) } -// UnpausePortal is a paid mutator transaction binding the contract method 0xb90b3ffb. +// Unpause is a paid mutator transaction binding the contract method 0x3c4a3740. // -// Solidity: function unpausePortal(address admin, address portal) returns() -func (_Admin *AdminTransactor) UnpausePortal(opts *bind.TransactOpts, admin common.Address, portal common.Address) (*types.Transaction, error) { - return _Admin.contract.Transact(opts, "unpausePortal", admin, portal) +// Solidity: function unpause(address admin, address portal) returns() +func (_PortalAdmin *PortalAdminTransactor) Unpause(opts *bind.TransactOpts, admin common.Address, portal common.Address) (*types.Transaction, error) { + return _PortalAdmin.contract.Transact(opts, "unpause", admin, portal) } -// UnpausePortal is a paid mutator transaction binding the contract method 0xb90b3ffb. +// Unpause is a paid mutator transaction binding the contract method 0x3c4a3740. // -// Solidity: function unpausePortal(address admin, address portal) returns() -func (_Admin *AdminSession) UnpausePortal(admin common.Address, portal common.Address) (*types.Transaction, error) { - return _Admin.Contract.UnpausePortal(&_Admin.TransactOpts, admin, portal) +// Solidity: function unpause(address admin, address portal) returns() +func (_PortalAdmin *PortalAdminSession) Unpause(admin common.Address, portal common.Address) (*types.Transaction, error) { + return _PortalAdmin.Contract.Unpause(&_PortalAdmin.TransactOpts, admin, portal) } -// UnpausePortal is a paid mutator transaction binding the contract method 0xb90b3ffb. +// Unpause is a paid mutator transaction binding the contract method 0x3c4a3740. // -// Solidity: function unpausePortal(address admin, address portal) returns() -func (_Admin *AdminTransactorSession) UnpausePortal(admin common.Address, portal common.Address) (*types.Transaction, error) { - return _Admin.Contract.UnpausePortal(&_Admin.TransactOpts, admin, portal) +// Solidity: function unpause(address admin, address portal) returns() +func (_PortalAdmin *PortalAdminTransactorSession) Unpause(admin common.Address, portal common.Address) (*types.Transaction, error) { + return _PortalAdmin.Contract.Unpause(&_PortalAdmin.TransactOpts, admin, portal) } -// UpgradePortal is a paid mutator transaction binding the contract method 0x6e7a9833. +// Upgrade is a paid mutator transaction binding the contract method 0x9cded26d. // -// Solidity: function upgradePortal(address admin, address deployer, address portal, bytes data) returns() -func (_Admin *AdminTransactor) UpgradePortal(opts *bind.TransactOpts, admin common.Address, deployer common.Address, portal common.Address, data []byte) (*types.Transaction, error) { - return _Admin.contract.Transact(opts, "upgradePortal", admin, deployer, portal, data) +// Solidity: function upgrade(address admin, address deployer, address portal, bytes data) returns() +func (_PortalAdmin *PortalAdminTransactor) Upgrade(opts *bind.TransactOpts, admin common.Address, deployer common.Address, portal common.Address, data []byte) (*types.Transaction, error) { + return _PortalAdmin.contract.Transact(opts, "upgrade", admin, deployer, portal, data) } -// UpgradePortal is a paid mutator transaction binding the contract method 0x6e7a9833. +// Upgrade is a paid mutator transaction binding the contract method 0x9cded26d. // -// Solidity: function upgradePortal(address admin, address deployer, address portal, bytes data) returns() -func (_Admin *AdminSession) UpgradePortal(admin common.Address, deployer common.Address, portal common.Address, data []byte) (*types.Transaction, error) { - return _Admin.Contract.UpgradePortal(&_Admin.TransactOpts, admin, deployer, portal, data) +// Solidity: function upgrade(address admin, address deployer, address portal, bytes data) returns() +func (_PortalAdmin *PortalAdminSession) Upgrade(admin common.Address, deployer common.Address, portal common.Address, data []byte) (*types.Transaction, error) { + return _PortalAdmin.Contract.Upgrade(&_PortalAdmin.TransactOpts, admin, deployer, portal, data) } -// UpgradePortal is a paid mutator transaction binding the contract method 0x6e7a9833. +// Upgrade is a paid mutator transaction binding the contract method 0x9cded26d. // -// Solidity: function upgradePortal(address admin, address deployer, address portal, bytes data) returns() -func (_Admin *AdminTransactorSession) UpgradePortal(admin common.Address, deployer common.Address, portal common.Address, data []byte) (*types.Transaction, error) { - return _Admin.Contract.UpgradePortal(&_Admin.TransactOpts, admin, deployer, portal, data) +// Solidity: function upgrade(address admin, address deployer, address portal, bytes data) returns() +func (_PortalAdmin *PortalAdminTransactorSession) Upgrade(admin common.Address, deployer common.Address, portal common.Address, data []byte) (*types.Transaction, error) { + return _PortalAdmin.Contract.Upgrade(&_PortalAdmin.TransactOpts, admin, deployer, portal, data) } diff --git a/contracts/bindings/staking.go b/contracts/bindings/staking.go index e8050da11..a17854918 100644 --- a/contracts/bindings/staking.go +++ b/contracts/bindings/staking.go @@ -31,8 +31,8 @@ var ( // StakingMetaData contains all meta data concerning the Staking contract. var StakingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"MinDelegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MinDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowValidators\",\"inputs\":[{\"name\":\"validators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createValidator\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"disableAllowlist\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"disallowValidators\",\"inputs\":[{\"name\":\"validators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"enableAllowlist\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowlistEnabled_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAllowedValidator\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAllowlistEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CreateValidator\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"deposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Delegate\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561001057600080fd5b50610a86806100206000396000f3fe6080604052600436106100dd5760003560e01c806384768b7a1161007f578063c6a2aac811610059578063c6a2aac814610252578063cf8e629a14610267578063d146fd1b1461027c578063f2fde38b1461029657600080fd5b806384768b7a146101b85780638da5cb5b146101f8578063a5a470ad1461023f57600080fd5b8063400ada75116100bb578063400ada751461015457806359bcddde146101745780635c19a95c14610190578063715018a6146101a357600080fd5b8063117407e3146100e257806311bcd830146101045780633f0b1edf14610134575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046108b2565b6102b6565b005b34801561011057600080fd5b5061012168056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561014057600080fd5b5061010261014f3660046108b2565b61032a565b34801561016057600080fd5b5061010261016f366004610943565b61039a565b34801561018057600080fd5b50610121670de0b6b3a764000081565b61010261019e36600461097f565b6104b9565b3480156101af57600080fd5b506101026105b1565b3480156101c457600080fd5b506101e86101d336600461097f565b60016020526000908152604090205460ff1681565b604051901515815260200161012b565b34801561020457600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b03909116815260200161012b565b61010261024d3660046109a1565b6105c5565b34801561025e57600080fd5b5061010261071b565b34801561027357600080fd5b50610102610732565b34801561028857600080fd5b506000546101e89060ff1681565b3480156102a257600080fd5b506101026102b136600461097f565b610746565b6102be610784565b60005b818110156103255760018060008585858181106102e0576102e0610a01565b90506020020160208101906102f5919061097f565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016102c1565b505050565b610332610784565b60005b818110156103255760006001600085858581811061035557610355610a01565b905060200201602081019061036a919061097f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610335565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156103e05750825b905060008267ffffffffffffffff1660011480156103fd5750303b155b90508115801561040b575080155b156104295760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045357845460ff60401b1916600160401b1785555b61045c876107df565b6000805460ff191687151517905583156104b057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b670de0b6b3a76400003410156105165760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b0382161461056e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e000000604482015260640161050d565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6105b9610784565b6105c360006107f0565b565b60005460ff1615806105e657503360009081526001602052604090205460ff165b6106295760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b604482015260640161050d565b602181146106795760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e6774680000604482015260640161050d565b68056bc75e2d631000003410156106d25760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f736974000000604482015260640161050d565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161070f93929190610a17565b60405180910390a25050565b610723610784565b6000805460ff19166001179055565b61073a610784565b6000805460ff19169055565b61074e610784565b6001600160a01b03811661077857604051631e4fbdf760e01b81526000600482015260240161050d565b610781816107f0565b50565b336107b67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c35760405163118cdaa760e01b815233600482015260240161050d565b6107e7610861565b610781816108aa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c357604051631afcd79f60e31b815260040160405180910390fd5b61074e610861565b600080602083850312156108c557600080fd5b823567ffffffffffffffff808211156108dd57600080fd5b818501915085601f8301126108f157600080fd5b81358181111561090057600080fd5b8660208260051b850101111561091557600080fd5b60209290920196919550909350505050565b80356001600160a01b038116811461093e57600080fd5b919050565b6000806040838503121561095657600080fd5b61095f83610927565b91506020830135801515811461097457600080fd5b809150509250929050565b60006020828403121561099157600080fd5b61099a82610927565b9392505050565b600080602083850312156109b457600080fd5b823567ffffffffffffffff808211156109cc57600080fd5b818501915085601f8301126109e057600080fd5b8135818111156109ef57600080fd5b86602082850101111561091557600080fd5b634e487b7160e01b600052603260045260246000fd5b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212201ad1d9aad3c7d43b13774db3308d59675ed3c15f01a079646644a291ecce45c964736f6c63430008180033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MinDelegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MinDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowlist\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createValidator\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowlistEnabled_\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAllowedValidator\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAllowlistEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowlist\",\"inputs\":[{\"name\":\"validators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowlistEnabled\",\"inputs\":[{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowlistDisabled\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowlistEnabled\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowlistSet\",\"inputs\":[{\"name\":\"validators\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CreateValidator\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"deposit\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Delegate\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561001057600080fd5b5061001961001e565b6100d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cd5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610ccc806100df6000396000f3fe6080604052600436106100c25760003560e01c8063715018a61161007f578063a5a470ad11610059578063a5a470ad14610226578063d146fd1b14610239578063d7644ba214610253578063f2fde38b1461027357600080fd5b8063715018a61461018a57806384768b7a1461019f5780638da5cb5b146101df57600080fd5b806311bcd830146100c75780632b47da52146100f7578063400ada7514610119578063552b818b1461013b57806359bcddde1461015b5780635c19a95c14610177575b600080fd5b3480156100d357600080fd5b506100e468056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561010357600080fd5b5061010c610293565b6040516100ee9190610a3d565b34801561012557600080fd5b50610139610134366004610ab6565b6102f5565b005b34801561014757600080fd5b50610139610156366004610ae9565b610414565b34801561016757600080fd5b506100e4670de0b6b3a764000081565b610139610185366004610b5e565b610531565b34801561019657600080fd5b50610139610629565b3480156101ab57600080fd5b506101cf6101ba366004610b5e565b60016020526000908152604090205460ff1681565b60405190151581526020016100ee565b3480156101eb57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016100ee565b610139610234366004610b80565b61063d565b34801561024557600080fd5b506000546101cf9060ff1681565b34801561025f57600080fd5b5061013961026e366004610be0565b610793565b34801561027f57600080fd5b5061013961028e366004610b5e565b61085c565b606060028054806020026020016040519081016040528092919081815260200182805480156102eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102cd575b5050505050905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff1660008115801561033b5750825b905060008267ffffffffffffffff1660011480156103585750303b155b905081158015610366575080155b156103845760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103ae57845460ff60401b1916600160401b1785555b6103b787610897565b6000805460ff1916871515179055831561040b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61041c6108a8565b60005b60025481101561047e576000600160006002848154811061044257610442610bfb565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905560010161041f565b5061048b600283836109c5565b5060005b818110156104f35760018060008585858181106104ae576104ae610bfb565b90506020020160208101906104c39190610b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161048f565b507f27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf8282604051610525929190610c11565b60405180910390a15050565b670de0b6b3a764000034101561058e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b038216146105e65760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e0000006044820152606401610585565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6106316108a8565b61063b6000610903565b565b60005460ff16158061065e57503360009081526001602052604090205460ff165b6106a15760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b6044820152606401610585565b602181146106f15760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e67746800006044820152606401610585565b68056bc75e2d6310000034101561074a5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f7369740000006044820152606401610585565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161078793929190610c5d565b60405180910390a25050565b61079b6108a8565b60005481151560ff9091161515036107ec5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce88185b1c9958591e481cd95d60621b6044820152606401610585565b6000805460ff1916821580159190911790915561082f576040517f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec390600090a150565b6040517f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0790600090a15b50565b6108646108a8565b6001600160a01b03811661088e57604051631e4fbdf760e01b815260006004820152602401610585565b61085981610903565b61089f610974565b610859816109bd565b336108da7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461063b5760405163118cdaa760e01b8152336004820152602401610585565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661063b57604051631afcd79f60e31b815260040160405180910390fd5b610864610974565b828054828255906000526020600020908101928215610a18579160200282015b82811115610a185781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906109e5565b50610a24929150610a28565b5090565b5b80821115610a245760008155600101610a29565b6020808252825182820181905260009190848201906040850190845b81811015610a7e5783516001600160a01b031683529284019291840191600101610a59565b50909695505050505050565b80356001600160a01b0381168114610aa157600080fd5b919050565b80358015158114610aa157600080fd5b60008060408385031215610ac957600080fd5b610ad283610a8a565b9150610ae060208401610aa6565b90509250929050565b60008060208385031215610afc57600080fd5b823567ffffffffffffffff80821115610b1457600080fd5b818501915085601f830112610b2857600080fd5b813581811115610b3757600080fd5b8660208260051b8501011115610b4c57600080fd5b60209290920196919550909350505050565b600060208284031215610b7057600080fd5b610b7982610a8a565b9392505050565b60008060208385031215610b9357600080fd5b823567ffffffffffffffff80821115610bab57600080fd5b818501915085601f830112610bbf57600080fd5b813581811115610bce57600080fd5b866020828501011115610b4c57600080fd5b600060208284031215610bf257600080fd5b610b7982610aa6565b634e487b7160e01b600052603260045260246000fd5b60208082528181018390526000908460408401835b86811015610c52576001600160a01b03610c3f84610a8a565b1682529183019190830190600101610c26565b509695505050505050565b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212209626a613dbfb7e12830784942389803c43dd0de89220444072e10a535d8573cc64736f6c63430008180033", } // StakingABI is the input ABI used to generate the binding from. @@ -264,6 +264,37 @@ func (_Staking *StakingCallerSession) MinDeposit() (*big.Int, error) { return _Staking.Contract.MinDeposit(&_Staking.CallOpts) } +// Allowlist is a free data retrieval call binding the contract method 0x2b47da52. +// +// Solidity: function allowlist() view returns(address[]) +func (_Staking *StakingCaller) Allowlist(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _Staking.contract.Call(opts, &out, "allowlist") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// Allowlist is a free data retrieval call binding the contract method 0x2b47da52. +// +// Solidity: function allowlist() view returns(address[]) +func (_Staking *StakingSession) Allowlist() ([]common.Address, error) { + return _Staking.Contract.Allowlist(&_Staking.CallOpts) +} + +// Allowlist is a free data retrieval call binding the contract method 0x2b47da52. +// +// Solidity: function allowlist() view returns(address[]) +func (_Staking *StakingCallerSession) Allowlist() ([]common.Address, error) { + return _Staking.Contract.Allowlist(&_Staking.CallOpts) +} + // IsAllowedValidator is a free data retrieval call binding the contract method 0x84768b7a. // // Solidity: function isAllowedValidator(address ) view returns(bool) @@ -357,27 +388,6 @@ func (_Staking *StakingCallerSession) Owner() (common.Address, error) { return _Staking.Contract.Owner(&_Staking.CallOpts) } -// AllowValidators is a paid mutator transaction binding the contract method 0x117407e3. -// -// Solidity: function allowValidators(address[] validators) returns() -func (_Staking *StakingTransactor) AllowValidators(opts *bind.TransactOpts, validators []common.Address) (*types.Transaction, error) { - return _Staking.contract.Transact(opts, "allowValidators", validators) -} - -// AllowValidators is a paid mutator transaction binding the contract method 0x117407e3. -// -// Solidity: function allowValidators(address[] validators) returns() -func (_Staking *StakingSession) AllowValidators(validators []common.Address) (*types.Transaction, error) { - return _Staking.Contract.AllowValidators(&_Staking.TransactOpts, validators) -} - -// AllowValidators is a paid mutator transaction binding the contract method 0x117407e3. -// -// Solidity: function allowValidators(address[] validators) returns() -func (_Staking *StakingTransactorSession) AllowValidators(validators []common.Address) (*types.Transaction, error) { - return _Staking.Contract.AllowValidators(&_Staking.TransactOpts, validators) -} - // CreateValidator is a paid mutator transaction binding the contract method 0xa5a470ad. // // Solidity: function createValidator(bytes pubkey) payable returns() @@ -420,69 +430,6 @@ func (_Staking *StakingTransactorSession) Delegate(validator common.Address) (*t return _Staking.Contract.Delegate(&_Staking.TransactOpts, validator) } -// DisableAllowlist is a paid mutator transaction binding the contract method 0xcf8e629a. -// -// Solidity: function disableAllowlist() returns() -func (_Staking *StakingTransactor) DisableAllowlist(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Staking.contract.Transact(opts, "disableAllowlist") -} - -// DisableAllowlist is a paid mutator transaction binding the contract method 0xcf8e629a. -// -// Solidity: function disableAllowlist() returns() -func (_Staking *StakingSession) DisableAllowlist() (*types.Transaction, error) { - return _Staking.Contract.DisableAllowlist(&_Staking.TransactOpts) -} - -// DisableAllowlist is a paid mutator transaction binding the contract method 0xcf8e629a. -// -// Solidity: function disableAllowlist() returns() -func (_Staking *StakingTransactorSession) DisableAllowlist() (*types.Transaction, error) { - return _Staking.Contract.DisableAllowlist(&_Staking.TransactOpts) -} - -// DisallowValidators is a paid mutator transaction binding the contract method 0x3f0b1edf. -// -// Solidity: function disallowValidators(address[] validators) returns() -func (_Staking *StakingTransactor) DisallowValidators(opts *bind.TransactOpts, validators []common.Address) (*types.Transaction, error) { - return _Staking.contract.Transact(opts, "disallowValidators", validators) -} - -// DisallowValidators is a paid mutator transaction binding the contract method 0x3f0b1edf. -// -// Solidity: function disallowValidators(address[] validators) returns() -func (_Staking *StakingSession) DisallowValidators(validators []common.Address) (*types.Transaction, error) { - return _Staking.Contract.DisallowValidators(&_Staking.TransactOpts, validators) -} - -// DisallowValidators is a paid mutator transaction binding the contract method 0x3f0b1edf. -// -// Solidity: function disallowValidators(address[] validators) returns() -func (_Staking *StakingTransactorSession) DisallowValidators(validators []common.Address) (*types.Transaction, error) { - return _Staking.Contract.DisallowValidators(&_Staking.TransactOpts, validators) -} - -// EnableAllowlist is a paid mutator transaction binding the contract method 0xc6a2aac8. -// -// Solidity: function enableAllowlist() returns() -func (_Staking *StakingTransactor) EnableAllowlist(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Staking.contract.Transact(opts, "enableAllowlist") -} - -// EnableAllowlist is a paid mutator transaction binding the contract method 0xc6a2aac8. -// -// Solidity: function enableAllowlist() returns() -func (_Staking *StakingSession) EnableAllowlist() (*types.Transaction, error) { - return _Staking.Contract.EnableAllowlist(&_Staking.TransactOpts) -} - -// EnableAllowlist is a paid mutator transaction binding the contract method 0xc6a2aac8. -// -// Solidity: function enableAllowlist() returns() -func (_Staking *StakingTransactorSession) EnableAllowlist() (*types.Transaction, error) { - return _Staking.Contract.EnableAllowlist(&_Staking.TransactOpts) -} - // Initialize is a paid mutator transaction binding the contract method 0x400ada75. // // Solidity: function initialize(address owner_, bool isAllowlistEnabled_) returns() @@ -525,6 +472,48 @@ func (_Staking *StakingTransactorSession) RenounceOwnership() (*types.Transactio return _Staking.Contract.RenounceOwnership(&_Staking.TransactOpts) } +// SetAllowlist is a paid mutator transaction binding the contract method 0x552b818b. +// +// Solidity: function setAllowlist(address[] validators) returns() +func (_Staking *StakingTransactor) SetAllowlist(opts *bind.TransactOpts, validators []common.Address) (*types.Transaction, error) { + return _Staking.contract.Transact(opts, "setAllowlist", validators) +} + +// SetAllowlist is a paid mutator transaction binding the contract method 0x552b818b. +// +// Solidity: function setAllowlist(address[] validators) returns() +func (_Staking *StakingSession) SetAllowlist(validators []common.Address) (*types.Transaction, error) { + return _Staking.Contract.SetAllowlist(&_Staking.TransactOpts, validators) +} + +// SetAllowlist is a paid mutator transaction binding the contract method 0x552b818b. +// +// Solidity: function setAllowlist(address[] validators) returns() +func (_Staking *StakingTransactorSession) SetAllowlist(validators []common.Address) (*types.Transaction, error) { + return _Staking.Contract.SetAllowlist(&_Staking.TransactOpts, validators) +} + +// SetAllowlistEnabled is a paid mutator transaction binding the contract method 0xd7644ba2. +// +// Solidity: function setAllowlistEnabled(bool enabled) returns() +func (_Staking *StakingTransactor) SetAllowlistEnabled(opts *bind.TransactOpts, enabled bool) (*types.Transaction, error) { + return _Staking.contract.Transact(opts, "setAllowlistEnabled", enabled) +} + +// SetAllowlistEnabled is a paid mutator transaction binding the contract method 0xd7644ba2. +// +// Solidity: function setAllowlistEnabled(bool enabled) returns() +func (_Staking *StakingSession) SetAllowlistEnabled(enabled bool) (*types.Transaction, error) { + return _Staking.Contract.SetAllowlistEnabled(&_Staking.TransactOpts, enabled) +} + +// SetAllowlistEnabled is a paid mutator transaction binding the contract method 0xd7644ba2. +// +// Solidity: function setAllowlistEnabled(bool enabled) returns() +func (_Staking *StakingTransactorSession) SetAllowlistEnabled(enabled bool) (*types.Transaction, error) { + return _Staking.Contract.SetAllowlistEnabled(&_Staking.TransactOpts, enabled) +} + // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. // // Solidity: function transferOwnership(address newOwner) returns() @@ -546,6 +535,406 @@ func (_Staking *StakingTransactorSession) TransferOwnership(newOwner common.Addr return _Staking.Contract.TransferOwnership(&_Staking.TransactOpts, newOwner) } +// StakingAllowlistDisabledIterator is returned from FilterAllowlistDisabled and is used to iterate over the raw logs and unpacked data for AllowlistDisabled events raised by the Staking contract. +type StakingAllowlistDisabledIterator struct { + Event *StakingAllowlistDisabled // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *StakingAllowlistDisabledIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(StakingAllowlistDisabled) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(StakingAllowlistDisabled) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *StakingAllowlistDisabledIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *StakingAllowlistDisabledIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// StakingAllowlistDisabled represents a AllowlistDisabled event raised by the Staking contract. +type StakingAllowlistDisabled struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAllowlistDisabled is a free log retrieval operation binding the contract event 0x2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb07. +// +// Solidity: event AllowlistDisabled() +func (_Staking *StakingFilterer) FilterAllowlistDisabled(opts *bind.FilterOpts) (*StakingAllowlistDisabledIterator, error) { + + logs, sub, err := _Staking.contract.FilterLogs(opts, "AllowlistDisabled") + if err != nil { + return nil, err + } + return &StakingAllowlistDisabledIterator{contract: _Staking.contract, event: "AllowlistDisabled", logs: logs, sub: sub}, nil +} + +// WatchAllowlistDisabled is a free log subscription operation binding the contract event 0x2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb07. +// +// Solidity: event AllowlistDisabled() +func (_Staking *StakingFilterer) WatchAllowlistDisabled(opts *bind.WatchOpts, sink chan<- *StakingAllowlistDisabled) (event.Subscription, error) { + + logs, sub, err := _Staking.contract.WatchLogs(opts, "AllowlistDisabled") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(StakingAllowlistDisabled) + if err := _Staking.contract.UnpackLog(event, "AllowlistDisabled", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAllowlistDisabled is a log parse operation binding the contract event 0x2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb07. +// +// Solidity: event AllowlistDisabled() +func (_Staking *StakingFilterer) ParseAllowlistDisabled(log types.Log) (*StakingAllowlistDisabled, error) { + event := new(StakingAllowlistDisabled) + if err := _Staking.contract.UnpackLog(event, "AllowlistDisabled", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// StakingAllowlistEnabledIterator is returned from FilterAllowlistEnabled and is used to iterate over the raw logs and unpacked data for AllowlistEnabled events raised by the Staking contract. +type StakingAllowlistEnabledIterator struct { + Event *StakingAllowlistEnabled // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *StakingAllowlistEnabledIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(StakingAllowlistEnabled) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(StakingAllowlistEnabled) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *StakingAllowlistEnabledIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *StakingAllowlistEnabledIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// StakingAllowlistEnabled represents a AllowlistEnabled event raised by the Staking contract. +type StakingAllowlistEnabled struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAllowlistEnabled is a free log retrieval operation binding the contract event 0x8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec3. +// +// Solidity: event AllowlistEnabled() +func (_Staking *StakingFilterer) FilterAllowlistEnabled(opts *bind.FilterOpts) (*StakingAllowlistEnabledIterator, error) { + + logs, sub, err := _Staking.contract.FilterLogs(opts, "AllowlistEnabled") + if err != nil { + return nil, err + } + return &StakingAllowlistEnabledIterator{contract: _Staking.contract, event: "AllowlistEnabled", logs: logs, sub: sub}, nil +} + +// WatchAllowlistEnabled is a free log subscription operation binding the contract event 0x8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec3. +// +// Solidity: event AllowlistEnabled() +func (_Staking *StakingFilterer) WatchAllowlistEnabled(opts *bind.WatchOpts, sink chan<- *StakingAllowlistEnabled) (event.Subscription, error) { + + logs, sub, err := _Staking.contract.WatchLogs(opts, "AllowlistEnabled") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(StakingAllowlistEnabled) + if err := _Staking.contract.UnpackLog(event, "AllowlistEnabled", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAllowlistEnabled is a log parse operation binding the contract event 0x8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec3. +// +// Solidity: event AllowlistEnabled() +func (_Staking *StakingFilterer) ParseAllowlistEnabled(log types.Log) (*StakingAllowlistEnabled, error) { + event := new(StakingAllowlistEnabled) + if err := _Staking.contract.UnpackLog(event, "AllowlistEnabled", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// StakingAllowlistSetIterator is returned from FilterAllowlistSet and is used to iterate over the raw logs and unpacked data for AllowlistSet events raised by the Staking contract. +type StakingAllowlistSetIterator struct { + Event *StakingAllowlistSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *StakingAllowlistSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(StakingAllowlistSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(StakingAllowlistSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *StakingAllowlistSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *StakingAllowlistSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// StakingAllowlistSet represents a AllowlistSet event raised by the Staking contract. +type StakingAllowlistSet struct { + Validators []common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAllowlistSet is a free log retrieval operation binding the contract event 0x27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf. +// +// Solidity: event AllowlistSet(address[] validators) +func (_Staking *StakingFilterer) FilterAllowlistSet(opts *bind.FilterOpts) (*StakingAllowlistSetIterator, error) { + + logs, sub, err := _Staking.contract.FilterLogs(opts, "AllowlistSet") + if err != nil { + return nil, err + } + return &StakingAllowlistSetIterator{contract: _Staking.contract, event: "AllowlistSet", logs: logs, sub: sub}, nil +} + +// WatchAllowlistSet is a free log subscription operation binding the contract event 0x27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf. +// +// Solidity: event AllowlistSet(address[] validators) +func (_Staking *StakingFilterer) WatchAllowlistSet(opts *bind.WatchOpts, sink chan<- *StakingAllowlistSet) (event.Subscription, error) { + + logs, sub, err := _Staking.contract.WatchLogs(opts, "AllowlistSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(StakingAllowlistSet) + if err := _Staking.contract.UnpackLog(event, "AllowlistSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAllowlistSet is a log parse operation binding the contract event 0x27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf. +// +// Solidity: event AllowlistSet(address[] validators) +func (_Staking *StakingFilterer) ParseAllowlistSet(log types.Log) (*StakingAllowlistSet, error) { + event := new(StakingAllowlistSet) + if err := _Staking.contract.UnpackLog(event, "AllowlistSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // StakingCreateValidatorIterator is returned from FilterCreateValidator and is used to iterate over the raw logs and unpacked data for CreateValidator events raised by the Staking contract. type StakingCreateValidatorIterator struct { Event *StakingCreateValidator // Event containing the contract specifics and raw log diff --git a/contracts/bindings/stakingadmin.go b/contracts/bindings/stakingadmin.go new file mode 100644 index 000000000..7ed18883d --- /dev/null +++ b/contracts/bindings/stakingadmin.go @@ -0,0 +1,297 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// StakingAdminMetaData contains all meta data concerning the StakingAdmin contract. +var StakingAdminMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"IS_SCRIPT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setAllowlist\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowlistEnabled\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgrade\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"deployer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", + Bin: "0x6080604052600c805462ff00ff19166201000117905534801561002157600080fd5b5061647e806100316000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806347e984881461005157806399a88ec414610066578063b1e315bf14610079578063f8ccbf471461008c575b600080fd5b61006461005f366004610916565b6100b3565b005b61006461007436600461099e565b6101e9565b6100646100873660046109d7565b6105f4565b600c5461009f9062010000900460ff1681565b604051901515815260200160405180910390f35b604051637fec2a8d60e01b81526001600160a01b0384166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561010857600080fd5b505af115801561011c573d6000803e3d6000fd5b505060405163552b818b60e01b8152600162333333608a1b01925063552b818b915061014e9085908590600401610a0a565b600060405180830381600087803b15801561016857600080fd5b505af115801561017c573d6000803e3d6000fd5b5050505060008051602061642983398151915260001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156101cc57600080fd5b505af11580156101e0573d6000803e3d6000fd5b50505050505050565b604051637fec2a8d60e01b81526001600160a01b0382166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561023e57600080fd5b505af1158015610252573d6000803e3d6000fd5b505050506000604051610264906108e4565b604051809103906000f080158015610280573d6000803e3d6000fd5b50905060008051602061642983398151915260001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156102cf57600080fd5b505af11580156102e3573d6000803e3d6000fd5b5050604051637fec2a8d60e01b81526001600160a01b0386166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9250637fec2a8d9150602401600060405180830381600087803b15801561033c57600080fd5b505af1158015610350573d6000803e3d6000fd5b505050506000610368600162333333608a1b01610724565b604051639623609d60e01b8152600162333333608a1b0160048201526001600160a01b038481166024830152606060448301526000606483015291925090821690639623609d90608401600060405180830381600087803b1580156103cc57600080fd5b505af11580156103e0573d6000803e3d6000fd5b5050505060008051602061642983398151915260001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561043057600080fd5b505af1158015610444573d6000803e3d6000fd5b50505050610451826107cf565b6104a25760405162461bcd60e51b815260206004820152601960248201527f696e697469616c697a657273206e6f742064697361626c65640000000000000060448201526064015b60405180910390fd5b836001600160a01b0316600162333333608a1b016001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105179190610a58565b6001600160a01b03161461055d5760405162461bcd60e51b815260206004820152600d60248201526c1bdddb995c881b9bdd081cd95d609a1b6044820152606401610499565b600060405161056b906108f1565b604051809103906000f080158015610587573d6000803e3d6000fd5b5060405163148aedc160e21b8152600162333333608a1b0160048201529091506001600160a01b0382169063522bb70490602401600060405180830381600087803b1580156105d557600080fd5b505af11580156105e9573d6000803e3d6000fd5b505050505050505050565b604051637fec2a8d60e01b81526001600160a01b0383166004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561064957600080fd5b505af115801561065d573d6000803e3d6000fd5b5050604051636bb225d160e11b81528315156004820152600162333333608a1b01925063d7644ba29150602401600060405180830381600087803b1580156106a457600080fd5b505af11580156106b8573d6000803e3d6000fd5b5050505060008051602061642983398151915260001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561070857600080fd5b505af115801561071c573d6000803e3d6000fd5b505050505050565b604051630667f9d760e41b81526001600160a01b03821660048201527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036024820152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa1580156107a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c99190610a7c565b92915050565b600067ffffffffffffffff6107e3836107f4565b67ffffffffffffffff161492915050565b604051630667f9d760e41b81526001600160a01b03821660048201527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0060248201526000908190737109709ecfa91a80626ff3989d68f67f5b1dd12d9063667f9d7090604401602060405180830381865afa158015610877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089b9190610a7c565b905067ffffffffffffffff8111156107c95760405162461bcd60e51b815260206004820152600c60248201526b696e697469616c697a696e6760a01b6044820152606401610499565b610dab80610a9683390190565b614be88061184183390190565b6001600160a01b038116811461091357600080fd5b50565b60008060006040848603121561092b57600080fd5b8335610936816108fe565b9250602084013567ffffffffffffffff8082111561095357600080fd5b818601915086601f83011261096757600080fd5b81358181111561097657600080fd5b8760208260051b850101111561098b57600080fd5b6020830194508093505050509250925092565b600080604083850312156109b157600080fd5b82356109bc816108fe565b915060208301356109cc816108fe565b809150509250929050565b600080604083850312156109ea57600080fd5b82356109f5816108fe565b9150602083013580151581146109cc57600080fd5b60208082528181018390526000908460408401835b86811015610a4d578235610a32816108fe565b6001600160a01b031682529183019190830190600101610a1f565b509695505050505050565b600060208284031215610a6a57600080fd5b8151610a75816108fe565b9392505050565b600060208284031215610a8e57600080fd5b505191905056fe608060405234801561001057600080fd5b5061001961001e565b6100d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cd5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610ccc806100df6000396000f3fe6080604052600436106100c25760003560e01c8063715018a61161007f578063a5a470ad11610059578063a5a470ad14610226578063d146fd1b14610239578063d7644ba214610253578063f2fde38b1461027357600080fd5b8063715018a61461018a57806384768b7a1461019f5780638da5cb5b146101df57600080fd5b806311bcd830146100c75780632b47da52146100f7578063400ada7514610119578063552b818b1461013b57806359bcddde1461015b5780635c19a95c14610177575b600080fd5b3480156100d357600080fd5b506100e468056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561010357600080fd5b5061010c610293565b6040516100ee9190610a3d565b34801561012557600080fd5b50610139610134366004610ab6565b6102f5565b005b34801561014757600080fd5b50610139610156366004610ae9565b610414565b34801561016757600080fd5b506100e4670de0b6b3a764000081565b610139610185366004610b5e565b610531565b34801561019657600080fd5b50610139610629565b3480156101ab57600080fd5b506101cf6101ba366004610b5e565b60016020526000908152604090205460ff1681565b60405190151581526020016100ee565b3480156101eb57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016100ee565b610139610234366004610b80565b61063d565b34801561024557600080fd5b506000546101cf9060ff1681565b34801561025f57600080fd5b5061013961026e366004610be0565b610793565b34801561027f57600080fd5b5061013961028e366004610b5e565b61085c565b606060028054806020026020016040519081016040528092919081815260200182805480156102eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102cd575b5050505050905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff1660008115801561033b5750825b905060008267ffffffffffffffff1660011480156103585750303b155b905081158015610366575080155b156103845760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103ae57845460ff60401b1916600160401b1785555b6103b787610897565b6000805460ff1916871515179055831561040b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61041c6108a8565b60005b60025481101561047e576000600160006002848154811061044257610442610bfb565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905560010161041f565b5061048b600283836109c5565b5060005b818110156104f35760018060008585858181106104ae576104ae610bfb565b90506020020160208101906104c39190610b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161048f565b507f27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf8282604051610525929190610c11565b60405180910390a15050565b670de0b6b3a764000034101561058e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b038216146105e65760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e0000006044820152606401610585565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6106316108a8565b61063b6000610903565b565b60005460ff16158061065e57503360009081526001602052604090205460ff165b6106a15760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b6044820152606401610585565b602181146106f15760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e67746800006044820152606401610585565b68056bc75e2d6310000034101561074a5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f7369740000006044820152606401610585565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161078793929190610c5d565b60405180910390a25050565b61079b6108a8565b60005481151560ff9091161515036107ec5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce88185b1c9958591e481cd95d60621b6044820152606401610585565b6000805460ff1916821580159190911790915561082f576040517f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec390600090a150565b6040517f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0790600090a15b50565b6108646108a8565b6001600160a01b03811661088e57604051631e4fbdf760e01b815260006004820152602401610585565b61085981610903565b61089f610974565b610859816109bd565b336108da7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461063b5760405163118cdaa760e01b8152336004820152602401610585565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661063b57604051631afcd79f60e31b815260040160405180910390fd5b610864610974565b828054828255906000526020600020908101928215610a18579160200282015b82811115610a185781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906109e5565b50610a24929150610a28565b5090565b5b80821115610a245760008155600101610a29565b6020808252825182820181905260009190848201906040850190845b81811015610a7e5783516001600160a01b031683529284019291840191600101610a59565b50909695505050505050565b80356001600160a01b0381168114610aa157600080fd5b919050565b80358015158114610aa157600080fd5b60008060408385031215610ac957600080fd5b610ad283610a8a565b9150610ae060208401610aa6565b90509250929050565b60008060208385031215610afc57600080fd5b823567ffffffffffffffff80821115610b1457600080fd5b818501915085601f830112610b2857600080fd5b813581811115610b3757600080fd5b8660208260051b8501011115610b4c57600080fd5b60209290920196919550909350505050565b600060208284031215610b7057600080fd5b610b7982610a8a565b9392505050565b60008060208385031215610b9357600080fd5b823567ffffffffffffffff80821115610bab57600080fd5b818501915085601f830112610bbf57600080fd5b813581811115610bce57600080fd5b866020828501011115610b4c57600080fd5b600060208284031215610bf257600080fd5b610b7982610aa6565b634e487b7160e01b600052603260045260246000fd5b60208082528181018390526000908460408401835b86811015610c52576001600160a01b03610c3f84610a8a565b1682529183019190830190600101610c26565b509695505050505050565b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212209626a613dbfb7e12830784942389803c43dd0de89220444072e10a535d8573cc64736f6c634300081800336080604052600c8054600160ff199182168117909255601f8054909116909117905534801561002d57600080fd5b50614bab8061003d6000396000f3fe60806040523480156200001157600080fd5b5060043610620001095760003560e01c8063916a17c611620000a3578063c4b3031a116200006e578063c4b3031a14620001f0578063e20c9f7114620001fa578063e4e5c9341462000204578063fa7626d4146200020e57600080fd5b8063916a17c614620001a8578063b0464fdc14620001c1578063b5508aa914620001cb578063ba414fa614620001d557600080fd5b80633f7286f411620000e45780633f7286f41462000153578063522bb704146200015d57806366d9a9a0146200017657806385226c81146200018f57600080fd5b80631ed7831c146200010e5780632ade388014620001305780633e5e3c231462000149575b600080fd5b620001186200021c565b604051620001279190620028f2565b60405180910390f35b6200013a62000280565b60405162000127919062002995565b62000118620003ce565b6200011862000430565b620001746200016e36600462002a71565b62000492565b005b62000180620004ab565b60405162000127919062002ae0565b6200019962000624565b60405162000127919062002b6d565b620001b2620006fe565b60405162000127919062002bd5565b620001b2620007e8565b62000199620008d2565b620001df620009ac565b604051901515815260200162000127565b6200017462000a4f565b6200011862000a65565b6200017462000ac7565b601f54620001df9060ff1681565b606060168054806020026020016040519081016040528092919081815260200182805480156200027657602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000257575b5050505050905090565b6060601e805480602002602001604051908101604052809291908181526020016000905b82821015620003c557600084815260208082206040805180820182526002870290920180546001600160a01b03168352600181018054835181870281018701909452808452939591948681019491929084015b82821015620003ad578382906000526020600020018054620003199062002c4a565b80601f0160208091040260200160405190810160405280929190818152602001828054620003479062002c4a565b8015620003985780601f106200036c5761010080835404028352916020019162000398565b820191906000526020600020905b8154815290600101906020018083116200037a57829003601f168201915b505050505081526020019060010190620002f7565b505050508152505081526020019060010190620002a4565b50505050905090565b6060601880548060200260200160405190810160405280929190818152602001828054801562000276576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831162000257575050505050905090565b6060601780548060200260200160405190810160405280929190818152602001828054801562000276576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831162000257575050505050905090565b6200049d8162000adb565b620004a88162001c03565b50565b6060601b805480602002602001604051908101604052809291908181526020016000905b82821015620003c55783829060005260206000209060020201604051806040016040529081600082018054620005059062002c4a565b80601f0160208091040260200160405190810160405280929190818152602001828054620005339062002c4a565b8015620005845780601f10620005585761010080835404028352916020019162000584565b820191906000526020600020905b8154815290600101906020018083116200056657829003601f168201915b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156200060b57602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b03191681526020019060040190602082600301049283019260010382029150808411620005cc5790505b50505050508152505081526020019060010190620004cf565b6060601a805480602002602001604051908101604052809291908181526020016000905b82821015620003c55783829060005260206000200180546200066a9062002c4a565b80601f0160208091040260200160405190810160405280929190818152602001828054620006989062002c4a565b8015620006e95780601f10620006bd57610100808354040283529160200191620006e9565b820191906000526020600020905b815481529060010190602001808311620006cb57829003601f168201915b50505050508152602001906001019062000648565b6060601d805480602002602001604051908101604052809291908181526020016000905b82821015620003c55760008481526020908190206040805180820182526002860290920180546001600160a01b03168352600181018054835181870281018701909452808452939491938583019392830182828015620007cf57602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b03191681526020019060040190602082600301049283019260010382029150808411620007905790505b5050505050815250508152602001906001019062000722565b6060601c805480602002602001604051908101604052809291908181526020016000905b82821015620003c55760008481526020908190206040805180820182526002860290920180546001600160a01b03168352600181018054835181870281018701909452808452939491938583019392830182828015620008b957602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b031916815260200190600401906020826003010492830192600103820291508084116200087a5790505b505050505081525050815260200190600101906200080c565b60606019805480602002602001604051908101604052809291908181526020016000905b82821015620003c5578382906000526020600020018054620009189062002c4a565b80601f0160208091040260200160405190810160405280929190818152602001828054620009469062002c4a565b8015620009975780601f106200096b5761010080835404028352916020019162000997565b820191906000526020600020905b8154815290600101906020018083116200097957829003601f168201915b505050505081526020019060010190620008f6565b60085460009060ff1615620009c5575060085460ff1690565b604051630667f9d760e41b815260008051602062004b36833981519152600482018190526519985a5b195960d21b602483015260009163667f9d7090604401602060405180830381865afa15801562000a22573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a48919062002c86565b1415905090565b62000a6362000a5d62002588565b62000adb565b565b6060601580548060200260200160405190810160405280929190818152602001828054801562000276576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831162000257575050505050905090565b62000a6362000ad562002588565b62001c03565b6000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000b1c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b42919062002cb2565b9050600062000b72604051806040016040528060098152602001683b30b634b230ba37b960b91b8152506200266b565b6040805160018082528183019092529192506000919060208083019080368337019050509050818160008151811062000baf5762000baf62002ce8565b6001600160a01b0392909216602092830291909101820152604051600360f81b918101919091527f36b231909642a65d3820ecb948d06421848c4a51f3f425ea699aaf2951f46baa6021820152600090604101604051602081830303815290604052905060008051602062004b5683398151915260001c6001600160a01b031663c88a5e6d84876001600160a01b03166311bcd8306040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c74573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c9a919062002c86565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801562000ce157600080fd5b505af115801562000cf6573d6000803e3d6000fd5b50506040516303223eab60e11b81526001600160a01b038716600482015260008051602062004b3683398151915292506306447d569150602401600060405180830381600087803b15801562000d4b57600080fd5b505af115801562000d60573d6000803e3d6000fd5b50505050846001600160a01b031663d146fd1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000da3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dc9919062002cfe565b62000e2b57604051636bb225d160e11b8152600160048201526001600160a01b0386169063d7644ba290602401600060405180830381600087803b15801562000e1157600080fd5b505af115801562000e26573d6000803e3d6000fd5b505050505b62000e9a856001600160a01b031663d146fd1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000e6e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e94919062002cfe565b6200267f565b60008051602062004b5683398151915260001c6001600160a01b03166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562000ee857600080fd5b505af115801562000efd573d6000803e3d6000fd5b505060405163f28dceb360e01b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b604482015260008051602062004b36833981519152925063f28dceb39150606401600060405180830381600087803b15801562000f6e57600080fd5b505af115801562000f83573d6000803e3d6000fd5b505060405163a5a470ad60e01b81526001600160a01b038816925063a5a470ad915062000fb590849060040162002d22565b600060405180830381600087803b15801562000fd057600080fd5b505af115801562000fe5573d6000803e3d6000fd5b505060405163ca669fa760e01b81526001600160a01b038716600482015260008051602062004b36833981519152925063ca669fa79150602401600060405180830381600087803b1580156200103a57600080fd5b505af11580156200104f573d6000803e3d6000fd5b505060405163552b818b60e01b81526001600160a01b038816925063552b818b915062001081908590600401620028f2565b600060405180830381600087803b1580156200109c57600080fd5b505af1158015620010b1573d6000803e3d6000fd5b505060405163423b45bd60e11b81526001600160a01b038681166004830152620011029350881691506384768b7a906024015b602060405180830381865afa15801562000e6e573d6000803e3d6000fd5b60006001866001600160a01b03166311bcd8306040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200116b919062002c86565b62001177919062002d37565b60405163f28dceb360e01b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f736974000000604482015290915060008051602062004b368339815191529063f28dceb390606401600060405180830381600087803b158015620011f057600080fd5b505af115801562001205573d6000803e3d6000fd5b505060405163ca669fa760e01b81526001600160a01b038716600482015260008051602062004b36833981519152925063ca669fa79150602401600060405180830381600087803b1580156200125a57600080fd5b505af11580156200126f573d6000803e3d6000fd5b505060405163a5a470ad60e01b81526001600160a01b038916925063a5a470ad91508390620012a390869060040162002d22565b6000604051808303818588803b158015620012bd57600080fd5b505af1158015620012d2573d6000803e3d6000fd5b50505050506000866001600160a01b03166311bcd8306040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001318573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200133e919062002c86565b905060007f36b231909642a65d3820ecb948d06421848c4a51f3f425ea699aaf2951f46baa6040516020016200137691815260200190565b60408051808303601f190181529082905263f28dceb360e01b825260206004830152601e60248301527f5374616b696e673a20696e76616c6964207075626b6579206c656e67746800006044830152915060008051602062004b368339815191529063f28dceb390606401600060405180830381600087803b158015620013fc57600080fd5b505af115801562001411573d6000803e3d6000fd5b505060405163ca669fa760e01b81526001600160a01b038916600482015260008051602062004b36833981519152925063ca669fa79150602401600060405180830381600087803b1580156200146657600080fd5b505af11580156200147b573d6000803e3d6000fd5b505060405163a5a470ad60e01b81526001600160a01b038b16925063a5a470ad91508490620014af90859060040162002d22565b6000604051808303818588803b158015620014c957600080fd5b505af1158015620014de573d6000803e3d6000fd5b505050505060008051602062004b5683398151915260001c6001600160a01b031663440ed10d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200153157600080fd5b505af115801562001546573d6000803e3d6000fd5b50505050856001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45385846040516200158792919062002d5f565b60405180910390a260405163ca669fa760e01b81526001600160a01b038716600482015260008051602062004b368339815191529063ca669fa790602401600060405180830381600087803b158015620015e057600080fd5b505af1158015620015f5573d6000803e3d6000fd5b505060405163a5a470ad60e01b81526001600160a01b038b16925063a5a470ad915084906200162990889060040162002d22565b6000604051808303818588803b1580156200164357600080fd5b505af115801562001658573d6000803e3d6000fd5b505060405163ca669fa760e01b81526001600160a01b038b16600482015260008051602062004b36833981519152935063ca669fa792506024019050600060405180830381600087803b158015620016af57600080fd5b505af1158015620016c4573d6000803e3d6000fd5b50506040805160008152602081019182905263552b818b60e01b9091526001600160a01b038b16925063552b818b9150620017039060248101620028f2565b600060405180830381600087803b1580156200171e57600080fd5b505af115801562001733573d6000803e3d6000fd5b505060405163423b45bd60e11b81526001600160a01b038981166004830152620017b093508b1691506384768b7a906024015b602060405180830381865afa15801562001784573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017aa919062002cfe565b620026e4565b60405163f28dceb360e01b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b604482015260008051602062004b368339815191529063f28dceb390606401600060405180830381600087803b1580156200181d57600080fd5b505af115801562001832573d6000803e3d6000fd5b505060405163c88a5e6d60e01b81526001600160a01b03891660048201526024810185905260008051602062004b36833981519152925063c88a5e6d9150604401600060405180830381600087803b1580156200188e57600080fd5b505af1158015620018a3573d6000803e3d6000fd5b505060405163ca669fa760e01b81526001600160a01b038916600482015260008051602062004b36833981519152925063ca669fa79150602401600060405180830381600087803b158015620018f857600080fd5b505af11580156200190d573d6000803e3d6000fd5b505060405163a5a470ad60e01b81526001600160a01b038b16925063a5a470ad915084906200194190889060040162002d22565b6000604051808303818588803b1580156200195b57600080fd5b505af115801562001970573d6000803e3d6000fd5b505060405163ca669fa760e01b81526001600160a01b038b16600482015260008051602062004b36833981519152935063ca669fa792506024019050600060405180830381600087803b158015620019c757600080fd5b505af1158015620019dc573d6000803e3d6000fd5b5050604051636bb225d160e11b8152600060048201526001600160a01b038b16925063d7644ba29150602401600060405180830381600087803b15801562001a2357600080fd5b505af115801562001a38573d6000803e3d6000fd5b5050505062001a7f886001600160a01b031663d146fd1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001784573d6000803e3d6000fd5b60008051602062004b5683398151915260001c6001600160a01b031663440ed10d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562001acd57600080fd5b505af115801562001ae2573d6000803e3d6000fd5b50505050856001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a453858460405162001b2392919062002d5f565b60405180910390a260405163ca669fa760e01b81526001600160a01b038716600482015260008051602062004b368339815191529063ca669fa790602401600060405180830381600087803b15801562001b7c57600080fd5b505af115801562001b91573d6000803e3d6000fd5b505060405163a5a470ad60e01b81526001600160a01b038b16925063a5a470ad9150849062001bc590889060040162002d22565b6000604051808303818588803b15801562001bdf57600080fd5b505af115801562001bf4573d6000803e3d6000fd5b50505050505050505050505050565b6000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001c44573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c6a919062002cb2565b60405163ca669fa760e01b81526001600160a01b038216600482015290915060008051602062004b368339815191529063ca669fa790602401600060405180830381600087803b15801562001cbe57600080fd5b505af115801562001cd3573d6000803e3d6000fd5b5050604051636bb225d160e11b8152600160048201526001600160a01b038516925063d7644ba29150602401600060405180830381600087803b15801562001d1a57600080fd5b505af115801562001d2f573d6000803e3d6000fd5b5050505062001d76826001600160a01b031663d146fd1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000e6e573d6000803e3d6000fd5b600062001da56040518060400160405280600a81526020016976616c696461746f723160b01b8152506200266b565b9050600062001dd66040518060400160405280600a8152602001693b30b634b230ba37b91960b11b8152506200266b565b6040805160028082526060820183529293506000929091602083019080368337019050509050828160008151811062001e135762001e1362002ce8565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811062001e4a5762001e4a62002ce8565b6001600160a01b03928316602091820292909201015260405163ca669fa760e01b8152908516600482015260008051602062004b368339815191529063ca669fa790602401600060405180830381600087803b15801562001eaa57600080fd5b505af115801562001ebf573d6000803e3d6000fd5b505060405163552b818b60e01b81526001600160a01b038816925063552b818b915062001ef1908490600401620028f2565b600060405180830381600087803b15801562001f0c57600080fd5b505af115801562001f21573d6000803e3d6000fd5b505050506000856001600160a01b0316632b47da526040518163ffffffff1660e01b8152600401600060405180830381865afa15801562001f66573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001f90919081019062002d83565b905062001fa08151600262002719565b62001fe68160008151811062001fba5762001fba62002ce8565b60200260200101518360008151811062001fd85762001fd862002ce8565b60200260200101516200277d565b6200201e8160018151811062002000576200200062002ce8565b60200260200101518360018151811062001fd85762001fd862002ce8565b6200207b866001600160a01b03166384768b7a8460008151811062002047576200204762002ce8565b60200260200101516040518263ffffffff1660e01b8152600401620010e491906001600160a01b0391909116815260200190565b620020a4866001600160a01b03166384768b7a8460018151811062002047576200204762002ce8565b60408051600180825281830190925290602080830190803683370190505091508282600081518110620020db57620020db62002ce8565b6001600160a01b03928316602091820292909201015260405163ca669fa760e01b8152908616600482015260008051602062004b368339815191529063ca669fa790602401600060405180830381600087803b1580156200213b57600080fd5b505af115801562002150573d6000803e3d6000fd5b505060405163552b818b60e01b81526001600160a01b038916925063552b818b915062002182908590600401620028f2565b600060405180830381600087803b1580156200219d57600080fd5b505af1158015620021b2573d6000803e3d6000fd5b50505050856001600160a01b0316632b47da526040518163ffffffff1660e01b8152600401600060405180830381865afa158015620021f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200221f919081019062002d83565b90506200222f8151600162002719565b620022498160008151811062001fba5762001fba62002ce8565b60405163423b45bd60e11b81526001600160a01b0385811660048301526200227e91908816906384768b7a9060240162001766565b60405163423b45bd60e11b81526001600160a01b038481166004830152620022b391908816906384768b7a90602401620010e4565b60408051600080825260208201909252905060405163ca669fa760e01b81526001600160a01b038716600482015290925060008051602062004b368339815191529063ca669fa790602401600060405180830381600087803b1580156200231957600080fd5b505af11580156200232e573d6000803e3d6000fd5b505060405163552b818b60e01b81526001600160a01b038916925063552b818b915062002360908590600401620028f2565b600060405180830381600087803b1580156200237b57600080fd5b505af115801562002390573d6000803e3d6000fd5b50505050856001600160a01b0316632b47da526040518163ffffffff1660e01b8152600401600060405180830381865afa158015620023d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620023fd919081019062002d83565b90506200240d8151600062002719565b60405163423b45bd60e11b81526001600160a01b0385811660048301526200244291908816906384768b7a9060240162001766565b60405163423b45bd60e11b81526001600160a01b0384811660048301526200247791908816906384768b7a9060240162001766565b60405163ca669fa760e01b81526001600160a01b038616600482015260008051602062004b368339815191529063ca669fa790602401600060405180830381600087803b158015620024c857600080fd5b505af1158015620024dd573d6000803e3d6000fd5b5050604051636bb225d160e11b8152600060048201526001600160a01b038916925063d7644ba29150602401600060405180830381600087803b1580156200252457600080fd5b505af115801562002539573d6000803e3d6000fd5b5050505062002580866001600160a01b031663d146fd1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001784573d6000803e3d6000fd5b505050505050565b6000806040516200259990620028d6565b604051809103906000f080158015620025b6573d6000803e3d6000fd5b50905060008130620025e56040518060400160405280600581526020016437bbb732b960d91b8152506200266b565b6040516001600160a01b0390911660248201526000604482015260640160408051601f198184030181529181526020820180516001600160e01b031663400ada7560e01b179052516200263890620028e4565b620026469392919062002e56565b604051809103906000f08015801562002663573d6000803e3d6000fd5b509392505050565b60006200267882620027c1565b5092915050565b604051630c9fd58160e01b8152811515600482015260008051602062004b3683398151915290630c9fd581906024015b60006040518083038186803b158015620026c857600080fd5b505afa158015620026dd573d6000803e3d6000fd5b5050505050565b60405163a598288560e01b8152811515600482015260008051602062004b368339815191529063a598288590602401620026af565b60405163260a5b1560e21b8152600481018390526024810182905260008051602062004b36833981519152906398296c54906044015b60006040518083038186803b1580156200276857600080fd5b505afa15801562002580573d6000803e3d6000fd5b6040516328a9b0fb60e11b81526001600160a01b0380841660048301528216602482015260008051602062004b368339815191529063515361f6906044016200274f565b60008082604051602001620027d7919062002e8d565b60408051808303601f190181529082905280516020909101206001625e79b760e01b0319825260048201819052915060008051602062004b368339815191529063ffa1864990602401602060405180830381865afa1580156200283e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002864919062002cb2565b6040516318caf8e360e31b815290925060008051602062004b368339815191529063c657c718906200289d908590879060040162002eab565b600060405180830381600087803b158015620028b857600080fd5b505af1158015620028cd573d6000803e3d6000fd5b50505050915091565b610dab8062002eda83390190565b610eb18062003c8583390190565b6020808252825182820181905260009190848201906040850190845b81811015620029355783516001600160a01b0316835292840192918401916001016200290e565b50909695505050505050565b60005b838110156200295e57818101518382015260200162002944565b50506000910152565b600081518084526200298181602086016020860162002941565b601f01601f19169290920160200192915050565b602080825282518282018190526000919060409081850190600581811b8701840188860187805b8581101562002a4b57603f198b8503018752825180516001600160a01b031685528901518985018990528051898601819052908a0190606081881b870181019190870190855b8181101562002a3457605f1989850301835262002a2184865162002967565b948e01949350918d019160010162002a02565b505050978a019794505091880191600101620029bc565b50919a9950505050505050505050565b6001600160a01b0381168114620004a857600080fd5b60006020828403121562002a8457600080fd5b813562002a918162002a5b565b9392505050565b60008151808452602080850194506020840160005b8381101562002ad55781516001600160e01b0319168752958201959082019060010162002aad565b509495945050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b8381101562002b5f57888303603f190185528151805187855262002b308886018262002967565b91890151858303868b015291905062002b4a818362002a98565b96890196945050509086019060010162002b09565b509098975050505050505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101562002bc857603f1988860301845262002bb585835162002967565b9450928501929085019060010162002b96565b5092979650505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b8381101562002b5f57888303603f19018552815180516001600160a01b0316845287015187840187905262002c368785018262002a98565b958801959350509086019060010162002bfe565b600181811c9082168062002c5f57607f821691505b60208210810362002c8057634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121562002c9957600080fd5b5051919050565b805162002cad8162002a5b565b919050565b60006020828403121562002cc557600080fd5b815162002a918162002a5b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121562002d1157600080fd5b8151801515811462002a9157600080fd5b60208152600062002a91602083018462002967565b8181038181111562002d5957634e487b7160e01b600052601160045260246000fd5b92915050565b60408152600062002d74604083018562002967565b90508260208301529392505050565b6000602080838503121562002d9757600080fd5b825167ffffffffffffffff8082111562002db057600080fd5b818501915085601f83011262002dc557600080fd5b81518181111562002dda5762002dda62002cd2565b8060051b604051601f19603f8301168101818110858211171562002e025762002e0262002cd2565b60405291825284820192508381018501918883111562002e2157600080fd5b938501935b8285101562002e4a5762002e3a8562002ca0565b8452938501939285019262002e26565b98975050505050505050565b6001600160a01b0384811682528316602082015260606040820181905260009062002e849083018462002967565b95945050505050565b6000825162002ea181846020870162002941565b9190910192915050565b6001600160a01b038316815260406020820181905260009062002ed19083018462002967565b94935050505056fe608060405234801561001057600080fd5b5061001961001e565b6100d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cd5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610ccc806100df6000396000f3fe6080604052600436106100c25760003560e01c8063715018a61161007f578063a5a470ad11610059578063a5a470ad14610226578063d146fd1b14610239578063d7644ba214610253578063f2fde38b1461027357600080fd5b8063715018a61461018a57806384768b7a1461019f5780638da5cb5b146101df57600080fd5b806311bcd830146100c75780632b47da52146100f7578063400ada7514610119578063552b818b1461013b57806359bcddde1461015b5780635c19a95c14610177575b600080fd5b3480156100d357600080fd5b506100e468056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561010357600080fd5b5061010c610293565b6040516100ee9190610a3d565b34801561012557600080fd5b50610139610134366004610ab6565b6102f5565b005b34801561014757600080fd5b50610139610156366004610ae9565b610414565b34801561016757600080fd5b506100e4670de0b6b3a764000081565b610139610185366004610b5e565b610531565b34801561019657600080fd5b50610139610629565b3480156101ab57600080fd5b506101cf6101ba366004610b5e565b60016020526000908152604090205460ff1681565b60405190151581526020016100ee565b3480156101eb57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016100ee565b610139610234366004610b80565b61063d565b34801561024557600080fd5b506000546101cf9060ff1681565b34801561025f57600080fd5b5061013961026e366004610be0565b610793565b34801561027f57600080fd5b5061013961028e366004610b5e565b61085c565b606060028054806020026020016040519081016040528092919081815260200182805480156102eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102cd575b5050505050905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff1660008115801561033b5750825b905060008267ffffffffffffffff1660011480156103585750303b155b905081158015610366575080155b156103845760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103ae57845460ff60401b1916600160401b1785555b6103b787610897565b6000805460ff1916871515179055831561040b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61041c6108a8565b60005b60025481101561047e576000600160006002848154811061044257610442610bfb565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905560010161041f565b5061048b600283836109c5565b5060005b818110156104f35760018060008585858181106104ae576104ae610bfb565b90506020020160208101906104c39190610b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161048f565b507f27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf8282604051610525929190610c11565b60405180910390a15050565b670de0b6b3a764000034101561058e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b038216146105e65760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e0000006044820152606401610585565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6106316108a8565b61063b6000610903565b565b60005460ff16158061065e57503360009081526001602052604090205460ff165b6106a15760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b6044820152606401610585565b602181146106f15760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e67746800006044820152606401610585565b68056bc75e2d6310000034101561074a5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f7369740000006044820152606401610585565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161078793929190610c5d565b60405180910390a25050565b61079b6108a8565b60005481151560ff9091161515036107ec5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce88185b1c9958591e481cd95d60621b6044820152606401610585565b6000805460ff1916821580159190911790915561082f576040517f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec390600090a150565b6040517f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0790600090a15b50565b6108646108a8565b6001600160a01b03811661088e57604051631e4fbdf760e01b815260006004820152602401610585565b61085981610903565b61089f610974565b610859816109bd565b336108da7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461063b5760405163118cdaa760e01b8152336004820152602401610585565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661063b57604051631afcd79f60e31b815260040160405180910390fd5b610864610974565b828054828255906000526020600020908101928215610a18579160200282015b82811115610a185781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906109e5565b50610a24929150610a28565b5090565b5b80821115610a245760008155600101610a29565b6020808252825182820181905260009190848201906040850190845b81811015610a7e5783516001600160a01b031683529284019291840191600101610a59565b50909695505050505050565b80356001600160a01b0381168114610aa157600080fd5b919050565b80358015158114610aa157600080fd5b60008060408385031215610ac957600080fd5b610ad283610a8a565b9150610ae060208401610aa6565b90509250929050565b60008060208385031215610afc57600080fd5b823567ffffffffffffffff80821115610b1457600080fd5b818501915085601f830112610b2857600080fd5b813581811115610b3757600080fd5b8660208260051b8501011115610b4c57600080fd5b60209290920196919550909350505050565b600060208284031215610b7057600080fd5b610b7982610a8a565b9392505050565b60008060208385031215610b9357600080fd5b823567ffffffffffffffff80821115610bab57600080fd5b818501915085601f830112610bbf57600080fd5b813581811115610bce57600080fd5b866020828501011115610b4c57600080fd5b600060208284031215610bf257600080fd5b610b7982610aa6565b634e487b7160e01b600052603260045260246000fd5b60208082528181018390526000908460408401835b86811015610c52576001600160a01b03610c3f84610a8a565b1682529183019190830190600101610c26565b509695505050505050565b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212209626a613dbfb7e12830784942389803c43dd0de89220444072e10a535d8573cc64736f6c6343000818003360a060405260405162000eb138038062000eb18339810160408190526200002691620003cd565b82816200003482826200009c565b505081604051620000459062000366565b6001600160a01b039091168152602001604051809103906000f08015801562000072573d6000803e3d6000fd5b506001600160a01b0316608052620000936200008d60805190565b62000102565b505050620004cb565b620000a78262000174565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115620000f457620000ef8282620001f4565b505050565b620000fe62000271565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6200014460008051602062000e91833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001718162000293565b50565b806001600160a01b03163b600003620001b057604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060600080846001600160a01b031684604051620002139190620004ad565b600060405180830381855af49150503d806000811462000250576040519150601f19603f3d011682016040523d82523d6000602084013e62000255565b606091505b50909250905062000268858383620002d6565b95945050505050565b3415620002915760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b038116620002bf57604051633173bdd160e11b815260006004820152602401620001a7565b8060008051602062000e91833981519152620001d3565b606082620002ef57620002e9826200033c565b62000335565b81511580156200030757506001600160a01b0384163b155b156200033257604051639996b31560e01b81526001600160a01b0385166004820152602401620001a7565b50805b9392505050565b8051156200034d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610524806200096d83390190565b80516001600160a01b03811681146200038c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620003c4578181015183820152602001620003aa565b50506000910152565b600080600060608486031215620003e357600080fd5b620003ee8462000374565b9250620003fe6020850162000374565b60408501519092506001600160401b03808211156200041c57600080fd5b818601915086601f8301126200043157600080fd5b81518181111562000446576200044662000391565b604051601f8201601f19908116603f0116810190838211818310171562000471576200047162000391565b816040528281528960208487010111156200048b57600080fd5b6200049e836020830160208801620003a7565b80955050505050509250925092565b60008251620004c1818460208701620003a7565b9190910192915050565b608051610487620004e66000396000601001526104876000f3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007b576000356001600160e01b03191663278f794360e11b14610071576040516334ad5dbb60e21b815260040160405180910390fd5b610079610083565b565b6100796100b2565b6000806100933660048184610312565b8101906100a09190610352565b915091506100ae82826100c2565b5050565b6100796100bd61011d565b610155565b6100cb82610179565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156101155761011082826101f5565b505050565b6100ae61026b565b60006101507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e808015610174573d6000f35b3d6000fd5b806001600160a01b03163b6000036101b457604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516102129190610422565b600060405180830381855af49150503d806000811461024d576040519150601f19603f3d011682016040523d82523d6000602084013e610252565b606091505b509150915061026285838361028a565b95945050505050565b34156100795760405163b398979f60e01b815260040160405180910390fd5b60608261029f5761029a826102e9565b6102e2565b81511580156102b657506001600160a01b0384163b155b156102df57604051639996b31560e01b81526001600160a01b03851660048201526024016101ab565b50805b9392505050565b8051156102f95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6000808585111561032257600080fd5b8386111561032f57600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561036557600080fd5b82356001600160a01b038116811461037c57600080fd5b9150602083013567ffffffffffffffff8082111561039957600080fd5b818501915085601f8301126103ad57600080fd5b8135818111156103bf576103bf61033c565b604051601f8201601f19908116603f011681019083821181831017156103e7576103e761033c565b8160405282815288602084870101111561040057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000825160005b818110156104435760208186018101518583015201610429565b50600092019182525091905056fea264697066735822122050fc77c91d584c02c0e0b72a5eba22ad71f9a2b88784c34d65184ca2ba02195064736f6c63430008180033608060405234801561001057600080fd5b5060405161052438038061052483398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b610427806100fd6000396000f3fe60806040526004361061004a5760003560e01c8063715018a61461004f5780638da5cb5b146100665780639623609d14610093578063ad3cb1cc146100a6578063f2fde38b146100e4575b600080fd5b34801561005b57600080fd5b50610064610104565b005b34801561007257600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b6100646100a1366004610272565b610118565b3480156100b257600080fd5b506100d7604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161008a919061038e565b3480156100f057600080fd5b506100646100ff3660046103a8565b610187565b61010c6101ca565b61011660006101f7565b565b6101206101ca565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061015090869086906004016103c5565b6000604051808303818588803b15801561016957600080fd5b505af115801561017d573d6000803e3d6000fd5b5050505050505050565b61018f6101ca565b6001600160a01b0381166101be57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6101c7816101f7565b50565b6000546001600160a01b031633146101165760405163118cdaa760e01b81523360048201526024016101b5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101c757600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561028757600080fd5b833561029281610247565b925060208401356102a281610247565b9150604084013567ffffffffffffffff808211156102bf57600080fd5b818601915086601f8301126102d357600080fd5b8135818111156102e5576102e561025c565b604051601f8201601f19908116603f0116810190838211818310171561030d5761030d61025c565b8160405282815289602084870101111561032657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000815180845260005b8181101561036e57602081850181015186830182015201610352565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006103a16020830184610348565b9392505050565b6000602082840312156103ba57600080fd5b81356103a181610247565b6001600160a01b03831681526040602082018190526000906103e990830184610348565b94935050505056fea26469706673582212204e6c3564458e40536cebf1d675d2ad7af11c5352eae442784c5e053dcf005af164736f6c63430008180033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61030000000000000000000000007109709ecfa91a80626ff3989d68f67f5b1dd12d885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12da26469706673582212205323375d2eebf7ef55d290440562e0e8e5e25da88a7f6e0ae6fd35c2017f2acd64736f6c63430008180033885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12da26469706673582212206549a073f29c9a9287d6c3120ae0d3a47a8fb0bc7790378c0debf84b7c5ef7e364736f6c63430008180033", +} + +// StakingAdminABI is the input ABI used to generate the binding from. +// Deprecated: Use StakingAdminMetaData.ABI instead. +var StakingAdminABI = StakingAdminMetaData.ABI + +// StakingAdminBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use StakingAdminMetaData.Bin instead. +var StakingAdminBin = StakingAdminMetaData.Bin + +// DeployStakingAdmin deploys a new Ethereum contract, binding an instance of StakingAdmin to it. +func DeployStakingAdmin(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *StakingAdmin, error) { + parsed, err := StakingAdminMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(StakingAdminBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &StakingAdmin{StakingAdminCaller: StakingAdminCaller{contract: contract}, StakingAdminTransactor: StakingAdminTransactor{contract: contract}, StakingAdminFilterer: StakingAdminFilterer{contract: contract}}, nil +} + +// StakingAdmin is an auto generated Go binding around an Ethereum contract. +type StakingAdmin struct { + StakingAdminCaller // Read-only binding to the contract + StakingAdminTransactor // Write-only binding to the contract + StakingAdminFilterer // Log filterer for contract events +} + +// StakingAdminCaller is an auto generated read-only Go binding around an Ethereum contract. +type StakingAdminCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// StakingAdminTransactor is an auto generated write-only Go binding around an Ethereum contract. +type StakingAdminTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// StakingAdminFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type StakingAdminFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// StakingAdminSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type StakingAdminSession struct { + Contract *StakingAdmin // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// StakingAdminCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type StakingAdminCallerSession struct { + Contract *StakingAdminCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// StakingAdminTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type StakingAdminTransactorSession struct { + Contract *StakingAdminTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// StakingAdminRaw is an auto generated low-level Go binding around an Ethereum contract. +type StakingAdminRaw struct { + Contract *StakingAdmin // Generic contract binding to access the raw methods on +} + +// StakingAdminCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type StakingAdminCallerRaw struct { + Contract *StakingAdminCaller // Generic read-only contract binding to access the raw methods on +} + +// StakingAdminTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type StakingAdminTransactorRaw struct { + Contract *StakingAdminTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewStakingAdmin creates a new instance of StakingAdmin, bound to a specific deployed contract. +func NewStakingAdmin(address common.Address, backend bind.ContractBackend) (*StakingAdmin, error) { + contract, err := bindStakingAdmin(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &StakingAdmin{StakingAdminCaller: StakingAdminCaller{contract: contract}, StakingAdminTransactor: StakingAdminTransactor{contract: contract}, StakingAdminFilterer: StakingAdminFilterer{contract: contract}}, nil +} + +// NewStakingAdminCaller creates a new read-only instance of StakingAdmin, bound to a specific deployed contract. +func NewStakingAdminCaller(address common.Address, caller bind.ContractCaller) (*StakingAdminCaller, error) { + contract, err := bindStakingAdmin(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &StakingAdminCaller{contract: contract}, nil +} + +// NewStakingAdminTransactor creates a new write-only instance of StakingAdmin, bound to a specific deployed contract. +func NewStakingAdminTransactor(address common.Address, transactor bind.ContractTransactor) (*StakingAdminTransactor, error) { + contract, err := bindStakingAdmin(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &StakingAdminTransactor{contract: contract}, nil +} + +// NewStakingAdminFilterer creates a new log filterer instance of StakingAdmin, bound to a specific deployed contract. +func NewStakingAdminFilterer(address common.Address, filterer bind.ContractFilterer) (*StakingAdminFilterer, error) { + contract, err := bindStakingAdmin(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &StakingAdminFilterer{contract: contract}, nil +} + +// bindStakingAdmin binds a generic wrapper to an already deployed contract. +func bindStakingAdmin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := StakingAdminMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_StakingAdmin *StakingAdminRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _StakingAdmin.Contract.StakingAdminCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_StakingAdmin *StakingAdminRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _StakingAdmin.Contract.StakingAdminTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_StakingAdmin *StakingAdminRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _StakingAdmin.Contract.StakingAdminTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_StakingAdmin *StakingAdminCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _StakingAdmin.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_StakingAdmin *StakingAdminTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _StakingAdmin.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_StakingAdmin *StakingAdminTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _StakingAdmin.Contract.contract.Transact(opts, method, params...) +} + +// ISSCRIPT is a free data retrieval call binding the contract method 0xf8ccbf47. +// +// Solidity: function IS_SCRIPT() view returns(bool) +func (_StakingAdmin *StakingAdminCaller) ISSCRIPT(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _StakingAdmin.contract.Call(opts, &out, "IS_SCRIPT") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// ISSCRIPT is a free data retrieval call binding the contract method 0xf8ccbf47. +// +// Solidity: function IS_SCRIPT() view returns(bool) +func (_StakingAdmin *StakingAdminSession) ISSCRIPT() (bool, error) { + return _StakingAdmin.Contract.ISSCRIPT(&_StakingAdmin.CallOpts) +} + +// ISSCRIPT is a free data retrieval call binding the contract method 0xf8ccbf47. +// +// Solidity: function IS_SCRIPT() view returns(bool) +func (_StakingAdmin *StakingAdminCallerSession) ISSCRIPT() (bool, error) { + return _StakingAdmin.Contract.ISSCRIPT(&_StakingAdmin.CallOpts) +} + +// SetAllowlist is a paid mutator transaction binding the contract method 0x47e98488. +// +// Solidity: function setAllowlist(address admin, address[] allowlist) returns() +func (_StakingAdmin *StakingAdminTransactor) SetAllowlist(opts *bind.TransactOpts, admin common.Address, allowlist []common.Address) (*types.Transaction, error) { + return _StakingAdmin.contract.Transact(opts, "setAllowlist", admin, allowlist) +} + +// SetAllowlist is a paid mutator transaction binding the contract method 0x47e98488. +// +// Solidity: function setAllowlist(address admin, address[] allowlist) returns() +func (_StakingAdmin *StakingAdminSession) SetAllowlist(admin common.Address, allowlist []common.Address) (*types.Transaction, error) { + return _StakingAdmin.Contract.SetAllowlist(&_StakingAdmin.TransactOpts, admin, allowlist) +} + +// SetAllowlist is a paid mutator transaction binding the contract method 0x47e98488. +// +// Solidity: function setAllowlist(address admin, address[] allowlist) returns() +func (_StakingAdmin *StakingAdminTransactorSession) SetAllowlist(admin common.Address, allowlist []common.Address) (*types.Transaction, error) { + return _StakingAdmin.Contract.SetAllowlist(&_StakingAdmin.TransactOpts, admin, allowlist) +} + +// SetAllowlistEnabled is a paid mutator transaction binding the contract method 0xb1e315bf. +// +// Solidity: function setAllowlistEnabled(address admin, bool enabled) returns() +func (_StakingAdmin *StakingAdminTransactor) SetAllowlistEnabled(opts *bind.TransactOpts, admin common.Address, enabled bool) (*types.Transaction, error) { + return _StakingAdmin.contract.Transact(opts, "setAllowlistEnabled", admin, enabled) +} + +// SetAllowlistEnabled is a paid mutator transaction binding the contract method 0xb1e315bf. +// +// Solidity: function setAllowlistEnabled(address admin, bool enabled) returns() +func (_StakingAdmin *StakingAdminSession) SetAllowlistEnabled(admin common.Address, enabled bool) (*types.Transaction, error) { + return _StakingAdmin.Contract.SetAllowlistEnabled(&_StakingAdmin.TransactOpts, admin, enabled) +} + +// SetAllowlistEnabled is a paid mutator transaction binding the contract method 0xb1e315bf. +// +// Solidity: function setAllowlistEnabled(address admin, bool enabled) returns() +func (_StakingAdmin *StakingAdminTransactorSession) SetAllowlistEnabled(admin common.Address, enabled bool) (*types.Transaction, error) { + return _StakingAdmin.Contract.SetAllowlistEnabled(&_StakingAdmin.TransactOpts, admin, enabled) +} + +// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4. +// +// Solidity: function upgrade(address admin, address deployer) returns() +func (_StakingAdmin *StakingAdminTransactor) Upgrade(opts *bind.TransactOpts, admin common.Address, deployer common.Address) (*types.Transaction, error) { + return _StakingAdmin.contract.Transact(opts, "upgrade", admin, deployer) +} + +// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4. +// +// Solidity: function upgrade(address admin, address deployer) returns() +func (_StakingAdmin *StakingAdminSession) Upgrade(admin common.Address, deployer common.Address) (*types.Transaction, error) { + return _StakingAdmin.Contract.Upgrade(&_StakingAdmin.TransactOpts, admin, deployer) +} + +// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4. +// +// Solidity: function upgrade(address admin, address deployer) returns() +func (_StakingAdmin *StakingAdminTransactorSession) Upgrade(admin common.Address, deployer common.Address) (*types.Transaction, error) { + return _StakingAdmin.Contract.Upgrade(&_StakingAdmin.TransactOpts, admin, deployer) +} diff --git a/contracts/core/.gas-snapshot b/contracts/core/.gas-snapshot index 7e6170a6a..55b6406e5 100644 --- a/contracts/core/.gas-snapshot +++ b/contracts/core/.gas-snapshot @@ -1,9 +1,7 @@ -Admin_Test:test_pause_unpause() (gas: 9715286) -Admin_Test:test_upgrade() (gas: 13641507) -AllocPredeploys_Test:test_num_allocs() (gas: 1180989447) -AllocPredeploys_Test:test_predeploys() (gas: 1180924831) -AllocPredeploys_Test:test_preinstalls() (gas: 1181560964) -AllocPredeploys_Test:test_proxies() (gas: 1408568190) +AllocPredeploys_Test:test_num_allocs() (gas: 1181003772) +AllocPredeploys_Test:test_predeploys() (gas: 1180939178) +AllocPredeploys_Test:test_preinstalls() (gas: 1181575289) +AllocPredeploys_Test:test_proxies() (gas: 1408582515) FeeOracleV1_Test:test_bulkSetFeeParams() (gas: 172862) FeeOracleV1_Test:test_feeFor() (gas: 120708) FeeOracleV1_Test:test_setBaseGasLimit() (gas: 32208) @@ -82,6 +80,8 @@ OmniPortal_xsubmit_gas_Test:test_xsubmit_guzzle25_succeeds() (gas: 68668075) OmniPortal_xsubmit_gas_Test:test_xsubmit_guzzle50_succeeds() (gas: 71593012) OmniPortal_xsubmit_gas_Test:test_xsubmit_guzzle5_succeeds() (gas: 66331901) Omni_Test:test_constructor() (gas: 1008119) +PortalAdmin_Test:test_pause_unpause() (gas: 9715242) +PortalAdmin_Test:test_upgrade() (gas: 13641551) PortalRegistry_Test:test_register() (gas: 1092038) Preinstalls_Test:test_getPermit2Code() (gas: 31872) Quorum_Test:test_verify_allInvalidSigs_reverts() (gas: 281180) @@ -94,7 +94,11 @@ Quorum_Test:test_verify_powerBasedQourum_succeeds() (gas: 783640) Quorum_Test:test_verify_sigsNotSorted_reverts() (gas: 283805) Quorum_Test:test_verify_succeeds() (gas: 295721) Slashing_Test:test_unjail() (gas: 54734) -Staking_Test:test_createValidator() (gas: 104547) +StakingAdmin_Test:test_setAllowlist() (gas: 5354964) +StakingAdmin_Test:test_setAllowlistEnabled() (gas: 5231289) +StakingAdmin_Test:test_upgrade() (gas: 10069511) +Staking_Test:test_allowlist() (gas: 1415436) +Staking_Test:test_createValidator() (gas: 1451749) XAppUpgradeable_Test:test_isXCall() (gas: 148924) XAppUpgradeable_Test:test_omniChainId() (gas: 16703) XAppUpgradeable_Test:test_setDefaultConfLevel() (gas: 16678) diff --git a/contracts/core/script/admin/Admin.s.sol b/contracts/core/script/admin/PortalAdmin.s.sol similarity index 85% rename from contracts/core/script/admin/Admin.s.sol rename to contracts/core/script/admin/PortalAdmin.s.sol index e1a708a30..40f0c7362 100644 --- a/contracts/core/script/admin/Admin.s.sol +++ b/contracts/core/script/admin/PortalAdmin.s.sol @@ -9,16 +9,16 @@ import { EIP1967Helper } from "script/utils/EIP1967Helper.sol"; import { OmniPortal } from "src/xchain/OmniPortal.sol"; /** - * @title Admin - * @notice A colleciton of admin scripts. + * @title PortalAdmin + * @notice A colleciton of admin scripts for the OmniPortal contract. */ -contract Admin is Script { +contract PortalAdmin is Script { /** * @notice Pause a portal contract. * @param admin The owner of the portal contract. * @param portal The address of the portal contract. */ - function pausePortal(address admin, address portal) public { + function pause(address admin, address portal) public { vm.startBroadcast(admin); OmniPortal(portal).pause(); vm.stopBroadcast(); @@ -29,7 +29,7 @@ contract Admin is Script { * @param admin The owner of the portal contract. * @param portal The address of the portal contract. */ - function unpausePortal(address admin, address portal) public { + function unpause(address admin, address portal) public { vm.startBroadcast(admin); OmniPortal(portal).unpause(); vm.stopBroadcast(); @@ -42,7 +42,7 @@ contract Admin is Script { * @param portal The address of the portal contract. * @param data Calldata to execute after upgrading the contract. */ - function upgradePortal(address admin, address deployer, address portal, bytes calldata data) public { + function upgrade(address admin, address deployer, address portal, bytes calldata data) public { // deploy new implementation vm.startBroadcast(deployer); address impl = address(new OmniPortal()); diff --git a/contracts/core/script/admin/StakingAdmin.s.sol b/contracts/core/script/admin/StakingAdmin.s.sol new file mode 100644 index 000000000..e4cc51087 --- /dev/null +++ b/contracts/core/script/admin/StakingAdmin.s.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity 0.8.24; + +import { Script } from "forge-std/Script.sol"; +import { ProxyAdmin } from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import { ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { InitializableHelper } from "script/utils/InitializableHelper.sol"; +import { EIP1967Helper } from "script/utils/EIP1967Helper.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { Staking } from "src/octane/Staking.sol"; +import { Staking_Test } from "test/octane/Staking.t.sol"; + +/** + * @title StakingAdmin + * @notice A colleciton of admin scripts for the Staking contract. + */ +contract StakingAdmin is Script { + /** + * @notice Set the allowlist of the staking contract. + * @param admin The owner of the staking contract. + * @param allowlist The new allowlist. + */ + function setAllowlist(address admin, address[] calldata allowlist) public { + vm.startBroadcast(admin); + Staking(Predeploys.Staking).setAllowlist(allowlist); + vm.stopBroadcast(); + } + + /** + * @notice Enable or disable the allowlist of the staking contract. + * @param admin The owner of the staking contract. + * @param enabled The new allowlist status. + */ + function setAllowlistEnabled(address admin, bool enabled) public { + vm.startBroadcast(admin); + Staking(Predeploys.Staking).setAllowlistEnabled(enabled); + vm.stopBroadcast(); + } + + /** + * @notice Upgrade a staking contract. + * @param admin The address of the admin account, owner of the proxy admin + * @param deployer The address of the account that will deploy the new implementation. + */ + function upgrade(address admin, address deployer) public { + // deploy new implementation + vm.startBroadcast(deployer); + address impl = address(new Staking()); + vm.stopBroadcast(); + + // upgrade proxy + vm.startBroadcast(admin); + + address proxyAdmin = EIP1967Helper.getAdmin(Predeploys.Staking); + ProxyAdmin(proxyAdmin).upgradeAndCall(ITransparentUpgradeableProxy(Predeploys.Staking), impl, ""); + + vm.stopBroadcast(); + + // quick checks + require(InitializableHelper.areInitializersDisabled(impl), "initializers not disabled"); + require(Staking(Predeploys.Staking).owner() == admin, "owner not set"); + + // run tests + Staking_Test tests = new Staking_Test(); + tests.run(Predeploys.Staking); + } +} diff --git a/contracts/core/src/octane/Staking.sol b/contracts/core/src/octane/Staking.sol index a6f7282b4..74cd8d476 100644 --- a/contracts/core/src/octane/Staking.sol +++ b/contracts/core/src/octane/Staking.sol @@ -32,6 +32,22 @@ contract Staking is OwnableUpgradeable { */ event Delegate(address indexed delegator, address indexed validator, uint256 amount); + /** + * @notice Emitted when the allowlist is enabled + */ + event AllowlistEnabled(); + + /** + * @notice Emitted when the allowlist is disabled + */ + event AllowlistDisabled(); + + /** + * @notice Emitted when validators are added to the allowlist + * @param validators The list of validators that were added + */ + event AllowlistSet(address[] validators); + /** * @notice The minimum deposit required to create a validator */ @@ -52,6 +68,15 @@ contract Staking is OwnableUpgradeable { */ mapping(address => bool) public isAllowedValidator; + /** + * @notice The list of allowed validator addresses. + */ + address[] internal _allowlist; + + constructor() { + _disableInitializers(); + } + function initialize(address owner_, bool isAllowlistEnabled_) public initializer { __Ownable_init(owner_); isAllowlistEnabled = isAllowlistEnabled_; @@ -85,39 +110,50 @@ contract Staking is OwnableUpgradeable { emit Delegate(msg.sender, validator, msg.value); } + /** + * @notice Returns the list of allowed validator addresses + */ + function allowlist() external view returns (address[] memory) { + return _allowlist; + } + ////////////////////////////////////////////////////////////////////////////// // Admin // ////////////////////////////////////////////////////////////////////////////// /** - * @notice Enable the validator allowlist + * @notice Add validators to the allowlist + * @param enabled True to enable the allowlist, false to disable */ - function enableAllowlist() external onlyOwner { - isAllowlistEnabled = true; - } + function setAllowlistEnabled(bool enabled) external onlyOwner { + require(isAllowlistEnabled != enabled, "Staking: already set"); - /** - * @notice Disable the validator allowlist - */ - function disableAllowlist() external onlyOwner { - isAllowlistEnabled = false; - } + isAllowlistEnabled = enabled; - /** - * @notice Add validators to allow list - */ - function allowValidators(address[] calldata validators) external onlyOwner { - for (uint256 i = 0; i < validators.length; i++) { - isAllowedValidator[validators[i]] = true; + if (enabled) { + emit AllowlistEnabled(); + } else { + emit AllowlistDisabled(); } } /** - * @notice Remove validators from allow list + * @notice Add validators to the allowlist + * @param validators The list of validators to add */ - function disallowValidators(address[] calldata validators) external onlyOwner { + function setAllowlist(address[] calldata validators) external onlyOwner { + // reset current + for (uint256 i = 0; i < _allowlist.length; i++) { + isAllowedValidator[_allowlist[i]] = false; + } + + _allowlist = validators; + + // set new for (uint256 i = 0; i < validators.length; i++) { - isAllowedValidator[validators[i]] = false; + isAllowedValidator[validators[i]] = true; } + + emit AllowlistSet(validators); } } diff --git a/contracts/core/test/octane/Staking.t.sol b/contracts/core/test/octane/Staking.t.sol index ab09c7773..ec8080f27 100644 --- a/contracts/core/test/octane/Staking.t.sol +++ b/contracts/core/test/octane/Staking.t.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity =0.8.24; +import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import { Staking } from "src/octane/Staking.sol"; import { Test, Vm } from "forge-std/Test.sol"; @@ -12,28 +13,40 @@ contract Staking_Test is Test { /// @dev Matches Staking.CreateValidator event event CreateValidator(address indexed validator, bytes pubkey, uint256 deposit); - address owner; - StakingHarness staking; + function test_createValidator() public { + _testCreateValidator(_deployStaking()); + } - function setUp() public { - owner = makeAddr("owner"); - staking = new StakingHarness(owner); + function test_allowlist() public { + _testAllowlist(_deployStaking()); } - function test_createValidator() public { + function _deployStaking() internal returns (Staking) { + address impl = address(new Staking()); + address proxy = address( + new TransparentUpgradeableProxy( + impl, address(this), abi.encodeCall(Staking.initialize, (makeAddr("owner"), false)) + ) + ); + + return Staking(proxy); + } + + /// @dev Test createValidator. Includes allowlist tests. + function _testCreateValidator(Staking staking) internal { + address owner = staking.owner(); + address validator = makeAddr("validator"); address[] memory validators = new address[](1); validators[0] = validator; bytes memory pubkey = abi.encodePacked(hex"03", keccak256("pubkey")); vm.deal(validator, staking.MinDeposit()); - // allowlist is disabled - assertFalse(staking.isAllowlistEnabled()); - // enable allowlist - vm.prank(owner); - staking.enableAllowlist(); + vm.startPrank(owner); + if (!staking.isAllowlistEnabled()) staking.setAllowlistEnabled(true); assertTrue(staking.isAllowlistEnabled()); + vm.stopPrank(); // must be in allowlist vm.expectRevert("Staking: not allowed"); @@ -41,7 +54,7 @@ contract Staking_Test is Test { // add to allowlist vm.prank(owner); - staking.allowValidators(validators); + staking.setAllowlist(validators); assertTrue(staking.isAllowedValidator(validator)); // requires minimum deposit @@ -68,7 +81,7 @@ contract Staking_Test is Test { // remove from allowlist vm.prank(owner); - staking.disallowValidators(validators); + staking.setAllowlist(new address[](0)); assertFalse(staking.isAllowedValidator(validator)); // must be in allowlist @@ -79,7 +92,7 @@ contract Staking_Test is Test { // disable allowlist vm.prank(owner); - staking.disableAllowlist(); + staking.setAllowlistEnabled(false); assertFalse(staking.isAllowlistEnabled()); // can create validator with allowlist disabled @@ -89,14 +102,70 @@ contract Staking_Test is Test { vm.prank(validator); staking.createValidator{ value: deposit }(pubkey); } -} -/** - * @title StakingHarness - * @notice Wrapper around Staking.sol that allows setting owner in constructor - */ -contract StakingHarness is Staking { - constructor(address _owner) { - _transferOwnership(_owner); + function _testAllowlist(Staking staking) internal { + // set allowlist + address owner = staking.owner(); + + // enable allowlist + vm.prank(owner); + staking.setAllowlistEnabled(true); + assertTrue(staking.isAllowlistEnabled()); + + address val1 = makeAddr("validator1"); + address val2 = makeAddr("validator2"); + address[] memory validators = new address[](2); + validators[0] = val1; + validators[1] = val2; + + // allow validators + vm.prank(owner); + staking.setAllowlist(validators); + + // check allowlist + address[] memory allowlist = staking.allowlist(); + assertEq(allowlist.length, 2); + assertEq(allowlist[0], validators[0]); + assertEq(allowlist[1], validators[1]); + assertTrue(staking.isAllowedValidator(validators[0])); + assertTrue(staking.isAllowedValidator(validators[1])); + + // remove val1 + validators = new address[](1); + validators[0] = val2; + + // reset + vm.prank(owner); + staking.setAllowlist(validators); + + // check allowlist + allowlist = staking.allowlist(); + assertEq(allowlist.length, 1); + assertEq(allowlist[0], validators[0]); + assertFalse(staking.isAllowedValidator(val1)); + assertTrue(staking.isAllowedValidator(val2)); + + // remove all + validators = new address[](0); + + vm.prank(owner); + staking.setAllowlist(validators); + + // check allowlist + allowlist = staking.allowlist(); + assertEq(allowlist.length, 0); + assertFalse(staking.isAllowedValidator(val1)); + assertFalse(staking.isAllowedValidator(val2)); + + // disable allowlist + vm.prank(owner); + staking.setAllowlistEnabled(false); + assertFalse(staking.isAllowlistEnabled()); + } + + /// @dev Run test suite + function run(address staking) public { + _testCreateValidator(Staking(staking)); + _testAllowlist(Staking(staking)); } } diff --git a/contracts/core/test/script/Admin.t.sol b/contracts/core/test/script/PortalAdmin.t.sol similarity index 91% rename from contracts/core/test/script/Admin.t.sol rename to contracts/core/test/script/PortalAdmin.t.sol index fd4fbff6c..c94fa8feb 100644 --- a/contracts/core/test/script/Admin.t.sol +++ b/contracts/core/test/script/PortalAdmin.t.sol @@ -6,23 +6,23 @@ import { ProxyAdmin } from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin import { ConfLevel } from "src/libraries/ConfLevel.sol"; import { XTypes } from "src/libraries/XTypes.sol"; import { OmniPortal } from "src/xchain/OmniPortal.sol"; -import { Admin } from "script/admin/Admin.s.sol"; +import { PortalAdmin } from "script/admin/PortalAdmin.s.sol"; import { EIP1967Helper } from "script/utils/EIP1967Helper.sol"; import { PortalHarness } from "test/xchain/common/PortalHarness.sol"; import { MockFeeOracle } from "test/utils/MockFeeOracle.sol"; import { Test } from "forge-std/Test.sol"; /** - * @title Admin_Test - * @notice Test suite for Admin script. + * @title PortalAdmin_Test + * @notice Test suite for PortalAdmin script. */ -contract Admin_Test is Test { +contract PortalAdmin_Test is Test { // test chain Ids, used to set network and make test xcalls uint64 constant thisChainId = 1; uint64 constant thatChainId = 2; function test_pause_unpause() public { - Admin a = new Admin(); + PortalAdmin a = new PortalAdmin(); address admin = makeAddr("admin"); address portal = deployPortal(admin); @@ -31,21 +31,21 @@ contract Admin_Test is Test { makeXCall(portal); // pause - a.pausePortal(admin, portal); + a.pause(admin, portal); // should revert vm.expectRevert("OmniPortal: paused"); makeXCall(portal); // unpause - a.unpausePortal(admin, portal); + a.unpause(admin, portal); // no revert makeXCall(portal); } function test_upgrade() public { - Admin a = new Admin(); + PortalAdmin a = new PortalAdmin(); address admin = makeAddr("admin"); address deployer = makeAddr("deployer"); @@ -63,7 +63,7 @@ contract Admin_Test is Test { proxyAdmin, abi.encodeWithSelector(ProxyAdmin.upgradeAndCall.selector, portal, expectedImplAfter, upgradeCalldata) ); - a.upgradePortal(admin, deployer, portal, upgradeCalldata); + a.upgrade(admin, deployer, portal, upgradeCalldata); // check impl changed assertEq(expectedImplAfter, EIP1967Helper.getImplementation(portal)); diff --git a/contracts/core/test/script/StakingAdmin.t.sol b/contracts/core/test/script/StakingAdmin.t.sol new file mode 100644 index 000000000..9d7e2f825 --- /dev/null +++ b/contracts/core/test/script/StakingAdmin.t.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity =0.8.24; + +import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { InitializableHelper } from "script/utils/InitializableHelper.sol"; +import { EIP1967Helper } from "script/utils/EIP1967Helper.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { StakingAdmin } from "script/admin/StakingAdmin.s.sol"; +import { Staking } from "src/octane/Staking.sol"; +import { Test } from "forge-std/Test.sol"; + +contract StakingAdmin_Test is Test { + address admin = makeAddr("admin"); + bool enableAllowList = true; + + // @dev Etchs a TransparentUpgradeableProxy at Predeploys.Staking, + // with a Staking implementation + function setUp() public { + address impl = address(new Staking()); + + // tmp proxy, code etched to predeploy address + address tmp = address(new TransparentUpgradeableProxy(impl, admin, "")); + vm.etch(Predeploys.Staking, tmp.code); + + EIP1967Helper.setImplementation(Predeploys.Staking, impl); + EIP1967Helper.setAdmin(Predeploys.Staking, EIP1967Helper.getAdmin(tmp)); + + vm.etch(tmp, ""); + vm.resetNonce(tmp); + + Staking(Predeploys.Staking).initialize(admin, enableAllowList); + } + + function test_setAllowlist() public { + address[] memory allowlist = new address[](2); + allowlist[0] = makeAddr("val1"); + allowlist[1] = makeAddr("val2"); + + Staking staking = Staking(Predeploys.Staking); + StakingAdmin a = new StakingAdmin(); + a.setAllowlist(admin, allowlist); + + assertEq(staking.allowlist(), allowlist); + assertEq(staking.isAllowedValidator(allowlist[0]), true); + assertEq(staking.isAllowedValidator(allowlist[1]), true); + } + + function test_setAllowlistEnabled() public { + Staking staking = Staking(Predeploys.Staking); + + StakingAdmin a = new StakingAdmin(); + a.setAllowlistEnabled(admin, !enableAllowList); + + assertEq(staking.isAllowlistEnabled(), !enableAllowList); + } + + function test_upgrade() public { + StakingAdmin a = new StakingAdmin(); + + address deployer = makeAddr("deployer"); + vm.deal(deployer, 1 ether); + + // just assert no errors, this runs full Staking test suite + a.upgrade(admin, deployer); + } +} diff --git a/e2e/app/admin/admin_internal_test.go b/e2e/app/admin/admin_internal_test.go deleted file mode 100644 index b22cb8b44..000000000 --- a/e2e/app/admin/admin_internal_test.go +++ /dev/null @@ -1,102 +0,0 @@ -package admin - -import ( - "context" - "testing" - - "github.com/omni-network/omni/lib/netconf" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - - "github.com/stretchr/testify/require" -) - -type runCall struct { - calldata []byte - senders []common.Address -} - -type mockRunner struct { - calls []runCall -} - -var _ runner = &mockRunner{} - -func (r *mockRunner) run(ctx context.Context, calldata []byte, senders ...common.Address) (string, error) { - r.calls = append(r.calls, runCall{calldata, senders}) - - return "", nil -} - -func TestPausePortalAction(t *testing.T) { - t.Parallel() - - ctx := context.Background() - - r := &mockRunner{} - s := mockShared() - c := mockChain() - - _, err := pausePortal(ctx, s, c, r) - require.NoError(t, err) - require.Len(t, r.calls, 1) - require.Equal(t, mustPack(t, adminABI, "pausePortal", s.admin, c.PortalAddress), r.calls[0].calldata) - require.Equal(t, []common.Address{s.admin}, r.calls[0].senders) -} - -func TestUnpausePortalAction(t *testing.T) { - t.Parallel() - - ctx := context.Background() - - r := &mockRunner{} - s := mockShared() - c := mockChain() - - _, err := unpausePortal(ctx, s, c, r) - require.NoError(t, err) - require.Len(t, r.calls, 1) - require.Equal(t, mustPack(t, adminABI, "unpausePortal", s.admin, c.PortalAddress), r.calls[0].calldata) - require.Equal(t, []common.Address{s.admin}, r.calls[0].senders) -} - -func TestUpgradePortalAction(t *testing.T) { - t.Parallel() - - ctx := context.Background() - - r := &mockRunner{} - s := mockShared() - c := mockChain() - - _, err := upgradePortal(ctx, s, c, r) - require.NoError(t, err) - require.Len(t, r.calls, 1) - require.Equal(t, mustPack(t, adminABI, "upgradePortal", s.admin, s.deployer, c.PortalAddress, []byte{}), r.calls[0].calldata) - require.Equal(t, []common.Address{s.admin, s.deployer}, r.calls[0].senders) -} - -func mockShared() shared { - return shared{ - admin: common.HexToAddress("0x1"), - deployer: common.HexToAddress("0x2"), - } -} - -func mockChain() chain { - return chain{ - Chain: netconf.Chain{ - PortalAddress: common.HexToAddress("0x3"), - }, - rpc: "http://localhost:8545", - } -} - -func mustPack(t *testing.T, abi *abi.ABI, method string, args ...interface{}) []byte { - t.Helper() - data, err := abi.Pack(method, args...) - require.NoError(t, err) - - return data -} diff --git a/e2e/app/admin/config.go b/e2e/app/admin/config.go deleted file mode 100644 index 755119897..000000000 --- a/e2e/app/admin/config.go +++ /dev/null @@ -1,25 +0,0 @@ -package admin - -import ( - "github.com/omni-network/omni/lib/errors" -) - -const chainAll = "all" - -type PortalAdminConfig struct { - Chain string // Name of chain to run admin command on, use "all" to run on all chains -} - -func DefaultPortalAdminConfig() PortalAdminConfig { - return PortalAdminConfig{ - Chain: "", - } -} - -func (cfg PortalAdminConfig) Validate() error { - if cfg.Chain == "" { - return errors.New("chain must be set") - } - - return nil -} diff --git a/e2e/app/admin/pauseportal.go b/e2e/app/admin/pauseportal.go deleted file mode 100644 index f38f39792..000000000 --- a/e2e/app/admin/pauseportal.go +++ /dev/null @@ -1,27 +0,0 @@ -package admin - -import ( - "context" - - "github.com/omni-network/omni/e2e/app" - "github.com/omni-network/omni/lib/errors" -) - -// PausePortal pauses the portal contracts on a network. Only single chain is supported. -func PausePortal(ctx context.Context, def app.Definition, cfg PortalAdminConfig) error { - return run(ctx, def, cfg, "pausePortal", pausePortal) -} - -func pausePortal(ctx context.Context, s shared, c chain, r runner) (string, error) { - calldata, err := adminABI.Pack("pausePortal", s.admin, c.PortalAddress) - if err != nil { - return "", errors.Wrap(err, "pack calldata") - } - - out, err := r.run(ctx, calldata, s.admin) - if err != nil { - return out, errors.Wrap(err, "run forge") - } - - return out, nil -} diff --git a/e2e/app/admin/unpauseportal.go b/e2e/app/admin/unpauseportal.go deleted file mode 100644 index c31e12af2..000000000 --- a/e2e/app/admin/unpauseportal.go +++ /dev/null @@ -1,27 +0,0 @@ -package admin - -import ( - "context" - - "github.com/omni-network/omni/e2e/app" - "github.com/omni-network/omni/lib/errors" -) - -// UnpausePortal unpauses the portal contracts on a network. Only single chain is supported. -func UnpausePortal(ctx context.Context, def app.Definition, cfg PortalAdminConfig) error { - return run(ctx, def, cfg, "unpausePortal", unpausePortal) -} - -func unpausePortal(ctx context.Context, s shared, c chain, r runner) (string, error) { - calldata, err := adminABI.Pack("unpausePortal", s.admin, c.PortalAddress) - if err != nil { - return "", errors.Wrap(err, "pack calldata") - } - - out, err := r.run(ctx, calldata, s.admin) - if err != nil { - return out, errors.Wrap(err, "run forge") - } - - return out, nil -} diff --git a/e2e/app/admin/upgradeportal.go b/e2e/app/admin/upgradeportal.go deleted file mode 100644 index 2d99445ec..000000000 --- a/e2e/app/admin/upgradeportal.go +++ /dev/null @@ -1,31 +0,0 @@ -package admin - -import ( - "context" - - "github.com/omni-network/omni/e2e/app" - "github.com/omni-network/omni/lib/errors" -) - -// UpgradePortal upgrades the portal contracts on a network. Only single chain is supported. -func UpgradePortal(ctx context.Context, def app.Definition, cfg PortalAdminConfig) error { - return run(ctx, def, cfg, "upgradePortal", upgradePortal) -} - -func upgradePortal(ctx context.Context, s shared, c chain, r runner) (string, error) { - // TODO: thie is the calldata to execute on the portal contract post upgrade - // this is empty for now, but should be replaced with calldata if portal re-initialization is required - initCalldata := []byte{} - - calldata, err := adminABI.Pack("upgradePortal", s.admin, s.deployer, c.PortalAddress, initCalldata) - if err != nil { - return "", errors.Wrap(err, "pack calldata") - } - - out, err := r.run(ctx, calldata, s.admin, s.deployer) - if err != nil { - return out, errors.Wrap(err, "run forge") - } - - return out, nil -} diff --git a/e2e/app/admin/common.go b/e2e/app/admin_common.go similarity index 54% rename from e2e/app/admin/common.go rename to e2e/app/admin_common.go index dea80e8b2..eb3fbdfbf 100644 --- a/e2e/app/admin/common.go +++ b/e2e/app/admin_common.go @@ -1,19 +1,14 @@ -package admin +package app import ( "context" "os/exec" "strings" - "github.com/omni-network/omni/contracts/bindings" - "github.com/omni-network/omni/e2e/app" "github.com/omni-network/omni/e2e/app/eoa" fbproxy "github.com/omni-network/omni/e2e/fbproxy/app" - "github.com/omni-network/omni/halo/genutil/evm/predeploys" "github.com/omni-network/omni/lib/anvil" "github.com/omni-network/omni/lib/errors" - "github.com/omni-network/omni/lib/ethclient" - "github.com/omni-network/omni/lib/log" "github.com/omni-network/omni/lib/netconf" "github.com/omni-network/omni/lib/xchain" @@ -23,8 +18,13 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" ) -// adminABI is the ABI for the Admin script contract. -var adminABI = mustGetABI(bindings.AdminMetaData) +const ( + scriptPortalAdmin = "PortalAdmin" + scriptStakingAdmin = "StakingAdmin" + + chainAll = "all" + chainOmniEVM = "omni_evm" +) // shared contains common resources for all admin operations. type shared struct { @@ -42,89 +42,8 @@ type chain struct { rpc string } -// runner is an interface for running Admin forge scripts. -type runner interface { - run(ctx context.Context, input []byte, senders ...common.Address) (string, error) -} - -// forgeRunner is a runner that runs forge scripts against an rpc. -type forgeRunner struct { - rpc string -} - -var _ runner = forgeRunner{} - -// run runs an Admin forge script against an rpc, returning the output. -func (r forgeRunner) run(ctx context.Context, input []byte, senders ...common.Address) (string, error) { - return runForge(ctx, "Admin", r.rpc, input, senders...) -} - -// action is a function that performs an admin action. It returns the output of the action and an error. -type action func(ctx context.Context, s shared, c chain, r runner) (string, error) - -// run runs an admin action with some config on an app definition. -func run(ctx context.Context, def app.Definition, cfg PortalAdminConfig, name string, act action) error { - if err := cfg.Validate(); err != nil { - return errors.Wrap(err, "validate config") - } - - s, err := setup(ctx, def) - if err != nil { - return errors.Wrap(err, "setup") - } - - chains := getChains(s.network, cfg.Chain) - - // runForChain runs the action for a single chain. - runForChain := func(ctx context.Context, chain string) (string, error) { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - c, err := setupChain(ctx, s, chain) - if err != nil { - return "", errors.Wrap(err, "setup chain") - } - - r := forgeRunner{rpc: c.rpc} - - out, err := act(ctx, s, c, r) - if err != nil { - return out, errors.Wrap(err, "run action", "action", name, "chain", chain) - } - - return out, nil - } - - for _, chain := range chains { - out, err := runForChain(ctx, chain) - - if err != nil { - log.Error(ctx, "Run failed", err, "chain", chain) - return err - } - - log.Info(ctx, "Run succeeded", "chain", chain, "out", out) - } - - return nil -} - -// getChains returns the chain names to run an admin action on, returning all chains if chain is "all". -func getChains(network netconf.Network, chain string) []string { - if chain == chainAll { - var chains []string - for _, c := range network.EVMChains() { - chains = append(chains, c.Name) - } - - return chains - } - - return []string{chain} -} - // setup returns common resources for all admin operations. -func setup(ctx context.Context, def app.Definition) (shared, error) { +func setup(def Definition) (shared, error) { netID := def.Testnet.Network admin, ok := eoa.Address(netID, eoa.RoleAdmin) @@ -137,17 +56,8 @@ func setup(ctx context.Context, def app.Definition) (shared, error) { return shared{}, errors.New("deployer eoas not found", "network", netID) } - endpoints := makeEndpoints(def) - - portalReg, err := makePortalRegistry(netID, endpoints) - if err != nil { - return shared{}, errors.Wrap(err, "portal registry") - } - - network, err := netconf.AwaitOnExecutionChain(ctx, netID, portalReg, nil) - if err != nil { - return shared{}, errors.Wrap(err, "await on chain") - } + endpoints := externalEndpoints(def) + network := networkFromDef(def) return shared{ admin: admin, @@ -187,6 +97,42 @@ func setupChain(ctx context.Context, s shared, name string) (chain, error) { return chain{Chain: c, rpc: rpc}, nil } +// forChains runs a function for each chain in names. +func forChains( + ctx context.Context, + names []string, + s shared, + fn func(context.Context, shared, chain) error, +) error { + for _, name := range names { + c, err := setupChain(ctx, s, name) + if err != nil { + return errors.Wrap(err, "setup chain", "chain", name) + } + + if err := fn(ctx, s, c); err != nil { + return errors.Wrap(err, "chain", "chain", name) + } + } + + return nil +} + +// maybeAll returns all chain names if chain is "all", otherwise returns chain. +func maybeAll(network netconf.Network, chain string) []string { + if chain == chainAll { + var names []string + + for _, c := range network.EVMChains() { + names = append(names, c.Name) + } + + return names + } + + return []string{chain} +} + // runForge runs a forge script against an rpc, returning the ouptut. // if the senders are known anvil accounts, it will sign with private keys directly. // otherwise, it will use the unlocked flag. @@ -219,7 +165,7 @@ func runForge(ctx context.Context, script string, rpc string, input []byte, send ) } - return execCmd(ctx, dir, "forge", "script", script, + return execCmd(ctx, dir, "forge", "script", script, "--timeout", "300", // 5 minute timeout "--broadcast", "--slow", "--rpc-url", rpc, "--sig", hexutil.Encode(input), "--unlocked", ) } @@ -255,49 +201,6 @@ func execCmd(ctx context.Context, dir string, cmd string, args ...string) (strin return string(out), nil } -func makeEndpoints(def app.Definition) xchain.RPCEndpoints { - endpoints := make(xchain.RPCEndpoints) - - // Add all public chains - for _, public := range def.Testnet.PublicChains { - endpoints[public.Chain().Name] = public.NextRPCAddress() - } - - // Connect to a proper omni_evm that isn't unavailable - omniEVM := def.Testnet.BroadcastOmniEVM() - endpoints[omniEVM.Chain.Name] = omniEVM.ExternalRPC - - // Add omni consensus chain - endpoints[def.Testnet.Network.Static().OmniConsensusChain().Name] = def.Testnet.BroadcastNode().AddressRPC() - - // Add all anvil chains - for _, anvil := range def.Testnet.AnvilChains { - endpoints[anvil.Chain.Name] = anvil.ExternalRPC - } - - return endpoints -} - -func makePortalRegistry(network netconf.ID, endpoints xchain.RPCEndpoints) (*bindings.PortalRegistry, error) { - meta := netconf.MetadataByID(network, network.Static().OmniExecutionChainID) - rpc, err := endpoints.ByNameOrID(meta.Name, meta.ChainID) - if err != nil { - return nil, err - } - - ethCl, err := ethclient.Dial(meta.Name, rpc) - if err != nil { - return nil, err - } - - resp, err := bindings.NewPortalRegistry(common.HexToAddress(predeploys.PortalRegistry), ethCl) - if err != nil { - return nil, errors.Wrap(err, "create portal registry") - } - - return resp, nil -} - func mustGetABI(metadata *bind.MetaData) *abi.ABI { abi, err := metadata.GetAbi() if err != nil { diff --git a/e2e/app/admin_portal.go b/e2e/app/admin_portal.go new file mode 100644 index 000000000..80604fd7f --- /dev/null +++ b/e2e/app/admin_portal.go @@ -0,0 +1,122 @@ +package app + +import ( + "context" + + "github.com/omni-network/omni/contracts/bindings" + "github.com/omni-network/omni/lib/errors" + "github.com/omni-network/omni/lib/log" +) + +var portalAdminABI = mustGetABI(bindings.PortalAdminMetaData) + +type PortalAdminConfig struct { + // Chain is the name of the chain on which to run the command (use "all" for all chains) + Chain string +} + +func DefaultPortalAdminConfig() PortalAdminConfig { + return PortalAdminConfig{Chain: ""} +} + +func (cfg PortalAdminConfig) Validate() error { + if cfg.Chain == "" { + return errors.New("chain must be set") + } + + return nil +} + +// PausePortal pauses the portal contracts on a network. Only single chain is supported. +func PausePortal(ctx context.Context, def Definition, cfg PortalAdminConfig) error { + if err := cfg.Validate(); err != nil { + return errors.Wrap(err, "invalid config") + } + + s, err := setup(def) + if err != nil { + return err + } + + return forChains(ctx, maybeAll(s.network, cfg.Chain), s, pausePortal) +} + +// UnpausePortal unpauses the portal contracts on a network. Only single chain is supported. +func UnpausePortal(ctx context.Context, def Definition, cfg PortalAdminConfig) error { + if err := cfg.Validate(); err != nil { + return errors.Wrap(err, "invalid config") + } + + s, err := setup(def) + if err != nil { + return err + } + + return forChains(ctx, maybeAll(s.network, cfg.Chain), s, unpausePortal) +} + +// UpgradePortal upgrades the portal contracts on a network. Only single chain is supported. +func UpgradePortal(ctx context.Context, def Definition, cfg PortalAdminConfig) error { + if err := cfg.Validate(); err != nil { + return errors.Wrap(err, "invalid config") + } + + s, err := setup(def) + if err != nil { + return err + } + + return forChains(ctx, maybeAll(s.network, cfg.Chain), s, upgradePortal) +} + +func pausePortal(ctx context.Context, s shared, c chain) error { + calldata, err := portalAdminABI.Pack("pause", s.admin, c.PortalAddress) + if err != nil { + return errors.Wrap(err, "pack calldata") + } + + out, err := runForge(ctx, scriptPortalAdmin, c.rpc, calldata, s.admin) + if err != nil { + return errors.Wrap(err, "run forge", "out", out) + } + + log.Info(ctx, "Paused portal", "chain", c.Name, "address", c.PortalAddress.Hex(), "out", out) + + return nil +} + +func unpausePortal(ctx context.Context, s shared, c chain) error { + calldata, err := portalAdminABI.Pack("unpause", s.admin, c.PortalAddress) + if err != nil { + return errors.Wrap(err, "pack calldata") + } + + out, err := runForge(ctx, scriptPortalAdmin, c.rpc, calldata, s.admin) + if err != nil { + return errors.Wrap(err, "run forge", "out", out) + } + + log.Info(ctx, "Unpaused portal", "chain", c.Name, "address", c.PortalAddress.Hex(), "out", out) + + return nil +} + +func upgradePortal(ctx context.Context, s shared, c chain) error { + // TODO: thie is the calldata to execute on the portal contract post upgrade + // this is empty for now, but should be replaced with calldata if portal re-initialization is required + initCalldata := []byte{} + + calldata, err := portalAdminABI.Pack("upgrade", s.admin, s.deployer, c.PortalAddress, initCalldata) + if err != nil { + return errors.Wrap(err, "pack calldata") + } + + out, err := runForge(ctx, scriptPortalAdmin, c.rpc, calldata, s.admin, s.deployer) + if err != nil { + return errors.Wrap(err, "run forge", "out", out) + } + + log.Info(ctx, "Upgraded portal", "chain", c.Name, "address", c.PortalAddress.Hex(), "out", out) + + return nil +} diff --git a/e2e/app/admin_staking.go b/e2e/app/admin_staking.go new file mode 100644 index 000000000..f91d2693e --- /dev/null +++ b/e2e/app/admin_staking.go @@ -0,0 +1,165 @@ +package app + +import ( + "context" + + "github.com/omni-network/omni/contracts/bindings" + "github.com/omni-network/omni/halo/genutil/evm/predeploys" + "github.com/omni-network/omni/lib/contracts/staking" + "github.com/omni-network/omni/lib/errors" + "github.com/omni-network/omni/lib/log" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" +) + +var stakingAdminABI = mustGetABI(bindings.StakingAdminMetaData) + +// UpgradeStaking upgrades the staking predeploy. +func UpgradeStaking(ctx context.Context, def Definition) error { + s, err := setup(def) + if err != nil { + return err + } + + c, err := setupChain(ctx, s, chainOmniEVM) + if err != nil { + return err + } + + return upgradeStaking(ctx, s, c) +} + +// ConfigureStaking ensures on chain Staking config matches config in lib/config/staking. +func ConfigureStaking(ctx context.Context, def Definition) error { + s, err := setup(def) + if err != nil { + return err + } + + c, err := setupChain(ctx, s, chainOmniEVM) + if err != nil { + return err + } + + return configureStaking(ctx, s, c) +} + +func upgradeStaking(ctx context.Context, s shared, c chain) error { + calldata, err := stakingAdminABI.Pack("upgrade", s.admin, s.deployer) + if err != nil { + return errors.Wrap(err, "pack calldata") + } + + out, err := runForge(ctx, scriptStakingAdmin, c.rpc, calldata, s.admin, s.deployer) + if err != nil { + return errors.Wrap(err, "run forge", "out", out) + } + + log.Info(ctx, "Staking predeploy upgraded", "out", out) + + return nil +} + +func configureStaking(ctx context.Context, s shared, c chain) error { + client, err := ethclient.Dial(c.rpc) + if err != nil { + return errors.Wrap(err, "dial rpc") + } + + contract, err := bindings.NewStaking(common.HexToAddress(predeploys.Staking), client) + if err != nil { + return errors.Wrap(err, "new staking contract") + } + + cfg, ok := staking.ConfigByNetwork(s.network.ID) + if !ok { + log.Info(ctx, "No static staking config, skipping", "network", s.network.ID) + return nil + } + + // + // Check isAllowlistEnabled + // + + isAllowlistEnabled, err := contract.IsAllowlistEnabled(&bind.CallOpts{Context: ctx}) + if err != nil { + return errors.Wrap(err, "is allowlist enabled") + } + + if isAllowlistEnabled != cfg.AllowlistEnabled { + log.Info(ctx, "Updating allowlist enabled", "from", isAllowlistEnabled, "to", cfg.AllowlistEnabled) + + err := setAllowlistEnabled(ctx, s, c, cfg.AllowlistEnabled) + if err != nil { + return errors.Wrap(err, "set allowlist enabled") + } + } + + // + // Check allowlist + // + + allowlist, err := contract.Allowlist(&bind.CallOpts{Context: ctx}) + if err != nil { + return errors.Wrap(err, "allowlist") + } + + if !cmp(allowlist, cfg.Allowlist) { + log.Info(ctx, "Updating allowlist", "from", allowlist, "to", cfg.Allowlist) + + err := setAllowlist(ctx, s, c, cfg.Allowlist) + if err != nil { + return errors.Wrap(err, "set allowlist") + } + } + + return nil +} + +func setAllowlistEnabled(ctx context.Context, s shared, c chain, enabled bool) error { + calldata, err := stakingAdminABI.Pack("setAllowlistEnabled", s.admin, enabled) + if err != nil { + return errors.Wrap(err, "pack calldata") + } + + out, err := runForge(ctx, scriptStakingAdmin, c.rpc, calldata, s.admin, s.deployer) + if err != nil { + return errors.Wrap(err, "run forge", "out", out) + } + + log.Info(ctx, "Staking isAllowlistEnabled set", "enabled", enabled, "out", out) + + return nil +} + +func setAllowlist(ctx context.Context, s shared, c chain, allowlist []common.Address) error { + calldata, err := stakingAdminABI.Pack("setAllowlist", s.admin, allowlist) + if err != nil { + return errors.Wrap(err, "pack calldata") + } + + out, err := runForge(ctx, scriptStakingAdmin, c.rpc, calldata, s.admin, s.deployer) + if err != nil { + return errors.Wrap(err, "run forge", "out", out) + } + + log.Info(ctx, "Staking allowlist set", "allowlist", allowlist, "out", out) + + return nil +} + +func cmp[T comparable](a, b []T) bool { + if len(a) != len(b) { + return false + } + + for i := range a { + if a[i] != b[i] { + return false + } + } + + return true +} diff --git a/e2e/app/admin_testutil.go b/e2e/app/admin_testutil.go new file mode 100644 index 000000000..2628978b8 --- /dev/null +++ b/e2e/app/admin_testutil.go @@ -0,0 +1,114 @@ +package app + +import ( + "context" + "math/rand" + + "github.com/omni-network/omni/contracts/bindings" + "github.com/omni-network/omni/lib/errors" + "github.com/omni-network/omni/lib/netconf" +) + +func TestAdminCommands(ctx context.Context, def Definition) error { + if !def.Testnet.Network.IsEphemeral() { + return errors.New("only ephemeral networks") + } + + network := networkFromDef(def) + + // pause portal on one chain + chain := randChain(network) + if err := PausePortal(ctx, def, PortalAdminConfig{Chain: chain.Name}); err != nil { + return errors.Wrap(err, "pause portal", "chain", chain.Name) + } + + // check if portal is paused + if err := checkPortalPaused(def, chain, true); err != nil { + return errors.Wrap(err, "check paused") + } + + // unpause portal on one chain + if err := UnpausePortal(ctx, def, PortalAdminConfig{Chain: chain.Name}); err != nil { + return errors.Wrap(err, "unpause portal", "chain", chain.Name) + } + + // check if portal is unpaused + if err := checkPortalPaused(def, chain, false); err != nil { + return errors.Wrap(err, "check paused") + } + + // upgrade portal + if err := UpgradePortal(ctx, def, PortalAdminConfig{Chain: chain.Name}); err != nil { + return errors.Wrap(err, "upgrade portal", "chain", chain.Name) + } + + // pause all portals + if err := PausePortal(ctx, def, PortalAdminConfig{Chain: chainAll}); err != nil { + return errors.Wrap(err, "pause all portals") + } + + // check if all portals are paused + for _, chain := range network.EVMChains() { + if err := checkPortalPaused(def, chain, true); err != nil { + return errors.Wrap(err, "check paused") + } + } + + // unpause all portals + if err := UnpausePortal(ctx, def, PortalAdminConfig{Chain: chainAll}); err != nil { + return errors.Wrap(err, "unpause all portals") + } + + // check if all portals are unpaused + for _, chain := range network.EVMChains() { + if err := checkPortalPaused(def, chain, false); err != nil { + return errors.Wrap(err, "check paused") + } + } + + // upgrade all portals + if err := UpgradePortal(ctx, def, PortalAdminConfig{Chain: chainAll}); err != nil { + return errors.Wrap(err, "upgrade all portals") + } + + // upgrade staking + if err := UpgradeStaking(ctx, def); err != nil { + return errors.Wrap(err, "upgrade staking") + } + + // configure staking + if err := ConfigureStaking(ctx, def); err != nil { + return errors.Wrap(err, "configure staking") + } + + return nil +} + +// randChain returns a random evm chain from the given network. +func randChain(network netconf.Network) netconf.Chain { + chains := network.EVMChains() + return chains[rand.Intn(len(chains))] +} + +func checkPortalPaused(def Definition, chain netconf.Chain, expected bool) error { + backend, err := def.Backends().Backend(chain.ID) + if err != nil { + return errors.Wrap(err, "get backend") + } + + portal, err := bindings.NewOmniPortal(chain.PortalAddress, backend) + if err != nil { + return errors.Wrap(err, "new portal") + } + + paused, err := portal.IsPaused1(nil) + if err != nil { + return errors.Wrap(err, "get paused") + } + + if paused != expected { + return errors.New("check paused", "chain", chain.Name, "paused", paused, "expected", expected) + } + + return nil +} diff --git a/e2e/app/portalregistry.go b/e2e/app/portalregistry.go index 3be690853..45128235a 100644 --- a/e2e/app/portalregistry.go +++ b/e2e/app/portalregistry.go @@ -272,7 +272,7 @@ func allowStagingValidators(ctx context.Context, def Definition) error { addrs = append(addrs, addr) } - tx, err := contract.AllowValidators(txOpts, addrs) + tx, err := contract.SetAllowlist(txOpts, addrs) if err != nil { return errors.Wrap(err, "allow validators") } diff --git a/e2e/cmd/admin.go b/e2e/cmd/admin.go index 657d690bb..f106e7477 100644 --- a/e2e/cmd/admin.go +++ b/e2e/cmd/admin.go @@ -2,7 +2,6 @@ package cmd import ( "github.com/omni-network/omni/e2e/app" - "github.com/omni-network/omni/e2e/app/admin" "github.com/spf13/cobra" ) @@ -14,58 +13,114 @@ func newAdminCmd(def *app.Definition) *cobra.Command { } cmd.AddCommand( - newPausePortalCmd(def), - newUnpausePortalCmd(def), - newUpgradePortalCmd(def), + newPortalCmd(def), + newStakingCmd(def), + newAdminTestCmd(def), ) return cmd } -func newPausePortalCmd(def *app.Definition) *cobra.Command { - cfg := admin.DefaultPortalAdminConfig() +func newPortalCmd(def *app.Definition) *cobra.Command { + cmd := &cobra.Command{ + Use: "portal", + Short: "OmniPortal.sol admin commands", + } + + cfg := app.DefaultPortalAdminConfig() + bindPortalAdminFlags(cmd.PersistentFlags(), &cfg) + + cmd.AddCommand( + newPortalPauseCmd(def, &cfg), + newPortalUnpauseCmd(def, &cfg), + newPortalUpgradeCmd(def, &cfg), + ) + return cmd +} + +func newPortalPauseCmd(def *app.Definition, cfg *app.PortalAdminConfig) *cobra.Command { cmd := &cobra.Command{ - Use: "pause-portal", + Use: "pause", Short: "Pause a portal contract", RunE: func(cmd *cobra.Command, _ []string) error { - return admin.PausePortal(cmd.Context(), *def, cfg) + return app.PausePortal(cmd.Context(), *def, *cfg) }, } - bindPortalAdminFlags(cmd.Flags(), &cfg) - return cmd } -func newUnpausePortalCmd(def *app.Definition) *cobra.Command { - cfg := admin.DefaultPortalAdminConfig() - +func newPortalUnpauseCmd(def *app.Definition, cfg *app.PortalAdminConfig) *cobra.Command { cmd := &cobra.Command{ - Use: "unpause-portal", + Use: "unpause", Short: "Unpause a portal contract", RunE: func(cmd *cobra.Command, _ []string) error { - return admin.UnpausePortal(cmd.Context(), *def, cfg) + return app.UnpausePortal(cmd.Context(), *def, *cfg) }, } - bindPortalAdminFlags(cmd.Flags(), &cfg) + return cmd +} + +func newPortalUpgradeCmd(def *app.Definition, cfg *app.PortalAdminConfig) *cobra.Command { + cmd := &cobra.Command{ + Use: "upgrade", + Short: "Upgrade a portal contract", + RunE: func(cmd *cobra.Command, _ []string) error { + return app.UpgradePortal(cmd.Context(), *def, *cfg) + }, + } return cmd } -func newUpgradePortalCmd(def *app.Definition) *cobra.Command { - cfg := admin.DefaultPortalAdminConfig() +func newStakingCmd(def *app.Definition) *cobra.Command { + cmd := &cobra.Command{ + Use: "staking", + Short: "Staking.sol admin commands", + } + cmd.AddCommand( + newStakingUpgradeCmd(def), + newStakingConfigureCmd(def), + ) + + return cmd +} + +func newStakingUpgradeCmd(def *app.Definition) *cobra.Command { cmd := &cobra.Command{ - Use: "upgrade-portal", - Short: "Upgrade a portal contract", + Use: "upgrade", + Short: "Upgrade a staking contract", RunE: func(cmd *cobra.Command, _ []string) error { - return admin.UpgradePortal(cmd.Context(), *def, cfg) + return app.UpgradeStaking(cmd.Context(), *def) }, } - bindPortalAdminFlags(cmd.Flags(), &cfg) + return cmd +} + +func newStakingConfigureCmd(def *app.Definition) *cobra.Command { + cmd := &cobra.Command{ + Use: "configure", + Short: "Update on-chain Staking config, if it differs from config defined in lib/contracts/staking", + RunE: func(cmd *cobra.Command, _ []string) error { + return app.ConfigureStaking(cmd.Context(), *def) + }, + } + + return cmd +} + +func newAdminTestCmd(def *app.Definition) *cobra.Command { + cmd := &cobra.Command{ + Use: "test", + Short: "Test all admin commands", + RunE: func(cmd *cobra.Command, _ []string) error { + return app.TestAdminCommands(cmd.Context(), *def) + }, + } return cmd } diff --git a/e2e/cmd/flags.go b/e2e/cmd/flags.go index f19850b01..953d2d3ab 100644 --- a/e2e/cmd/flags.go +++ b/e2e/cmd/flags.go @@ -3,7 +3,6 @@ package cmd import ( "github.com/omni-network/omni/e2e/app" - "github.com/omni-network/omni/e2e/app/admin" "github.com/omni-network/omni/e2e/app/agent" "github.com/omni-network/omni/e2e/app/key" "github.com/omni-network/omni/e2e/types" @@ -56,7 +55,7 @@ func bindKeyCreateFlags(cmd *cobra.Command, cfg *key.UploadConfig) { _ = cmd.MarkFlagRequired("type") } -func bindPortalAdminFlags(flags *pflag.FlagSet, cfg *admin.PortalAdminConfig) { +func bindPortalAdminFlags(flags *pflag.FlagSet, cfg *app.PortalAdminConfig) { flags.StringVar(&cfg.Chain, "chain", cfg.Chain, "Run admin command on a specific chain (\"--chain=all\" for all chains)") } diff --git a/halo/genutil/evm/testdata/TestMakeEVMGenesis.golden b/halo/genutil/evm/testdata/TestMakeEVMGenesis.golden index 6eaacd4b8..7d7a721f8 100644 --- a/halo/genutil/evm/testdata/TestMakeEVMGenesis.golden +++ b/halo/genutil/evm/testdata/TestMakeEVMGenesis.golden @@ -11646,7 +11646,7 @@ "balance": "0x0" }, "333333fffffffffffffffffffffffffffffffffe": { - "code": "0x6080604052600436106100dd5760003560e01c806384768b7a1161007f578063c6a2aac811610059578063c6a2aac814610252578063cf8e629a14610267578063d146fd1b1461027c578063f2fde38b1461029657600080fd5b806384768b7a146101b85780638da5cb5b146101f8578063a5a470ad1461023f57600080fd5b8063400ada75116100bb578063400ada751461015457806359bcddde146101745780635c19a95c14610190578063715018a6146101a357600080fd5b8063117407e3146100e257806311bcd830146101045780633f0b1edf14610134575b600080fd5b3480156100ee57600080fd5b506101026100fd3660046108b2565b6102b6565b005b34801561011057600080fd5b5061012168056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561014057600080fd5b5061010261014f3660046108b2565b61032a565b34801561016057600080fd5b5061010261016f366004610943565b61039a565b34801561018057600080fd5b50610121670de0b6b3a764000081565b61010261019e36600461097f565b6104b9565b3480156101af57600080fd5b506101026105b1565b3480156101c457600080fd5b506101e86101d336600461097f565b60016020526000908152604090205460ff1681565b604051901515815260200161012b565b34801561020457600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b03909116815260200161012b565b61010261024d3660046109a1565b6105c5565b34801561025e57600080fd5b5061010261071b565b34801561027357600080fd5b50610102610732565b34801561028857600080fd5b506000546101e89060ff1681565b3480156102a257600080fd5b506101026102b136600461097f565b610746565b6102be610784565b60005b818110156103255760018060008585858181106102e0576102e0610a01565b90506020020160208101906102f5919061097f565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016102c1565b505050565b610332610784565b60005b818110156103255760006001600085858581811061035557610355610a01565b905060200201602081019061036a919061097f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610335565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156103e05750825b905060008267ffffffffffffffff1660011480156103fd5750303b155b90508115801561040b575080155b156104295760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045357845460ff60401b1916600160401b1785555b61045c876107df565b6000805460ff191687151517905583156104b057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b670de0b6b3a76400003410156105165760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b0382161461056e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e000000604482015260640161050d565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6105b9610784565b6105c360006107f0565b565b60005460ff1615806105e657503360009081526001602052604090205460ff165b6106295760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b604482015260640161050d565b602181146106795760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e6774680000604482015260640161050d565b68056bc75e2d631000003410156106d25760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f736974000000604482015260640161050d565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161070f93929190610a17565b60405180910390a25050565b610723610784565b6000805460ff19166001179055565b61073a610784565b6000805460ff19169055565b61074e610784565b6001600160a01b03811661077857604051631e4fbdf760e01b81526000600482015260240161050d565b610781816107f0565b50565b336107b67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c35760405163118cdaa760e01b815233600482015260240161050d565b6107e7610861565b610781816108aa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c357604051631afcd79f60e31b815260040160405180910390fd5b61074e610861565b600080602083850312156108c557600080fd5b823567ffffffffffffffff808211156108dd57600080fd5b818501915085601f8301126108f157600080fd5b81358181111561090057600080fd5b8660208260051b850101111561091557600080fd5b60209290920196919550909350505050565b80356001600160a01b038116811461093e57600080fd5b919050565b6000806040838503121561095657600080fd5b61095f83610927565b91506020830135801515811461097457600080fd5b809150509250929050565b60006020828403121561099157600080fd5b61099a82610927565b9392505050565b600080602083850312156109b457600080fd5b823567ffffffffffffffff808211156109cc57600080fd5b818501915085601f8301126109e057600080fd5b8135818111156109ef57600080fd5b86602082850101111561091557600080fd5b634e487b7160e01b600052603260045260246000fd5b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212201ad1d9aad3c7d43b13774db3308d59675ed3c15f01a079646644a291ecce45c964736f6c63430008180033", + "code": "0x6080604052600436106100c25760003560e01c8063715018a61161007f578063a5a470ad11610059578063a5a470ad14610226578063d146fd1b14610239578063d7644ba214610253578063f2fde38b1461027357600080fd5b8063715018a61461018a57806384768b7a1461019f5780638da5cb5b146101df57600080fd5b806311bcd830146100c75780632b47da52146100f7578063400ada7514610119578063552b818b1461013b57806359bcddde1461015b5780635c19a95c14610177575b600080fd5b3480156100d357600080fd5b506100e468056bc75e2d6310000081565b6040519081526020015b60405180910390f35b34801561010357600080fd5b5061010c610293565b6040516100ee9190610a3d565b34801561012557600080fd5b50610139610134366004610ab6565b6102f5565b005b34801561014757600080fd5b50610139610156366004610ae9565b610414565b34801561016757600080fd5b506100e4670de0b6b3a764000081565b610139610185366004610b5e565b610531565b34801561019657600080fd5b50610139610629565b3480156101ab57600080fd5b506101cf6101ba366004610b5e565b60016020526000908152604090205460ff1681565b60405190151581526020016100ee565b3480156101eb57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016100ee565b610139610234366004610b80565b61063d565b34801561024557600080fd5b506000546101cf9060ff1681565b34801561025f57600080fd5b5061013961026e366004610be0565b610793565b34801561027f57600080fd5b5061013961028e366004610b5e565b61085c565b606060028054806020026020016040519081016040528092919081815260200182805480156102eb57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102cd575b5050505050905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff1660008115801561033b5750825b905060008267ffffffffffffffff1660011480156103585750303b155b905081158015610366575080155b156103845760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103ae57845460ff60401b1916600160401b1785555b6103b787610897565b6000805460ff1916871515179055831561040b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61041c6108a8565b60005b60025481101561047e576000600160006002848154811061044257610442610bfb565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905560010161041f565b5061048b600283836109c5565b5060005b818110156104f35760018060008585858181106104ae576104ae610bfb565b90506020020160208101906104c39190610b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161048f565b507f27f242de1bc4ed72c4329591ffff7d223b5f025e3514a07e05afec6d4eb889cf8282604051610525929190610c11565b60405180910390a15050565b670de0b6b3a764000034101561058e5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f73697400000060448201526064015b60405180910390fd5b336001600160a01b038216146105e65760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a206f6e6c792073656c662064656c65676174696f6e0000006044820152606401610585565b6040513481526001600160a01b0382169033907f510b11bb3f3c799b11307c01ab7db0d335683ef5b2da98f7697de744f465eacc9060200160405180910390a350565b6106316108a8565b61063b6000610903565b565b60005460ff16158061065e57503360009081526001602052604090205460ff165b6106a15760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce881b9bdd08185b1b1bddd95960621b6044820152606401610585565b602181146106f15760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e673a20696e76616c6964207075626b6579206c656e67746800006044820152606401610585565b68056bc75e2d6310000034101561074a5760405162461bcd60e51b815260206004820152601d60248201527f5374616b696e673a20696e73756666696369656e74206465706f7369740000006044820152606401610585565b336001600160a01b03167fc7abef7b73f049da6a9bc2349ba5066a39e316eabc9f671b6f9406aa9490a45383833460405161078793929190610c5d565b60405180910390a25050565b61079b6108a8565b60005481151560ff9091161515036107ec5760405162461bcd60e51b815260206004820152601460248201527314dd185ada5b99ce88185b1c9958591e481cd95d60621b6044820152606401610585565b6000805460ff1916821580159190911790915561082f576040517f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec390600090a150565b6040517f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0790600090a15b50565b6108646108a8565b6001600160a01b03811661088e57604051631e4fbdf760e01b815260006004820152602401610585565b61085981610903565b61089f610974565b610859816109bd565b336108da7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461063b5760405163118cdaa760e01b8152336004820152602401610585565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661063b57604051631afcd79f60e31b815260040160405180910390fd5b610864610974565b828054828255906000526020600020908101928215610a18579160200282015b82811115610a185781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906109e5565b50610a24929150610a28565b5090565b5b80821115610a245760008155600101610a29565b6020808252825182820181905260009190848201906040850190845b81811015610a7e5783516001600160a01b031683529284019291840191600101610a59565b50909695505050505050565b80356001600160a01b0381168114610aa157600080fd5b919050565b80358015158114610aa157600080fd5b60008060408385031215610ac957600080fd5b610ad283610a8a565b9150610ae060208401610aa6565b90509250929050565b60008060208385031215610afc57600080fd5b823567ffffffffffffffff80821115610b1457600080fd5b818501915085601f830112610b2857600080fd5b813581811115610b3757600080fd5b8660208260051b8501011115610b4c57600080fd5b60209290920196919550909350505050565b600060208284031215610b7057600080fd5b610b7982610a8a565b9392505050565b60008060208385031215610b9357600080fd5b823567ffffffffffffffff80821115610bab57600080fd5b818501915085601f830112610bbf57600080fd5b813581811115610bce57600080fd5b866020828501011115610b4c57600080fd5b600060208284031215610bf257600080fd5b610b7982610aa6565b634e487b7160e01b600052603260045260246000fd5b60208082528181018390526000908460408401835b86811015610c52576001600160a01b03610c3f84610a8a565b1682529183019190830190600101610c26565b509695505050505050565b604081528260408201528284606083013760006060848301015260006060601f19601f860116830101905082602083015294935050505056fea26469706673582212209626a613dbfb7e12830784942389803c43dd0de89220444072e10a535d8573cc64736f6c63430008180033", "storage": { "0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00": "0x000000000000000000000000000000000000000000000000ffffffffffffffff" }, diff --git a/lib/contracts/staking/config.go b/lib/contracts/staking/config.go new file mode 100644 index 000000000..5d840b655 --- /dev/null +++ b/lib/contracts/staking/config.go @@ -0,0 +1,24 @@ +package staking + +import ( + "github.com/omni-network/omni/lib/netconf" + + "github.com/ethereum/go-ethereum/common" +) + +type Config struct { + Allowlist []common.Address + AllowlistEnabled bool +} + +var statics = map[netconf.ID]Config{ + netconf.Omega: { + Allowlist: []common.Address{}, + AllowlistEnabled: true, + }, +} + +func ConfigByNetwork(id netconf.ID) (Config, bool) { + cfg, ok := statics[id] + return cfg, ok +}