60c060405234801561000f575f80fd5b506040516129f43803806129f483398181016040528101906100319190610320565b816040518060400160405280601381526020017f5661756c7473204f6365616e20546f6b656e20000000000000000000000000008152506040518060400160405280600481526020017f764f43540000000000000000000000000000000000000000000000000000000081525081600390816100ad919061058f565b5080600490816100bd919061058f565b5050505f806100d18361017560201b60201c565b91509150816100e15760126100e3565b805b60ff1660a08160ff16815250508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505050503360055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060068190555050506106f1565b5f805f808473ffffffffffffffffffffffffffffffffffffffff1660405160240160405160208183030381529060405263313ce56760e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101e891906106b0565b5f60405180830381855afa9150503d805f8114610220576040519150601f19603f3d011682016040523d82523d5f602084013e610225565b606091505b509150915081801561023957506020815110155b15610270575f8180602001905181019061025391906106c6565b905060ff8016811161026e5760018194509450505050610279565b505b5f809350935050505b915091565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102ab82610282565b9050919050565b5f6102bc826102a1565b9050919050565b6102cc816102b2565b81146102d6575f80fd5b50565b5f815190506102e7816102c3565b92915050565b5f819050919050565b6102ff816102ed565b8114610309575f80fd5b50565b5f8151905061031a816102f6565b92915050565b5f80604083850312156103365761033561027e565b5b5f610343858286016102d9565b92505060206103548582860161030c565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806103d957607f821691505b6020821081036103ec576103eb610395565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261044e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610413565b6104588683610413565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61049361048e610489846102ed565b610470565b6102ed565b9050919050565b5f819050919050565b6104ac83610479565b6104c06104b88261049a565b84845461041f565b825550505050565b5f90565b6104d46104c8565b6104df8184846104a3565b505050565b5b81811015610502576104f75f826104cc565b6001810190506104e5565b5050565b601f82111561054757610518816103f2565b61052184610404565b81016020851015610530578190505b61054461053c85610404565b8301826104e4565b50505b505050565b5f82821c905092915050565b5f6105675f198460080261054c565b1980831691505092915050565b5f61057f8383610558565b9150826002028217905092915050565b6105988261035e565b67ffffffffffffffff8111156105b1576105b0610368565b5b6105bb82546103c2565b6105c6828285610506565b5f60209050601f8311600181146105f7575f84156105e5578287015190505b6105ef8582610574565b865550610656565b601f198416610605866103f2565b5f5b8281101561062c57848901518255600182019150602085019450602081019050610607565b868310156106495784890151610645601f891682610558565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61068a8261065e565b6106948185610668565b93506106a4818560208601610672565b80840191505092915050565b5f6106bb8284610680565b915081905092915050565b5f602082840312156106db576106da61027e565b5b5f6106e88482850161030c565b91505092915050565b60805160a0516122cd6107275f395f6107e201525f818161062e0152818161081301528181610ef90152610fe501526122cd5ff3fe608060405234801561000f575f80fd5b50600436106101a7575f3560e01c80638da5cb5b116100f7578063ba0af7a911610095578063ce96cb771161006f578063ce96cb771461056b578063d905777e1461059b578063dd62ed3e146105cb578063ef8b30f7146105fb576101a7565b8063ba0af7a9146104ed578063c63d75b61461050b578063c6e6f5921461053b576101a7565b8063a9059cbb116100d1578063a9059cbb1461042d578063b3d7f6b91461045d578063b460af941461048d578063ba087652146104bd576101a7565b80638da5cb5b146103c157806394bf804d146103df57806395d89b411461040f576101a7565b806323b872dd11610164578063402d267d1161013e578063402d267d146103015780634cdad506146103315780636e553f651461036157806370a0823114610391576101a7565b806323b872dd14610295578063313ce567146102c557806338d52e0f146102e3576101a7565b806301e1d114146101ab57806306fdde03146101c957806307a2d13a146101e7578063095ea7b3146102175780630a28a4771461024757806318160ddd14610277575b5f80fd5b6101b361062b565b6040516101c09190611a54565b60405180910390f35b6101d16106c9565b6040516101de9190611add565b60405180910390f35b61020160048036038101906101fc9190611b2b565b610759565b60405161020e9190611a54565b60405180910390f35b610231600480360381019061022c9190611bb0565b61076b565b60405161023e9190611c08565b60405180910390f35b610261600480360381019061025c9190611b2b565b61078d565b60405161026e9190611a54565b60405180910390f35b61027f6107a0565b60405161028c9190611a54565b60405180910390f35b6102af60048036038101906102aa9190611c21565b6107a9565b6040516102bc9190611c08565b60405180910390f35b6102cd6107d7565b6040516102da9190611c8c565b60405180910390f35b6102eb610810565b6040516102f89190611cb4565b60405180910390f35b61031b60048036038101906103169190611ccd565b610837565b6040516103289190611a54565b60405180910390f35b61034b60048036038101906103469190611b2b565b610860565b6040516103589190611a54565b60405180910390f35b61037b60048036038101906103769190611cf8565b610872565b6040516103889190611a54565b60405180910390f35b6103ab60048036038101906103a69190611ccd565b6108f2565b6040516103b89190611a54565b60405180910390f35b6103c9610937565b6040516103d69190611d56565b60405180910390f35b6103f960048036038101906103f49190611cf8565b61095c565b6040516104069190611a54565b60405180910390f35b6104176109dc565b6040516104249190611add565b60405180910390f35b61044760048036038101906104429190611bb0565b610a6c565b6040516104549190611c08565b60405180910390f35b61047760048036038101906104729190611b2b565b610a8e565b6040516104849190611a54565b60405180910390f35b6104a760048036038101906104a29190611d6f565b610aa1565b6040516104b49190611a54565b60405180910390f35b6104d760048036038101906104d29190611d6f565b610b23565b6040516104e49190611a54565b60405180910390f35b6104f5610ba5565b6040516105029190611a54565b60405180910390f35b61052560048036038101906105209190611ccd565b610bab565b6040516105329190611a54565b60405180910390f35b61055560048036038101906105509190611b2b565b610bd4565b6040516105629190611a54565b60405180910390f35b61058560048036038101906105809190611ccd565b610be6565b6040516105929190611a54565b60405180910390f35b6105b560048036038101906105b09190611ccd565b610c00565b6040516105c29190611a54565b60405180910390f35b6105e560048036038101906105e09190611dbf565b610c11565b6040516105f29190611a54565b60405180910390f35b61061560048036038101906106109190611b2b565b610c93565b6040516106229190611a54565b60405180910390f35b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106859190611cb4565b602060405180830381865afa1580156106a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c49190611e11565b905090565b6060600380546106d890611e69565b80601f016020809104026020016040519081016040528092919081815260200182805461070490611e69565b801561074f5780601f106107265761010080835404028352916020019161074f565b820191905f5260205f20905b81548152906001019060200180831161073257829003601f168201915b5050505050905090565b5f610764825f610ca5565b9050919050565b5f80610775610cfd565b9050610782818585610d04565b600191505092915050565b5f610799826001610d16565b9050919050565b5f600254905090565b5f806107b3610cfd565b90506107c0858285610d6e565b6107cb858585610e00565b60019150509392505050565b5f6107e0610ef0565b7f000000000000000000000000000000000000000000000000000000000000000061080b9190611ec6565b905090565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b5f61086b825f610ca5565b9050919050565b5f8061087d83610837565b9050808411156108c8578284826040517f79012fb20000000000000000000000000000000000000000000000000000000081526004016108bf93929190611efa565b60405180910390fd5b5f6108d285610c93565b90506108e76108df610cfd565b858784610ef4565b809250505092915050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8061096783610bab565b9050808411156109b2578284826040517f284ff6670000000000000000000000000000000000000000000000000000000081526004016109a993929190611efa565b60405180910390fd5b5f6109bc85610a8e565b90506109d16109c9610cfd565b858388610ef4565b809250505092915050565b6060600480546109eb90611e69565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1790611e69565b8015610a625780601f10610a3957610100808354040283529160200191610a62565b820191905f5260205f20905b815481529060010190602001808311610a4557829003601f168201915b5050505050905090565b5f80610a76610cfd565b9050610a83818585610e00565b600191505092915050565b5f610a9a826001610ca5565b9050919050565b5f80610aac83610be6565b905080851115610af7578285826040517ffe9cceec000000000000000000000000000000000000000000000000000000008152600401610aee93929190611efa565b60405180910390fd5b5f610b018661078d565b9050610b17610b0e610cfd565b86868985610f97565b80925050509392505050565b5f80610b2e83610c00565b905080851115610b79578285826040517fb94abeec000000000000000000000000000000000000000000000000000000008152600401610b7093929190611efa565b60405180910390fd5b5f610b8386610860565b9050610b99610b90610cfd565b8686848a610f97565b80925050509392505050565b60065481565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b5f610bdf825f610d16565b9050919050565b5f610bf9610bf3836108f2565b5f610ca5565b9050919050565b5f610c0a826108f2565b9050919050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f610c9e825f610d16565b9050919050565b5f610cf56001610cb361062b565b610cbd9190611f2f565b610cc5610ef0565b600a610cd19190612091565b610cd96107a0565b610ce39190611f2f565b8486611090909392919063ffffffff16565b905092915050565b5f33905090565b610d1183838360016110e5565b505050565b5f610d66610d22610ef0565b600a610d2e9190612091565b610d366107a0565b610d409190611f2f565b6001610d4a61062b565b610d549190611f2f565b8486611090909392919063ffffffff16565b905092915050565b5f610d798484610c11565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610dfa5781811015610deb578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610de293929190611efa565b60405180910390fd5b610df984848484035f6110e5565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e70575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610e679190611cb4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee0575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610ed79190611cb4565b60405180910390fd5b610eeb8383836112b4565b505050565b5f90565b610f207f00000000000000000000000000000000000000000000000000000000000000008530856114cd565b610f2a838261154f565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610f899291906120db565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610fd657610fd5838683610d6e565b5b610fe083826115ce565b61100b7f0000000000000000000000000000000000000000000000000000000000000000858461164d565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db85856040516110819291906120db565b60405180910390a45050505050565b5f8061109d8686866116cc565b90506110a8836117cb565b80156110c457505f84806110bf576110be612102565b5b868809115b156110d9576001816110d69190611f2f565b90505b80915050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611155575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161114c9190611cb4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111c5575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016111bc9190611cb4565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156112ae578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516112a59190611a54565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611304578060025f8282546112f89190611f2f565b925050819055506113d2565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561138d578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161138493929190611efa565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611419578060025f8282540392505081905550611463565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516114c09190611a54565b60405180910390a3505050565b611549848573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016115029392919061212f565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117f8565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115bf575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016115b69190611cb4565b60405180910390fd5b6115ca5f83836112b4565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163e575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016116359190611cb4565b60405180910390fd5b611649825f836112b4565b5050565b6116c7838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611680929190612164565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117f8565b505050565b5f8083850290505f8019858709828110838203039150505f8103611704578382816116fa576116f9612102565b5b04925050506117c4565b80841161173d576040517f227bc15300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8486880990508281118203915080830392505f855f038616905080860495508084049350600181825f0304019050808302841793505f600287600302189050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050505b9392505050565b5f600160028360038111156117e3576117e261218b565b5b6117ed91906121b8565b60ff16149050919050565b5f611822828473ffffffffffffffffffffffffffffffffffffffff1661188d90919063ffffffff16565b90505f8151141580156118465750808060200190518101906118449190612212565b155b1561188857826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161187f9190611cb4565b60405180910390fd5b505050565b606061189a83835f6118a2565b905092915050565b6060814710156118e957306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016118e09190611cb4565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516119119190612281565b5f6040518083038185875af1925050503d805f811461194b576040519150601f19603f3d011682016040523d82523d5f602084013e611950565b606091505b509150915061196086838361196b565b925050509392505050565b6060826119805761197b826119f8565b6119f0565b5f82511480156119a657505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156119e857836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016119df9190611cb4565b60405180910390fd5b8190506119f1565b5b9392505050565b5f81511115611a0a5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f819050919050565b611a4e81611a3c565b82525050565b5f602082019050611a675f830184611a45565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611aaf82611a6d565b611ab98185611a77565b9350611ac9818560208601611a87565b611ad281611a95565b840191505092915050565b5f6020820190508181035f830152611af58184611aa5565b905092915050565b5f80fd5b611b0a81611a3c565b8114611b14575f80fd5b50565b5f81359050611b2581611b01565b92915050565b5f60208284031215611b4057611b3f611afd565b5b5f611b4d84828501611b17565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b7f82611b56565b9050919050565b611b8f81611b75565b8114611b99575f80fd5b50565b5f81359050611baa81611b86565b92915050565b5f8060408385031215611bc657611bc5611afd565b5b5f611bd385828601611b9c565b9250506020611be485828601611b17565b9150509250929050565b5f8115159050919050565b611c0281611bee565b82525050565b5f602082019050611c1b5f830184611bf9565b92915050565b5f805f60608486031215611c3857611c37611afd565b5b5f611c4586828701611b9c565b9350506020611c5686828701611b9c565b9250506040611c6786828701611b17565b9150509250925092565b5f60ff82169050919050565b611c8681611c71565b82525050565b5f602082019050611c9f5f830184611c7d565b92915050565b611cae81611b75565b82525050565b5f602082019050611cc75f830184611ca5565b92915050565b5f60208284031215611ce257611ce1611afd565b5b5f611cef84828501611b9c565b91505092915050565b5f8060408385031215611d0e57611d0d611afd565b5b5f611d1b85828601611b17565b9250506020611d2c85828601611b9c565b9150509250929050565b5f611d4082611b56565b9050919050565b611d5081611d36565b82525050565b5f602082019050611d695f830184611d47565b92915050565b5f805f60608486031215611d8657611d85611afd565b5b5f611d9386828701611b17565b9350506020611da486828701611b9c565b9250506040611db586828701611b9c565b9150509250925092565b5f8060408385031215611dd557611dd4611afd565b5b5f611de285828601611b9c565b9250506020611df385828601611b9c565b9150509250929050565b5f81519050611e0b81611b01565b92915050565b5f60208284031215611e2657611e25611afd565b5b5f611e3384828501611dfd565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611e8057607f821691505b602082108103611e9357611e92611e3c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611ed082611c71565b9150611edb83611c71565b9250828201905060ff811115611ef457611ef3611e99565b5b92915050565b5f606082019050611f0d5f830186611ca5565b611f1a6020830185611a45565b611f276040830184611a45565b949350505050565b5f611f3982611a3c565b9150611f4483611a3c565b9250828201905080821115611f5c57611f5b611e99565b5b92915050565b5f8160011c9050919050565b5f808291508390505b6001851115611fb757808604811115611f9357611f92611e99565b5b6001851615611fa25780820291505b8081029050611fb085611f62565b9450611f77565b94509492505050565b5f82611fcf576001905061208a565b81611fdc575f905061208a565b8160018114611ff25760028114611ffc5761202b565b600191505061208a565b60ff84111561200e5761200d611e99565b5b8360020a91508482111561202557612024611e99565b5b5061208a565b5060208310610133831016604e8410600b84101617156120605782820a90508381111561205b5761205a611e99565b5b61208a565b61206d8484846001611f6e565b9250905081840481111561208457612083611e99565b5b81810290505b9392505050565b5f61209b82611a3c565b91506120a683611c71565b92506120d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484611fc0565b905092915050565b5f6040820190506120ee5f830185611a45565b6120fb6020830184611a45565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6060820190506121425f830186611ca5565b61214f6020830185611ca5565b61215c6040830184611a45565b949350505050565b5f6040820190506121775f830185611ca5565b6121846020830184611a45565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f6121c282611c71565b91506121cd83611c71565b9250826121dd576121dc612102565b5b828206905092915050565b6121f181611bee565b81146121fb575f80fd5b50565b5f8151905061220c816121e8565b92915050565b5f6020828403121561222757612226611afd565b5b5f612234848285016121fe565b91505092915050565b5f81519050919050565b5f81905092915050565b5f61225b8261223d565b6122658185612247565b9350612275818560208601611a87565b80840191505092915050565b5f61228c8284612251565b91508190509291505056fea2646970667358221220c68a8cd95fe118319bb306c124bbb3c064e21d92da5678a0826adcf84c56c82464736f6c634300081a0033000000000000000000000000df2d9d367db1316a479353b19b4236f0941242b20000000000000000000000000000000000000000000000000000000000000064