608060405234801561001057600080fd5b50610f1a806100206000396000f3fe6080604052600436106100c05760003560e01c806380d1cb3511610074578063c51a29e01161004e578063c51a29e0146102c1578063c8a4c3d5146102f5578063f851a4401461030a576100c7565b806380d1cb351461022c578063913a0ef21461026a578063bf64a82d146102ae576100c7565b80636e9960c3116100a55780636e9960c3146101a45780636faf275b146101d8578063704b6c021461020c576100c7565b80634827ae0c146100f95780634ddf47d414610153576100c7565b366100c757005b60006100d161031f565b90503660008037600080366000845af43d6000803e8080156100f2573d6000f35b3d6000fd5b005b34801561010557600080fd5b507f53c86b1d394b62c7818fb145a35e6dc32cef222c842fe29514b3ba4fe981ef0b545b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561015f57600080fd5b5061017361016e366004610bb4565b61045d565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161014a565b3480156101b057600080fd5b507fcfff686fc71f8f9ec585cf818e44ca1f441b0387a1c2c1d4a01f808d0731f44354610129565b3480156101e457600080fd5b507f0d4e1c907b900c7e92a8c60f7044e0a0931897b2633a72b2a30561be7b6ddc6454610129565b34801561021857600080fd5b506100f7610227366004610c59565b610911565b34801561023857600080fd5b507f514a1fca3022a65d67c892d5c4c6085dce561e9fb86830dbe0b7a5def077582f545b60405190815260200161014a565b34801561027657600080fd5b507fc397544e2140d60120724f11745a0ac346a261e7baf79e4a1807985bfbf9b3fc5460405163ffffffff909116815260200161014a565b6100f76102bc366004610c7d565b6109eb565b3480156102cd57600080fd5b507fe664a71795801e5580934f070a8c5b1ffc23fc646aabf2cbbe768486e26202185461025c565b34801561030157600080fd5b5061012961031f565b34801561031657600080fd5b50610129610ac1565b60008060007f53c86b1d394b62c7818fb145a35e6dc32cef222c842fe29514b3ba4fe981ef0b5491507fe664a71795801e5580934f070a8c5b1ffc23fc646aabf2cbbe768486e26202185490508173ffffffffffffffffffffffffffffffffffffffff16635ab1bd536040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103db9190610d02565b73ffffffffffffffffffffffffffffffffffffffff166374b7510c826040518263ffffffff1660e01b815260040161041591815260200190565b602060405180830381865afa158015610432573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104569190610d02565b9250505090565b60006104877f8d58fc5a72defe4999ecaf6eca1a4a09275c239a64d3c389e77811c46ec9e8475490565b156104f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f475241504845523a20616c726561647920696e697469616c697a656460448201526064015b60405180910390fd5b6000808380602001905181019061050a9190610d9c565b91509150600080600080858060200190518101906105289190610e00565b9350935093509350337fcfff686fc71f8f9ec585cf818e44ca1f441b0387a1c2c1d4a01f808d0731f44355437f514a1fca3022a65d67c892d5c4c6085dce561e9fb86830dbe0b7a5def077582f55817fe664a71795801e5580934f070a8c5b1ffc23fc646aabf2cbbe768486e262021855827f53c86b1d394b62c7818fb145a35e6dc32cef222c842fe29514b3ba4fe981ef0b55837fc397544e2140d60120724f11745a0ac346a261e7baf79e4a1807985bfbf9b3fc55807f0d4e1c907b900c7e92a8c60f7044e0a0931897b2633a72b2a30561be7b6ddc64556000808473ffffffffffffffffffffffffffffffffffffffff16635ab1bd536040518163ffffffff1660e01b8152600401602060405180830381865afa158015610650573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106749190610d02565b73ffffffffffffffffffffffffffffffffffffffff166374b7510c856040518263ffffffff1660e01b81526004016106ae91815260200190565b602060405180830381865afa1580156106cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ef9190610d02565b73ffffffffffffffffffffffffffffffffffffffff16634ddf47d460e01b8860405160240161071e9190610e5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107a79190610eaf565b600060405180830381855af49150503d80600081146107e2576040519150601f19603f3d011682016040523d82523d6000602084013e6107e7565b606091505b50915091506000818060200190518101906108029190610ecb565b905082801561085257507fffffffff0000000000000000000000000000000000000000000000000000000081167f4ddf47d400000000000000000000000000000000000000000000000000000000145b6108b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a20696e697469616c697a6174696f6e206661696c656460448201526064016104ea565b6108e160017f8d58fc5a72defe4999ecaf6eca1a4a09275c239a64d3c389e77811c46ec9e84755565b507f4ddf47d4000000000000000000000000000000000000000000000000000000009a9950505050505050505050565b7fcfff686fc71f8f9ec585cf818e44ca1f441b0387a1c2c1d4a01f808d0731f4435473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e000060448201526064016104ea565b7fcfff686fc71f8f9ec585cf818e44ca1f441b0387a1c2c1d4a01f808d0731f44355565b7fcfff686fc71f8f9ec585cf818e44ca1f441b0387a1c2c1d4a01f808d0731f4435473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e000060448201526064016104ea565b808260003760008082600034875af13d6000803e8080156100f2573d6000f35b6000610aeb7fcfff686fc71f8f9ec585cf818e44ca1f441b0387a1c2c1d4a01f808d0731f4435490565b905090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610b6657610b66610af0565b604052919050565b600067ffffffffffffffff821115610b8857610b88610af0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060208284031215610bc657600080fd5b813567ffffffffffffffff811115610bdd57600080fd5b8201601f81018413610bee57600080fd5b8035610c01610bfc82610b6e565b610b1f565b818152856020838501011115610c1657600080fd5b81602084016020830137600091810160200191909152949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c5657600080fd5b50565b600060208284031215610c6b57600080fd5b8135610c7681610c34565b9392505050565b600080600060408486031215610c9257600080fd5b8335610c9d81610c34565b9250602084013567ffffffffffffffff80821115610cba57600080fd5b818601915086601f830112610cce57600080fd5b813581811115610cdd57600080fd5b876020828501011115610cef57600080fd5b6020830194508093505050509250925092565b600060208284031215610d1457600080fd5b8151610c7681610c34565b60005b83811015610d3a578181015183820152602001610d22565b83811115610d49576000848401525b50505050565b600082601f830112610d6057600080fd5b8151610d6e610bfc82610b6e565b818152846020838601011115610d8357600080fd5b610d94826020830160208701610d1f565b949350505050565b60008060408385031215610daf57600080fd5b825167ffffffffffffffff80821115610dc757600080fd5b610dd386838701610d4f565b93506020850151915080821115610de957600080fd5b50610df685828601610d4f565b9150509250929050565b60008060008060808587031215610e1657600080fd5b845163ffffffff81168114610e2a57600080fd5b6020860151909450610e3b81610c34565b604086015160608701519194509250610e5381610c34565b939692955090935050565b6020815260008251806020840152610e7d816040850160208701610d1f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008251610ec1818460208701610d1f565b9190910192915050565b600060208284031215610edd57600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610c7657600080fdfea164736f6c634300080d000a