60806040523480156200001157600080fd5b5060405162002b2038038062002b20833981810160405281019062000037919062000288565b806040518060400160405280600f81526020017f476169614e616d655365727669636500000000000000000000000000000000008152506040518060400160405280600381526020017f474e5300000000000000000000000000000000000000000000000000000000008152508160009081620000b5919062000534565b508060019081620000c7919062000534565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013f5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200013691906200062c565b60405180910390fd5b62000150816200015860201b60201c565b505062000649565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002508262000223565b9050919050565b620002628162000243565b81146200026e57600080fd5b50565b600081519050620002828162000257565b92915050565b600060208284031215620002a157620002a06200021e565b5b6000620002b18482850162000271565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033c57607f821691505b602082108103620003525762000351620002f4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003bc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200037d565b620003c886836200037d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004156200040f6200040984620003e0565b620003ea565b620003e0565b9050919050565b6000819050919050565b6200043183620003f4565b6200044962000440826200041c565b8484546200038a565b825550505050565b600090565b6200046062000451565b6200046d81848462000426565b505050565b5b8181101562000495576200048960008262000456565b60018101905062000473565b5050565b601f821115620004e457620004ae8162000358565b620004b9846200036d565b81016020851015620004c9578190505b620004e1620004d8856200036d565b83018262000472565b50505b505050565b600082821c905092915050565b60006200050960001984600802620004e9565b1980831691505092915050565b6000620005248383620004f6565b9150826002028217905092915050565b6200053f82620002ba565b67ffffffffffffffff8111156200055b576200055a620002c5565b5b62000567825462000323565b6200057482828562000499565b600060209050601f831160018114620005ac576000841562000597578287015190505b620005a3858262000516565b86555062000613565b601f198416620005bc8662000358565b60005b82811015620005e657848901518255600182019150602085019450602081019050620005bf565b8683101562000606578489015162000602601f891682620004f6565b8355505b6001600288020188555050505b505050505050565b620006268162000243565b82525050565b60006020820190506200064360008301846200061b565b92915050565b6124c780620006596000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637b103999116100b8578063a91ee0dc1161007c578063a91ee0dc14610326578063b88d4fde14610342578063c87b56dd1461035e578063e985e9c51461038e578063f2fde38b146103be578063f77c4791146103da57610137565b80637b103999146102945780638da5cb5b146102b257806392eefe9b146102d057806395d89b41146102ec578063a22cb4651461030a57610137565b8063293c6a3a116100ff578063293c6a3a146101f257806342842e0e1461020e5780636352211e1461022a57806370a082311461025a578063715018a61461028a57610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba57806323b872dd146101d6575b600080fd5b61015660048036038101906101519190611b7d565b6103f8565b6040516101639190611bc5565b60405180910390f35b6101746104da565b6040516101819190611c70565b60405180910390f35b6101a4600480360381019061019f9190611cc8565b61056c565b6040516101b19190611d36565b60405180910390f35b6101d460048036038101906101cf9190611d7d565b610588565b005b6101f060048036038101906101eb9190611dbd565b61059e565b005b61020c60048036038101906102079190611e46565b610646565b005b61022860048036038101906102239190611dbd565b61072b565b005b610244600480360381019061023f9190611cc8565b61074b565b6040516102519190611d36565b60405180910390f35b610274600480360381019061026f9190611e86565b61075d565b6040516102819190611ec2565b60405180910390f35b610292610817565b005b61029c61082b565b6040516102a99190611f3c565b60405180910390f35b6102ba610851565b6040516102c79190611d36565b60405180910390f35b6102ea60048036038101906102e59190611e86565b61087b565b005b6102f46108c7565b6040516103019190611c70565b60405180910390f35b610324600480360381019061031f9190611f83565b610959565b005b610340600480360381019061033b9190611e86565b61096f565b005b61035c600480360381019061035791906120f8565b6109bb565b005b61037860048036038101906103739190611cc8565b6109d8565b6040516103859190611c70565b60405180910390f35b6103a860048036038101906103a3919061217b565b610a41565b6040516103b59190611bc5565b60405180910390f35b6103d860048036038101906103d39190611e86565b610ad5565b005b6103e2610b5b565b6040516103ef9190611d36565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104d357506104d282610b81565b5b9050919050565b6060600080546104e9906121ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610515906121ea565b80156105625780601f1061053757610100808354040283529160200191610562565b820191906000526020600020905b81548152906001019060200180831161054557829003601f168201915b5050505050905090565b600061057782610beb565b5061058182610c73565b9050919050565b61059a8282610595610cb0565b610cb8565b5050565b6105a9838383610cca565b60008160001b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67212ee82856040518363ffffffff1660e01b815260040161060e92919061222a565b600060405180830381600087803b15801561062857600080fd5b505af115801561063c573d6000803e3d6000fd5b5050505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cd9061229f565b60405180910390fd5b6106e3818360001c610dcc565b8073ffffffffffffffffffffffffffffffffffffffff16827f478f558b68f3bcf40163e6b2efe106565bde2fa2784fbec8043d0ce58bc6832360405160405180910390a35050565b610746838383604051806020016040528060008152506109bb565b505050565b600061075682610beb565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107d05760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016107c79190611d36565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61081f610ec5565b6108296000610f4c565b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610883610ec5565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600180546108d6906121ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610902906121ea565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b61096b610964610cb0565b8383611012565b5050565b610977610ec5565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109c684848461059e565b6109d284848484611181565b50505050565b60606109e382610beb565b5060006109ee611338565b90506000815111610a0e5760405180602001604052806000815250610a39565b80610a188461134f565b604051602001610a299291906122fb565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610add610ec5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b4f5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610b469190611d36565b60405180910390fd5b610b5881610f4c565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080610bf78361141d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c6a57826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610c619190611ec2565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b610cc5838383600161145a565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d3c5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610d339190611d36565b60405180910390fd5b6000610d508383610d4b610cb0565b61161f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dc6578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610dbd9392919061231f565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e3e5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610e359190611d36565b60405180910390fd5b6000610e4c8383600061161f565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ec05760006040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401610eb79190611d36565b60405180910390fd5b505050565b610ecd610cb0565b73ffffffffffffffffffffffffffffffffffffffff16610eeb610851565b73ffffffffffffffffffffffffffffffffffffffff1614610f4a57610f0e610cb0565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610f419190611d36565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361108357816040517f5b08ba1800000000000000000000000000000000000000000000000000000000815260040161107a9190611d36565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111749190611bc5565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611332578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026111c5610cb0565b8685856040518563ffffffff1660e01b81526004016111e794939291906123ab565b6020604051808303816000875af192505050801561122357506040513d601f19601f82011682018060405250810190611220919061240c565b60015b6112a7573d8060008114611253576040519150601f19603f3d011682016040523d82523d6000602084013e611258565b606091505b50600081510361129f57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016112969190611d36565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461133057836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016113279190611d36565b60405180910390fd5b505b50505050565b606060405180602001604052806000815250905090565b60606000600161135e84611839565b01905060008167ffffffffffffffff81111561137d5761137c611fcd565b5b6040519080825280601f01601f1916602001820160405280156113af5781602001600182028036833780820191505090505b509050600082602001820190505b600115611412578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161140657611405612439565b5b049450600085036113bd575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806114935750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156115c75760006114a384610beb565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561150e57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611521575061151f8184610a41565b155b1561156357826040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161155a9190611d36565b60405180910390fd5b81156115c557838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60008061162b8461141d565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461166d5761166c81848661198c565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116fe576116af60008560008061145a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611781576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611897577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161188d5761188c612439565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106118d4576d04ee2d6d415b85acef810000000083816118ca576118c9612439565b5b0492506020810190505b662386f26fc10000831061190357662386f26fc1000083816118f9576118f8612439565b5b0492506010810190505b6305f5e100831061192c576305f5e100838161192257611921612439565b5b0492506008810190505b612710831061195157612710838161194757611946612439565b5b0492506004810190505b60648310611974576064838161196a57611969612439565b5b0492506002810190505b600a8310611983576001810190505b80915050919050565b611997838383611a50565b611a4b57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a0c57806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611a039190611ec2565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611a42929190612468565b60405180910390fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b0857508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ac95750611ac88484610a41565b5b80611b0757508273ffffffffffffffffffffffffffffffffffffffff16611aef83610c73565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b5a81611b25565b8114611b6557600080fd5b50565b600081359050611b7781611b51565b92915050565b600060208284031215611b9357611b92611b1b565b5b6000611ba184828501611b68565b91505092915050565b60008115159050919050565b611bbf81611baa565b82525050565b6000602082019050611bda6000830184611bb6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c1a578082015181840152602081019050611bff565b60008484015250505050565b6000601f19601f8301169050919050565b6000611c4282611be0565b611c4c8185611beb565b9350611c5c818560208601611bfc565b611c6581611c26565b840191505092915050565b60006020820190508181036000830152611c8a8184611c37565b905092915050565b6000819050919050565b611ca581611c92565b8114611cb057600080fd5b50565b600081359050611cc281611c9c565b92915050565b600060208284031215611cde57611cdd611b1b565b5b6000611cec84828501611cb3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d2082611cf5565b9050919050565b611d3081611d15565b82525050565b6000602082019050611d4b6000830184611d27565b92915050565b611d5a81611d15565b8114611d6557600080fd5b50565b600081359050611d7781611d51565b92915050565b60008060408385031215611d9457611d93611b1b565b5b6000611da285828601611d68565b9250506020611db385828601611cb3565b9150509250929050565b600080600060608486031215611dd657611dd5611b1b565b5b6000611de486828701611d68565b9350506020611df586828701611d68565b9250506040611e0686828701611cb3565b9150509250925092565b6000819050919050565b611e2381611e10565b8114611e2e57600080fd5b50565b600081359050611e4081611e1a565b92915050565b60008060408385031215611e5d57611e5c611b1b565b5b6000611e6b85828601611e31565b9250506020611e7c85828601611d68565b9150509250929050565b600060208284031215611e9c57611e9b611b1b565b5b6000611eaa84828501611d68565b91505092915050565b611ebc81611c92565b82525050565b6000602082019050611ed76000830184611eb3565b92915050565b6000819050919050565b6000611f02611efd611ef884611cf5565b611edd565b611cf5565b9050919050565b6000611f1482611ee7565b9050919050565b6000611f2682611f09565b9050919050565b611f3681611f1b565b82525050565b6000602082019050611f516000830184611f2d565b92915050565b611f6081611baa565b8114611f6b57600080fd5b50565b600081359050611f7d81611f57565b92915050565b60008060408385031215611f9a57611f99611b1b565b5b6000611fa885828601611d68565b9250506020611fb985828601611f6e565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61200582611c26565b810181811067ffffffffffffffff8211171561202457612023611fcd565b5b80604052505050565b6000612037611b11565b90506120438282611ffc565b919050565b600067ffffffffffffffff82111561206357612062611fcd565b5b61206c82611c26565b9050602081019050919050565b82818337600083830152505050565b600061209b61209684612048565b61202d565b9050828152602081018484840111156120b7576120b6611fc8565b5b6120c2848285612079565b509392505050565b600082601f8301126120df576120de611fc3565b5b81356120ef848260208601612088565b91505092915050565b6000806000806080858703121561211257612111611b1b565b5b600061212087828801611d68565b945050602061213187828801611d68565b935050604061214287828801611cb3565b925050606085013567ffffffffffffffff81111561216357612162611b20565b5b61216f878288016120ca565b91505092959194509250565b6000806040838503121561219257612191611b1b565b5b60006121a085828601611d68565b92505060206121b185828601611d68565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061220257607f821691505b602082108103612215576122146121bb565b5b50919050565b61222481611e10565b82525050565b600060408201905061223f600083018561221b565b61224c6020830184611d27565b9392505050565b7f4f6e6c7920636f6e74726f6c6c65722063616e2063616c6c2074686973000000600082015250565b6000612289601d83611beb565b915061229482612253565b602082019050919050565b600060208201905081810360008301526122b88161227c565b9050919050565b600081905092915050565b60006122d582611be0565b6122df81856122bf565b93506122ef818560208601611bfc565b80840191505092915050565b600061230782856122ca565b915061231382846122ca565b91508190509392505050565b60006060820190506123346000830186611d27565b6123416020830185611eb3565b61234e6040830184611d27565b949350505050565b600081519050919050565b600082825260208201905092915050565b600061237d82612356565b6123878185612361565b9350612397818560208601611bfc565b6123a081611c26565b840191505092915050565b60006080820190506123c06000830187611d27565b6123cd6020830186611d27565b6123da6040830185611eb3565b81810360608301526123ec8184612372565b905095945050505050565b60008151905061240681611b51565b92915050565b60006020828403121561242257612421611b1b565b5b6000612430848285016123f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600060408201905061247d6000830185611d27565b61248a6020830184611eb3565b939250505056fea2646970667358221220fa1b3cad123a4e5fdeb2a81ed51a51943dbb2a78ea27e81b28d643c12cef46a264736f6c63430008180033000000000000000000000000db8487b02462ce2265132e311789a3f6cff94a62