60806040523480156200001157600080fd5b50336040518060400160405280600781526020017f43656c6f4e4654000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f434e465400000000000000000000000000000000000000000000000000000000815250816000908162000090919062000472565b508060019081620000a2919062000472565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200011a5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200011191906200059e565b60405180910390fd5b6200012b816200013260201b60201c565b50620005bb565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200027a57607f821691505b60208210810362000290576200028f62000232565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002fa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002bb565b620003068683620002bb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003536200034d62000347846200031e565b62000328565b6200031e565b9050919050565b6000819050919050565b6200036f8362000332565b620003876200037e826200035a565b848454620002c8565b825550505050565b600090565b6200039e6200038f565b620003ab81848462000364565b505050565b5b81811015620003d357620003c760008262000394565b600181019050620003b1565b5050565b601f8211156200042257620003ec8162000296565b620003f784620002ab565b8101602085101562000407578190505b6200041f6200041685620002ab565b830182620003b0565b50505b505050565b600082821c905092915050565b6000620004476000198460080262000427565b1980831691505092915050565b600062000462838362000434565b9150826002028217905092915050565b6200047d82620001f8565b67ffffffffffffffff81111562000499576200049862000203565b5b620004a5825462000261565b620004b2828285620003d7565b600060209050601f831160018114620004ea5760008415620004d5578287015190505b620004e1858262000454565b86555062000551565b601f198416620004fa8662000296565b60005b828110156200052457848901518255600182019150602085019450602081019050620004fd565b8683101562000544578489015162000540601f89168262000434565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005868262000559565b9050919050565b620005988162000579565b82525050565b6000602082019050620005b560008301846200058d565b92915050565b61210480620005cb6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a2578063a22cb46511610071578063a22cb465146102a4578063b88d4fde146102c0578063c87b56dd146102dc578063e985e9c51461030c578063f2fde38b1461033c5761010b565b806370a082311461022e578063715018a61461025e5780638da5cb5b1461026857806395d89b41146102865761010b565b806323b872dd116100de57806323b872dd146101aa57806340d097c3146101c657806342842e0e146101e25780636352211e146101fe5761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a600480360381019061012591906118d7565b610358565b604051610137919061191f565b60405180910390f35b61014861043a565b60405161015591906119ca565b60405180910390f35b61017860048036038101906101739190611a22565b6104cc565b6040516101859190611a90565b60405180910390f35b6101a860048036038101906101a39190611ad7565b6104e8565b005b6101c460048036038101906101bf9190611b17565b6104fe565b005b6101e060048036038101906101db9190611b6a565b610600565b005b6101fc60048036038101906101f79190611b17565b610631565b005b61021860048036038101906102139190611a22565b610651565b6040516102259190611a90565b60405180910390f35b61024860048036038101906102439190611b6a565b610663565b6040516102559190611ba6565b60405180910390f35b61026661071d565b005b610270610731565b60405161027d9190611a90565b60405180910390f35b61028e61075b565b60405161029b91906119ca565b60405180910390f35b6102be60048036038101906102b99190611bed565b6107ed565b005b6102da60048036038101906102d59190611d62565b610803565b005b6102f660048036038101906102f19190611a22565b610820565b60405161030391906119ca565b60405180910390f35b61032660048036038101906103219190611de5565b610889565b604051610333919061191f565b60405180910390f35b61035660048036038101906103519190611b6a565b61091d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061042357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104335750610432826109a3565b5b9050919050565b60606000805461044990611e54565b80601f016020809104026020016040519081016040528092919081815260200182805461047590611e54565b80156104c25780601f10610497576101008083540402835291602001916104c2565b820191906000526020600020905b8154815290600101906020018083116104a557829003601f168201915b5050505050905090565b60006104d782610a0d565b506104e182610a95565b9050919050565b6104fa82826104f5610ad2565b610ada565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105705760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016105679190611a90565b60405180910390fd5b6000610584838361057f610ad2565b610aec565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105fa578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016105f193929190611e85565b60405180910390fd5b50505050565b610608610d06565b60006007600081548092919061061d90611eeb565b91905055905061062d8282610d8d565b5050565b61064c83838360405180602001604052806000815250610803565b505050565b600061065c82610a0d565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106d65760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016106cd9190611a90565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610725610d06565b61072f6000610dab565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461076a90611e54565b80601f016020809104026020016040519081016040528092919081815260200182805461079690611e54565b80156107e35780601f106107b8576101008083540402835291602001916107e3565b820191906000526020600020905b8154815290600101906020018083116107c657829003601f168201915b5050505050905090565b6107ff6107f8610ad2565b8383610e71565b5050565b61080e8484846104fe565b61081a84848484610fe0565b50505050565b606061082b82610a0d565b506000610836611197565b905060008151116108565760405180602001604052806000815250610881565b80610860846111ae565b604051602001610871929190611f6f565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610925610d06565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109975760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161098e9190611a90565b60405180910390fd5b6109a081610dab565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080610a198361127c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a8c57826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610a839190611ba6565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b610ae783838360016112b9565b505050565b600080610af88461127c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610b3a57610b3981848661147e565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bcb57610b7c6000856000806112b9565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610c4e576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b610d0e610ad2565b73ffffffffffffffffffffffffffffffffffffffff16610d2c610731565b73ffffffffffffffffffffffffffffffffffffffff1614610d8b57610d4f610ad2565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610d829190611a90565b60405180910390fd5b565b610da7828260405180602001604052806000815250611542565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee257816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610ed99190611a90565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fd3919061191f565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115611191578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611024610ad2565b8685856040518563ffffffff1660e01b81526004016110469493929190611fe8565b6020604051808303816000875af192505050801561108257506040513d601f19601f8201168201806040525081019061107f9190612049565b60015b611106573d80600081146110b2576040519150601f19603f3d011682016040523d82523d6000602084013e6110b7565b606091505b5060008151036110fe57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016110f59190611a90565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461118f57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016111869190611a90565b60405180910390fd5b505b50505050565b606060405180602001604052806000815250905090565b6060600060016111bd8461155e565b01905060008167ffffffffffffffff8111156111dc576111db611c37565b5b6040519080825280601f01601f19166020018201604052801561120e5781602001600182028036833780820191505090505b509050600082602001820190505b600115611271578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161126557611264612076565b5b0494506000850361121c575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806112f25750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561142657600061130284610a0d565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561136d57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611380575061137e8184610889565b155b156113c257826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016113b99190611a90565b60405180910390fd5b811561142457838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6114898383836116b1565b61153d57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114fe57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016114f59190611ba6565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016115349291906120a5565b60405180910390fd5b505050565b61154c8383611772565b6115596000848484610fe0565b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106115bc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816115b2576115b1612076565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106115f9576d04ee2d6d415b85acef810000000083816115ef576115ee612076565b5b0492506020810190505b662386f26fc10000831061162857662386f26fc10000838161161e5761161d612076565b5b0492506010810190505b6305f5e1008310611651576305f5e100838161164757611646612076565b5b0492506008810190505b612710831061167657612710838161166c5761166b612076565b5b0492506004810190505b60648310611699576064838161168f5761168e612076565b5b0492506002810190505b600a83106116a8576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561176957508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061172a57506117298484610889565b5b8061176857508273ffffffffffffffffffffffffffffffffffffffff1661175083610a95565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e45760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016117db9190611a90565b60405180910390fd5b60006117f283836000610aec565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118665760006040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260040161185d9190611a90565b60405180910390fd5b505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b48161187f565b81146118bf57600080fd5b50565b6000813590506118d1816118ab565b92915050565b6000602082840312156118ed576118ec611875565b5b60006118fb848285016118c2565b91505092915050565b60008115159050919050565b61191981611904565b82525050565b60006020820190506119346000830184611910565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611974578082015181840152602081019050611959565b60008484015250505050565b6000601f19601f8301169050919050565b600061199c8261193a565b6119a68185611945565b93506119b6818560208601611956565b6119bf81611980565b840191505092915050565b600060208201905081810360008301526119e48184611991565b905092915050565b6000819050919050565b6119ff816119ec565b8114611a0a57600080fd5b50565b600081359050611a1c816119f6565b92915050565b600060208284031215611a3857611a37611875565b5b6000611a4684828501611a0d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a7a82611a4f565b9050919050565b611a8a81611a6f565b82525050565b6000602082019050611aa56000830184611a81565b92915050565b611ab481611a6f565b8114611abf57600080fd5b50565b600081359050611ad181611aab565b92915050565b60008060408385031215611aee57611aed611875565b5b6000611afc85828601611ac2565b9250506020611b0d85828601611a0d565b9150509250929050565b600080600060608486031215611b3057611b2f611875565b5b6000611b3e86828701611ac2565b9350506020611b4f86828701611ac2565b9250506040611b6086828701611a0d565b9150509250925092565b600060208284031215611b8057611b7f611875565b5b6000611b8e84828501611ac2565b91505092915050565b611ba0816119ec565b82525050565b6000602082019050611bbb6000830184611b97565b92915050565b611bca81611904565b8114611bd557600080fd5b50565b600081359050611be781611bc1565b92915050565b60008060408385031215611c0457611c03611875565b5b6000611c1285828601611ac2565b9250506020611c2385828601611bd8565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c6f82611980565b810181811067ffffffffffffffff82111715611c8e57611c8d611c37565b5b80604052505050565b6000611ca161186b565b9050611cad8282611c66565b919050565b600067ffffffffffffffff821115611ccd57611ccc611c37565b5b611cd682611980565b9050602081019050919050565b82818337600083830152505050565b6000611d05611d0084611cb2565b611c97565b905082815260208101848484011115611d2157611d20611c32565b5b611d2c848285611ce3565b509392505050565b600082601f830112611d4957611d48611c2d565b5b8135611d59848260208601611cf2565b91505092915050565b60008060008060808587031215611d7c57611d7b611875565b5b6000611d8a87828801611ac2565b9450506020611d9b87828801611ac2565b9350506040611dac87828801611a0d565b925050606085013567ffffffffffffffff811115611dcd57611dcc61187a565b5b611dd987828801611d34565b91505092959194509250565b60008060408385031215611dfc57611dfb611875565b5b6000611e0a85828601611ac2565b9250506020611e1b85828601611ac2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e6c57607f821691505b602082108103611e7f57611e7e611e25565b5b50919050565b6000606082019050611e9a6000830186611a81565b611ea76020830185611b97565b611eb46040830184611a81565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611ef6826119ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f2857611f27611ebc565b5b600182019050919050565b600081905092915050565b6000611f498261193a565b611f538185611f33565b9350611f63818560208601611956565b80840191505092915050565b6000611f7b8285611f3e565b9150611f878284611f3e565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000611fba82611f93565b611fc48185611f9e565b9350611fd4818560208601611956565b611fdd81611980565b840191505092915050565b6000608082019050611ffd6000830187611a81565b61200a6020830186611a81565b6120176040830185611b97565b81810360608301526120298184611faf565b905095945050505050565b600081519050612043816118ab565b92915050565b60006020828403121561205f5761205e611875565b5b600061206d84828501612034565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006040820190506120ba6000830185611a81565b6120c76020830184611b97565b939250505056fea2646970667358221220703d42b909ed67a6d3bc2108fe57ce5175a793a575893baf45129090dbd2a19664736f6c63430008140033