tx · 2JDR8bGKCEusjNJXAdbsbmjLPUXmVRiKHsCpv13E7o8w

3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1:  -0.05000000 Waves

2023.08.23 13:21 [2723154] smart account 3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1 > SELF 0.00000000 Waves

{ "type": 13, "id": "2JDR8bGKCEusjNJXAdbsbmjLPUXmVRiKHsCpv13E7o8w", "fee": 5000000, "feeAssetId": null, "timestamp": 1692785990030, "version": 2, "chainId": 84, "sender": "3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1", "senderPublicKey": "Cm1uVVKocYw3S4eL9bYUMNZe5vpBPipgiiTx37eL6E8F", "proofs": [ "67R9zDTb8bvAR2t4aKuofEY29XsVHzwsN9BK39wEoBaVYuLRGxPjnAUtGu76gF1Lpuu5i1bgyQXN3dpKm2MMJZLH", "45HHfF8japVz9PWNYYGCkixhmTMy4xiffgTXmQdt72nanwHXzY6NhnQgzzz98VYCaWveky8HErALz6DcL355suvn" ], "script": "base64:BgJQCAISBAoCAQgSAwoBCBIUChIIAQEIAQEBAQEBAQEYBAEBBBgSBAoCAQgSBAoCAQgSBAoCAQgSBQoDAQEIEgMKAQESAwoBARIECgIBARIAEgBOAAlrZXlBY3RpdmUCBmFjdGl2ZQALa0FjdGl2ZUdsb2ICFGFjdGl2ZV9hbGxfY29udHJhY3RzAA9rZXlBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA9rZXlBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA9rZXlBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zACFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMCIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwASa2V5TGF1bmNocGFkTmV4dElkAhFsYXVuY2hwYWRfbmV4dF9pZAAUa2V5TGF1bmNocGFkQWN0aXZlSWQCE2xhdW5jaHBhZF9hY3RpdmVfaWQADWtleUluaXRDYWxsZXICC2luaXRfY2FsbGVyAAprZXlBZGRyZXNzAghfYWRkcmVzcwANa2V5SW5pdEhlaWdodAIMX2luaXRfaGVpZ2h0AA5rZXlTdGFydEhlaWdodAINX3N0YXJ0X2hlaWdodAARa2V5RmluYWxpc2VIZWlnaHQCEF9maW5hbGlzZV9oZWlnaHQADGtleUNvbWlzc2lvbgIKX2NvbWlzc2lvbgAKa2V5QXNzZXRJZAIJX2Fzc2V0X2lkABNrZXlUb3RhbFRva2VuQW1vdW50AhNfdG90YWxfdG9rZW5fYW1vdW50ABprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZAIVX3RvdGFsX2J1eV9hc3NldF9zb2xkABJrZXlUb2tlbnNQZXJUaWNrZXQCEl90b2tlbnNfcGVyX3RpY2tldAAQa2V5UHJpY2VQZXJUb2tlbgIQX3ByaWNlX3Blcl90b2tlbgAQa2V5U3dvcFBlclRpY2tldAIQX3N3b3BfcGVyX3RpY2tldAAWa2V5U3dvcGZpVGlja2V0c0Ftb3VudAIXX3RpY2tldHNfc3dvcGZpX21lbWJlcnMAF2tleUNhbXBhaWduVG9rZW5zQW1vdW50AhNfdG9rZW5zX2FjY2Vzc19saXN0ABZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uAhZfdG9rZW5zX3Blcl9hbGxvY2F0aW9uABNrZXlUaWNrZXRMYXN0TnVtYmVyAhNfdGlja2V0X2xhc3RfbnVtYmVyABNrZXlHb3Zlcm5hbmNlU3Rha2VkAg1fR1N3b3BfYW1vdW50AAxrZXlVc2VyUmVmSWQCB19yZWZfaWQADWtleVZlcmlmeUhhc2gCDF92ZXJpZnlfaGFzaAALa2V5RHVyYXRpb24CCV9kdXJhdGlvbgAca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwInX3RvdGFsX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nACVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkAjFfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmdfZmluYWxpemVkABNrZXlUcmFuc2ZlckJ1eUFzc2V0AhNfdHJhbnNmZXJfYnV5X2Fzc2V0ABRrZXlGcmVlelN3b3BEdXJhdGlvbgIVX2ZyZWV6ZV9zd29wX2R1cmF0aW9uABhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4CGF9mcmVlemVfYWRkaXRpb25hbF90b2tlbgAQa2V5RnJlZXplVG9rZW5JZAIQX2ZyZWV6ZV90b2tlbl9pZAAWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgIWX2ZyZWV6ZV90b2tlbl9kdXJhdGlvbgAXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQCGF9mcmVlemVfdG9rZW5fcGVyX3RpY2tldAALa2V5QnV5VG9rZW4CCl9idXlfdG9rZW4ADmtleUNsYWltUGFyYW1zAg1fY2xhaW1fcGFyYW1zABtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24CG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAWa2V5SGlnaENvbXBldGl0aW9uU2FsZQIWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAVa2V5SENUaWNrZXRMYXN0TnVtYmVyAiRfaGlnaF9jb21wZXRpdGlvbl90aWNrZXRfbGFzdF9udW1iZXIAGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAIZX3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwImX3RvdGFsX2J1eV9hc3NldF9zb2xkX2hpZ2hfY29tcGV0aXRpb24AFGtleVVzZXJDbGFpbWVkVG9rZW5zAg9fY2xhaW1lZF90b2tlbnMAF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zAhNfY2xhaW1lZF9idXlfdG9rZW5zABprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAIPX2JvdWdodF90aWNrZXRzAA5rZXlVc2VyVGlja2V0cwIPX3RpY2tldHNfbnVtYmVyABBrZXlVc2VySENUaWNrZXRzAiBfdGlja2V0c19udW1iZXJfaGlnaF9jb21wZXRpdGlvbgAca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAIgX2JvdWdodF90aWNrZXRzX2hpZ2hfY29tcGV0aXRpb24AG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwIdX2F2YWlsYWJsZV9wdXJjaGFzZV9tYXJrZXRpbmcAIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAiFfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwITX2JvdWdodF9hbGxvY2F0aW9ucwASa2V5VXNlckNsYWltU3RhdHVzAg1fY2xhaW1fc3RhdHVzABprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudAIPX3RpY2tldHNfcmVzdWx0AClrZXlVc2VyV2lubmVkSGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAIgX3RpY2tldHNfcmVzdWx0X2hpZ2hfY29tcGV0aXRpb24AEmtleVVzZXJGcmVlemVUb2tlbgIUX2ZyZWV6ZV90b2tlbl9hbW91bnQABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQAKZ292ZXJuYW5jZQkBB0FkZHJlc3MBARoBVMjcuWCotbWVPLfydaKVHLjfUPyH4RW0IgAQY29tbWlzc2lvbldhbGxldAkBB0FkZHJlc3MBARoBVIu67/x0Qcp5qolR7D86Zc0NPlB1AJuHDgASc3Rha2luZ1VTRE5BZGRyZXNzCQEHQWRkcmVzcwEBGgFUyzDUI2tI0RnhEQqOmg6HEPqnSokkZ5v9AARVU0ROASA0ARNWjmBG4n5bqbgBR4LnsQAmEpt25E5LoqB8nG3ugQASYWRtaW5QdWJLZXlTdGFraW5nASAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAMV0FWRVNfWFROX0VYCQEHQWRkcmVzcwEBGgFUE+06HqYmRCC3D4wq0lzrbsHxoPvs0AmgABRtYXhBbGxvY2F0aW9uc0Ftb3VudAACABFhY3RpdmVMYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUUa2V5TGF1bmNocGFkQWN0aXZlSWQA////////////AQELZ2V0QWRtaW5QdWIBC2tleUFkbWluUHViBAckbWF0Y2gwCQCdCAIFBm9yYWNsZQULa2V5QWRtaW5QdWIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQIZQWRtaW4gcHVibGljIGtleSBpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQELZ2V0QWRtaW5QdWIBBQ9rZXlBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBC2dldEFkbWluUHViAQUPa2V5QWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJAQtnZXRBZG1pblB1YgEFD2tleUFkbWluUHViS2V5MwEMZ2V0QXNzZXRJbmZvAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwBAhzdHJpbmdJZAkA2AQBBQJpZAQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmlkCQCsAgIJAKwCAgIGQXNzZXQgBQhzdHJpbmdJZAIOIGRvZXNuJ3QgZXhpc3QJAJUKAwUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCQCVCgMCBVdBVkVTAgVXQVZFUwAICQACAQILTWF0Y2ggZXJyb3IBEmdldExhdW5jaHBhZE5leHRJZAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5TGF1bmNocGFkTmV4dElkAAEBEHN0YWtlZFVzZG5BbW91bnQACQELdmFsdWVPckVsc2UCCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFBFVTRE4CAV8JAKUIAQUEdGhpcwAAAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUJa2V5QWN0aXZlBgAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHICBVdBVkVTCQCWCgQFBHVuaXQCBVdBVkVTAgVXQVZFUwAIBAhzdHJpbmdJZAUIYXNzZXRTdHIEAmlkCQDZBAEFCGFzc2V0U3RyBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCaWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlgoEBQJpZAUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAQpidXlJbldhdmVzAwtsYXVuY2hwYWRJZA10aWNrZXRzQW1vdW50BHR5cGUECyR0MDUxNTk1MzA5CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFCyR0MDUxNTk1MzA5Al8xBA1idXlBc3NldFN0cklkCAULJHQwNTE1OTUzMDkCXzIEDGJ1eUFzc2V0TmFtZQgFCyR0MDUxNTk1MzA5Al8zBBBidXlBc3NldERlY2ltYWxzCAULJHQwNTE1OTUzMDkCXzQECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQLJHQwNTQ5MTU2MzUJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAULJHQwNTQ5MTU2MzUCXzEED3Rva2VuU3RyQXNzZXRJZAgFCyR0MDU0OTE1NjM1Al8yBA50b2tlbkFzc2V0TmFtZQgFCyR0MDU0OTE1NjM1Al8zBA10b2tlbkRlY2ltYWxzCAULJHQwNTQ5MTU2MzUCXzQEC3RpY2tldFByaWNlCQBrAwUPdG9rZW5zUGVyVGlja2V0BQp0b2tlblByaWNlCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOBBNjb21taXNzaW9uUGVyVGlja2V0AwkAAAIFBHR5cGUAAQkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkCQBrAwULdGlja2V0UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAGQEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQgKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VQYXlSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwkAzAgCBQpidXlBc3NldElkBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACDShJbnQsIFN0cmluZykFAUAJAAIBCQCsAgIJAAMBBQFAAiIgY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBTdHJpbmcpAl8xAwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5CQBrAwUJYW1udFRvUGF5AGUAZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgwBaQENaGFzaGluZ1JhbmRvbQILbGF1bmNocGFkSWQEaGFzaAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gFBGhhc2gFA25pbAFpAQppbml0Q2FsbGVyAQdhZGRyZXNzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXIFB2FkZHJlc3MFA25pbAFpAQRpbml0Eg5wcm9qZWN0QWRkcmVzcwtzdGFydEhlaWdodAhkdXJhdGlvbghidXlUb2tlbgpjb21taXNzaW9uD3Rva2Vuc1BlclRpY2tldA1wcmljZVBlclRva2VuE3N3b3BmaVRpY2tldHNBbW91bnQUY2FtcGFpZ25Ub2tlbnNBbW91bnQTdG9rZW5zUGVyQWxsb2NhdGlvbg1zd29wUGVyVGlja2V0EnN3b3BGcmVlemVEdXJhdGlvbgtjbGFpbVBhcmFtcxNIaWdoQ29tcGV0aXRpb25TYWxlGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50FWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgxmcmVlemVQYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rZXlJbml0Q2FsbGVyAgAJAAIBAilPbmx5IHByb2plY3QgYWRtaW4gY2FuIGNhbGwgaW5pdCBmdW5jdGlvbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkAZgIFBmhlaWdodAULc3RhcnRIZWlnaHQJAAIBAjNTdGFydCBoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gYmxvY2tjaGFpbiBoZWlnaHQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuCQECIT0CCQCQAwEFDGZyZWV6ZVBhcmFtcwADBwkAAgECJEZyZWV6ZSBwYXJhbXMgbGlzdCBtdXN0IGhhdmUgMyBpdGVtcwQLbGF1bmNocGFkSWQJARJnZXRMYXVuY2hwYWROZXh0SWQABA5sYXVuY2hwYWRJZFN0cgkApAMBBQtsYXVuY2hwYWRJZAQLJHQwNzc4MDc4NTUJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwNzc4MDc4NTUCXzEECnBtdEFzc2V0SWQIBQskdDA3NzgwNzg1NQJfMgQLJHQwNzg2NDc5MzcJAQxnZXRBc3NldEluZm8BBQpwbXRBc3NldElkBA1wbXRTdHJBc3NldElkCAULJHQwNzg2NDc5MzcCXzEEDHBtdEFzc2V0TmFtZQgFCyR0MDc4NjQ3OTM3Al8yBAtwbXREZWNpbWFscwgFCyR0MDc4NjQ3OTM3Al8zBBVmcmVlemVBZGRpdGlvbmFsRW50cnkDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUQa2V5RnJlZXplVG9rZW5JZAkAkQMCBQxmcmVlemVQYXJhbXMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwACBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDXBtdFN0ckFzc2V0SWQCCl9sYXVuY2hwYWQFC2xhdW5jaHBhZElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrZXlMYXVuY2hwYWROZXh0SWQJAGQCBQtsYXVuY2hwYWRJZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFkZHJlc3MFDnByb2plY3RBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ1rZXlJbml0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDmtleVN0YXJ0SGVpZ2h0BQtzdGFydEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgULa2V5RHVyYXRpb24FCGR1cmF0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFC2tleUJ1eVRva2VuBQhidXlUb2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUUa2V5RnJlZXpTd29wRHVyYXRpb24FEnN3b3BGcmVlemVEdXJhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VG90YWxUb2tlbkFtb3VudAUJcG10QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFzc2V0SWQFDXBtdFN0ckFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDGtleUNvbWlzc2lvbgUKY29tbWlzc2lvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VGlja2V0TGFzdE51bWJlcgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUSa2V5VG9rZW5zUGVyVGlja2V0BQ90b2tlbnNQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVByaWNlUGVyVG9rZW4FDXByaWNlUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVN3b3BQZXJUaWNrZXQFDXN3b3BQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFFmtleVN3b3BmaVRpY2tldHNBbW91bnQFE3N3b3BmaVRpY2tldHNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFF2tleUNhbXBhaWduVG9rZW5zQW1vdW50BRRjYW1wYWlnblRva2Vuc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ5rZXlDbGFpbVBhcmFtcwkAuQkCBQtjbGFpbVBhcmFtcwIBLAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5SGlnaENvbXBldGl0aW9uU2FsZQUTSGlnaENvbXBldGl0aW9uU2FsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uBRhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAUcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGF1bmNocGFkQWN0aXZlSWQFC2xhdW5jaHBhZElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXICAAUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkBaQEQY29tbWl0U3dvcGZpU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMTA3MjAxMDg2NAkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxMDcyMDEwODY0Al8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxMDcyMDEwODY0Al8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDEwNzIwMTA4NjQCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxMDcyMDEwODY0Al80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTY29tbWlzc2lvblBlclRpY2tldAkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkBA0kdDAxMTA4MTExMjMxCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDExMDgxMTEyMzECXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxMTA4MTExMjMxAl8yBAxidXlBc3NldE5hbWUIBQ0kdDAxMTA4MTExMjMxAl8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTEwODExMTIzMQJfNAQLc3Rha2VkU3dvcHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292ZXJuYW5jZQkArAICCQClCAEIBQFpBmNhbGxlcgUTa2V5R292ZXJuYW5jZVN0YWtlZAAABBdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAkAaQIFC3N0YWtlZFN3b3BzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVN3b3BQZXJUaWNrZXQEE2JvdWdodFRpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAEFGFsbG93ZWRUaWNrZXRzQW1vdW50CQBlAgUXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwFE2JvdWdodFRpY2tldHNBbW91bnQEC3N0YXJ0SGVpZ2h0CQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQECGR1cmF0aW9uCQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5RHVyYXRpb24EFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgcEDSR0MDExOTU2MTMwMDQDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BAlhbW50VG9HZXQICgABQAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAhVob3dNYW55WW91R2V0UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIFCmJ1eUFzc2V0SWQFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIXKEludCwgU3RyaW5nLCBJbnQsIEludCkFAUAJAAIBCQCsAgIJAAMBBQFAAiwgY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBTdHJpbmcsIEludCwgSW50KQJfMQMJAAACBQlhbW50VG9HZXQFCWFtbnRUb0dldAQNdGlja2V0c0Ftb3VudAkAaQIFCWFtbnRUb0dldAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BBBhbW50VG9HZXRUaWNrZXRzCQBoAgUNdGlja2V0c0Ftb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAlhbW50VG9QYXkICgABQAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAhVob3dNYW55WW91UGF5UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMJAMwIAgUKYnV5QXNzZXRJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAg0oSW50LCBTdHJpbmcpBQFACQACAQkArAICCQADAQUBQAIiIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgU3RyaW5nKQJfMQMJAAACBQlhbW50VG9QYXkFCWFtbnRUb1BheQQCZXgJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0BQlhbW50VG9QYXkFA25pbAMJAAACBQJleAUCZXgEBmNoYW5nZQkAZQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRBhbW50VG9HZXRUaWNrZXRzBAZjRW50cnkDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZjaGFuZ2UICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBQNuaWwJAJUKAwUQYW1udFRvR2V0VGlja2V0cwUKYnV5QXNzZXRJZAUGY0VudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCVCgMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAQJcG10QW1vdW50CAUNJHQwMTE5NTYxMzAwNAJfMQQKcG10QXNzZXRJZAgFDSR0MDExOTU2MTMwMDQCXzIEC2NoYW5nZUVudHJ5CAUNJHQwMTE5NTYxMzAwNAJfMwMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQEBIQEFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQIhPQIFCnBtdEFzc2V0SWQFCmJ1eUFzc2V0SWQHCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACBgkBAiE9AgUKcG10QXNzZXRJZAUKYnV5QXNzZXRJZAcEDWZyZWV6ZVRva2VuSWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5RnJlZXplVG9rZW5JZAkAAgEJAKwCAgkArAICCQCsAgICKVR3byBhdHRhY2hlZCBwYXltZW50cyBleHBlY3RlZDogRmlyc3QgaW4gBQxidXlBc3NldE5hbWUCDCwgc2Vjb25kIGluIAUNZnJlZXplVG9rZW5JZAMDCQBnAgAABRdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAYJAGcCAAAFFGFsbG93ZWRUaWNrZXRzQW1vdW50CQACAQIqTm90IGVub3VnaHQgU1dPUCBpbiBzdGFraW5nIHRvIGJ1eSB0aWNrZXRzBA9idXlUaWNrZXRBbW91bnQJAGkCBQlwbXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAlwMBCQDMCAIFD2J1eVRpY2tldEFtb3VudAkAzAgCBRRhbGxvd2VkVGlja2V0c0Ftb3VudAUDbmlsBBxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uCQBoAgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAZjaGFuZ2UJAGUCBQlwbXRBbW91bnQFHGFsbG93ZWRCdXlQcmljZVdpdGhDb21pc3Npb24DCQAAAgUPYnV5VGlja2V0QW1vdW50AAAJAAIBCQCsAgIJAKwCAgIMTm90IGVub3VnaHQgBQxidXlBc3NldE5hbWUCDyB0byBidXkgdGlja2V0cwMJAQIhPQIFBmNoYW5nZQAACQACAQkArAICCQCsAgIJAKwCAgkArAICAhZXcm9uZyBwYXltZW50LiBUbyBidXkgCQCkAwEFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQCGHRpY2tldHMgeW91IG5lZWQgdG8gcGF5IAkApAMBBRxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUEFWZyZWV6ZUFkZGl0aW9uYWxFbnRyeQMFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgQNZnJlZXplVG9rZW5JZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlGcmVlemVUb2tlbklkBBRmcmVlemVUb2tlblBlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAQNJHQwMTQ4NDcxNDkzNAkAlAoCCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkBA9wbXRBbW91bnRGcmVlemUIBQ0kdDAxNDg0NzE0OTM0Al8xBBBwbXRBc3NldElkRnJlZXplCAUNJHQwMTQ4NDcxNDkzNAJfMgQNJHQwMTQ5NTExNTA0MgkBDGdldEFzc2V0SW5mbwEFCnBtdEFzc2V0SWQEE3BtdEZyZWV6ZVN0ckFzc2V0SWQIBQ0kdDAxNDk1MTE1MDQyAl8xBBJwbXRGcmVlemVBc3NldE5hbWUIBQ0kdDAxNDk1MTE1MDQyAl8yBBFwbXRGcmVlemVEZWNpbWFscwgFDSR0MDE0OTUxMTUwNDICXzMEEG5lZWRGcmVlemVUb2tlbnMJAGgCBRRmcmVlemVUb2tlblBlclRpY2tldAUPYnV5VGlja2V0QW1vdW50AwMJAQIhPQIFE3BtdEZyZWV6ZVN0ckFzc2V0SWQFDWZyZWV6ZVRva2VuSWQGCQECIT0CBRBuZWVkRnJlZXplVG9rZW5zBQ9wbXRBbW91bnRGcmVlemUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEFlvdSBuZWVkIHRvIGFkZCAJAKQDAQUQbmVlZEZyZWV6ZVRva2VucwIBIAUScG10RnJlZXplQXNzZXROYW1lAhQgYXMgYSBzZWNvbmQgcGF5bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJGcmVlemVUb2tlbgUPcG10QW1vdW50RnJlZXplBQNuaWwFA25pbAQYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlVc2VyVGlja2V0cwIABBZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRpY2tldExhc3ROdW1iZXIEC2JvdWdodFJhbmdlCQCsAgIJAKwCAgkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgABAgEtCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBRZhbGxvd2VkQnV5VGlja2V0QW1vdW50BBtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMJAKwCAgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAwkBAiE9AgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAgAJAKwCAgIBLAULYm91Z2h0UmFuZ2UJAKwCAgIABQtib3VnaHRSYW5nZQQDaW52AwkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAgxsb2NrTmV1dHJpbm8FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUJcG10QW1vdW50BQNuaWwAAAMJAAACBQNpbnYFA2ludgQJYmFzZUVudHJ5CQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50CQBkAgUTYm91Z2h0VGlja2V0c0Ftb3VudAUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUaWNrZXRMYXN0TnVtYmVyCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUOa2V5VXNlclRpY2tldHMFG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkFC2NoYW5nZUVudHJ5AwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUY29tbWl0QWNjZXNzTGlzdFNhbGUCC2xhdW5jaHBhZElkBXJlZklkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA0kdDAxNzEyODE3MjAzCQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFDSR0MDE3MTI4MTcyMDMCXzEECnBtdEFzc2V0SWQIBQ0kdDAxNzEyODE3MjAzAl8yBA0kdDAxNzIwODE3MzU4CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDE3MjA4MTczNTgCXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxNzIwODE3MzU4Al8yBAxidXlBc3NldE5hbWUIBQ0kdDAxNzIwODE3MzU4Al8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTcyMDgxNzM1OAJfNAQTdXNlclVzZG5Jbk1hcmtldGluZwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUga2V5VXNlckFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcAAAQPdXNkbkluTWFya2V0aW5nCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwAABBFib3VnaHRBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAAAECmNvbW1pc3Npb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUMa2V5Q29taXNzaW9uBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4EE3Rva2Vuc1BlckFsbG9jYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgQNJHQwMTgwMjcxODE3MQkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxODAyNzE4MTcxAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxODAyNzE4MTcxAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDE4MDI3MTgxNzECXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxODAyNzE4MTcxAl80BBxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uCQBrAwkAawMFCnRva2VuUHJpY2UFE3Rva2Vuc1BlckFsbG9jYXRpb24JAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04JAGQCAGQFCmNvbW1pc3Npb24AZAQLc3RhcnRIZWlnaHQJAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAQIZHVyYXRpb24JAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlEdXJhdGlvbgMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQDCQBnAgURYm91Z2h0QWxsb2NhdGlvbnMFFG1heEFsbG9jYXRpb25zQW1vdW50CQACAQkArAICCQCsAgICEVlvdSBjYW4gYnV5IG9ubHkgCQCkAwEFFG1heEFsbG9jYXRpb25zQW1vdW50AgthbGxvY2F0aW9ucwMDCQECIT0CBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQlwbXRBbW91bnQJAQIhPQIJAGgCBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uAAIFCXBtdEFtb3VudAcJAAIBCQCsAgIJAKwCAgkArAICAjJXcm9uZyBwYXltZW50LiBZb3UgY2FuIGJ1eSAxIG9yIDIgYWxsb2NhdGlvbnMgZm9yIAkApAMBBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUCDyBwZXIgYWxsb2NhdGlvbgQUYnV5QWxsb2NhdGlvbnNBbW91bnQJAGkCBQlwbXRBbW91bnQFHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24EA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIMbG9ja05ldXRyaW5vBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFCXBtdEFtb3VudAUDbmlsAAADCQAAAgUDaW52BQNpbnYECWJhc2VFbnRyeQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwkAZAIFEWJvdWdodEFsbG9jYXRpb25zBRRidXlBbGxvY2F0aW9uc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQBkAgUTdXNlclVzZG5Jbk1hcmtldGluZwUJcG10QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFHGtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcJAGQCBQ91c2RuSW5NYXJrZXRpbmcFCXBtdEFtb3VudAUDbmlsAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZY29tbWl0SGlnaENvbXBldGl0aW9uU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDSR0MDIwNDI5MjA1NzkJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMjA0MjkyMDU3OQJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDIwNDI5MjA1NzkCXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDIwNDI5MjA1NzkCXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyMDQyOTIwNTc5Al80BAtzdGFydEhlaWdodAkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleVN0YXJ0SGVpZ2h0BAhkdXJhdGlvbgkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uBBVib3VnaHRIQ1RpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQAAAQTaGlnaENvbXBldGl0aW9uU2FsZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFmtleUhpZ2hDb21wZXRpdGlvblNhbGUHBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4ED3Rva2Vuc1BlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlUb2tlbnNQZXJUaWNrZXQEDSR0MDIxMTg5MjEzMzMJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAUNJHQwMjExODkyMTMzMwJfMQQPdG9rZW5TdHJBc3NldElkCAUNJHQwMjExODkyMTMzMwJfMgQOdG9rZW5Bc3NldE5hbWUIBQ0kdDAyMTE4OTIxMzMzAl8zBA10b2tlbkRlY2ltYWxzCAUNJHQwMjExODkyMTMzMwJfNAQLdGlja2V0UHJpY2UJAGsDBQ90b2tlbnNQZXJUaWNrZXQFCnRva2VuUHJpY2UJAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04EE2NvbW1pc3Npb25QZXJUaWNrZXQJAGsDBQt0aWNrZXRQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24AZAQNJHQwMjE1NjYyMjYxNAMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBHVuaXQECWFtbnRUb0dldAgKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VHZXRSRUFET05MWQkAzAgCCQDMCAIJAKQDAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgUKYnV5QXNzZXRJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAhcoSW50LCBTdHJpbmcsIEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACLCBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIFN0cmluZywgSW50LCBJbnQpAl8xAwkAAAIFCWFtbnRUb0dldAUJYW1udFRvR2V0BA10aWNrZXRzQW1vdW50CQBpAgUJYW1udFRvR2V0CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQgKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VQYXlSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwkAzAgCBQpidXlBc3NldElkBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACDShJbnQsIFN0cmluZykFAUAJAAIBCQCsAgIJAAMBBQFAAiIgY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBTdHJpbmcpAl8xAwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5BAJleAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwUDbmlsBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFCWFtbnRUb1BheQUDbmlsAwkAAAIFAmV4BQJleAQGY2hhbmdlCQBlAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFEGFtbnRUb0dldFRpY2tldHMEBmNFbnRyeQMJAGYCBQZjaGFuZ2UAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmNoYW5nZQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwFA25pbAkAlQoDBRBhbW50VG9HZXRUaWNrZXRzBQpidXlBc3NldElkBQZjRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJUKAwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBAlwbXRBbW91bnQIBQ0kdDAyMTU2NjIyNjE0Al8xBApwbXRBc3NldElkCAUNJHQwMjE1NjYyMjYxNAJfMgQLY2hhbmdlRW50cnkIBQ0kdDAyMTU2NjIyNjE0Al8zAwkBAiE9AgURYWN0aXZlTGF1bmNocGFkSWQFC2xhdW5jaHBhZElkCQACAQI3VGhlcmUgaXMgbm8gYWN0aXZlIGxhdW5jaHBhZCBvciB0aGlzIGxhdW5jaHBhZCBpcyBlbmRlZAMJAQEhAQUTaGlnaENvbXBldGl0aW9uU2FsZQkAAgECNFRoZXJlIGlzIG5vIGhpZ2ggY29tcGV0aXRpb24gc2FsZSBmb3IgdGhpcyBsYXVuY2hwYWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQED2J1eVRpY2tldEFtb3VudAkAaQIFCXBtdEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BBVidXlQcmljZVdpdGhDb21pc3Npb24JAGgCBQ9idXlUaWNrZXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQGY2hhbmdlCQBlAgUJcG10QW1vdW50BRVidXlQcmljZVdpdGhDb21pc3Npb24DCQAAAgUPYnV5VGlja2V0QW1vdW50AAAJAAIBCQCsAgIJAKwCAgIMTm90IGVub3VnaHQgBQxidXlBc3NldE5hbWUCDyB0byBidXkgdGlja2V0cwMJAQIhPQIFBmNoYW5nZQAACQACAQkArAICCQCsAgIJAKwCAgkArAICAhZXcm9uZyBwYXltZW50LiBUbyBidXkgCQCkAwEFD2J1eVRpY2tldEFtb3VudAIYdGlja2V0cyB5b3UgbmVlZCB0byBwYXkgCQCkAwEFFWJ1eVByaWNlV2l0aENvbWlzc2lvbgUMYnV5QXNzZXROYW1lBBh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEGtleVVzZXJIQ1RpY2tldHMCAAQWbGFzdEJvdWdodFRpY2tldE51bWJlcgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIEC2JvdWdodFJhbmdlCQCsAgIJAKwCAgkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgABAgEtCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBQ9idXlUaWNrZXRBbW91bnQEG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwkArAICBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMDCQECIT0CBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMCAAkArAICAgEsBQtib3VnaHRSYW5nZQkArAICAgAFC2JvdWdodFJhbmdlBANpbnYDCQAAAgUKYnV5QXNzZXRJZAUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGxvY2tOZXV0cmlubwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQlwbXRBbW91bnQFA25pbAAAAwkAAAIFA2ludgUDaW52BAliYXNlRW50cnkJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQJAGQCBRVib3VnaHRIQ1RpY2tldHNBbW91bnQFD2J1eVRpY2tldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBQ9idXlUaWNrZXRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEGtleVVzZXJIQ1RpY2tldHMFG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwUDbmlsBQtjaGFuZ2VFbnRyeQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAkAzggCBQliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAUFcmVmSWQFA25pbAUJYmFzZUVudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZpbmFsaXNlAwtsYXVuY2hwYWRJZAl2cmZIZWlnaHQKc2VjcmV0V29yZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQJc2F2ZWRIYXNoCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gECGNhbGNIYXNoCQDYBAEJAPcDAQkAywECCQCaAwEFCXZyZkhlaWdodAkAmwMBBQpzZWNyZXRXb3JkAwkBAiE9AgUIY2FsY0hhc2gFCXNhdmVkSGFzaAkAAgECHHZyZiBIZWlnaHQgaGFzaCBub3QgbWF0Y2hpbmcEDSR0MDI1NTY3MjU3MTcJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMjU1NjcyNTcxNwJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDI1NTY3MjU3MTcCXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDI1NTY3MjU3MTcCXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyNTU2NzI1NzE3Al80BA5wcm9qZWN0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBZGRyZXNzBApjb21taXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgQMY29tbWlzc2lvbkhDCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgQSdHJhbnNmZXJlZEJ1eUFzc2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VHJhbnNmZXJCdXlBc3NldAAABBtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUaa2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGQEFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRxrZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZEhDAAAEFnN3b3BmaU1lbWJlcnNDb21pc3Npb24JAGsDBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFCmNvbW1pc3Npb24AZAQRc3dvcGZpSENDb21pc3Npb24JAGsDBRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BQxjb21taXNzaW9uSEMAZAQedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFJWtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmdGaW5hbGl6ZWQEEm1hcmtldGluZ0NvbWlzc2lvbgkAawMFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUKY29tbWlzc2lvbgBkBA11bnN0YWtlQW1vdW50CQBlAgkAZAIJAGQCCQBkAgkAZAIJAGQCBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbgUSbWFya2V0aW5nQ29taXNzaW9uBRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BRFzd29wZmlIQ0NvbWlzc2lvbgUSdHJhbnNmZXJlZEJ1eUFzc2V0AwkAZgIFEnRyYW5zZmVyZWRCdXlBc3NldAkAZAIJAGQCBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUWc3dvcGZpSENCdXlBc3NldEFtb3VudAkAAgECKENhbid0IHRyYW5zZmVyIG5lZ2F0aXZlIHZhbHVlIHRvIHByb2plY3QEA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUNdW5zdGFrZUFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAURa2V5RmluYWxpc2VIZWlnaHQFBmhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5wcm9qZWN0QWRkcmVzcwkAZQIJAGQCCQBkAgUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFEnRyYW5zZmVyZWRCdXlBc3NldAUKYnV5QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRBjb21taXNzaW9uV2FsbGV0CQBkAgkAZAIFFnN3b3BmaU1lbWJlcnNDb21pc3Npb24FEm1hcmtldGluZ0NvbWlzc2lvbgURc3dvcGZpSENDb21pc3Npb24FCmJ1eUFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQELbGF1bmNocGFkSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDWJvdWdodFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAED2JvdWdodEhDVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAAABBFib3VnaHRBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAAAED3VzZXJDbGFpbVN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBwQOZmluYWxpemVIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRFrZXlGaW5hbGlzZUhlaWdodAAAAwkAAAIFDmZpbmFsaXplSGVpZ2h0AAAJAAIBAjFZb3UgY2FuJ3QgY2xhaW0gYmVjYXVzZSByZXN1bHRzIGFyZSBub3QgZmluYWxpemVkAwUPdXNlckNsYWltU3RhdHVzCQACAQIXWW91IGFyZSBhbHJlYWR5IGNsYWltZWQDAwMJAAACBQ1ib3VnaHRUaWNrZXRzAAAJAAACBRFib3VnaHRBbGxvY2F0aW9ucwAABwkAAAIFD2JvdWdodEhDVGlja2V0cwAABwkAAgECLllvdSBjYW4ndCBjbGFpbSBiZWNhdXNlIHlvdSBkb24ndCBidXkgYW55dGhpbmcEDSR0MDI4ODAxMjg5NzgJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuCQDYBAEFBFVTRE4ECmJ1eUFzc2V0SWQIBQ0kdDAyODgwMTI4OTc4Al8xBA1idXlBc3NldFN0cklkCAUNJHQwMjg4MDEyODk3OAJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMjg4MDEyODk3OAJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDI4ODAxMjg5NzgCXzQEDXdvbm5lZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJXaW5uZWRUaWNrZXRzQW1vdW50AAAED3dvbm5lZEhDVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUpa2V5VXNlcldpbm5lZEhpZ2hDb21wZXRpdGlvblRpY2tldHNBbW91bnQAAAQUYXdhaWxhYmxlQWxsb2NhdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwAABApjb21taXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgQMY29tbWlzc2lvbkhDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAAAEEmFsbG93ZWRBbGxvY2F0aW9ucwkAlwMBCQDMCAIFEWJvdWdodEFsbG9jYXRpb25zCQDMCAIFFGF3YWlsYWJsZUFsbG9jYXRpb25zBQNuaWwECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMjk4OTQzMDAzOAkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAyOTg5NDMwMDM4Al8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAyOTg5NDMwMDM4Al8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDI5ODk0MzAwMzgCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAyOTg5NDMwMDM4Al80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTdG9rZW5zUGVyQWxsb2NhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uBBR0cmFuc2ZlclRva2Vuc0Ftb3VudAkAZAIJAGQCCQBoAgUNd29ubmVkVGlja2V0cwUPdG9rZW5zUGVyVGlja2V0CQBoAgUSYWxsb3dlZEFsbG9jYXRpb25zBRN0b2tlbnNQZXJBbGxvY2F0aW9uCQBoAgUPd29ubmVkSENUaWNrZXRzBQ90b2tlbnNQZXJUaWNrZXQEG25vdEFsbG93ZWRBbGxvY2F0aW9uc1Rva2VucwkAaAIJAGUCBRFib3VnaHRBbGxvY2F0aW9ucwUSYWxsb3dlZEFsbG9jYXRpb25zBRN0b2tlbnNQZXJBbGxvY2F0aW9uBBZidXlBc3NldEZvckFsbG9jYXRpb25zCQBrAwkAawMFG25vdEFsbG93ZWRBbGxvY2F0aW9uc1Rva2VucwUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgkAZAIAZAUKY29tbWlzc2lvbgBkBBpidXlBc3NldEZvclVud29ubmVkVGlja2V0cwkAawMJAGgCCQBlAgUNYm91Z2h0VGlja2V0cwUNd29ubmVkVGlja2V0cwULdGlja2V0UHJpY2UJAGQCAGQFCmNvbW1pc3Npb24AZAQcYnV5QXNzZXRGb3JIQ1Vud29ubmVkVGlja2V0cwkAawMJAGgCCQBlAgUPYm91Z2h0SENUaWNrZXRzBQ93b25uZWRIQ1RpY2tldHMFC3RpY2tldFByaWNlCQBkAgBkBQxjb21taXNzaW9uSEMAZAQPY2xhaW1lZEJ1eVRva2VuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlVc2VyQ2xhaW1lZEJ1eVRva2VucwAAAwMDCQBmAgAABRZidXlBc3NldEZvckFsbG9jYXRpb25zBgkAZgIAAAUaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMGCQBmAgAABRxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzCQACAQJSRXJyb3Igd2l0aCBhbGxvd2VkIGFsbG9jYXRpb24gcGFyYW0gb3Igd29ubmVkIHRpY2tldHMgcGFyYW0gcGxlYXNlIGNvbnRhY3Qgc3VwcG9ydAQWcmV0dXJuZWRCdXlBc3NldEFtb3VudAkAZQIJAGQCCQBkAgUaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMFHGJ1eUFzc2V0Rm9ySENVbndvbm5lZFRpY2tldHMFFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMFD2NsYWltZWRCdXlUb2tlbgQQdHJhbnNmZXJCdXlBc3NldAMJAGYCBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50BQpidXlBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUXa2V5VXNlckNsYWltZWRCdXlUb2tlbnMFFnJldHVybmVkQnV5QXNzZXRBbW91bnQFA25pbAUDbmlsBANpbnYDAwkAZgIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQAAAkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4HCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYEDWNsYWltZWRQYXJhbXMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleUNsYWltUGFyYW1zAghjbGFpbUFsbAIBLAMJAAACCQCRAwIFDWNsYWltZWRQYXJhbXMAAAIIY2xhaW1BbGwEDnRyYW5zZmVyVG9rZW5zAwkAZgIFFHRyYW5zZmVyVG9rZW5zQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUHdG9rZW5JZAUDbmlsBQNuaWwJAM4IAgkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUDbmlsBQ50cmFuc2ZlclRva2VucwUQdHJhbnNmZXJCdXlBc3NldAMJAAACCQCRAwIFDWNsYWltZWRQYXJhbXMAAAILY2xhaW1QZXJpb2QEDWNsYWltZWRUb2tlbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zAAAEDHVubG9ja1BlcmlvZAkBBXZhbHVlAQkAtgkBCQCRAwIFDWNsYWltZWRQYXJhbXMAAgQLYmxvY2tIZWlnaHQJAGQCCQEFdmFsdWUBCQC2CQEJAJEDAgUNY2xhaW1lZFBhcmFtcwADBQ5maW5hbGl6ZUhlaWdodAQMdW5sb2NrSGVpZ2h0CQBkAgUMdW5sb2NrUGVyaW9kBQtibG9ja0hlaWdodAQSYWxsb3dlZFN0YXJ0QW1vdW50CQBrAwUUdHJhbnNmZXJUb2tlbnNBbW91bnQJAQV2YWx1ZQEJALYJAQkAkQMCBQ1jbGFpbWVkUGFyYW1zAAEAZAQTYWxsb3dlZFRva2Vuc0Ftb3VudAkAZAIFEmFsbG93ZWRTdGFydEFtb3VudAMJAGYCBQZoZWlnaHQFC2Jsb2NrSGVpZ2h0CQBlAgkAawMJAGUCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUSYWxsb3dlZFN0YXJ0QW1vdW50CQBlAgkAlwMBCQDMCAIFBmhlaWdodAkAzAgCBQx1bmxvY2tIZWlnaHQFA25pbAULYmxvY2tIZWlnaHQFDHVubG9ja1BlcmlvZAUNY2xhaW1lZFRva2VucwkAZQIAAAUNY2xhaW1lZFRva2VucwQQY2xhaW1TdGF0dXNFbnRyeQMJAGcCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAkAZAIFDWNsYWltZWRUb2tlbnMFE2FsbG93ZWRUb2tlbnNBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyQ2xhaW1TdGF0dXMGBQNuaWwFA25pbAMDCQBmAgUTYWxsb3dlZFRva2Vuc0Ftb3VudAAABgkAZgIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQAAAQOdHJhbnNmZXJUb2tlbnMDCQBmAgUTYWxsb3dlZFRva2Vuc0Ftb3VudAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUUa2V5VXNlckNsYWltZWRUb2tlbnMJAGQCBQ1jbGFpbWVkVG9rZW5zBRNhbGxvd2VkVG9rZW5zQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUTYWxsb3dlZFRva2Vuc0Ftb3VudAUHdG9rZW5JZAUDbmlsBQNuaWwJAM4IAgUQdHJhbnNmZXJCdXlBc3NldAUOdHJhbnNmZXJUb2tlbnMJAAIBAhBOb3RoaW5nIHRvIGNsYWltCQACAQIWVW5rbm93biBjbGFpbSBmdW5jdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjbGFpbUZyZWV6ZVRva2VuAQtsYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQVZnJlZXplQWRkaXRpb25hbFRva2VuCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUYa2V5RnJlZXplQWRkaXRpb25hbFRva2VuBwMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRFrZXlGaW5hbGlzZUhlaWdodAkAAgECMVlvdSBjYW4ndCBjbGFpbSBiZWNhdXNlIHJlc3VsdHMgYXJlIG5vdCBmaW5hbGl6ZWQDCQEBIQEFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkAAgECOVRoZXJlIGFyZSBubyBhZGRpdGlvbmFsIHRva2VuIGZyZWV6aW5nIGZvciB0aGlzIGxhdW5jaHBhZAQHdG9rZW5JZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleUZyZWV6ZVRva2VuSWQEEXVzZXJUb2tlbnNGcmVlemVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyRnJlZXplVG9rZW4AAAQLc3RhcnRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAAABAhkdXJhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uAAAEE2ZyZWV6ZVRva2VuRHVyYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgQOYmxvY2tFbmRIZWlnaHQJAGQCCQBkAgULc3RhcnRIZWlnaHQFCGR1cmF0aW9uBRNmcmVlemVUb2tlbkR1cmF0aW9uAwkAAAIFEXVzZXJUb2tlbnNGcmVlemVkAAAJAAIBAjhZb3UgYXJlIGFscmVhZHkgY2xhaW1lZCB5b3VyIHRva2VucyBvciBub3QgcGFpZCBhbnl0aGluZwMJAGYCBQ5ibG9ja0VuZEhlaWdodAUGaGVpZ2h0CQACAQkArAICAhlZb3VyIHRva2VucyBmcmVlemVkIHRlZWwgCQCkAwEFDmJsb2NrRW5kSGVpZ2h0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgURdXNlclRva2Vuc0ZyZWV6ZWQFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyRnJlZXplVG9rZW4AAAUDbmlsAWkBEHRyYW5zZmVyQnV5QXNzZXQCC2xhdW5jaHBhZElkBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQOcHJvamVjdEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUKa2V5QWRkcmVzcwQNJHQwMzYyMDMzNjM1MwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQEFdmFsdWUBCQCdCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5QnV5VG9rZW4ECmJ1eUFzc2V0SWQIBQ0kdDAzNjIwMzM2MzUzAl8xBA1idXlBc3NldFN0cklkCAUNJHQwMzYyMDMzNjM1MwJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMzYyMDMzNjM1MwJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDM2MjAzMzYzNTMCXzQEEnRyYW5zZmVyZWRCdXlBc3NldAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRyYW5zZmVyQnV5QXNzZXQAAAQDaW52AwMJAGYCBQZhbW91bnQAAAkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4HCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUGYW1vdW50CQDMCAIJANgEAQUEVVNETgUDbmlsBQNuaWwAAAMJAAACBQNpbnYFA2ludgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUcmFuc2ZlckJ1eUFzc2V0CQBkAgUSdHJhbnNmZXJlZEJ1eUFzc2V0BQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOcHJvamVjdEFkZHJlc3MFBmFtb3VudAUKYnV5QXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQUGYWN0aXZlCQACAQIVREFwcCBhbHJlYWR5IGluYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQlrZXlBY3RpdmUHBQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwUGYWN0aXZlCQACAQITREFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUJa2V5QWN0aXZlBgUDbmlsAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUMYWRtaW5QdWJLZXkyAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUMYWRtaW5QdWJLZXkzAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBA1zaWduZWRCeUFkbWluAwMDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTIGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTMGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABRJhZG1pblB1YktleVN0YWtpbmcEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACD0RhdGFUcmFuc2FjdGlvbgQDZHR4BQckbWF0Y2gwAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFIWtleUxhdW5jaHBhZERhdGFUcmFuc2FjdGlvblN0YXR1cwcFDXNpZ25lZEJ5QWRtaW4HBRNtdWx0aVNpZ25lZEJ5QWRtaW5zg7dBKg==", "height": 2723154, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dks9HsD9JkzXta34GuUS1JzwRAvxTe6xAKq4t3DRg97x Next: GwsfeCjPHUA2ZWTvfrdVFcd2TZ86yDRdhW4SUKY6VtLE Diff:
OldNewDifferences
125125
126126 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
127127
128-let WAVES_XTN_EX = Address(base58'3Mr73hWEyivaVitnLKceS6TuL2aZPZMXqjj')
128+let WAVES_XTN_EX = Address(base58'3MqjSoPUdGHaan9uhxwTnFw1uH7uZ8dgt8f')
129129
130130 let maxAllocationsAmount = 2
131131
190190
191191
192192 func buyInWaves (launchpadId,ticketsAmount,type) = {
193+ let $t051595309 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
194+ let buyAssetId = $t051595309._1
195+ let buyAssetStrId = $t051595309._2
196+ let buyAssetName = $t051595309._3
197+ let buyAssetDecimals = $t051595309._4
193198 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
194199 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
195- let $t053365480 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
196- let tokenId = $t053365480._1
197- let tokenStrAssetId = $t053365480._2
198- let tokenAssetName = $t053365480._3
199- let tokenDecimals = $t053365480._4
200+ let $t054915635 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
201+ let tokenId = $t054915635._1
202+ let tokenStrAssetId = $t054915635._2
203+ let tokenAssetName = $t054915635._3
204+ let tokenDecimals = $t054915635._4
200205 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
201206 let commissionPerTicket = if ((type == 1))
202207 then fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
203208 else fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
204209 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
205- let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), USDN]], nil)
210+ let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
206211 if ($isInstanceOf(@, "(Int, String)"))
207212 then @
208213 else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
236241 else {
237242 let launchpadId = getLaunchpadNextId()
238243 let launchpadIdStr = toString(launchpadId)
239- let $t076197694 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
240- let pmtAmount = $t076197694._1
241- let pmtAssetId = $t076197694._2
242- let $t077037776 = getAssetInfo(pmtAssetId)
243- let pmtStrAssetId = $t077037776._1
244- let pmtAssetName = $t077037776._2
245- let pmtDecimals = $t077037776._3
244+ let $t077807855 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
245+ let pmtAmount = $t077807855._1
246+ let pmtAssetId = $t077807855._2
247+ let $t078647937 = getAssetInfo(pmtAssetId)
248+ let pmtStrAssetId = $t078647937._1
249+ let pmtAssetName = $t078647937._2
250+ let pmtDecimals = $t078647937._3
246251 let freezeAdditionalEntry = if (freezeAdditionalToken)
247252 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
248253 else nil
255260 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
256261 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
257262 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
258- let $t01055910703 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
259- let tokenId = $t01055910703._1
260- let tokenStrAssetId = $t01055910703._2
261- let tokenAssetName = $t01055910703._3
262- let tokenDecimals = $t01055910703._4
263+ let $t01072010864 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
264+ let tokenId = $t01072010864._1
265+ let tokenStrAssetId = $t01072010864._2
266+ let tokenAssetName = $t01072010864._3
267+ let tokenDecimals = $t01072010864._4
263268 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
264269 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
265- let $t01092011070 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
266- let buyAssetId = $t01092011070._1
267- let buyAssetStrId = $t01092011070._2
268- let buyAssetName = $t01092011070._3
269- let buyAssetDecimals = $t01092011070._4
270+ let $t01108111231 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
271+ let buyAssetId = $t01108111231._1
272+ let buyAssetStrId = $t01108111231._2
273+ let buyAssetName = $t01108111231._3
274+ let buyAssetDecimals = $t01108111231._4
270275 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
271276 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
272277 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
274279 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
275280 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
276281 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
277- let $t01179512843 = if ((i.payments[0].assetId == unit))
282+ let $t01195613004 = if ((i.payments[0].assetId == unit))
278283 then {
279284 let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
280285 if ($isInstanceOf(@, "(Int, String, Int, Int)"))
306311 else throw("Strict value is not equal to itself.")
307312 }
308313 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
309- let pmtAmount = $t01179512843._1
310- let pmtAssetId = $t01179512843._2
311- let changeEntry = $t01179512843._3
314+ let pmtAmount = $t01195613004._1
315+ let pmtAssetId = $t01195613004._2
316+ let changeEntry = $t01195613004._3
312317 if ((activeLaunchpadId != launchpadId))
313318 then throw("There is no active launchpad or this launchpad is ended")
314319 else if ((startHeight > height))
348353 then {
349354 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
350355 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
351- let $t01468614773 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
352- let pmtAmountFreeze = $t01468614773._1
353- let pmtAssetIdFreeze = $t01468614773._2
354- let $t01479014881 = getAssetInfo(pmtAssetId)
355- let pmtFreezeStrAssetId = $t01479014881._1
356- let pmtFreezeAssetName = $t01479014881._2
357- let pmtFreezeDecimals = $t01479014881._3
356+ let $t01484714934 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
357+ let pmtAmountFreeze = $t01484714934._1
358+ let pmtAssetIdFreeze = $t01484714934._2
359+ let $t01495115042 = getAssetInfo(pmtAssetId)
360+ let pmtFreezeStrAssetId = $t01495115042._1
361+ let pmtFreezeAssetName = $t01495115042._2
362+ let pmtFreezeDecimals = $t01495115042._3
358363 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
359364 if (if ((pmtFreezeStrAssetId != freezeTokenId))
360365 then true
388393
389394 @Callable(i)
390395 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
391- let $t01696717042 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
392- let pmtAmount = $t01696717042._1
393- let pmtAssetId = $t01696717042._2
394- let $t01704717197 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
395- let buyAssetId = $t01704717197._1
396- let buyAssetStrId = $t01704717197._2
397- let buyAssetName = $t01704717197._3
398- let buyAssetDecimals = $t01704717197._4
396+ let $t01712817203 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
397+ let pmtAmount = $t01712817203._1
398+ let pmtAssetId = $t01712817203._2
399+ let $t01720817358 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
400+ let buyAssetId = $t01720817358._1
401+ let buyAssetStrId = $t01720817358._2
402+ let buyAssetName = $t01720817358._3
403+ let buyAssetDecimals = $t01720817358._4
399404 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
400405 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
401406 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
402407 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
403408 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
404409 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
405- let $t01786618010 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
406- let tokenId = $t01786618010._1
407- let tokenStrAssetId = $t01786618010._2
408- let tokenAssetName = $t01786618010._3
409- let tokenDecimals = $t01786618010._4
410+ let $t01802718171 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
411+ let tokenId = $t01802718171._1
412+ let tokenStrAssetId = $t01802718171._2
413+ let tokenAssetName = $t01802718171._3
414+ let tokenDecimals = $t01802718171._4
410415 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
411416 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
412417 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
446451
447452 @Callable(i)
448453 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
449- let $t02026820418 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
450- let buyAssetId = $t02026820418._1
451- let buyAssetStrId = $t02026820418._2
452- let buyAssetName = $t02026820418._3
453- let buyAssetDecimals = $t02026820418._4
454+ let $t02042920579 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
455+ let buyAssetId = $t02042920579._1
456+ let buyAssetStrId = $t02042920579._2
457+ let buyAssetName = $t02042920579._3
458+ let buyAssetDecimals = $t02042920579._4
454459 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
455460 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
456461 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
457462 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
458463 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
459464 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
460- let $t02102821172 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
461- let tokenId = $t02102821172._1
462- let tokenStrAssetId = $t02102821172._2
463- let tokenAssetName = $t02102821172._3
464- let tokenDecimals = $t02102821172._4
465+ let $t02118921333 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
466+ let tokenId = $t02118921333._1
467+ let tokenStrAssetId = $t02118921333._2
468+ let tokenAssetName = $t02118921333._3
469+ let tokenDecimals = $t02118921333._4
465470 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
466471 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
467- let $t02140522453 = if ((i.payments[0].assetId == unit))
472+ let $t02156622614 = if ((i.payments[0].assetId == unit))
468473 then {
469474 let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
470475 if ($isInstanceOf(@, "(Int, String, Int, Int)"))
496501 else throw("Strict value is not equal to itself.")
497502 }
498503 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
499- let pmtAmount = $t02140522453._1
500- let pmtAssetId = $t02140522453._2
501- let changeEntry = $t02140522453._3
504+ let pmtAmount = $t02156622614._1
505+ let pmtAssetId = $t02156622614._2
506+ let changeEntry = $t02156622614._3
502507 if ((activeLaunchpadId != launchpadId))
503508 then throw("There is no active launchpad or this launchpad is ended")
504509 else if (!(highCompetitionSale))
550555 if ((calcHash != savedHash))
551556 then throw("vrf Height hash not matching")
552557 else {
553- let $t02540625556 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
554- let buyAssetId = $t02540625556._1
555- let buyAssetStrId = $t02540625556._2
556- let buyAssetName = $t02540625556._3
557- let buyAssetDecimals = $t02540625556._4
558+ let $t02556725717 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
559+ let buyAssetId = $t02556725717._1
560+ let buyAssetStrId = $t02556725717._2
561+ let buyAssetName = $t02556725717._3
562+ let buyAssetDecimals = $t02556725717._4
558563 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
559564 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
560565 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
599604 else false)
600605 then throw("You can't claim because you don't buy anything")
601606 else {
602- let $t02864028817 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
603- let buyAssetId = $t02864028817._1
604- let buyAssetStrId = $t02864028817._2
605- let buyAssetName = $t02864028817._3
606- let buyAssetDecimals = $t02864028817._4
607+ let $t02880128978 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
608+ let buyAssetId = $t02880128978._1
609+ let buyAssetStrId = $t02880128978._2
610+ let buyAssetName = $t02880128978._3
611+ let buyAssetDecimals = $t02880128978._4
607612 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
608613 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
609614 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
612617 let allowedAllocations = min([boughtAllocations, awailableAllocations])
613618 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
614619 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
615- let $t02973329877 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
616- let tokenId = $t02973329877._1
617- let tokenStrAssetId = $t02973329877._2
618- let tokenAssetName = $t02973329877._3
619- let tokenDecimals = $t02973329877._4
620+ let $t02989430038 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
621+ let tokenId = $t02989430038._1
622+ let tokenStrAssetId = $t02989430038._2
623+ let tokenAssetName = $t02989430038._3
624+ let tokenDecimals = $t02989430038._4
620625 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
621626 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
622627 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
711716 @Callable(i)
712717 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
713718 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
714- let $t03604236192 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
715- let buyAssetId = $t03604236192._1
716- let buyAssetStrId = $t03604236192._2
717- let buyAssetName = $t03604236192._3
718- let buyAssetDecimals = $t03604236192._4
719+ let $t03620336353 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
720+ let buyAssetId = $t03620336353._1
721+ let buyAssetStrId = $t03620336353._2
722+ let buyAssetName = $t03620336353._3
723+ let buyAssetDecimals = $t03620336353._4
719724 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
720725 let inv = if (if ((amount > 0))
721726 then (buyAssetId == USDN)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyActive = "active"
55
66 let kActiveGlob = "active_all_contracts"
77
88 let keyAdminPubKey1 = "admin_pub_1"
99
1010 let keyAdminPubKey2 = "admin_pub_2"
1111
1212 let keyAdminPubKey3 = "admin_pub_3"
1313
1414 let keyLaunchpadDataTransactionStatus = "launchpad_data_transaction_status"
1515
1616 let keyLaunchpadNextId = "launchpad_next_id"
1717
1818 let keyLaunchpadActiveId = "launchpad_active_id"
1919
2020 let keyInitCaller = "init_caller"
2121
2222 let keyAddress = "_address"
2323
2424 let keyInitHeight = "_init_height"
2525
2626 let keyStartHeight = "_start_height"
2727
2828 let keyFinaliseHeight = "_finalise_height"
2929
3030 let keyComission = "_comission"
3131
3232 let keyAssetId = "_asset_id"
3333
3434 let keyTotalTokenAmount = "_total_token_amount"
3535
3636 let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
3737
3838 let keyTokensPerTicket = "_tokens_per_ticket"
3939
4040 let keyPricePerToken = "_price_per_token"
4141
4242 let keySwopPerTicket = "_swop_per_ticket"
4343
4444 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4545
4646 let keyCampaignTokensAmount = "_tokens_access_list"
4747
4848 let keyTokensPerAllocation = "_tokens_per_allocation"
4949
5050 let keyTicketLastNumber = "_ticket_last_number"
5151
5252 let keyGovernanceStaked = "_GSwop_amount"
5353
5454 let keyUserRefId = "_ref_id"
5555
5656 let keyVerifyHash = "_verify_hash"
5757
5858 let keyDuration = "_duration"
5959
6060 let keyAmountBuyAssetInMarketing = "_total_purchased_buy_asset_in_marketing"
6161
6262 let keyAmountBuyAssetInMarketingFinalized = "_total_purchased_buy_asset_in_marketing_finalized"
6363
6464 let keyTransferBuyAsset = "_transfer_buy_asset"
6565
6666 let keyFreezSwopDuration = "_freeze_swop_duration"
6767
6868 let keyFreezeAdditionalToken = "_freeze_additional_token"
6969
7070 let keyFreezeTokenId = "_freeze_token_id"
7171
7272 let keyFreezeTokenDuration = "_freeze_token_duration"
7373
7474 let keyFreezeTokenPerTicket = "_freeze_token_per_ticket"
7575
7676 let keyBuyToken = "_buy_token"
7777
7878 let keyClaimParams = "_claim_params"
7979
8080 let keyHighCompetitionComission = "_high_competition_comission"
8181
8282 let keyHighCompetitionSale = "_high_competition_sale"
8383
8484 let keyHCTicketLastNumber = "_high_competition_ticket_last_number"
8585
8686 let keyHighCompetitionAmount = "_tickets_high_competition"
8787
8888 let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
8989
9090 let keyUserClaimedTokens = "_claimed_tokens"
9191
9292 let keyUserClaimedBuyTokens = "_claimed_buy_tokens"
9393
9494 let keyUserBoughtTicketsAmount = "_bought_tickets"
9595
9696 let keyUserTickets = "_tickets_number"
9797
9898 let keyUserHCTickets = "_tickets_number_high_competition"
9999
100100 let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
101101
102102 let keyUserAvailableAllocations = "_available_purchase_marketing"
103103
104104 let keyUserAmountBuyAssetInMarketing = "_purchased_buy_asset_in_marketing"
105105
106106 let keyUserBoughtAllocations = "_bought_allocations"
107107
108108 let keyUserClaimStatus = "_claim_status"
109109
110110 let keyUserWinnedTicketsAmount = "_tickets_result"
111111
112112 let keyUserWinnedHighCompetitionTicketsAmount = "_tickets_result_high_competition"
113113
114114 let keyUserFreezeToken = "_freeze_token_amount"
115115
116116 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
117117
118118 let governance = Address(base58'3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs')
119119
120120 let commissionWallet = Address(base58'3N2eueE5vLLKe8jXuBDbdbKcPaH36yG1Had')
121121
122122 let stakingUSDNAddress = Address(base58'3N8STSY7dWpBYLiCimEQMkRizyWePSX3qQx')
123123
124124 let USDN = base58'4W19ndijcc2CsQa9HGW2dfXKTVXhnneWWttxXrtjPmEp'
125125
126126 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
127127
128-let WAVES_XTN_EX = Address(base58'3Mr73hWEyivaVitnLKceS6TuL2aZPZMXqjj')
128+let WAVES_XTN_EX = Address(base58'3MqjSoPUdGHaan9uhxwTnFw1uH7uZ8dgt8f')
129129
130130 let maxAllocationsAmount = 2
131131
132132 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
133133
134134 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
135135 case string: String =>
136136 fromBase58String(string)
137137 case nothing =>
138138 throw("Admin public key is empty")
139139 }
140140
141141
142142 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
143143
144144 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
145145
146146 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
147147
148148 func getAssetInfo (assetId) = match assetId {
149149 case id: ByteVector =>
150150 let stringId = toBase58String(id)
151151 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
152152 $Tuple3(stringId, info.name, info.decimals)
153153 case waves: Unit =>
154154 $Tuple3("WAVES", "WAVES", 8)
155155 case _ =>
156156 throw("Match error")
157157 }
158158
159159
160160 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
161161
162162
163163 func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
164164
165165
166166 let active = valueOrElse(getBoolean(this, keyActive), true)
167167
168168 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
169169
170170 func isActive () = if (if (active)
171171 then activeGlob
172172 else false)
173173 then unit
174174 else throw("DApp is inactive at this moment")
175175
176176
177177 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
178178 then unit
179179 else throw("Only admin can call this function")
180180
181181
182182 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
183183 then $Tuple4(unit, "WAVES", "WAVES", 8)
184184 else {
185185 let stringId = assetStr
186186 let id = fromBase58String(assetStr)
187187 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
188188 $Tuple4(id, stringId, info.name, info.decimals)
189189 }
190190
191191
192192 func buyInWaves (launchpadId,ticketsAmount,type) = {
193+ let $t051595309 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
194+ let buyAssetId = $t051595309._1
195+ let buyAssetStrId = $t051595309._2
196+ let buyAssetName = $t051595309._3
197+ let buyAssetDecimals = $t051595309._4
193198 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
194199 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
195- let $t053365480 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
196- let tokenId = $t053365480._1
197- let tokenStrAssetId = $t053365480._2
198- let tokenAssetName = $t053365480._3
199- let tokenDecimals = $t053365480._4
200+ let $t054915635 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
201+ let tokenId = $t054915635._1
202+ let tokenStrAssetId = $t054915635._2
203+ let tokenAssetName = $t054915635._3
204+ let tokenDecimals = $t054915635._4
200205 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
201206 let commissionPerTicket = if ((type == 1))
202207 then fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
203208 else fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
204209 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
205- let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), USDN]], nil)
210+ let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
206211 if ($isInstanceOf(@, "(Int, String)"))
207212 then @
208213 else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
209214 if ((amntToPay == amntToPay))
210215 then fraction(amntToPay, 101, 100)
211216 else throw("Strict value is not equal to itself.")
212217 }
213218
214219
215220 @Callable(i)
216221 func hashingRandom (launchpadId,hash) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]))
217222
218223
219224
220225 @Callable(i)
221226 func initCaller (address) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry(keyInitCaller, address)]))
222227
223228
224229
225230 @Callable(i)
226231 func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = valueOrElse(isActive(), if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
227232 then throw("Only project admin can call init function")
228233 else if ((size(i.payments) != 1))
229234 then throw("One attached payment expected")
230235 else if ((height > startHeight))
231236 then throw("Start height must be greater than blockchain height")
232237 else if (if (freezeAdditionalToken)
233238 then (size(freezeParams) != 3)
234239 else false)
235240 then throw("Freeze params list must have 3 items")
236241 else {
237242 let launchpadId = getLaunchpadNextId()
238243 let launchpadIdStr = toString(launchpadId)
239- let $t076197694 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
240- let pmtAmount = $t076197694._1
241- let pmtAssetId = $t076197694._2
242- let $t077037776 = getAssetInfo(pmtAssetId)
243- let pmtStrAssetId = $t077037776._1
244- let pmtAssetName = $t077037776._2
245- let pmtDecimals = $t077037776._3
244+ let $t077807855 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
245+ let pmtAmount = $t077807855._1
246+ let pmtAssetId = $t077807855._2
247+ let $t078647937 = getAssetInfo(pmtAssetId)
248+ let pmtStrAssetId = $t078647937._1
249+ let pmtAssetName = $t078647937._2
250+ let pmtDecimals = $t078647937._3
246251 let freezeAdditionalEntry = if (freezeAdditionalToken)
247252 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
248253 else nil
249254 ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyHCTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
250255 })
251256
252257
253258
254259 @Callable(i)
255260 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
256261 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
257262 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
258- let $t01055910703 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
259- let tokenId = $t01055910703._1
260- let tokenStrAssetId = $t01055910703._2
261- let tokenAssetName = $t01055910703._3
262- let tokenDecimals = $t01055910703._4
263+ let $t01072010864 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
264+ let tokenId = $t01072010864._1
265+ let tokenStrAssetId = $t01072010864._2
266+ let tokenAssetName = $t01072010864._3
267+ let tokenDecimals = $t01072010864._4
263268 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
264269 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
265- let $t01092011070 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
266- let buyAssetId = $t01092011070._1
267- let buyAssetStrId = $t01092011070._2
268- let buyAssetName = $t01092011070._3
269- let buyAssetDecimals = $t01092011070._4
270+ let $t01108111231 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
271+ let buyAssetId = $t01108111231._1
272+ let buyAssetStrId = $t01108111231._2
273+ let buyAssetName = $t01108111231._3
274+ let buyAssetDecimals = $t01108111231._4
270275 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
271276 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
272277 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
273278 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
274279 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
275280 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
276281 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
277- let $t01179512843 = if ((i.payments[0].assetId == unit))
282+ let $t01195613004 = if ((i.payments[0].assetId == unit))
278283 then {
279284 let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
280285 if ($isInstanceOf(@, "(Int, String, Int, Int)"))
281286 then @
282287 else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
283288 if ((amntToGet == amntToGet))
284289 then {
285290 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
286291 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
287292 let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
288293 if ($isInstanceOf(@, "(Int, String)"))
289294 then @
290295 else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
291296 if ((amntToPay == amntToPay))
292297 then {
293298 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
294299 if ((ex == ex))
295300 then {
296301 let change = (i.payments[0].amount - amntToGetTickets)
297302 let cEntry = if ((change > 0))
298303 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
299304 else nil
300305 $Tuple3(amntToGetTickets, buyAssetId, cEntry)
301306 }
302307 else throw("Strict value is not equal to itself.")
303308 }
304309 else throw("Strict value is not equal to itself.")
305310 }
306311 else throw("Strict value is not equal to itself.")
307312 }
308313 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
309- let pmtAmount = $t01179512843._1
310- let pmtAssetId = $t01179512843._2
311- let changeEntry = $t01179512843._3
314+ let pmtAmount = $t01195613004._1
315+ let pmtAssetId = $t01195613004._2
316+ let changeEntry = $t01195613004._3
312317 if ((activeLaunchpadId != launchpadId))
313318 then throw("There is no active launchpad or this launchpad is ended")
314319 else if ((startHeight > height))
315320 then throw("Launchpad sale not started yet")
316321 else if ((height > (startHeight + duration)))
317322 then throw("Launchpad sale ended")
318323 else if (if (!(freezeAdditionalToken))
319324 then if ((size(i.payments) != 1))
320325 then true
321326 else (pmtAssetId != buyAssetId)
322327 else false)
323328 then throw((("One attached payment in " + buyAssetName) + " expected"))
324329 else if (if (freezeAdditionalToken)
325330 then if ((size(i.payments) != 2))
326331 then true
327332 else (pmtAssetId != buyAssetId)
328333 else false)
329334 then {
330335 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
331336 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
332337 }
333338 else if (if ((0 >= allowedTicketsAmountAll))
334339 then true
335340 else (0 >= allowedTicketsAmount))
336341 then throw("Not enought SWOP in staking to buy tickets")
337342 else {
338343 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
339344 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
340345 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
341346 let change = (pmtAmount - allowedBuyPriceWithComission)
342347 if ((buyTicketAmount == 0))
343348 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
344349 else if ((change != 0))
345350 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
346351 else {
347352 let freezeAdditionalEntry = if (freezeAdditionalToken)
348353 then {
349354 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
350355 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
351- let $t01468614773 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
352- let pmtAmountFreeze = $t01468614773._1
353- let pmtAssetIdFreeze = $t01468614773._2
354- let $t01479014881 = getAssetInfo(pmtAssetId)
355- let pmtFreezeStrAssetId = $t01479014881._1
356- let pmtFreezeAssetName = $t01479014881._2
357- let pmtFreezeDecimals = $t01479014881._3
356+ let $t01484714934 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
357+ let pmtAmountFreeze = $t01484714934._1
358+ let pmtAssetIdFreeze = $t01484714934._2
359+ let $t01495115042 = getAssetInfo(pmtAssetId)
360+ let pmtFreezeStrAssetId = $t01495115042._1
361+ let pmtFreezeAssetName = $t01495115042._2
362+ let pmtFreezeDecimals = $t01495115042._3
358363 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
359364 if (if ((pmtFreezeStrAssetId != freezeTokenId))
360365 then true
361366 else (needFreezeTokens != pmtAmountFreeze))
362367 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
363368 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
364369 }
365370 else nil
366371 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
367372 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
368373 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
369374 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
370375 then ("," + boughtRange)
371376 else ("" + boughtRange)))
372377 let inv = if ((buyAssetId == USDN))
373378 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
374379 else 0
375380 if ((inv == inv))
376381 then {
377382 let baseEntry = (([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)] ++ freezeAdditionalEntry) ++ changeEntry)
378383 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
379384 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
380385 else baseEntry
381386 }
382387 else throw("Strict value is not equal to itself.")
383388 }
384389 }
385390 })
386391
387392
388393
389394 @Callable(i)
390395 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
391- let $t01696717042 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
392- let pmtAmount = $t01696717042._1
393- let pmtAssetId = $t01696717042._2
394- let $t01704717197 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
395- let buyAssetId = $t01704717197._1
396- let buyAssetStrId = $t01704717197._2
397- let buyAssetName = $t01704717197._3
398- let buyAssetDecimals = $t01704717197._4
396+ let $t01712817203 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
397+ let pmtAmount = $t01712817203._1
398+ let pmtAssetId = $t01712817203._2
399+ let $t01720817358 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
400+ let buyAssetId = $t01720817358._1
401+ let buyAssetStrId = $t01720817358._2
402+ let buyAssetName = $t01720817358._3
403+ let buyAssetDecimals = $t01720817358._4
399404 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
400405 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
401406 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
402407 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
403408 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
404409 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
405- let $t01786618010 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
406- let tokenId = $t01786618010._1
407- let tokenStrAssetId = $t01786618010._2
408- let tokenAssetName = $t01786618010._3
409- let tokenDecimals = $t01786618010._4
410+ let $t01802718171 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
411+ let tokenId = $t01802718171._1
412+ let tokenStrAssetId = $t01802718171._2
413+ let tokenAssetName = $t01802718171._3
414+ let tokenDecimals = $t01802718171._4
410415 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
411416 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
412417 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
413418 if ((activeLaunchpadId != launchpadId))
414419 then throw("There is no active launchpad or this launchpad is ended")
415420 else if ((startHeight > height))
416421 then throw("Launchpad sale not started yet")
417422 else if ((height > (startHeight + duration)))
418423 then throw("Launchpad sale ended")
419424 else if (if ((size(i.payments) != 1))
420425 then true
421426 else (pmtAssetId != buyAssetId))
422427 then throw((("One attached payment in " + buyAssetName) + " expected"))
423428 else if ((boughtAllocations >= maxAllocationsAmount))
424429 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
425430 else if (if ((allocationPriceWithComission != pmtAmount))
426431 then ((allocationPriceWithComission * 2) != pmtAmount)
427432 else false)
428433 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
429434 else {
430435 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
431436 let inv = if ((buyAssetId == USDN))
432437 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
433438 else 0
434439 if ((inv == inv))
435440 then {
436441 let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountBuyAssetInMarketing), (usdnInMarketing + pmtAmount))]
437442 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
438443 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
439444 else baseEntry
440445 }
441446 else throw("Strict value is not equal to itself.")
442447 }
443448 })
444449
445450
446451
447452 @Callable(i)
448453 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
449- let $t02026820418 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
450- let buyAssetId = $t02026820418._1
451- let buyAssetStrId = $t02026820418._2
452- let buyAssetName = $t02026820418._3
453- let buyAssetDecimals = $t02026820418._4
454+ let $t02042920579 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
455+ let buyAssetId = $t02042920579._1
456+ let buyAssetStrId = $t02042920579._2
457+ let buyAssetName = $t02042920579._3
458+ let buyAssetDecimals = $t02042920579._4
454459 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
455460 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
456461 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
457462 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
458463 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
459464 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
460- let $t02102821172 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
461- let tokenId = $t02102821172._1
462- let tokenStrAssetId = $t02102821172._2
463- let tokenAssetName = $t02102821172._3
464- let tokenDecimals = $t02102821172._4
465+ let $t02118921333 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
466+ let tokenId = $t02118921333._1
467+ let tokenStrAssetId = $t02118921333._2
468+ let tokenAssetName = $t02118921333._3
469+ let tokenDecimals = $t02118921333._4
465470 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
466471 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
467- let $t02140522453 = if ((i.payments[0].assetId == unit))
472+ let $t02156622614 = if ((i.payments[0].assetId == unit))
468473 then {
469474 let amntToGet = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
470475 if ($isInstanceOf(@, "(Int, String, Int, Int)"))
471476 then @
472477 else throw(($getType(@) + " couldn't be cast to (Int, String, Int, Int)")))._1
473478 if ((amntToGet == amntToGet))
474479 then {
475480 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
476481 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
477482 let amntToPay = ( let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
478483 if ($isInstanceOf(@, "(Int, String)"))
479484 then @
480485 else throw(($getType(@) + " couldn't be cast to (Int, String)")))._1
481486 if ((amntToPay == amntToPay))
482487 then {
483488 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
484489 if ((ex == ex))
485490 then {
486491 let change = (i.payments[0].amount - amntToGetTickets)
487492 let cEntry = if ((change > 0))
488493 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
489494 else nil
490495 $Tuple3(amntToGetTickets, buyAssetId, cEntry)
491496 }
492497 else throw("Strict value is not equal to itself.")
493498 }
494499 else throw("Strict value is not equal to itself.")
495500 }
496501 else throw("Strict value is not equal to itself.")
497502 }
498503 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
499- let pmtAmount = $t02140522453._1
500- let pmtAssetId = $t02140522453._2
501- let changeEntry = $t02140522453._3
504+ let pmtAmount = $t02156622614._1
505+ let pmtAssetId = $t02156622614._2
506+ let changeEntry = $t02156622614._3
502507 if ((activeLaunchpadId != launchpadId))
503508 then throw("There is no active launchpad or this launchpad is ended")
504509 else if (!(highCompetitionSale))
505510 then throw("There is no high competition sale for this launchpad")
506511 else if ((startHeight > height))
507512 then throw("Launchpad sale not started yet")
508513 else if ((height > (startHeight + duration)))
509514 then throw("Launchpad sale ended")
510515 else if (if ((size(i.payments) != 1))
511516 then true
512517 else (pmtAssetId != buyAssetId))
513518 then throw((("One attached payment in " + buyAssetName) + " expected"))
514519 else {
515520 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
516521 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
517522 let change = (pmtAmount - buyPriceWithComission)
518523 if ((buyTicketAmount == 0))
519524 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
520525 else if ((change != 0))
521526 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
522527 else {
523528 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
524529 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
525530 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
526531 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
527532 then ("," + boughtRange)
528533 else ("" + boughtRange)))
529534 let inv = if ((buyAssetId == USDN))
530535 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
531536 else 0
532537 if ((inv == inv))
533538 then {
534539 let baseEntry = ([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)] ++ changeEntry)
535540 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
536541 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
537542 else baseEntry
538543 }
539544 else throw("Strict value is not equal to itself.")
540545 }
541546 }
542547 })
543548
544549
545550
546551 @Callable(i)
547552 func finalise (launchpadId,vrfHeight,secretWord) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
548553 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
549554 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
550555 if ((calcHash != savedHash))
551556 then throw("vrf Height hash not matching")
552557 else {
553- let $t02540625556 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
554- let buyAssetId = $t02540625556._1
555- let buyAssetStrId = $t02540625556._2
556- let buyAssetName = $t02540625556._3
557- let buyAssetDecimals = $t02540625556._4
558+ let $t02556725717 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
559+ let buyAssetId = $t02556725717._1
560+ let buyAssetStrId = $t02556725717._2
561+ let buyAssetName = $t02556725717._3
562+ let buyAssetDecimals = $t02556725717._4
558563 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
559564 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
560565 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
561566 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
562567 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
563568 let swopfiHCBuyAssetAmount = valueOrElse(getInteger(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
564569 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
565570 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
566571 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
567572 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
568573 let unstakeAmount = ((((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission) - transferedBuyAsset)
569574 if ((transferedBuyAsset > ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiHCBuyAssetAmount)))
570575 then throw("Can't transfer negative value to project")
571576 else {
572577 let inv = if ((buyAssetId == USDN))
573578 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
574579 else 0
575580 if ((inv == inv))
576581 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (((swopfiMembersBuyAssetAmount + swopfiHCBuyAssetAmount) + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
577582 else throw("Strict value is not equal to itself.")
578583 }
579584 }
580585 }))
581586
582587
583588
584589 @Callable(i)
585590 func claim (launchpadId) = valueOrElse(isActive(), {
586591 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
587592 let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
588593 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
589594 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
590595 let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
591596 if ((finalizeHeight == 0))
592597 then throw("You can't claim because results are not finalized")
593598 else if (userClaimStatus)
594599 then throw("You are already claimed")
595600 else if (if (if ((boughtTickets == 0))
596601 then (boughtAllocations == 0)
597602 else false)
598603 then (boughtHCTickets == 0)
599604 else false)
600605 then throw("You can't claim because you don't buy anything")
601606 else {
602- let $t02864028817 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
603- let buyAssetId = $t02864028817._1
604- let buyAssetStrId = $t02864028817._2
605- let buyAssetName = $t02864028817._3
606- let buyAssetDecimals = $t02864028817._4
607+ let $t02880128978 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
608+ let buyAssetId = $t02880128978._1
609+ let buyAssetStrId = $t02880128978._2
610+ let buyAssetName = $t02880128978._3
611+ let buyAssetDecimals = $t02880128978._4
607612 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
608613 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
609614 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
610615 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
611616 let commissionHC = valueOrElse(getInteger(this, (toString(launchpadId) + keyHighCompetitionComission)), 0)
612617 let allowedAllocations = min([boughtAllocations, awailableAllocations])
613618 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
614619 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
615- let $t02973329877 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
616- let tokenId = $t02973329877._1
617- let tokenStrAssetId = $t02973329877._2
618- let tokenAssetName = $t02973329877._3
619- let tokenDecimals = $t02973329877._4
620+ let $t02989430038 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
621+ let tokenId = $t02989430038._1
622+ let tokenStrAssetId = $t02989430038._2
623+ let tokenAssetName = $t02989430038._3
624+ let tokenDecimals = $t02989430038._4
620625 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
621626 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
622627 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
623628 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
624629 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
625630 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
626631 let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commissionHC), 100)
627632 let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
628633 if (if (if ((0 > buyAssetForAllocations))
629634 then true
630635 else (0 > buyAssetForUnwonnedTickets))
631636 then true
632637 else (0 > buyAssetForHCUnwonnedTickets))
633638 then throw("Error with allowed allocation param or wonned tickets param please contact support")
634639 else {
635640 let returnedBuyAssetAmount = (((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) + buyAssetForAllocations) - claimedBuyToken)
636641 let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
637642 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
638643 else nil
639644 let inv = if (if ((returnedBuyAssetAmount > 0))
640645 then (buyAssetId == USDN)
641646 else false)
642647 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
643648 else 0
644649 if ((inv == inv))
645650 then {
646651 let claimedParams = split(valueOrElse(getString(this, (toString(launchpadId) + keyClaimParams)), "claimAll"), ",")
647652 if ((claimedParams[0] == "claimAll"))
648653 then {
649654 let transferTokens = if ((transferTokensAmount > 0))
650655 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
651656 else nil
652657 (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
653658 }
654659 else if ((claimedParams[0] == "claimPeriod"))
655660 then {
656661 let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
657662 let unlockPeriod = value(parseInt(claimedParams[2]))
658663 let blockHeight = (value(parseInt(claimedParams[3])) + finalizeHeight)
659664 let unlockHeight = (unlockPeriod + blockHeight)
660665 let allowedStartAmount = fraction(transferTokensAmount, value(parseInt(claimedParams[1])), 100)
661666 let allowedTokensAmount = (allowedStartAmount + (if ((height > blockHeight))
662667 then (fraction((transferTokensAmount - allowedStartAmount), (min([height, unlockHeight]) - blockHeight), unlockPeriod) - claimedTokens)
663668 else (0 - claimedTokens)))
664669 let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
665670 then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
666671 else nil
667672 if (if ((allowedTokensAmount > 0))
668673 then true
669674 else (returnedBuyAssetAmount > 0))
670675 then {
671676 let transferTokens = if ((allowedTokensAmount > 0))
672677 then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
673678 else nil
674679 (transferBuyAsset ++ transferTokens)
675680 }
676681 else throw("Nothing to claim")
677682 }
678683 else throw("Unknown claim function")
679684 }
680685 else throw("Strict value is not equal to itself.")
681686 }
682687 }
683688 })
684689
685690
686691
687692 @Callable(i)
688693 func claimFreezeToken (launchpadId) = valueOrElse(isActive(), {
689694 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
690695 if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
691696 then throw("You can't claim because results are not finalized")
692697 else if (!(freezeAdditionalToken))
693698 then throw("There are no additional token freezing for this launchpad")
694699 else {
695700 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
696701 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
697702 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
698703 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
699704 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
700705 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
701706 if ((userTokensFreezed == 0))
702707 then throw("You are already claimed your tokens or not paid anything")
703708 else if ((blockEndHeight > height))
704709 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
705710 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
706711 }
707712 })
708713
709714
710715
711716 @Callable(i)
712717 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
713718 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
714- let $t03604236192 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
715- let buyAssetId = $t03604236192._1
716- let buyAssetStrId = $t03604236192._2
717- let buyAssetName = $t03604236192._3
718- let buyAssetDecimals = $t03604236192._4
719+ let $t03620336353 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
720+ let buyAssetId = $t03620336353._1
721+ let buyAssetStrId = $t03620336353._2
722+ let buyAssetName = $t03620336353._3
723+ let buyAssetDecimals = $t03620336353._4
719724 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
720725 let inv = if (if ((amount > 0))
721726 then (buyAssetId == USDN)
722727 else false)
723728 then invoke(stakingUSDNAddress, "unlockNeutrino", [amount, toBase58String(USDN)], nil)
724729 else 0
725730 if ((inv == inv))
726731 then [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), (transferedBuyAsset + amount)), ScriptTransfer(projectAddress, amount, buyAssetId)]
727732 else throw("Strict value is not equal to itself.")
728733 }))
729734
730735
731736
732737 @Callable(i)
733738 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
734739 then throw("DApp already inactive")
735740 else [BooleanEntry(keyActive, false)])
736741
737742
738743
739744 @Callable(i)
740745 func activate () = valueOrElse(isAdminCall(i), if (active)
741746 then throw("DApp already active")
742747 else [BooleanEntry(keyActive, true)])
743748
744749
745750 @Verifier(tx)
746751 func verify () = {
747752 let multiSignedByAdmins = {
748753 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
749754 then 1
750755 else 0
751756 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
752757 then 1
753758 else 0
754759 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
755760 then 1
756761 else 0
757762 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
758763 }
759764 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
760765 then true
761766 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
762767 then true
763768 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
764769 then true
765770 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
766771 match tx {
767772 case dtx: DataTransaction =>
768773 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
769774 then signedByAdmin
770775 else false
771776 case _ =>
772777 multiSignedByAdmins
773778 }
774779 }
775780

github/deemru/w8io/3ef1775 
859.00 ms