0x608060405234801561001057600080fd5b506128c5806100206000396000f3fe60806040526004361061024a5760003560e01c80637cfc181811610139578063bd536e6e116100b6578063ddfafef61161007a578063ddfafef614610806578063e4050e2914610826578063ec97908214610846578063ecd6ce6e1461085c578063f9fa93451461087c578063fa34c84e1461089c57600080fd5b8063bd536e6e1461075f578063bfacba3d1461077f578063c4d66de8146107b2578063c995cddc146107d2578063ce46e046146107f257600080fd5b8063947a75b4116100fd578063947a75b4146106cc57806397eb575b146106df578063ae418095146106ff578063b6b6d77f1461071f578063bc4c34951461073f57600080fd5b80637cfc1818146105d05780637f027a1a146105f0578063805deb53146106105780638b636632146106465780638eff9ea41461066657600080fd5b80633ef19a9b116101c757806354fd4d501161018b57806354fd4d5014610544578063583b16ae1461055a5780636054b1751461057a578063679700d91461059a5780637694d2ec146105b057600080fd5b80633ef19a9b146104af5780633fa7f688146104cf5780634148f94c146104ef578063455154e514610504578063532f56941461052457600080fd5b80631cc672df1161020e5780631cc672df146103b05780631db2b0d9146103f05780632f1be8f91461041d5780633c0db7881461043d5780633d3690291461046157600080fd5b8063066e75131461026f578063082fc54d146102ab5780630a2e98e4146102fd57806311bed5bb146103455780631a4808d21461038357600080fd5b3661026a57604051631574f9f360e01b815260040160405180910390fd5b005b600080fd5b34801561027b57600080fd5b5061028f61028a3660046120e4565b6108bc565b6040805192151583526020830191909152015b60405180910390f35b3480156102b757600080fd5b506102e86102c6366004612114565b600090815260026020526040902060060154600160401b900463ffffffff1690565b60405163ffffffff90911681526020016102a2565b34801561030957600080fd5b50610332610318366004612114565b6000908152600260208190526040909120015461ffff1690565b60405161ffff90911681526020016102a2565b34801561035157600080fd5b506102e8610360366004612114565b600090815260026020526040902060060154640100000000900463ffffffff1690565b34801561038f57600080fd5b506103a361039e366004612114565b6108fc565b6040516102a2919061217a565b3480156103bc57600080fd5b506103e06103cb366004612114565b60009081526008602052604090205460ff1690565b60405190151581526020016102a2565b3480156103fc57600080fd5b5061041061040b36600461218d565b6109a1565b6040516102a291906121b9565b34801561042957600080fd5b5061026861043836600461221f565b6109cb565b34801561044957600080fd5b5061045360015481565b6040519081526020016102a2565b34801561046d57600080fd5b5061049761047c366004612114565b6000908152600260205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016102a2565b3480156104bb57600080fd5b5061028f6104ca3660046120e4565b610a7f565b3480156104db57600080fd5b506102686104ea36600461225c565b610ab3565b3480156104fb57600080fd5b50610453600281565b34801561051057600080fd5b5061026861051f3660046120e4565b610acb565b34801561053057600080fd5b5061026861053f3660046122f8565b610adb565b34801561055057600080fd5b5061045360075481565b34801561056657600080fd5b5061026861057536600461225c565b610c04565b34801561058657600080fd5b50610268610595366004612344565b610c14565b3480156105a657600080fd5b5061045360065481565b3480156105bc57600080fd5b506104106105cb36600461218d565b610c2a565b3480156105dc57600080fd5b506102686105eb3660046120e4565b610c49565b3480156105fc57600080fd5b5061026861060b366004612114565b610cb0565b34801561061c57600080fd5b506102e861062b366004612114565b60009081526002602052604090206006015463ffffffff1690565b34801561065257600080fd5b506102686106613660046120e4565b610d1c565b34801561067257600080fd5b506106b5610681366004612114565b6000908152600260208190526040909120908101546006909101546201000090910460ff90811692600160601b9092041690565b6040805192151583529015156020830152016102a2565b6103e06106da366004612394565b610d28565b3480156106eb57600080fd5b506102686106fa366004612434565b610dd6565b34801561070b57600080fd5b5061026861071a366004612114565b610de8565b34801561072b57600080fd5b5061026861073a36600461247e565b610e81565b34801561074b57600080fd5b5061026861075a366004612344565b610f59565b34801561076b57600080fd5b5061026861077a36600461221f565b610f68565b34801561078b57600080fd5b5061079f61079a366004612114565b61100d565b6040516102a297969594939291906124a1565b3480156107be57600080fd5b506102686107cd366004612500565b61111f565b3480156107de57600080fd5b506102686107ed366004612114565b61146f565b3480156107fe57600080fd5b5060006103e0565b34801561081257600080fd5b50600954610497906001600160a01b031681565b34801561083257600080fd5b50610268610841366004612434565b6114ba565b34801561085257600080fd5b5061045360045481565b34801561086857600080fd5b5061026861087736600461221f565b6114c7565b34801561088857600080fd5b5061026861089736600461252b565b61155b565b3480156108a857600080fd5b506102686108b7366004612500565b6116bb565b6000828152600260205260408120600681015482916108f0918591600160601b90910460ff1690600981019060070161174a565b915091505b9250929050565b600081815260026020526040902060010180546060919061091c906125ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610948906125ec565b80156109955780601f1061096a57610100808354040283529160200191610995565b820191906000526020600020905b81548152906001019060200180831161097857829003601f168201915b50505050509050919050565b60008381526002602052604090206060906003016109c0818585611824565b9150505b9392505050565b60008281526002602052604090205482906001600160a01b03163314610a0c5760405162461bcd60e51b8152600401610a0390612627565b60405180910390fd5b600083815260026020908152604091829020600601805467ffffffff00000000191664010000000063ffffffff8716908102919091179091558251868152918201527f3e49e2efeacab7e8344acd4e7940449bf62039aa3734c34fa6d3525654be810191015b60405180910390a1505050565b600082815260026020819052604082209081015482916108f09185916201000090910460ff1690600581019060030161174a565b610ac3868686600187878761190b565b505050505050565b610ad782826000611a50565b5050565b60008381526002602052604090205483906001600160a01b03163314610b135760405162461bcd60e51b8152600401610a0390612627565b60008383604051602001610b28929190612677565b60408051601f1981840301815291815281516020928301206000818152600390935291205490915015610b955760405162461bcd60e51b81526020600482015260156024820152746e6f6e2d756e69717565206d61726b65742055524960581b6044820152606401610a03565b600081815260036020908152604080832088905587835260029091529020610bc1906001018585612033565b507f6218b53065a32d32b3f52d9ad728c1b826a2aae15fc1ee92f83836debbcc1029858585604051610bf593929190612693565b60405180910390a15050505050565b610ac3868686600087878761190b565b610c2385856001868686611ac3565b5050505050565b60008381526002602052604090206060906007016109c0818585611824565b60008281526002602052604090205482906001600160a01b03163314610c815760405162461bcd60e51b8152600401610a0390612627565b5060009182526002602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000818152600260205260408120610ccb9060030133611ada565b90508015610ad7577f55e867ccc9ac324e2c193ce4ed25397fb890213c704685f2c9fbe5bd7507298682335b604080519283526001600160a01b039091166020830152015b60405180910390a15050565b610ad782826001611a50565b600080878730604051602001610d40939291906126b6565b60408051601f1981840301815291905280516020909101209050600080610d69878901896120e4565b9150915082600554148015610d8f5750806001600160a01b03168b6001600160a01b0316145b8015610db457506000828152600260205260409020546001600160a01b038681169116145b80610dc757506001600160a01b03851630145b9b9a5050505050505050505050565b610de38383836001611af8565b505050565b60008181526002602052604090205481906001600160a01b03163314610e205760405162461bcd60e51b8152600401610a0390612627565b60008281526008602052604090205460ff16610ad75760008281526008602052604090819020805460ff19166001179055517f9dc30b8eda31a6a144e092e5de600955523a6a925cc15cc1d1b9b4872cfa615590610d109084815260200190565b60008281526002602052604090205482906001600160a01b03163314610eb95760405162461bcd60e51b8152600401610a0390612627565b6127108261ffff161115610f015760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081c195c98d95b9d608a1b6044820152606401610a03565b600083815260026020818152604092839020909101805461ffff191661ffff86169081179091558251868152918201527f9c6f3e426c05d512408d4ecf517e5155756288155088ad45a81c0e111e3d18549101610a72565b610c2385856000868686611ac3565b60008281526002602052604090205482906001600160a01b03163314610fa05760405162461bcd60e51b8152600401610a0390612627565b60008381526002602090815260409182902060060180546bffffffff00000000000000001916600160401b63ffffffff8716908102919091179091558251868152918201527ff0275a50e761f3b1635fa59ce199b1f2268b3fcb7fbdfb18c21aa3d2d78aa7b79101610a72565b60008181526002602081905260408220805460068201549282015460019092018054859485948594606094869485946001600160a01b039093169363ffffffff808516946401000000008104821694600160401b90910490911692909161ffff8116916201000090910460ff16908390611086906125ec565b80601f01602080910402602001604051908101604052809291908181526020018280546110b2906125ec565b80156110ff5780601f106110d4576101008083540402835291602001916110ff565b820191906000526020600020905b8154815290600101906020018083116110e257829003601f168201915b505050505092509650965096509650965096509650919395979092949650565b600054610100900460ff1661113a5760005460ff161561113e565b303b155b6111a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a03565b600054610100900460ff161580156111c3576000805461ffff19166101011790555b600980546001600160a01b0319166001600160a01b038416908117909155604080516381fa6cd360e01b815290516381fa6cd391600480820192602092909190829003018186803b15801561121757600080fd5b505afa15801561122b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124f91906126dc565b6040805163a99e7e2960e01b81526004810191909152602960448201527f2875696e74323536206d61726b657449642c2061646472657373206c656e646560648201526872416464726573732960b81b60848201523060248201526001600160a01b03919091169063a99e7e299060a401602060405180830381600087803b1580156112da57600080fd5b505af11580156112ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131291906126f9565b600155600954604080516381fa6cd360e01b815290516001600160a01b03909216916381fa6cd391600480820192602092909190829003018186803b15801561135a57600080fd5b505afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139291906126dc565b6040805163a99e7e2960e01b81526004810191909152602b60448201527f2875696e74323536206d61726b657449642c206164647265737320626f72726f60648201526a776572416464726573732960a81b60848201523060248201526001600160a01b03919091169063a99e7e299060a401602060405180830381600087803b15801561141f57600080fd5b505af1158015611433573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145791906126f9565b6006558015610ad7576000805461ff00191690555050565b600081815260026020526040812061148a9060070133611ada565b90508015610ad7577f914ccbaf2f5c9c2f4b7c6be3497b6b2ceb6ce2d050aec6eb2e0e31b8f9f67f0c8233610cf7565b610de38383836000611af8565b60008281526002602052604090205482906001600160a01b031633146114ff5760405162461bcd60e51b8152600401610a0390612627565b600083815260026020908152604091829020600601805463ffffffff191663ffffffff86169081179091558251868152918201527fa04499c227e7a6de804e5a57e4b38990792373bd8d73b6c13ab76e40600748439101610a72565b6001600160a01b0389166115a95760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964206f776e6572206164647265737360581b6044820152606401610a03565b60006004600081546115ba90612728565b9182905550600081815260026020526040902080546001600160a01b0319166001600160a01b038d1617905590506115f3818484610adb565b6115fd818a6114c7565b61160781896109cb565b6116118187610e81565b61161b8188610f68565b841561164357600081815260026020819052604090912001805462ff00001916620100001790555b831561166c576000818152600260205260409020600601805460ff60601b1916600160601b1790555b896001600160a01b03167fa69fa77c6a90b171cf4e3d9a9dd6c4e56fbd1fbbdcf3925eaf600ccaa917feab826040516116a791815260200190565b60405180910390a250505050505050505050565b600260075414156117235760405162461bcd60e51b815260206004820152602c60248201527f436f6e747261637420616c726561647920757067726164656420746f206c617460448201526b6573742076657273696f6e2160a01b6064820152608401610a03565b6002600755600980546001600160a01b0319166001600160a01b0392909216919091179055565b60008084156118165761175d8387611c55565b80156117f357506009546001600160a01b03878116600090815260208790526040908190205490516330cd251f60e21b8152600481019190915291169063c334947c9060240160206040518083038186803b1580156117bb57600080fd5b505afa1580156117cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f39190612743565b6001600160a01b038716600090815260208690526040902054909250905061181b565b600191505b94509492505050565b6060600061183185611c77565b9050600061183f8486612760565b9050818111611902576000611854858361277f565b9050828111156118615750815b61186b8282612797565b67ffffffffffffffff811115611883576118836127ae565b6040519080825280602002602001820160405280156118ac578160200160208202803683370190505b509350815b818110156118ff576118c38882611c81565b8582815181106118d5576118d56127c4565b6001600160a01b0390921660209283029190910190910152806118f781612728565b9150506118b1565b50505b50509392505050565b836119185760065461191c565b6001545b80600581905550600080898960405160200161194b9291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405290506000600260008c815260200190815260200160002060000160009054906101000a90046001600160a01b03169050600960009054906101000a90046001600160a01b03166001600160a01b031663930ed0138b6005548c600087878e8e8e6040518a63ffffffff1660e01b81526004016119de999897969594939291906127da565b602060405180830381600087803b1580156119f857600080fd5b505af1158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3091906126f9565b92505050611a4089898389611c8d565b5050600060055550505050505050565b6000838152600260205260409020546001600160a01b0316336001600160a01b031614611ab65760405162461bcd60e51b81526020600482015260146024820152732737ba103a34329036b0b935b2ba1037bbb732b960611b6044820152606401610a03565b6000610c23848484611d99565b6000611ad0878787611d99565b5050505050505050565b6000611aef836001600160a01b038416611ea9565b90505b92915050565b80611b0557600654611b09565b6001545b60058190556000858152600260205260409020546001600160a01b0316336001600160a01b031614611b745760405162461bcd60e51b81526020600482015260146024820152732737ba103a34329036b0b935b2ba1037bbb732b960611b6044820152606401610a03565b6009546005546040516000926001600160a01b0316916309a954cd9188919088908690611bb9908d9086906020019182526001600160a01b0316602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611be895949392919061283b565b602060405180830381600087803b158015611c0257600080fd5b505af1158015611c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3a91906126f9565b9050611c4886868386611c8d565b5050600060055550505050565b6001600160a01b03811660009081526001830160205260408120541515611aef565b6000611af2825490565b6000611aef8383611f9c565b8015611d155760008481526002602081815260408084206001600160a01b03881685526005810183529084208690559287905252611cce9060030184611fc6565b50604080518581526001600160a01b03851660208201527f75675690de0899b0b869d83b44b2d926ac594426b2a0286c478ecdf815cbd33e910160405180910390a1611d93565b60008481526002602081815260408084206001600160a01b03881685526009810183529084208690559287905252611d509060070184611fc6565b50604080518581526001600160a01b03851660208201527f0c2cfc7e7a16ebee66e77fb314f4bfdb5505e33e77d41c0c60604efc70fd926b910160405180910390a15b50505050565b60008115611e24575060008381526002602081815260408084206001600160a01b03871685526005810183529084205493879052919052611ddd9060030184611ada565b50604080518581526001600160a01b03851660208201527f6e7c30dc58d3daa1458c79b66ca464f5f3d8a23d9e50eb14daf1cb0923bf2900910160405180910390a16109c4565b5060008381526002602081815260408084206001600160a01b03871685526009810183529084205493879052919052611e609060070184611ada565b50604080518581526001600160a01b03851660208201527fe76a3e8b220b622b9fc2a655ab867687a93f195809eb3639f422e60936ff7eb4910160405180910390a19392505050565b60008181526001830160205260408120548015611f92576000611ecd600183612797565b8554909150600090611ee190600190612797565b9050818114611f46576000866000018281548110611f0157611f016127c4565b9060005260206000200154905080876000018481548110611f2457611f246127c4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611f5757611f57612879565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611af2565b6000915050611af2565b6000826000018281548110611fb357611fb36127c4565b9060005260206000200154905092915050565b6000611aef836001600160a01b0384166000611ff5838360009081526001919091016020526040902054151590565b61202b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611af2565b506000611af2565b82805461203f906125ec565b90600052602060002090601f01602090048101928261206157600085556120a7565b82601f1061207a5782800160ff198235161785556120a7565b828001600101855582156120a7579182015b828111156120a757823582559160200191906001019061208c565b506120b39291506120b7565b5090565b5b808211156120b357600081556001016120b8565b6001600160a01b03811681146120e157600080fd5b50565b600080604083850312156120f757600080fd5b823591506020830135612109816120cc565b809150509250929050565b60006020828403121561212657600080fd5b5035919050565b6000815180845260005b8181101561215357602081850181015186830182015201612137565b81811115612165576000602083870101525b50601f01601f19169290920160200192915050565b602081526000611aef602083018461212d565b6000806000606084860312156121a257600080fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b818110156121fa5783516001600160a01b0316835292840192918401916001016121d5565b50909695505050505050565b803563ffffffff8116811461221a57600080fd5b919050565b6000806040838503121561223257600080fd5b8235915061224260208401612206565b90509250929050565b803560ff8116811461221a57600080fd5b60008060008060008060c0878903121561227557600080fd5b863595506020870135612287816120cc565b94506040870135935061229c6060880161224b565b92506080870135915060a087013590509295509295509295565b60008083601f8401126122c857600080fd5b50813567ffffffffffffffff8111156122e057600080fd5b6020830191508360208285010111156108f557600080fd5b60008060006040848603121561230d57600080fd5b83359250602084013567ffffffffffffffff81111561232b57600080fd5b612337868287016122b6565b9497909650939450505050565b600080600080600060a0868803121561235c57600080fd5b85359450602086013561236e816120cc565b935061237c6040870161224b565b94979396509394606081013594506080013592915050565b600080600080600080600060a0888a0312156123af57600080fd5b87356123ba816120cc565b9650602088013567ffffffffffffffff808211156123d757600080fd5b6123e38b838c016122b6565b909850965060408a01359150808211156123fc57600080fd5b506124098a828b016122b6565b909550935050606088013591506080880135612424816120cc565b8091505092959891949750929550565b60008060006060848603121561244957600080fd5b83359250602084013561245b816120cc565b929592945050506040919091013590565b803561ffff8116811461221a57600080fd5b6000806040838503121561249157600080fd5b823591506122426020840161246c565b6001600160a01b038816815263ffffffff878116602083015286811660408301528516606082015260e0608082018190526000906124e19083018661212d565b61ffff9490941660a08301525090151560c09091015295945050505050565b60006020828403121561251257600080fd5b81356109c4816120cc565b80151581146120e157600080fd5b60008060008060008060008060006101008a8c03121561254a57600080fd5b8935612555816120cc565b985061256360208b01612206565b975061257160408b01612206565b965061257f60608b01612206565b955061258d60808b0161246c565b945060a08a013561259d8161251d565b935060c08a01356125ad8161251d565b925060e08a013567ffffffffffffffff8111156125c957600080fd5b6125d58c828d016122b6565b915080935050809150509295985092959850929598565b600181811c9082168061260057607f821691505b6020821081141561262157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600d908201526c2737ba103a34329037bbb732b960991b604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152600061268b60208301848661264e565b949350505050565b8381526040602082015260006126ad60408301848661264e565b95945050505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000602082840312156126ee57600080fd5b81516109c4816120cc565b60006020828403121561270b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600060001982141561273c5761273c612712565b5060010190565b60006020828403121561275557600080fd5b81516109c48161251d565b600081600019048311821515161561277a5761277a612712565b500290565b6000821982111561279257612792612712565b500190565b6000828210156127a9576127a9612712565b500390565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600061012060018060a01b03808d1684528b60208501528a604085015289606085015281608085015261280f8285018a61212d565b971660a0840152505060ff9390931660c084015260e08301919091526101009091015295945050505050565b60018060a01b038616815284602082015283604082015282606082015260a06080820152600061286e60a083018461212d565b979650505050505050565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220bc73b50fb80be6d665ced3be4be6344fef4269c745f49b32f0d738f8f82bd76164736f6c63430008090033