0x608060405234801561001057600080fd5b50600436106102ff5760003560e01c80638da5cb5b1161019c578063cc8463c8116100ee578063e744092e11610097578063f67e607011610071578063f67e6070146107c0578063f9052bea146107d3578063ff5528e0146107f357600080fd5b8063e744092e14610777578063ec6686ad1461079a578063f0f44260146107ad57600080fd5b8063d547741f116100c8578063d547741f14610749578063d602b9fd1461075c578063e3f4ce551461076457600080fd5b8063cc8463c8146106ed578063cefc1429146106f5578063cf6eefb7146106fd57600080fd5b8063a20e7d4711610150578063a693577c1161012a578063a693577c1461068e578063aafa2d69146106b5578063c5f956af146106c857600080fd5b8063a20e7d471461064c578063a217fddf14610673578063a46e82d21461067b57600080fd5b806391d148541161018157806391d14854146105ce578063986d7a6914610612578063a1eda53c1461062557600080fd5b80638da5cb5b146105b357806390469a9d146105bb57600080fd5b8063424e6575116102555780636406c10c1161020957806377bef613116101e357806377bef613146105635780638456cb591461056c57806384ef8ffc1461057457600080fd5b80636406c10c146104cc578063649a5ec71461053d5780636ff1c9bc1461055057600080fd5b80635c6a93841161023a5780635c6a9384146104a55780635c975abb146104ae578063634e93da146104b957600080fd5b8063424e65751461040f5780635676659b1461049257600080fd5b806319b2a6b9116102b757806336568abe1161029157806336568abe146103e15780633f4ba83a146103f45780634178617f146103fc57600080fd5b806319b2a6b91461038a578063248a9ca31461039d5780632f2ff15d146103ce57600080fd5b8063052d9e7e116102e8578063052d9e7e146103485780630aa6220b1461035d578063184d69ab1461036557600080fd5b806301ffc9a714610304578063022d63fb1461032c575b600080fd5b61031761031236600461310c565b610806565b60405190151581526020015b60405180910390f35b620697805b60405165ffffffffffff9091168152602001610323565b61035b61035636600461315c565b610862565b005b61035b6108f2565b6004546103179074010000000000000000000000000000000000000000900460ff1681565b61035b610398366004613179565b610908565b6103c06103ab3660046131a5565b60009081526020819052604090206001015490565b604051908152602001610323565b61035b6103dc3660046131e0565b610b95565b61035b6103ef3660046131e0565b610bda565b61035b610cdf565b61035b61040a366004613210565b610cf2565b61048061041d3660046131a5565b60096020526000908152604090208054600182015460028301546003840154600490940154929373ffffffffffffffffffffffffffffffffffffffff808416947401000000000000000000000000000000000000000090940460ff169391169086565b60405161032396959493929190613297565b61035b6104a03660046132ff565b610def565b6103c060065481565b60035460ff16610317565b61035b6104c7366004613210565b610eaa565b6104806104da3660046131a5565b60076020526000908152604090208054600182015460028301546003840154600490940154929373ffffffffffffffffffffffffffffffffffffffff808416947401000000000000000000000000000000000000000090940460ff169391169086565b61035b61054b366004613364565b610ebe565b61035b61055e366004613210565b610ed2565b6103c060085481565b61035b610fe5565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610323565b61058e610ff8565b61035b6105c9366004613210565b61101e565b6103176105dc3660046131e0565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61035b61062036600461338c565b6110af565b61062d6112fd565b6040805165ffffffffffff938416815292909116602083015201610323565b6103c07fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b81565b6103c0600081565b61035b610689366004613179565b611379565b61058e7f00000000000000000000000066a1e37c9b0eaddca17d3662d6c05f4decf3e11081565b61035b6106c3366004613210565b6115fb565b60035461058e90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103316116ec565b61035b61178a565b6001546040805173ffffffffffffffffffffffffffffffffffffffff831681527401000000000000000000000000000000000000000090920465ffffffffffff16602083015201610323565b61035b6107573660046131e0565b6117e6565b61035b611827565b61035b6107723660046131a5565b61183a565b610317610785366004613210565b60056020526000908152604090205460ff1681565b61035b6107a83660046133c1565b6119bb565b61035b6107bb366004613210565b611a8c565b61035b6107ce36600461340a565b611b1b565b60045461058e9073ffffffffffffffffffffffffffffffffffffffff1681565b61035b6108013660046131a5565b611d8b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f3149878600000000000000000000000000000000000000000000000000000000148061085c575061085c82611ef2565b92915050565b600061086d81611f89565b6004805483151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f411283ae1b0e68089790510eb77ccad9b761295be576637799607c8ae066fe9f906108e690841515815260200190565b60405180910390a15050565b60006108fd81611f89565b610905611f93565b50565b7fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b61093281611f89565b600083815260096020526040902060010154839073ffffffffffffffffffffffffffffffffffffffff1661099a576040517fa5cadfbe000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b6000848152600960205260408120600181015490916109d39174010000000000000000000000000000000000000000900460ff16611fa0565b8060040154841015610a1e576004808201546040517fda9754750000000000000000000000000000000000000000000000000000000081529182018690526024820152604401610991565b6001810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556003808201549054600283015473ffffffffffffffffffffffffffffffffffffffff92831692610a9a92849261010090910490911690611fff565b60018201546040517f7ed9db590000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff9182166024820152604481018790527f00000000000000000000000066a1e37c9b0eaddca17d3662d6c05f4decf3e11091821690637ed9db5990606401600060405180830381600087803b158015610b3857600080fd5b505af1158015610b4c573d6000803e3d6000fd5b5050505086887f2f78b4436cbdcae9d74f9f2699396a3d28cd2ab069518d23be6b25cd29e4996388604051610b8391815260200190565b60405180910390a35050505050505050565b81610bcc576040517f3fc3c27a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bd68282612085565b5050565b81158015610c02575060025473ffffffffffffffffffffffffffffffffffffffff8281169116145b15610cd55760015473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900465ffffffffffff1681151580610c56575065ffffffffffff8116155b80610c6957504265ffffffffffff821610155b15610caa576040517f19ca5ebb00000000000000000000000000000000000000000000000000000000815265ffffffffffff82166004820152602401610991565b5050600180547fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff1690555b610bd682826120b0565b6000610cea81611f89565b610905612109565b6000610cfd81611f89565b610d0682612186565b508173ffffffffffffffffffffffffffffffffffffffff163b600003610d70576040517f7330680300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610991565b73ffffffffffffffffffffffffffffffffffffffff821660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527ff849d00bc67e9e4bf072df9680646c59b8c5380160834c2e1d4896ce5ec81f7591016108e6565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810185905260ff8416608482015260a4810183905260c48101829052879073ffffffffffffffffffffffffffffffffffffffff82169063d505accf9060e401600060405180830381600087803b158015610e8357600080fd5b505af1925050508015610e94575060015b50610ea08888886110af565b5050505050505050565b6000610eb581611f89565b610bd6826121d9565b6000610ec981611f89565b610bd682612259565b6000610edd81611f89565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610f4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6e9190613442565b9050610f9173ffffffffffffffffffffffffffffffffffffffff84163383611fff565b6040805173ffffffffffffffffffffffffffffffffffffffff85168152602081018390527f2e39961a70a10f4d46383948095ac2752b3ee642a7c76aa827410aaff08c2e51910160405180910390a1505050565b6000610ff081611f89565b6109056122c2565b600061101960025473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b600061102981611f89565b61103282612186565b5073ffffffffffffffffffffffffffffffffffffffff821660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527fbf996b4fd74f0c7159bb017b1db415b0d9a6f13129f46d0b93309d170b78df3191016108e6565b60045474010000000000000000000000000000000000000000900460ff1680156111695750600480546040517fb23bc7d7000000000000000000000000000000000000000000000000000000008152339281019290925273ffffffffffffffffffffffffffffffffffffffff169063b23bc7d790602401602060405180830381865afa158015611143573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611167919061345b565b155b156111a2576040517f30ac863d000000000000000000000000000000000000000000000000000000008152336004820152602401610991565b826111ac81612186565b5073ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff16611224576040517f94403b7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610991565b61122c61231d565b6112358361235a565b61125773ffffffffffffffffffffffffffffffffffffffff8516333086612397565b60006112648585856123dd565b9050806020015173ffffffffffffffffffffffffffffffffffffffff1681600001517f7f382249e1e2d2be5b5e769bbd3abd8e092fc5932a37d3819055e2c88c8540f8836080015184606001518560a001516040516112ee9392919073ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b60405180910390a35050505050565b6002546000907a010000000000000000000000000000000000000000000000000000900465ffffffffffff16801515801561134057504265ffffffffffff821610155b61134c57600080611371565b60025474010000000000000000000000000000000000000000900465ffffffffffff16815b915091509091565b7fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b6113a381611f89565b600083815260076020526040902060010154839073ffffffffffffffffffffffffffffffffffffffff16611406576040517fe0a3cff500000000000000000000000000000000000000000000000000000000815260048101829052602401610991565b60008481526007602052604081206001810154909161143f9174010000000000000000000000000000000000000000900460ff16611fa0565b806004015484101561148a576004808201546040517fe1330b2a0000000000000000000000000000000000000000000000000000000081529182018690526024820152604401610991565b600181018054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90911617905560028101546040517f346a90740000000000000000000000000000000000000000000000000000000081526004810188905230602482015260448101919091527f00000000000000000000000066a1e37c9b0eaddca17d3662d6c05f4decf3e1109073ffffffffffffffffffffffffffffffffffffffff82169063346a907490606401600060405180830381600087803b15801561156a57600080fd5b505af115801561157e573d6000803e3d6000fd5b505050600183015460038401546115b2925073ffffffffffffffffffffffffffffffffffffffff9081169133911688612397565b6002820154604080519182526020820187905287917fbf79ce6ffda2b262d7c1d31cde3fbde100c49885be80ba25764dc18e0256b54f910160405180910390a250505050505050565b600061160681611f89565b61160f82612186565b508173ffffffffffffffffffffffffffffffffffffffff163b600003611679576040517f54b1211f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610991565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040519081527fe462dc805cb3ffeb7c059557b4fe0b57a01a6c6ca928941561baf95e8834ef20906020016108e6565b6002546000907a010000000000000000000000000000000000000000000000000000900465ffffffffffff16801515801561172e57504265ffffffffffff8216105b611760576001547a010000000000000000000000000000000000000000000000000000900465ffffffffffff16611784565b60025474010000000000000000000000000000000000000000900465ffffffffffff165b91505090565b60015473ffffffffffffffffffffffffffffffffffffffff163381146117de576040517fc22c8022000000000000000000000000000000000000000000000000000000008152336004820152602401610991565b61090561256a565b8161181d576040517f3fc3c27a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bd6828261265d565b600061183281611f89565b610905612682565b600081815260076020526040902060010154819073ffffffffffffffffffffffffffffffffffffffff1661189d576040517fe0a3cff500000000000000000000000000000000000000000000000000000000815260048101829052602401610991565b600082815260076020526040902060018101546118d09073ffffffffffffffffffffffffffffffffffffffff163361268d565b60018101546118fc9060009074010000000000000000000000000000000000000000900460ff16611fa0565b600181018054740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915560028201547f00000000000000000000000066a1e37c9b0eaddca17d3662d6c05f4decf3e1109161198a9173ffffffffffffffffffffffffffffffffffffffff808516921690611fff565b60405184907fd4ad51f415ebcb45bd9f8dfd5db6d35f987fdf5ebb909bcc3322990f140bc88e90600090a250505050565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810185905260ff8416608482015260a4810183905260c481018290527f00000000000000000000000066a1e37c9b0eaddca17d3662d6c05f4decf3e1109073ffffffffffffffffffffffffffffffffffffffff82169063d505accf9060e401600060405180830381600087803b158015611a6f57600080fd5b505af1925050508015611a80575060015b50610ea0888888611b1b565b6000611a9781611f89565b611aa082612186565b50600380547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8516908102919091179091556040519081527f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f906020016108e6565b60045474010000000000000000000000000000000000000000900460ff168015611bd55750600480546040517fb23bc7d7000000000000000000000000000000000000000000000000000000008152339281019290925273ffffffffffffffffffffffffffffffffffffffff169063b23bc7d790602401602060405180830381865afa158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd3919061345b565b155b15611c0e576040517f30ac863d000000000000000000000000000000000000000000000000000000008152336004820152602401610991565b81611c1881612186565b5073ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff16611c90576040517f94403b7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610991565b611c9861231d565b611ca18461235a565b7f00000000000000000000000066a1e37c9b0eaddca17d3662d6c05f4decf3e110611ce473ffffffffffffffffffffffffffffffffffffffff8216333088612397565b6000611cf1858786612712565b9050806020015173ffffffffffffffffffffffffffffffffffffffff1681600001517f09fdc4f6581c246c961bfa60d4a4d0d0f26a4bc0d47082a0f628bc8c92ea98f4836080015184606001518560a00151604051611d7b9392919073ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b60405180910390a3505050505050565b600081815260096020526040902060010154819073ffffffffffffffffffffffffffffffffffffffff16611dee576040517fa5cadfbe00000000000000000000000000000000000000000000000000000000815260048101829052602401610991565b60008281526009602052604090206001810154611e219073ffffffffffffffffffffffffffffffffffffffff163361268d565b6001810154611e4d9060009074010000000000000000000000000000000000000000900460ff16611fa0565b600181018054740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8216179091556003820154600283015473ffffffffffffffffffffffffffffffffffffffff91821692611ec1928492911690611fff565b60405184907f0ae44e75c55e53fff935759d2cd72009d85ed130f95829e8aab2ad776ee29c4590600090a250505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061085c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461085c565b610905813361289e565b611f9e600080612924565b565b806002811115611fb257611fb261322d565b826002811115611fc457611fc461322d565b14610bd65781816040517f074104ef000000000000000000000000000000000000000000000000000000008152600401610991929190613478565b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261208091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a7e565b505050565b6000828152602081905260409020600101546120a081611f89565b6120aa8383612b14565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146120ff576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120808282612bd4565b612111612c36565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff82166121d5576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b60006121e36116ec565b6121ec42612c72565b6121f691906134c2565b90506122028282612cbe565b60405165ffffffffffff8216815273ffffffffffffffffffffffffffffffffffffffff8316907f3377dc44241e779dd06afab5b788a35ca5f3b778836e2990bdb26a2a4b2e5ed69060200160405180910390a25050565b600061226482612d5a565b61226d42612c72565b61227791906134c2565b90506122838282612924565b6040805165ffffffffffff8085168252831660208201527ff1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b91016108e6565b6122ca61231d565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861215c3390565b60035460ff1615611f9e576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610905576040517f3728b83d00000000000000000000000000000000000000000000000000000000815260048101829052602401610991565b60405173ffffffffffffffffffffffffffffffffffffffff84811660248301528381166044830152606482018390526120aa9186918216906323b872dd90608401612039565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506008546040805160c08101825282815233602080830191825260008385018181526060850189905273ffffffffffffffffffffffffffffffffffffffff8a8116608087015260a086018990528783526009909352949020835181559151600183018054919092167fffffffffffffffffffffffff00000000000000000000000000000000000000008216811783559451939594869492917fffffffffffffffffffffff0000000000000000000000000000000000000000001617740100000000000000000000000000000000000000008360028111156124f2576124f261322d565b02179055506060820151600282015560808201516003820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905560a090910151600490910155506008805460010190555b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900465ffffffffffff168015806125ba57504265ffffffffffff821610155b156125fb576040517f19ca5ebb00000000000000000000000000000000000000000000000000000000815265ffffffffffff82166004820152602401610991565b612624600061261f60025473ffffffffffffffffffffffffffffffffffffffff1690565b612bd4565b50612630600083612b14565b5050600180547fffffffffffff000000000000000000000000000000000000000000000000000016905550565b60008281526020819052604090206001015461267881611f89565b6120aa8383612bd4565b611f9e600080612cbe565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610bd6576040517f95eed10500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808416600483015282166024820152604401610991565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506006546040805160c08101825282815233602080830191825260008385018181526060850189905273ffffffffffffffffffffffffffffffffffffffff8a8116608087015260a086018990528783526007909352949020835181559151600183018054919092167fffffffffffffffffffffffff00000000000000000000000000000000000000008216811783559451939594869492917fffffffffffffffffffffff0000000000000000000000000000000000000000001617740100000000000000000000000000000000000000008360028111156128275761282761322d565b02179055506060820151600282015560808201516003820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905560a090910151600490910155506006805460010190559392505050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610bd6576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260248101839052604401610991565b6002547a010000000000000000000000000000000000000000000000000000900465ffffffffffff1680156129f9574265ffffffffffff821610156129cf576002546001805479ffffffffffffffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000090920465ffffffffffff167a010000000000000000000000000000000000000000000000000000029190911790556129f9565b6040517f2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec590600090a15b506002805473ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000065ffffffffffff9485160279ffffffffffffffffffffffffffffffffffffffffffffffffffff16177a0100000000000000000000000000000000000000000000000000009290931691909102919091179055565b6000612aa073ffffffffffffffffffffffffffffffffffffffff841683612da2565b90508051600014158015612ac5575080806020019051810190612ac3919061345b565b155b15612080576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610991565b600082612bca576000612b3c60025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614612b89576040517f3fc3c27a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b6125638383612db0565b600082158015612bfe575060025473ffffffffffffffffffffffffffffffffffffffff8381169116145b15612c2c57600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b6125638383612eac565b60035460ff16611f9e576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600065ffffffffffff8211156121d5576040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526030600482015260248101839052604401610991565b600180547401000000000000000000000000000000000000000065ffffffffffff84811682027fffffffffffff0000000000000000000000000000000000000000000000000000841673ffffffffffffffffffffffffffffffffffffffff881617179093559004168015612080576040517f8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a960510990600090a1505050565b600080612d656116ec565b90508065ffffffffffff168365ffffffffffff1611612d8d57612d8883826134e8565b612563565b61256365ffffffffffff841662069780612f67565b606061256383836000612f7d565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16612ea45760008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612e423390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161085c565b50600061085c565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615612ea45760008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161085c565b6000818310612f765781612563565b5090919050565b606081471015612fbb576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610991565b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051612fe49190613507565b60006040518083038185875af1925050503d8060008114613021576040519150601f19603f3d011682016040523d82523d6000602084013e613026565b606091505b5091509150613036868383613040565b9695505050505050565b60608261305057612d88826130ca565b8151158015613074575073ffffffffffffffffffffffffffffffffffffffff84163b155b156130c3576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610991565b5080612563565b8051156130da5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561311e57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461256357600080fd5b801515811461090557600080fd5b60006020828403121561316e57600080fd5b81356125638161314e565b60008060006060848603121561318e57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156131b757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461090557600080fd5b600080604083850312156131f357600080fd5b823591506020830135613205816131be565b809150509250929050565b60006020828403121561322257600080fd5b8135612563816131be565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613293577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b86815273ffffffffffffffffffffffffffffffffffffffff868116602083015260c08201906132c9604084018861325c565b8560608401528085166080840152508260a0830152979650505050505050565b803560ff811681146132fa57600080fd5b919050565b600080600080600080600060e0888a03121561331a57600080fd5b8735613325816131be565b9650602088013595506040880135945060608801359350613348608089016132e9565b925060a0880135915060c0880135905092959891949750929550565b60006020828403121561337657600080fd5b813565ffffffffffff8116811461256357600080fd5b6000806000606084860312156133a157600080fd5b83356133ac816131be565b95602085013595506040909401359392505050565b600080600080600080600060e0888a0312156133dc57600080fd5b8735965060208801356133ee816131be565b95506040880135945060608801359350613348608089016132e9565b60008060006060848603121561341f57600080fd5b833592506020840135613431816131be565b929592945050506040919091013590565b60006020828403121561345457600080fd5b5051919050565b60006020828403121561346d57600080fd5b81516125638161314e565b60408101613486828561325c565b612563602083018461325c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b65ffffffffffff8181168382160190808211156134e1576134e1613493565b5092915050565b65ffffffffffff8281168282160390808211156134e1576134e1613493565b6000825160005b81811015613528576020818601810151858301520161350e565b50600092019182525091905056fea2646970667358221220b985d7ec9a5f3ac717f105f4a182fc0800cb1474c684b914246eaa50716d428464736f6c63430008190033
0x60a060405234801561001057600080fd5b506040516139e93803806139e983398101604081905261002f91610332565b62015180338061005a57604051636116401160e11b8152600060048201526024015b60405180910390fd5b600180546001600160d01b0316600160d01b65ffffffffffff8516021790556100846000826101b8565b50506003805460ff191690555061009a84610229565b6001600160a01b03166080526100af83610229565b600380546001600160a01b039290921661010002610100600160a81b03199092169190911790556100df82610229565b600480546001600160a01b0319166001600160a01b039290921691909117905560005b815181101561019a57600082828151811061011f5761011f610429565b602002602001015190506101388161022960201b60201c565b50806001600160a01b03163b60000361016f57604051637330680360e01b81526001600160a01b0382166004820152602401610051565b6001600160a01b03166000908152600560205260409020805460ff1916600190811790915501610102565b50506004805460ff60a01b1916600160a01b1790555061043f915050565b6000826102165760006101d36002546001600160a01b031690565b6001600160a01b0316146101fa57604051631fe1e13d60e11b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0384161790555b6102208383610256565b90505b92915050565b60006001600160a01b0382166102525760405163d92e233d60e01b815260040160405180910390fd5b5090565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166102f8576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556102b03390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610223565b506000610223565b80516001600160a01b038116811461031757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561034857600080fd5b61035185610300565b93506020610360818701610300565b935061036e60408701610300565b60608701519093506001600160401b038082111561038b57600080fd5b818801915088601f83011261039f57600080fd5b8151818111156103b1576103b161031c565b8060051b604051601f19603f830116810181811085821117156103d6576103d661031c565b60405291825284820192508381018501918b8311156103f457600080fd5b938501935b828510156104195761040a85610300565b845293850193928501926103f9565b989b979a50959850505050505050565b634e487b7160e01b600052603260045260246000fd5b60805161356c61047d6000396000818161069301528181610af20152818161150f0152818161194601528181611a140152611ca3015261356c6000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c80638da5cb5b1161019c578063cc8463c8116100ee578063e744092e11610097578063f67e607011610071578063f67e6070146107c0578063f9052bea146107d3578063ff5528e0146107f357600080fd5b8063e744092e14610777578063ec6686ad1461079a578063f0f44260146107ad57600080fd5b8063d547741f116100c8578063d547741f14610749578063d602b9fd1461075c578063e3f4ce551461076457600080fd5b8063cc8463c8146106ed578063cefc1429146106f5578063cf6eefb7146106fd57600080fd5b8063a20e7d4711610150578063a693577c1161012a578063a693577c1461068e578063aafa2d69146106b5578063c5f956af146106c857600080fd5b8063a20e7d471461064c578063a217fddf14610673578063a46e82d21461067b57600080fd5b806391d148541161018157806391d14854146105ce578063986d7a6914610612578063a1eda53c1461062557600080fd5b80638da5cb5b146105b357806390469a9d146105bb57600080fd5b8063424e6575116102555780636406c10c1161020957806377bef613116101e357806377bef613146105635780638456cb591461056c57806384ef8ffc1461057457600080fd5b80636406c10c146104cc578063649a5ec71461053d5780636ff1c9bc1461055057600080fd5b80635c6a93841161023a5780635c6a9384146104a55780635c975abb146104ae578063634e93da146104b957600080fd5b8063424e65751461040f5780635676659b1461049257600080fd5b806319b2a6b9116102b757806336568abe1161029157806336568abe146103e15780633f4ba83a146103f45780634178617f146103fc57600080fd5b806319b2a6b91461038a578063248a9ca31461039d5780632f2ff15d146103ce57600080fd5b8063052d9e7e116102e8578063052d9e7e146103485780630aa6220b1461035d578063184d69ab1461036557600080fd5b806301ffc9a714610304578063022d63fb1461032c575b600080fd5b61031761031236600461310c565b610806565b60405190151581526020015b60405180910390f35b620697805b60405165ffffffffffff9091168152602001610323565b61035b61035636600461315c565b610862565b005b61035b6108f2565b6004546103179074010000000000000000000000000000000000000000900460ff1681565b61035b610398366004613179565b610908565b6103c06103ab3660046131a5565b60009081526020819052604090206001015490565b604051908152602001610323565b61035b6103dc3660046131e0565b610b95565b61035b6103ef3660046131e0565b610bda565b61035b610cdf565b61035b61040a366004613210565b610cf2565b61048061041d3660046131a5565b60096020526000908152604090208054600182015460028301546003840154600490940154929373ffffffffffffffffffffffffffffffffffffffff808416947401000000000000000000000000000000000000000090940460ff169391169086565b60405161032396959493929190613297565b61035b6104a03660046132ff565b610def565b6103c060065481565b60035460ff16610317565b61035b6104c7366004613210565b610eaa565b6104806104da3660046131a5565b60076020526000908152604090208054600182015460028301546003840154600490940154929373ffffffffffffffffffffffffffffffffffffffff808416947401000000000000000000000000000000000000000090940460ff169391169086565b61035b61054b366004613364565b610ebe565b61035b61055e366004613210565b610ed2565b6103c060085481565b61035b610fe5565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610323565b61058e610ff8565b61035b6105c9366004613210565b61101e565b6103176105dc3660046131e0565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61035b61062036600461338c565b6110af565b61062d6112fd565b6040805165ffffffffffff938416815292909116602083015201610323565b6103c07fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b81565b6103c0600081565b61035b610689366004613179565b611379565b61058e7f000000000000000000000000000000000000000000000000000000000000000081565b61035b6106c3366004613210565b6115fb565b60035461058e90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6103316116ec565b61035b61178a565b6001546040805173ffffffffffffffffffffffffffffffffffffffff831681527401000000000000000000000000000000000000000090920465ffffffffffff16602083015201610323565b61035b6107573660046131e0565b6117e6565b61035b611827565b61035b6107723660046131a5565b61183a565b610317610785366004613210565b60056020526000908152604090205460ff1681565b61035b6107a83660046133c1565b6119bb565b61035b6107bb366004613210565b611a8c565b61035b6107ce36600461340a565b611b1b565b60045461058e9073ffffffffffffffffffffffffffffffffffffffff1681565b61035b6108013660046131a5565b611d8b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f3149878600000000000000000000000000000000000000000000000000000000148061085c575061085c82611ef2565b92915050565b600061086d81611f89565b6004805483151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f411283ae1b0e68089790510eb77ccad9b761295be576637799607c8ae066fe9f906108e690841515815260200190565b60405180910390a15050565b60006108fd81611f89565b610905611f93565b50565b7fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b61093281611f89565b600083815260096020526040902060010154839073ffffffffffffffffffffffffffffffffffffffff1661099a576040517fa5cadfbe000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b6000848152600960205260408120600181015490916109d39174010000000000000000000000000000000000000000900460ff16611fa0565b8060040154841015610a1e576004808201546040517fda9754750000000000000000000000000000000000000000000000000000000081529182018690526024820152604401610991565b6001810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556003808201549054600283015473ffffffffffffffffffffffffffffffffffffffff92831692610a9a92849261010090910490911690611fff565b60018201546040517f7ed9db590000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff9182166024820152604481018790527f000000000000000000000000000000000000000000000000000000000000000091821690637ed9db5990606401600060405180830381600087803b158015610b3857600080fd5b505af1158015610b4c573d6000803e3d6000fd5b5050505086887f2f78b4436cbdcae9d74f9f2699396a3d28cd2ab069518d23be6b25cd29e4996388604051610b8391815260200190565b60405180910390a35050505050505050565b81610bcc576040517f3fc3c27a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bd68282612085565b5050565b81158015610c02575060025473ffffffffffffffffffffffffffffffffffffffff8281169116145b15610cd55760015473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900465ffffffffffff1681151580610c56575065ffffffffffff8116155b80610c6957504265ffffffffffff821610155b15610caa576040517f19ca5ebb00000000000000000000000000000000000000000000000000000000815265ffffffffffff82166004820152602401610991565b5050600180547fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff1690555b610bd682826120b0565b6000610cea81611f89565b610905612109565b6000610cfd81611f89565b610d0682612186565b508173ffffffffffffffffffffffffffffffffffffffff163b600003610d70576040517f7330680300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610991565b73ffffffffffffffffffffffffffffffffffffffff821660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527ff849d00bc67e9e4bf072df9680646c59b8c5380160834c2e1d4896ce5ec81f7591016108e6565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810185905260ff8416608482015260a4810183905260c48101829052879073ffffffffffffffffffffffffffffffffffffffff82169063d505accf9060e401600060405180830381600087803b158015610e8357600080fd5b505af1925050508015610e94575060015b50610ea08888886110af565b5050505050505050565b6000610eb581611f89565b610bd6826121d9565b6000610ec981611f89565b610bd682612259565b6000610edd81611f89565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610f4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6e9190613442565b9050610f9173ffffffffffffffffffffffffffffffffffffffff84163383611fff565b6040805173ffffffffffffffffffffffffffffffffffffffff85168152602081018390527f2e39961a70a10f4d46383948095ac2752b3ee642a7c76aa827410aaff08c2e51910160405180910390a1505050565b6000610ff081611f89565b6109056122c2565b600061101960025473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b600061102981611f89565b61103282612186565b5073ffffffffffffffffffffffffffffffffffffffff821660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527fbf996b4fd74f0c7159bb017b1db415b0d9a6f13129f46d0b93309d170b78df3191016108e6565b60045474010000000000000000000000000000000000000000900460ff1680156111695750600480546040517fb23bc7d7000000000000000000000000000000000000000000000000000000008152339281019290925273ffffffffffffffffffffffffffffffffffffffff169063b23bc7d790602401602060405180830381865afa158015611143573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611167919061345b565b155b156111a2576040517f30ac863d000000000000000000000000000000000000000000000000000000008152336004820152602401610991565b826111ac81612186565b5073ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff16611224576040517f94403b7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610991565b61122c61231d565b6112358361235a565b61125773ffffffffffffffffffffffffffffffffffffffff8516333086612397565b60006112648585856123dd565b9050806020015173ffffffffffffffffffffffffffffffffffffffff1681600001517f7f382249e1e2d2be5b5e769bbd3abd8e092fc5932a37d3819055e2c88c8540f8836080015184606001518560a001516040516112ee9392919073ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b60405180910390a35050505050565b6002546000907a010000000000000000000000000000000000000000000000000000900465ffffffffffff16801515801561134057504265ffffffffffff821610155b61134c57600080611371565b60025474010000000000000000000000000000000000000000900465ffffffffffff16815b915091509091565b7fd8a7a79547af723ee3e12b59a480111268d8969c634e1a34a144d2c8b91d635b6113a381611f89565b600083815260076020526040902060010154839073ffffffffffffffffffffffffffffffffffffffff16611406576040517fe0a3cff500000000000000000000000000000000000000000000000000000000815260048101829052602401610991565b60008481526007602052604081206001810154909161143f9174010000000000000000000000000000000000000000900460ff16611fa0565b806004015484101561148a576004808201546040517fe1330b2a0000000000000000000000000000000000000000000000000000000081529182018690526024820152604401610991565b600181018054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90911617905560028101546040517f346a90740000000000000000000000000000000000000000000000000000000081526004810188905230602482015260448101919091527f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff82169063346a907490606401600060405180830381600087803b15801561156a57600080fd5b505af115801561157e573d6000803e3d6000fd5b505050600183015460038401546115b2925073ffffffffffffffffffffffffffffffffffffffff9081169133911688612397565b6002820154604080519182526020820187905287917fbf79ce6ffda2b262d7c1d31cde3fbde100c49885be80ba25764dc18e0256b54f910160405180910390a250505050505050565b600061160681611f89565b61160f82612186565b508173ffffffffffffffffffffffffffffffffffffffff163b600003611679576040517f54b1211f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610991565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040519081527fe462dc805cb3ffeb7c059557b4fe0b57a01a6c6ca928941561baf95e8834ef20906020016108e6565b6002546000907a010000000000000000000000000000000000000000000000000000900465ffffffffffff16801515801561172e57504265ffffffffffff8216105b611760576001547a010000000000000000000000000000000000000000000000000000900465ffffffffffff16611784565b60025474010000000000000000000000000000000000000000900465ffffffffffff165b91505090565b60015473ffffffffffffffffffffffffffffffffffffffff163381146117de576040517fc22c8022000000000000000000000000000000000000000000000000000000008152336004820152602401610991565b61090561256a565b8161181d576040517f3fc3c27a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bd6828261265d565b600061183281611f89565b610905612682565b600081815260076020526040902060010154819073ffffffffffffffffffffffffffffffffffffffff1661189d576040517fe0a3cff500000000000000000000000000000000000000000000000000000000815260048101829052602401610991565b600082815260076020526040902060018101546118d09073ffffffffffffffffffffffffffffffffffffffff163361268d565b60018101546118fc9060009074010000000000000000000000000000000000000000900460ff16611fa0565b600181018054740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915560028201547f00000000000000000000000000000000000000000000000000000000000000009161198a9173ffffffffffffffffffffffffffffffffffffffff808516921690611fff565b60405184907fd4ad51f415ebcb45bd9f8dfd5db6d35f987fdf5ebb909bcc3322990f140bc88e90600090a250505050565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810185905260ff8416608482015260a4810183905260c481018290527f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff82169063d505accf9060e401600060405180830381600087803b158015611a6f57600080fd5b505af1925050508015611a80575060015b50610ea0888888611b1b565b6000611a9781611f89565b611aa082612186565b50600380547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8516908102919091179091556040519081527f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f906020016108e6565b60045474010000000000000000000000000000000000000000900460ff168015611bd55750600480546040517fb23bc7d7000000000000000000000000000000000000000000000000000000008152339281019290925273ffffffffffffffffffffffffffffffffffffffff169063b23bc7d790602401602060405180830381865afa158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd3919061345b565b155b15611c0e576040517f30ac863d000000000000000000000000000000000000000000000000000000008152336004820152602401610991565b81611c1881612186565b5073ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff16611c90576040517f94403b7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610991565b611c9861231d565b611ca18461235a565b7f0000000000000000000000000000000000000000000000000000000000000000611ce473ffffffffffffffffffffffffffffffffffffffff8216333088612397565b6000611cf1858786612712565b9050806020015173ffffffffffffffffffffffffffffffffffffffff1681600001517f09fdc4f6581c246c961bfa60d4a4d0d0f26a4bc0d47082a0f628bc8c92ea98f4836080015184606001518560a00151604051611d7b9392919073ffffffffffffffffffffffffffffffffffffffff9390931683526020830191909152604082015260600190565b60405180910390a3505050505050565b600081815260096020526040902060010154819073ffffffffffffffffffffffffffffffffffffffff16611dee576040517fa5cadfbe00000000000000000000000000000000000000000000000000000000815260048101829052602401610991565b60008281526009602052604090206001810154611e219073ffffffffffffffffffffffffffffffffffffffff163361268d565b6001810154611e4d9060009074010000000000000000000000000000000000000000900460ff16611fa0565b600181018054740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8216179091556003820154600283015473ffffffffffffffffffffffffffffffffffffffff91821692611ec1928492911690611fff565b60405184907f0ae44e75c55e53fff935759d2cd72009d85ed130f95829e8aab2ad776ee29c4590600090a250505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061085c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461085c565b610905813361289e565b611f9e600080612924565b565b806002811115611fb257611fb261322d565b826002811115611fc457611fc461322d565b14610bd65781816040517f074104ef000000000000000000000000000000000000000000000000000000008152600401610991929190613478565b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261208091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a7e565b505050565b6000828152602081905260409020600101546120a081611f89565b6120aa8383612b14565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146120ff576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120808282612bd4565b612111612c36565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff82166121d5576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090565b60006121e36116ec565b6121ec42612c72565b6121f691906134c2565b90506122028282612cbe565b60405165ffffffffffff8216815273ffffffffffffffffffffffffffffffffffffffff8316907f3377dc44241e779dd06afab5b788a35ca5f3b778836e2990bdb26a2a4b2e5ed69060200160405180910390a25050565b600061226482612d5a565b61226d42612c72565b61227791906134c2565b90506122838282612924565b6040805165ffffffffffff8085168252831660208201527ff1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b91016108e6565b6122ca61231d565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861215c3390565b60035460ff1615611f9e576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610905576040517f3728b83d00000000000000000000000000000000000000000000000000000000815260048101829052602401610991565b60405173ffffffffffffffffffffffffffffffffffffffff84811660248301528381166044830152606482018390526120aa9186918216906323b872dd90608401612039565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506008546040805160c08101825282815233602080830191825260008385018181526060850189905273ffffffffffffffffffffffffffffffffffffffff8a8116608087015260a086018990528783526009909352949020835181559151600183018054919092167fffffffffffffffffffffffff00000000000000000000000000000000000000008216811783559451939594869492917fffffffffffffffffffffff0000000000000000000000000000000000000000001617740100000000000000000000000000000000000000008360028111156124f2576124f261322d565b02179055506060820151600282015560808201516003820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905560a090910151600490910155506008805460010190555b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900465ffffffffffff168015806125ba57504265ffffffffffff821610155b156125fb576040517f19ca5ebb00000000000000000000000000000000000000000000000000000000815265ffffffffffff82166004820152602401610991565b612624600061261f60025473ffffffffffffffffffffffffffffffffffffffff1690565b612bd4565b50612630600083612b14565b5050600180547fffffffffffff000000000000000000000000000000000000000000000000000016905550565b60008281526020819052604090206001015461267881611f89565b6120aa8383612bd4565b611f9e600080612cbe565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610bd6576040517f95eed10500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808416600483015282166024820152604401610991565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506006546040805160c08101825282815233602080830191825260008385018181526060850189905273ffffffffffffffffffffffffffffffffffffffff8a8116608087015260a086018990528783526007909352949020835181559151600183018054919092167fffffffffffffffffffffffff00000000000000000000000000000000000000008216811783559451939594869492917fffffffffffffffffffffff0000000000000000000000000000000000000000001617740100000000000000000000000000000000000000008360028111156128275761282761322d565b02179055506060820151600282015560808201516003820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905560a090910151600490910155506006805460010190559392505050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610bd6576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260248101839052604401610991565b6002547a010000000000000000000000000000000000000000000000000000900465ffffffffffff1680156129f9574265ffffffffffff821610156129cf576002546001805479ffffffffffffffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000090920465ffffffffffff167a010000000000000000000000000000000000000000000000000000029190911790556129f9565b6040517f2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec590600090a15b506002805473ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000065ffffffffffff9485160279ffffffffffffffffffffffffffffffffffffffffffffffffffff16177a0100000000000000000000000000000000000000000000000000009290931691909102919091179055565b6000612aa073ffffffffffffffffffffffffffffffffffffffff841683612da2565b90508051600014158015612ac5575080806020019051810190612ac3919061345b565b155b15612080576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610991565b600082612bca576000612b3c60025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614612b89576040517f3fc3c27a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b6125638383612db0565b600082158015612bfe575060025473ffffffffffffffffffffffffffffffffffffffff8381169116145b15612c2c57600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b6125638383612eac565b60035460ff16611f9e576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600065ffffffffffff8211156121d5576040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526030600482015260248101839052604401610991565b600180547401000000000000000000000000000000000000000065ffffffffffff84811682027fffffffffffff0000000000000000000000000000000000000000000000000000841673ffffffffffffffffffffffffffffffffffffffff881617179093559004168015612080576040517f8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a960510990600090a1505050565b600080612d656116ec565b90508065ffffffffffff168365ffffffffffff1611612d8d57612d8883826134e8565b612563565b61256365ffffffffffff841662069780612f67565b606061256383836000612f7d565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16612ea45760008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612e423390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161085c565b50600061085c565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff1615612ea45760008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161085c565b6000818310612f765781612563565b5090919050565b606081471015612fbb576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610991565b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051612fe49190613507565b60006040518083038185875af1925050503d8060008114613021576040519150601f19603f3d011682016040523d82523d6000602084013e613026565b606091505b5091509150613036868383613040565b9695505050505050565b60608261305057612d88826130ca565b8151158015613074575073ffffffffffffffffffffffffffffffffffffffff84163b155b156130c3576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610991565b5080612563565b8051156130da5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006020828403121561311e57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461256357600080fd5b801515811461090557600080fd5b60006020828403121561316e57600080fd5b81356125638161314e565b60008060006060848603121561318e57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156131b757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461090557600080fd5b600080604083850312156131f357600080fd5b823591506020830135613205816131be565b809150509250929050565b60006020828403121561322257600080fd5b8135612563816131be565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613293577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b86815273ffffffffffffffffffffffffffffffffffffffff868116602083015260c08201906132c9604084018861325c565b8560608401528085166080840152508260a0830152979650505050505050565b803560ff811681146132fa57600080fd5b919050565b600080600080600080600060e0888a03121561331a57600080fd5b8735613325816131be565b9650602088013595506040880135945060608801359350613348608089016132e9565b925060a0880135915060c0880135905092959891949750929550565b60006020828403121561337657600080fd5b813565ffffffffffff8116811461256357600080fd5b6000806000606084860312156133a157600080fd5b83356133ac816131be565b95602085013595506040909401359392505050565b600080600080600080600060e0888a0312156133dc57600080fd5b8735965060208801356133ee816131be565b95506040880135945060608801359350613348608089016132e9565b60008060006060848603121561341f57600080fd5b833592506020840135613431816131be565b929592945050506040919091013590565b60006020828403121561345457600080fd5b5051919050565b60006020828403121561346d57600080fd5b81516125638161314e565b60408101613486828561325c565b612563602083018461325c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b65ffffffffffff8181168382160190808211156134e1576134e1613493565b5092915050565b65ffffffffffff8281168282160390808211156134e1576134e1613493565b6000825160005b81811015613528576020818601810151858301520161350e565b50600092019182525091905056fea2646970667358221220b985d7ec9a5f3ac717f105f4a182fc0800cb1474c684b914246eaa50716d428464736f6c6343000819003300000000000000000000000066a1e37c9b0eaddca17d3662d6c05f4decf3e110000000000000000000000000d63b6f7e0745272fb80b55dbc840e7dc29660d820000000000000000000000005943026e21e3936538620ba27e01525bba31125500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7