From 0c961b83487eed6954d1cdbde053385d89ec5f4f Mon Sep 17 00:00:00 2001 From: ThatBen Date: Fri, 21 Feb 2025 14:17:13 +0100 Subject: [PATCH] updates marketplace contract, fixes type conversions --- .../KubernetesWorkflow/StartupWorkflow.cs | 10 +- .../KubernetesWorkflow/Types/RunningPod.cs | 4 +- .../Marketplace/Marketplace.cs | 96 +++++++++---------- .../CodexInstanceContainerExtension.cs | 17 ++-- Tools/MarketInsights/ContributionBuilder.cs | 5 + Tools/TestNetRewarder/RewardCheck.cs | 4 +- 6 files changed, 75 insertions(+), 61 deletions(-) diff --git a/Framework/KubernetesWorkflow/StartupWorkflow.cs b/Framework/KubernetesWorkflow/StartupWorkflow.cs index 67d01def..8b9d5a19 100644 --- a/Framework/KubernetesWorkflow/StartupWorkflow.cs +++ b/Framework/KubernetesWorkflow/StartupWorkflow.cs @@ -61,7 +61,8 @@ namespace KubernetesWorkflow var startResult = controller.BringOnline(recipes, location); var containers = CreateContainers(startResult, recipes, startupConfig); - var rc = new RunningPod(Guid.NewGuid().ToString(), startupConfig, startResult, containers); + var info = GetPodInfo(startResult.Deployment); + var rc = new RunningPod(Guid.NewGuid().ToString(), info, startupConfig, startResult, containers); cluster.Configuration.Hooks.OnContainersStarted(rc); if (startResult.ExternalService != null) @@ -83,9 +84,14 @@ namespace KubernetesWorkflow }); } + public PodInfo GetPodInfo(RunningDeployment deployment) + { + return K8s(c => c.GetPodInfo(deployment)); + } + public PodInfo GetPodInfo(RunningContainer container) { - return K8s(c => c.GetPodInfo(container.RunningPod.StartResult.Deployment)); + return GetPodInfo(container.RunningPod.StartResult.Deployment); } public PodInfo GetPodInfo(RunningPod pod) diff --git a/Framework/KubernetesWorkflow/Types/RunningPod.cs b/Framework/KubernetesWorkflow/Types/RunningPod.cs index b278181d..bbe7f080 100644 --- a/Framework/KubernetesWorkflow/Types/RunningPod.cs +++ b/Framework/KubernetesWorkflow/Types/RunningPod.cs @@ -4,9 +4,10 @@ namespace KubernetesWorkflow.Types { public class RunningPod { - public RunningPod(string id, StartupConfig startupConfig, StartResult startResult, RunningContainer[] containers) + public RunningPod(string id, PodInfo podInfo, StartupConfig startupConfig, StartResult startResult, RunningContainer[] containers) { Id = id; + PodInfo = podInfo; StartupConfig = startupConfig; StartResult = startResult; Containers = containers; @@ -15,6 +16,7 @@ namespace KubernetesWorkflow.Types } public string Id { get; } + public PodInfo PodInfo { get; } public StartupConfig StartupConfig { get; } public StartResult StartResult { get; } public RunningContainer[] Containers { get; } diff --git a/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs b/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs index dea67146..d74dd21f 100644 --- a/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs +++ b/ProjectPlugins/CodexContractsPlugin/Marketplace/Marketplace.cs @@ -15,7 +15,7 @@ namespace CodexContractsPlugin.Marketplace public class MarketplaceDeploymentBase : ContractDeploymentMessage { - public static string BYTECODE = "0x60c06040523480156200001157600080fd5b506040516200468a3803806200468a8339810160408190526200003491620004b0565b602083015180516040850151516001805460ff191660ff90921691909117905582906000819003620000795760405163015536c760e51b815260040160405180910390fd5b60805261010043116200009f576040516338f5f66160e11b815260040160405180910390fd5b81516002908155602083015160035560408301516004805460ff191660ff9092169190911790556060830151839190600590620000dd908262000666565b50608091909101516004909101805460ff191660ff928316179055600780546001600160a01b0319166001600160a01b0393841617905590841660a052845151606491161115905062000143576040516302bd816360e41b815260040160405180910390fd5b606483600001516040015160ff16111562000171576040516354e5e0ab60e11b815260040160405180910390fd5b825160408101516020909101516064916200018c9162000732565b60ff161115620001af576040516317ff9d0f60e21b815260040160405180910390fd5b82518051600e805460208085015160408087015160609788015160ff90811663010000000263ff0000001992821662010000029290921663ffff0000199482166101000261ffff1990971698821698909817959095179290921695909517178355808801518051600f9081559181015160105593840151601180549190931660ff1991909116179091559282015186939192919060129062000252908262000666565b50608091909101516004909101805460ff92831660ff19918216179091556040840151516006840180549190931691161790556060909101516007909101555062000764915050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715620002d657620002d66200029b565b60405290565b604051608081016001600160401b0381118282101715620002d657620002d66200029b565b604051601f8201601f191681016001600160401b03811182821017156200032c576200032c6200029b565b604052919050565b805160ff811681146200034657600080fd5b919050565b600060a082840312156200035e57600080fd5b62000368620002b1565b90508151815260208083015181830152620003866040840162000334565b604083015260608301516001600160401b0380821115620003a657600080fd5b818501915085601f830112620003bb57600080fd5b815181811115620003d057620003d06200029b565b620003e4601f8201601f1916850162000301565b91508082528684828501011115620003fb57600080fd5b60005b818110156200041b578381018501518382018601528401620003fe565b506000848284010152508060608501525050506200043c6080830162000334565b608082015292915050565b6000602082840312156200045a57600080fd5b604051602081016001600160401b03811182821017156200047f576200047f6200029b565b604052905080620004908362000334565b905292915050565b80516001600160a01b03811681146200034657600080fd5b600080600060608486031215620004c657600080fd5b83516001600160401b0380821115620004de57600080fd5b9085019081870360e0811215620004f457600080fd5b620004fe620002dc565b60808212156200050d57600080fd5b62000517620002dc565b9150620005248462000334565b8252620005346020850162000334565b6020830152620005476040850162000334565b60408301526200055a6060850162000334565b6060830152908152608083015190828211156200057657600080fd5b62000584898386016200034b565b6020820152620005988960a0860162000447565b604082015260c0840151606082015280965050505050620005bc6020850162000498565b9150620005cc6040850162000498565b90509250925092565b600181811c90821680620005ea57607f821691505b6020821081036200060b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000661576000816000526020600020601f850160051c810160208610156200063c5750805b601f850160051c820191505b818110156200065d5782815560010162000648565b5050505b505050565b81516001600160401b038111156200068257620006826200029b565b6200069a81620006938454620005d5565b8462000611565b602080601f831160018114620006d25760008415620006b95750858301515b600019600386901b1c1916600185901b1785556200065d565b600085815260208120601f198616915b828110156200070357888601518255948401946001909101908401620006e2565b5085821015620007225787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff81811683821602908116908181146200075d57634e487b7160e01b600052601160045260246000fd5b5092915050565b60805160a051613ec8620007c26000396000818161048e015281816107820152818161184f015281816124ad0152818161255d015281816126cf0152818161277f0152612988015260008181612e7c01526130580152613ec86000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636c70bee9116100f9578063c0cc4add11610097578063e8aa0a0711610071578063e8aa0a0714610439578063f752196b1461044c578063fb1e61ca1461046c578063fc0c546a1461048c57600080fd5b8063c0cc4add14610400578063c5d4335114610413578063e61636821461042657600080fd5b8063a29c29a4116100d3578063a29c29a41461039a578063a3a0807e146103ad578063b396dc79146103c0578063be5cdc48146103e057600080fd5b80636c70bee91461036a5780636e2b54ee1461037f5780639777b72c1461039257600080fd5b80634641dce61161016657806359cc89ed1161014057806359cc89ed146102eb5780635da73835146102fe57806362d48e13146103135780636b00c8cf1461032657600080fd5b80634641dce6146102905780634802f44b146102b557806351a76642146102d857600080fd5b80630aefaabe116101a25780630aefaabe1461022457806326d6f83414610237578063329b5a0b1461025a578063458d2bf11461027d57600080fd5b806302fa8e65146101c957806305b90773146101ef57806308695fcd1461020f575b600080fd5b6101dc6101d73660046132d3565b6104b2565b6040519081526020015b60405180910390f35b6102026101fd3660046132d3565b610529565b6040516101e69190613302565b61022261021d36600461331c565b610615565b005b610222610232366004613353565b61084d565b6101dc6102453660046132d3565b60009081526018602052604090206004015490565b6101dc6102683660046132d3565b60009081526017602052604090206005015490565b6101dc61028b3660046132d3565b6109d8565b6102a361029e3660046132d3565b6109f1565b60405160ff90911681526020016101e6565b6102c86102c336600461331c565b610a04565b60405190151581526020016101e6565b6101dc6102e63660046132d3565b610a8d565b6102226102f93660046133a8565b610add565b610306610ed2565b6040516101e691906133df565b61022261032136600461331c565b610ef9565b6103526103343660046132d3565b6000908152601860205260409020600501546001600160a01b031690565b6040516001600160a01b0390911681526020016101e6565b610372610fe0565b6040516101e69190613469565b61022261038d3660046132d3565b611133565b610306611140565b6102226103a83660046132d3565b61115f565b6102c86103bb3660046132d3565b6111b1565b6103d36103ce3660046132d3565b6111e6565b6040516101e691906135e9565b6103f36103ee3660046132d3565b6113b1565b6040516101e6919061361b565b6102c861040e3660046132d3565b61147f565b61022261042136600461362f565b611492565b61022261043436600461365f565b6118e9565b61022261044736600461369b565b611d40565b6101dc61045a3660046132d3565b60009081526009602052604090205490565b61047f61047a3660046132d3565b611e54565b6040516101e691906136c9565b7f0000000000000000000000000000000000000000000000000000000000000000610352565b600081815260176020526040812060040154816104ce84610529565b905060008160048111156104e4576104e46132ec565b1480610501575060018160048111156104ff576104ff6132ec565b145b1561050d575092915050565b6105218261051c6001426136f2565b611fea565b949350505050565b60008181526016602052604081205482906001600160a01b031661056057604051635eeb253d60e11b815260040160405180910390fd5b600083815260176020526040812090815460ff166004811115610585576105856132ec565b1480156105a2575060008481526017602052604090206005015442115b156105b157600292505061060f565b6001815460ff1660048111156105c9576105c96132ec565b14806105ea57506000815460ff1660048111156105e8576105e86132ec565b145b80156105f95750806004015442115b1561060857600392505061060f565b5460ff1691505b50919050565b6001610620836113b1565b6006811115610631576106316132ec565b14610668576040517fae9dcffd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106728282612002565b6000828152601860209081526040808320600180820154855260168452828520600e54845160e0810186529282015467ffffffffffffffff90811684526002830154968401969096526003820154948301949094526004810154606083015260058101546080830152600681015460a0830152600781015490941660c08201529093916064916201000090910460ff169061070c906121c0565b6107169190613705565b6107209190613732565b600e54909150600090606490610740906301000000900460ff1684613705565b61074a9190613732565b905080601960010160008282546107619190613746565b909155505060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156107d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f79190613759565b6108035761080361377b565b8184600401600082825461081791906136f2565b9091555050600e5460008781526009602052604090205461010090910460ff161161084557610845866121d6565b505050505050565b826000808281526018602052604090205460ff166006811115610872576108726132ec565b0361089057604051638b41ec7f60e01b815260040160405180910390fd5b600084815260186020526040902060058101546001600160a01b031633146108e4576040517f57a6f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108ef866113b1565b90506004816006811115610905576109056132ec565b0361093c576040517fc2cbf77700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816006811115610950576109506132ec565b0361096a5761096582600101548787876123aa565b610845565b600581600681111561097e5761097e6132ec565b036109935761096582600101548787876125e7565b60038160068111156109a7576109a76132ec565b036109b6576109653387612813565b60018160068111156109ca576109ca6132ec565b0361084557610845866121d6565b60006109eb826109e6612835565b612840565b92915050565b60006109eb826109ff612835565b612854565b604080516020808201859052818301849052825180830384018152606090920190925280519101206000903390610a3a816128c8565b8015610a635750600154600082815260208190526040902060ff90911690610a61906128f5565b105b8015610a8457506000818152602081905260409020610a8290836128ff565b155b95945050505050565b6000818152601860209081526040808320600181015484526016909252822060115461010090610ac09060ff1682613791565b6004830154610ad39161ffff1690613705565b6105219190613732565b60008381526016602052604090205483906001600160a01b0316610b1457604051635eeb253d60e11b815260040160405180910390fd5b6000848152601660205260409020600181015467ffffffffffffffff168410610b69576040517f3b920b8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820188905281830187905282518083038401815260609092018352815191810191909120600081815291829052919020610baa90336128ff565b610be0576040517fd651ce1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601860209081526040808320600181018a905560038101899055898452601790925282209091610c14846113b1565b6006811115610c2557610c256132ec565b14158015610c4d57506006610c39846113b1565b6006811115610c4a57610c4a6132ec565b14155b15610c84576040517fff556acf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600860205260409020429055610c9f8387611d40565b60058201805473ffffffffffffffffffffffffffffffffffffffff19163317905542600283015560018181018054600090610cdb908490613746565b92505081905550610cf0888360020154612921565b816002016000828254610d0391906136f2565b90915550506040805160e081018252600186015467ffffffffffffffff9081168252600287015460208301526003870154928201929092526004860154606082015260058601546080820152600686015460a0820152600786015490911660c08201526000908190610d74906121c0565b90506006610d81866113b1565b6006811115610d9257610d926132ec565b03610dc557600e54606490610daa9060ff1683613705565b610db49190613732565b610dbe90826136f2565b9150610dc9565b8091505b610dd33383612940565b8160196000016000828254610de89190613746565b9091555050600484018190556005840154610e0c906001600160a01b031686612a14565b835460ff191660011784556040518981528a907ff530852268993f91008f1a1e0b09b5c813acd4188481f1fa83c33c7182e814b49060200160405180910390a26001808701549084015467ffffffffffffffff909116148015610e8457506000835460ff166004811115610e8257610e826132ec565b145b15610ec657825460ff191660011783554260038401556040518a907f85e1543bf2f84fe80c6badbce3648c8539ad1df4d2b3d822938ca0538be727e690600090a25b50505050505050505050565b336000908152600d60205260409020606090610ef490610ef190612a36565b90565b905090565b610f038282610a04565b610f39576040517f424a04ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820185905281830184905282518083038401815260609092018352815191810191909120600081815291829052919020610f7a9033612a43565b50600154600082815260208190526040902060ff90911690610f9b906128f5565b03610fdb57827f3bef2ebab8cc92e0edda5decf18232f0606a18405ef674b51ea9d1e0e3839b4183604051610fd291815260200190565b60405180910390a25b505050565b610fe8613177565b604080516101008082018352600e805460ff80821660808601908152938204811660a080870191909152620100008304821660c08701526301000000909204811660e086015292845284519081018552600f8054825260105460208381019190915260115490941695820195909552601280549495929493860193919291606084019190611075906137ac565b80601f01602080910402602001604051908101604052809291908181526020018280546110a1906137ac565b80156110ee5780601f106110c3576101008083540402835291602001916110ee565b820191906000526020600020905b8154815290600101906020018083116110d157829003601f168201915b50505091835250506004919091015460ff9081166020928301529183526040805180830182526006860154909316835290830191909152600790920154910152919050565b61113d8133611492565b50565b336000908152600c60205260409020606090610ef490610ef190612a36565b806000808281526018602052604090205460ff166006811115611184576111846132ec565b036111a257604051638b41ec7f60e01b815260040160405180910390fd5b6111ad82333361084d565b5050565b60008060006111c7846111c2612835565b612a58565b9092509050818015610521575060045460ff9081169116109392505050565b6111ee6131ea565b816000808281526018602052604090205460ff166006811115611213576112136132ec565b0361123157604051638b41ec7f60e01b815260040160405180910390fd5b60008381526018602052604090206112476131ea565b600180830154600090815260166020908152604091829020825160a0808201855282546001600160a01b03168252845160e0810186529583015467ffffffffffffffff9081168752600284015487860152600384015487870152600484015460608801526005840154608088015260068401549187019190915260078301541660c08601529182019390935281518083018352600884018054929493850192829082906112f3906137ac565b80601f016020809104026020016040519081016040528092919081815260200182805461131f906137ac565b801561136c5780601f106113415761010080835404028352916020019161136c565b820191906000526020600020905b81548152906001019060200180831161134f57829003601f168201915b505050918352505060019190910154602091820152908252600a83015482820152600b9092015460409091015290825260039092015491810191909152915050919050565b6000818152601860205260408120600181015482036113d35750600092915050565b60006113e28260010154610529565b90506004825460ff1660068111156113fc576113fc6132ec565b0361140b575060049392505050565b600281600481111561141f5761141f6132ec565b0361142e575060059392505050565b6003816004811115611442576114426132ec565b03611451575060029392505050565b6004816004811115611465576114656132ec565b03611474575060039392505050565b505460ff1692915050565b60006109eb8261148d612835565b612b07565b60008281526016602052604090205482906001600160a01b03166114c957604051635eeb253d60e11b815260040160405180910390fd5b6000838152601660209081526040808320601790925290912081546001600160a01b0316331461150c576040516334c69e3160e11b815260040160405180910390fd5b600061151786610529565b9050600281600481111561152d5761152d6132ec565b1415801561154d5750600481600481111561154a5761154a6132ec565b14155b801561156b57506003816004811115611568576115686132ec565b14155b156115a2576040517fc00b5b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600201546000036115e0576040517fbd8bdd9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028160048111156115f4576115f46132ec565b0361167e57815460ff1916600217825560405186907ff903f4774c7bd27355f9d7fcbc382b079b164a697a44ac5d95267a4c3cb3bb2290600090a26116518661164c8860009081526017602052604090206005015490565b612921565b82600101546116609190613705565b8260020160008282546116739190613746565b909155506117f59050565b6004816004811115611692576116926132ec565b036117e9576040805160a0808201835285546001600160a01b03168252825160e081018452600187015467ffffffffffffffff90811682526002880154602083810191909152600389015483870152600489015460608401526005890154608084015260068901549383019390935260078801541660c082015290820152815180830183526008860180546117df94889390850192909182908290611736906137ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611762906137ac565b80156117af5780601f10611784576101008083540402835291602001916117af565b820191906000526020600020905b81548152906001019060200180831161179257829003601f168201915b505050505081526020016001820154815250508152602001600a8201548152602001600b82015481525050612b37565b60028301556117f5565b815460ff191660031782555b825461180a906001600160a01b031687612b70565b6002820154601a8054829190600090611824908490613746565b909155505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613759565b6118d957604051637c2ccffd60e11b815260040160405180910390fd5b5050600060029091015550505050565b60006118fc6118f783613955565b612b92565b90503361190c6020840184613a44565b6001600160a01b031614611933576040516334c69e3160e11b815260040160405180910390fd5b6000818152601660205260409020546001600160a01b031615611982576040517ffc7d069000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610120820135158061199d5750606082013561012083013510155b156119d4576040517fdf63f61a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119e46040830160208401613a61565b67ffffffffffffffff16600003611a27576040517f535ed2be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a376040830160208401613a61565b67ffffffffffffffff16611a52610100840160e08501613a61565b67ffffffffffffffff161115611a94576040517fb9551ab100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060820135600003611ad2576040517f090a5ecd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080820135600003611b10576040517f6aba7aae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c0820135600003611b4e576040517ffb7df0c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0820135600003611b8c576040517f47ba51c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b9a610100830183613a7e565b611ba49080613a9e565b9050600003611bdf576040517f86f8cf9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60155460608301351115611c1f576040517f1267b3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526016602052604090208290611c398282613c33565b50611c4a9050606083013542613746565b600082815260176020526040902060040155611c6b61012083013542613746565b600082815260176020908152604090912060050191909155611c9990611c9390840184613a44565b82612bc2565b6000611cac611ca784613955565b612b37565b6000838152601760205260408120600201829055601980549293508392909190611cd7908490613746565b90915550611ce790503382612940565b7f5fdb86c365a247a4d97dcbcc5c3abde9d6e3e2de26273f3fda8eef5073b9a96c82846020016017600086815260200190815260200160002060050154604051611d3393929190613d2b565b60405180910390a1505050565b6000828152601860209081526040808320600101548084526016909252909120546001600160a01b0316611d8757604051635eeb253d60e11b815260040160405180910390fd5b600083815260186020908152604080832060018101548452601683528184208251600380825260808201909452919490939092908201606080368337019050509050611dda611dd5876109d8565b612be4565b81600081518110611ded57611ded613da7565b60209081029190910101526009820154611e0690612bf5565b81600181518110611e1957611e19613da7565b602002602001018181525050826003015481600281518110611e3d57611e3d613da7565b602002602001018181525050610845868683612c01565b611e5c6131f9565b60008281526016602052604090205482906001600160a01b0316611e9357604051635eeb253d60e11b815260040160405180910390fd5b600083815260166020908152604091829020825160a0808201855282546001600160a01b03168252845160e081018652600184015467ffffffffffffffff90811682526002850154828701526003850154828801526004850154606083015260058501546080830152600685015492820192909252600784015490911660c08201529281019290925282518084018452600882018054939492939285019282908290611f3e906137ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6a906137ac565b8015611fb75780601f10611f8c57610100808354040283529160200191611fb7565b820191906000526020600020905b815481529060010190602001808311611f9a57829003601f168201915b505050505081526020016001820154815250508152602001600a8201548152602001600b82015481525050915050919050565b6000818310611ff95781611ffb565b825b9392505050565b600061200d82612d94565b9050428110612048576040517f6b4b1a4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546120559082613746565b421061208d576040517fde55698e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600a6020908152604080832085845290915290205460ff16156120e0576040517efab7d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120ea8383612b07565b612120576040517fd3ffa66b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600b6020908152604080832085845290915290205460ff1615612174576040517f98e7e55100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600b602090815260408083208584528252808320805460ff19166001908117909155868452600990925282208054919290916121b6908490613746565b9091555050505050565b600081602001518260a001516109eb9190613705565b60008181526018602090815260408083206001810154808552601790935292206002830154612206908390612921565b8160020160008282546122199190613746565b90915550506005830154612236906001600160a01b031685612813565b600084815260208190526040812090818161225182826132a1565b5050845460ff1916600617855550506000600284018190556004840181905560058401805473ffffffffffffffffffffffffffffffffffffffff1916905560018281018054919290916122a59084906136f2565b9091555050600383015460405190815282907f1d31c9f8dea6e179f6a050db117595feea8937029ea51f5168a4780be7e8f5529060200160405180910390a2600084815260096020526040812055600082815260166020526040812060018084015490820154919291612322919067ffffffffffffffff166136f2565b600783015490915067ffffffffffffffff168111801561235757506001835460ff166004811115612355576123556132ec565b145b1561084557825460ff191660041783556123726001426136f2565b600484015560405184907f4769361a442504ecaf038f35e119bcccdd5e42096b24c09e3c17fd17c6684c0290600090a2505050505050565b60008481526016602052604090205484906001600160a01b03166123e157604051635eeb253d60e11b815260040160405180910390fd5b600085815260176020908152604080832060168352818420815460ff19166003178255888552601890935292208154612423906001600160a01b031689612b70565b600581015461243b906001600160a01b031688612813565b600061244b898360020154612921565b600483015490915061245d8183613746565b601a805460009061246f908490613746565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038981166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a9190613759565b61253757604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156125a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ca9190613759565b610ec657604051637c2ccffd60e11b815260040160405180910390fd5b60008481526016602052604090205484906001600160a01b031661261e57604051635eeb253d60e11b815260040160405180910390fd5b60008481526018602052604090206005810154612644906001600160a01b031686612813565b600061266d8783600201546126688a60009081526017602052604090206005015490565b612da7565b600483015490915061267f8183613746565b601a8054600090612691908490613746565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273c9190613759565b61275957604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156127c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ec9190613759565b61280957604051637c2ccffd60e11b815260040160405180910390fd5b5050505050505050565b6001600160a01b0382166000908152600d60205260409020610fdb9082612e69565b6000610ef442612e75565b6000611ffb61284f8484612854565b612ea1565b60008061286361010043613dbd565b6006549091506000906101009061287d9060ff1686613705565b6128879190613dbd565b9050600061289761010087613dbd565b90506000610100826128a98587613746565b6128b39190613746565b6128bd9190613dbd565b979650505050505050565b60008060008381526018602052604090205460ff1660068111156128ee576128ee6132ec565b1492915050565b60006109eb825490565b6001600160a01b03811660009081526001830160205260408120541515611ffb565b600082815260176020526040812060040154611ffb9084908490612da7565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152306024830181905260448301849052917f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af11580156129d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f79190613759565b610fdb57604051637c2ccffd60e11b815260040160405180910390fd5b6001600160a01b0382166000908152600d60205260409020610fdb9082612efb565b60606000611ffb83612f07565b6000611ffb836001600160a01b038416612f63565b6000806000612a66856113b1565b60008681526008602052604081205491925090612a8290612e75565b90506001826006811115612a9857612a986132ec565b141580612aac5750612aaa8582612fb2565b155b15612abf57600080935093505050612b00565b612ac98686612854565b92506000612ad684612ea1565b90506000612ae388610a8d565b9050801580612af95750612af78183613dbd565b155b9550505050505b9250929050565b6000806000612b168585612a58565b9092509050818015610a84575060045460ff90811691161015949350505050565b6000612b468260200151612fbc565b602083015160408101519051612b66919067ffffffffffffffff16613705565b6109eb9190613705565b6001600160a01b0382166000908152600c60205260409020610fdb9082612e69565b600081604051602001612ba591906136c9565b604051602081830303815290604052805190602001209050919050565b6001600160a01b0382166000908152600c60205260409020610fdb9082612efb565b600060ff1982168161052182612fd2565b600080611ffb83612fd2565b6000838152600a6020526040812090612c18612835565b815260208101919091526040016000205460ff1615612c63576040517f3edef7db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546040517f94c8919d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116906394c8919d90612cae9085908590600401613dd1565b602060405180830381865afa158015612ccb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cef9190613759565b612d25576040517ffcd03a4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600a60205260408120600191612d3e612835565b815260200190815260200160002060006101000a81548160ff0219169083151502179055507f3b989d183b84b02259d7c14b34a9c9eb0fccb4c355a920d25e581e25aef4993d83604051611d3391815260200190565b60006109eb612da283613044565b613051565b6000838152601660205260408120828410612dee576040517f56607cb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600183015467ffffffffffffffff9081168252600284015460208301526003840154928201929092526004830154606082015260058301546080820152600683015460a0820152600783015490911660c0820152612e5590612fbc565b612e5f85856136f2565b610a849190613705565b6000611ffb838361307d565b60006109eb7f000000000000000000000000000000000000000000000000000000000000000083613732565b60008060ff8316612eb36001436136f2565b612ebd91906136f2565b4090506000819003612ed157612ed161377b565b60408051602081018390520160405160208183030381529060405280519060200120915050919050565b6000611ffb8383612f63565b606081600001805480602002602001604051908101604052809291908181526020018280548015612f5757602002820191906000526020600020905b815481526020019060010190808311612f43575b50505050509050919050565b6000818152600183016020526040812054612faa575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109eb565b5060006109eb565b6000818311611ffb565b6000816020015182608001516109eb9190613705565b7fff00000000000000000000000000000000000000000000000000000000000000811660015b602081101561060f57600891821c91613012908290613705565b83901b7fff00000000000000000000000000000000000000000000000000000000000000169190911790600101612ff8565b60006109eb826001613746565b60006109eb7f000000000000000000000000000000000000000000000000000000000000000083613705565b600081815260018301602052604081205480156131665760006130a16001836136f2565b85549091506000906130b5906001906136f2565b905081811461311a5760008660000182815481106130d5576130d5613da7565b90600052602060002001549050808760000184815481106130f8576130f8613da7565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061312b5761312b613e7c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109eb565b60009150506109eb565b5092915050565b60408051610100810182526000608080830182815260a080850184905260c0850184905260e08501849052908452845190810185528281526020808201849052818601849052606080830152918101839052818401528351908101845290815290918201905b8152602001600081525090565b60405180604001604052806131dd5b6040518060a0016040528060006001600160a01b031681526020016132686040518060e00160405280600067ffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600067ffffffffffffffff1681525090565b815260200161328d604051806040016040528060608152602001600080191681525090565b815260006020820181905260409091015290565b508054600082559060005260206000209081019061113d91905b808211156132cf57600081556001016132bb565b5090565b6000602082840312156132e557600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6020810160058310613316576133166132ec565b91905290565b6000806040838503121561332f57600080fd5b50508035926020909101359150565b6001600160a01b038116811461113d57600080fd5b60008060006060848603121561336857600080fd5b83359250602084013561337a8161333e565b9150604084013561338a8161333e565b809150509250925092565b6000610100828403121561060f57600080fd5b600080600061014084860312156133be57600080fd5b83359250602084013591506133d68560408601613395565b90509250925092565b6020808252825182820181905260009190848201906040850190845b81811015613417578351835292840192918401916001016133fb565b50909695505050505050565b6000815180845260005b818110156134495760208185018101518683018201520161342d565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000825160ff8082511660208501528060208301511660408501528060408301511660608501528060608301511660808501526020850151915060e060a08501528151610100850152602082015161012085015280604083015116610140850152606082015160a06101608601526134e96101a0860182613423565b60809390930151919091166101808501525060408401515160ff1660c084015260609093015160e0909201919091525090565b60008151604084526135316040850182613423565b602093840151949093019390935250919050565b60006101606001600160a01b038351168452602083015167ffffffffffffffff808251166020870152602082015160408701526040820151606087015260608201516080870152608082015160a087015260a082015160c08701528060c08301511660e087015250506040830151816101008601526135c68286018261351c565b915050606083015161012085015260808301516101408501528091505092915050565b6020815260008251604060208401526136056060840182613545565b9050602084015160408401528091505092915050565b6020810160078310613316576133166132ec565b6000806040838503121561364257600080fd5b8235915060208301356136548161333e565b809150509250929050565b60006020828403121561367157600080fd5b813567ffffffffffffffff81111561368857600080fd5b82016101608185031215611ffb57600080fd5b60008061012083850312156136af57600080fd5b823591506136c08460208501613395565b90509250929050565b602081526000611ffb6020830184613545565b634e487b7160e01b600052601160045260246000fd5b818103818111156109eb576109eb6136dc565b80820281158282048414176109eb576109eb6136dc565b634e487b7160e01b600052601260045260246000fd5b6000826137415761374161371c565b500490565b808201808211156109eb576109eb6136dc565b60006020828403121561376b57600080fd5b81518015158114611ffb57600080fd5b634e487b7160e01b600052600160045260246000fd5b61ffff828116828216039080821115613170576131706136dc565b600181811c908216806137c057607f821691505b60208210810361060f57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613819576138196137e0565b60405290565b60405160a0810167ffffffffffffffff81118282101715613819576138196137e0565b60405160e0810167ffffffffffffffff81118282101715613819576138196137e0565b604051601f8201601f1916810167ffffffffffffffff8111828210171561388e5761388e6137e0565b604052919050565b67ffffffffffffffff8116811461113d57600080fd5b6000604082840312156138be57600080fd5b6138c66137f6565b9050813567ffffffffffffffff808211156138e057600080fd5b818401915084601f8301126138f457600080fd5b8135602082821115613908576139086137e0565b61391a601f8301601f19168201613865565b9250818352868183860101111561393057600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600081360361016081121561396957600080fd5b61397161381f565b833561397c8161333e565b815260e0601f198301121561399057600080fd5b613998613842565b915060208401356139a881613896565b8083525060408401356020830152606084013560408301526080840135606083015260a0840135608083015260c084013560a083015260e08401356139ec81613896565b60c083015260208101919091526101008301359067ffffffffffffffff821115613a1557600080fd5b613a21368386016138ac565b604082015261012084013560608201526101409093013560808401525090919050565b600060208284031215613a5657600080fd5b8135611ffb8161333e565b600060208284031215613a7357600080fd5b8135611ffb81613896565b60008235603e19833603018112613a9457600080fd5b9190910192915050565b6000808335601e19843603018112613ab557600080fd5b83018035915067ffffffffffffffff821115613ad057600080fd5b602001915036819003821315612b0057600080fd5b600081356109eb81613896565b601f821115610fdb576000816000526020600020601f850160051c81016020861015613b1b5750805b601f850160051c820191505b8181101561084557828155600101613b27565b8135601e19833603018112613b4e57600080fd5b8201803567ffffffffffffffff811115613b6757600080fd5b60208136038184011315613b7a57600080fd5b613b8e82613b8886546137ac565b86613af2565b6000601f831160018114613bc45760008415613bac57508482018301355b600019600386901b1c1916600185901b178655613c21565b600086815260209020601f19851690835b82811015613bf6578785018601358255938501936001909101908501613bd5565b5085821015613c155760001960f88760031b161c198585890101351681555b505060018460011b0186555b50508085013560018501555050505050565b8135613c3e8161333e565b6001600160a01b03811673ffffffffffffffffffffffffffffffffffffffff19835416178255506020820135613c7381613896565b60018201805467ffffffffffffffff191667ffffffffffffffff83161790555060408201356002820155606082013560038201556080820135600482015560a0820135600582015560c08201356006820155613cf7613cd460e08401613ae5565b6007830167ffffffffffffffff821667ffffffffffffffff198254161781555050565b613d11613d08610100840184613a7e565b60088301613b3a565b610120820135600a820155610140820135600b8201555050565b83815261012081018335613d3e81613896565b67ffffffffffffffff8082166020850152602086013560408501526040860135606085015260608601356080850152608086013560a085015260a086013560c085015260c08601359150613d9182613896565b1660e08301526101009091019190915292915050565b634e487b7160e01b600052603260045260246000fd5b600082613dcc57613dcc61371c565b500690565b82358152602080840135908201526000610120828101613e01604085016040880180358252602090810135910152565b613e1b608085016080880180358252602090810135910152565b613e3560c0850160c0880180358252602090810135910152565b61010084019190915283519081905261014083019060209081860160005b82811015613e6f57815185529383019390830190600101613e53565b5092979650505050505050565b634e487b7160e01b600052603160045260246000fdfea26469706673582212201d887035f7a6439e91ed5b3d5b05614871300c525708ad77111dbb77f53ace0d64736f6c63430008170033"; + public static string BYTECODE = "0x60c06040523480156200001157600080fd5b5060405162004e8438038062004e8483398101604081905262000034916200056f565b602083015180516040850151516001805460ff191660ff90921691909117905582906001600160401b038116600003620000815760405163015536c760e51b815260040160405180910390fd5b6001600160401b03166080526101004311620000b0576040516338f5f66160e11b815260040160405180910390fd5b8151600280546020850151604086015160608701516001600160401b039586166001600160801b0319909416939093176801000000000000000095909216949094021761ffff60801b1916600160801b60ff9485160260ff60881b191617600160881b939091169290920291909117815560808301518391906003906200013890826200072d565b5050600480546001600160a01b0319166001600160a01b0393841617905550831660a05250825151606460ff909116111562000187576040516302bd816360e41b815260040160405180910390fd5b606483600001516040015160ff161115620001b5576040516354e5e0ab60e11b815260040160405180910390fd5b82516040810151602090910151606491620001d091620007f9565b60ff161115620001f3576040516317ff9d0f60e21b815260040160405180910390fd5b82518051600b805460208085015160408087015160609788015160ff90811663010000000263ff0000001992821662010000029290921663ffff0000199482166101000261ffff1990971698821698909817959095179290921695909517178355808801518051600c80549383015196830151978301518516600160881b0260ff60881b1998909516600160801b029790971661ffff60801b196001600160401b0397881668010000000000000000026001600160801b031990951697909216969096179290921791909116939093171783556080820151869391929190600d90620002e090826200072d565b50505060408201515160038201805460ff191660ff909216919091179055606090910151600490910180546001600160401b0319166001600160401b03909216919091179055506200082b915050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b03811182821017156200036b576200036b62000330565b60405290565b604051608081016001600160401b03811182821017156200036b576200036b62000330565b604051601f8201601f191681016001600160401b0381118282101715620003c157620003c162000330565b604052919050565b805160ff81168114620003db57600080fd5b919050565b80516001600160401b0381168114620003db57600080fd5b600060a082840312156200040b57600080fd5b6200041562000346565b90506200042282620003e0565b8152602062000433818401620003e0565b818301526200044560408401620003c9565b60408301526200045860608401620003c9565b606083015260808301516001600160401b03808211156200047857600080fd5b818501915085601f8301126200048d57600080fd5b815181811115620004a257620004a262000330565b620004b6601f8201601f1916850162000396565b91508082528684828501011115620004cd57600080fd5b60005b81811015620004ed578381018501518382018601528401620004d0565b5060008482840101525080608085015250505092915050565b6000602082840312156200051957600080fd5b604051602081016001600160401b03811182821017156200053e576200053e62000330565b6040529050806200054f83620003c9565b905292915050565b80516001600160a01b0381168114620003db57600080fd5b6000806000606084860312156200058557600080fd5b83516001600160401b03808211156200059d57600080fd5b9085019081870360e0811215620005b357600080fd5b620005bd62000371565b6080821215620005cc57600080fd5b620005d662000371565b9150620005e384620003c9565b8252620005f360208501620003c9565b60208301526200060660408501620003c9565b60408301526200061960608501620003c9565b6060830152908152608083015190828211156200063557600080fd5b6200064389838601620003f8565b6020820152620006578960a0860162000506565b60408201526200066a60c08501620003e0565b6060820152955062000683925050506020850162000557565b9150620006936040850162000557565b90509250925092565b600181811c90821680620006b157607f821691505b602082108103620006d257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000728576000816000526020600020601f850160051c81016020861015620007035750805b601f850160051c820191505b8181101562000724578281556001016200070f565b5050505b505050565b81516001600160401b0381111562000749576200074962000330565b62000761816200075a84546200069c565b84620006d8565b602080601f831160018114620007995760008415620007805750858301515b600019600386901b1c1916600185901b17855562000724565b600085815260208120601f198616915b82811015620007ca57888601518255948401946001909101908401620007a9565b5085821015620007e95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff81811683821602908116908181146200082457634e487b7160e01b600052601160045260246000fd5b5092915050565b60805160a0516145fb62000889600039600081816104bf01528181610f1601528181611fb70152818161252a015281816125da01528181612769015281816128190152612c430152600081816134ad015261373d01526145fb6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636e2b54ee116100f9578063c0cc4add11610097578063e8aa0a0711610071578063e8aa0a0714610461578063f752196b14610474578063fb1e61ca1461049d578063fc0c546a146104bd57600080fd5b8063c0cc4add14610428578063c5d433511461043b578063d02bbe331461044e57600080fd5b8063a29c29a4116100d3578063a29c29a4146103b2578063a3a0807e146103c5578063b396dc79146103e8578063be5cdc481461040857600080fd5b80636e2b54ee146103845780639777b72c1461039757806399b6da0c1461039f57600080fd5b8063329b5a0b1161016657806351a766421161014057806351a76642146103035780635da73835146103165780636b00c8cf1461032b5780636c70bee91461036f57600080fd5b8063329b5a0b14610298578063458d2bf1146102cb5780634641dce6146102de57600080fd5b806312827602116101a2578063128276021461022e5780631d873c1b14610241578063237d84821461025457806326d6f8341461026757600080fd5b806302fa8e65146101c957806305b90773146101f95780630aefaabe14610219575b600080fd5b6101dc6101d736600461380a565b6104e3565b6040516001600160401b0390911681526020015b60405180910390f35b61020c61020736600461380a565b610573565b6040516101f09190613839565b61022c610227366004613868565b610696565b005b61022c61023c3660046138cf565b610829565b61022c61024f366004613912565b6108fa565b61022c6102623660046138cf565b610da0565b61028a61027536600461380a565b60009081526012602052604090206003015490565b6040519081526020016101f0565b6101dc6102a636600461380a565b600090815260116020526040902060020154600160c01b90046001600160401b031690565b61028a6102d936600461380a565b610fec565b6102f16102ec36600461380a565b611005565b60405160ff90911681526020016101f0565b61028a61031136600461380a565b611018565b61031e61106f565b6040516101f09190613952565b61035761033936600461380a565b6000908152601260205260409020600401546001600160a01b031690565b6040516001600160a01b0390911681526020016101f0565b610377611096565b6040516101f091906139dc565b61022c61039236600461380a565b61120d565b61031e61121a565b61022c6103ad366004613aad565b611239565b61022c6103c036600461380a565b61177f565b6103d86103d336600461380a565b6117d1565b60405190151581526020016101f0565b6103fb6103f636600461380a565b61180d565b6040516101f09190613bcb565b61041b61041636600461380a565b611aef565b6040516101f09190613c06565b6103d861043636600461380a565b611bbd565b61022c610449366004613c1a565b611bd0565b6103d861045c3660046138cf565b612051565b61022c61046f366004613c3f565b6120bd565b6101dc61048236600461380a565b6000908152600660205260409020546001600160401b031690565b6104b06104ab36600461380a565b6121ed565b6040516101f09190613c6d565b7f0000000000000000000000000000000000000000000000000000000000000000610357565b600081815260116020526040812060020154600160801b90046001600160401b03168161050f84610573565b9050600081600481111561052557610525613823565b14806105425750600181600481111561054057610540613823565b145b1561054e575092915050565b61056b6001600160401b038316610566600142613c96565b612403565b949350505050565b60008181526010602052604081205482906001600160a01b03166105aa57604051635eeb253d60e11b815260040160405180910390fd5b600083815260116020526040812090815460ff1660048111156105cf576105cf613823565b14801561060e5750600084815260116020526040902060020154600160c01b90046001600160401b03166001600160401b0316426001600160401b0316115b1561061d576002925050610690565b6001815460ff16600481111561063557610635613823565b148061065657506000815460ff16600481111561065457610654613823565b145b801561067a575060028101546001600160401b03600160801b909104811642909116115b15610689576003925050610690565b5460ff1691505b50919050565b826000808281526012602052604090205460ff1660068111156106bb576106bb613823565b036106d957604051638b41ec7f60e01b815260040160405180910390fd5b600084815260126020526040902060048101546001600160a01b0316331461072d576040517f57a6f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061073886611aef565b9050600481600681111561074e5761074e613823565b03610785576040517fc2cbf77700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281600681111561079957610799613823565b036107b3576107ae826001015487878761241b565b610821565b60058160068111156107c7576107c7613823565b036107dc576107ae8260010154878787612664565b60038160068111156107f0576107f0613823565b036107ff576107ae33876128ad565b600181600681111561081357610813613823565b0361082157610821866128cf565b505050505050565b6108338282612051565b610869576040517f424a04ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108758383612b27565b60008181526020819052604090209091506108909033612b6c565b50600154600082815260208190526040902060ff909116906108b190612b81565b036108f5576040516001600160401b038316815283907fc8e6c955744189a19222ec226b72ac1435d88d5745252dac56e6f679f64c037a9060200160405180910390a25b505050565b60008381526010602052604090205483906001600160a01b031661093157604051635eeb253d60e11b815260040160405180910390fd5b600084815260106020526040902060048101546001600160401b0390811690851610610989576040517f3b920b8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109958686612b27565b60008181526020819052604090209091506109b09033612b8b565b6109e6576040517fd651ce1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152601260209081526040808320600181018a90556002810180546fffffffffffffffff00000000000000001916600160401b6001600160401b038c1602179055898452601190925282209091610a3f84611aef565b6006811115610a5057610a50613823565b14158015610a7857506006610a6484611aef565b6006811115610a7557610a75613823565b14155b15610aaf576040517fff556acf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600560205260409020805467ffffffffffffffff1916426001600160401b0316179055610ae183876120bd565b60048201805473ffffffffffffffffffffffffffffffffffffffff191633179055600280830180546001600160401b0342811667ffffffffffffffff19909216919091179091559082018054600192600091610b3f91859116613ca9565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610b84888360020160009054906101000a90046001600160401b0316612bad565b816001016000828254610b979190613c96565b90915550506040805160e081018252600186015481526002860154602082015260038601549181019190915260048501546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c08201526000908190610c1090612bdc565b90506006610c1d86611aef565b6006811115610c2e57610c2e613823565b03610c6157600b54606490610c469060ff1683613cc9565b610c509190613cf6565b610c5a9082613c96565b9150610c65565b8091505b610c6f3383612bfb565b8160136000016000828254610c849190613d0a565b9091555050600384018190556004840154610ca8906001600160a01b031686612ccf565b835460ff191660011784556040516001600160401b038a1681528a907f8f301470a994578b52323d625dfbf827ca5208c81747d3459be7b8867baec3ec9060200160405180910390a2600486015460028401546001600160401b039081169116148015610d2a57506000835460ff166004811115610d2857610d28613823565b145b15610d9457825460ff191660011783556002830180546001600160401b034216600160401b026fffffffffffffffff0000000000000000199091161790556040518a907f85e1543bf2f84fe80c6badbce3648c8539ad1df4d2b3d822938ca0538be727e690600090a25b50505050505050505050565b6001610dab83611aef565b6006811115610dbc57610dbc613823565b14610df3576040517fae9dcffd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dfd8282612cf1565b6000828152601260209081526040808320600180820154855260108452828520600b54845160e08101865292820154835260028201549583019590955260038101549382019390935260048301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152909391926064916201000090910460ff1690610ea090612bdc565b610eaa9190613cc9565b610eb49190613cf6565b600b54909150600090606490610ed4906301000000900460ff1684613cc9565b610ede9190613cf6565b90508060136001016000828254610ef59190613d0a565b909155505060405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8b9190613d1d565b610f9757610f97613d3f565b81846003016000828254610fab9190613c96565b9091555050600b5460008781526006602052604090205461010090910460ff16906001600160401b03166001600160401b03161061082157610821866128cf565b6000610fff82610ffa612f08565b612f13565b92915050565b6000610fff82611013612f08565b612f27565b60008181526012602090815260408083206001810154845260109092528220600c546101009061105290600160801b900460ff1682613d55565b60018301546110659161ffff1690613cc9565b61056b9190613cf6565b336000908152600a602052604090206060906110919061108e90612fb9565b90565b905090565b61109e613762565b604080516101008082018352600b805460ff8082166080808701918252948304821660a080880191909152620100008404831660c08801526301000000909304821660e0870152855285519182018652600c80546001600160401b038082168552600160401b820416602085810191909152600160801b82048416988501989098527101000000000000000000000000000000000090049091166060830152600d805495969395938701949293919284019161115990613d70565b80601f016020809104026020016040519081016040528092919081815260200182805461118590613d70565b80156111d25780601f106111a7576101008083540402835291602001916111d2565b820191906000526020600020905b8154815290600101906020018083116111b557829003601f168201915b5050509190925250505081526040805160208181018352600385015460ff1682528301526004909201546001600160401b0316910152919050565b6112178133611bd0565b50565b3360009081526009602052604090206060906110919061108e90612fb9565b600061124c61124783613efe565b612fc6565b90503361125c6020840184614004565b6001600160a01b031614611283576040516334c69e3160e11b815260040160405180910390fd5b6000818152601060205260409020546001600160a01b0316156112d2576040517ffc7d069000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112e461014083016101208401614021565b6001600160401b0316158061132b575061130460e0830160c08401614021565b6001600160401b031661131f61014084016101208501614021565b6001600160401b031610155b15611362576040517fdf63f61a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61137260a0830160808401614021565b6001600160401b03166000036113b4576040517f535ed2be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113c460a0830160808401614021565b6001600160401b03166113de610100840160e08501614021565b6001600160401b0316111561141f576040517fb9551ab100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142f60e0830160c08401614021565b6001600160401b0316600003611471576040517f090a5ecd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208201356000036114af576040517f6aba7aae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608201356000036114ed576040517ffb7df0c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604082013560000361152b576040517f47ba51c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61153961010083018361403e565b611543908061405e565b905060000361157e576040517f86f8cf9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f546001600160401b031661159a60e0840160c08501614021565b6001600160401b031611156115db576040517f1267b3f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260106020526040902082906115f582826141f1565b50611608905060e0830160c08401614021565b6116129042613ca9565b600082815260116020526040902060020180546001600160401b0392909216600160801b0267ffffffffffffffff60801b1990921691909117905561165f61014083016101208401614021565b6116699042613ca9565b600082815260116020908152604090912060020180546001600160401b0393909316600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091556116ca906116c490840184614004565b82612ff6565b60006116dd6116d884613efe565b613018565b6000838152601160205260408120600101829055601380549293508392909190611708908490613d0a565b9091555061171890503382612bfb565b6000828152601160209081526040918290206002015491517f1bf9c457accf8703dbf7cdf1b58c2f74ddf2e525f98155c70b3d318d74609bd89261177292869290880191600160c01b90046001600160401b0316906143a3565b60405180910390a1505050565b806000808281526012602052604090205460ff1660068111156117a4576117a4613823565b036117c257604051638b41ec7f60e01b815260040160405180910390fd5b6117cd823333610696565b5050565b60008060006117e7846117e2612f08565b613054565b909250905081801561056b5750600254600160801b900460ff9081169116109392505050565b61189060405180604001604052806137cb6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b816000808281526012602052604090205460ff1660068111156118b5576118b5613823565b036118d357604051638b41ec7f60e01b815260040160405180910390fd5b600083815260126020526040902061196460405180604001604052806137cb6040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b600180830154600090815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e08101865295830154865260028301548685015260038301548686015260048301546001600160401b038082166060890152600160401b820481166080890152600160801b8204811692880192909252600160c01b90041660c0860152918201939093528151808301835260058401805492949385019282908290611a1990613d70565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4590613d70565b8015611a925780601f10611a6757610100808354040283529160200191611a92565b820191906000526020600020905b815481529060010190602001808311611a7557829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0390811683830152600890930154604090920191909152918352600290930154600160401b900490921691810191909152915050919050565b600081815260126020526040812060018101548203611b115750600092915050565b6000611b208260010154610573565b90506004825460ff166006811115611b3a57611b3a613823565b03611b49575060049392505050565b6002816004811115611b5d57611b5d613823565b03611b6c575060059392505050565b6003816004811115611b8057611b80613823565b03611b8f575060029392505050565b6004816004811115611ba357611ba3613823565b03611bb2575060039392505050565b505460ff1692915050565b6000610fff82611bcb612f08565b61310c565b60008281526010602052604090205482906001600160a01b0316611c0757604051635eeb253d60e11b815260040160405180910390fd5b6000838152601060209081526040808320601190925290912081546001600160a01b03163314611c4a576040516334c69e3160e11b815260040160405180910390fd5b6000611c5586610573565b90506002816004811115611c6b57611c6b613823565b14158015611c8b57506004816004811115611c8857611c88613823565b14155b8015611ca957506003816004811115611ca657611ca6613823565b14155b15611ce0576040517fc00b5b5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160010154600003611d1e576040517fbd8bdd9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816004811115611d3257611d32613823565b03611dd057815460ff1916600217825560405186907ff903f4774c7bd27355f9d7fcbc382b079b164a697a44ac5d95267a4c3cb3bb2290600090a2600086815260116020526040902060020154611d9a908790600160c01b90046001600160401b0316612bad565b6002830154611db291906001600160401b0316613cc9565b826001016000828254611dc59190613d0a565b90915550611f5d9050565b6004816004811115611de457611de4613823565b03611f51576040805160a0808201835285546001600160a01b03168252825160e08101845260018701548152600287015460208281019190915260038801548286015260048801546001600160401b038082166060850152600160401b820481166080850152600160801b8204811694840194909452600160c01b900490921660c08201529082015281518083018352600586018054611f4794889390850192909182908290611e9390613d70565b80601f0160208091040260200160405190810160405280929190818152602001828054611ebf90613d70565b8015611f0c5780601f10611ee157610100808354040283529160200191611f0c565b820191906000526020600020905b815481529060010190602001808311611eef57829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b031690820152600890910154604090910152613018565b6001830155611f5d565b815460ff191660031782555b8254611f72906001600160a01b031687613143565b600182015460148054829190600090611f8c908490613d0a565b909155505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120249190613d1d565b61204157604051637c2ccffd60e11b815260040160405180910390fd5b5050600060019091015550505050565b6000338161205f8585612b27565b905061206a81613165565b80156120935750600154600082815260208190526040902060ff9091169061209190612b81565b105b80156120b4575060008181526020819052604090206120b29083612b8b565b155b95945050505050565b6000828152601260209081526040808320600101548084526010909252909120546001600160a01b031661210457604051635eeb253d60e11b815260040160405180910390fd5b60008381526012602090815260408083206001810154845260108352818420825160038082526080820190945291949093909290820160608036833701905050905061215761215287610fec565b613192565b8160008151811061216a5761216a614443565b60209081029190910101526006820154612183906131a3565b8160018151811061219657612196614443565b6020026020010181815250508260020160089054906101000a90046001600160401b03166001600160401b0316816002815181106121d6576121d6614443565b6020026020010181815250506108218686836131af565b6122626040805160a080820183526000808352835160e081018552818152602080820183905281860183905260608083018490526080830184905293820183905260c0820183905280850191909152845180860186529283528201529091820190815260006020820181905260409091015290565b60008281526010602052604090205482906001600160a01b031661229957604051635eeb253d60e11b815260040160405180910390fd5b600083815260106020908152604091829020825160a0808201855282546001600160a01b03168252845160e0810186526001840154815260028401548186015260038401548187015260048401546001600160401b038082166060840152600160401b820481166080840152600160801b8204811693830193909352600160c01b900490911660c0820152928101929092528251808401845260058201805493949293928501928290829061234d90613d70565b80601f016020809104026020016040519081016040528092919081815260200182805461237990613d70565b80156123c65780601f1061239b576101008083540402835291602001916123c6565b820191906000526020600020905b8154815290600101906020018083116123a957829003601f168201915b50505091835250506001919091015460209182015290825260078301546001600160401b0316908201526008909101546040909101529392505050565b60008183106124125781612414565b825b9392505050565b60008481526010602052604090205484906001600160a01b031661245257604051635eeb253d60e11b815260040160405180910390fd5b600085815260116020908152604080832060108352818420815460ff19166003178255888552601290935292208154612494906001600160a01b031689613143565b60048101546124ac906001600160a01b0316886128ad565b60028101546000906124c8908a906001600160401b0316612bad565b60038301549091506124da8183613d0a565b601480546000906124ec908490613d0a565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038981166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125979190613d1d565b6125b457604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126479190613d1d565b610d9457604051637c2ccffd60e11b815260040160405180910390fd5b60008481526010602052604090205484906001600160a01b031661269b57604051635eeb253d60e11b815260040160405180910390fd5b600084815260126020526040902060048101546126c1906001600160a01b0316866128ad565b60028101546000906127079088906001600160401b0316612702826000908152601160205260409020600201546001600160401b03600160c01b9091041690565b61334d565b60038301549091506127198183613d0a565b6014805460009061272b908490613d0a565b90915550508254600490849060ff1916600183021790555060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156127b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d69190613d1d565b6127f357604051637c2ccffd60e11b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015612862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128869190613d1d565b6128a357604051637c2ccffd60e11b815260040160405180910390fd5b5050505050505050565b6001600160a01b0382166000908152600a602052604090206108f5908261342c565b600081815260126020908152604080832060018101548085526011909352922060028301546129089083906001600160401b0316612bad565b81600101600082825461291b9190613d0a565b90915550506004830154612938906001600160a01b0316856128ad565b600084815260208190526040812090818161295382826137d8565b5050845460ff1916600617855550506002808401805467ffffffffffffffff1916905560006003850181905560048501805473ffffffffffffffffffffffffffffffffffffffff191690559082018054600192906129bb9084906001600160401b0316614459565b82546101009290920a6001600160401b038181021990931691831602179091556002850154604051600160401b90910490911681528391507f33ba8f7627565d89f7ada2a6b81ea532b7aa9b11e91a78312d6e1fca0bfcd1dc9060200160405180910390a26000848152600660205260409020805467ffffffffffffffff19169055600082815260106020526040812060028301546004820154919291612a6e916001600160401b039081169116614459565b60048301546001600160401b039182169250600160c01b90041681118015612aab57506001835460ff166004811115612aa957612aa9613823565b145b1561082157825460ff19166004178355612ac6600142614459565b6002840180546001600160401b0392909216600160801b0267ffffffffffffffff60801b1990921691909117905560405184907f4769361a442504ecaf038f35e119bcccdd5e42096b24c09e3c17fd17c6684c0290600090a2505050505050565b60008282604051602001612b4e9291909182526001600160401b0316602082015260400190565b60405160208183030381529060405280519060200120905092915050565b6000612414836001600160a01b038416613438565b6000610fff825490565b6001600160a01b03811660009081526001830160205260408120541515612414565b6000828152601160205260408120600201546124149084908490600160801b90046001600160401b031661334d565b600081608001516001600160401b03168260400151610fff9190613cc9565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152306024830181905260448301849052917f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af1158015612c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb29190613d1d565b6108f557604051637c2ccffd60e11b815260040160405180910390fd5b6001600160a01b0382166000908152600a602052604090206108f59082613487565b6000612cfc82613493565b6001600160401b03169050428110612d40576040517f6b4b1a4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600254612d5d90600160401b90046001600160401b031682613d0a565b4210612d95576040517fde55698e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602090815260408083206001600160401b038616845290915290205460ff1615612df1576040517efab7d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dfb838361310c565b612e31576040517fd3ffa66b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602090815260408083206001600160401b038616845290915290205460ff1615612e8e576040517f98e7e55100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526008602090815260408083206001600160401b038087168552908352818420805460ff1916600190811790915587855260069093529083208054929390929091612edf91859116613ca9565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550505050565b6000611091426134a6565b6000612414612f228484612f27565b6134d2565b600080612f3661010043614479565b60025490915060009061010090612f659071010000000000000000000000000000000000900460ff168661448d565b612f6f91906144b8565b6001600160401b031690506000612f8861010087614479565b9050600061010082612f9a8587613d0a565b612fa49190613d0a565b612fae9190614479565b979650505050505050565b606060006124148361352c565b600081604051602001612fd99190613c6d565b604051602081830303815290604052805190602001209050919050565b6001600160a01b03821660009081526009602052604090206108f59082613487565b60006130278260200151613588565b602083015160a0810151606090910151613041919061448d565b6001600160401b0316610fff9190613cc9565b600080600061306285611aef565b60008681526005602052604081205491925090613087906001600160401b03166134a6565b9050600182600681111561309d5761309d613823565b1415806130b157506130af85826135a7565b155b156130c457600080935093505050613105565b6130ce8686612f27565b925060006130db846134d2565b905060006130e888611018565b90508015806130fe57506130fc8183614479565b155b9550505050505b9250929050565b600080600061311b8585613054565b90925090508180156120b45750600254600160801b900460ff90811691161015949350505050565b6001600160a01b03821660009081526009602052604090206108f5908261342c565b60008060008381526012602052604090205460ff16600681111561318b5761318b613823565b1492915050565b600060ff1982168161056b826135bd565b600080612414836135bd565b6000838152600760205260408120906131c6612f08565b6001600160401b0316815260208101919091526040016000205460ff161561321a576040517f3edef7db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480546040517f94c8919d0000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916394c8919d916132649186918691016144de565b602060405180830381865afa158015613281573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a59190613d1d565b6132db576040517ffcd03a4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526007602052604081206001916132f4612f08565b6001600160401b031681526020808201929092526040908101600020805460ff19169315159390931790925590518481527f3b989d183b84b02259d7c14b34a9c9eb0fccb4c355a920d25e581e25aef4993d9101611772565b60008381526010602052604081206001600160401b03808416908516106133a0576040517f56607cb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600183015481526002830154602082015260038301549181019190915260048201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c082015261340f90613588565b6134198585614459565b6001600160401b03166120b49190613cc9565b6000612414838361362f565b600081815260018301602052604081205461347f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610fff565b506000610fff565b60006124148383613438565b6000610fff6134a183613729565b613736565b6000610fff7f000000000000000000000000000000000000000000000000000000000000000083614589565b60008060ff83166134e4600143613c96565b6134ee9190613c96565b409050600081900361350257613502613d3f565b60408051602081018390520160405160208183030381529060405280519060200120915050919050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561357c57602002820191906000526020600020905b815481526020019060010190808311613568575b50505050509050919050565b600081608001516001600160401b03168260200151610fff9190613cc9565b60006001600160401b0380841690831610612414565b7fff00000000000000000000000000000000000000000000000000000000000000811660015b602081101561069057600891821c916135fd908290613cc9565b83901b7fff000000000000000000000000000000000000000000000000000000000000001691909117906001016135e3565b60008181526001830160205260408120548015613718576000613653600183613c96565b855490915060009061366790600190613c96565b90508181146136cc57600086600001828154811061368757613687614443565b90600052602060002001549050808760000184815481106136aa576136aa614443565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806136dd576136dd6145af565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610fff565b6000915050610fff565b5092915050565b6000610fff826001613ca9565b6000610fff7f00000000000000000000000000000000000000000000000000000000000000008361448d565b60408051610100810182526000608080830182815260a080850184905260c0850184905260e08501849052908452845190810185528281526020808201849052818601849052606080830185905292820192909252818401528351908101845290815290918201905b8152600060209091015290565b508054600082559060005260206000209081019061121791905b8082111561380657600081556001016137f2565b5090565b60006020828403121561381c57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b602081016005831061384d5761384d613823565b91905290565b6001600160a01b038116811461121757600080fd5b60008060006060848603121561387d57600080fd5b83359250602084013561388f81613853565b9150604084013561389f81613853565b809150509250925092565b6001600160401b038116811461121757600080fd5b80356138ca816138aa565b919050565b600080604083850312156138e257600080fd5b8235915060208301356138f4816138aa565b809150509250929050565b6000610100828403121561069057600080fd5b6000806000610140848603121561392857600080fd5b83359250602084013561393a816138aa565b915061394985604086016138ff565b90509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561398a5783518352928401929184019160010161396e565b50909695505050505050565b6000815180845260005b818110156139bc576020818501810151868301820152016139a0565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000825160ff8082511660208501528060208301511660408501528060408301511660608501528060608301511660808501526020850151915060e060a08501526001600160401b038083511661010086015280602084015116610120860152508060408301511661014085015280606083015116610160850152506080810151905060a0610180840152613a796101a0840182613996565b90506040840151613a9060c08501825160ff169052565b5060608401516001600160401b03811660e0850152509392505050565b600060208284031215613abf57600080fd5b81356001600160401b03811115613ad557600080fd5b8201610160818503121561241457600080fd5b6000815160408452613afd6040850182613996565b602093840151949093019390935250919050565b60006101606001600160a01b038351168452602083015180516020860152602081015160408601526040810151606086015260608101516001600160401b0380821660808801528060808401511660a08801528060a08401511660c08801528060c08401511660e0880152505050604083015181610100860152613b9782860182613ae8565b9150506060830151613bb56101208601826001600160401b03169052565b5060808301516101408501528091505092915050565b602081526000825160406020840152613be76060840182613b11565b90506001600160401b0360208501511660408401528091505092915050565b602081016007831061384d5761384d613823565b60008060408385031215613c2d57600080fd5b8235915060208301356138f481613853565b6000806101208385031215613c5357600080fd5b82359150613c6484602085016138ff565b90509250929050565b6020815260006124146020830184613b11565b634e487b7160e01b600052601160045260246000fd5b81810381811115610fff57610fff613c80565b6001600160401b0381811683821601908082111561372257613722613c80565b8082028115828204841417610fff57610fff613c80565b634e487b7160e01b600052601260045260246000fd5b600082613d0557613d05613ce0565b500490565b80820180821115610fff57610fff613c80565b600060208284031215613d2f57600080fd5b8151801515811461241457600080fd5b634e487b7160e01b600052600160045260246000fd5b61ffff82811682821603908082111561372257613722613c80565b600181811c90821680613d8457607f821691505b60208210810361069057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613ddc57613ddc613da4565b60405290565b60405160a081016001600160401b0381118282101715613ddc57613ddc613da4565b60405160e081016001600160401b0381118282101715613ddc57613ddc613da4565b604051601f8201601f191681016001600160401b0381118282101715613e4e57613e4e613da4565b604052919050565b600060408284031215613e6857600080fd5b613e70613dba565b905081356001600160401b0380821115613e8957600080fd5b818401915084601f830112613e9d57600080fd5b8135602082821115613eb157613eb1613da4565b613ec3601f8301601f19168201613e26565b92508183528681838601011115613ed957600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b6000813603610160811215613f1257600080fd5b613f1a613de2565b8335613f2581613853565b815260e0601f1983011215613f3957600080fd5b613f41613e04565b91506020840135825260408401356020830152606084013560408301526080840135613f6c816138aa565b606083015260a0840135613f7f816138aa565b608083015260c0840135613f92816138aa565b60a083015260e0840135613fa5816138aa565b60c08301526020810191909152610100830135906001600160401b03821115613fcd57600080fd5b613fd936838601613e56565b6040820152613feb61012085016138bf565b6060820152610140939093013560808401525090919050565b60006020828403121561401657600080fd5b813561241481613853565b60006020828403121561403357600080fd5b8135612414816138aa565b60008235603e1983360301811261405457600080fd5b9190910192915050565b6000808335601e1984360301811261407557600080fd5b8301803591506001600160401b0382111561408f57600080fd5b60200191503681900382131561310557600080fd5b60008135610fff816138aa565b601f8211156108f5576000816000526020600020601f850160051c810160208610156140da5750805b601f850160051c820191505b81811015610821578281556001016140e6565b8135601e1983360301811261410d57600080fd5b820180356001600160401b0381111561412557600080fd5b6020813603818401131561413857600080fd5b61414c826141468654613d70565b866140b1565b6000601f831160018114614182576000841561416a57508482018301355b600019600386901b1c1916600185901b1786556141df565b600086815260209020601f19851690835b828110156141b4578785018601358255938501936001909101908501614193565b50858210156141d35760001960f88760031b161c198585890101351681555b505060018460011b0186555b50508085013560018501555050505050565b81356141fc81613853565b6001600160a01b03811673ffffffffffffffffffffffffffffffffffffffff1983541617825550602082013560018201556040820135600282015560608201356003820155600481016080830135614253816138aa565b815467ffffffffffffffff19166001600160401b0382161782555060a083013561427c816138aa565b81546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff0000000000000000161781556142f06142bb60c085016140a4565b825467ffffffffffffffff60801b191660809190911b77ffffffffffffffff0000000000000000000000000000000016178255565b6143486142ff60e085016140a4565b825477ffffffffffffffffffffffffffffffffffffffffffffffff1660c09190911b7fffffffffffffffff00000000000000000000000000000000000000000000000016178255565b5061436361435a61010084018461403e565b600583016140f9565b61439461437361012084016140a4565b600783016001600160401b0382166001600160401b03198254161781555050565b61014082013560088201555050565b60006101208201905084825283356020830152602084013560408301526040840135606083015260608401356143d8816138aa565b6001600160401b038082166080850152608086013591506143f8826138aa565b80821660a085015260a08601359150614410826138aa565b80821660c0850152505061442660c085016138bf565b6001600160401b0390811660e0840152831661010083015261056b565b634e487b7160e01b600052603260045260246000fd5b6001600160401b0382811682821603908082111561372257613722613c80565b60008261448857614488613ce0565b500690565b6001600160401b038181168382160280821691908281146144b0576144b0613c80565b505092915050565b60006001600160401b03808416806144d2576144d2613ce0565b92169190910692915050565b8235815260208084013590820152600061012082810161450e604085016040880180358252602090810135910152565b614528608085016080880180358252602090810135910152565b61454260c0850160c0880180358252602090810135910152565b61010084019190915283519081905261014083019060209081860160005b8281101561457c57815185529383019390830190600101614560565b5092979650505050505050565b60006001600160401b03808416806145a3576145a3613ce0565b92169190910492915050565b634e487b7160e01b600052603160045260246000fdfea264697066735822122033c02c649d83b97f0723d0dc9a1fe47dba64816ebe09cb1c7a43424433129c0164736f6c63430008170033"; public MarketplaceDeploymentBase() : base(BYTECODE) { } public MarketplaceDeploymentBase(string byteCode) : base(byteCode) { } [Parameter("tuple", "config", 1)] @@ -64,8 +64,8 @@ namespace CodexContractsPlugin.Marketplace { [Parameter("bytes32", "requestId", 1, true )] public virtual byte[] RequestId { get; set; } - [Parameter("uint256", "slotIndex", 2, false )] - public virtual BigInteger SlotIndex { get; set; } + [Parameter("uint64", "slotIndex", 2, false )] + public virtual ulong SlotIndex { get; set; } } public partial class SlotFreedEventDTO : SlotFreedEventDTOBase { } @@ -74,8 +74,8 @@ namespace CodexContractsPlugin.Marketplace { [Parameter("bytes32", "requestId", 1, true )] public virtual byte[] RequestId { get; set; } - [Parameter("uint256", "slotIndex", 2, false )] - public virtual BigInteger SlotIndex { get; set; } + [Parameter("uint64", "slotIndex", 2, false )] + public virtual ulong SlotIndex { get; set; } } public partial class SlotReservationsFullEventDTO : SlotReservationsFullEventDTOBase { } @@ -84,8 +84,8 @@ namespace CodexContractsPlugin.Marketplace { [Parameter("bytes32", "requestId", 1, true )] public virtual byte[] RequestId { get; set; } - [Parameter("uint256", "slotIndex", 2, false )] - public virtual BigInteger SlotIndex { get; set; } + [Parameter("uint64", "slotIndex", 2, false )] + public virtual ulong SlotIndex { get; set; } } public partial class StorageRequestedEventDTO : StorageRequestedEventDTOBase { } @@ -96,8 +96,8 @@ namespace CodexContractsPlugin.Marketplace public virtual byte[] RequestId { get; set; } [Parameter("tuple", "ask", 2, false )] public virtual Ask Ask { get; set; } - [Parameter("uint256", "expiry", 3, false )] - public virtual BigInteger Expiry { get; set; } + [Parameter("uint64", "expiry", 3, false )] + public virtual ulong Expiry { get; set; } } public partial class MarketplaceAlreadypaidError : MarketplaceAlreadypaidErrorBase { } [Error("Marketplace_AlreadyPaid")] @@ -294,8 +294,8 @@ namespace CodexContractsPlugin.Marketplace { [Parameter("bytes32", "requestId", 1)] public virtual byte[] RequestId { get; set; } - [Parameter("uint256", "slotIndex", 2)] - public virtual BigInteger SlotIndex { get; set; } + [Parameter("uint64", "slotIndex", 2)] + public virtual ulong SlotIndex { get; set; } } public partial class ConfigurationOutputDTO : ConfigurationOutputDTOBase { } @@ -336,8 +336,8 @@ namespace CodexContractsPlugin.Marketplace { [Parameter("bytes32", "requestId", 1)] public virtual byte[] RequestId { get; set; } - [Parameter("uint256", "slotIndex", 2)] - public virtual BigInteger SlotIndex { get; set; } + [Parameter("uint64", "slotIndex", 2)] + public virtual ulong SlotIndex { get; set; } [Parameter("tuple", "proof", 3)] public virtual Groth16Proof Proof { get; set; } } @@ -467,20 +467,20 @@ namespace CodexContractsPlugin.Marketplace { [Parameter("bytes32", "slotId", 1)] public virtual byte[] SlotId { get; set; } - [Parameter("uint256", "period", 2)] - public virtual BigInteger Period { get; set; } + [Parameter("uint64", "period", 2)] + public virtual ulong Period { get; set; } } public partial class MissingProofsOutputDTO : MissingProofsOutputDTOBase { } [FunctionOutput] public class MissingProofsOutputDTOBase : IFunctionOutputDTO { - [Parameter("uint256", "", 1)] - public virtual BigInteger ReturnValue1 { get; set; } + [Parameter("uint64", "", 1)] + public virtual ulong ReturnValue1 { get; set; } } public partial class MissingProofsFunction : MissingProofsFunctionBase { } - [Function("missingProofs", "uint256")] + [Function("missingProofs", "uint64")] public class MissingProofsFunctionBase : FunctionMessage { [Parameter("bytes32", "slotId", 1)] @@ -521,12 +521,12 @@ namespace CodexContractsPlugin.Marketplace [FunctionOutput] public class RequestEndOutputDTOBase : IFunctionOutputDTO { - [Parameter("uint256", "", 1)] - public virtual BigInteger ReturnValue1 { get; set; } + [Parameter("uint64", "", 1)] + public virtual ulong ReturnValue1 { get; set; } } public partial class RequestEndFunction : RequestEndFunctionBase { } - [Function("requestEnd", "uint256")] + [Function("requestEnd", "uint64")] public class RequestEndFunctionBase : FunctionMessage { [Parameter("bytes32", "requestId", 1)] @@ -537,12 +537,12 @@ namespace CodexContractsPlugin.Marketplace [FunctionOutput] public class RequestExpiryOutputDTOBase : IFunctionOutputDTO { - [Parameter("uint256", "", 1)] - public virtual BigInteger ReturnValue1 { get; set; } + [Parameter("uint64", "", 1)] + public virtual ulong ReturnValue1 { get; set; } } public partial class RequestExpiryFunction : RequestExpiryFunctionBase { } - [Function("requestExpiry", "uint256")] + [Function("requestExpiry", "uint64")] public class RequestExpiryFunctionBase : FunctionMessage { [Parameter("bytes32", "requestId", 1)] @@ -581,8 +581,8 @@ namespace CodexContractsPlugin.Marketplace { [Parameter("bytes32", "requestId", 1)] public virtual byte[] RequestId { get; set; } - [Parameter("uint256", "slotIndex", 2)] - public virtual BigInteger SlotIndex { get; set; } + [Parameter("uint64", "slotIndex", 2)] + public virtual ulong SlotIndex { get; set; } } public partial class SlotProbabilityOutputDTO : SlotProbabilityOutputDTOBase { } @@ -695,16 +695,16 @@ namespace CodexContractsPlugin.Marketplace public class ProofConfigBase { - [Parameter("uint256", "period", 1)] - public virtual BigInteger Period { get; set; } - [Parameter("uint256", "timeout", 2)] - public virtual BigInteger Timeout { get; set; } + [Parameter("uint64", "period", 1)] + public virtual ulong Period { get; set; } + [Parameter("uint64", "timeout", 2)] + public virtual ulong Timeout { get; set; } [Parameter("uint8", "downtime", 3)] public virtual byte Downtime { get; set; } - [Parameter("string", "zkeyHash", 4)] - public virtual string ZkeyHash { get; set; } - [Parameter("uint8", "downtimeProduct", 5)] + [Parameter("uint8", "downtimeProduct", 4)] public virtual byte DowntimeProduct { get; set; } + [Parameter("string", "zkeyHash", 5)] + public virtual string ZkeyHash { get; set; } } public partial class SlotReservationsConfig : SlotReservationsConfigBase { } @@ -723,25 +723,25 @@ namespace CodexContractsPlugin.Marketplace public virtual ProofConfig Proofs { get; set; } [Parameter("tuple", "reservations", 3)] public virtual SlotReservationsConfig Reservations { get; set; } - [Parameter("uint256", "requestDurationLimit", 4)] - public virtual BigInteger RequestDurationLimit { get; set; } + [Parameter("uint64", "requestDurationLimit", 4)] + public virtual ulong RequestDurationLimit { get; set; } } public partial class Ask : AskBase { } public class AskBase { - [Parameter("uint64", "slots", 1)] - public virtual ulong Slots { get; set; } - [Parameter("uint256", "slotSize", 2)] - public virtual BigInteger SlotSize { get; set; } - [Parameter("uint256", "duration", 3)] - public virtual BigInteger Duration { get; set; } - [Parameter("uint256", "proofProbability", 4)] + [Parameter("uint256", "proofProbability", 1)] public virtual BigInteger ProofProbability { get; set; } - [Parameter("uint256", "pricePerBytePerSecond", 5)] + [Parameter("uint256", "pricePerBytePerSecond", 2)] public virtual BigInteger PricePerBytePerSecond { get; set; } - [Parameter("uint256", "collateralPerByte", 6)] + [Parameter("uint256", "collateralPerByte", 3)] public virtual BigInteger CollateralPerByte { get; set; } + [Parameter("uint64", "slots", 4)] + public virtual ulong Slots { get; set; } + [Parameter("uint64", "slotSize", 5)] + public virtual ulong SlotSize { get; set; } + [Parameter("uint64", "duration", 6)] + public virtual ulong Duration { get; set; } [Parameter("uint64", "maxSlotLoss", 7)] public virtual ulong MaxSlotLoss { get; set; } } @@ -802,8 +802,8 @@ namespace CodexContractsPlugin.Marketplace public virtual Ask Ask { get; set; } [Parameter("tuple", "content", 3)] public virtual Content Content { get; set; } - [Parameter("uint256", "expiry", 4)] - public virtual BigInteger Expiry { get; set; } + [Parameter("uint64", "expiry", 4)] + public virtual ulong Expiry { get; set; } [Parameter("bytes32", "nonce", 5)] public virtual byte[] Nonce { get; set; } } @@ -813,8 +813,8 @@ namespace CodexContractsPlugin.Marketplace { [Parameter("tuple", "request", 1)] public virtual Request Request { get; set; } - [Parameter("uint256", "slotIndex", 2)] - public virtual BigInteger SlotIndex { get; set; } + [Parameter("uint64", "slotIndex", 2)] + public virtual ulong SlotIndex { get; set; } } } diff --git a/ProjectPlugins/CodexPlugin/CodexInstanceContainerExtension.cs b/ProjectPlugins/CodexPlugin/CodexInstanceContainerExtension.cs index 2104823e..4bed34d5 100644 --- a/ProjectPlugins/CodexPlugin/CodexInstanceContainerExtension.cs +++ b/ProjectPlugins/CodexPlugin/CodexInstanceContainerExtension.cs @@ -14,7 +14,7 @@ namespace CodexPlugin name: container.Name, imageName: container.Recipe.Image, startUtc: container.Recipe.RecipeCreatedUtc, - discoveryEndpoint: container.GetInternalAddress(CodexContainerRecipe.DiscoveryPortTag), + discoveryEndpoint: SetClusterInternalIpAddress(pod, container.GetInternalAddress(CodexContainerRecipe.DiscoveryPortTag)), apiEndpoint: container.GetAddress(CodexContainerRecipe.ApiPortTag), listenEndpoint: container.GetInternalAddress(CodexContainerRecipe.ListenPortTag), ethAccount: container.Recipe.Additionals.Get(), @@ -22,13 +22,14 @@ namespace CodexPlugin ); } - // todo: is this needed for the discovery address?? - //var info = codexAccess.GetPodInfo(); - //return new Address( - // logName: $"{GetName()}:DiscoveryPort", - // host: info.Ip, - // port: Container.Recipe.GetPortByTag(CodexContainerRecipe.DiscoveryPortTag)!.Number - //); + private static Address SetClusterInternalIpAddress(RunningPod pod, Address address) + { + return new Address( + logName: address.LogName, + host: pod.PodInfo.Ip, + port: address.Port + ); + } private static Address? GetMetricsEndpoint(RunningContainer container) { diff --git a/Tools/MarketInsights/ContributionBuilder.cs b/Tools/MarketInsights/ContributionBuilder.cs index f3b6cb4a..ddaade2a 100644 --- a/Tools/MarketInsights/ContributionBuilder.cs +++ b/Tools/MarketInsights/ContributionBuilder.cs @@ -78,6 +78,11 @@ namespace MarketInsights average.ProofProbability = GetNewAverage(average.ProofProbability, average.Number, requestEvent.Request.Request.Ask.ProofProbability); } + private float GetNewAverage(float currentAverage, int newNumberOfValues, ulong newValue) + { + return GetNewAverage(currentAverage, newNumberOfValues, Convert.ToSingle(newValue)); + } + private float GetNewAverage(float currentAverage, int newNumberOfValues, BigInteger newValue) { return GetNewAverage(currentAverage, newNumberOfValues, (float)newValue); diff --git a/Tools/TestNetRewarder/RewardCheck.cs b/Tools/TestNetRewarder/RewardCheck.cs index 3739d686..308932da 100644 --- a/Tools/TestNetRewarder/RewardCheck.cs +++ b/Tools/TestNetRewarder/RewardCheck.cs @@ -95,8 +95,8 @@ namespace TestNetRewarder private bool MeetsSizeRequirement(IChainStateRequest r) { - var slotSize = r.Request.Ask.SlotSize.ToDecimal(); - decimal min = reward.CheckConfig.MinSlotSize.SizeInBytes; + var slotSize = r.Request.Ask.SlotSize; + ulong min = Convert.ToUInt64(reward.CheckConfig.MinSlotSize.SizeInBytes); return slotSize >= min; }