60806040523480156200001157600080fd5b506040516200245c3803806200245c8339810160408190526200003491620000e6565b6040805160208101909152600081526200004e81620000d4565b5060408051808201909152600981526826a7a827102137b6b160b91b60208201526003906200007e9082620001bf565b5060408051808201909152600881526726a7a8272127a6a160c11b6020820152600490620000ad9082620001bf565b50600580546001600160a01b0319166001600160a01b03929092169190911790556200028b565b6002620000e28282620001bf565b5050565b600060208284031215620000f957600080fd5b81516001600160a01b03811681146200011157600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200014357607f821691505b6020821081036200016457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001ba576000816000526020600020601f850160051c81016020861015620001955750805b601f850160051c820191505b81811015620001b657828155600101620001a1565b5050505b505050565b81516001600160401b03811115620001db57620001db62000118565b620001f381620001ec84546200012e565b846200016a565b602080601f8311600181146200022b5760008415620002125750858301515b600019600386901b1c1916600185901b178555620001b6565b600085815260208120601f198616915b828110156200025c578886015182559484019460019091019084016200023b565b50858210156200027b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6121c1806200029b6000396000f3fe608060405234801561001057600080fd5b50600436106100e95760003560e01c8063862440e21161008c578063ac9650d811610066578063ac9650d8146101d5578063e985e9c5146101f5578063f242432a1461023e578063f5298aca1461025157600080fd5b8063862440e2146101a757806395d89b41146101ba578063a22cb465146101c257600080fd5b80630e89341c116100c85780630e89341c1461014c578063156e29f61461015f5780632eb2c2d6146101745780634e1273f41461018757600080fd5b8062fdd58e146100ee57806301ffc9a71461011457806306fdde0314610137575b600080fd5b6101016100fc366004611692565b610264565b6040519081526020015b60405180910390f35b6101276101223660046116ec565b610299565b604051901515815260200161010b565b61013f61037c565b60405161010b9190611777565b61013f61015a36600461178a565b61040a565b61017261016d3660046117a3565b6104ac565b005b610172610182366004611977565b610552565b61019a610195366004611a25565b610618565b60405161010b9190611b23565b6101726101b5366004611b36565b6106fe565b61013f61087c565b6101726101d0366004611bb2565b610889565b6101e86101e3366004611bf0565b610898565b60405161010b9190611c65565b610127610203366004611ce7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61017261024c366004611d15565b610982565b61017261025f3660046117a3565b610a40565b60008181526020818152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061032c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061029357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610293565b6003805461038990611d7e565b80601f01602080910402602001604051908101604052809291908181526020018280546103b590611d7e565b80156104025780601f106103d757610100808354040283529160200191610402565b820191906000526020600020905b8154815290600101906020018083116103e557829003601f168201915b505050505081565b600081815260066020526040902080546060919061042790611d7e565b80601f016020809104026020016040519081016040528092919081815260200182805461045390611d7e565b80156104a05780601f10610475576101008083540402835291602001916104a0565b820191906000526020600020905b81548152906001019060200180831161048357829003601f168201915b50505050509050919050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b61054d83838360405180602001604052806000815250610acc565b505050565b3373ffffffffffffffffffffffffffffffffffffffff861681148015906105ac575073ffffffffffffffffffffffffffffffffffffffff80871660009081526001602090815260408083209385168352929052205460ff16155b15610603576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015287166024820152604401610529565b6106108686868686610b4f565b505050505050565b6060815183511461066257815183516040517f5b05999100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610529565b6000835167ffffffffffffffff81111561067e5761067e6117d8565b6040519080825280602002602001820160405280156106a7578160200160208202803683370190505b50905060005b84518110156106f6576020808202860101516106d190602080840287010151610264565b8282815181106106e3576106e3611dd1565b60209081029190910101526001016106ad565b509392505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561076b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078f9190611e00565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f7765640000000000000000000000000000000000000000006044820152606401610529565b600083815260066020526040902061083c828483611e65565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b838360405161086f929190611f7f565b60405180910390a2505050565b6004805461038990611d7e565b610894338383610c03565b5050565b60608167ffffffffffffffff8111156108b3576108b36117d8565b6040519080825280602002602001820160405280156108e657816020015b60608152602001906001900390816108d15790505b50905060005b8281101561097b576109563085858481811061090a5761090a611dd1565b905060200281019061091c9190611fcc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ceb92505050565b82828151811061096857610968611dd1565b60209081029190910101526001016108ec565b5092915050565b3373ffffffffffffffffffffffffffffffffffffffff861681148015906109dc575073ffffffffffffffffffffffffffffffffffffffff80871660009081526001602090815260408083209385168352929052205460ff16155b15610a33576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015287166024820152604401610529565b6106108686868686610d6e565b60055473ffffffffffffffffffffffffffffffffffffffff163314610ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f7765640000000000000000000000000000000000000000006044820152606401610529565b61054d838383610e49565b73ffffffffffffffffffffffffffffffffffffffff8416610b1c576040517f57f447ce00000000000000000000000000000000000000000000000000000000815260006004820152602401610529565b60408051600180825260208201869052818301908152606082018590526080820190925290610610600087848487610ed4565b73ffffffffffffffffffffffffffffffffffffffff8416610b9f576040517f57f447ce00000000000000000000000000000000000000000000000000000000815260006004820152602401610529565b73ffffffffffffffffffffffffffffffffffffffff8516610bef576040517f01a8351400000000000000000000000000000000000000000000000000000000815260006004820152602401610529565b610bfc8585858585610ed4565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610c53576040517fced3e10000000000000000000000000000000000000000000000000000000000815260006004820152602401610529565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60606000808473ffffffffffffffffffffffffffffffffffffffff1684604051610d159190612038565b600060405180830381855af49150503d8060008114610d50576040519150601f19603f3d011682016040523d82523d6000602084013e610d55565b606091505b5091509150610d65858383610f34565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8416610dbe576040517f57f447ce00000000000000000000000000000000000000000000000000000000815260006004820152602401610529565b73ffffffffffffffffffffffffffffffffffffffff8516610e0e576040517f01a8351400000000000000000000000000000000000000000000000000000000815260006004820152602401610529565b60408051600180825260208201869052818301908152606082018590526080820190925290610e408787848487610ed4565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e99576040517f01a8351400000000000000000000000000000000000000000000000000000000815260006004820152602401610529565b604080516001808252602082018590528183019081526060820184905260a08201909252600060808201818152919291610bfc918791859085905b610ee085858585610fc6565b73ffffffffffffffffffffffffffffffffffffffff841615610bfc5782513390600103610f265760208481015190840151610f1f8389898585896112a8565b5050610610565b61061081878787878761149a565b606082610f4957610f448261162b565b610fbf565b8151158015610f6d575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610fbc576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610529565b50805b9392505050565b805182511461100e57815181516040517f5b05999100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610529565b3360005b835181101561117b5760208181028581018201519085019091015173ffffffffffffffffffffffffffffffffffffffff8816156111125760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c168452909152902054818110156110de576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a166004820152602481018290526044810183905260648101849052608401610529565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff8716156111715760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b1684529091528120805483929061116b908490612054565b90915550505b5050600101611012565b50825160010361122357602083015160009060208401519091508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611214929190918252602082015260400190565b60405180910390a45050610bfc565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161129992919061208e565b60405180910390a45050505050565b73ffffffffffffffffffffffffffffffffffffffff84163b15610610576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e619061131f90899089908890889088906004016120b3565b6020604051808303816000875af1925050508015611378575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261137591810190612103565b60015b611407573d8080156113a6576040519150601f19603f3d011682016040523d82523d6000602084013e6113ab565b606091505b5080516000036113ff576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610529565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610e40576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610529565b73ffffffffffffffffffffffffffffffffffffffff84163b15610610576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906115119089908990889088908890600401612120565b6020604051808303816000875af192505050801561156a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261156791810190612103565b60015b611598573d8080156113a6576040519150601f19603f3d011682016040523d82523d6000602084013e6113ab565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610e40576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610529565b80511561163b5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461166d57600080fd5b600080604083850312156116a557600080fd5b82356116b081611670565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461166d57600080fd5b6000602082840312156116fe57600080fd5b8135610fbf816116be565b60005b8381101561172457818101518382015260200161170c565b50506000910152565b60008151808452611745816020860160208601611709565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610fbf602083018461172d565b60006020828403121561179c57600080fd5b5035919050565b6000806000606084860312156117b857600080fd5b83356117c381611670565b95602085013595506040909401359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561184e5761184e6117d8565b604052919050565b600067ffffffffffffffff821115611870576118706117d8565b5060051b60200190565b600082601f83011261188b57600080fd5b813560206118a061189b83611856565b611807565b8083825260208201915060208460051b8701019350868411156118c257600080fd5b602086015b848110156118de57803583529183019183016118c7565b509695505050505050565b600082601f8301126118fa57600080fd5b813567ffffffffffffffff811115611914576119146117d8565b61194560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611807565b81815284602083860101111561195a57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561198f57600080fd5b853561199a81611670565b945060208601356119aa81611670565b9350604086013567ffffffffffffffff808211156119c757600080fd5b6119d389838a0161187a565b945060608801359150808211156119e957600080fd5b6119f589838a0161187a565b93506080880135915080821115611a0b57600080fd5b50611a18888289016118e9565b9150509295509295909350565b60008060408385031215611a3857600080fd5b823567ffffffffffffffff80821115611a5057600080fd5b818501915085601f830112611a6457600080fd5b81356020611a7461189b83611856565b82815260059290921b84018101918181019089841115611a9357600080fd5b948201945b83861015611aba578535611aab81611670565b82529482019490820190611a98565b96505086013592505080821115611ad057600080fd5b50611add8582860161187a565b9150509250929050565b60008151808452602080850194506020840160005b83811015611b1857815187529582019590820190600101611afc565b509495945050505050565b602081526000610fbf6020830184611ae7565b600080600060408486031215611b4b57600080fd5b83359250602084013567ffffffffffffffff80821115611b6a57600080fd5b818601915086601f830112611b7e57600080fd5b813581811115611b8d57600080fd5b876020828501011115611b9f57600080fd5b6020830194508093505050509250925092565b60008060408385031215611bc557600080fd5b8235611bd081611670565b915060208301358015158114611be557600080fd5b809150509250929050565b60008060208385031215611c0357600080fd5b823567ffffffffffffffff80821115611c1b57600080fd5b818501915085601f830112611c2f57600080fd5b813581811115611c3e57600080fd5b8660208260051b8501011115611c5357600080fd5b60209290920196919550909350505050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611cda577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452611cc885835161172d565b94509285019290850190600101611c8e565b5092979650505050505050565b60008060408385031215611cfa57600080fd5b8235611d0581611670565b91506020830135611be581611670565b600080600080600060a08688031215611d2d57600080fd5b8535611d3881611670565b94506020860135611d4881611670565b93506040860135925060608601359150608086013567ffffffffffffffff811115611d7257600080fd5b611a18888289016118e9565b600181811c90821680611d9257607f821691505b602082108103611dcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611e1257600080fd5b8151610fbf81611670565b601f82111561054d576000816000526020600020601f850160051c81016020861015611e465750805b601f850160051c820191505b8181101561061057828155600101611e52565b67ffffffffffffffff831115611e7d57611e7d6117d8565b611e9183611e8b8354611d7e565b83611e1d565b6000601f841160018114611ee35760008515611ead5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610bfc565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015611f325786850135825560209485019460019092019101611f12565b5086821015611f6d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261200157600080fd5b83018035915067ffffffffffffffff82111561201c57600080fd5b60200191503681900382131561203157600080fd5b9250929050565b6000825161204a818460208701611709565b9190910192915050565b80820180821115610293577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6040815260006120a16040830185611ae7565b8281036020840152610d658185611ae7565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526120f860a083018461172d565b979650505050505050565b60006020828403121561211557600080fd5b8151610fbf816116be565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261215960a0830186611ae7565b828103606084015261216b8186611ae7565b9050828103608084015261217f818561172d565b9897505050505050505056fea2646970667358221220c5d06f02f6ae928dd2d74a400455195364bdbb878319a0b1b67f0cbf172355f864736f6c6343000817003300000000000000000000000090205dc32d976c6c36e5c5578b493dea31599a48