tx · BJhdKJH9VbGSg3J8wTbzfL3AjhX94MEgbHdXVaBiDkZP

3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh:  -0.02300000 Waves

2023.03.20 07:06 [3563424] smart account 3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh > SELF 0.00000000 Waves

{ "type": 13, "id": "BJhdKJH9VbGSg3J8wTbzfL3AjhX94MEgbHdXVaBiDkZP", "fee": 2300000, "feeAssetId": null, "timestamp": 1679285172442, "version": 2, "chainId": 87, "sender": "3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh", "senderPublicKey": "6Dx2LuCqezyDYjt3zMEL6WRrs5oaor6aK3L6QouPMP1b", "proofs": [ "2pnsxTaB2kmZVzRKeJz2GsdX6q7uH6mH43NjiDEd4vUeFM11Y3MxohsJVd2tPzXEdiXrdHpNhfXucRs2CWMSHCvb" ], "script": "base64:BgInCAISAwoBBBIECgIIBBIDCgEIEgMKAQgSBAoCCAgSBAoCCAgSABIAEgAPY3JlYXRpb25BZGRyZXNzCQEHQWRkcmVzcwEBGgFXk93E0hfnIAr99yESTvDwdmcmgwN41FxMABRzaWduQXJ0SXNzdWVyQWRkcmVzcwkBB0FkZHJlc3MBARoBV3tk1VvWnhe5qtPmj/wDXMjEFvibuoYp4gALVVNEVEFzc2V0SWQBIB6UBxNSdqEllf3IYaiCXxB/3zpPKbv8mkY/Wv02T5+RAA1QVVpaTEVBc3NldElkASDxGv4l/vaZOPRpKsTf4RLWR7LGyg66Nwmvd20fjqLlYwAOdG90YWxTdGFrZWRLZXkCDHRvdGFsX3N0YWtlZAANdG90YWxQb3dlcktleQILdG90YWxfcG93ZXIAEnRvdGFsU3BlbnRQb3dlcktleQIQdG90YWxfc3BlbnRQb3dlcgARdm90ZVBvd2VyTGltaXRLZXkCEFZPVEVfUE9XRVJfTElNSVQAFmN1cnJlbnRSZXdvcmRzUm91bmRLZXkCFWN1cnJlbnRfcmV3b3Jkc19yb3VuZAAYZmluYWxWb3RpbmdDYW5kaWRhdGVzS2V5AhhmaW5hbF92b2l0aW5nX2NhbmRpZGF0ZXMAFWFsbFN0YWtlZEFkZHJlc3Nlc0tleQIUYWxsX3N0YWtlZF9hZGRyZXNzZXMAF1B1enpsZURyYWdvbnNTaWduQXJ0SWRzCQDMCAICLDlpUExzWW96OGZOeVVwOXFjZ2VBRlBwTWpLR2NiNG1OVVJoQVo3ZGZ6WGVqCQDMCAICLDJLODQ3R2RBY3FhSEhZbjFkU1MxRjNOWXJpdXF1SktLek1vQkVTMWNuNE1iCQDMCAICLDdEMWVDVmVNYmpITHBqWXVxS1o5NkxvV1B3RDcxcXV3dVdwWnhjdUtua0o3CQDMCAICK3pqRTVkd1R2M0F1a1FqNnhNeWRkamNxQTgyYkt2U05MZWFLTGhuRllLR2YJAMwIAgIsNFQ4UVNyTExxVXBIcGk4U2VjU1FUMXA1dEdvMUNBc2tUR2dZZ1VtWEJZRWIJAMwIAgIsQWpIa3Z4SnBneHg4VUFNbXo2Z3Z4anRCYW5HQkhlRVVhWXh5Z2RzVFJjVjYJAMwIAgIsNGpydUZNMWd2cnRNSFhpS2R6MkVLdDEyZkhHakg1TVQ4WWNaa0Y2S1ZHUDcJAMwIAgIrWloxY004TjNVQzN1QWRvQ1hKd1R3a21wZVRTRmpwTkI0R1ZhNVV3WVZHUwkAzAgCAiw2VUF2b2pKcEZ4VWpBb1JGYjNuaHhDUlVkR3pGQ3Z4Q0tuaUx0SnF4Vms3NwkAzAgCAiwyTlN2cDVKWDhZVE5YV0tYcEU5a2laQTIyZ2c0RE0yWWM3bWNiOVU2UGt4QgUDbmlsAQhjaGVja05GVAEFYXNzZXQEDmlzUHV6emxlRHJhZ29uBAckbWF0Y2gwCQDPCAIFF1B1enpsZURyYWdvbnNTaWduQXJ0SWRzCQDYBAEIBQVhc3NldAJpZAMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAJAGcCBQF4AAAHAwMDAwMFDmlzUHV6emxlRHJhZ29uBgkAAAIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICBG5mdF8JANgEAQgFBWFzc2V0AmlkAgdfaXNzdWVyCQClCAEFBHRoaXMJAAACCAUFYXNzZXQGaXNzdWVyAwUOaXNQdXp6bGVEcmFnb24FFHNpZ25BcnRJc3N1ZXJBZGRyZXNzBQ9jcmVhdGlvbkFkZHJlc3MHCQAAAggFBWFzc2V0CGRlY2ltYWxzAAAHCQAAAggFBWFzc2V0CnJlaXNzdWFibGUHBwkAAAIIBQVhc3NldAhxdWFudGl0eQABBwELZ2V0UG93ZXJORlQBBWFzc2V0BA5pc1B1enpsZURyYWdvbgQHJG1hdGNoMAkAzwgCBRdQdXp6bGVEcmFnb25zU2lnbkFydElkcwkA2AQBCAUFYXNzZXQCaWQDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwCQBnAgUBeAAABwMFDmlzUHV6emxlRHJhZ29uACgEBnBhcmFtcwkBEUBleHRyTmF0aXZlKDEwNTMpAgUPY3JlYXRpb25BZGRyZXNzCQCsAgIJAKwCAgIEbmZ0XwkA2AQBCAUFYXNzZXQCaWQCB19wYXJhbXMDCQAAAgUGcGFyYW1zAgRnb2xkAGQAKAEOaXNWb3RpbmdDbG9zZWQBBnZvdGVJZAQQdm90ZUNvbmZpcm1lZEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9jb25maXJtZWQED3ZvdGVSZWplY3RlZEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCV9yZWplY3RlZAQLaXNDb25maXJtZWQJAQt2YWx1ZU9yRWxzZQIJAKAIAQUQdm90ZUNvbmZpcm1lZEtleQcECmlzUmVqZWN0ZWQJAQt2YWx1ZU9yRWxzZQIJAKAIAQUPdm90ZVJlamVjdGVkS2V5BwMFC2lzQ29uZmlybWVkBgUKaXNSZWplY3RlZAEVYWRkU3RyaW5nVG9TdGF0ZUFycmF5AgdkYXRhS2V5BGl0ZW0EB2FsbERhdGEJAQt2YWx1ZU9yRWxzZQIJAKIIAQUHZGF0YUtleQIAAwkBASEBCQEJaXNEZWZpbmVkAQkAswkCBQdhbGxEYXRhBQRpdGVtAwkAAAIJALECAQUHYWxsRGF0YQAACQDMCAIJAQtTdHJpbmdFbnRyeQIFB2RhdGFLZXkFBGl0ZW0FA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQdkYXRhS2V5CQC7CQIJAM0IAgkAvQkCBQdhbGxEYXRhAgEsBQRpdGVtAgEsBQNuaWwFA25pbAEYcmVtb3ZlSXRlbUZyb21TdGF0ZUFycmF5AgdkYXRhS2V5BGl0ZW0EB2FsbERhdGEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBQdkYXRhS2V5CQCsAgIJAKwCAgIPRGF0YSBmb3Iga2V5OiAnBQdkYXRhS2V5AgsnIG5vdCBmb3VuZAMJAQlpc0RlZmluZWQBCQCzCQIFB2FsbERhdGEFBGl0ZW0ECGRhdGFMaXN0CQC9CQIFB2FsbERhdGECASwECWl0ZW1JbmRleAkBBXZhbHVlAQkAzwgCBQhkYXRhTGlzdAUEaXRlbQkAzAgCCQELU3RyaW5nRW50cnkCBQdkYXRhS2V5CQC7CQIJANEIAgUIZGF0YUxpc3QFCWl0ZW1JbmRleAIBLAUDbmlsBQNuaWwBEXJlbW92ZUl0ZW1Gcm9tU3RyAgNzdHIEaXRlbQMJAQlpc0RlZmluZWQBCQCzCQIFA3N0cgUEaXRlbQQIZGF0YUxpc3QJAL0JAgUDc3RyAgEsBAlpdGVtSW5kZXgJAQV2YWx1ZQEJAM8IAgUIZGF0YUxpc3QFBGl0ZW0JALsJAgkA0QgCBQhkYXRhTGlzdAUJaXRlbUluZGV4AgEsBQNzdHIIAWkBBXN0YWtlAQVkZWJ1ZwQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEAXADCQBmAgkAkAMBCAUBaQhwYXltZW50cwAACQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAhZQYXltZW50cyBsaXN0IGlzIGVtcHR5BAVhc3NldAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFAXAHYXNzZXRJZAIPSW52YWxpZCBwYXltZW50AhBJbnZhbGlkIGFzc2V0IElkAwUFZGVidWcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIOcGF5bWVudHMgc2l6ZSAJAKQDAQkAkAMBCAUBaQhwYXltZW50cwIJIGFzc2V0SWQgCQDYBAEJAQV2YWx1ZQEIBQFwB2Fzc2V0SWQCCCBhbW91bnQgCQCkAwEIBQFwBmFtb3VudAMDCQBmAggFAXAGYW1vdW50AAAJAQhjaGVja05GVAEFBWFzc2V0BwQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdG90YWxTdGFrZWRLZXkAAAQKdG90YWxQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ10b3RhbFBvd2VyS2V5AAAED2FkZHJlc3NQb3dlcktleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIEFWFkZHJlc3NUb3RhbFN0YWtlZEtleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgxfdG90YWxTdGFrZWQEFGFkZHJlc3NTdGFrZWROZnRzS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICC19zdGFrZWROZnRzBAxhZGRyZXNzUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPYWRkcmVzc1Bvd2VyS2V5AAAEEmFkZHJlc3NUb3RhbFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRVhZGRyZXNzVG90YWxTdGFrZWRLZXkAAAQRYWRkcmVzc1N0YWtlZE5mdHMJAQt2YWx1ZU9yRWxzZQIJAKIIAQUUYWRkcmVzc1N0YWtlZE5mdHNLZXkCAAMJAGYCCQBkAgUSYWRkcmVzc1RvdGFsU3Rha2VkAAEABQkAAgECGVlvdSBjYW4gc3Rha2Ugb25seSA1IE5GVHMECG5mdFBvd2VyCQELZ2V0UG93ZXJORlQBBQVhc3NldAQIbmZ0SWRTdHIJANgEAQgFBWFzc2V0AmlkBBZhZGRyZXNzU3Rha2VkTmZ0c1N0YXRlAwkAAAIJALECAQURYWRkcmVzc1N0YWtlZE5mdHMAAAkAzAgCCQELU3RyaW5nRW50cnkCBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQUIbmZ0SWRTdHIFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQkAuQkCCQDNCAIJALUJAgURYWRkcmVzc1N0YWtlZE5mdHMCASwFCG5mdElkU3RyAgEsBQNuaWwJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ50b3RhbFN0YWtlZEtleQkAZAIFC3RvdGFsU3Rha2VkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFDXRvdGFsUG93ZXJLZXkJAGQCBQp0b3RhbFBvd2VyBQhuZnRQb3dlcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUIbmZ0SWRTdHICBl9vd25lcgUKYWRkcmVzc1N0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBG5mdF8FCG5mdElkU3RyAgZfcG93ZXIFCG5mdFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9hZGRyZXNzUG93ZXJLZXkJAGQCBQxhZGRyZXNzUG93ZXIFCG5mdFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVhZGRyZXNzVG90YWxTdGFrZWRLZXkJAGQCBRJhZGRyZXNzVG90YWxTdGFrZWQAAQUDbmlsCQEVYWRkU3RyaW5nVG9TdGF0ZUFycmF5AgUVYWxsU3Rha2VkQWRkcmVzc2VzS2V5BQphZGRyZXNzU3RyBRZhZGRyZXNzU3Rha2VkTmZ0c1N0YXRlCQACAQIiSW52YWxpZCBwYXltZW50IGFzc2V0IElkIG9yIGFtb3VudAFpAQd1bnN0YWtlAghuZnRJZFN0cgVkZWJ1ZwQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQhuZnRJZFN0cgIOSW52YWxpZCBuZnQgSWQEDG93bmVyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgRuZnRfBQhuZnRJZFN0cgIGX293bmVyAhJPd25lciBkYXRhIGludmFsaWQDCQECIT0CBQxvd25lckFkZHJlc3MFCmFkZHJlc3NTdHIJAAIBAhVZb3UgYXJlIG5vdCB0aGUgb3duZXIDCQEIY2hlY2tORlQBBQVhc3NldAQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdG90YWxTdGFrZWRLZXkAAAQKdG90YWxQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ10b3RhbFBvd2VyS2V5AAAED2FkZHJlc3NQb3dlcktleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIEFWFkZHJlc3NUb3RhbFN0YWtlZEtleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgxfdG90YWxTdGFrZWQEFGFkZHJlc3NTdGFrZWROZnRzS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICC19zdGFrZWROZnRzBAxhZGRyZXNzUG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ9hZGRyZXNzUG93ZXJLZXkCHUFkZHJlc3MgcG93ZXIgdmFsdWUgbm90IGZvdW5kBBJhZGRyZXNzVG90YWxTdGFrZWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRVhZGRyZXNzVG90YWxTdGFrZWRLZXkCJEFkZHJlc3MgdG90YWwgc3Rha2VkIHZhbHVlIG5vdCBmb3VuZAQRYWRkcmVzc1N0YWtlZE5mdHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQIjQWRkcmVzcyBzdGFrZWQgTmZ0cyB2YWx1ZSBub3QgZm91bmQEDW5mdEFzc2V0SWRTdHIJANgEAQgFBWFzc2V0AmlkBAhuZnRQb3dlcgkBEUBleHRyTmF0aXZlKDEwNTUpAQkArAICCQCsAgICBG5mdF8FDW5mdEFzc2V0SWRTdHICBl9wb3dlcgQTdXBkYXRlZEFkZHJlc3NQb3dlcgkAZQIFDGFkZHJlc3NQb3dlcgUIbmZ0UG93ZXIEE3JlbW92ZVN0YWtlZEFkZHJlc3MDCQAAAgUTdXBkYXRlZEFkZHJlc3NQb3dlcgAACQEYcmVtb3ZlSXRlbUZyb21TdGF0ZUFycmF5AgUVYWxsU3Rha2VkQWRkcmVzc2VzS2V5BQphZGRyZXNzU3RyBQNuaWwEFWFkZHJlc3NTdGFrZWROZnRzTGlzdAkAtQkCBRFhZGRyZXNzU3Rha2VkTmZ0cwIBLAQVYWRkcmVzc1N0YWtlZE5mdEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUVYWRkcmVzc1N0YWtlZE5mdHNMaXN0BQhuZnRJZFN0cgIlTkZUIG5vdCBmb3VuZWQgaW4gYWRkcmVzcyBzdGFrZWQgbGlzdAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCAUFYXNzZXQCaWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDnRvdGFsU3Rha2VkS2V5CQBlAgULdG90YWxTdGFrZWQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdG90YWxQb3dlcktleQkAZQIFCnRvdGFsUG93ZXIFCG5mdFBvd2VyCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQ1uZnRBc3NldElkU3RyAgZfb3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FDW5mdEFzc2V0SWRTdHICBl9wb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUPYWRkcmVzc1Bvd2VyS2V5BRN1cGRhdGVkQWRkcmVzc1Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVhZGRyZXNzVG90YWxTdGFrZWRLZXkJAGUCBRJhZGRyZXNzVG90YWxTdGFrZWQAAQkAzAgCCQELU3RyaW5nRW50cnkCBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQkAuQkCCQDRCAIFFWFkZHJlc3NTdGFrZWROZnRzTGlzdAUVYWRkcmVzc1N0YWtlZE5mdEluZGV4AgEsBQNuaWwFE3JlbW92ZVN0YWtlZEFkZHJlc3MJAAIBAg5JbnZhbGlkIG5mdCBJZAFpAQpzZW5kVG9Wb3RlAQxjb2xsZWN0aW9uSWQEBmlzc3VlcgkAkQMCCQC1CQIFDGNvbGxlY3Rpb25JZAIBXwAABAdpc0V4aXN0BAckbWF0Y2gwCQCiCAEJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUMY29sbGVjdGlvbklkAgdfdm90ZUlkAwkAAQIFByRtYXRjaDACBlN0cmluZwQBdAUHJG1hdGNoMAYHAwkAAAIJALECAQUGaXNzdWVyAAAJAAIBAhtDb2xsZWN0aW9uIGlzc3VlciBub3QgZm91bmQDBQdpc0V4aXN0CQACAQIwQ29sbGVjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHN1Ym1pdHRlZCBmb3Igdm90aW5nAwkBAiE9AgUGaXNzdWVyCQClCAEIBQFpBmNhbGxlcgkAAgECJk9ubHkgdGhlIGlzc3VlciBjYW4gc3VibWl0IHRvIHRoZSB2b3RlBAZ2b3RlSWQJANgEAQkA1BYBCQCbAwEFDGNvbGxlY3Rpb25JZAQKdG90YWxWb3RlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBAgt0b3RhbF92b3RlcwAABAtxdW9ydW1MaW1pdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEXZvdGVQb3dlckxpbWl0S2V5AhpWb3RlIHBvd2VyIGxpbWl0IG5vdCBmb3VuZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FDGNvbGxlY3Rpb25JZAIHX3ZvdGVJZAUGdm90ZUlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkBQxjb2xsZWN0aW9uSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCBl9vd25lcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfY3JlYXRlZEF0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgdfcXVvcnVtBQtxdW9ydW1MaW1pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgILdG90YWxfdm90ZXMJAGQCBQp0b3RhbFZvdGVzAAEFA25pbAFpAQ5yZW1vdmVGcm9tVm90ZQEGdm90ZUlkBAxjb2xsZWN0aW9uSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAINX2NvbGxlY3Rpb25JZAIXQ29sbGVjdGlvbiBJZCBub3QgZm91bmQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCBl9vd25lcgIPT3duZXIgbm90IGZvdW5kAwkBAiE9AgUFb3duZXIJAKUIAQgFAWkGY2FsbGVyCQACAQIVWW91IGFyZSBub3QgdGhlIG93bmVyAwkBDmlzVm90aW5nQ2xvc2VkAQUGdm90ZUlkCQACAQIQVm90aW5nIGlzIGNsb3NlZAQKdG90YWxWb3RlcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAECC3RvdGFsX3ZvdGVzAht0b3RhbCB2b3RlcyB2YWx1ZSBub3QgZm91bmQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICC2NvbGxlY3Rpb25fBQxjb2xsZWN0aW9uSWQCB192b3RlSWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCBl9vd25lcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NyZWF0ZWRBdAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIHX3F1b3J1bQkAzAgCCQEMSW50ZWdlckVudHJ5AgILdG90YWxfdm90ZXMJAGUCBQp0b3RhbFZvdGVzAAEFA25pbAFpAQl2b3RlQnlORlQCBnZvdGVJZAZhc3NldHMECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAxjb2xsZWN0aW9uSWQJAQt2YWx1ZU9yRWxzZQIJAKIIAQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQCAAMJAQ5pc1ZvdGluZ0Nsb3NlZAEFBnZvdGVJZAkAAgECEFZvdGluZyBpcyBjbG9zZWQDCQAAAgkAsQIBBQxjb2xsZWN0aW9uSWQAAAkAAgECFENvbGxlY3Rpb24gbm90IGZvdW5kAwkAAAIJALECAQUGYXNzZXRzAAAJAAIBAhRBc3NldHMgbGlzdCBpcyBlbXB0eQQOdm90ZVVwUG93ZXJLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAghfdXBQb3dlcgQQdm90ZURvd25Qb3dlcktleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9kb3duUG93ZXIEEXZvdGVUb3RhbFBvd2VyS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAILX3RvdGFsUG93ZXIED3ZvdGVVc2VkTmZ0c0tleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCV91c2VkTmZ0cwQSdm90ZXJTcGVudFBvd2VyS2V5CQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgtfc3BlbnRQb3dlcgQUdm90ZXJWb3RlVXNlZE5mdHNLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIJX3VzZWROZnRzBBZ2b3RlclZvdGVTcGVudFBvd2VyS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCC19zcGVudFBvd2VyBA9hZGRyZXNzUG93ZXJLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIGX3Bvd2VyBBRhZGRyZXNzU3Rha2VkTmZ0c0tleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgtfc3Rha2VkTmZ0cwQLdXBQb3dlckRhcHAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdm90ZVVwUG93ZXJLZXkAAAQNZG93blBvd2VyRGFwcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRB2b3RlRG93blBvd2VyS2V5AAAEDnRvdGFsVm90ZVBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFEXZvdGVUb3RhbFBvd2VyS2V5AAAEDHZvdGVVc2VkTmZ0cwkBC3ZhbHVlT3JFbHNlAgkAoggBBQ92b3RlVXNlZE5mdHNLZXkCAAQPdm90ZXJTcGVudFBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFEnZvdGVyU3BlbnRQb3dlcktleQAABBF2b3RlclZvdGVVc2VkTmZ0cwkBC3ZhbHVlT3JFbHNlAgkAoggBBRR2b3RlclZvdGVVc2VkTmZ0c0tleQIABA90b3RhbFNwZW50UG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSdG90YWxTcGVudFBvd2VyS2V5AAAEE3ZvdGVyVm90ZVNwZW50UG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUWdm90ZXJWb3RlU3BlbnRQb3dlcktleQAABAxhZGRyZXNzUG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ9hZGRyZXNzUG93ZXJLZXkCFFlvdSBkb24ndCBoYXZlIHBvd2VyBBFhZGRyZXNzU3Rha2VkTmZ0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFFGFkZHJlc3NTdGFrZWROZnRzS2V5AhpZb3UgZG9uJ3QgaGF2ZSBzdGFrZWQgTkZUcwQZYWRkZXJzc0xhc3RSZXdhcmRSb3VuZEtleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAhFfbGFzdFJld2FyZHNSb3VuZAQTY3VycmVudFJld29yZHNSb3VuZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRZjdXJyZW50UmV3b3Jkc1JvdW5kS2V5AAAEFmFkZGVyc3NMYXN0UmV3YXJkUm91bmQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUZYWRkZXJzc0xhc3RSZXdhcmRSb3VuZEtleQAABAphc3NldHNMaXN0CQC1CQIFBmFzc2V0cwIBfAQQdm90ZVVzZWROZnRzTGlzdAMJAAACCQCxAgEFDHZvdGVVc2VkTmZ0cwAABQNuaWwJAL0JAgUMdm90ZVVzZWROZnRzAgEsBBV2b3RlclZvdGVVc2VkTmZ0c0xpc3QDCQAAAgkAsQIBBRF2b3RlclZvdGVVc2VkTmZ0cwAABQNuaWwJAL0JAgURdm90ZXJWb3RlVXNlZE5mdHMCASwKAQ1wcm9jZXNzQXNzZXRzAgVhY2N1bQRuZXh0BAVwYXJ0cwkAtQkCBQRuZXh0AgFfBAVuZnRJZAkAkQMCBQVwYXJ0cwAABAR0eXBlCQCRAwIFBXBhcnRzAAEEBXBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBG5mdF8FBW5mdElkAgZfcG93ZXICE05GVCBwb3dlciBub3QgZm91bmQEEHN0YWtlZE93bmVySW5kZXgJAQt2YWx1ZU9yRWxzZQIJALMJAgURYWRkcmVzc1N0YWtlZE5mdHMFBW5mdElkAP///////////wEDCQAAAgUFcG93ZXIAAAkAAgECF1Bvd2VyIG11c3QgYmUgbW9yZSB6ZXJvAwkAAAIFEHN0YWtlZE93bmVySW5kZXgA////////////AQkAAgECHEFzc2V0IGRvZXMgbm90IGJlbG9uZyB0byB5b3UECmFzc2V0SW5kZXgJAQt2YWx1ZU9yRWxzZQIJAM8IAgUQdm90ZVVzZWROZnRzTGlzdAUFbmZ0SWQA////////////AQMJAAACBQphc3NldEluZGV4AP///////////wEDAwkBAiE9AgUEdHlwZQICdXAJAQIhPQIFBHR5cGUCBGRvd24HCQACAQIMSW52YWxpZCB0eXBlCQCWCgQJAGQCCAUFYWNjdW0CXzEDCQAAAgUEdHlwZQICdXAFBXBvd2VyAAAJAGQCCAUFYWNjdW0CXzIDCQAAAgUEdHlwZQIEZG93bgUFcG93ZXIAAAkAzQgCCAUFYWNjdW0CXzMFBW5mdElkCQDNCAIIBQVhY2N1bQJfNAkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCCV9hc3NldElkXwUFbmZ0SWQJAKwCAgkArAICCQCsAgIJAKwCAgUEdHlwZQIBOgkApAMBBQVwb3dlcgIBOgkApAMBBQZoZWlnaHQFBWFjY3VtBBJwcm9jZXNzUmVzdWx0VHVwbGUKAAIkbAUKYXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1wcm9jZXNzQXNzZXRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQHdXBQb3dlcggFEnByb2Nlc3NSZXN1bHRUdXBsZQJfMQQJZG93blBvd2VyCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl8yBApwb3dlclZhbHVlCQBkAgUHdXBQb3dlcgUJZG93blBvd2VyAwkAZgIFCnBvd2VyVmFsdWUFDGFkZHJlc3NQb3dlcgkAAgECIlBvd2VyIGV4Y2VlZHMgcG93ZXIgb2YgdGhlIGFjY291bnQDCQAAAgUKcG93ZXJWYWx1ZQAACQACAQIYTm90IGVub3VnaCBwb3dlciB0byB2b3RlAwkAAAIJAJADAQgFEnByb2Nlc3NSZXN1bHRUdXBsZQJfMwAACQACAQIbVXNlZCBsaXN0IG11c3Qgbm90IGJlIGVtcHR5AwkAAAIJAJADAQgFEnByb2Nlc3NSZXN1bHRUdXBsZQJfNAAACQACAQIkU3RhdGUgZW50cmllcyBsaXN0IG11c3Qgbm90IGJlIGVtcHR5BAtxdW9ydW1MaW1pdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEXZvdGVQb3dlckxpbWl0S2V5AhpWb3RlIHBvd2VyIGxpbWl0IG5vdCBmb3VuZAQUdXBkYXRlQ2FuZGl0YXRlc0xpc3QDCQBmAgkAZAIFDnRvdGFsVm90ZVBvd2VyBQpwb3dlclZhbHVlBQtxdW9ydW1MaW1pdAkBFWFkZFN0cmluZ1RvU3RhdGVBcnJheQIFGGZpbmFsVm90aW5nQ2FuZGlkYXRlc0tleQUGdm90ZUlkBQNuaWwEGGFkZHJlc3NSZXdvcmRzUm91bmRTdGF0ZQMDCQAAAgUWYWRkZXJzc0xhc3RSZXdhcmRSb3VuZAAACQBmAgUTY3VycmVudFJld29yZHNSb3VuZAUWYWRkZXJzc0xhc3RSZXdhcmRSb3VuZAcJAMwIAgkBDEludGVnZXJFbnRyeQIFGWFkZGVyc3NMYXN0UmV3YXJkUm91bmRLZXkFE2N1cnJlbnRSZXdvcmRzUm91bmQFA25pbAUDbmlsCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ2b3RlclNwZW50UG93ZXJLZXkJAGQCBQ92b3RlclNwZW50UG93ZXIFCnBvd2VyVmFsdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFEnRvdGFsU3BlbnRQb3dlcktleQkAZAIFD3RvdGFsU3BlbnRQb3dlcgUKcG93ZXJWYWx1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdm90ZVVwUG93ZXJLZXkJAGQCBQt1cFBvd2VyRGFwcAUHdXBQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUQdm90ZURvd25Qb3dlcktleQkAZAIFDWRvd25Qb3dlckRhcHAFCWRvd25Qb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgURdm90ZVRvdGFsUG93ZXJLZXkJAGQCBQ50b3RhbFZvdGVQb3dlcgUKcG93ZXJWYWx1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUWdm90ZXJWb3RlU3BlbnRQb3dlcktleQkAZAIFE3ZvdGVyVm90ZVNwZW50UG93ZXIFCnBvd2VyVmFsdWUJAMwIAgkBC1N0cmluZ0VudHJ5AgUUdm90ZXJWb3RlVXNlZE5mdHNLZXkJALsJAgkAzggCBRV2b3RlclZvdGVVc2VkTmZ0c0xpc3QIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzMCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUPdm90ZVVzZWROZnRzS2V5CQC7CQIJAM4IAgUQdm90ZVVzZWROZnRzTGlzdAgFEnByb2Nlc3NSZXN1bHRUdXBsZQJfMwIBLAUDbmlsCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl80BRR1cGRhdGVDYW5kaXRhdGVzTGlzdAUYYWRkcmVzc1Jld29yZHNSb3VuZFN0YXRlAWkBC3Vudm90ZUJ5TkZUAgZ2b3RlSWQGYXNzZXRzBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQMY29sbGVjdGlvbklkCQELdmFsdWVPckVsc2UCCQCiCAEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkAgADCQEOaXNWb3RpbmdDbG9zZWQBBQZ2b3RlSWQJAAIBAhBWb3RpbmcgaXMgY2xvc2VkAwkAAAIJALECAQUMY29sbGVjdGlvbklkAAAJAAIBAhRDb2xsZWN0aW9uIG5vdCBmb3VuZAQOdm90ZVVwUG93ZXJLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAghfdXBQb3dlcgQQdm90ZURvd25Qb3dlcktleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9kb3duUG93ZXIEEXZvdGVUb3RhbFBvd2VyS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAILX3RvdGFsUG93ZXIED3ZvdGVVc2VkTmZ0c0tleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCV91c2VkTmZ0cwQSdm90ZXJTcGVudFBvd2VyS2V5CQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgtfc3BlbnRQb3dlcgQUdm90ZXJWb3RlVXNlZE5mdHNLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIJX3VzZWROZnRzBBZ2b3RlclZvdGVTcGVudFBvd2VyS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCC19zcGVudFBvd2VyBA9hZGRyZXNzUG93ZXJLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIGX3Bvd2VyBBRhZGRyZXNzU3Rha2VkTmZ0c0tleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgtfc3Rha2VkTmZ0cwQLdXBQb3dlckRhcHAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ52b3RlVXBQb3dlcktleQIXVXAgdm90ZSBwb3dlciBub3QgZm91bmQEDWRvd25Qb3dlckRhcHAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRB2b3RlRG93blBvd2VyS2V5AhlEb3duIHZvdGUgcG93ZXIgbm90IGZvdW5kBA50b3RhbFZvdGVQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEXZvdGVUb3RhbFBvd2VyS2V5AhpUb3RhbCB2b3RlIHBvd2VyIG5vdCBmb3VuZAQMdm90ZVVzZWROZnRzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUPdm90ZVVzZWROZnRzS2V5AhlWb3RlIHVzZWQgcG93ZXIgbm90IGZvdW5kBA92b3RlclNwZW50UG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRJ2b3RlclNwZW50UG93ZXJLZXkCG1ZvdGVyIHNwZW50IHBvd2VyIG5vdCBmb3VuZAQNdm90ZXJVc2VkTmZ0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFFHZvdGVyVm90ZVVzZWROZnRzS2V5Ah5Wb3RlciB2b3RlIHVzZWQgbmZ0cyBub3QgZm91bmQEEXZvdGVyVm90ZVVzZWROZnRzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUUdm90ZXJWb3RlVXNlZE5mdHNLZXkCI1ZvdGVyIHZvdGUgdXNlZCBuZnRzIGxpc3Qgbm90IGZvdW5kBA90b3RhbFNwZW50UG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRJ0b3RhbFNwZW50UG93ZXJLZXkCG1RvdGFsIHNwZW50IHBvd2VyIG5vdCBmb3VuZAQTdm90ZXJWb3RlU3BlbnRQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFFnZvdGVyVm90ZVNwZW50UG93ZXJLZXkCIkFkZHJlc3Mgdm90ZSBzcGVudCBwb3dlciBub3QgZm91bmQEDGFkZHJlc3NQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFD2FkZHJlc3NQb3dlcktleQIUWW91IGRvbid0IGhhdmUgcG93ZXIEEWFkZHJlc3NTdGFrZWROZnRzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUUYWRkcmVzc1N0YWtlZE5mdHNLZXkCGllvdSBkb24ndCBoYXZlIHN0YWtlZCBORlRzBAphc3NldHNMaXN0AwkAZgIJALECAQUGYXNzZXRzAAAJALUJAgUGYXNzZXRzAgF8AwkAAAIJALECAQURdm90ZXJWb3RlVXNlZE5mdHMAAAUDbmlsCQC1CQIFEXZvdGVyVm90ZVVzZWROZnRzAgEsCgENcHJvY2Vzc0Fzc2V0cwIFYWNjdW0EbmV4dAQJYXNzZXRWb3RlCQELdmFsdWVPckVsc2UCCQCiCAEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAglfYXNzZXRJZF8FBG5leHQCAAQFcGFydHMJALUJAgUJYXNzZXRWb3RlAgE6BAR0eXBlCQCRAwIFBXBhcnRzAAAEBXBvd2VyCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUFcGFydHMAAQAABBBzdGFrZWRPd25lckluZGV4CQELdmFsdWVPckVsc2UCCQCzCQIFEWFkZHJlc3NTdGFrZWROZnRzBQRuZXh0AP///////////wEEEnZvdGVyVm90ZVVzZWRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIIBQVhY2N1bQJfNAUEbmV4dAIfVm90ZXIgdm90ZSB1c2VkIGluZGV4IG5vdCBmb3VuZAMJAAACCQCxAgEFCWFzc2V0Vm90ZQAABQVhY2N1bQMJAAACBQVwb3dlcgAACQACAQIXUG93ZXIgbXVzdCBiZSBtb3JlIHplcm8DAwkAZgIAAAUSdm90ZXJWb3RlVXNlZEluZGV4CQAAAgUQc3Rha2VkT3duZXJJbmRleAD///////////8BBwkAAgECHEFzc2V0IGRvZXMgbm90IGJlbG9uZyB0byB5b3UEDmFzc2V0VXNlZEluZGV4CQELdmFsdWVPckVsc2UCCQDPCAIIBQVhY2N1bQJfMwUEbmV4dAD///////////8BAwkAZwIFDmFzc2V0VXNlZEluZGV4AAADAwkBAiE9AgUEdHlwZQICdXAJAQIhPQIFBHR5cGUCBGRvd24HCQACAQIMSW52YWxpZCB0eXBlCQCXCgUJAGQCCAUFYWNjdW0CXzEDCQAAAgUEdHlwZQICdXAFBXBvd2VyAAAJAGQCCAUFYWNjdW0CXzIDCQAAAgUEdHlwZQIEZG93bgUFcG93ZXIAAAkA0QgCCAUFYWNjdW0CXzMFDmFzc2V0VXNlZEluZGV4CQDRCAIIBQVhY2N1bQJfNAUSdm90ZXJWb3RlVXNlZEluZGV4CQDNCAIIBQVhY2N1bQJfNQkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCCV9hc3NldElkXwUEbmV4dAUFYWNjdW0EEnByb2Nlc3NSZXN1bHRUdXBsZQoAAiRsBQphc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlwoFAAAAAAkAvQkCBQx2b3RlVXNlZE5mdHMCASwJAL0JAgURdm90ZXJWb3RlVXNlZE5mdHMCASwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcHJvY2Vzc0Fzc2V0cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEB3VwUG93ZXIIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzEECWRvd25Qb3dlcggFEnByb2Nlc3NSZXN1bHRUdXBsZQJfMgQKcG93ZXJWYWx1ZQkAZAIFB3VwUG93ZXIFCWRvd25Qb3dlcgMJAGYCBQpwb3dlclZhbHVlBQ92b3RlclNwZW50UG93ZXIJAAIBAiVQb3dlciB2YWx1ZSBleGNlZWRzIHZvdGVyIHNwZW50IHBvd2VyAwkAAAIFCnBvd2VyVmFsdWUAAAkAAgECGk5vdCBlbm91Z2ggcG93ZXIgdG8gdW52b3RlAwkAAAIJAJADAQgFEnByb2Nlc3NSZXN1bHRUdXBsZQJfNQAACQACAQIkU3RhdGUgZW50cmllcyBsaXN0IG11c3Qgbm90IGJlIGVtcHR5BAtxdW9ydW1MaW1pdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEXZvdGVQb3dlckxpbWl0S2V5AhpWb3RlIHBvd2VyIGxpbWl0IG5vdCBmb3VuZAQUdXBkYXRlQ2FuZGl0YXRlc0xpc3QDCQBmAgULcXVvcnVtTGltaXQJAGUCBQ50b3RhbFZvdGVQb3dlcgUKcG93ZXJWYWx1ZQkBGHJlbW92ZUl0ZW1Gcm9tU3RhdGVBcnJheQIFGGZpbmFsVm90aW5nQ2FuZGlkYXRlc0tleQUGdm90ZUlkBQNuaWwJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ2b3RlclNwZW50UG93ZXJLZXkJAGUCBQ92b3RlclNwZW50UG93ZXIFCnBvd2VyVmFsdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFEnRvdGFsU3BlbnRQb3dlcktleQkAZQIFD3RvdGFsU3BlbnRQb3dlcgUKcG93ZXJWYWx1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdm90ZVVwUG93ZXJLZXkJAGUCBQt1cFBvd2VyRGFwcAUHdXBQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUQdm90ZURvd25Qb3dlcktleQkAZQIFDWRvd25Qb3dlckRhcHAFCWRvd25Qb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgURdm90ZVRvdGFsUG93ZXJLZXkJAGUCBQ50b3RhbFZvdGVQb3dlcgUKcG93ZXJWYWx1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUWdm90ZXJWb3RlU3BlbnRQb3dlcktleQkAZQIFE3ZvdGVyVm90ZVNwZW50UG93ZXIFCnBvd2VyVmFsdWUJAMwIAgkBC1N0cmluZ0VudHJ5AgUUdm90ZXJWb3RlVXNlZE5mdHNLZXkJALsJAggFEnByb2Nlc3NSZXN1bHRUdXBsZQJfNAIBLAkAzAgCCQELU3RyaW5nRW50cnkCBQ92b3RlVXNlZE5mdHNLZXkJALsJAggFEnByb2Nlc3NSZXN1bHRUdXBsZQJfMwIBLAUDbmlsCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl81BRR1cGRhdGVDYW5kaXRhdGVzTGlzdAFpAQ1maWxsVHJlYXN1YXJ5AAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAgpObyBwYXltZW50AwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAJAAIBAhZQYXltZW50IG11c3QgYmUgbW9yZSAwAwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAULVVNEVEFzc2V0SWQJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUNUFVaWkxFQXNzZXRJZAcJAAIBAiFQYXltZW50IG11c3QgYmUgaW4gVVNEVCBvciBQdXp6bGUEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEB2Fzc2V0SWQJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQVZmluYWxWb3RpbmdDYW5kaWRhdGVzCQELdmFsdWVPckVsc2UCCQCiCAEFGGZpbmFsVm90aW5nQ2FuZGlkYXRlc0tleQIAAwkAAAIJALECAQUVZmluYWxWb3RpbmdDYW5kaWRhdGVzAAAJAAIBAhhDYW5kaXRhdGVzIGxpc3QgaXMgZW1wdHkKAQtwcm9jZXNzVm90ZQIFYWNjdW0EbmV4dAQGdm90ZUlkBQRuZXh0BA52b3RlVXBQb3dlcktleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCF91cFBvd2VyBBB2b3RlRG93blBvd2VyS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2Rvd25Qb3dlcgQRdm90ZVRvdGFsUG93ZXJLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgtfdG90YWxQb3dlcgQJdm90ZUV4aXN0BAckbWF0Y2gwCQCiCAEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkAZgIJALECAQUBcwAABwQLdm90ZVVwUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdm90ZVVwUG93ZXJLZXkAAAQNdm90ZURvd25Qb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRB2b3RlRG93blBvd2VyS2V5AAAEDnZvdGVUb3RhbFBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFEXZvdGVUb3RhbFBvd2VyS2V5AAAEC3F1b3J1bUxpbWl0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQURdm90ZVBvd2VyTGltaXRLZXkCGlZvdGUgcG93ZXIgbGltaXQgbm90IGZvdW5kAwkAAAIFDnZvdGVUb3RhbFBvd2VyAAAJAAIBAhNJbnZhbGlkIHRvdGFsIHBvd2VyAwkAZgIFC3F1b3J1bUxpbWl0BQ52b3RlVG90YWxQb3dlcgkAAgECFVBvd2VyIGxlc3MgdGhhbiBsaW1pdAMJAAACCQBkAgULdm90ZVVwUG93ZXIFDXZvdGVEb3duUG93ZXIAAAkAAgECFkludmFsaWQgdXAsIGRvd24gcG93ZXIDAwkBASEBBQl2b3RlRXhpc3QGCQEOaXNWb3RpbmdDbG9zZWQBBQZ2b3RlSWQJAJYKBAgFBWFjY3VtAl8xCAUFYWNjdW0CXzIIBQVhY2N1bQJfMwkBEXJlbW92ZUl0ZW1Gcm9tU3RyAggFBWFjY3VtAl80BQZ2b3RlSWQECXVwUGVyY2VudAkAawMFC3ZvdGVVcFBvd2VyAGQFDnZvdGVUb3RhbFBvd2VyBA5maW5hbFZvdGVTdGF0ZQMJAGYCBQl1cFBlcmNlbnQAMgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfY29uZmlybWVkBgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAglfcmVqZWN0ZWQGCQCWCgQJAGQCCAUFYWNjdW0CXzEFDnZvdGVUb3RhbFBvd2VyCQDNCAIIBQVhY2N1bQJfMgUGdm90ZUlkCQDNCAIIBQVhY2N1bQJfMwUOZmluYWxWb3RlU3RhdGUJARFyZW1vdmVJdGVtRnJvbVN0cgIIBQVhY2N1bQJfNAUGdm90ZUlkBBlmaW5hbFZvdGluZ0NhbmRpZGF0ZXNMaXN0CQC1CQIFFWZpbmFsVm90aW5nQ2FuZGlkYXRlcwIBLAQLcmVzdWx0VHVwbGUKAAIkbAUZZmluYWxWb3RpbmdDYW5kaWRhdGVzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAABQNuaWwFA25pbAUVZmluYWxWb3RpbmdDYW5kaWRhdGVzCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQtwcm9jZXNzVm90ZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQQYWxsRW5kVm90ZXNQb3dlcggFC3Jlc3VsdFR1cGxlAl8xBA5maW5hbFZvdGVzTGlzdAgFC3Jlc3VsdFR1cGxlAl8yBA9maW5hbFZvdGVzU3RhdGUIBQtyZXN1bHRUdXBsZQJfMwQddXBkYXRlZExpc3RGaW5hbENhbmRpdGF0ZXNTdHIIBQtyZXN1bHRUdXBsZQJfNAMJAAACBRBhbGxFbmRWb3Rlc1Bvd2VyAAAJAAIBAiFObyBwb3dlciBhZnRlciBwcm9jZXNzIGNhbmRpdGF0ZXMEE2N1cnJlbnRSZXdvcmRzUm91bmQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUWY3VycmVudFJld29yZHNSb3VuZEtleQAABAxjb3N0UGVyUG93ZXIJAGsDBQZhbW91bnQAAQUQYWxsRW5kVm90ZXNQb3dlcgQYdHJlYXN1YXJ5QXNzZXRJZFRvdGFsS2V5CQCsAgIJAKwCAgIKdHJlYXN1YXJ5XwkA2AQBBQdhc3NldElkAgZfdG90YWwEHHRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGVLZXkJAKwCAgkArAICAgp0cmVhc3VhcnlfCQDYBAEFB2Fzc2V0SWQCCl9hdmFpbGFibGUEFXRyZWFzdWFyeUFzc2V0SWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRh0cmVhc3VhcnlBc3NldElkVG90YWxLZXkAAAQZdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBRx0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlS2V5AAAJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIHcmV3YXJkXwkApAMBBRNjdXJyZW50UmV3b3Jkc1JvdW5kAglfdm90ZXNJZHMJALkJAgUOZmluYWxWb3Rlc0xpc3QCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICB3Jld2FyZF8JAKQDAQUTY3VycmVudFJld29yZHNSb3VuZAIIX2Fzc2V0SWQJANgEAQUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB3Jld2FyZF8JAKQDAQUTY3VycmVudFJld29yZHNSb3VuZAINX2Nvc3RQZXJQb3dlcgUMY29zdFBlclBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHcmV3YXJkXwkApAMBBRNjdXJyZW50UmV3b3Jkc1JvdW5kAgpfcGFpZFBvd2VyBRBhbGxFbmRWb3Rlc1Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRh0cmVhc3VhcnlBc3NldElkVG90YWxLZXkJAGQCBRV0cmVhc3VhcnlBc3NldElkVG90YWwFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUcdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZUtleQkAZAIFGXRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGUFBmFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCBRhmaW5hbFZvdGluZ0NhbmRpZGF0ZXNLZXkFHXVwZGF0ZWRMaXN0RmluYWxDYW5kaXRhdGVzU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZjdXJyZW50UmV3b3Jkc1JvdW5kS2V5CQBkAgUTY3VycmVudFJld29yZHNSb3VuZAABBQNuaWwFD2ZpbmFsVm90ZXNTdGF0ZQFpAQxjbGFpbVJld2FyZHMABAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQZYWRkZXJzc0xhc3RSZXdhcmRSb3VuZEtleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAhFfbGFzdFJld2FyZHNSb3VuZAQTY3VycmVudFJld29yZHNSb3VuZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRZjdXJyZW50UmV3b3Jkc1JvdW5kS2V5AAAEFmFkZGVyc3NMYXN0UmV3YXJkUm91bmQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUZYWRkZXJzc0xhc3RSZXdhcmRSb3VuZEtleQAAAwkAAAIFE2N1cnJlbnRSZXdvcmRzUm91bmQFFmFkZGVyc3NMYXN0UmV3YXJkUm91bmQJAAIBAhpUaGVyZSB3ZXJlIG5vIG5ldyBwYXltZW50cwoBEGNhbGNSZXdhcmRzUm91bmQCBWFjY3VtBG5leHQDCQBnAggFBWFjY3VtAl8xBRNjdXJyZW50UmV3b3Jkc1JvdW5kBQVhY2N1bQQIdm90ZXNJZHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIHcmV3YXJkXwkApAMBCAUFYWNjdW0CXzECCV92b3Rlc0lkcwIaUmV3YXJkIHZvdGVzIGlkcyBub3QgZm91bmQEB2Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIHcmV3YXJkXwkApAMBCAUFYWNjdW0CXzECCF9hc3NldElkAhhSZXdhcmQgYXNzZXRJZCBub3QgZm91bmQECWNvc3RQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgkArAICAgdyZXdhcmRfCQCkAwEIBQVhY2N1bQJfMQINX2Nvc3RQZXJQb3dlcgIbUmV3YXJkIGNvc3QgcG93ZXIgbm90IGZvdW5kBBp0cmVhc3VhcnlBc3NldElkQ2xhaW1lZEtleQkArAICCQCsAgICCnRyZWFzdWFyeV8FB2Fzc2V0SWQCCF9jbGFpbWVkBBx0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlS2V5CQCsAgIJAKwCAgIKdHJlYXN1YXJ5XwUHYXNzZXRJZAIKX2F2YWlsYWJsZQQXdHJlYXN1YXJ5QXNzZXRJZENsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUadHJlYXN1YXJ5QXNzZXRJZENsYWltZWRLZXkAAAQZdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFHHRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGVLZXkCG1RyZWFzdWFyeSBhc3NldElkIG5vdCBmb3VuZAQYYWRkcmVzc0Fzc2V0SWRDbGFpbWVkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgxyZXdhcmRSb3VuZF8JAKQDAQgFBWFjY3VtAl8xAglfYWRkcmVzc18FCmFkZHJlc3NTdHICCV9hc3NldElkXwUHYXNzZXRJZAIIX2NsYWltZWQEFWFkZHJlc3NBc3NldElkQ2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRhhZGRyZXNzQXNzZXRJZENsYWltZWRLZXkAAAMJAGcCAAAFGXRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGUJAAIBAhtUcmVhc3VhcnkgYXNzZXQgSWQgaXMgZW1wdHkDCQAAAgkAsQIBBQh2b3Rlc0lkcwAACQACAQIXVm90ZSBpZHMgbGlzdCBhcmUgZW1wdHkDCQAAAgkAsQIBBQdhc3NldElkAAAJAAIBAhFBc3NldCBpZCBpcyBlbXB0eQMDCQAAAgUJY29zdFBvd2VyAAAGCQBmAgAABQljb3N0UG93ZXIJAAIBAhJJbnZhbGlkIGNvc3QgcG93ZXIKARVjYWxjQWRkcmVzc1NwZW50UG93ZXICBWFjY3VtBG5leHQEBnZvdGVJZAUEbmV4dAQRYWRkcmVzc1NwZW50UG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAgtfc3BlbnRQb3dlcgAACQBkAgUFYWNjdW0FEWFkZHJlc3NTcGVudFBvd2VyBApzcGVudFBvd2VyCgACJGwJALUJAgUIdm90ZXNJZHMCASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBFWNhbGNBZGRyZXNzU3BlbnRQb3dlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMDCQBnAgAABQpzcGVudFBvd2VyBgkAZgIFFWFkZHJlc3NBc3NldElkQ2xhaW1lZAAACQCUCgIJAGQCCAUFYWNjdW0CXzEFBG5leHQIBQVhY2N1bQJfMgkAlAoCCQBkAggFBWFjY3VtAl8xBQRuZXh0CQDOCAIIBQVhY2N1bQJfMgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGgCBQpzcGVudFBvd2VyBQljb3N0UG93ZXIJANkEAQUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUYYWRkcmVzc0Fzc2V0SWRDbGFpbWVkS2V5CQBoAgUKc3BlbnRQb3dlcgUJY29zdFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRp0cmVhc3VhcnlBc3NldElkQ2xhaW1lZEtleQkAZAIFF3RyZWFzdWFyeUFzc2V0SWRDbGFpbWVkCQBoAgUKc3BlbnRQb3dlcgUJY29zdFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRx0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlS2V5CQBlAgUZdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZQkAaAIFCnNwZW50UG93ZXIFCWNvc3RQb3dlcgUDbmlsBAFyCgACJGwJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBRZhZGRlcnNzTGFzdFJld2FyZFJvdW5kBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNhbGNSZXdhcmRzUm91bmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFGWFkZGVyc3NMYXN0UmV3YXJkUm91bmRLZXkIBQFyAl8xBQNuaWwIBQFyAl8yAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleYnnAxI=", "height": 3563424, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8CRUEvBPUZLFACT4wiCFbGsWEo5KsiC6DvV1DA5ajtor Next: none Diff:
OldNewDifferences
66 let signArtIssuerAddress = Address(base58'3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV')
77
88 let USDTAssetId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
9+
10+let PUZZLEAssetId = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS'
911
1012 let totalStakedKey = "total_staked"
1113
429431 then throw("No payment")
430432 else if ((i.payments[0].amount == 0))
431433 then throw("Payment must be more 0")
432- else if ((i.payments[0].assetId != USDTAssetId))
433- then throw("Payment must be in USDT")
434+ else if (if ((i.payments[0].assetId != USDTAssetId))
435+ then (i.payments[0].assetId != PUZZLEAssetId)
436+ else false)
437+ then throw("Payment must be in USDT or Puzzle")
434438 else {
435439 let amount = i.payments[0].amount
436440 let assetId = value(i.payments[0].assetId)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let creationAddress = Address(base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By')
55
66 let signArtIssuerAddress = Address(base58'3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV')
77
88 let USDTAssetId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
9+
10+let PUZZLEAssetId = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS'
911
1012 let totalStakedKey = "total_staked"
1113
1214 let totalPowerKey = "total_power"
1315
1416 let totalSpentPowerKey = "total_spentPower"
1517
1618 let votePowerLimitKey = "VOTE_POWER_LIMIT"
1719
1820 let currentRewordsRoundKey = "current_rewords_round"
1921
2022 let finalVotingCandidatesKey = "final_voiting_candidates"
2123
2224 let allStakedAddressesKey = "all_staked_addresses"
2325
2426 let PuzzleDragonsSignArtIds = ["9iPLsYoz8fNyUp9qcgeAFPpMjKGcb4mNURhAZ7dfzXej", "2K847GdAcqaHHYn1dSS1F3NYriuquJKKzMoBES1cn4Mb", "7D1eCVeMbjHLpjYuqKZ96LoWPwD71quwuWpZxcuKnkJ7", "zjE5dwTv3AukQj6xMyddjcqA82bKvSNLeaKLhnFYKGf", "4T8QSrLLqUpHpi8SecSQT1p5tGo1CAskTGgYgUmXBYEb", "AjHkvxJpgxx8UAMmz6gvxjtBanGBHeEUaYxygdsTRcV6", "4jruFM1gvrtMHXiKdz2EKt12fHGjH5MT8YcZkF6KVGP7", "ZZ1cM8N3UC3uAdoCXJwTwkmpeTSFjpNB4GVa5UwYVGS", "6UAvojJpFxUjAoRFb3nhxCRUdGzFCvxCKniLtJqxVk77", "2NSvp5JX8YTNXWKXpE9kiZA22gg4DM2Yc7mcb9U6PkxB"]
2527
2628 func checkNFT (asset) = {
2729 let isPuzzleDragon = match indexOf(PuzzleDragonsSignArtIds, toBase58String(asset.id)) {
2830 case x: Int =>
2931 (x >= 0)
3032 case _ =>
3133 false
3234 }
3335 if (if (if (if (if (isPuzzleDragon)
3436 then true
3537 else (getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_issuer")) == toString(this)))
3638 then (asset.issuer == (if (isPuzzleDragon)
3739 then signArtIssuerAddress
3840 else creationAddress))
3941 else false)
4042 then (asset.decimals == 0)
4143 else false)
4244 then (asset.reissuable == false)
4345 else false)
4446 then (asset.quantity == 1)
4547 else false
4648 }
4749
4850
4951 func getPowerNFT (asset) = {
5052 let isPuzzleDragon = match indexOf(PuzzleDragonsSignArtIds, toBase58String(asset.id)) {
5153 case x: Int =>
5254 (x >= 0)
5355 case _ =>
5456 false
5557 }
5658 if (isPuzzleDragon)
5759 then 40
5860 else {
5961 let params = getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_params"))
6062 if ((params == "gold"))
6163 then 100
6264 else 40
6365 }
6466 }
6567
6668
6769 func isVotingClosed (voteId) = {
6870 let voteConfirmedKey = (("vote_" + voteId) + "_confirmed")
6971 let voteRejectedKey = (("vote_" + voteId) + "_rejected")
7072 let isConfirmed = valueOrElse(getBoolean(voteConfirmedKey), false)
7173 let isRejected = valueOrElse(getBoolean(voteRejectedKey), false)
7274 if (isConfirmed)
7375 then true
7476 else isRejected
7577 }
7678
7779
7880 func addStringToStateArray (dataKey,item) = {
7981 let allData = valueOrElse(getString(dataKey), "")
8082 if (!(isDefined(indexOf(allData, item))))
8183 then if ((size(allData) == 0))
8284 then [StringEntry(dataKey, item)]
8385 else [StringEntry(dataKey, makeString_11C((split_51C(allData, ",") :+ item), ","))]
8486 else nil
8587 }
8688
8789
8890 func removeItemFromStateArray (dataKey,item) = {
8991 let allData = valueOrErrorMessage(getString(dataKey), (("Data for key: '" + dataKey) + "' not found"))
9092 if (isDefined(indexOf(allData, item)))
9193 then {
9294 let dataList = split_51C(allData, ",")
9395 let itemIndex = value(indexOf(dataList, item))
9496 [StringEntry(dataKey, makeString_11C(removeByIndex(dataList, itemIndex), ","))]
9597 }
9698 else nil
9799 }
98100
99101
100102 func removeItemFromStr (str,item) = if (isDefined(indexOf(str, item)))
101103 then {
102104 let dataList = split_51C(str, ",")
103105 let itemIndex = value(indexOf(dataList, item))
104106 makeString_11C(removeByIndex(dataList, itemIndex), ",")
105107 }
106108 else str
107109
108110
109111 @Callable(i)
110112 func stake (debug) = {
111113 let addressStr = toString(i.caller)
112114 let p = if ((size(i.payments) > 0))
113115 then i.payments[0]
114116 else throw("Payments list is empty")
115117 let asset = valueOrErrorMessage(assetInfo(valueOrErrorMessage(p.assetId, "Invalid payment")), "Invalid asset Id")
116118 if (debug)
117119 then throw(((((("payments size " + toString(size(i.payments))) + " assetId ") + toBase58String(value(p.assetId))) + " amount ") + toString(p.amount)))
118120 else if (if ((p.amount > 0))
119121 then checkNFT(asset)
120122 else false)
121123 then {
122124 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
123125 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
124126 let addressPowerKey = (("address_" + addressStr) + "_power")
125127 let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
126128 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
127129 let addressPower = valueOrElse(getInteger(addressPowerKey), 0)
128130 let addressTotalStaked = valueOrElse(getInteger(addressTotalStakedKey), 0)
129131 let addressStakedNfts = valueOrElse(getString(addressStakedNftsKey), "")
130132 if (((addressTotalStaked + 1) > 5))
131133 then throw("You can stake only 5 NFTs")
132134 else {
133135 let nftPower = getPowerNFT(asset)
134136 let nftIdStr = toBase58String(asset.id)
135137 let addressStakedNftsState = if ((size(addressStakedNfts) == 0))
136138 then [StringEntry(addressStakedNftsKey, nftIdStr)]
137139 else [StringEntry(addressStakedNftsKey, makeString((split(addressStakedNfts, ",") :+ nftIdStr), ","))]
138140 (([IntegerEntry(totalStakedKey, (totalStaked + 1)), IntegerEntry(totalPowerKey, (totalPower + nftPower)), StringEntry((("nft_" + nftIdStr) + "_owner"), addressStr), IntegerEntry((("nft_" + nftIdStr) + "_power"), nftPower), IntegerEntry(addressPowerKey, (addressPower + nftPower)), IntegerEntry(addressTotalStakedKey, (addressTotalStaked + 1))] ++ addStringToStateArray(allStakedAddressesKey, addressStr)) ++ addressStakedNftsState)
139141 }
140142 }
141143 else throw("Invalid payment asset Id or amount")
142144 }
143145
144146
145147
146148 @Callable(i)
147149 func unstake (nftIdStr,debug) = {
148150 let addressStr = toString(i.caller)
149151 let asset = valueOrErrorMessage(assetInfo(fromBase58String(nftIdStr)), "Invalid nft Id")
150152 let ownerAddress = valueOrErrorMessage(getString((("nft_" + nftIdStr) + "_owner")), "Owner data invalid")
151153 if ((ownerAddress != addressStr))
152154 then throw("You are not the owner")
153155 else if (checkNFT(asset))
154156 then {
155157 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
156158 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
157159 let addressPowerKey = (("address_" + addressStr) + "_power")
158160 let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
159161 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
160162 let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "Address power value not found")
161163 let addressTotalStaked = valueOrErrorMessage(getInteger(addressTotalStakedKey), "Address total staked value not found")
162164 let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "Address staked Nfts value not found")
163165 let nftAssetIdStr = toBase58String(asset.id)
164166 let nftPower = getIntegerValue((("nft_" + nftAssetIdStr) + "_power"))
165167 let updatedAddressPower = (addressPower - nftPower)
166168 let removeStakedAddress = if ((updatedAddressPower == 0))
167169 then removeItemFromStateArray(allStakedAddressesKey, addressStr)
168170 else nil
169171 let addressStakedNftsList = split(addressStakedNfts, ",")
170172 let addressStakedNftIndex = valueOrErrorMessage(indexOf(addressStakedNftsList, nftIdStr), "NFT not founed in address staked list")
171173 ([ScriptTransfer(i.caller, 1, asset.id), IntegerEntry(totalStakedKey, (totalStaked - 1)), IntegerEntry(totalPowerKey, (totalPower - nftPower)), DeleteEntry((("nft_" + nftAssetIdStr) + "_owner")), DeleteEntry((("nft_" + nftAssetIdStr) + "_power")), IntegerEntry(addressPowerKey, updatedAddressPower), IntegerEntry(addressTotalStakedKey, (addressTotalStaked - 1)), StringEntry(addressStakedNftsKey, makeString(removeByIndex(addressStakedNftsList, addressStakedNftIndex), ","))] ++ removeStakedAddress)
172174 }
173175 else throw("Invalid nft Id")
174176 }
175177
176178
177179
178180 @Callable(i)
179181 func sendToVote (collectionId) = {
180182 let issuer = split(collectionId, "_")[0]
181183 let isExist = match getString((("collection_" + collectionId) + "_voteId")) {
182184 case t: String =>
183185 true
184186 case _ =>
185187 false
186188 }
187189 if ((size(issuer) == 0))
188190 then throw("Collection issuer not found")
189191 else if (isExist)
190192 then throw("Collection has already been submitted for voting")
191193 else if ((issuer != toString(i.caller)))
192194 then throw("Only the issuer can submit to the vote")
193195 else {
194196 let voteId = toBase58String(sha256_16Kb(toBytes(collectionId)))
195197 let totalVotes = valueOrElse(getInteger("total_votes"), 0)
196198 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
197199 [StringEntry((("collection_" + collectionId) + "_voteId"), voteId), StringEntry((("vote_" + voteId) + "_collectionId"), collectionId), StringEntry((("vote_" + voteId) + "_owner"), toString(i.caller)), IntegerEntry((("vote_" + voteId) + "_createdAt"), height), IntegerEntry((("vote_" + voteId) + "_quorum"), quorumLimit), IntegerEntry("total_votes", (totalVotes + 1))]
198200 }
199201 }
200202
201203
202204
203205 @Callable(i)
204206 func removeFromVote (voteId) = {
205207 let collectionId = valueOrErrorMessage(getString((("vote_" + voteId) + "_collectionId")), "Collection Id not found")
206208 let owner = valueOrErrorMessage(getString((("vote_" + voteId) + "_owner")), "Owner not found")
207209 if ((owner != toString(i.caller)))
208210 then throw("You are not the owner")
209211 else if (isVotingClosed(voteId))
210212 then throw("Voting is closed")
211213 else {
212214 let totalVotes = valueOrErrorMessage(getInteger("total_votes"), "total votes value not found")
213215 [DeleteEntry((("collection_" + collectionId) + "_voteId")), DeleteEntry((("vote_" + voteId) + "_collectionId")), DeleteEntry((("vote_" + voteId) + "_owner")), DeleteEntry((("vote_" + voteId) + "_createdAt")), DeleteEntry((("vote_" + voteId) + "_quorum")), IntegerEntry("total_votes", (totalVotes - 1))]
214216 }
215217 }
216218
217219
218220
219221 @Callable(i)
220222 func voteByNFT (voteId,assets) = {
221223 let addressStr = toString(i.caller)
222224 let collectionId = valueOrElse(getString((("vote_" + voteId) + "_collectionId")), "")
223225 if (isVotingClosed(voteId))
224226 then throw("Voting is closed")
225227 else if ((size(collectionId) == 0))
226228 then throw("Collection not found")
227229 else if ((size(assets) == 0))
228230 then throw("Assets list is empty")
229231 else {
230232 let voteUpPowerKey = (("vote_" + voteId) + "_upPower")
231233 let voteDownPowerKey = (("vote_" + voteId) + "_downPower")
232234 let voteTotalPowerKey = (("vote_" + voteId) + "_totalPower")
233235 let voteUsedNftsKey = (("vote_" + voteId) + "_usedNfts")
234236 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
235237 let voterVoteUsedNftsKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_usedNfts")
236238 let voterVoteSpentPowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_spentPower")
237239 let addressPowerKey = (("address_" + addressStr) + "_power")
238240 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
239241 let upPowerDapp = valueOrElse(getInteger(voteUpPowerKey), 0)
240242 let downPowerDapp = valueOrElse(getInteger(voteDownPowerKey), 0)
241243 let totalVotePower = valueOrElse(getInteger(voteTotalPowerKey), 0)
242244 let voteUsedNfts = valueOrElse(getString(voteUsedNftsKey), "")
243245 let voterSpentPower = valueOrElse(getInteger(voterSpentPowerKey), 0)
244246 let voterVoteUsedNfts = valueOrElse(getString(voterVoteUsedNftsKey), "")
245247 let totalSpentPower = valueOrElse(getInteger(totalSpentPowerKey), 0)
246248 let voterVoteSpentPower = valueOrElse(getInteger(voterVoteSpentPowerKey), 0)
247249 let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "You don't have power")
248250 let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "You don't have staked NFTs")
249251 let adderssLastRewardRoundKey = (("address_" + addressStr) + "_lastRewardsRound")
250252 let currentRewordsRound = valueOrElse(getInteger(currentRewordsRoundKey), 0)
251253 let adderssLastRewardRound = valueOrElse(getInteger(adderssLastRewardRoundKey), 0)
252254 let assetsList = split(assets, "|")
253255 let voteUsedNftsList = if ((size(voteUsedNfts) == 0))
254256 then nil
255257 else split_51C(voteUsedNfts, ",")
256258 let voterVoteUsedNftsList = if ((size(voterVoteUsedNfts) == 0))
257259 then nil
258260 else split_51C(voterVoteUsedNfts, ",")
259261 func processAssets (accum,next) = {
260262 let parts = split(next, "_")
261263 let nftId = parts[0]
262264 let type = parts[1]
263265 let power = valueOrErrorMessage(getInteger((("nft_" + nftId) + "_power")), "NFT power not found")
264266 let stakedOwnerIndex = valueOrElse(indexOf(addressStakedNfts, nftId), -1)
265267 if ((power == 0))
266268 then throw("Power must be more zero")
267269 else if ((stakedOwnerIndex == -1))
268270 then throw("Asset does not belong to you")
269271 else {
270272 let assetIndex = valueOrElse(indexOf(voteUsedNftsList, nftId), -1)
271273 if ((assetIndex == -1))
272274 then if (if ((type != "up"))
273275 then (type != "down")
274276 else false)
275277 then throw("Invalid type")
276278 else $Tuple4((accum._1 + (if ((type == "up"))
277279 then power
278280 else 0)), (accum._2 + (if ((type == "down"))
279281 then power
280282 else 0)), (accum._3 :+ nftId), (accum._4 :+ StringEntry(((((("voter_" + addressStr) + "_vote_") + voteId) + "_assetId_") + nftId), ((((type + ":") + toString(power)) + ":") + toString(height)))))
281283 else accum
282284 }
283285 }
284286
285287 let processResultTuple = {
286288 let $l = assetsList
287289 let $s = size($l)
288290 let $acc0 = $Tuple4(0, 0, nil, nil)
289291 func $f0_1 ($a,$i) = if (($i >= $s))
290292 then $a
291293 else processAssets($a, $l[$i])
292294
293295 func $f0_2 ($a,$i) = if (($i >= $s))
294296 then $a
295297 else throw("List size exceeds 5")
296298
297299 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
298300 }
299301 let upPower = processResultTuple._1
300302 let downPower = processResultTuple._2
301303 let powerValue = (upPower + downPower)
302304 if ((powerValue > addressPower))
303305 then throw("Power exceeds power of the account")
304306 else if ((powerValue == 0))
305307 then throw("Not enough power to vote")
306308 else if ((size(processResultTuple._3) == 0))
307309 then throw("Used list must not be empty")
308310 else if ((size(processResultTuple._4) == 0))
309311 then throw("State entries list must not be empty")
310312 else {
311313 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
312314 let updateCanditatesList = if (((totalVotePower + powerValue) > quorumLimit))
313315 then addStringToStateArray(finalVotingCandidatesKey, voteId)
314316 else nil
315317 let addressRewordsRoundState = if (if ((adderssLastRewardRound == 0))
316318 then (currentRewordsRound > adderssLastRewardRound)
317319 else false)
318320 then [IntegerEntry(adderssLastRewardRoundKey, currentRewordsRound)]
319321 else nil
320322 ((([IntegerEntry(voterSpentPowerKey, (voterSpentPower + powerValue)), IntegerEntry(totalSpentPowerKey, (totalSpentPower + powerValue)), IntegerEntry(voteUpPowerKey, (upPowerDapp + upPower)), IntegerEntry(voteDownPowerKey, (downPowerDapp + downPower)), IntegerEntry(voteTotalPowerKey, (totalVotePower + powerValue)), IntegerEntry(voterVoteSpentPowerKey, (voterVoteSpentPower + powerValue)), StringEntry(voterVoteUsedNftsKey, makeString_11C((voterVoteUsedNftsList ++ processResultTuple._3), ",")), StringEntry(voteUsedNftsKey, makeString_11C((voteUsedNftsList ++ processResultTuple._3), ","))] ++ processResultTuple._4) ++ updateCanditatesList) ++ addressRewordsRoundState)
321323 }
322324 }
323325 }
324326
325327
326328
327329 @Callable(i)
328330 func unvoteByNFT (voteId,assets) = {
329331 let addressStr = toString(i.caller)
330332 let collectionId = valueOrElse(getString((("vote_" + voteId) + "_collectionId")), "")
331333 if (isVotingClosed(voteId))
332334 then throw("Voting is closed")
333335 else if ((size(collectionId) == 0))
334336 then throw("Collection not found")
335337 else {
336338 let voteUpPowerKey = (("vote_" + voteId) + "_upPower")
337339 let voteDownPowerKey = (("vote_" + voteId) + "_downPower")
338340 let voteTotalPowerKey = (("vote_" + voteId) + "_totalPower")
339341 let voteUsedNftsKey = (("vote_" + voteId) + "_usedNfts")
340342 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
341343 let voterVoteUsedNftsKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_usedNfts")
342344 let voterVoteSpentPowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_spentPower")
343345 let addressPowerKey = (("address_" + addressStr) + "_power")
344346 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
345347 let upPowerDapp = valueOrErrorMessage(getInteger(voteUpPowerKey), "Up vote power not found")
346348 let downPowerDapp = valueOrErrorMessage(getInteger(voteDownPowerKey), "Down vote power not found")
347349 let totalVotePower = valueOrErrorMessage(getInteger(voteTotalPowerKey), "Total vote power not found")
348350 let voteUsedNfts = valueOrErrorMessage(getString(voteUsedNftsKey), "Vote used power not found")
349351 let voterSpentPower = valueOrErrorMessage(getInteger(voterSpentPowerKey), "Voter spent power not found")
350352 let voterUsedNfts = valueOrErrorMessage(getInteger(voterVoteUsedNftsKey), "Voter vote used nfts not found")
351353 let voterVoteUsedNfts = valueOrErrorMessage(getString(voterVoteUsedNftsKey), "Voter vote used nfts list not found")
352354 let totalSpentPower = valueOrErrorMessage(getInteger(totalSpentPowerKey), "Total spent power not found")
353355 let voterVoteSpentPower = valueOrErrorMessage(getInteger(voterVoteSpentPowerKey), "Address vote spent power not found")
354356 let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "You don't have power")
355357 let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "You don't have staked NFTs")
356358 let assetsList = if ((size(assets) > 0))
357359 then split(assets, "|")
358360 else if ((size(voterVoteUsedNfts) == 0))
359361 then nil
360362 else split(voterVoteUsedNfts, ",")
361363 func processAssets (accum,next) = {
362364 let assetVote = valueOrElse(getString(((((("voter_" + addressStr) + "_vote_") + voteId) + "_assetId_") + next)), "")
363365 let parts = split(assetVote, ":")
364366 let type = parts[0]
365367 let power = valueOrElse(parseInt(parts[1]), 0)
366368 let stakedOwnerIndex = valueOrElse(indexOf(addressStakedNfts, next), -1)
367369 let voterVoteUsedIndex = valueOrErrorMessage(indexOf(accum._4, next), "Voter vote used index not found")
368370 if ((size(assetVote) == 0))
369371 then accum
370372 else if ((power == 0))
371373 then throw("Power must be more zero")
372374 else if (if ((0 > voterVoteUsedIndex))
373375 then (stakedOwnerIndex == -1)
374376 else false)
375377 then throw("Asset does not belong to you")
376378 else {
377379 let assetUsedIndex = valueOrElse(indexOf(accum._3, next), -1)
378380 if ((assetUsedIndex >= 0))
379381 then if (if ((type != "up"))
380382 then (type != "down")
381383 else false)
382384 then throw("Invalid type")
383385 else $Tuple5((accum._1 + (if ((type == "up"))
384386 then power
385387 else 0)), (accum._2 + (if ((type == "down"))
386388 then power
387389 else 0)), removeByIndex(accum._3, assetUsedIndex), removeByIndex(accum._4, voterVoteUsedIndex), (accum._5 :+ DeleteEntry(((((("voter_" + addressStr) + "_vote_") + voteId) + "_assetId_") + next))))
388390 else accum
389391 }
390392 }
391393
392394 let processResultTuple = {
393395 let $l = assetsList
394396 let $s = size($l)
395397 let $acc0 = $Tuple5(0, 0, split_51C(voteUsedNfts, ","), split_51C(voterVoteUsedNfts, ","), nil)
396398 func $f0_1 ($a,$i) = if (($i >= $s))
397399 then $a
398400 else processAssets($a, $l[$i])
399401
400402 func $f0_2 ($a,$i) = if (($i >= $s))
401403 then $a
402404 else throw("List size exceeds 5")
403405
404406 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
405407 }
406408 let upPower = processResultTuple._1
407409 let downPower = processResultTuple._2
408410 let powerValue = (upPower + downPower)
409411 if ((powerValue > voterSpentPower))
410412 then throw("Power value exceeds voter spent power")
411413 else if ((powerValue == 0))
412414 then throw("Not enough power to unvote")
413415 else if ((size(processResultTuple._5) == 0))
414416 then throw("State entries list must not be empty")
415417 else {
416418 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
417419 let updateCanditatesList = if ((quorumLimit > (totalVotePower - powerValue)))
418420 then removeItemFromStateArray(finalVotingCandidatesKey, voteId)
419421 else nil
420422 (([IntegerEntry(voterSpentPowerKey, (voterSpentPower - powerValue)), IntegerEntry(totalSpentPowerKey, (totalSpentPower - powerValue)), IntegerEntry(voteUpPowerKey, (upPowerDapp - upPower)), IntegerEntry(voteDownPowerKey, (downPowerDapp - downPower)), IntegerEntry(voteTotalPowerKey, (totalVotePower - powerValue)), IntegerEntry(voterVoteSpentPowerKey, (voterVoteSpentPower - powerValue)), StringEntry(voterVoteUsedNftsKey, makeString_11C(processResultTuple._4, ",")), StringEntry(voteUsedNftsKey, makeString_11C(processResultTuple._3, ","))] ++ processResultTuple._5) ++ updateCanditatesList)
421423 }
422424 }
423425 }
424426
425427
426428
427429 @Callable(i)
428430 func fillTreasuary () = if ((size(i.payments) == 0))
429431 then throw("No payment")
430432 else if ((i.payments[0].amount == 0))
431433 then throw("Payment must be more 0")
432- else if ((i.payments[0].assetId != USDTAssetId))
433- then throw("Payment must be in USDT")
434+ else if (if ((i.payments[0].assetId != USDTAssetId))
435+ then (i.payments[0].assetId != PUZZLEAssetId)
436+ else false)
437+ then throw("Payment must be in USDT or Puzzle")
434438 else {
435439 let amount = i.payments[0].amount
436440 let assetId = value(i.payments[0].assetId)
437441 let finalVotingCandidates = valueOrElse(getString(finalVotingCandidatesKey), "")
438442 if ((size(finalVotingCandidates) == 0))
439443 then throw("Canditates list is empty")
440444 else {
441445 func processVote (accum,next) = {
442446 let voteId = next
443447 let voteUpPowerKey = (("vote_" + voteId) + "_upPower")
444448 let voteDownPowerKey = (("vote_" + voteId) + "_downPower")
445449 let voteTotalPowerKey = (("vote_" + voteId) + "_totalPower")
446450 let voteExist = match getString((("vote_" + voteId) + "_collectionId")) {
447451 case s: String =>
448452 (size(s) > 0)
449453 case _ =>
450454 false
451455 }
452456 let voteUpPower = valueOrElse(getInteger(voteUpPowerKey), 0)
453457 let voteDownPower = valueOrElse(getInteger(voteDownPowerKey), 0)
454458 let voteTotalPower = valueOrElse(getInteger(voteTotalPowerKey), 0)
455459 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
456460 if ((voteTotalPower == 0))
457461 then throw("Invalid total power")
458462 else if ((quorumLimit > voteTotalPower))
459463 then throw("Power less than limit")
460464 else if (((voteUpPower + voteDownPower) == 0))
461465 then throw("Invalid up, down power")
462466 else if (if (!(voteExist))
463467 then true
464468 else isVotingClosed(voteId))
465469 then $Tuple4(accum._1, accum._2, accum._3, removeItemFromStr(accum._4, voteId))
466470 else {
467471 let upPercent = fraction(voteUpPower, 100, voteTotalPower)
468472 let finalVoteState = if ((upPercent > 50))
469473 then BooleanEntry((("vote_" + voteId) + "_confirmed"), true)
470474 else BooleanEntry((("vote_" + voteId) + "_rejected"), true)
471475 $Tuple4((accum._1 + voteTotalPower), (accum._2 :+ voteId), (accum._3 :+ finalVoteState), removeItemFromStr(accum._4, voteId))
472476 }
473477 }
474478
475479 let finalVotingCandidatesList = split(finalVotingCandidates, ",")
476480 let resultTuple = {
477481 let $l = finalVotingCandidatesList
478482 let $s = size($l)
479483 let $acc0 = $Tuple4(0, nil, nil, finalVotingCandidates)
480484 func $f0_1 ($a,$i) = if (($i >= $s))
481485 then $a
482486 else processVote($a, $l[$i])
483487
484488 func $f0_2 ($a,$i) = if (($i >= $s))
485489 then $a
486490 else throw("List size exceeds 10")
487491
488492 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
489493 }
490494 let allEndVotesPower = resultTuple._1
491495 let finalVotesList = resultTuple._2
492496 let finalVotesState = resultTuple._3
493497 let updatedListFinalCanditatesStr = resultTuple._4
494498 if ((allEndVotesPower == 0))
495499 then throw("No power after process canditates")
496500 else {
497501 let currentRewordsRound = valueOrElse(getInteger(currentRewordsRoundKey), 0)
498502 let costPerPower = fraction(amount, 1, allEndVotesPower)
499503 let treasuaryAssetIdTotalKey = (("treasuary_" + toBase58String(assetId)) + "_total")
500504 let treasuaryAssetIdAvailableKey = (("treasuary_" + toBase58String(assetId)) + "_available")
501505 let treasuaryAssetIdTotal = valueOrElse(getInteger(treasuaryAssetIdTotalKey), 0)
502506 let treasuaryAssetIdAvailable = valueOrElse(getInteger(treasuaryAssetIdAvailableKey), 0)
503507 ([StringEntry((("reward_" + toString(currentRewordsRound)) + "_votesIds"), makeString(finalVotesList, ",")), StringEntry((("reward_" + toString(currentRewordsRound)) + "_assetId"), toBase58String(assetId)), IntegerEntry((("reward_" + toString(currentRewordsRound)) + "_costPerPower"), costPerPower), IntegerEntry((("reward_" + toString(currentRewordsRound)) + "_paidPower"), allEndVotesPower), IntegerEntry(treasuaryAssetIdTotalKey, (treasuaryAssetIdTotal + amount)), IntegerEntry(treasuaryAssetIdAvailableKey, (treasuaryAssetIdAvailable + amount)), StringEntry(finalVotingCandidatesKey, updatedListFinalCanditatesStr), IntegerEntry(currentRewordsRoundKey, (currentRewordsRound + 1))] ++ finalVotesState)
504508 }
505509 }
506510 }
507511
508512
509513
510514 @Callable(i)
511515 func claimRewards () = {
512516 let addressStr = toString(i.caller)
513517 let adderssLastRewardRoundKey = (("address_" + addressStr) + "_lastRewardsRound")
514518 let currentRewordsRound = valueOrElse(getInteger(currentRewordsRoundKey), 0)
515519 let adderssLastRewardRound = valueOrElse(getInteger(adderssLastRewardRoundKey), 0)
516520 if ((currentRewordsRound == adderssLastRewardRound))
517521 then throw("There were no new payments")
518522 else {
519523 func calcRewardsRound (accum,next) = if ((accum._1 >= currentRewordsRound))
520524 then accum
521525 else {
522526 let votesIds = valueOrErrorMessage(getString((("reward_" + toString(accum._1)) + "_votesIds")), "Reward votes ids not found")
523527 let assetId = valueOrErrorMessage(getString((("reward_" + toString(accum._1)) + "_assetId")), "Reward assetId not found")
524528 let costPower = valueOrErrorMessage(getInteger((("reward_" + toString(accum._1)) + "_costPerPower")), "Reward cost power not found")
525529 let treasuaryAssetIdClaimedKey = (("treasuary_" + assetId) + "_claimed")
526530 let treasuaryAssetIdAvailableKey = (("treasuary_" + assetId) + "_available")
527531 let treasuaryAssetIdClaimed = valueOrElse(getInteger(treasuaryAssetIdClaimedKey), 0)
528532 let treasuaryAssetIdAvailable = valueOrErrorMessage(getInteger(treasuaryAssetIdAvailableKey), "Treasuary assetId not found")
529533 let addressAssetIdClaimedKey = (((((("rewardRound_" + toString(accum._1)) + "_address_") + addressStr) + "_assetId_") + assetId) + "_claimed")
530534 let addressAssetIdClaimed = valueOrElse(getInteger(addressAssetIdClaimedKey), 0)
531535 if ((0 >= treasuaryAssetIdAvailable))
532536 then throw("Treasuary asset Id is empty")
533537 else if ((size(votesIds) == 0))
534538 then throw("Vote ids list are empty")
535539 else if ((size(assetId) == 0))
536540 then throw("Asset id is empty")
537541 else if (if ((costPower == 0))
538542 then true
539543 else (0 > costPower))
540544 then throw("Invalid cost power")
541545 else {
542546 func calcAddressSpentPower (accum,next) = {
543547 let voteId = next
544548 let addressSpentPower = valueOrElse(getInteger((((("voter_" + addressStr) + "_vote_") + voteId) + "_spentPower")), 0)
545549 (accum + addressSpentPower)
546550 }
547551
548552 let spentPower = {
549553 let $l = split(votesIds, ",")
550554 let $s = size($l)
551555 let $acc0 = 0
552556 func $f0_1 ($a,$i) = if (($i >= $s))
553557 then $a
554558 else calcAddressSpentPower($a, $l[$i])
555559
556560 func $f0_2 ($a,$i) = if (($i >= $s))
557561 then $a
558562 else throw("List size exceeds 10")
559563
560564 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
561565 }
562566 if (if ((0 >= spentPower))
563567 then true
564568 else (addressAssetIdClaimed > 0))
565569 then $Tuple2((accum._1 + next), accum._2)
566570 else $Tuple2((accum._1 + next), (accum._2 ++ [ScriptTransfer(i.caller, (spentPower * costPower), fromBase58String(assetId)), IntegerEntry(addressAssetIdClaimedKey, (spentPower * costPower)), IntegerEntry(treasuaryAssetIdClaimedKey, (treasuaryAssetIdClaimed + (spentPower * costPower))), IntegerEntry(treasuaryAssetIdAvailableKey, (treasuaryAssetIdAvailable - (spentPower * costPower)))]))
567571 }
568572 }
569573
570574 let r = {
571575 let $l = [1, 1, 1, 1, 1]
572576 let $s = size($l)
573577 let $acc0 = $Tuple2(adderssLastRewardRound, nil)
574578 func $f0_1 ($a,$i) = if (($i >= $s))
575579 then $a
576580 else calcRewardsRound($a, $l[$i])
577581
578582 func $f0_2 ($a,$i) = if (($i >= $s))
579583 then $a
580584 else throw("List size exceeds 5")
581585
582586 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
583587 }
584588 ([IntegerEntry(adderssLastRewardRoundKey, r._1)] ++ r._2)
585589 }
586590 }
587591
588592
589593 @Verifier(tx)
590594 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
591595

github/deemru/w8io/3ef1775 
72.54 ms