tx · 5xUjWKDszSkm11CKLqrnpLNkHBYLMDJQEGhwgH9AXmQg

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02100000 Waves

2024.09.02 14:41 [3265891] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "5xUjWKDszSkm11CKLqrnpLNkHBYLMDJQEGhwgH9AXmQg", "fee": 2100000, "feeAssetId": null, "timestamp": 1725277320119, "version": 2, "chainId": 84, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "r2iasua5xgzNBRbeYLFyxffzCrauvNFvQypFP1HujjCXJCQ1XqVQCNVCbHn21Np6y45F7CKFwitjhVPAVkdx7Zx" ], "script": "base64:BgJECAISAwoBARIDCgEEEgMKAQQSAwoBCBIECgIICBIDCgEIEgQKAggIEgMKAQgSBAoCCAESBAoCCAESAwoBARIAEgMKAQg4AAxjb250cmFjdEZpbGUCEWwybXBfbGVhc2luZy5yaWRlAANTRVACAl9fAQh0aHJvd0VycgEDbXNnCQACAQkArAICCQCsAgIFDGNvbnRyYWN0RmlsZQICOiAFA21zZwAKa2V5QXNzZXRJZAkAuQkCCQDMCAICAiVzCQDMCAICB2Fzc2V0SWQFA25pbAUDU0VQAAxrZXlGb3JjZVN0b3AJALkJAgkAzAgCAgIlcwkAzAgCAglmb3JjZVN0b3AFA25pbAUDU0VQAA9rZXlGb3JjZU91dFN0b3AJALkJAgkAzAgCAgIlcwkAzAgCAgxmb3JjZU91dFN0b3AFA25pbAUDU0VQABFrZXlQZXJpb2RPZmZzZXRJZAkAuQkCCQDMCAICAiVzCQDMCAICCG9mZnNldElkBQNuaWwFA1NFUAAVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0CQC5CQIJAMwIAgICJXMJAMwIAgIMb2Zmc2V0SGVpZ2h0BQNuaWwFA1NFUAAPa2V5UGVyaW9kTGVuZ3RoCQC5CQIJAMwIAgICJXMJAMwIAgIMcGVyaW9kTGVuZ3RoBQNuaWwFA1NFUAAOcGVyaW9kT2Zmc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa2V5UGVyaW9kT2Zmc2V0SWQAAAAMcGVyaW9kTGVuZ3RoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD2tleVBlcmlvZExlbmd0aACQTgAScGVyaW9kT2Zmc2V0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFWtleVBlcmlvZE9mZnNldEhlaWdodAD///////////8BAA9jdXJyZW50UGVyaW9kSWQDAwkAZgIFBmhlaWdodAUScGVyaW9kT2Zmc2V0SGVpZ2h0CQECIT0CBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQcJAGQCCQBpAgkAZQIFBmhlaWdodAUScGVyaW9kT2Zmc2V0SGVpZ2h0BQxwZXJpb2RMZW5ndGgFDnBlcmlvZE9mZnNldElkCQCWAwEJAMwIAgAACQDMCAIJAGUCBQ5wZXJpb2RPZmZzZXRJZAABBQNuaWwAE2N1cnJlbnRQZXJpb2RIZWlnaHQDAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BBgMJAAACBQ9jdXJyZW50UGVyaW9kSWQAAAkAZgIFEnBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BwAACQBkAgUScGVyaW9kT2Zmc2V0SGVpZ2h0CQBoAgkAZQIFD2N1cnJlbnRQZXJpb2RJZAUOcGVyaW9kT2Zmc2V0SWQFDHBlcmlvZExlbmd0aAAQbmV4dFBlcmlvZEhlaWdodAMDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEGAwkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQBmAgUScGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQHAAAJAGQCBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQxwZXJpb2RMZW5ndGgBEmtleUxlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MJALkJAgkAzAgCAgIlcwkAzAgCBQtub2RlQWRkcmVzcwUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nTm9kZURhdGECC3VzZXJBZGRyZXNzC25vZGVBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABDmtleVVzZXJUb0NsYWltAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHdG9DbGFpbQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABEmtleVVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICD3VzZXJUb3RhbExvY2tlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFmtleU5vZGVMZWFzaW5nQnlIZWlnaHQBC25vZGVBZGRyZXNzBAFoAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAFBmhlaWdodAkAuQkCCQDMCAICBCVzJWQJAMwIAgULbm9kZUFkZHJlc3MJAMwIAgkApAMBBQFoBQNuaWwFA1NFUAEWa2V5VXNlckxlYXNpbmdCeUhlaWdodAILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEAWgDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEAAAUGaGVpZ2h0CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAKQDAQUBaAUDbmlsBQNTRVAADWFzc2V0SWRTdHJpbmcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUKa2V5QXNzZXRJZAIFV0FWRVMADGFzc2V0SWRCeXRlcwMJAAACBQ1hc3NldElkU3RyaW5nAgVXQVZFUwUEdW5pdAkA2QQBBQ1hc3NldElkU3RyaW5nAAtpc0ZvcmNlU3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrZXlGb3JjZVN0b3AHAA5pc0ZvcmNlT3V0U3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ9rZXlGb3JjZU91dFN0b3AHAQ5pc1ZhbGlkQWRkcmVzcwEHYWRkcmVzcwQHJG1hdGNoMAkApggBBQdhZGRyZXNzAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwAPQURNSU5fTElTVF9TSVpFAAUABlFVT1JVTQADABFUWElEX0JZVEVTX0xFTkdUSAAgARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIJYWxsb3dUeElkCQDMCAIFBHR4SWQFA25pbAUDU0VQARBrZXlGdWxsQWRtaW5Wb3RlAgZwcmVmaXgMYWRtaW5BZGRyZXNzCQC5CQIJAMwIAgUGcHJlZml4CQDMCAIFDGFkbWluQWRkcmVzcwUDbmlsBQNTRVABE2tleUFkbWluQWRkcmVzc0xpc3QACQC5CQIJAMwIAgICJXMJAMwIAgIQYWRtaW5BZGRyZXNzTGlzdAUDbmlsBQNTRVABDmtleUFsbG93ZWRUeElkAAkAuQkCCQDMCAICAiVzCQDMCAICBHR4SWQFA25pbAUDU0VQAQxnZXRBZG1pblZvdGUCBnByZWZpeAVhZG1pbgQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFBWFkbWluCQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAENZ2V0QWRtaW5zTGlzdAAEByRtYXRjaDAJAJ0IAgUEdGhpcwkBE2tleUFkbWluQWRkcmVzc0xpc3QAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkAtQkCBQFzBQNTRVAFA25pbAENaXNJbkFkbWluTGlzdAEHYWRkcmVzcwkBD2NvbnRhaW5zRWxlbWVudAIJAQ1nZXRBZG1pbnNMaXN0AAUHYWRkcmVzcwESZ2VuVm90ZXNLZXlzSGVscGVyAgFhDGFkbWluQWRkcmVzcwQLJHQwMzY5NjM3MjAFAWEEBnJlc3VsdAgFCyR0MDM2OTYzNzIwAl8xBAZwcmVmaXgIBQskdDAzNjk2MzcyMAJfMgkAlAoCCQDNCAIFBnJlc3VsdAkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFDGFkbWluQWRkcmVzcwUGcHJlZml4AQxnZW5Wb3Rlc0tleXMBCWtleVByZWZpeAQJYWRtaW5MaXN0CQETa2V5QWRtaW5BZGRyZXNzTGlzdAAECyR0MDM4NjczOTUxCgACJGwJAQ1nZXRBZG1pbnNMaXN0AAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQlrZXlQcmVmaXgKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdlblZvdGVzS2V5c0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEBnJlc3VsdAgFCyR0MDM4NjczOTUxAl8xBAZwcmVmaXgIBQskdDAzODY3Mzk1MQJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFARBjbGVhclZvdGVzSGVscGVyAgZyZXN1bHQDa2V5CQDNCAIFBnJlc3VsdAkBC0RlbGV0ZUVudHJ5AQUDa2V5ARNnZXRDbGVhclZvdGVFbnRyaWVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjbGVhclZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEMdm90ZUlOVEVSTkFMBBNjYWxsZXJBZGRyZXNzU3RyaW5nCWtleVByZWZpeAhtaW5Wb3Rlcwp2b3RlUmVzdWx0BAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQQYWRtaW5DdXJyZW50Vm90ZQkBDGdldEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQDZXJyAwkBASEBCQENaXNJbkFkbWluTGlzdAEFE2NhbGxlckFkZHJlc3NTdHJpbmcJAQh0aHJvd0VycgEJAKwCAgkArAICAglBZGRyZXNzOiAFE2NhbGxlckFkZHJlc3NTdHJpbmcCEiBub3QgaW4gQWRtaW4gbGlzdAMJAAACBRBhZG1pbkN1cnJlbnRWb3RlAAEJAQh0aHJvd0VycgEJAKwCAgUHdm90ZUtleQISIHlvdSBhbHJlYWR5IHZvdGVkBQR1bml0AwkAAAIFA2VycgUDZXJyBAV2b3RlcwkBCmNvdW50Vm90ZXMBBQlrZXlQcmVmaXgDCQBnAgkAZAIFBXZvdGVzAAEFCG1pblZvdGVzBBBjbGVhclZvdGVFbnRyaWVzCQETZ2V0Q2xlYXJWb3RlRW50cmllcwEFCWtleVByZWZpeAkAzggCBRBjbGVhclZvdGVFbnRyaWVzBQp2b3RlUmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd2b3RlS2V5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZ2V0TGVhc2luZ05vZGVFbnRyeQMLbm9kZUFkZHJlc3MNY3VycmVudExlYXNlZApuZXh0TGVhc2VkBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFDWN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUKbmV4dExlYXNlZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldExlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MEGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQESa2V5TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEByRtYXRjaDAFGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBBFub2RlQ3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEEW5vZGVDdXJyZW50TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQObm9kZU5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBA5ub2RlTmV4dExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFDm5vZGVOZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEJAJQKAgURbm9kZUN1cnJlbnRMZWFzZWQFDm5vZGVOZXh0TGVhc2VkCQCUCgIFDm5vZGVOZXh0TGVhc2VkBQ5ub2RlTmV4dExlYXNlZAkAlAoCAAAAAAETZ2V0VXNlckxlYXNpbmdFbnRyeQQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckN1cnJlbnRMZWFzZWQOdXNlck5leHRMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQURdXNlckN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUOdXNlck5leHRMZWFzZWQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldFVzZXJMZWFzaW5nRGF0YQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEGGxlYXNpbmdVc2VyRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwQHJG1hdGNoMAUYbGVhc2luZ1VzZXJEYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEEXVzZXJDdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQRdXNlckN1cnJlbnRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBA51c2VyTmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMEDnVzZXJOZXh0TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUOdXNlck5leHRQZXJpb2QFBmhlaWdodAYJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAlAoCBRF1c2VyQ3VycmVudExlYXNlZAUOdXNlck5leHRMZWFzZWQJAJQKAgUOdXNlck5leHRMZWFzZWQFDnVzZXJOZXh0TGVhc2VkCQCUCgIAAAAAARNnZXRVc2VyVG9DbGFpbUVudHJ5Awt1c2VyQWRkcmVzcwd0b0NsYWltCHRvVW5sb2NrBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFB3RvQ2xhaW0JAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUIdG9VbmxvY2sFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwULdmFsdWVTdHJpbmcBFWdldFVzZXJUb0NsYWltQmFsYW5jZQELdXNlckFkZHJlc3MEGHVzZXJUb0NsYWltRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwQHJG1hdGNoMAUYdXNlclRvQ2xhaW1EYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEDWN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBAd0b0NsYWltCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQKbmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMECHRvVW5sb2NrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUKbmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQCUCgIFB3RvQ2xhaW0FCHRvVW5sb2NrCQCUCgIJAGQCBQd0b0NsYWltBQh0b1VubG9jawAACQCUCgIAAAAAARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQILdXNlckFkZHJlc3MPdXNlclRvdGFsTG9ja2VkCQEMSW50ZWdlckVudHJ5AgkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBQ91c2VyVG90YWxMb2NrZWQBEmdldFVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzAAABEWdldFVuc3Rha2VBY3Rpb25zAwtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcw11bnN0YWtlQW1vdW50BAskdDA4OTkxOTA2NAkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFCyR0MDg5OTE5MDY0Al8xBA5ub2RlTmV4dExlYXNlZAgFCyR0MDg5OTE5MDY0Al8yBAskdDA5MDY5OTE1NQkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQskdDA5MDY5OTE1NQJfMQQOdXNlck5leHRMZWFzZWQIBQskdDA5MDY5OTE1NQJfMgQGY2hlY2tzCQDMCAIDCQEBIQEFC2lzRm9yY2VTdG9wBgkBCHRocm93RXJyAQIdY29udHJhY3QgaXMgdGVtcG9yYXJ5IHN0b3BwZWQJAMwIAgMJAQEhAQUOaXNGb3JjZU91dFN0b3AGCQEIdGhyb3dFcnIBAh11bnN0YWtlIGlzIHRlbXBvcmFyeSBkaXNhYmxlZAkAzAgCAwkAZgIFDXVuc3Rha2VBbW91bnQAAAYJAQh0aHJvd0VycgECJ3Vuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAZwIFDnVzZXJOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BgkBCHRocm93RXJyAQI5dW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdXNlciBzdGFrZWQgYW1vdW50CQDMCAIDCQBnAgUObm9kZU5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQGCQEIdGhyb3dFcnIBAjl1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCBub2RlIHN0YWtlZCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC25vZGVBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGm5vZGUgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC25vZGVBZGRyZXNzBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQQbmV3Tm9kZU5leHRMZWFzZQkAZQIFDm5vZGVOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BBFuZXdVc2VyTmV4dExlYXNlZAkAZQIFDnVzZXJOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BA0kdDAxMDAzOTEwMDk5CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMDAzOTEwMDk5Al8xBAh0b1VubG9jawgFDSR0MDEwMDM5MTAwOTkCXzIEC25ld1RvVW5sb2NrCQBkAgUIdG9VbmxvY2sFDXVuc3Rha2VBbW91bnQED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBBJuZXdVc2VyVG90YWxMb2NrZWQJAGUCBQ91c2VyVG90YWxMb2NrZWQFDXVuc3Rha2VBbW91bnQJAMwIAgkBE2dldExlYXNpbmdOb2RlRW50cnkDBQtub2RlQWRkcmVzcwURbm9kZUN1cnJlbnRMZWFzZWQFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBE2dldFVzZXJMZWFzaW5nRW50cnkEBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFEXVzZXJDdXJyZW50TGVhc2VkBRFuZXdVc2VyTmV4dExlYXNlZAkAzAgCCQETZ2V0VXNlclRvQ2xhaW1FbnRyeQMFC3VzZXJBZGRyZXNzBQd0b0NsYWltBQtuZXdUb1VubG9jawkAzAgCCQEXZ2V0VXNlclRvdGFsTG9ja2VkRW50cnkCBQt1c2VyQWRkcmVzcwUSbmV3VXNlclRvdGFsTG9ja2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5Tm9kZUxlYXNpbmdCeUhlaWdodAEFC25vZGVBZGRyZXNzBRBuZXdOb2RlTmV4dExlYXNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5VXNlckxlYXNpbmdCeUhlaWdodAIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURbmV3VXNlck5leHRMZWFzZWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCC3VzZXJBZGRyZXNzC2NsYWltQW1vdW50BA0kdDAxMDgyODEwODg4CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMDgyODEwODg4Al8xBAh0b1VubG9jawgFDSR0MDEwODI4MTA4ODgCXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQEBIQEFDmlzRm9yY2VPdXRTdG9wBgkBCHRocm93RXJyAQIbY2xhaW0gaXMgdGVtcG9yYXJ5IGRpc2FibGVkCQDMCAIDCQBmAgULY2xhaW1BbW91bnQAAAYJAQh0aHJvd0VycgECJWNsYWltIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQd0b0NsYWltBQtjbGFpbUFtb3VudAYJAQh0aHJvd0VycgECNGNsYWltIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB1bmxvY2tlZCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKbmV3VG9DbGFpbQkAZQIFB3RvQ2xhaW0FC2NsYWltQW1vdW50CQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FCHRvVW5sb2NrCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQtjbGFpbUFtb3VudAUMYXNzZXRJZEJ5dGVzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2dldFN0YWtlQWN0aW9ucwQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckxlYXNpbmdBbW91bnQBaQQNJHQwMTE3MTgxMTc3OAkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTE3MTgxMTc3OAJfMQQIdG9VbmxvY2sIBQ0kdDAxMTcxODExNzc4Al8yBA1wYXltZW50QW1vdW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQJYXZhaWxhYmxlCQBkAgkAZAIFCHRvVW5sb2NrBQd0b0NsYWltBQ1wYXltZW50QW1vdW50BAZjaGVja3MJAMwIAgMJAQEhAQULaXNGb3JjZVN0b3AGCQEIdGhyb3dFcnIBAh1jb250cmFjdCBpcyB0ZW1wb3Jhcnkgc3RvcHBlZAkAzAgCAwkAZwIAAQkAkAMBCAUBaQhwYXltZW50cwYJAQh0aHJvd0VycgECEW1heGltdW0gMSBwYXltZW50CQDMCAIDAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDGFzc2V0SWRCeXRlcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpwYXltZW50IGFzc2V0SWQgc2hvdWxkIGJlOgkAzAgCBQ1hc3NldElkU3RyaW5nBQNuaWwCASAJAMwIAgMJAGYCBRF1c2VyTGVhc2luZ0Ftb3VudAAABgkBCHRocm93RXJyAQIfYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAZwIFCWF2YWlsYWJsZQURdXNlckxlYXNpbmdBbW91bnQGCQEIdGhyb3dFcnIBAjthbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgKHBheW1lbnQgKyBhdmFpbGFibGUpIGFtb3VudAkAzAgCAwkAZwIFEXVzZXJMZWFzaW5nQW1vdW50BQ1wYXltZW50QW1vdW50BgkAAgECMGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCBwYXltZW50IGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULbm9kZUFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIabm9kZSBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULbm9kZUFkZHJlc3MFA25pbAIBIAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA0kdDAxMjg0OTEyOTIyCQESZ2V0TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEEW5vZGVDdXJyZW50TGVhc2VkCAUNJHQwMTI4NDkxMjkyMgJfMQQObm9kZU5leHRMZWFzZWQIBQ0kdDAxMjg0OTEyOTIyAl8yBBBuZXdOb2RlTmV4dExlYXNlCQBkAgUObm9kZU5leHRMZWFzZWQFEXVzZXJMZWFzaW5nQW1vdW50BA0kdDAxMjk5MDEzMDc2CQESZ2V0VXNlckxlYXNpbmdEYXRhAgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBBF1c2VyQ3VycmVudExlYXNlZAgFDSR0MDEyOTkwMTMwNzYCXzEEDnVzZXJOZXh0TGVhc2VkCAUNJHQwMTI5OTAxMzA3NgJfMgQRbmV3VXNlck5leHRMZWFzZWQJAGQCBQ51c2VyTmV4dExlYXNlZAURdXNlckxlYXNpbmdBbW91bnQEEmZyb21VbmxvY2tlZEFtb3VudAkAZQIFEXVzZXJMZWFzaW5nQW1vdW50BQ1wYXltZW50QW1vdW50BAtuZXdUb1VubG9jawkAlgMBCQDMCAIAAAkAzAgCCQBlAgUIdG9VbmxvY2sFEmZyb21VbmxvY2tlZEFtb3VudAUDbmlsBApuZXdUb0NsYWltCQCXAwEJAMwIAgUHdG9DbGFpbQkAzAgCCQBkAgUHdG9DbGFpbQkAZQIFCHRvVW5sb2NrBRJmcm9tVW5sb2NrZWRBbW91bnQFA25pbAQPdXNlclRvdGFsTG9ja2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MEEm5ld1VzZXJUb3RhbExvY2tlZAkAZAIFD3VzZXJUb3RhbExvY2tlZAURdXNlckxlYXNpbmdBbW91bnQJAMwIAgkBE2dldExlYXNpbmdOb2RlRW50cnkDBQtub2RlQWRkcmVzcwURbm9kZUN1cnJlbnRMZWFzZWQFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBE2dldFVzZXJMZWFzaW5nRW50cnkEBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFEXVzZXJDdXJyZW50TGVhc2VkBRFuZXdVc2VyTmV4dExlYXNlZAkAzAgCCQETZ2V0VXNlclRvQ2xhaW1FbnRyeQMFC3VzZXJBZGRyZXNzBQpuZXdUb0NsYWltBQtuZXdUb1VubG9jawkAzAgCCQEXZ2V0VXNlclRvdGFsTG9ja2VkRW50cnkCBQt1c2VyQWRkcmVzcwUSbmV3VXNlclRvdGFsTG9ja2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5Tm9kZUxlYXNpbmdCeUhlaWdodAEFC25vZGVBZGRyZXNzBRBuZXdOb2RlTmV4dExlYXNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5VXNlckxlYXNpbmdCeUhlaWdodAIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURbmV3VXNlck5leHRMZWFzZWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzAWkEBmNoZWNrcwkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECIHBheW1lbnQgc2l6ZSBzaG91bGQgYmUgZXhhY3RseSAxBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAQ9nZXRTdGFrZUFjdGlvbnMEBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQFpCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARxnZXRTZXROZXdQZXJpb2RMZW5ndGhBY3Rpb25zAQ9uZXdQZXJpb2RMZW5ndGgEBWNoZWNrCQDMCAIDCQBmAgUPbmV3UGVyaW9kTGVuZ3RoAAAGCQEIdGhyb3dFcnIBAiZwZXJpb2QgbGVuZ3RoIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleVBlcmlvZE9mZnNldElkCQBkAgUPY3VycmVudFBlcmlvZElkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLg0BaQESc2V0TmV3UGVyaW9kTGVuZ3RoAQ9uZXdQZXJpb2RMZW5ndGgEBmNoZWNrcwkAzAgCAwkBDWlzSW5BZG1pbkxpc3QBCQClCAEIBQFpBmNhbGxlcgYJAQh0aHJvd0VycgECGmNhbGxlciBpcyBub3QgaW4gYWRtaW5MaXN0BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJARxnZXRTZXROZXdQZXJpb2RMZW5ndGhBY3Rpb25zAQUPbmV3UGVyaW9kTGVuZ3RoCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHNldEZvcmNlU3RvcEZsYWcBBHN0b3AEBWNoZWNrCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtleUZvcmNlU3RvcAUEc3RvcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3NldEZvcmNlT3V0U3RvcEZsYWcBBHN0b3AEBWNoZWNrCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEJvb2xlYW5FbnRyeQIFD2tleUZvcmNlT3V0U3RvcAUEc3RvcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2dldE5vZGVEYXRhUkVBRE9OTFkBC25vZGVBZGRyZXNzBA0kdDAxNTc0OTE1ODEzCQESZ2V0TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEDGN1cnJlbnRMZWFzZQgFDSR0MDE1NzQ5MTU4MTMCXzEECm5leHRMZWFzZWQIBQ0kdDAxNTc0OTE1ODEzAl8yCQCUCgIFA25pbAkAlwoFBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQxjdXJyZW50TGVhc2UFEG5leHRQZXJpb2RIZWlnaHQFCm5leHRMZWFzZWQFBmhlaWdodAFpARpnZXRVc2VyTGVhc2luZ0RhdGFSRUFET05MWQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEDSR0MDE2MTgzMTYyNjAJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEDGN1cnJlbnRMZWFzZQgFDSR0MDE2MTgzMTYyNjACXzEECm5leHRMZWFzZWQIBQ0kdDAxNjE4MzE2MjYwAl8yCQCUCgIFA25pbAkAlwoFBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQxjdXJyZW50TGVhc2UFEG5leHRQZXJpb2RIZWlnaHQFCm5leHRMZWFzZWQFBmhlaWdodAFpARNnZXRVc2VyRGF0YVJFQURPTkxZAQt1c2VyQWRkcmVzcwQNJHQwMTY2MjMxNjY4MwkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTY2MjMxNjY4MwJfMQQIdG9VbmxvY2sIBQ0kdDAxNjYyMzE2NjgzAl8yBA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwkAlAoCBQNuaWwJAJgKBgUTY3VycmVudFBlcmlvZEhlaWdodAUHdG9DbGFpbQUQbmV4dFBlcmlvZEhlaWdodAUIdG9VbmxvY2sFD3VzZXJUb3RhbExvY2tlZAUGaGVpZ2h0AWkBDmxlYXNlQnlBZGRyZXNzAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwkBGmdldFN0YWtlRnJvbVBheW1lbnRBY3Rpb25zAwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQFpAWkBBWxlYXNlAQtub2RlQWRkcmVzcwQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEPbGVhc2VGcm9tTG9ja2VkAgtub2RlQWRkcmVzcwZhbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBD2dldFN0YWtlQWN0aW9ucwQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUGYW1vdW50BQFpAWkBC2NhbmNlbExlYXNlAgtub2RlQWRkcmVzcwZhbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBEWdldFVuc3Rha2VBY3Rpb25zAwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQZhbW91bnQBaQEFY2xhaW0BBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCBQt1c2VyQWRkcmVzcwUGYW1vdW50AWkBCGNsYWltQWxsAAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBA0kdDAxNzY5NzE3NzU3CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxNzY5NzE3NzU3Al8xBAh0b1VubG9jawgFDSR0MDE3Njk3MTc3NTcCXzIEBmNoZWNrcwkAzAgCAwkAZgIFB3RvQ2xhaW0AAAYJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0FA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBF2dldENsYWltVW5sb2NrZWRBY3Rpb25zAgULdXNlckFkZHJlc3MFB3RvQ2xhaW0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECGJ5QWRtaW5zCQAAAggFAnR4AmlkCQDZBAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAIABAdieU93bmVyAwkAZwIJAJADAQkBDWdldEFkbWluc0xpc3QABQZRVU9SVU0HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5AwUIYnlBZG1pbnMGBQdieU93bmVymWXqtA==", "height": 3265891, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CLyiMgWuJ6HyXx8KisjU7xsDap9ownmuqWCHfxWqQtQD Next: 2aHiTM93eoXBAJnpwC9aJS21Cd9ADmT53cs6neZdKAT7 Diff:
OldNewDifferences
1111 let keyAssetId = makeString(["%s", "assetId"], SEP)
1212
1313 let keyForceStop = makeString(["%s", "forceStop"], SEP)
14+
15+let keyForceOutStop = makeString(["%s", "forceOutStop"], SEP)
1416
1517 let keyPeriodOffsetId = makeString(["%s", "offsetId"], SEP)
1618
8284
8385 let isForceStop = valueOrElse(getBoolean(this, keyForceStop), false)
8486
87+let isForceOutStop = valueOrElse(getBoolean(this, keyForceOutStop), false)
88+
8589 func isValidAddress (address) = match addressFromString(address) {
8690 case a: Address =>
8791 true
126130
127131
128132 func genVotesKeysHelper (a,adminAddress) = {
129- let $t035623586 = a
130- let result = $t035623586._1
131- let prefix = $t035623586._2
133+ let $t036963720 = a
134+ let result = $t036963720._1
135+ let prefix = $t036963720._2
132136 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
133137 }
134138
135139
136140 func genVotesKeys (keyPrefix) = {
137141 let adminList = keyAdminAddressList()
138- let $t037333817 = {
142+ let $t038673951 = {
139143 let $l = getAdminsList()
140144 let $s = size($l)
141145 let $acc0 = $Tuple2(nil, keyPrefix)
149153
150154 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
151155 }
152- let result = $t037333817._1
153- let prefix = $t037333817._2
156+ let result = $t038673951._1
157+ let prefix = $t038673951._2
154158 result
155159 }
156160
302306
303307
304308 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
305- let $t088578930 = getLeasingNodeData(nodeAddress)
306- let nodeCurrentLeased = $t088578930._1
307- let nodeNextLeased = $t088578930._2
308- let $t089359021 = getUserLeasingData(nodeAddress, userAddress)
309- let userCurrentLeased = $t089359021._1
310- let userNextLeased = $t089359021._2
309+ let $t089919064 = getLeasingNodeData(nodeAddress)
310+ let nodeCurrentLeased = $t089919064._1
311+ let nodeNextLeased = $t089919064._2
312+ let $t090699155 = getUserLeasingData(nodeAddress, userAddress)
313+ let userCurrentLeased = $t090699155._1
314+ let userNextLeased = $t090699155._2
311315 let checks = [if (!(isForceStop))
312316 then true
313- else throwErr("contract is temporary stopped"), if ((unstakeAmount > 0))
317+ else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
318+ then true
319+ else throwErr("unstake is temporary disabled"), if ((unstakeAmount > 0))
314320 then true
315321 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
316322 then true
325331 then {
326332 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
327333 let newUserNextLeased = (userNextLeased - unstakeAmount)
328- let $t098349894 = getUserToClaimBalance(userAddress)
329- let toClaim = $t098349894._1
330- let toUnlock = $t098349894._2
334+ let $t01003910099 = getUserToClaimBalance(userAddress)
335+ let toClaim = $t01003910099._1
336+ let toUnlock = $t01003910099._2
331337 let newToUnlock = (toUnlock + unstakeAmount)
332338 let userTotalLocked = getUserTotalLocked(userAddress)
333339 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
338344
339345
340346 func getClaimUnlockedActions (userAddress,claimAmount) = {
341- let $t01062310683 = getUserToClaimBalance(userAddress)
342- let toClaim = $t01062310683._1
343- let toUnlock = $t01062310683._2
347+ let $t01082810888 = getUserToClaimBalance(userAddress)
348+ let toClaim = $t01082810888._1
349+ let toUnlock = $t01082810888._2
344350 let checks = [if (!(isForceStop))
345351 then true
346- else throwErr("contract is temporary stopped"), if ((claimAmount > 0))
352+ else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
353+ then true
354+ else throwErr("claim is temporary disabled"), if ((claimAmount > 0))
347355 then true
348356 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
349357 then true
360368
361369
362370 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
363- let $t01144411504 = getUserToClaimBalance(userAddress)
364- let toClaim = $t01144411504._1
365- let toUnlock = $t01144411504._2
371+ let $t01171811778 = getUserToClaimBalance(userAddress)
372+ let toClaim = $t01171811778._1
373+ let toUnlock = $t01171811778._2
366374 let paymentAmount = if ((size(i.payments) == 0))
367375 then 0
368376 else i.payments[0].amount
388396 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
389397 if ((checks == checks))
390398 then {
391- let $t01257512648 = getLeasingNodeData(nodeAddress)
392- let nodeCurrentLeased = $t01257512648._1
393- let nodeNextLeased = $t01257512648._2
399+ let $t01284912922 = getLeasingNodeData(nodeAddress)
400+ let nodeCurrentLeased = $t01284912922._1
401+ let nodeNextLeased = $t01284912922._2
394402 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
395- let $t01271612802 = getUserLeasingData(nodeAddress, userAddress)
396- let userCurrentLeased = $t01271612802._1
397- let userNextLeased = $t01271612802._2
403+ let $t01299013076 = getUserLeasingData(nodeAddress, userAddress)
404+ let userCurrentLeased = $t01299013076._1
405+ let userNextLeased = $t01299013076._2
398406 let newUserNextLeased = (userNextLeased + userLeasingAmount)
399407 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
400408 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
454462
455463
456464 @Callable(i)
465+func setForceOutStopFlag (stop) = {
466+ let check = [if (isInAdminList(toString(i.caller)))
467+ then true
468+ else throwErr("caller is not in adminList")]
469+ if ((check == check))
470+ then [BooleanEntry(keyForceOutStop, stop)]
471+ else throw("Strict value is not equal to itself.")
472+ }
473+
474+
475+
476+@Callable(i)
457477 func getNodeDataREADONLY (nodeAddress) = {
458- let $t01524515309 = getLeasingNodeData(nodeAddress)
459- let currentLease = $t01524515309._1
460- let nextLeased = $t01524515309._2
478+ let $t01574915813 = getLeasingNodeData(nodeAddress)
479+ let currentLease = $t01574915813._1
480+ let nextLeased = $t01574915813._2
461481 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
462482 }
463483
465485
466486 @Callable(i)
467487 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
468- let $t01567915756 = getUserLeasingData(nodeAddress, userAddress)
469- let currentLease = $t01567915756._1
470- let nextLeased = $t01567915756._2
488+ let $t01618316260 = getUserLeasingData(nodeAddress, userAddress)
489+ let currentLease = $t01618316260._1
490+ let nextLeased = $t01618316260._2
471491 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
472492 }
473493
475495
476496 @Callable(i)
477497 func getUserDataREADONLY (userAddress) = {
478- let $t01611916179 = getUserToClaimBalance(userAddress)
479- let toClaim = $t01611916179._1
480- let toUnlock = $t01611916179._2
498+ let $t01662316683 = getUserToClaimBalance(userAddress)
499+ let toClaim = $t01662316683._1
500+ let toUnlock = $t01662316683._2
481501 let userTotalLocked = getUserTotalLocked(userAddress)
482502 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
483503 }
524544 @Callable(i)
525545 func claimAll () = {
526546 let userAddress = toString(i.caller)
527- let $t01719317253 = getUserToClaimBalance(userAddress)
528- let toClaim = $t01719317253._1
529- let toUnlock = $t01719317253._2
547+ let $t01769717757 = getUserToClaimBalance(userAddress)
548+ let toClaim = $t01769717757._1
549+ let toUnlock = $t01769717757._2
530550 let checks = [if ((toClaim > 0))
531551 then true
532552 else throwErr("nothing to claim")]
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "l2mp_leasing.ride"
55
66 let SEP = "__"
77
88 func throwErr (msg) = throw(((contractFile + ": ") + msg))
99
1010
1111 let keyAssetId = makeString(["%s", "assetId"], SEP)
1212
1313 let keyForceStop = makeString(["%s", "forceStop"], SEP)
14+
15+let keyForceOutStop = makeString(["%s", "forceOutStop"], SEP)
1416
1517 let keyPeriodOffsetId = makeString(["%s", "offsetId"], SEP)
1618
1719 let keyPeriodOffsetHeight = makeString(["%s", "offsetHeight"], SEP)
1820
1921 let keyPeriodLength = makeString(["%s", "periodLength"], SEP)
2022
2123 let periodOffsetId = valueOrElse(getInteger(this, keyPeriodOffsetId), 0)
2224
2325 let periodLength = valueOrElse(getInteger(this, keyPeriodLength), 10000)
2426
2527 let periodOffsetHeight = valueOrElse(getInteger(this, keyPeriodOffsetHeight), -1)
2628
2729 let currentPeriodId = if (if ((height > periodOffsetHeight))
2830 then (periodOffsetHeight != -1)
2931 else false)
3032 then (((height - periodOffsetHeight) / periodLength) + periodOffsetId)
3133 else max([0, (periodOffsetId - 1)])
3234
3335 let currentPeriodHeight = if (if ((periodOffsetHeight == -1))
3436 then true
3537 else if ((currentPeriodId == 0))
3638 then (periodOffsetHeight > height)
3739 else false)
3840 then 0
3941 else (periodOffsetHeight + ((currentPeriodId - periodOffsetId) * periodLength))
4042
4143 let nextPeriodHeight = if (if ((periodOffsetHeight == -1))
4244 then true
4345 else if ((currentPeriodId == 0))
4446 then (periodOffsetHeight > height)
4547 else false)
4648 then 0
4749 else (currentPeriodHeight + periodLength)
4850
4951 func keyLeasingNodeData (nodeAddress) = makeString(["%s", nodeAddress], SEP)
5052
5153
5254 func keyUserLeasingNodeData (userAddress,nodeAddress) = makeString(["%s%s", nodeAddress, userAddress], SEP)
5355
5456
5557 func keyUserToClaim (userAddress) = makeString(["%s%s", "toClaim", userAddress], SEP)
5658
5759
5860 func keyUserTotalLocked (userAddress) = makeString(["%s%s", "userTotalLocked", userAddress], SEP)
5961
6062
6163 func keyNodeLeasingByHeight (nodeAddress) = {
6264 let h = if ((periodOffsetHeight == -1))
6365 then 0
6466 else height
6567 makeString(["%s%d", nodeAddress, toString(h)], SEP)
6668 }
6769
6870
6971 func keyUserLeasingByHeight (nodeAddress,userAddress) = {
7072 let h = if ((periodOffsetHeight == -1))
7173 then 0
7274 else height
7375 makeString(["%s%s%d", nodeAddress, userAddress, toString(h)], SEP)
7476 }
7577
7678
7779 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
7880
7981 let assetIdBytes = if ((assetIdString == "WAVES"))
8082 then unit
8183 else fromBase58String(assetIdString)
8284
8385 let isForceStop = valueOrElse(getBoolean(this, keyForceStop), false)
8486
87+let isForceOutStop = valueOrElse(getBoolean(this, keyForceOutStop), false)
88+
8589 func isValidAddress (address) = match addressFromString(address) {
8690 case a: Address =>
8791 true
8892 case _ =>
8993 false
9094 }
9195
9296
9397 let ADMIN_LIST_SIZE = 5
9498
9599 let QUORUM = 3
96100
97101 let TXID_BYTES_LENGTH = 32
98102
99103 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
100104
101105
102106 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
103107
104108
105109 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
106110
107111
108112 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
109113
110114
111115 func getAdminVote (prefix,admin) = {
112116 let voteKey = keyFullAdminVote(prefix, admin)
113117 valueOrElse(getInteger(voteKey), 0)
114118 }
115119
116120
117121 func getAdminsList () = match getString(this, keyAdminAddressList()) {
118122 case s: String =>
119123 split(s, SEP)
120124 case _ =>
121125 nil
122126 }
123127
124128
125129 func isInAdminList (address) = containsElement(getAdminsList(), address)
126130
127131
128132 func genVotesKeysHelper (a,adminAddress) = {
129- let $t035623586 = a
130- let result = $t035623586._1
131- let prefix = $t035623586._2
133+ let $t036963720 = a
134+ let result = $t036963720._1
135+ let prefix = $t036963720._2
132136 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
133137 }
134138
135139
136140 func genVotesKeys (keyPrefix) = {
137141 let adminList = keyAdminAddressList()
138- let $t037333817 = {
142+ let $t038673951 = {
139143 let $l = getAdminsList()
140144 let $s = size($l)
141145 let $acc0 = $Tuple2(nil, keyPrefix)
142146 func $f0_1 ($a,$i) = if (($i >= $s))
143147 then $a
144148 else genVotesKeysHelper($a, $l[$i])
145149
146150 func $f0_2 ($a,$i) = if (($i >= $s))
147151 then $a
148152 else throw("List size exceeds 5")
149153
150154 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
151155 }
152- let result = $t037333817._1
153- let prefix = $t037333817._2
156+ let result = $t038673951._1
157+ let prefix = $t038673951._2
154158 result
155159 }
156160
157161
158162 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
159163
160164
161165 func countVotes (prefix) = {
162166 let votes = genVotesKeys(prefix)
163167 let $l = votes
164168 let $s = size($l)
165169 let $acc0 = 0
166170 func $f0_1 ($a,$i) = if (($i >= $s))
167171 then $a
168172 else countVotesHelper($a, $l[$i])
169173
170174 func $f0_2 ($a,$i) = if (($i >= $s))
171175 then $a
172176 else throw("List size exceeds 5")
173177
174178 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
175179 }
176180
177181
178182 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
179183
180184
181185 func getClearVoteEntries (prefix) = {
182186 let votes = genVotesKeys(prefix)
183187 let $l = votes
184188 let $s = size($l)
185189 let $acc0 = nil
186190 func $f0_1 ($a,$i) = if (($i >= $s))
187191 then $a
188192 else clearVotesHelper($a, $l[$i])
189193
190194 func $f0_2 ($a,$i) = if (($i >= $s))
191195 then $a
192196 else throw("List size exceeds 5")
193197
194198 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
195199 }
196200
197201
198202 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
199203 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
200204 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
201205 let err = if (!(isInAdminList(callerAddressString)))
202206 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
203207 else if ((adminCurrentVote == 1))
204208 then throwErr((voteKey + " you already voted"))
205209 else unit
206210 if ((err == err))
207211 then {
208212 let votes = countVotes(keyPrefix)
209213 if (((votes + 1) >= minVotes))
210214 then {
211215 let clearVoteEntries = getClearVoteEntries(keyPrefix)
212216 (clearVoteEntries ++ voteResult)
213217 }
214218 else [IntegerEntry(voteKey, 1)]
215219 }
216220 else throw("Strict value is not equal to itself.")
217221 }
218222
219223
220224 func getLeasingNodeEntry (nodeAddress,currentLeased,nextLeased) = {
221225 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(currentLeased), toString(nextPeriodHeight), toString(nextLeased)], SEP)
222226 StringEntry(keyLeasingNodeData(nodeAddress), valueString)
223227 }
224228
225229
226230 func getLeasingNodeData (nodeAddress) = {
227231 let leasingNodeDataStringRaw = getString(this, keyLeasingNodeData(nodeAddress))
228232 match leasingNodeDataStringRaw {
229233 case ds: String =>
230234 let dataList = split(ds, SEP)
231235 let nodeCurrentPeriod = parseIntValue(dataList[1])
232236 let nodeCurrentLeased = parseIntValue(dataList[2])
233237 let nodeNextPeriod = parseIntValue(dataList[3])
234238 let nodeNextLeased = parseIntValue(dataList[4])
235239 if (if ((nodeNextPeriod > height))
236240 then true
237241 else (periodOffsetHeight == -1))
238242 then $Tuple2(nodeCurrentLeased, nodeNextLeased)
239243 else $Tuple2(nodeNextLeased, nodeNextLeased)
240244 case _ =>
241245 $Tuple2(0, 0)
242246 }
243247 }
244248
245249
246250 func getUserLeasingEntry (nodeAddress,userAddress,userCurrentLeased,userNextLeased) = {
247251 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(userCurrentLeased), toString(nextPeriodHeight), toString(userNextLeased)], SEP)
248252 StringEntry(keyUserLeasingNodeData(userAddress, nodeAddress), valueString)
249253 }
250254
251255
252256 func getUserLeasingData (nodeAddress,userAddress) = {
253257 let leasingUserDataStringRaw = getString(this, keyUserLeasingNodeData(userAddress, nodeAddress))
254258 match leasingUserDataStringRaw {
255259 case ds: String =>
256260 let dataList = split(ds, SEP)
257261 let userCurrentPeriod = parseIntValue(dataList[1])
258262 let userCurrentLeased = parseIntValue(dataList[2])
259263 let userNextPeriod = parseIntValue(dataList[3])
260264 let userNextLeased = parseIntValue(dataList[4])
261265 if (if ((userNextPeriod > height))
262266 then true
263267 else (periodOffsetHeight == -1))
264268 then $Tuple2(userCurrentLeased, userNextLeased)
265269 else $Tuple2(userNextLeased, userNextLeased)
266270 case _ =>
267271 $Tuple2(0, 0)
268272 }
269273 }
270274
271275
272276 func getUserToClaimEntry (userAddress,toClaim,toUnlock) = {
273277 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(toClaim), toString(nextPeriodHeight), toString(toUnlock)], SEP)
274278 StringEntry(keyUserToClaim(userAddress), valueString)
275279 }
276280
277281
278282 func getUserToClaimBalance (userAddress) = {
279283 let userToClaimDataStringRaw = getString(this, keyUserToClaim(userAddress))
280284 match userToClaimDataStringRaw {
281285 case ds: String =>
282286 let dataList = split(ds, SEP)
283287 let currentPeriod = parseIntValue(dataList[1])
284288 let toClaim = parseIntValue(dataList[2])
285289 let nextPeriod = parseIntValue(dataList[3])
286290 let toUnlock = parseIntValue(dataList[4])
287291 if (if ((nextPeriod > height))
288292 then true
289293 else (currentPeriodId == 0))
290294 then $Tuple2(toClaim, toUnlock)
291295 else $Tuple2((toClaim + toUnlock), 0)
292296 case _ =>
293297 $Tuple2(0, 0)
294298 }
295299 }
296300
297301
298302 func getUserTotalLockedEntry (userAddress,userTotalLocked) = IntegerEntry(keyUserTotalLocked(userAddress), userTotalLocked)
299303
300304
301305 func getUserTotalLocked (userAddress) = valueOrElse(getInteger(this, keyUserTotalLocked(userAddress)), 0)
302306
303307
304308 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
305- let $t088578930 = getLeasingNodeData(nodeAddress)
306- let nodeCurrentLeased = $t088578930._1
307- let nodeNextLeased = $t088578930._2
308- let $t089359021 = getUserLeasingData(nodeAddress, userAddress)
309- let userCurrentLeased = $t089359021._1
310- let userNextLeased = $t089359021._2
309+ let $t089919064 = getLeasingNodeData(nodeAddress)
310+ let nodeCurrentLeased = $t089919064._1
311+ let nodeNextLeased = $t089919064._2
312+ let $t090699155 = getUserLeasingData(nodeAddress, userAddress)
313+ let userCurrentLeased = $t090699155._1
314+ let userNextLeased = $t090699155._2
311315 let checks = [if (!(isForceStop))
312316 then true
313- else throwErr("contract is temporary stopped"), if ((unstakeAmount > 0))
317+ else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
318+ then true
319+ else throwErr("unstake is temporary disabled"), if ((unstakeAmount > 0))
314320 then true
315321 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
316322 then true
317323 else throwErr("unstake amount should be less or equal user staked amount"), if ((nodeNextLeased >= unstakeAmount))
318324 then true
319325 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
320326 then true
321327 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
322328 then true
323329 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
324330 if ((checks == checks))
325331 then {
326332 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
327333 let newUserNextLeased = (userNextLeased - unstakeAmount)
328- let $t098349894 = getUserToClaimBalance(userAddress)
329- let toClaim = $t098349894._1
330- let toUnlock = $t098349894._2
334+ let $t01003910099 = getUserToClaimBalance(userAddress)
335+ let toClaim = $t01003910099._1
336+ let toUnlock = $t01003910099._2
331337 let newToUnlock = (toUnlock + unstakeAmount)
332338 let userTotalLocked = getUserTotalLocked(userAddress)
333339 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
334340 [getLeasingNodeEntry(nodeAddress, nodeCurrentLeased, newNodeNextLease), getUserLeasingEntry(nodeAddress, userAddress, userCurrentLeased, newUserNextLeased), getUserToClaimEntry(userAddress, toClaim, newToUnlock), getUserTotalLockedEntry(userAddress, newUserTotalLocked), IntegerEntry(keyNodeLeasingByHeight(nodeAddress), newNodeNextLease), IntegerEntry(keyUserLeasingByHeight(nodeAddress, userAddress), newUserNextLeased)]
335341 }
336342 else throw("Strict value is not equal to itself.")
337343 }
338344
339345
340346 func getClaimUnlockedActions (userAddress,claimAmount) = {
341- let $t01062310683 = getUserToClaimBalance(userAddress)
342- let toClaim = $t01062310683._1
343- let toUnlock = $t01062310683._2
347+ let $t01082810888 = getUserToClaimBalance(userAddress)
348+ let toClaim = $t01082810888._1
349+ let toUnlock = $t01082810888._2
344350 let checks = [if (!(isForceStop))
345351 then true
346- else throwErr("contract is temporary stopped"), if ((claimAmount > 0))
352+ else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
353+ then true
354+ else throwErr("claim is temporary disabled"), if ((claimAmount > 0))
347355 then true
348356 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
349357 then true
350358 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
351359 then true
352360 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
353361 if ((checks == checks))
354362 then {
355363 let newToClaim = (toClaim - claimAmount)
356364 [getUserToClaimEntry(userAddress, newToClaim, toUnlock), ScriptTransfer(addressFromStringValue(userAddress), claimAmount, assetIdBytes)]
357365 }
358366 else throw("Strict value is not equal to itself.")
359367 }
360368
361369
362370 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
363- let $t01144411504 = getUserToClaimBalance(userAddress)
364- let toClaim = $t01144411504._1
365- let toUnlock = $t01144411504._2
371+ let $t01171811778 = getUserToClaimBalance(userAddress)
372+ let toClaim = $t01171811778._1
373+ let toUnlock = $t01171811778._2
366374 let paymentAmount = if ((size(i.payments) == 0))
367375 then 0
368376 else i.payments[0].amount
369377 let available = ((toUnlock + toClaim) + paymentAmount)
370378 let checks = [if (!(isForceStop))
371379 then true
372380 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
373381 then true
374382 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
375383 then true
376384 else (i.payments[0].assetId == assetIdBytes))
377385 then true
378386 else throwErr(makeString(["payment assetId should be:", assetIdString], " ")), if ((userLeasingAmount > 0))
379387 then true
380388 else throwErr("amount should be greater than 0"), if ((available >= userLeasingAmount))
381389 then true
382390 else throwErr("amount should be less or equal (payment + available) amount"), if ((userLeasingAmount >= paymentAmount))
383391 then true
384392 else throw("amount should be greater or equal payment amount"), if (isValidAddress(nodeAddress))
385393 then true
386394 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
387395 then true
388396 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
389397 if ((checks == checks))
390398 then {
391- let $t01257512648 = getLeasingNodeData(nodeAddress)
392- let nodeCurrentLeased = $t01257512648._1
393- let nodeNextLeased = $t01257512648._2
399+ let $t01284912922 = getLeasingNodeData(nodeAddress)
400+ let nodeCurrentLeased = $t01284912922._1
401+ let nodeNextLeased = $t01284912922._2
394402 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
395- let $t01271612802 = getUserLeasingData(nodeAddress, userAddress)
396- let userCurrentLeased = $t01271612802._1
397- let userNextLeased = $t01271612802._2
403+ let $t01299013076 = getUserLeasingData(nodeAddress, userAddress)
404+ let userCurrentLeased = $t01299013076._1
405+ let userNextLeased = $t01299013076._2
398406 let newUserNextLeased = (userNextLeased + userLeasingAmount)
399407 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
400408 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
401409 let newToClaim = min([toClaim, (toClaim + (toUnlock - fromUnlockedAmount))])
402410 let userTotalLocked = getUserTotalLocked(userAddress)
403411 let newUserTotalLocked = (userTotalLocked + userLeasingAmount)
404412 [getLeasingNodeEntry(nodeAddress, nodeCurrentLeased, newNodeNextLease), getUserLeasingEntry(nodeAddress, userAddress, userCurrentLeased, newUserNextLeased), getUserToClaimEntry(userAddress, newToClaim, newToUnlock), getUserTotalLockedEntry(userAddress, newUserTotalLocked), IntegerEntry(keyNodeLeasingByHeight(nodeAddress), newNodeNextLease), IntegerEntry(keyUserLeasingByHeight(nodeAddress, userAddress), newUserNextLeased)]
405413 }
406414 else throw("Strict value is not equal to itself.")
407415 }
408416
409417
410418 func getStakeFromPaymentActions (nodeAddress,userAddress,i) = {
411419 let checks = [if ((size(i.payments) == 1))
412420 then true
413421 else throwErr("payment size should be exactly 1")]
414422 if ((checks == checks))
415423 then getStakeActions(nodeAddress, userAddress, i.payments[0].amount, i)
416424 else throw("Strict value is not equal to itself.")
417425 }
418426
419427
420428 func getSetNewPeriodLengthActions (newPeriodLength) = {
421429 let check = [if ((newPeriodLength > 0))
422430 then true
423431 else throwErr("period length should be greater than 0")]
424432 if ((check == check))
425433 then if ((periodOffsetHeight == -1))
426434 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
427435 else [IntegerEntry(keyPeriodOffsetId, (currentPeriodId + 1)), IntegerEntry(keyPeriodOffsetHeight, nextPeriodHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
428436 else throw("Strict value is not equal to itself.")
429437 }
430438
431439
432440 @Callable(i)
433441 func setNewPeriodLength (newPeriodLength) = {
434442 let checks = [if (isInAdminList(toString(i.caller)))
435443 then true
436444 else throwErr("caller is not in adminList")]
437445 if ((checks == checks))
438446 then getSetNewPeriodLengthActions(newPeriodLength)
439447 else throw("Strict value is not equal to itself.")
440448 }
441449
442450
443451
444452 @Callable(i)
445453 func setForceStopFlag (stop) = {
446454 let check = [if (isInAdminList(toString(i.caller)))
447455 then true
448456 else throwErr("caller is not in adminList")]
449457 if ((check == check))
450458 then [BooleanEntry(keyForceStop, stop)]
451459 else throw("Strict value is not equal to itself.")
452460 }
453461
454462
455463
456464 @Callable(i)
465+func setForceOutStopFlag (stop) = {
466+ let check = [if (isInAdminList(toString(i.caller)))
467+ then true
468+ else throwErr("caller is not in adminList")]
469+ if ((check == check))
470+ then [BooleanEntry(keyForceOutStop, stop)]
471+ else throw("Strict value is not equal to itself.")
472+ }
473+
474+
475+
476+@Callable(i)
457477 func getNodeDataREADONLY (nodeAddress) = {
458- let $t01524515309 = getLeasingNodeData(nodeAddress)
459- let currentLease = $t01524515309._1
460- let nextLeased = $t01524515309._2
478+ let $t01574915813 = getLeasingNodeData(nodeAddress)
479+ let currentLease = $t01574915813._1
480+ let nextLeased = $t01574915813._2
461481 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
462482 }
463483
464484
465485
466486 @Callable(i)
467487 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
468- let $t01567915756 = getUserLeasingData(nodeAddress, userAddress)
469- let currentLease = $t01567915756._1
470- let nextLeased = $t01567915756._2
488+ let $t01618316260 = getUserLeasingData(nodeAddress, userAddress)
489+ let currentLease = $t01618316260._1
490+ let nextLeased = $t01618316260._2
471491 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
472492 }
473493
474494
475495
476496 @Callable(i)
477497 func getUserDataREADONLY (userAddress) = {
478- let $t01611916179 = getUserToClaimBalance(userAddress)
479- let toClaim = $t01611916179._1
480- let toUnlock = $t01611916179._2
498+ let $t01662316683 = getUserToClaimBalance(userAddress)
499+ let toClaim = $t01662316683._1
500+ let toUnlock = $t01662316683._2
481501 let userTotalLocked = getUserTotalLocked(userAddress)
482502 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
483503 }
484504
485505
486506
487507 @Callable(i)
488508 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
489509
490510
491511
492512 @Callable(i)
493513 func lease (nodeAddress) = {
494514 let userAddress = toString(i.caller)
495515 getStakeFromPaymentActions(nodeAddress, userAddress, i)
496516 }
497517
498518
499519
500520 @Callable(i)
501521 func leaseFromLocked (nodeAddress,amount) = {
502522 let userAddress = toString(i.caller)
503523 getStakeActions(nodeAddress, userAddress, amount, i)
504524 }
505525
506526
507527
508528 @Callable(i)
509529 func cancelLease (nodeAddress,amount) = {
510530 let userAddress = toString(i.caller)
511531 getUnstakeActions(nodeAddress, userAddress, amount)
512532 }
513533
514534
515535
516536 @Callable(i)
517537 func claim (amount) = {
518538 let userAddress = toString(i.caller)
519539 getClaimUnlockedActions(userAddress, amount)
520540 }
521541
522542
523543
524544 @Callable(i)
525545 func claimAll () = {
526546 let userAddress = toString(i.caller)
527- let $t01719317253 = getUserToClaimBalance(userAddress)
528- let toClaim = $t01719317253._1
529- let toUnlock = $t01719317253._2
547+ let $t01769717757 = getUserToClaimBalance(userAddress)
548+ let toClaim = $t01769717757._1
549+ let toUnlock = $t01769717757._2
530550 let checks = [if ((toClaim > 0))
531551 then true
532552 else throwErr("nothing to claim")]
533553 if ((checks == checks))
534554 then getClaimUnlockedActions(userAddress, toClaim)
535555 else throw("Strict value is not equal to itself.")
536556 }
537557
538558
539559
540560 @Callable(i)
541561 func voteForTxId (txId) = {
542562 let callerAddressString = toBase58String(i.caller.bytes)
543563 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
544564 let result = [StringEntry(keyAllowedTxId(), txId)]
545565 let allowedTxIdOption = getString(this, keyAllowedTxId())
546566 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
547567 then true
548568 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
549569 then true
550570 else (value(allowedTxIdOption) != txId))
551571 then true
552572 else throwErr((txId + " is already allowed"))]
553573 if ((err == err))
554574 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
555575 else throw("Strict value is not equal to itself.")
556576 }
557577
558578
559579 @Verifier(tx)
560580 func verify () = {
561581 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
562582 let byOwner = if ((size(getAdminsList()) >= QUORUM))
563583 then false
564584 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
565585 if (byAdmins)
566586 then true
567587 else byOwner
568588 }
569589

github/deemru/w8io/026f985 
69.60 ms