0x60808060405234610016576125de908161001b8239f35b5f80fdfe6080604052600480361015610020575b50361561001e5761001e611958565b005b5f3560e01c908163218717a21461006757508063997670c7146100625780639ad838231461005d5763f469901314610058575f61000f565b610e8c565b6109a5565b61065e565b34610305576100753661051b565b5f915f935f927f0902f1ac0000000000000000000000000000000000000000000000000000000060805260606080888173ffffffffffffffffffffffffffffffffffffffff87165afa80156104c6575f925f916104cb575b604051907f0dfe16810000000000000000000000000000000000000000000000000000000082526020828b8173ffffffffffffffffffffffffffffffffffffffff8a165afa9182156104c6575f9261047d575b5073ffffffffffffffffffffffffffffffffffffffff918216911603610311575060646dffffffffffffffffffffffffffff61015d9316046114c7565b8015610309575b6040516101cd816101a1856020830160405f9193929373ffffffffffffffffffffffffffffffffffffffff60608201958483521660208201520152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261132a565b73ffffffffffffffffffffffffffffffffffffffff83163b156103055761023d92875f73ffffffffffffffffffffffffffffffffffffffff8195604051978896879586937f022c0d9f00000000000000000000000000000000000000000000000000000000855230918501611596565b0393165af190816102ec575b506102e057505050610259611556565b906020820151604083015190606084015190600181115f146102af575050506102ab6040519283927f08c379a00000000000000000000000000000000000000000000000000000000084528301611585565b0390fd5b6102dc929450600191935014915b6040519384938460409194939260608201951515825260208201520152565b0390f35b6102dc919293506102bd565b806102f96102ff926112fa565b806114da565b85610249565b5f80fd5b506001610164565b61032f92506dffffffffffffffffffffffffffff60649116046114c7565b8015610475575b604080515f602082015273ffffffffffffffffffffffffffffffffffffffff8416918101919091526001606082015261037281608081016101a1565b73ffffffffffffffffffffffffffffffffffffffff83163b15610305576103e292875f73ffffffffffffffffffffffffffffffffffffffff8195604051978896879586937f022c0d9f000000000000000000000000000000000000000000000000000000008552309185016114e4565b0393165af19081610462575b506102e0575050506103fe611556565b906020820151604083015190606084015190600181115f14610450575050506102ab6040519283927f08c379a00000000000000000000000000000000000000000000000000000000084528301611585565b6102dc929450600191935014916102bd565b806102f961046f926112fa565b856103ee565b506001610336565b73ffffffffffffffffffffffffffffffffffffffff9192506104b7829160203d6020116104bf575b6104af818361132a565b81019061142f565b929150610120565b503d6104a5565b611424565b92505060603d6060116104f6575b806104e66104ee926112b3565b608001611386565b5090926100cd565b503d6104d9565b73ffffffffffffffffffffffffffffffffffffffff81160361030557565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606091011261030557600435610551816104fd565b9060243561055e816104fd565b9060443590565b5f5b8381106105765750505f910152565b8181015183820152602001610567565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936105c281518092818752878088019101610565565b0116010190565b9060608201905f90835b6002831061064557505050606060408301529060a0810192915f5b600281106105fd575050505090565b90919293610635817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086600194030185528651610586565b94602090810194930191016105ee565b60019082511515815260208091019201920191906105d3565b34610305576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030557600490813561069c816104fd565b602435916106a86115ce565b926106b16115e2565b9473ffffffffffffffffffffffffffffffffffffffff84169383517f0902f1ac0000000000000000000000000000000000000000000000000000000081526060818481895afa80156104c6575f915f91610973575b5061072c610725866dffffffffffffffffffffffffffff8094166114c7565b6064900490565b91821561096a575b86519260209684610771878a8301604060019193929373ffffffffffffffffffffffffffffffffffffffff60608201958483521660208201520152565b03936107a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09586810188528761132a565b8a3b15610305578a8a518080957f022c0d9f00000000000000000000000000000000000000000000000000000000998a8352308d8401926107e3936114e4565b03815a5f948591f193846107259461083e96610957575b50610952578d8d610809611556565b61081961081582611bd5565b1590565b1561093c575f61083592526024808d8301518301019101611648565b90525b166114c7565b928315610933575b8651600187820181815273ffffffffffffffffffffffffffffffffffffffff90931660208401526040830152916108889183906060010390810183528261132a565b863b15610305576102dc966108af935f8094895196879586948593845230908b8501611596565b03925af19081610920575b50610919576108c7611556565b6108d361081582611bd5565b15610900576024806108f1935f868a01528301518301019101611648565b908501525b51928392836105c9565b505060018482015261091061160f565b908501526108f6565b50506108f6565b806102f961092d926112fa565b5f6108ba565b60019350610846565b5060019052508d61094b61160f565b9052610838565b610838565b806102f9610964926112fa565b5f6107fa565b60019250610734565b9050610997915060603d60601161099e575b61098f818361132a565b8101906113ee565b505f610706565b503d610985565b34610305576109b33661051b565b905f805f73ffffffffffffffffffffffffffffffffffffffff808516956040958651977f0dfe168100000000000000000000000000000000000000000000000000000000808a5260209a60049a8c818d81875afa9182156104c65787918e5f94610e69575b505081169116145f14610c925788519081528a818b81855afa9485156104c657610a98958b85928e945f93610c73575b508c518099819582947f70a08231000000000000000000000000000000000000000000000000000000008452830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0392165afa80156104c657610abf8994610ac692610b70978e5f92610c46575b50506116b6565b6064900590565b8015610c3e575b83515f818d0181815273ffffffffffffffffffffffffffffffffffffffff9095166020860152604085015292610b399190610b349085906060015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810186528561132a565b6116f4565b5f8a8551968795869485937f128acb080000000000000000000000000000000000000000000000000000000085523090850161177a565b03925af19081610c12575b50610c0457505050610b8b611556565b9283015181840151606085015190916001811115610bd8575050506102ab90519283927f08c379a00000000000000000000000000000000000000000000000000000000084528301611585565b6001919295506102dc93945014925b519384938460409194939260608201951515825260208201520152565b91945092506102dc91610be7565b610c3190863d8811610c37575b610c29818361132a565b810190611720565b50610b7b565b503d610c1f565b506001610acd565b610c659250803d10610c6c575b610c5d818361132a565b8101906116a7565b5f8e610ab8565b503d610c53565b610c8b919350853d87116104bf576104af818361132a565b915f610a48565b5087517fd21220a70000000000000000000000000000000000000000000000000000000081528a818b81855afa9485156104c657610d25958b85928e945f93610c7357508c518099819582947f70a08231000000000000000000000000000000000000000000000000000000008452830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0392165afa80156104c657610abf8994610d4b92610dca978e5f92610c465750506116b6565b8015610e61575b610d9390610b348c610b0887519687928301604060019193929373ffffffffffffffffffffffffffffffffffffffff60608201955f83521660208201520152565b5f8a8551968795869485937f128acb0800000000000000000000000000000000000000000000000000000000855230908501611736565b03925af19081610e45575b50610c0457505050610de5611556565b9283015181840151606085015190916001811115610e32575050506102ab90519283927f08c379a00000000000000000000000000000000000000000000000000000000084528301611585565b6001919295506102dc9394501492610be7565b610e5b90863d8811610c3757610c29818361132a565b50610dd5565b506001610d52565b839294509081610e8492903d106104bf576104af818361132a565b92908e610a18565b34610305576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261030557600490813590610ecb826104fd565b60243590610ed76115ce565b92610ee06115e2565b9473ffffffffffffffffffffffffffffffffffffffff91828116928451917fd21220a700000000000000000000000000000000000000000000000000000000835260209485848681845afa9384156104c6575f94611267575b50865186817f70a082310000000000000000000000000000000000000000000000000000000096878252818781610f8f898d830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0392165afa80156104c65789610abf91610fb0935f9161124a575b506116b6565b938415611241575b8751906110618961102b84610ff9888d8301604060019193929373ffffffffffffffffffffffffffffffffffffffff60608201958483521660208201520152565b0398610b347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09a8b810188528761132a565b938151809381927f128acb0800000000000000000000000000000000000000000000000000000000978884528d30908501611736565b03815f885af19081611225575b506112205761107b611556565b61108761081582611d1b565b1561120c576110a4905f8d526024808a8301518301019101611648565b8c525b8851907f0dfe168100000000000000000000000000000000000000000000000000000000825288828981875afa80156104c65789925f916111ef575b508a5180978193825281611116898d830191909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0392165afa9384156104c6576111916111a696611145610abf6102dc9d8d995f968e8892610c465750506116b6565b9081156111e6575b87516001818d0190815273ffffffffffffffffffffffffffffffffffffffff90981660208901525f604089015296610b34919088906060010390810188528761132a565b918551968795869485938452308b850161177a565b03925af190816111ca575b50610919576111be611556565b6108d361081582611d1b565b6111e090853d8711610c3757610c29818361132a565b506111b1565b6001915061114d565b6112069150833d85116104bf576104af818361132a565b5f6110e3565b5060018b5261121961160f565b8c526110a7565b6110a7565b61123b908b3d8d11610c3757610c29818361132a565b5061106e565b60019450610fb8565b61126191508a3d8c11610c6c57610c5d818361132a565b5f610faa565b61127f919450863d88116104bf576104af818361132a565b925f610f39565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09101166080016080811067ffffffffffffffff8211176112f557604052565b611286565b67ffffffffffffffff81116112f557604052565b6040810190811067ffffffffffffffff8211176112f557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176112f557604052565b51906dffffffffffffffffffffffffffff8216820361030557565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80606091011261030557608051906dffffffffffffffffffffffffffff918281168103610305579160a0519081168103610305579060c05163ffffffff811681036103055790565b90816060910312610305576114028161136b565b9160406114116020840161136b565b92015163ffffffff811681036103055790565b6040513d5f823e3d90fd5b908160209103126103055751611444816104fd565b90565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b811561147e570490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b90612710918281029281840414901517156114c257565b611447565b818102929181159184041417156114c257565b5f91031261030557565b73ffffffffffffffffffffffffffffffffffffffff61144494936080935f845260208401521660408201528160608201520190610586565b67ffffffffffffffff81116112f557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b3d15611580573d906115678261151c565b91611575604051938461132a565b82523d5f602084013e565b606090565b906020611444928181520190610586565b73ffffffffffffffffffffffffffffffffffffffff611444949360809383525f60208401521660408201528160608201520190610586565b604051906115db8261130e565b6040368337565b604090604051916115f28361130e565b825f5b82811061160157505050565b6060828201526020016115f5565b6040519061161c8261130e565b600282527f4f4b0000000000000000000000000000000000000000000000000000000000006020830152565b6020818303126103055780519067ffffffffffffffff8211610305570181601f8201121561030557805161167b8161151c565b92611689604051948561132a565b81845260208284010111610305576114449160208085019101610565565b90816020910312610305575190565b81810292915f82127f80000000000000000000000000000000000000000000000000000000000000008214166114c25781840514901517156114c257565b7f800000000000000000000000000000000000000000000000000000000000000081146114c2575f0390565b9190826040910312610305576020825192015190565b611444939273ffffffffffffffffffffffffffffffffffffffff60a0931682526001602083015260408201526401000276a460608201528160808201520190610586565b611444939273ffffffffffffffffffffffffffffffffffffffff60a0931682525f6020830152604082015273fffd8963efd1fc6a506488495d951d5263988d2560608201528160808201520190610586565b91909182600411610305578211610305577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6004920190565b81601f820112156103055780359061181c8261151c565b9261182a604051948561132a565b8284526020838301011161030557815f926020809301838601378301015290565b9160608383031261030557823592602081013592604082013567ffffffffffffffff8111610305576114449201611805565b5190811515820361030557565b9081606091031261030557805191611444604060208401516118ab816104fd565b930161187d565b906080828203126103055781356118c8816104fd565b92602083013592604081013592606082013567ffffffffffffffff8111610305576114449201611805565b156118fa57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f66616c6c6261636b2073656e646572206368616e6765000000000000000000006044820152fd5b73ffffffffffffffffffffffffffffffffffffffff90600435821630148015611a4b576119ab919261199561198d36366117cc565b8101906118b2565b909692506020808297939751830101910161188a565b9493169290806119d65760606119c3888888886122c5565b9060405192835260208301526040820152fd5b91955093506001919250146119e9575050565b6119f56119fa926118f3565b611f8b565b611a0e610815611a0861160f565b83611e27565b611a155750565b6102ab906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301611585565b50611a7990611a65611a5d36366117cc565b81019061184b565b60208082979496939751830101910161188a565b939216919080611a915760606119c387878787611e99565b91935093506001915014611aa3575b50565b611aac90611f8b565b611aba610815611a0861160f565b15611aa0576102ab906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301611585565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116114c257565b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe82019182116114c257565b906127109182039182116114c257565b919082039182116114c257565b80156114c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b908151811015611ba8570160200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b905f91805160028111611be6575050565b611bf39093919293611af5565b600180821115611d14577fff000000000000000000000000000000000000000000000000000000000000007f4b0000000000000000000000000000000000000000000000000000000000000081611c4a8588611b97565b5116149081611cdb575b81611c75575b50611c6e5750611c6990611b6c565b611bf3565b9250505090565b7f3a000000000000000000000000000000000000000000000000000000000000009150611cd3611cad611ca786611b22565b88611b97565b517fff000000000000000000000000000000000000000000000000000000000000001690565b16145f611c5a565b90507f200000000000000000000000000000000000000000000000000000000000000081611d0b611ca786611af5565b51161490611c54565b5050919050565b905f91805160028111611d2c575050565b611d399093919293611af5565b600180821115611d14577fff000000000000000000000000000000000000000000000000000000000000007f410000000000000000000000000000000000000000000000000000000000000081611d908588611b97565b5116149081611dee575b81611db4575b50611c6e5750611daf90611b6c565b611d39565b7f49000000000000000000000000000000000000000000000000000000000000009150611de6611cad611ca786611b22565b16145f611da0565b90507f490000000000000000000000000000000000000000000000000000000000000081611e1e611ca786611af5565b51161490611d9a565b908151815103611e93575f5b8251811015611e8b577fff0000000000000000000000000000000000000000000000000000000000000080611e688386611b97565b511690611e758385611b97565b511603611e8457600101611e33565b5050505f90565b505050600190565b50505f90565b9190611eb79391815f14611ebc57611eb190926116f4565b926122c5565b909192565b611ec5906116f4565b91926122c5565b60405190611ed98261130e565b601b82527f7061697220737761702063616c6c6261636b2061626e6f726d616c00000000006020830152565b90816020910312610305576114449061187d565b60405190611f268261130e565b601482527f746f6b656e30207472616e73666572206661696c0000000000000000000000006020830152565b60405190611f5f8261130e565b601482527f746f6b656e31207472616e73666572206661696c0000000000000000000000006020830152565b604080517f0dfe168100000000000000000000000000000000000000000000000000000000815260209273ffffffffffffffffffffffffffffffffffffffff818116928581600481875afa80156104c6578287916004935f916122a8575b5016948651928380927fd21220a70000000000000000000000000000000000000000000000000000000082525afa9081156104c6575f9161228b575b5084517f70a0823100000000000000000000000000000000000000000000000000000000808252306004830152949190921692918681602481855afa9081156104c6575f9161226e575b5085519485523060048601528685602481875afa9485156104c6575f9561224f575b5080158080612247575b6122375715612179575b5050826120ba575b505050505061144461160f565b92517fa9059cbb0000000000000000000000000000000000000000000000000000000085820190815273ffffffffffffffffffffffffffffffffffffffff909416602482015260448101929092525f928392839061211b81606481016101a1565b51925af190612128611556565b82612147575b50501561213f575f808080806120ad565b611444611f52565b8091925051918215928315612161575b5050505f8061212e565b6121719350820181019101611f05565b5f8080612157565b5f9182918288516121db816101a18d8201957fa9059cbb0000000000000000000000000000000000000000000000000000000087528a602484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b51925af16121e7611556565b81612207575b50156121fa575f806120a5565b5050505050611444611f19565b8051801592508790831561221f575b5050505f6121ed565b61222f9350820181019101611f05565b5f8681612216565b5050505050505050611444611ecc565b50851561209b565b612267919550873d8911610c6c57610c5d818361132a565b935f612091565b6122859150873d8911610c6c57610c5d818361132a565b5f61206f565b6122a29150863d88116104bf576104af818361132a565b5f612025565b6122bf9150833d85116104bf576104af818361132a565b5f611fe9565b909293919360019473ffffffffffffffffffffffffffffffffffffffff60046020828616885f1461257f57604051928380927fd21220a70000000000000000000000000000000000000000000000000000000082525afa9081156104c6575f91612560575b505b16941561255957505b6040517f70a0823100000000000000000000000000000000000000000000000000000000808252306004830152909260209283856024818a5afa9485156104c6575f9561253a575b50808510156125325761239b6123a091612396876114ab565b611474565b611b4f565b955b60405183815273ffffffffffffffffffffffffffffffffffffffff83166004820152928484602481855afa9384156104c6575f94612513575b506040517fa9059cbb0000000000000000000000000000000000000000000000000000000086820190815273ffffffffffffffffffffffffffffffffffffffff85166024830152604482018890525f9182919061243b81606481016101a1565b519082865af1612449611556565b816124e3575b50156124d25760405190815273ffffffffffffffffffffffffffffffffffffffff9290921660048301528390829060249082905afa9081156104c65761249d935f926124b5575b5050611b5f565b81811015611e93576114449161239661239b926114ab565b6124cb9250803d10610c6c57610c5d818361132a565b5f80612496565b5050505050509150505f905f905f90565b805180159250879083156124fb575b5050505f61244f565b61250b9350820181019101611f05565b5f86816124f2565b61252b919450853d8711610c6c57610c5d818361132a565b925f6123db565b505f956123a2565b612552919550843d8611610c6c57610c5d818361132a565b935f61237d565b9050612335565b612579915060203d6020116104bf576104af818361132a565b5f61232a565b604051928380927f0dfe16810000000000000000000000000000000000000000000000000000000082525afa9081156104c6575f916125bf575b5061232c565b6125d8915060203d6020116104bf576104af818361132a565b5f6125b956