608060405234801561000f575f80fd5b50604051611d88380380611d8883398181016040528101906100319190610545565b806040518060400160405280600481526020017f55534454000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f555344540000000000000000000000000000000000000000000000000000000081525081600390816100ad91906107aa565b5080600490816100bd91906107aa565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610130575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101279190610888565b60405180910390fd5b61013f8161017e60201b60201c565b506101783361015261024160201b60201c565b600a61015e9190610a09565b6305f5e10061016d9190610a53565b61024960201b60201c565b50610b24565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102b9575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102b09190610888565b60405180910390fd5b6102ca5f83836102ce60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361031e578060025f8282546103129190610a94565b925050819055506103ec565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156103a7578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161039e93929190610ad6565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610433578060025f828254039250508190555061047d565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516104da9190610b0b565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610514826104eb565b9050919050565b6105248161050a565b811461052e575f80fd5b50565b5f8151905061053f8161051b565b92915050565b5f6020828403121561055a576105596104e7565b5b5f61056784828501610531565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806105eb57607f821691505b6020821081036105fe576105fd6105a7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610625565b61066a8683610625565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6106ae6106a96106a484610682565b61068b565b610682565b9050919050565b5f819050919050565b6106c783610694565b6106db6106d3826106b5565b848454610631565b825550505050565b5f90565b6106ef6106e3565b6106fa8184846106be565b505050565b5b8181101561071d576107125f826106e7565b600181019050610700565b5050565b601f8211156107625761073381610604565b61073c84610616565b8101602085101561074b578190505b61075f61075785610616565b8301826106ff565b50505b505050565b5f82821c905092915050565b5f6107825f1984600802610767565b1980831691505092915050565b5f61079a8383610773565b9150826002028217905092915050565b6107b382610570565b67ffffffffffffffff8111156107cc576107cb61057a565b5b6107d682546105d4565b6107e1828285610721565b5f60209050601f831160018114610812575f8415610800578287015190505b61080a858261078f565b865550610871565b601f19841661082086610604565b5f5b8281101561084757848901518255600182019150602085019450602081019050610822565b868310156108645784890151610860601f891682610773565b8355505b6001600288020188555050505b505050505050565b6108828161050a565b82525050565b5f60208201905061089b5f830184610879565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b6001851115610923578086048111156108ff576108fe6108a1565b5b600185161561090e5780820291505b808102905061091c856108ce565b94506108e3565b94509492505050565b5f8261093b57600190506109f6565b81610948575f90506109f6565b816001811461095e576002811461096857610997565b60019150506109f6565b60ff84111561097a576109796108a1565b5b8360020a915084821115610991576109906108a1565b5b506109f6565b5060208310610133831016604e8410600b84101617156109cc5782820a9050838111156109c7576109c66108a1565b5b6109f6565b6109d984848460016108da565b925090508184048111156109f0576109ef6108a1565b5b81810290505b9392505050565b5f60ff82169050919050565b5f610a1382610682565b9150610a1e836109fd565b9250610a4b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461092c565b905092915050565b5f610a5d82610682565b9150610a6883610682565b9250828202610a7681610682565b91508282048414831517610a8d57610a8c6108a1565b5b5092915050565b5f610a9e82610682565b9150610aa983610682565b9250828201905080821115610ac157610ac06108a1565b5b92915050565b610ad081610682565b82525050565b5f606082019050610ae95f830186610879565b610af66020830185610ac7565b610b036040830184610ac7565b949350505050565b5f602082019050610b1e5f830184610ac7565b92915050565b61125780610b315f395ff3fe608060405234801561000f575f80fd5b50600436106100f3575f3560e01c806370a082311161009557806395d89b411161006457806395d89b411461025d578063a9059cbb1461027b578063dd62ed3e146102ab578063f2fde38b146102db576100f3565b806370a08231146101e9578063715018a61461021957806379cc6790146102235780638da5cb5b1461023f576100f3565b806323b872dd116100d157806323b872dd14610163578063313ce5671461019357806340c10f19146101b157806342966c68146101cd576100f3565b806306fdde03146100f7578063095ea7b31461011557806318160ddd14610145575b5f80fd5b6100ff6102f7565b60405161010c9190610ea5565b60405180910390f35b61012f600480360381019061012a9190610f56565b610387565b60405161013c9190610fae565b60405180910390f35b61014d6103a9565b60405161015a9190610fd6565b60405180910390f35b61017d60048036038101906101789190610fef565b6103b2565b60405161018a9190610fae565b60405180910390f35b61019b6103e0565b6040516101a8919061105a565b60405180910390f35b6101cb60048036038101906101c69190610f56565b6103e8565b005b6101e760048036038101906101e29190611073565b6103fe565b005b61020360048036038101906101fe919061109e565b610412565b6040516102109190610fd6565b60405180910390f35b610221610457565b005b61023d60048036038101906102389190610f56565b61046a565b005b61024761048a565b60405161025491906110d8565b60405180910390f35b6102656104b2565b6040516102729190610ea5565b60405180910390f35b61029560048036038101906102909190610f56565b610542565b6040516102a29190610fae565b60405180910390f35b6102c560048036038101906102c091906110f1565b610564565b6040516102d29190610fd6565b60405180910390f35b6102f560048036038101906102f0919061109e565b6105e6565b005b6060600380546103069061115c565b80601f01602080910402602001604051908101604052809291908181526020018280546103329061115c565b801561037d5780601f106103545761010080835404028352916020019161037d565b820191905f5260205f20905b81548152906001019060200180831161036057829003601f168201915b5050505050905090565b5f8061039161066a565b905061039e818585610671565b600191505092915050565b5f600254905090565b5f806103bc61066a565b90506103c9858285610683565b6103d4858585610715565b60019150509392505050565b5f6012905090565b6103f0610805565b6103fa828261088c565b5050565b61040f61040961066a565b8261090b565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61045f610805565b6104685f61098a565b565b61047c8261047661066a565b83610683565b610486828261090b565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546104c19061115c565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061115c565b80156105385780601f1061050f57610100808354040283529160200191610538565b820191905f5260205f20905b81548152906001019060200180831161051b57829003601f168201915b5050505050905090565b5f8061054c61066a565b9050610559818585610715565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6105ee610805565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361065e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161065591906110d8565b60405180910390fd5b6106678161098a565b50565b5f33905090565b61067e8383836001610a4d565b505050565b5f61068e8484610564565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461070f5781811015610700578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016106f79392919061118c565b60405180910390fd5b61070e84848484035f610a4d565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610785575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161077c91906110d8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107f5575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107ec91906110d8565b60405180910390fd5b610800838383610c1c565b505050565b61080d61066a565b73ffffffffffffffffffffffffffffffffffffffff1661082b61048a565b73ffffffffffffffffffffffffffffffffffffffff161461088a5761084e61066a565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161088191906110d8565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108fc575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108f391906110d8565b60405180910390fd5b6109075f8383610c1c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361097b575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161097291906110d8565b60405180910390fd5b610986825f83610c1c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610abd575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610ab491906110d8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b2d575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610b2491906110d8565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610c16578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c0d9190610fd6565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c6c578060025f828254610c6091906111ee565b92505081905550610d3a565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610cf5578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610cec9392919061118c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d81578060025f8282540392505081905550610dcb565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e289190610fd6565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610e7782610e35565b610e818185610e3f565b9350610e91818560208601610e4f565b610e9a81610e5d565b840191505092915050565b5f6020820190508181035f830152610ebd8184610e6d565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610ef282610ec9565b9050919050565b610f0281610ee8565b8114610f0c575f80fd5b50565b5f81359050610f1d81610ef9565b92915050565b5f819050919050565b610f3581610f23565b8114610f3f575f80fd5b50565b5f81359050610f5081610f2c565b92915050565b5f8060408385031215610f6c57610f6b610ec5565b5b5f610f7985828601610f0f565b9250506020610f8a85828601610f42565b9150509250929050565b5f8115159050919050565b610fa881610f94565b82525050565b5f602082019050610fc15f830184610f9f565b92915050565b610fd081610f23565b82525050565b5f602082019050610fe95f830184610fc7565b92915050565b5f805f6060848603121561100657611005610ec5565b5b5f61101386828701610f0f565b935050602061102486828701610f0f565b925050604061103586828701610f42565b9150509250925092565b5f60ff82169050919050565b6110548161103f565b82525050565b5f60208201905061106d5f83018461104b565b92915050565b5f6020828403121561108857611087610ec5565b5b5f61109584828501610f42565b91505092915050565b5f602082840312156110b3576110b2610ec5565b5b5f6110c084828501610f0f565b91505092915050565b6110d281610ee8565b82525050565b5f6020820190506110eb5f8301846110c9565b92915050565b5f806040838503121561110757611106610ec5565b5b5f61111485828601610f0f565b925050602061112585828601610f0f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061117357607f821691505b6020821081036111865761118561112f565b5b50919050565b5f60608201905061119f5f8301866110c9565b6111ac6020830185610fc7565b6111b96040830184610fc7565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f882610f23565b915061120383610f23565b925082820190508082111561121b5761121a6111c1565b5b9291505056fea2646970667358221220e76b3ba849443a731837de18a15eba7d8445cca43eec91b3a9c861dfa67bf5ea64736f6c634300081a0033000000000000000000000000008d2a4b54a76d8b7d164beb81191d8920603d3f