608060405234801561000f575f80fd5b5073c50781a810bc1ea9c6e300bdf0427636c1116d2e6040518060400160405280601081526020017f44656c65676169746f7220546f6b656e000000000000000000000000000000008152506040518060400160405280600681526020017f44454c454741000000000000000000000000000000000000000000000000000081525081600390816100a09190610435565b5080600490816100b09190610435565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610123575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161011a9190610543565b60405180910390fd5b6101328161013860201b60201c565b5061055c565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061027657607f821691505b60208210810361028957610288610232565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826102b0565b6102f586836102b0565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61033961033461032f8461030d565b610316565b61030d565b9050919050565b5f819050919050565b6103528361031f565b61036661035e82610340565b8484546102bc565b825550505050565b5f90565b61037a61036e565b610385818484610349565b505050565b5b818110156103a85761039d5f82610372565b60018101905061038b565b5050565b601f8211156103ed576103be8161028f565b6103c7846102a1565b810160208510156103d6578190505b6103ea6103e2856102a1565b83018261038a565b50505b505050565b5f82821c905092915050565b5f61040d5f19846008026103f2565b1980831691505092915050565b5f61042583836103fe565b9150826002028217905092915050565b61043e826101fb565b67ffffffffffffffff81111561045757610456610205565b5b610461825461025f565b61046c8282856103ac565b5f60209050601f83116001811461049d575f841561048b578287015190505b610495858261041a565b8655506104fc565b601f1984166104ab8661028f565b5f5b828110156104d2578489015182556001820191506020850194506020810190506104ad565b868310156104ef57848901516104eb601f8916826103fe565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61052d82610504565b9050919050565b61053d81610523565b82525050565b5f6020820190506105565f830184610534565b92915050565b611c59806105695f395ff3fe608060405234801561000f575f80fd5b506004361061014b575f3560e01c806359355736116100c15780637c4053251161007a5780637c405325146103775780638da5cb5b1461039357806395d89b41146103b1578063a9059cbb146103cf578063dd62ed3e146103ff578063f2fde38b1461042f5761014b565b806359355736146102a55780636e27d889146102d557806370a08231146102f1578063715018a61461032157806373b2e80e1461032b57806379cc67901461035b5761014b565b8063313ce56711610113578063313ce5671461020957806332cb6b0c1461022757806340c10f1914610245578063410b1da81461026157806342966c681461027f5780634e71d92d1461029b5761014b565b806306fdde031461014f578063095ea7b31461016d57806318160ddd1461019d57806323b872dd146101bb578063270ef385146101eb575b5f80fd5b61015761044b565b6040516101649190611646565b60405180910390f35b610187600480360381019061018291906116f7565b6104db565b604051610194919061174f565b60405180910390f35b6101a56104fd565b6040516101b29190611777565b60405180910390f35b6101d560048036038101906101d09190611790565b610506565b6040516101e2919061174f565b60405180910390f35b6101f3610534565b6040516102009190611777565b60405180910390f35b610211610540565b60405161021e91906117fb565b60405180910390f35b61022f610548565b60405161023c9190611777565b60405180910390f35b61025f600480360381019061025a91906116f7565b610558565b005b6102696105e2565b6040516102769190611777565b60405180910390f35b61029960048036038101906102949190611814565b6105eb565b005b6102a361060f565b005b6102bf60048036038101906102ba919061183f565b6107dc565b6040516102cc9190611777565b60405180910390f35b6102ef60048036038101906102ea9190611814565b610822565b005b61030b6004803603810190610306919061183f565b61091c565b6040516103189190611777565b60405180910390f35b610329610961565b005b6103456004803603810190610340919061183f565b610974565b604051610352919061174f565b60405180910390f35b610375600480360381019061037091906116f7565b6109c6565b005b610391600480360381019061038c9190611814565b6109ec565b005b61039b610b1b565b6040516103a89190611879565b60405180910390f35b6103b9610b43565b6040516103c69190611646565b60405180910390f35b6103e960048036038101906103e491906116f7565b610bd3565b6040516103f6919061174f565b60405180910390f35b61041960048036038101906104149190611892565b610bf5565b6040516104269190611777565b60405180910390f35b6104496004803603810190610444919061183f565b610c77565b005b60606003805461045a906118fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610486906118fd565b80156104d15780601f106104a8576101008083540402835291602001916104d1565b820191905f5260205f20905b8154815290600101906020018083116104b457829003601f168201915b5050505050905090565b5f806104e5610cfb565b90506104f2818585610d02565b600191505092915050565b5f600254905090565b5f80610510610cfb565b905061051d858285610d14565b610528858585610da6565b60019150509392505050565b678ac7230489e8000081565b5f6012905090565b6b033b2e3c9fd0803ce800000081565b610560610e96565b6b033b2e3c9fd0803ce80000008160085461057b919061195a565b11156105bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b3906119d7565b60405180910390fd5b6105c68282610f1d565b8060085f8282546105d7919061195a565b925050819055505050565b5f600854905090565b6105f481610f9c565b8060085f82825461060591906119f5565b9250508190555050565b60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069090611a72565b60405180910390fd5b6b033b2e3c9fd0803ce8000000678ac7230489e800006008546106bc919061195a565b11156106fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f4906119d7565b60405180910390fd5b600160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061076433678ac7230489e80000610f1d565b678ac7230489e8000060085f82825461077d919061195a565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430678ac7230489e800006040516107d29190611777565b60405180910390a2565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b8061082c3361091c565b101561086d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086490611ada565b60405180910390fd5b610878333083610da6565b8060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546108c4919061195a565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fac87f20a77d28ee8bbb58ec87ea8fa968b3393efae1a368fd50b767c2847391c826040516109119190611777565b60405180910390a250565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610969610e96565b6109725f610fb0565b565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6109d08282611073565b8060085f8282546109e191906119f5565b925050819055505050565b8060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390611b42565b60405180910390fd5b8060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610ab891906119f5565b92505081905550610aca303383610da6565b3373ffffffffffffffffffffffffffffffffffffffff167fe7b379c6c1fa169e9079c25e9143b127637eef8ec8c9d5c06ddb4ab3e119588882604051610b109190611777565b60405180910390a250565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610b52906118fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7e906118fd565b8015610bc95780601f10610ba057610100808354040283529160200191610bc9565b820191905f5260205f20905b815481529060010190602001808311610bac57829003601f168201915b5050505050905090565b5f80610bdd610cfb565b9050610bea818585610da6565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610c7f610e96565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cef575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610ce69190611879565b60405180910390fd5b610cf881610fb0565b50565b5f33905090565b610d0f8383836001611093565b505050565b5f610d1f8484610bf5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610da05781811015610d91578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610d8893929190611b60565b60405180910390fd5b610d9f84848484035f611093565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e16575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610e0d9190611879565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e7d9190611879565b60405180910390fd5b610e91838383611262565b505050565b610e9e610cfb565b73ffffffffffffffffffffffffffffffffffffffff16610ebc610b1b565b73ffffffffffffffffffffffffffffffffffffffff1614610f1b57610edf610cfb565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610f129190611879565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f8d575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610f849190611879565b60405180910390fd5b610f985f8383611262565b5050565b610fad610fa7610cfb565b8261133e565b50565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6110858261107f610cfb565b83610d14565b61108f828261133e565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611103575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016110fa9190611879565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611173575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161116a9190611879565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561125c578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516112539190611777565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461132e575f61129f8461091c565b905060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205482826112eb91906119f5565b101561132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390611c05565b60405180910390fd5b505b6113398383836113bd565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113ae575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113a59190611879565b60405180910390fd5b6113b9825f83611262565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361140d578060025f828254611401919061195a565b925050819055506114db565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611496578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161148d93929190611b60565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611522578060025f828254039250508190555061156c565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115c99190611777565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611618826115d6565b61162281856115e0565b93506116328185602086016115f0565b61163b816115fe565b840191505092915050565b5f6020820190508181035f83015261165e818461160e565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6116938261166a565b9050919050565b6116a381611689565b81146116ad575f80fd5b50565b5f813590506116be8161169a565b92915050565b5f819050919050565b6116d6816116c4565b81146116e0575f80fd5b50565b5f813590506116f1816116cd565b92915050565b5f806040838503121561170d5761170c611666565b5b5f61171a858286016116b0565b925050602061172b858286016116e3565b9150509250929050565b5f8115159050919050565b61174981611735565b82525050565b5f6020820190506117625f830184611740565b92915050565b611771816116c4565b82525050565b5f60208201905061178a5f830184611768565b92915050565b5f805f606084860312156117a7576117a6611666565b5b5f6117b4868287016116b0565b93505060206117c5868287016116b0565b92505060406117d6868287016116e3565b9150509250925092565b5f60ff82169050919050565b6117f5816117e0565b82525050565b5f60208201905061180e5f8301846117ec565b92915050565b5f6020828403121561182957611828611666565b5b5f611836848285016116e3565b91505092915050565b5f6020828403121561185457611853611666565b5b5f611861848285016116b0565b91505092915050565b61187381611689565b82525050565b5f60208201905061188c5f83018461186a565b92915050565b5f80604083850312156118a8576118a7611666565b5b5f6118b5858286016116b0565b92505060206118c6858286016116b0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061191457607f821691505b602082108103611927576119266118d0565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611964826116c4565b915061196f836116c4565b92508282019050808211156119875761198661192d565b5b92915050565b7f45786365656473206d617820737570706c7900000000000000000000000000005f82015250565b5f6119c16012836115e0565b91506119cc8261198d565b602082019050919050565b5f6020820190508181035f8301526119ee816119b5565b9050919050565b5f6119ff826116c4565b9150611a0a836116c4565b9250828203905081811115611a2257611a2161192d565b5b92915050565b7f546f6b656e7320616c726561647920636c61696d6564000000000000000000005f82015250565b5f611a5c6016836115e0565b9150611a6782611a28565b602082019050919050565b5f6020820190508181035f830152611a8981611a50565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320746f206c6f636b000000000000005f82015250565b5f611ac46019836115e0565b9150611acf82611a90565b602082019050919050565b5f6020820190508181035f830152611af181611ab8565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73206c6f636b656400000000000000005f82015250565b5f611b2c6018836115e0565b9150611b3782611af8565b602082019050919050565b5f6020820190508181035f830152611b5981611b20565b9050919050565b5f606082019050611b735f83018661186a565b611b806020830185611768565b611b8d6040830184611768565b949350505050565b7f5472616e7366657220616d6f756e74206578636565647320617661696c61626c5f8201527f652062616c616e63652064756520746f206c6f636b656420746f6b656e730000602082015250565b5f611bef603e836115e0565b9150611bfa82611b95565b604082019050919050565b5f6020820190508181035f830152611c1c81611be3565b905091905056fea2646970667358221220a0ef029a9a18e054c1bc41240dea15ffc56a3775e7b70af68bc25f3be458c33364736f6c634300081a0033