0x608060405234801561001057600080fd5b506004361061018b5760003560e01c806304f5b841146101905780630b5c306f146101a557806311bbedb7146101ce57806320fb2ac8146101ee57806323f11f991461021057806331f25330146102235780633403c2fc146102475780633637f6a8146102645780633b1e8156146102775780633f4ba83a1461028a5780634145a9e0146102925780634d6e855e146102a5578063507b8ed2146102b857806356db6fff146102cb5780635c975abb146102de5780636399e834146102e9578063715018a61461031457806379a6d51f1461031c57806382bc07e6146103915780638456cb59146103a85780638a2ef9d4146103b05780638c40a313146103c35780638da5cb5b146103d657806397f735d5146103de57806399eb59b9146103f1578063a8719e0014610414578063c46f602f14610442578063dccb359914610455578063e17ddc4114610468578063e35d16531461047f578063f2fde38b14610494578063f9f92be4146104a7578063fa78e3bf146104ca575b600080fd5b6101a361019e366004611cab565b6104dd565b005b6101b86101b3366004611d3b565b6107f9565b6040516101c59190612224565b60405180910390f35b609c546101e1906001600160a01b031681565b6040516101c59190612157565b6102016101fc366004611d3b565b61085b565b6040516101c5939291906122f1565b6101a361021e366004611b34565b61089e565b609b5461023a90600160481b900463ffffffff1681565b6040516101c591906122e0565b609b546102549060ff1681565b60405190151581526020016101c5565b6101a3610272366004612018565b610917565b6101a3610285366004611c00565b61097e565b6101a3610a9a565b6101a36102a0366004611c3f565b610ad3565b6101e16102b3366004611de0565b610bd3565b6101a36102c6366004612018565b610c43565b6101a36102d9366004611c00565b610cae565b60655460ff16610254565b609d54609e546102fa91600f0b9082565b60408051600f9390930b83526020830191909152016101c5565b6101a3610dc5565b61036161032a366004612018565b609a6020526000908152604090205463ffffffff80821691600160201b8104821691600160401b8204811691600160601b90041684565b6040805163ffffffff958616815293851660208501529184169183019190915290911660608201526080016101c5565b609b5461023a90600160681b900463ffffffff1681565b6101a3610dfe565b6101a36103be366004611b50565b610e35565b6101a36103d1366004611e36565b6110fd565b6101e1611170565b6102546103ec366004611b34565b61117f565b6102546103ff366004611c93565b60976020526000908152604090205460ff1681565b610254610422366004612034565b609860209081526000928352604080842090915290825290205460ff1681565b610254610450366004612034565b6111a1565b61023a610463366004611d6d565b6111d4565b609b5461023a90600160281b900463ffffffff1681565b609b5461023a90610100900463ffffffff1681565b6101a36104a2366004611b34565b6112c4565b6102546104b5366004611b34565b60996020526000908152604090205460ff1681565b6102546104d8366004612018565b611364565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604051909350610525925084915060200161216b565b60408051601f1981840301815291815281516020928301206000818152609790935291205490915060ff16156105a05760405162461bcd60e51b815260206004820152601b60248201527a21b0b1b4329d103830bcb637b0b21030b63932b0b23c9039b2b2b760291b60448201526064015b60405180910390fd5b6105e686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506104639250879150889050612460565b63ffffffff16156106485760405162461bcd60e51b815260206004820152602660248201527f4272696467653a207369676e61747572657320766572696669636174696f6e2060448201526519985a5b195960d21b6064820152608401610597565b600061065686880188611e4d565b609d546060820151919250600f90810b900b60009190910b1480156106805750609e546080820151145b6106d65760405162461bcd60e51b815260206004820152602160248201527f4272696467653a2077726f6e67206576656e7420636f6e66696775726174696f6044820152603760f91b6064820152608401610597565b600080600061071a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061085b92505050565b609b54929550909350915061073d90600160681b900463ffffffff1660016123d4565b63ffffffff168363ffffffff161461078d5760405162461bcd60e51b8152602060048201526013602482015272109c9a5919d94e881ddc9bdb99c81c9bdd5b99606a1b6044820152606401610597565b610798838383611388565b609b8054600160681b900463ffffffff1690600d6107b5836124b8565b825463ffffffff9182166101009390930a928302919092021990911617905550505060009283525050609760205260409020805460ff191660011790555050505050565b60408051610120810182526000808252602080830182905260609383018490529282018190526080820181905260a0820181905260c0820181905260e08201819052610100820152825190916108559184018101908401611f3a565b92915050565b60006060600080848060200190518101906108769190611f3a565b90508060400151806020019051810190610890919061206c565b919790965090945092505050565b336108a7611170565b6001600160a01b0316146108cd5760405162461bcd60e51b81526004016105979061217e565b609c80546001600160a01b0319166001600160a01b0383811691909117918290556040516000805160206125bd8339815191529261090c921690612157565b60405180910390a150565b33610920611170565b6001600160a01b0316146109465760405162461bcd60e51b81526004016105979061217e565b609b805464ffffffff00191661010063ffffffff8416021790556040516000805160206125fd8339815191529061090c9083906122e0565b33610987611170565b6001600160a01b0316146109ad5760405162461bcd60e51b81526004016105979061217e565b60005b81811015610a95576001609960008585858181106109de57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109f39190611b34565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610a3b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a509190611b34565b6001600160a01b03166000805160206125dd8339815191526001604051610a7b911515815260200190565b60405180910390a280610a8d8161249d565b9150506109b0565b505050565b33610aa3611170565b6001600160a01b031614610ac95760405162461bcd60e51b81526004016105979061217e565b610ad16115b9565b565b609c546001600160a01b03163314610b385760405162461bcd60e51b815260206004820152602260248201527f4272696467653a2073656e646572206e6f7420726f756e64207375626d69747460448201526132b960f11b6064820152608401610597565b609b54610b9290610b5790600160681b900463ffffffff1660016123d4565b848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250611388915050565b609b8054600160681b900463ffffffff1690600d610baf836124b8565b91906101000a81548163ffffffff021916908363ffffffff16021790555050505050565b6000610c3c82610c3685805190602001206040517b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90611646565b9392505050565b33610c4c611170565b6001600160a01b031614610c725760405162461bcd60e51b81526004016105979061217e565b609b805463ffffffff60281b1916600160281b63ffffffff84160217905560405160008051602061259d8339815191529061090c9083906122e0565b33610cb7611170565b6001600160a01b031614610cdd5760405162461bcd60e51b81526004016105979061217e565b60005b81811015610a9557600060996000858585818110610d0e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610d239190611b34565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055828282818110610d6b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610d809190611b34565b6001600160a01b03166000805160206125dd8339815191526000604051610dab911515815260200190565b60405180910390a280610dbd8161249d565b915050610ce0565b33610dce611170565b6001600160a01b031614610df45760405162461bcd60e51b81526004016105979061217e565b610ad1600061171d565b33610e07611170565b6001600160a01b031614610e2d5760405162461bcd60e51b81526004016105979061217e565b610ad161176f565b600054610100900460ff16610e505760005460ff1615610e54565b303b155b610eb75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610597565b600054610100900460ff16158015610ee2576000805460ff1961ff0019909116610100171660011790555b610eea6117ea565b610ef2611819565b610efb896112c4565b609c80546001600160a01b0319166001600160a01b038a161790556040516000805160206125bd83398151915290610f34908a90612157565b60405180910390a1609b805464ffffffff00191661010063ffffffff8a8116820292909217928390556040516000805160206125fd83398151915293610f8093929004909116906122e0565b60405180910390a1609b805463ffffffff60281b1916600160281b63ffffffff8981168202929092179283905560405160008051602061259d83398151915293610fd093929004909116906122e0565b60405180910390a1428463ffffffff1610156110485760405162461bcd60e51b815260206004820152603160248201527f4272696467653a20696e697469616c20726f756e6420656e642073686f756c6460448201527020626520696e207468652066757475726560781b6064820152608401610597565b84609b60096101000a81548163ffffffff021916908363ffffffff1602179055506110ba609b60099054906101000a900463ffffffff16848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250611388915050565b609b8054600160681b63ffffffff600160481b8304160263ffffffff60681b1990911617905580156110f2576000805461ff00191690555b505050505050505050565b33611106611170565b6001600160a01b03161461112c5760405162461bcd60e51b81526004016105979061217e565b7f9a1672cb9d5ac42d5fe7fd8706d2405371661bb21601da90dbfa6eb69248e6178160405161115b91906121fe565b60405180910390a180609d610a958282612508565b6033546001600160a01b031690565b6001600160a01b03811660009081526099602052604090205460ff165b919050565b63ffffffff821660009081526098602090815260408083206001600160a01b038516845290915290205460ff1692915050565b600080838060200190518101906111eb9190611f3a565b610100810151609b549192509063ffffffff600160481b9091048116908216101561121b57600192505050610855565b609b5463ffffffff600160681b9091048116908216111561124157600292505050610855565b600061124e868684611848565b63ffffffff8084166000908152609a6020526040902054919250600160601b909104811690821610156112875760039350505050610855565b61129082611364565b156112a15760049350505050610855565b60655460ff16156112b85760059350505050610855565b50600095945050505050565b336112cd611170565b6001600160a01b0316146112f35760405162461bcd60e51b81526004016105979061217e565b6001600160a01b0381166113585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610597565b6113618161171d565b50565b63ffffffff9081166000908152609a6020526040902054600160201b900416421190565b600060038351600261139a9190612441565b6113a49190612421565b6113af9060016123d4565b905060405180608001604052808363ffffffff168152602001609b60059054906101000a900463ffffffff16846113e691906123d4565b63ffffffff9081168252855181166020830152609b5460409092019161010090048116908416106114175782611426565b609b54610100900463ffffffff165b63ffffffff9081169091528581166000818152609a60209081526040918290208551815487840151888601516060998a015163ffffffff199093169389169390931763ffffffff60201b1916600160201b918916919091021763ffffffff60401b1916600160401b928816929092029190911763ffffffff60601b1916600160601b9187169190910217908190558251818616815281831c86169281019290925280831c851682840152851c9093169383019390935291517f640133a6dd957aa8ea6ee5bced590b08a2716453408d9473d007756d0d947e79916080908290030190a260005b83518110156115b257600084828151811061153757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015163ffffffff881660008181526098845260408082206001600160a01b0385168084529552808220805460ff191660011790555192945090917f94819138a8ba708dfe846523a28de6ec7c2838e707270e6be73644534e5979ef9190a350806115aa8161249d565b91505061150c565b5050505050565b60655460ff166116025760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610597565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405161163c9190612157565b60405180910390a1565b60008060008084516041146116615760009350505050610855565b50505060208201516040830151606084015160001a601b81101561168d5761168a601b826123fc565b90505b8060ff16601b141580156116a557508060ff16601c14155b156116b65760009350505050610855565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015611709573d6000803e3d6000fd5b505050602060405103519350505050610855565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156117b55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610597565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861162f3390565b600054610100900460ff166118115760405162461bcd60e51b8152600401610597906121b3565b610ad1611946565b600054610100900460ff166118405760405162461bcd60e51b8152600401610597906121b3565b610ad1611979565b60008080805b855181101561193c57600061188a8888848151811061187d57634e487b7160e01b600052603260045260246000fd5b6020026020010151610bd3565b9050836001600160a01b0316816001600160a01b0316116118f75760405162461bcd60e51b815260206004820152602160248201527f4272696467653a207369676e6174757265732073657175656e63652077726f6e6044820152606760f81b6064820152608401610597565b80935061190486826111a1565b801561191657506119148161117f565b155b156119295782611925816124b8565b9350505b50806119348161249d565b91505061184e565b5095945050505050565b600054610100900460ff1661196d5760405162461bcd60e51b8152600401610597906121b3565b6065805460ff19169055565b600054610100900460ff166119a05760405162461bcd60e51b8152600401610597906121b3565b610ad13361171d565b60006119bc6119b78461238a565b61235a565b83815290506020808201908360005b868110156119f2576119e08883358801611a5b565b845292820192908201906001016119cb565b505050509392505050565b803561119c81612542565b805161119c81612542565b60008083601f840112611a24578182fd5b5081356001600160401b03811115611a3a578182fd5b6020830191508360208083028501011115611a5457600080fd5b9250929050565b600082601f830112611a6b578081fd5b8135611a796119b7826123ad565b818152846020838601011115611a8d578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112611ab7578081fd5b8151611ac56119b7826123ad565b818152846020838601011115611ad9578283fd5b611aea82602083016020870161246d565b949350505050565b803561119c81612566565b805161119c81612566565b803561119c81612575565b805161119c81612575565b803561119c81612587565b805161119c81612587565b600060208284031215611b45578081fd5b8135610c3c81612542565b60008060008060008060008060e0898b031215611b6b578384fd5b8835611b7681612542565b97506020890135611b8681612542565b96506040890135611b9681612575565b95506060890135611ba681612575565b94506080890135611bb681612575565b935060a0890135611bc681612575565b925060c08901356001600160401b03811115611be0578283fd5b611bec8b828c01611a13565b999c989b5096995094979396929594505050565b60008060208385031215611c12578182fd5b82356001600160401b03811115611c27578283fd5b611c3385828601611a13565b90969095509350505050565b600080600060408486031215611c53578081fd5b83356001600160401b03811115611c68578182fd5b611c7486828701611a13565b9094509250506020840135611c8881612575565b809150509250925092565b600060208284031215611ca4578081fd5b5035919050565b60008060008060408587031215611cc0578182fd5b84356001600160401b0380821115611cd6578384fd5b818701915087601f830112611ce9578384fd5b813581811115611cf7578485fd5b886020828501011115611d08578485fd5b602092830196509450908601359080821115611d22578384fd5b50611d2f87828801611a13565b95989497509550505050565b600060208284031215611d4c578081fd5b81356001600160401b03811115611d61578182fd5b611aea84828501611a5b565b60008060408385031215611d7f578182fd5b82356001600160401b0380821115611d95578384fd5b611da186838701611a5b565b93506020850135915080821115611db6578283fd5b508301601f81018513611dc7578182fd5b611dd6858235602084016119a9565b9150509250929050565b60008060408385031215611df2578182fd5b82356001600160401b0380821115611e08578384fd5b611e1486838701611a5b565b93506020850135915080821115611e29578283fd5b50611dd685828601611a5b565b600060408284031215611e47578081fd5b50919050565b600060208284031215611e5e578081fd5b81356001600160401b0380821115611e74578283fd5b8184019150610120808387031215611e8a578384fd5b611e938161235a565b9050611e9e83611b1e565b8152611eac60208401611b08565b6020820152604083013582811115611ec2578485fd5b611ece87828601611a5b565b604083015250611ee060608401611af2565b606082015260808301356080820152611efb60a08401611af2565b60a082015260c083013560c0820152611f1660e084016119fd565b60e08201526101009150611f2b828401611b08565b91810191909152949350505050565b600060208284031215611f4b578081fd5b81516001600160401b0380821115611f61578283fd5b8184019150610120808387031215611f77578384fd5b611f808161235a565b9050611f8b83611b29565b8152611f9960208401611b13565b6020820152604083015182811115611faf578485fd5b611fbb87828601611aa7565b604083015250611fcd60608401611afd565b606082015260808301516080820152611fe860a08401611afd565b60a082015260c083015160c082015261200360e08401611a08565b60e08201526101009150611f2b828401611b13565b600060208284031215612029578081fd5b8135610c3c81612575565b60008060408385031215612046578182fd5b823561205181612575565b9150602083013561206181612542565b809150509250929050565b600080600060608486031215612080578081fd5b835161208b81612575565b602085810151919450906001600160401b038111156120a8578283fd5b8501601f810187136120b8578283fd5b80516120c66119b78261238a565b81815283810190838501858402850186018b10156120e2578687fd5b8694505b8385101561210d5780516120f981612542565b8352600194909401939185019185016120e6565b50809650505050505061212260408501611b13565b90509250925092565b6000815180845261214381602086016020860161246d565b601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b600060208252610c3c602083018461212b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60408101823561220d81612557565b80600f0b8352506020830135602083015292915050565b6000602082526122406020830184516001600160401b03169052565b602083015163ffffffff8116604084015250604083015161012080606085015261226e61014085018361212b565b91506060850151612284608086018260000b9052565b50608085015160a085015260a08501516122a360c086018260000b9052565b5060c085015160e085015260e08501516101006122ca818701836001600160a01b03169052565b9095015163ffffffff1693019290925250919050565b63ffffffff91909116815260200190565b60006060820163ffffffff808716845260206060818601528287518085526080870191508289019450855b818110156123415785516001600160a01b03168352948301949183019160010161231c565b5050809450505080851660408501525050949350505050565b604051601f8201601f191681016001600160401b0381118282101715612382576123826124f2565b604052919050565b60006001600160401b038211156123a3576123a36124f2565b5060209081020190565b60006001600160401b038211156123c6576123c66124f2565b50601f01601f191660200190565b600063ffffffff8083168185168083038211156123f3576123f36124dc565b01949350505050565b600060ff821660ff84168060ff03821115612419576124196124dc565b019392505050565b60008261243c57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561245b5761245b6124dc565b500290565b6000610c3c3684846119a9565b60005b83811015612488578181015183820152602001612470565b83811115612497576000848401525b50505050565b60006000198214156124b1576124b16124dc565b5060010190565b600063ffffffff808316818114156124d2576124d26124dc565b6001019392505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b813561251381612557565b8154600f9190910b6001600160801b03166001600160801b031990911617815560209190910135600190910155565b6001600160a01b038116811461136157600080fd5b80600f0b811461136157600080fd5b8060000b811461136157600080fd5b63ffffffff8116811461136157600080fd5b6001600160401b038116811461136157600080fdfe33bf3241a8582c0b4d713c63761f4f809f651202e32748b335ec8bda0ac74f6c7ed72b9d012a44ff790c3eb9d7d6f5b03f04d47c5128249cf14d559126ba76568e91a79c752035dd825468c2990c5d65794e64e4025fa3b1800c4eef2bdd4249b80014cbadaa4692dd31be5d87278068d67ed23b027c3063f855b3f828a00ea2a2646970667358221220a0eae3b1c1ff704b8afa5cd6ab751d2db1ae7bd8af63bde64cb334fa6589265d64736f6c63430008020033