60806040526040518060400160405280600581526020017f76616c756500000000000000000000000000000000000000000000000000000081525060059081610048919061034b565b50620f424060085560646009556040518060400160405280600381526020017f616e790000000000000000000000000000000000000000000000000000000000815250600a9081610099919061034b565b503480156100a5575f5ffd5b5060405161235b38038061235b83398181016040528101906100c7919061053a565b818181600390816100d8919061034b565b5080600490816100e8919061034b565b505050600660018160018154018082558091505003905f5260205f2090505050506105b0565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061018957607f821691505b60208210810361019c5761019b610145565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826101c3565b61020886836101c3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61024c61024761024284610220565b610229565b610220565b9050919050565b5f819050919050565b61026583610232565b61027961027182610253565b8484546101cf565b825550505050565b5f5f905090565b610290610281565b61029b81848461025c565b505050565b5b818110156102be576102b35f82610288565b6001810190506102a1565b5050565b601f821115610303576102d4816101a2565b6102dd846101b4565b810160208510156102ec578190505b6103006102f8856101b4565b8301826102a0565b50505b505050565b5f82821c905092915050565b5f6103235f1984600802610308565b1980831691505092915050565b5f61033b8383610314565b9150826002028217905092915050565b6103548261010e565b67ffffffffffffffff81111561036d5761036c610118565b5b6103778254610172565b6103828282856102c2565b5f60209050601f8311600181146103b3575f84156103a1578287015190505b6103ab8582610330565b865550610412565b601f1984166103c1866101a2565b5f5b828110156103e8578489015182556001820191506020850194506020810190506103c3565b868310156104055784890151610401601f891682610314565b8355505b6001600288020188555050505b505050505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b61044c82610433565b810181811067ffffffffffffffff8211171561046b5761046a610118565b5b80604052505050565b5f61047d61041a565b90506104898282610443565b919050565b5f67ffffffffffffffff8211156104a8576104a7610118565b5b6104b182610433565b9050602081019050919050565b8281835e5f83830152505050565b5f6104de6104d98461048e565b610474565b9050828152602081018484840111156104fa576104f961042f565b5b6105058482856104be565b509392505050565b5f82601f8301126105215761052061042b565b5b81516105318482602086016104cc565b91505092915050565b5f5f604083850312156105505761054f610423565b5b5f83015167ffffffffffffffff81111561056d5761056c610427565b5b6105798582860161050d565b925050602083015167ffffffffffffffff81111561059a57610599610427565b5b6105a68582860161050d565b9150509250929050565b611d9e806105bd5f395ff3fe608060405234801561000f575f5ffd5b50600436106100fe575f3560e01c8063830953ab11610095578063976b311311610064578063976b3113146102ae578063a9059cbb146102de578063d5abeb011461030e578063dd62ed3e1461032c576100fe565b8063830953ab146102265780638615d85514610244578063943e82161461027457806395d89b4114610290576100fe565b8063313ce567116100d1578063313ce5671461019e5780634e71d92d146101bc578063624601b6146101c657806370a08231146101f6576100fe565b806306fdde0314610102578063095ea7b31461012057806318160ddd1461015057806323b872dd1461016e575b5f5ffd5b61010a61035c565b6040516101179190611392565b60405180910390f35b61013a60048036038101906101359190611447565b6103ec565b604051610147919061149f565b60405180910390f35b61015861040e565b60405161016591906114c7565b60405180910390f35b610188600480360381019061018391906114e0565b610417565b604051610195919061149f565b60405180910390f35b6101a6610445565b6040516101b3919061154b565b60405180910390f35b6101c461044d565b005b6101e060048036038101906101db9190611564565b610581565b6040516101ed919061149f565b60405180910390f35b610210600480360381019061020b9190611564565b61059e565b60405161021d91906114c7565b60405180910390f35b61022e6105e3565b60405161023b91906114c7565b60405180910390f35b61025e600480360381019061025991906115f0565b6105e9565b60405161026b91906114c7565b60405180910390f35b61028e60048036038101906102899190611670565b6106c6565b005b610298610904565b6040516102a59190611392565b60405180910390f35b6102c860048036038101906102c391906116ae565b610994565b6040516102d591906118bf565b60405180910390f35b6102f860048036038101906102f39190611447565b610ad4565b604051610305919061149f565b60405180910390f35b610316610af6565b60405161032391906114c7565b60405180910390f35b610346600480360381019061034191906118df565b610afc565b60405161035391906114c7565b60405180910390f35b60606003805461036b9061194a565b80601f01602080910402602001604051908101604052809291908181526020018280546103979061194a565b80156103e25780601f106103b9576101008083540402835291602001916103e2565b820191905f5260205f20905b8154815290600101906020018083116103c557829003601f168201915b5050505050905090565b5f5f6103f6610b7e565b9050610403818585610b85565b600191505092915050565b5f600254905090565b5f5f610421610b7e565b905061042e858285610b97565b610439858585610c29565b60019150509392505050565b5f6012905090565b60085460095461045b61040e565b61046591906119a7565b111561049d576040517fcbe2483100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561051e576040517f0b1327a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052a33600954610d19565b600160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550565b6007602052805f5260405f205f915054906101000a900460ff1681565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60095481565b5f5f6105f43361059e565b0361062b576040517f8439960d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61063361040e565b82111561066c576040517f0d92730000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600660018160018154018082558091505003905f5260205f209060090201905084848260020191826106a0929190611bb1565b5082816003018190555060016006805490506106bc9190611c7e565b9150509392505050565b5f600683815481106106db576106da611cb1565b5b905f5260205f20906009020190508060080160019054906101000a900460ff1615610732576040517f66b6cb4a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61074733825f01610d9890919063ffffffff16565b1561077e576040517f7c9a1cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6107883361059e565b90505f81036107c3576040517f8439960d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60028111156107d6576107d5611cde565b5b8360028111156107e9576107e8611cde565b5b0361080d5780826006015f82825461080191906119a7565b92505081905550610874565b6001600281111561082157610820611cde565b5b83600281111561083457610833611cde565b5b036108585780826005015f82825461084c91906119a7565b92505081905550610873565b80826007015f82825461086b91906119a7565b925050819055505b5b61088933835f01610dc590919063ffffffff16565b5080826004015f82825461089d91906119a7565b9250508190555081600301548260040154106108fe5760018260080160016101000a81548160ff0219169083151502179055508160060154826005015411156108fd576001826008015f6101000a81548160ff0219169083151502179055505b5b50505050565b6060600480546109139061194a565b80601f016020809104026020016040519081016040528092919081815260200182805461093f9061194a565b801561098a5780601f106109615761010080835404028352916020019161098a565b820191905f5260205f20905b81548152906001019060200180831161096d57829003601f168201915b5050505050905090565b61099c6112d9565b5f600683815481106109b1576109b0611cb1565b5b905f5260205f20906009020190506040518061012001604052806109d6835f01610df2565b81526020018260020180546109ea9061194a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a169061194a565b8015610a615780601f10610a3857610100808354040283529160200191610a61565b820191905f5260205f20905b815481529060010190602001808311610a4457829003601f168201915b505050505081526020018260030154815260200182600401548152602001826005015481526020018260060154815260200182600701548152602001826008015f9054906101000a900460ff16151581526020018260080160019054906101000a900460ff161515815250915050919050565b5f5f610ade610b7e565b9050610aeb818585610c29565b600191505092915050565b60085481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b610b928383836001610e11565b505050565b5f610ba28484610afc565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c235781811015610c14578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610c0b93929190611d1a565b60405180910390fd5b610c2284848484035f610e11565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c99575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610c909190611d4f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d09575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610d009190611d4f565b60405180910390fd5b610d14838383610fe0565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d89575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610d809190611d4f565b60405180910390fd5b610d945f8383610fe0565b5050565b5f610dbd835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6111f9565b905092915050565b5f610dea835f018373ffffffffffffffffffffffffffffffffffffffff165f1b611219565b905092915050565b60605f610e00835f01611280565b905060608190508092505050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610e81575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610e789190611d4f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ef1575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610ee89190611d4f565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610fda578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610fd191906114c7565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611030578060025f82825461102491906119a7565b925050819055506110fe565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156110b9578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016110b093929190611d1a565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611145578060025f828254039250508190555061118f565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111ec91906114c7565b60405180910390a3505050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f61122483836111f9565b61127657825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f20819055506001905061127a565b5f90505b92915050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156112cd57602002820191905f5260205f20905b8154815260200190600101908083116112b9575b50505050509050919050565b60405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f81526020015f81526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61136482611322565b61136e818561132c565b935061137e81856020860161133c565b6113878161134a565b840191505092915050565b5f6020820190508181035f8301526113aa818461135a565b905092915050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6113e3826113ba565b9050919050565b6113f3816113d9565b81146113fd575f5ffd5b50565b5f8135905061140e816113ea565b92915050565b5f819050919050565b61142681611414565b8114611430575f5ffd5b50565b5f813590506114418161141d565b92915050565b5f5f6040838503121561145d5761145c6113b2565b5b5f61146a85828601611400565b925050602061147b85828601611433565b9150509250929050565b5f8115159050919050565b61149981611485565b82525050565b5f6020820190506114b25f830184611490565b92915050565b6114c181611414565b82525050565b5f6020820190506114da5f8301846114b8565b92915050565b5f5f5f606084860312156114f7576114f66113b2565b5b5f61150486828701611400565b935050602061151586828701611400565b925050604061152686828701611433565b9150509250925092565b5f60ff82169050919050565b61154581611530565b82525050565b5f60208201905061155e5f83018461153c565b92915050565b5f60208284031215611579576115786113b2565b5b5f61158684828501611400565b91505092915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126115b0576115af61158f565b5b8235905067ffffffffffffffff8111156115cd576115cc611593565b5b6020830191508360018202830111156115e9576115e8611597565b5b9250929050565b5f5f5f60408486031215611607576116066113b2565b5b5f84013567ffffffffffffffff811115611624576116236113b6565b5b6116308682870161159b565b9350935050602061164386828701611433565b9150509250925092565b60038110611659575f5ffd5b50565b5f8135905061166a8161164d565b92915050565b5f5f60408385031215611686576116856113b2565b5b5f61169385828601611433565b92505060206116a48582860161165c565b9150509250929050565b5f602082840312156116c3576116c26113b2565b5b5f6116d084828501611433565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61170b816113d9565b82525050565b5f61171c8383611702565b60208301905092915050565b5f602082019050919050565b5f61173e826116d9565b61174881856116e3565b9350611753836116f3565b805f5b8381101561178357815161176a8882611711565b975061177583611728565b925050600181019050611756565b5085935050505092915050565b5f82825260208201905092915050565b5f6117aa82611322565b6117b48185611790565b93506117c481856020860161133c565b6117cd8161134a565b840191505092915050565b6117e181611414565b82525050565b6117f081611485565b82525050565b5f61012083015f8301518482035f8601526118118282611734565b9150506020830151848203602086015261182b82826117a0565b915050604083015161184060408601826117d8565b50606083015161185360608601826117d8565b50608083015161186660808601826117d8565b5060a083015161187960a08601826117d8565b5060c083015161188c60c08601826117d8565b5060e083015161189f60e08601826117e7565b506101008301516118b46101008601826117e7565b508091505092915050565b5f6020820190508181035f8301526118d781846117f6565b905092915050565b5f5f604083850312156118f5576118f46113b2565b5b5f61190285828601611400565b925050602061191385828601611400565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061196157607f821691505b6020821081036119745761197361191d565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6119b182611414565b91506119bc83611414565b92508282019050808211156119d4576119d361197a565b5b92915050565b5f82905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611a6d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611a32565b611a778683611a32565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611ab2611aad611aa884611414565b611a8f565b611414565b9050919050565b5f819050919050565b611acb83611a98565b611adf611ad782611ab9565b848454611a3e565b825550505050565b5f5f905090565b611af6611ae7565b611b01818484611ac2565b505050565b5b81811015611b2457611b195f82611aee565b600181019050611b07565b5050565b601f821115611b6957611b3a81611a11565b611b4384611a23565b81016020851015611b52578190505b611b66611b5e85611a23565b830182611b06565b50505b505050565b5f82821c905092915050565b5f611b895f1984600802611b6e565b1980831691505092915050565b5f611ba18383611b7a565b9150826002028217905092915050565b611bbb83836119da565b67ffffffffffffffff811115611bd457611bd36119e4565b5b611bde825461194a565b611be9828285611b28565b5f601f831160018114611c16575f8415611c04578287013590505b611c0e8582611b96565b865550611c75565b601f198416611c2486611a11565b5f5b82811015611c4b57848901358255600182019150602085019450602081019050611c26565b86831015611c685784890135611c64601f891682611b7a565b8355505b6001600288020188555050505b50505050505050565b5f611c8882611414565b9150611c9383611414565b9250828203905081811115611cab57611caa61197a565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b611d14816113d9565b82525050565b5f606082019050611d2d5f830186611d0b565b611d3a60208301856114b8565b611d4760408301846114b8565b949350505050565b5f602082019050611d625f830184611d0b565b9291505056fea2646970667358221220b16b9b3f5f795bf205e80ec7ab56a7a46998ae37beb8bde9a5dda9606de8453464736f6c634300081c0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000