tx · 8qMb324TTFRDxGjKhTaLRjBvT17cGtC58UYK6UuLmC4c

3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1:  -0.05000000 Waves

2023.08.23 14:10 [2723204] smart account 3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1 > SELF 0.00000000 Waves

{ "type": 13, "id": "8qMb324TTFRDxGjKhTaLRjBvT17cGtC58UYK6UuLmC4c", "fee": 5000000, "feeAssetId": null, "timestamp": 1692789031257, "version": 2, "chainId": 84, "sender": "3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1", "senderPublicKey": "Cm1uVVKocYw3S4eL9bYUMNZe5vpBPipgiiTx37eL6E8F", "proofs": [ "pRcY3pdX8Jd4fLsPDuYFsMooTXpr5g4sCYKb14xeb9GzUK9H49Fp312XjueCpyA4xxri6ZB8xL6v9rzq34dWD3w", "31fYEgt988z89GCaSZbvPovwJnS7uVpXCnGq6Mmi4rCrE8Wa8ZKWgxA4zB6igFGWAt9z9iThxoH1Fm8Mo1Lgttex" ], "script": "base64:BgJQCAISBAoCAQgSAwoBCBIUChIIAQEIAQEBAQEBAQEYBAEBBBgSBAoCAQgSBAoCAQgSBAoCAQgSBQoDAQEIEgMKAQESAwoBARIECgIBARIAEgBOAAlrZXlBY3RpdmUCBmFjdGl2ZQALa0FjdGl2ZUdsb2ICFGFjdGl2ZV9hbGxfY29udHJhY3RzAA9rZXlBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA9rZXlBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA9rZXlBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zACFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMCIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwASa2V5TGF1bmNocGFkTmV4dElkAhFsYXVuY2hwYWRfbmV4dF9pZAAUa2V5TGF1bmNocGFkQWN0aXZlSWQCE2xhdW5jaHBhZF9hY3RpdmVfaWQADWtleUluaXRDYWxsZXICC2luaXRfY2FsbGVyAAprZXlBZGRyZXNzAghfYWRkcmVzcwANa2V5SW5pdEhlaWdodAIMX2luaXRfaGVpZ2h0AA5rZXlTdGFydEhlaWdodAINX3N0YXJ0X2hlaWdodAARa2V5RmluYWxpc2VIZWlnaHQCEF9maW5hbGlzZV9oZWlnaHQADGtleUNvbWlzc2lvbgIKX2NvbWlzc2lvbgAKa2V5QXNzZXRJZAIJX2Fzc2V0X2lkABNrZXlUb3RhbFRva2VuQW1vdW50AhNfdG90YWxfdG9rZW5fYW1vdW50ABprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZAIVX3RvdGFsX2J1eV9hc3NldF9zb2xkABJrZXlUb2tlbnNQZXJUaWNrZXQCEl90b2tlbnNfcGVyX3RpY2tldAAQa2V5UHJpY2VQZXJUb2tlbgIQX3ByaWNlX3Blcl90b2tlbgAQa2V5U3dvcFBlclRpY2tldAIQX3N3b3BfcGVyX3RpY2tldAAWa2V5U3dvcGZpVGlja2V0c0Ftb3VudAIXX3RpY2tldHNfc3dvcGZpX21lbWJlcnMAF2tleUNhbXBhaWduVG9rZW5zQW1vdW50AhNfdG9rZW5zX2FjY2Vzc19saXN0ABZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uAhZfdG9rZW5zX3Blcl9hbGxvY2F0aW9uABNrZXlUaWNrZXRMYXN0TnVtYmVyAhNfdGlja2V0X2xhc3RfbnVtYmVyABNrZXlHb3Zlcm5hbmNlU3Rha2VkAg1fR1N3b3BfYW1vdW50AAxrZXlVc2VyUmVmSWQCB19yZWZfaWQADWtleVZlcmlmeUhhc2gCDF92ZXJpZnlfaGFzaAALa2V5RHVyYXRpb24CCV9kdXJhdGlvbgAca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwInX3RvdGFsX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nACVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkAjFfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmdfZmluYWxpemVkABNrZXlUcmFuc2ZlckJ1eUFzc2V0AhNfdHJhbnNmZXJfYnV5X2Fzc2V0ABRrZXlGcmVlelN3b3BEdXJhdGlvbgIVX2ZyZWV6ZV9zd29wX2R1cmF0aW9uABhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4CGF9mcmVlemVfYWRkaXRpb25hbF90b2tlbgAQa2V5RnJlZXplVG9rZW5JZAIQX2ZyZWV6ZV90b2tlbl9pZAAWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgIWX2ZyZWV6ZV90b2tlbl9kdXJhdGlvbgAXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQCGF9mcmVlemVfdG9rZW5fcGVyX3RpY2tldAALa2V5QnV5VG9rZW4CCl9idXlfdG9rZW4ADmtleUNsYWltUGFyYW1zAg1fY2xhaW1fcGFyYW1zABtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24CG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAWa2V5SGlnaENvbXBldGl0aW9uU2FsZQIWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAVa2V5SENUaWNrZXRMYXN0TnVtYmVyAiRfaGlnaF9jb21wZXRpdGlvbl90aWNrZXRfbGFzdF9udW1iZXIAGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAIZX3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwImX3RvdGFsX2J1eV9hc3NldF9zb2xkX2hpZ2hfY29tcGV0aXRpb24AFGtleVVzZXJDbGFpbWVkVG9rZW5zAg9fY2xhaW1lZF90b2tlbnMAF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zAhNfY2xhaW1lZF9idXlfdG9rZW5zABprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAIPX2JvdWdodF90aWNrZXRzAA5rZXlVc2VyVGlja2V0cwIPX3RpY2tldHNfbnVtYmVyABBrZXlVc2VySENUaWNrZXRzAiBfdGlja2V0c19udW1iZXJfaGlnaF9jb21wZXRpdGlvbgAca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAIgX2JvdWdodF90aWNrZXRzX2hpZ2hfY29tcGV0aXRpb24AG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwIdX2F2YWlsYWJsZV9wdXJjaGFzZV9tYXJrZXRpbmcAIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAiFfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwITX2JvdWdodF9hbGxvY2F0aW9ucwASa2V5VXNlckNsYWltU3RhdHVzAg1fY2xhaW1fc3RhdHVzABprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudAIPX3RpY2tldHNfcmVzdWx0AClrZXlVc2VyV2lubmVkSGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAIgX3RpY2tldHNfcmVzdWx0X2hpZ2hfY29tcGV0aXRpb24AEmtleVVzZXJGcmVlemVUb2tlbgIUX2ZyZWV6ZV90b2tlbl9hbW91bnQABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQAKZ292ZXJuYW5jZQkBB0FkZHJlc3MBARoBVMjcuWCotbWVPLfydaKVHLjfUPyH4RW0IgAQY29tbWlzc2lvbldhbGxldAkBB0FkZHJlc3MBARoBVIu67/x0Qcp5qolR7D86Zc0NPlB1AJuHDgASc3Rha2luZ1VTRE5BZGRyZXNzCQEHQWRkcmVzcwEBGgFUyzDUI2tI0RnhEQqOmg6HEPqnSokkZ5v9AARVU0ROASA0ARNWjmBG4n5bqbgBR4LnsQAmEpt25E5LoqB8nG3ugQASYWRtaW5QdWJLZXlTdGFraW5nASAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAMV0FWRVNfWFROX0VYCQEHQWRkcmVzcwEBGgFUE+06HqYmRCC3D4wq0lzrbsHxoPvs0AmgABRtYXhBbGxvY2F0aW9uc0Ftb3VudAACABFhY3RpdmVMYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUUa2V5TGF1bmNocGFkQWN0aXZlSWQA////////////AQELZ2V0QWRtaW5QdWIBC2tleUFkbWluUHViBAckbWF0Y2gwCQCdCAIFBm9yYWNsZQULa2V5QWRtaW5QdWIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQIZQWRtaW4gcHVibGljIGtleSBpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQELZ2V0QWRtaW5QdWIBBQ9rZXlBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBC2dldEFkbWluUHViAQUPa2V5QWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJAQtnZXRBZG1pblB1YgEFD2tleUFkbWluUHViS2V5MwEMZ2V0QXNzZXRJbmZvAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwBAhzdHJpbmdJZAkA2AQBBQJpZAQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmlkCQCsAgIJAKwCAgIGQXNzZXQgBQhzdHJpbmdJZAIOIGRvZXNuJ3QgZXhpc3QJAJUKAwUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCQCVCgMCBVdBVkVTAgVXQVZFUwAICQACAQILTWF0Y2ggZXJyb3IBEmdldExhdW5jaHBhZE5leHRJZAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5TGF1bmNocGFkTmV4dElkAAEBEHN0YWtlZFVzZG5BbW91bnQACQELdmFsdWVPckVsc2UCCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFBFVTRE4CAV8JAKUIAQUEdGhpcwAAAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUJa2V5QWN0aXZlBgAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHICBVdBVkVTCQCWCgQFBHVuaXQCBVdBVkVTAgVXQVZFUwAIBAhzdHJpbmdJZAUIYXNzZXRTdHIEAmlkCQDZBAEFCGFzc2V0U3RyBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCaWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlgoEBQJpZAUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAQpidXlJbldhdmVzAwtsYXVuY2hwYWRJZA10aWNrZXRzQW1vdW50BHR5cGUECyR0MDUxNTk1MzA5CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFCyR0MDUxNTk1MzA5Al8xBA1idXlBc3NldFN0cklkCAULJHQwNTE1OTUzMDkCXzIEDGJ1eUFzc2V0TmFtZQgFCyR0MDUxNTk1MzA5Al8zBBBidXlBc3NldERlY2ltYWxzCAULJHQwNTE1OTUzMDkCXzQECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQLJHQwNTQ5MTU2MzUJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAULJHQwNTQ5MTU2MzUCXzEED3Rva2VuU3RyQXNzZXRJZAgFCyR0MDU0OTE1NjM1Al8yBA50b2tlbkFzc2V0TmFtZQgFCyR0MDU0OTE1NjM1Al8zBA10b2tlbkRlY2ltYWxzCAULJHQwNTQ5MTU2MzUCXzQEC3RpY2tldFByaWNlCQBrAwUPdG9rZW5zUGVyVGlja2V0BQp0b2tlblByaWNlCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOBBNjb21taXNzaW9uUGVyVGlja2V0AwkAAAIFBHR5cGUAAQkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkCQBrAwULdGlja2V0UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAGQEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQoAAUAJAJEDAgoAAUAJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIVaG93TWFueVlvdVBheVJFQURPTkxZCQDMCAIJAMwIAgkApAMBBRBhbW50VG9HZXRUaWNrZXRzCQDMCAIFCmJ1eUFzc2V0SWQFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5CQBrAwUJYW1udFRvUGF5AGUAZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgwBaQENaGFzaGluZ1JhbmRvbQILbGF1bmNocGFkSWQEaGFzaAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gFBGhhc2gFA25pbAFpAQppbml0Q2FsbGVyAQdhZGRyZXNzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXIFB2FkZHJlc3MFA25pbAFpAQRpbml0Eg5wcm9qZWN0QWRkcmVzcwtzdGFydEhlaWdodAhkdXJhdGlvbghidXlUb2tlbgpjb21taXNzaW9uD3Rva2Vuc1BlclRpY2tldA1wcmljZVBlclRva2VuE3N3b3BmaVRpY2tldHNBbW91bnQUY2FtcGFpZ25Ub2tlbnNBbW91bnQTdG9rZW5zUGVyQWxsb2NhdGlvbg1zd29wUGVyVGlja2V0EnN3b3BGcmVlemVEdXJhdGlvbgtjbGFpbVBhcmFtcxNIaWdoQ29tcGV0aXRpb25TYWxlGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50FWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgxmcmVlemVQYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rZXlJbml0Q2FsbGVyAgAJAAIBAilPbmx5IHByb2plY3QgYWRtaW4gY2FuIGNhbGwgaW5pdCBmdW5jdGlvbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkAZgIFBmhlaWdodAULc3RhcnRIZWlnaHQJAAIBAjNTdGFydCBoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gYmxvY2tjaGFpbiBoZWlnaHQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuCQECIT0CCQCQAwEFDGZyZWV6ZVBhcmFtcwADBwkAAgECJEZyZWV6ZSBwYXJhbXMgbGlzdCBtdXN0IGhhdmUgMyBpdGVtcwQLbGF1bmNocGFkSWQJARJnZXRMYXVuY2hwYWROZXh0SWQABA5sYXVuY2hwYWRJZFN0cgkApAMBBQtsYXVuY2hwYWRJZAQLJHQwNzc4OTc4NjQJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwNzc4OTc4NjQCXzEECnBtdEFzc2V0SWQIBQskdDA3Nzg5Nzg2NAJfMgQLJHQwNzg3Mzc5NDYJAQxnZXRBc3NldEluZm8BBQpwbXRBc3NldElkBA1wbXRTdHJBc3NldElkCAULJHQwNzg3Mzc5NDYCXzEEDHBtdEFzc2V0TmFtZQgFCyR0MDc4NzM3OTQ2Al8yBAtwbXREZWNpbWFscwgFCyR0MDc4NzM3OTQ2Al8zBBVmcmVlemVBZGRpdGlvbmFsRW50cnkDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUQa2V5RnJlZXplVG9rZW5JZAkAkQMCBQxmcmVlemVQYXJhbXMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwACBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDXBtdFN0ckFzc2V0SWQCCl9sYXVuY2hwYWQFC2xhdW5jaHBhZElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrZXlMYXVuY2hwYWROZXh0SWQJAGQCBQtsYXVuY2hwYWRJZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFkZHJlc3MFDnByb2plY3RBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ1rZXlJbml0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDmtleVN0YXJ0SGVpZ2h0BQtzdGFydEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgULa2V5RHVyYXRpb24FCGR1cmF0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFC2tleUJ1eVRva2VuBQhidXlUb2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUUa2V5RnJlZXpTd29wRHVyYXRpb24FEnN3b3BGcmVlemVEdXJhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VG90YWxUb2tlbkFtb3VudAUJcG10QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFzc2V0SWQFDXBtdFN0ckFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDGtleUNvbWlzc2lvbgUKY29tbWlzc2lvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VGlja2V0TGFzdE51bWJlcgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUSa2V5VG9rZW5zUGVyVGlja2V0BQ90b2tlbnNQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVByaWNlUGVyVG9rZW4FDXByaWNlUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVN3b3BQZXJUaWNrZXQFDXN3b3BQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFFmtleVN3b3BmaVRpY2tldHNBbW91bnQFE3N3b3BmaVRpY2tldHNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFF2tleUNhbXBhaWduVG9rZW5zQW1vdW50BRRjYW1wYWlnblRva2Vuc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ5rZXlDbGFpbVBhcmFtcwkAuQkCBQtjbGFpbVBhcmFtcwIBLAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5SGlnaENvbXBldGl0aW9uU2FsZQUTSGlnaENvbXBldGl0aW9uU2FsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uBRhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAUcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGF1bmNocGFkQWN0aXZlSWQFC2xhdW5jaHBhZElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXICAAUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkBaQEQY29tbWl0U3dvcGZpU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMTA3MjkxMDg3MwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxMDcyOTEwODczAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxMDcyOTEwODczAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDEwNzI5MTA4NzMCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxMDcyOTEwODczAl80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTY29tbWlzc2lvblBlclRpY2tldAkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkBA0kdDAxMTA5MDExMjQwCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDExMDkwMTEyNDACXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxMTA5MDExMjQwAl8yBAxidXlBc3NldE5hbWUIBQ0kdDAxMTA5MDExMjQwAl8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTEwOTAxMTI0MAJfNAQLc3Rha2VkU3dvcHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292ZXJuYW5jZQkArAICCQClCAEIBQFpBmNhbGxlcgUTa2V5R292ZXJuYW5jZVN0YWtlZAAABBdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAkAaQIFC3N0YWtlZFN3b3BzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVN3b3BQZXJUaWNrZXQEE2JvdWdodFRpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAEFGFsbG93ZWRUaWNrZXRzQW1vdW50CQBlAgUXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwFE2JvdWdodFRpY2tldHNBbW91bnQEC3N0YXJ0SGVpZ2h0CQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQECGR1cmF0aW9uCQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5RHVyYXRpb24EFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgcEDSR0MDExOTY1MTMwOTgDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BAlhbW50VG9HZXQKAAFACQCRAwIKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VHZXRSRUFET05MWQkAzAgCCQDMCAIJAKQDAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgEABQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlhbW50VG9HZXQFCWFtbnRUb0dldAQNdGlja2V0c0Ftb3VudAkAaQIFCWFtbnRUb0dldAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0AwkAAAIFDXRpY2tldHNBbW91bnQAAAkAAgECIE5vdCBlbm91Z2h0IFdBVkVTIHRvIGJ1eSB0aWNrZXRzBBBhbW50VG9HZXRUaWNrZXRzCQBoAgUNdGlja2V0c0Ftb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAlhbW50VG9QYXkKAAFACQCRAwIKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VQYXlSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwkAzAgCBQpidXlBc3NldElkBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlhbW50VG9QYXkFCWFtbnRUb1BheQQCZXgJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0BQlhbW50VG9QYXkFA25pbAMJAAACBQJleAUCZXgEBmNoYW5nZQkAZQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQlhbW50VG9QYXkEBmNFbnRyeQMJAGYCBQZjaGFuZ2UAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmNoYW5nZQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwFA25pbAkAlQoDBRBhbW50VG9HZXRUaWNrZXRzBQpidXlBc3NldElkBQZjRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJUKAwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBAlwbXRBbW91bnQIBQ0kdDAxMTk2NTEzMDk4Al8xBApwbXRBc3NldElkCAUNJHQwMTE5NjUxMzA5OAJfMgQLY2hhbmdlRW50cnkIBQ0kdDAxMTk2NTEzMDk4Al8zAwkBAiE9AgURYWN0aXZlTGF1bmNocGFkSWQFC2xhdW5jaHBhZElkCQACAQI3VGhlcmUgaXMgbm8gYWN0aXZlIGxhdW5jaHBhZCBvciB0aGlzIGxhdW5jaHBhZCBpcyBlbmRlZAMJAGYCBQtzdGFydEhlaWdodAUGaGVpZ2h0CQACAQIeTGF1bmNocGFkIHNhbGUgbm90IHN0YXJ0ZWQgeWV0AwkAZgIFBmhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0BQhkdXJhdGlvbgkAAgECFExhdW5jaHBhZCBzYWxlIGVuZGVkAwMJAQEhAQUVZnJlZXplQWRkaXRpb25hbFRva2VuAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABBgkBAiE9AgUKcG10QXNzZXRJZAUKYnV5QXNzZXRJZAcJAAIBCQCsAgIJAKwCAgIYT25lIGF0dGFjaGVkIHBheW1lbnQgaW4gBQxidXlBc3NldE5hbWUCCSBleHBlY3RlZAMDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4DCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAIGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkBwQNZnJlZXplVG9rZW5JZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlGcmVlemVUb2tlbklkCQACAQkArAICCQCsAgIJAKwCAgIpVHdvIGF0dGFjaGVkIHBheW1lbnRzIGV4cGVjdGVkOiBGaXJzdCBpbiAFDGJ1eUFzc2V0TmFtZQIMLCBzZWNvbmQgaW4gBQ1mcmVlemVUb2tlbklkAwMJAGcCAAAFF2FsbG93ZWRUaWNrZXRzQW1vdW50QWxsBgkAZwIAAAUUYWxsb3dlZFRpY2tldHNBbW91bnQJAAIBAipOb3QgZW5vdWdodCBTV09QIGluIHN0YWtpbmcgdG8gYnV5IHRpY2tldHMED2J1eVRpY2tldEFtb3VudAkAaQIFCXBtdEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BBZhbGxvd2VkQnV5VGlja2V0QW1vdW50CQCXAwEJAMwIAgUPYnV5VGlja2V0QW1vdW50CQDMCAIFFGFsbG93ZWRUaWNrZXRzQW1vdW50BQNuaWwEHGFsbG93ZWRCdXlQcmljZVdpdGhDb21pc3Npb24JAGgCBRZhbGxvd2VkQnV5VGlja2V0QW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQEBmNoYW5nZQkAZQIFCXBtdEFtb3VudAUcYWxsb3dlZEJ1eVByaWNlV2l0aENvbWlzc2lvbgMJAAACBQ9idXlUaWNrZXRBbW91bnQAAAkAAgEJAKwCAgkArAICAgxOb3QgZW5vdWdodCAFDGJ1eUFzc2V0TmFtZQIPIHRvIGJ1eSB0aWNrZXRzAwkBAiE9AgUGY2hhbmdlAAAJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICFldyb25nIHBheW1lbnQuIFRvIGJ1eSAJAKQDAQUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAIYdGlja2V0cyB5b3UgbmVlZCB0byBwYXkgCQCkAwEFHGFsbG93ZWRCdXlQcmljZVdpdGhDb21pc3Npb24FDGJ1eUFzc2V0TmFtZQQVZnJlZXplQWRkaXRpb25hbEVudHJ5AwUVZnJlZXplQWRkaXRpb25hbFRva2VuBA1mcmVlemVUb2tlbklkCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleUZyZWV6ZVRva2VuSWQEFGZyZWV6ZVRva2VuUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFF2tleUZyZWV6ZVRva2VuUGVyVGlja2V0BA0kdDAxNDk0MTE1MDI4CQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwABB2Fzc2V0SWQED3BtdEFtb3VudEZyZWV6ZQgFDSR0MDE0OTQxMTUwMjgCXzEEEHBtdEFzc2V0SWRGcmVlemUIBQ0kdDAxNDk0MTE1MDI4Al8yBA0kdDAxNTA0NTE1MTM2CQEMZ2V0QXNzZXRJbmZvAQUKcG10QXNzZXRJZAQTcG10RnJlZXplU3RyQXNzZXRJZAgFDSR0MDE1MDQ1MTUxMzYCXzEEEnBtdEZyZWV6ZUFzc2V0TmFtZQgFDSR0MDE1MDQ1MTUxMzYCXzIEEXBtdEZyZWV6ZURlY2ltYWxzCAUNJHQwMTUwNDUxNTEzNgJfMwQQbmVlZEZyZWV6ZVRva2VucwkAaAIFFGZyZWV6ZVRva2VuUGVyVGlja2V0BQ9idXlUaWNrZXRBbW91bnQDAwkBAiE9AgUTcG10RnJlZXplU3RyQXNzZXRJZAUNZnJlZXplVG9rZW5JZAYJAQIhPQIFEG5lZWRGcmVlemVUb2tlbnMFD3BtdEFtb3VudEZyZWV6ZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQWW91IG5lZWQgdG8gYWRkIAkApAMBBRBuZWVkRnJlZXplVG9rZW5zAgEgBRJwbXRGcmVlemVBc3NldE5hbWUCFCBhcyBhIHNlY29uZCBwYXltZW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckZyZWV6ZVRva2VuBQ9wbXRBbW91bnRGcmVlemUFA25pbAUDbmlsBBh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDmtleVVzZXJUaWNrZXRzAgAEFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VGlja2V0TGFzdE51bWJlcgQLYm91Z2h0UmFuZ2UJAKwCAgkArAICCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyAAECAS0JAKQDAQkAZAIFFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQEG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwkArAICBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMDCQECIT0CBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMCAAkArAICAgEsBQtib3VnaHRSYW5nZQkArAICAgAFC2JvdWdodFJhbmdlBANpbnYDCQAAAgUKYnV5QXNzZXRJZAUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGxvY2tOZXV0cmlubwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQlwbXRBbW91bnQFA25pbAAAAwkAAAIFA2ludgUDaW52BAliYXNlRW50cnkJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUaa2V5VXNlckJvdWdodFRpY2tldHNBbW91bnQJAGQCBRNib3VnaHRUaWNrZXRzQW1vdW50BRZhbGxvd2VkQnV5VGlja2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRpY2tldExhc3ROdW1iZXIJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBRZhbGxvd2VkQnV5VGlja2V0QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlVc2VyVGlja2V0cwUbbmV3VXNlckJvdWdodFRpY2tldHNOdW1iZXJzBQNuaWwFFWZyZWV6ZUFkZGl0aW9uYWxFbnRyeQULY2hhbmdlRW50cnkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlVc2VyUmVmSWQJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlVc2VyUmVmSWQFBXJlZklkBQNuaWwFCWJhc2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRjb21taXRBY2Nlc3NMaXN0U2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDSR0MDE3MjIyMTcyOTcJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAUNJHQwMTcyMjIxNzI5NwJfMQQKcG10QXNzZXRJZAgFDSR0MDE3MjIyMTcyOTcCXzIEDSR0MDE3MzAyMTc0NTIJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMTczMDIxNzQ1MgJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDE3MzAyMTc0NTICXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDE3MzAyMTc0NTICXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAxNzMwMjE3NDUyAl80BBN1c2VyVXNkbkluTWFya2V0aW5nCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBSBrZXlVc2VyQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwAABA91c2RuSW5NYXJrZXRpbmcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRxrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAAAEEWJvdWdodEFsbG9jYXRpb25zCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRhrZXlVc2VyQm91Z2h0QWxsb2NhdGlvbnMAAAQKY29tbWlzc2lvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlDb21pc3Npb24ECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQTdG9rZW5zUGVyQWxsb2NhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uBA0kdDAxODEyMTE4MjY1CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUKa2V5QXNzZXRJZAQHdG9rZW5JZAgFDSR0MDE4MTIxMTgyNjUCXzEED3Rva2VuU3RyQXNzZXRJZAgFDSR0MDE4MTIxMTgyNjUCXzIEDnRva2VuQXNzZXROYW1lCAUNJHQwMTgxMjExODI2NQJfMwQNdG9rZW5EZWNpbWFscwgFDSR0MDE4MTIxMTgyNjUCXzQEHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24JAGsDCQBrAwUKdG9rZW5QcmljZQUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgkAZAIAZAUKY29tbWlzc2lvbgBkBAtzdGFydEhlaWdodAkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleVN0YXJ0SGVpZ2h0BAhkdXJhdGlvbgkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uAwkBAiE9AgURYWN0aXZlTGF1bmNocGFkSWQFC2xhdW5jaHBhZElkCQACAQI3VGhlcmUgaXMgbm8gYWN0aXZlIGxhdW5jaHBhZCBvciB0aGlzIGxhdW5jaHBhZCBpcyBlbmRlZAMJAGYCBQtzdGFydEhlaWdodAUGaGVpZ2h0CQACAQIeTGF1bmNocGFkIHNhbGUgbm90IHN0YXJ0ZWQgeWV0AwkAZgIFBmhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0BQhkdXJhdGlvbgkAAgECFExhdW5jaHBhZCBzYWxlIGVuZGVkAwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQIhPQIFCnBtdEFzc2V0SWQFCmJ1eUFzc2V0SWQJAAIBCQCsAgIJAKwCAgIYT25lIGF0dGFjaGVkIHBheW1lbnQgaW4gBQxidXlBc3NldE5hbWUCCSBleHBlY3RlZAMJAGcCBRFib3VnaHRBbGxvY2F0aW9ucwUUbWF4QWxsb2NhdGlvbnNBbW91bnQJAAIBCQCsAgIJAKwCAgIRWW91IGNhbiBidXkgb25seSAJAKQDAQUUbWF4QWxsb2NhdGlvbnNBbW91bnQCC2FsbG9jYXRpb25zAwMJAQIhPQIFHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24FCXBtdEFtb3VudAkBAiE9AgkAaAIFHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24AAgUJcG10QW1vdW50BwkAAgEJAKwCAgkArAICCQCsAgICMldyb25nIHBheW1lbnQuIFlvdSBjYW4gYnV5IDEgb3IgMiBhbGxvY2F0aW9ucyBmb3IgCQCkAwEFHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24FDGJ1eUFzc2V0TmFtZQIPIHBlciBhbGxvY2F0aW9uBBRidXlBbGxvY2F0aW9uc0Ftb3VudAkAaQIFCXBtdEFtb3VudAUcYWxsb2NhdGlvblByaWNlV2l0aENvbWlzc2lvbgQDaW52AwkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAgxsb2NrTmV1dHJpbm8FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUJcG10QW1vdW50BQNuaWwAAAMJAAACBQNpbnYFA2ludgQJYmFzZUVudHJ5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zCQBkAgURYm91Z2h0QWxsb2NhdGlvbnMFFGJ1eUFsbG9jYXRpb25zQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUga2V5VXNlckFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcJAGQCBRN1c2VyVXNkbkluTWFya2V0aW5nBQlwbXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwkAZAIFD3VzZG5Jbk1hcmtldGluZwUJcG10QW1vdW50BQNuaWwDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlVc2VyUmVmSWQJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlVc2VyUmVmSWQFBXJlZklkBQNuaWwFCWJhc2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARljb21taXRIaWdoQ29tcGV0aXRpb25TYWxlAgtsYXVuY2hwYWRJZAVyZWZJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNJHQwMjA1MjMyMDY3MwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQEFdmFsdWUBCQCdCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5QnV5VG9rZW4ECmJ1eUFzc2V0SWQIBQ0kdDAyMDUyMzIwNjczAl8xBA1idXlBc3NldFN0cklkCAUNJHQwMjA1MjMyMDY3MwJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMjA1MjMyMDY3MwJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDIwNTIzMjA2NzMCXzQEC3N0YXJ0SGVpZ2h0CQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQECGR1cmF0aW9uCQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5RHVyYXRpb24EFWJvdWdodEhDVGlja2V0c0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAAABBNoaWdoQ29tcGV0aXRpb25TYWxlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5SGlnaENvbXBldGl0aW9uU2FsZQcECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMjEyODMyMTQyNwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAyMTI4MzIxNDI3Al8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAyMTI4MzIxNDI3Al8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDIxMjgzMjE0MjcCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAyMTI4MzIxNDI3Al80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTY29tbWlzc2lvblBlclRpY2tldAkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgBkBA0kdDAyMTY2MDIyNzkzAwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUEdW5pdAQJYW1udFRvR2V0CgABQAkAkQMCCgABQAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAhVob3dNYW55WW91R2V0UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIBAAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0AAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUJYW1udFRvR2V0BQlhbW50VG9HZXQEDXRpY2tldHNBbW91bnQJAGkCBQlhbW50VG9HZXQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAMJAAACBQ10aWNrZXRzQW1vdW50AAAJAAIBAiBOb3QgZW5vdWdodCBXQVZFUyB0byBidXkgdGlja2V0cwQQYW1udFRvR2V0VGlja2V0cwkAaAIFDXRpY2tldHNBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQJYW1udFRvUGF5CgABQAkAkQMCCgABQAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAhVob3dNYW55WW91UGF5UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMJAMwIAgUKYnV5QXNzZXRJZAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0AAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUJYW1udFRvUGF5BQlhbW50VG9QYXkEAmV4CQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW50VG9HZXRUaWNrZXRzBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAUJYW1udFRvUGF5BQNuaWwDCQAAAgUCZXgFAmV4BAZjaGFuZ2UJAGUCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUJYW1udFRvUGF5BAZjRW50cnkDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZjaGFuZ2UICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBQNuaWwJAJUKAwUQYW1udFRvR2V0VGlja2V0cwUKYnV5QXNzZXRJZAUGY0VudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCVCgMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAQJcG10QW1vdW50CAUNJHQwMjE2NjAyMjc5MwJfMQQKcG10QXNzZXRJZAgFDSR0MDIxNjYwMjI3OTMCXzIEC2NoYW5nZUVudHJ5CAUNJHQwMjE2NjAyMjc5MwJfMwMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQEBIQEFE2hpZ2hDb21wZXRpdGlvblNhbGUJAAIBAjRUaGVyZSBpcyBubyBoaWdoIGNvbXBldGl0aW9uIHNhbGUgZm9yIHRoaXMgbGF1bmNocGFkAwkAZgIFC3N0YXJ0SGVpZ2h0BQZoZWlnaHQJAAIBAh5MYXVuY2hwYWQgc2FsZSBub3Qgc3RhcnRlZCB5ZXQDCQBmAgUGaGVpZ2h0CQBkAgULc3RhcnRIZWlnaHQFCGR1cmF0aW9uCQACAQIUTGF1bmNocGFkIHNhbGUgZW5kZWQDAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABBgkBAiE9AgUKcG10QXNzZXRJZAUKYnV5QXNzZXRJZAkAAgEJAKwCAgkArAICAhhPbmUgYXR0YWNoZWQgcGF5bWVudCBpbiAFDGJ1eUFzc2V0TmFtZQIJIGV4cGVjdGVkBA9idXlUaWNrZXRBbW91bnQJAGkCBQlwbXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQVYnV5UHJpY2VXaXRoQ29taXNzaW9uCQBoAgUPYnV5VGlja2V0QW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQEBmNoYW5nZQkAZQIFCXBtdEFtb3VudAUVYnV5UHJpY2VXaXRoQ29taXNzaW9uAwkAAAIFD2J1eVRpY2tldEFtb3VudAAACQACAQkArAICCQCsAgICDE5vdCBlbm91Z2h0IAUMYnV5QXNzZXROYW1lAg8gdG8gYnV5IHRpY2tldHMDCQECIT0CBQZjaGFuZ2UAAAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIWV3JvbmcgcGF5bWVudC4gVG8gYnV5IAkApAMBBQ9idXlUaWNrZXRBbW91bnQCGHRpY2tldHMgeW91IG5lZWQgdG8gcGF5IAkApAMBBRVidXlQcmljZVdpdGhDb21pc3Npb24FDGJ1eUFzc2V0TmFtZQQYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlVc2VySENUaWNrZXRzAgAEFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUVa2V5SENUaWNrZXRMYXN0TnVtYmVyBAtib3VnaHRSYW5nZQkArAICCQCsAgIJAKQDAQkAZAIFFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIAAQIBLQkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgUPYnV5VGlja2V0QW1vdW50BBtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMJAKwCAgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAwkBAiE9AgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAgAJAKwCAgIBLAULYm91Z2h0UmFuZ2UJAKwCAgIABQtib3VnaHRSYW5nZQQDaW52AwkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAgxsb2NrTmV1dHJpbm8FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUJcG10QW1vdW50BQNuaWwAAAMJAAACBQNpbnYFA2ludgQJYmFzZUVudHJ5CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRxrZXlVc2VySENCb3VnaHRUaWNrZXRzQW1vdW50CQBkAgUVYm91Z2h0SENUaWNrZXRzQW1vdW50BQ9idXlUaWNrZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUVa2V5SENUaWNrZXRMYXN0TnVtYmVyCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgUPYnV5VGlja2V0QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlVc2VySENUaWNrZXRzBRtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMFA25pbAULY2hhbmdlRW50cnkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlVc2VyUmVmSWQJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlVc2VyUmVmSWQFBXJlZklkBQNuaWwFCWJhc2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhmaW5hbGlzZQMLbGF1bmNocGFkSWQJdnJmSGVpZ2h0CnNlY3JldFdvcmQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkECXNhdmVkSGFzaAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ1rZXlWZXJpZnlIYXNoBAhjYWxjSGFzaAkA2AQBCQD3AwEJAMsBAgkAmgMBBQl2cmZIZWlnaHQJAJsDAQUKc2VjcmV0V29yZAMJAQIhPQIFCGNhbGNIYXNoBQlzYXZlZEhhc2gJAAIBAhx2cmYgSGVpZ2h0IGhhc2ggbm90IG1hdGNoaW5nBA0kdDAyNTc0NjI1ODk2CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDI1NzQ2MjU4OTYCXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAyNTc0NjI1ODk2Al8yBAxidXlBc3NldE5hbWUIBQ0kdDAyNTc0NjI1ODk2Al8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMjU3NDYyNTg5NgJfNAQOcHJvamVjdEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUKa2V5QWRkcmVzcwQKY29tbWlzc2lvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlDb21pc3Npb24EDGNvbW1pc3Npb25IQwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24EEnRyYW5zZmVyZWRCdXlBc3NldAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRyYW5zZmVyQnV5QXNzZXQAAAQbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGmtleVRvdGFsQW1vdW50QnV5QXNzZXRTb2xkBBZzd29wZmlIQ0J1eUFzc2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwAABBZzd29wZmlNZW1iZXJzQ29taXNzaW9uCQBrAwUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BQpjb21taXNzaW9uAGQEEXN3b3BmaUhDQ29taXNzaW9uCQBrAwUWc3dvcGZpSENCdXlBc3NldEFtb3VudAUMY29tbWlzc2lvbkhDAGQEHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBSVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkBBJtYXJrZXRpbmdDb21pc3Npb24JAGsDBR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFCmNvbW1pc3Npb24AZAQNdW5zdGFrZUFtb3VudAkAZQIJAGQCCQBkAgkAZAIJAGQCCQBkAgUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFFnN3b3BmaU1lbWJlcnNDb21pc3Npb24FEm1hcmtldGluZ0NvbWlzc2lvbgUWc3dvcGZpSENCdXlBc3NldEFtb3VudAURc3dvcGZpSENDb21pc3Npb24FEnRyYW5zZmVyZWRCdXlBc3NldAMJAGYCBRJ0cmFuc2ZlcmVkQnV5QXNzZXQJAGQCCQBkAgUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQJAAIBAihDYW4ndCB0cmFuc2ZlciBuZWdhdGl2ZSB2YWx1ZSB0byBwcm9qZWN0BANpbnYDCQAAAgUKYnV5QXNzZXRJZAUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDnVubG9ja05ldXRyaW5vCQDMCAIFDXVuc3Rha2VBbW91bnQJAMwIAgkA2AQBBQRVU0ROBQNuaWwFA25pbAAAAwkAAAIFA2ludgUDaW52CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEWtleUZpbmFsaXNlSGVpZ2h0BQZoZWlnaHQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOcHJvamVjdEFkZHJlc3MJAGUCCQBkAgkAZAIFG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudAUWc3dvcGZpSENCdXlBc3NldEFtb3VudAUedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nBRJ0cmFuc2ZlcmVkQnV5QXNzZXQFCmJ1eUFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUQY29tbWlzc2lvbldhbGxldAkAZAIJAGQCBRZzd29wZmlNZW1iZXJzQ29taXNzaW9uBRJtYXJrZXRpbmdDb21pc3Npb24FEXN3b3BmaUhDQ29taXNzaW9uBQpidXlBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0BC2xhdW5jaHBhZElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA1ib3VnaHRUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAAABA9ib3VnaHRIQ1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQAAAQRYm91Z2h0QWxsb2NhdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwAABA91c2VyQ2xhaW1TdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJDbGFpbVN0YXR1cwcEDmZpbmFsaXplSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAURa2V5RmluYWxpc2VIZWlnaHQAAAMJAAACBQ5maW5hbGl6ZUhlaWdodAAACQACAQIxWW91IGNhbid0IGNsYWltIGJlY2F1c2UgcmVzdWx0cyBhcmUgbm90IGZpbmFsaXplZAMFD3VzZXJDbGFpbVN0YXR1cwkAAgECF1lvdSBhcmUgYWxyZWFkeSBjbGFpbWVkAwMDCQAAAgUNYm91Z2h0VGlja2V0cwAACQAAAgURYm91Z2h0QWxsb2NhdGlvbnMAAAcJAAACBQ9ib3VnaHRIQ1RpY2tldHMAAAcJAAIBAi5Zb3UgY2FuJ3QgY2xhaW0gYmVjYXVzZSB5b3UgZG9uJ3QgYnV5IGFueXRoaW5nBA0kdDAyODk4MDI5MTU3CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgkA2AQBBQRVU0ROBApidXlBc3NldElkCAUNJHQwMjg5ODAyOTE1NwJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDI4OTgwMjkxNTcCXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDI4OTgwMjkxNTcCXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyODk4MDI5MTU3Al80BA13b25uZWRUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudAAABA93b25uZWRIQ1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFKWtleVVzZXJXaW5uZWRIaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50AAAEFGF3YWlsYWJsZUFsbG9jYXRpb25zCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRtrZXlVc2VyQXZhaWxhYmxlQWxsb2NhdGlvbnMAAAQKY29tbWlzc2lvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlDb21pc3Npb24EDGNvbW1pc3Npb25IQwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgAABBJhbGxvd2VkQWxsb2NhdGlvbnMJAJcDAQkAzAgCBRFib3VnaHRBbGxvY2F0aW9ucwkAzAgCBRRhd2FpbGFibGVBbGxvY2F0aW9ucwUDbmlsBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4ED3Rva2Vuc1BlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlUb2tlbnNQZXJUaWNrZXQEDSR0MDMwMDczMzAyMTcJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAUNJHQwMzAwNzMzMDIxNwJfMQQPdG9rZW5TdHJBc3NldElkCAUNJHQwMzAwNzMzMDIxNwJfMgQOdG9rZW5Bc3NldE5hbWUIBQ0kdDAzMDA3MzMwMjE3Al8zBA10b2tlbkRlY2ltYWxzCAUNJHQwMzAwNzMzMDIxNwJfNAQLdGlja2V0UHJpY2UJAGsDBQ90b2tlbnNQZXJUaWNrZXQFCnRva2VuUHJpY2UJAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04EE3Rva2Vuc1BlckFsbG9jYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgQUdHJhbnNmZXJUb2tlbnNBbW91bnQJAGQCCQBkAgkAaAIFDXdvbm5lZFRpY2tldHMFD3Rva2Vuc1BlclRpY2tldAkAaAIFEmFsbG93ZWRBbGxvY2F0aW9ucwUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAaAIFD3dvbm5lZEhDVGlja2V0cwUPdG9rZW5zUGVyVGlja2V0BBtub3RBbGxvd2VkQWxsb2NhdGlvbnNUb2tlbnMJAGgCCQBlAgURYm91Z2h0QWxsb2NhdGlvbnMFEmFsbG93ZWRBbGxvY2F0aW9ucwUTdG9rZW5zUGVyQWxsb2NhdGlvbgQWYnV5QXNzZXRGb3JBbGxvY2F0aW9ucwkAawMJAGsDBRtub3RBbGxvd2VkQWxsb2NhdGlvbnNUb2tlbnMFCnRva2VuUHJpY2UJAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04JAGQCAGQFCmNvbW1pc3Npb24AZAQaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMJAGsDCQBoAgkAZQIFDWJvdWdodFRpY2tldHMFDXdvbm5lZFRpY2tldHMFC3RpY2tldFByaWNlCQBkAgBkBQpjb21taXNzaW9uAGQEHGJ1eUFzc2V0Rm9ySENVbndvbm5lZFRpY2tldHMJAGsDCQBoAgkAZQIFD2JvdWdodEhDVGlja2V0cwUPd29ubmVkSENUaWNrZXRzBQt0aWNrZXRQcmljZQkAZAIAZAUMY29tbWlzc2lvbkhDAGQED2NsYWltZWRCdXlUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUXa2V5VXNlckNsYWltZWRCdXlUb2tlbnMAAAMDAwkAZgIAAAUWYnV5QXNzZXRGb3JBbGxvY2F0aW9ucwYJAGYCAAAFGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzBgkAZgIAAAUcYnV5QXNzZXRGb3JIQ1Vud29ubmVkVGlja2V0cwkAAgECUkVycm9yIHdpdGggYWxsb3dlZCBhbGxvY2F0aW9uIHBhcmFtIG9yIHdvbm5lZCB0aWNrZXRzIHBhcmFtIHBsZWFzZSBjb250YWN0IHN1cHBvcnQEFnJldHVybmVkQnV5QXNzZXRBbW91bnQJAGUCCQBkAgkAZAIFGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzBRxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzBRZidXlBc3NldEZvckFsbG9jYXRpb25zBQ9jbGFpbWVkQnV5VG9rZW4EEHRyYW5zZmVyQnV5QXNzZXQDCQBmAgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAUKYnV5QXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50BQNuaWwFA25pbAQDaW52AwMJAGYCBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50AAAJAAACBQpidXlBc3NldElkBQRVU0ROBwkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDnVubG9ja05ldXRyaW5vCQDMCAIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQJAMwIAgkA2AQBBQRVU0ROBQNuaWwFA25pbAAAAwkAAAIFA2ludgUDaW52BA1jbGFpbWVkUGFyYW1zCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlDbGFpbVBhcmFtcwIIY2xhaW1BbGwCASwDCQAAAgkAkQMCBQ1jbGFpbWVkUGFyYW1zAAACCGNsYWltQWxsBA50cmFuc2ZlclRva2VucwMJAGYCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUUdHJhbnNmZXJUb2tlbnNBbW91bnQFB3Rva2VuSWQFA25pbAUDbmlsCQDOCAIJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJDbGFpbVN0YXR1cwYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRRrZXlVc2VyQ2xhaW1lZFRva2VucwUUdHJhbnNmZXJUb2tlbnNBbW91bnQFA25pbAUOdHJhbnNmZXJUb2tlbnMFEHRyYW5zZmVyQnV5QXNzZXQDCQAAAgkAkQMCBQ1jbGFpbWVkUGFyYW1zAAACC2NsYWltUGVyaW9kBA1jbGFpbWVkVG9rZW5zCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRRrZXlVc2VyQ2xhaW1lZFRva2VucwAABAx1bmxvY2tQZXJpb2QJAQV2YWx1ZQEJALYJAQkAkQMCBQ1jbGFpbWVkUGFyYW1zAAIEC2Jsb2NrSGVpZ2h0CQBkAgkBBXZhbHVlAQkAtgkBCQCRAwIFDWNsYWltZWRQYXJhbXMAAwUOZmluYWxpemVIZWlnaHQEDHVubG9ja0hlaWdodAkAZAIFDHVubG9ja1BlcmlvZAULYmxvY2tIZWlnaHQEEmFsbG93ZWRTdGFydEFtb3VudAkAawMFFHRyYW5zZmVyVG9rZW5zQW1vdW50CQEFdmFsdWUBCQC2CQEJAJEDAgUNY2xhaW1lZFBhcmFtcwABAGQEE2FsbG93ZWRUb2tlbnNBbW91bnQJAGQCBRJhbGxvd2VkU3RhcnRBbW91bnQDCQBmAgUGaGVpZ2h0BQtibG9ja0hlaWdodAkAZQIJAGsDCQBlAgUUdHJhbnNmZXJUb2tlbnNBbW91bnQFEmFsbG93ZWRTdGFydEFtb3VudAkAZQIJAJcDAQkAzAgCBQZoZWlnaHQJAMwIAgUMdW5sb2NrSGVpZ2h0BQNuaWwFC2Jsb2NrSGVpZ2h0BQx1bmxvY2tQZXJpb2QFDWNsYWltZWRUb2tlbnMJAGUCAAAFDWNsYWltZWRUb2tlbnMEEGNsYWltU3RhdHVzRW50cnkDCQBnAgUUdHJhbnNmZXJUb2tlbnNBbW91bnQJAGQCBQ1jbGFpbWVkVG9rZW5zBRNhbGxvd2VkVG9rZW5zQW1vdW50CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBgUDbmlsBQNuaWwDAwkAZgIFE2FsbG93ZWRUb2tlbnNBbW91bnQAAAYJAGYCBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50AAAEDnRyYW5zZmVyVG9rZW5zAwkAZgIFE2FsbG93ZWRUb2tlbnNBbW91bnQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zCQBkAgUNY2xhaW1lZFRva2VucwUTYWxsb3dlZFRva2Vuc0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFE2FsbG93ZWRUb2tlbnNBbW91bnQFB3Rva2VuSWQFA25pbAUDbmlsCQDOCAIFEHRyYW5zZmVyQnV5QXNzZXQFDnRyYW5zZmVyVG9rZW5zCQACAQIQTm90aGluZyB0byBjbGFpbQkAAgECFlVua25vd24gY2xhaW0gZnVuY3Rpb24JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQY2xhaW1GcmVlemVUb2tlbgELbGF1bmNocGFkSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgcDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAURa2V5RmluYWxpc2VIZWlnaHQJAAIBAjFZb3UgY2FuJ3QgY2xhaW0gYmVjYXVzZSByZXN1bHRzIGFyZSBub3QgZmluYWxpemVkAwkBASEBBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAAIBAjlUaGVyZSBhcmUgbm8gYWRkaXRpb25hbCB0b2tlbiBmcmVlemluZyBmb3IgdGhpcyBsYXVuY2hwYWQEB3Rva2VuSWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlGcmVlemVUb2tlbklkBBF1c2VyVG9rZW5zRnJlZXplZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckZyZWV6ZVRva2VuAAAEC3N0YXJ0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQAAAQIZHVyYXRpb24JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlEdXJhdGlvbgAABBNmcmVlemVUb2tlbkR1cmF0aW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFmtleUZyZWV6ZVRva2VuRHVyYXRpb24EDmJsb2NrRW5kSGVpZ2h0CQBkAgkAZAIFC3N0YXJ0SGVpZ2h0BQhkdXJhdGlvbgUTZnJlZXplVG9rZW5EdXJhdGlvbgMJAAACBRF1c2VyVG9rZW5zRnJlZXplZAAACQACAQI4WW91IGFyZSBhbHJlYWR5IGNsYWltZWQgeW91ciB0b2tlbnMgb3Igbm90IHBhaWQgYW55dGhpbmcDCQBmAgUOYmxvY2tFbmRIZWlnaHQFBmhlaWdodAkAAgEJAKwCAgIZWW91ciB0b2tlbnMgZnJlZXplZCB0ZWVsIAkApAMBBQ5ibG9ja0VuZEhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFEXVzZXJUb2tlbnNGcmVlemVkBQd0b2tlbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckZyZWV6ZVRva2VuAAAFA25pbAFpARB0cmFuc2ZlckJ1eUFzc2V0AgtsYXVuY2hwYWRJZAZhbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkEDnByb2plY3RBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFkZHJlc3MEDSR0MDM2MzgyMzY1MzIJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMzYzODIzNjUzMgJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDM2MzgyMzY1MzICXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDM2MzgyMzY1MzICXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAzNjM4MjM2NTMyAl80BBJ0cmFuc2ZlcmVkQnV5QXNzZXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUcmFuc2ZlckJ1eUFzc2V0AAAEA2ludgMDCQBmAgUGYW1vdW50AAAJAAACBQpidXlBc3NldElkBQRVU0ROBwkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDnVubG9ja05ldXRyaW5vCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VHJhbnNmZXJCdXlBc3NldAkAZAIFEnRyYW5zZmVyZWRCdXlBc3NldAUGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDnByb2plY3RBZGRyZXNzBQZhbW91bnQFCmJ1eUFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEFBmFjdGl2ZQkAAgECFURBcHAgYWxyZWFkeSBpbmFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUJa2V5QWN0aXZlBwUDbmlsAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMFBmFjdGl2ZQkAAgECE0RBcHAgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCWtleUFjdGl2ZQYFA25pbAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQNc2lnbmVkQnlBZG1pbgMDAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkyBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkzBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUSYWRtaW5QdWJLZXlTdGFraW5nBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAg9EYXRhVHJhbnNhY3Rpb24EA2R0eAUHJG1hdGNoMAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUGb3JhY2xlBSFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMHBQ1zaWduZWRCeUFkbWluBwUTbXVsdGlTaWduZWRCeUFkbWlucyn+Oew=", "height": 2723204, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6fXQU633NvXpTrp9JYc1tekuydQtKwEk2fu57G21dN1x Next: none Diff:
OldNewDifferences
286286 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
287287 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
288288 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
289- let $t01196513105 = if ((i.payments[0].assetId == unit))
289+ let $t01196513098 = if ((i.payments[0].assetId == unit))
290290 then {
291291 let amntToGet = {
292292 let @ = ({
322322 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
323323 if ((ex == ex))
324324 then {
325- let change = (i.payments[0].amount - amntToGetTickets)
325+ let change = (i.payments[0].amount - amntToPay)
326326 let cEntry = if ((change > 0))
327327 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
328328 else nil
336336 else throw("Strict value is not equal to itself.")
337337 }
338338 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
339- let pmtAmount = $t01196513105._1
340- let pmtAssetId = $t01196513105._2
341- let changeEntry = $t01196513105._3
339+ let pmtAmount = $t01196513098._1
340+ let pmtAssetId = $t01196513098._2
341+ let changeEntry = $t01196513098._3
342342 if ((activeLaunchpadId != launchpadId))
343343 then throw("There is no active launchpad or this launchpad is ended")
344344 else if ((startHeight > height))
378378 then {
379379 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
380380 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
381- let $t01494815035 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
382- let pmtAmountFreeze = $t01494815035._1
383- let pmtAssetIdFreeze = $t01494815035._2
384- let $t01505215143 = getAssetInfo(pmtAssetId)
385- let pmtFreezeStrAssetId = $t01505215143._1
386- let pmtFreezeAssetName = $t01505215143._2
387- let pmtFreezeDecimals = $t01505215143._3
381+ let $t01494115028 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
382+ let pmtAmountFreeze = $t01494115028._1
383+ let pmtAssetIdFreeze = $t01494115028._2
384+ let $t01504515136 = getAssetInfo(pmtAssetId)
385+ let pmtFreezeStrAssetId = $t01504515136._1
386+ let pmtFreezeAssetName = $t01504515136._2
387+ let pmtFreezeDecimals = $t01504515136._3
388388 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
389389 if (if ((pmtFreezeStrAssetId != freezeTokenId))
390390 then true
418418
419419 @Callable(i)
420420 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
421- let $t01722917304 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
422- let pmtAmount = $t01722917304._1
423- let pmtAssetId = $t01722917304._2
424- let $t01730917459 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
425- let buyAssetId = $t01730917459._1
426- let buyAssetStrId = $t01730917459._2
427- let buyAssetName = $t01730917459._3
428- let buyAssetDecimals = $t01730917459._4
421+ let $t01722217297 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
422+ let pmtAmount = $t01722217297._1
423+ let pmtAssetId = $t01722217297._2
424+ let $t01730217452 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
425+ let buyAssetId = $t01730217452._1
426+ let buyAssetStrId = $t01730217452._2
427+ let buyAssetName = $t01730217452._3
428+ let buyAssetDecimals = $t01730217452._4
429429 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
430430 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
431431 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
432432 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
433433 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
434434 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
435- let $t01812818272 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
436- let tokenId = $t01812818272._1
437- let tokenStrAssetId = $t01812818272._2
438- let tokenAssetName = $t01812818272._3
439- let tokenDecimals = $t01812818272._4
435+ let $t01812118265 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
436+ let tokenId = $t01812118265._1
437+ let tokenStrAssetId = $t01812118265._2
438+ let tokenAssetName = $t01812118265._3
439+ let tokenDecimals = $t01812118265._4
440440 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
441441 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
442442 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
476476
477477 @Callable(i)
478478 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
479- let $t02053020680 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
480- let buyAssetId = $t02053020680._1
481- let buyAssetStrId = $t02053020680._2
482- let buyAssetName = $t02053020680._3
483- let buyAssetDecimals = $t02053020680._4
479+ let $t02052320673 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
480+ let buyAssetId = $t02052320673._1
481+ let buyAssetStrId = $t02052320673._2
482+ let buyAssetName = $t02052320673._3
483+ let buyAssetDecimals = $t02052320673._4
484484 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
485485 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
486486 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
487487 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
488488 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
489489 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
490- let $t02129021434 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
491- let tokenId = $t02129021434._1
492- let tokenStrAssetId = $t02129021434._2
493- let tokenAssetName = $t02129021434._3
494- let tokenDecimals = $t02129021434._4
490+ let $t02128321427 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
491+ let tokenId = $t02128321427._1
492+ let tokenStrAssetId = $t02128321427._2
493+ let tokenAssetName = $t02128321427._3
494+ let tokenDecimals = $t02128321427._4
495495 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
496496 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
497- let $t02166722807 = if ((i.payments[0].assetId == unit))
497+ let $t02166022793 = if ((i.payments[0].assetId == unit))
498498 then {
499499 let amntToGet = {
500500 let @ = ({
530530 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
531531 if ((ex == ex))
532532 then {
533- let change = (i.payments[0].amount - amntToGetTickets)
533+ let change = (i.payments[0].amount - amntToPay)
534534 let cEntry = if ((change > 0))
535535 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
536536 else nil
544544 else throw("Strict value is not equal to itself.")
545545 }
546546 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
547- let pmtAmount = $t02166722807._1
548- let pmtAssetId = $t02166722807._2
549- let changeEntry = $t02166722807._3
547+ let pmtAmount = $t02166022793._1
548+ let pmtAssetId = $t02166022793._2
549+ let changeEntry = $t02166022793._3
550550 if ((activeLaunchpadId != launchpadId))
551551 then throw("There is no active launchpad or this launchpad is ended")
552552 else if (!(highCompetitionSale))
598598 if ((calcHash != savedHash))
599599 then throw("vrf Height hash not matching")
600600 else {
601- let $t02576025910 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
602- let buyAssetId = $t02576025910._1
603- let buyAssetStrId = $t02576025910._2
604- let buyAssetName = $t02576025910._3
605- let buyAssetDecimals = $t02576025910._4
601+ let $t02574625896 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
602+ let buyAssetId = $t02574625896._1
603+ let buyAssetStrId = $t02574625896._2
604+ let buyAssetName = $t02574625896._3
605+ let buyAssetDecimals = $t02574625896._4
606606 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
607607 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
608608 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
647647 else false)
648648 then throw("You can't claim because you don't buy anything")
649649 else {
650- let $t02899429171 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
651- let buyAssetId = $t02899429171._1
652- let buyAssetStrId = $t02899429171._2
653- let buyAssetName = $t02899429171._3
654- let buyAssetDecimals = $t02899429171._4
650+ let $t02898029157 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
651+ let buyAssetId = $t02898029157._1
652+ let buyAssetStrId = $t02898029157._2
653+ let buyAssetName = $t02898029157._3
654+ let buyAssetDecimals = $t02898029157._4
655655 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
656656 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
657657 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
660660 let allowedAllocations = min([boughtAllocations, awailableAllocations])
661661 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
662662 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
663- let $t03008730231 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
664- let tokenId = $t03008730231._1
665- let tokenStrAssetId = $t03008730231._2
666- let tokenAssetName = $t03008730231._3
667- let tokenDecimals = $t03008730231._4
663+ let $t03007330217 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
664+ let tokenId = $t03007330217._1
665+ let tokenStrAssetId = $t03007330217._2
666+ let tokenAssetName = $t03007330217._3
667+ let tokenDecimals = $t03007330217._4
668668 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
669669 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
670670 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
759759 @Callable(i)
760760 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
761761 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
762- let $t03639636546 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
763- let buyAssetId = $t03639636546._1
764- let buyAssetStrId = $t03639636546._2
765- let buyAssetName = $t03639636546._3
766- let buyAssetDecimals = $t03639636546._4
762+ let $t03638236532 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
763+ let buyAssetId = $t03638236532._1
764+ let buyAssetStrId = $t03638236532._2
765+ let buyAssetName = $t03638236532._3
766+ let buyAssetDecimals = $t03638236532._4
767767 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
768768 let inv = if (if ((amount > 0))
769769 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
128128 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) = {
193193 let $t051595309 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
194194 let buyAssetId = $t051595309._1
195195 let buyAssetStrId = $t051595309._2
196196 let buyAssetName = $t051595309._3
197197 let buyAssetDecimals = $t051595309._4
198198 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
199199 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
200200 let $t054915635 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
201201 let tokenId = $t054915635._1
202202 let tokenStrAssetId = $t054915635._2
203203 let tokenAssetName = $t054915635._3
204204 let tokenDecimals = $t054915635._4
205205 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
206206 let commissionPerTicket = if ((type == 1))
207207 then fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
208208 else fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
209209 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
210210 let amntToPay = {
211211 let @ = ({
212212 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
213213 if ($isInstanceOf(@, "List[Any]"))
214214 then @
215215 else throw(($getType(@) + " couldn't be cast to List[Any]"))
216216 })[0]
217217 if ($isInstanceOf(@, "Int"))
218218 then @
219219 else throw(($getType(@) + " couldn't be cast to Int"))
220220 }
221221 if ((amntToPay == amntToPay))
222222 then fraction(amntToPay, 101, 100)
223223 else throw("Strict value is not equal to itself.")
224224 }
225225
226226
227227 @Callable(i)
228228 func hashingRandom (launchpadId,hash) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]))
229229
230230
231231
232232 @Callable(i)
233233 func initCaller (address) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry(keyInitCaller, address)]))
234234
235235
236236
237237 @Callable(i)
238238 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), "")))
239239 then throw("Only project admin can call init function")
240240 else if ((size(i.payments) != 1))
241241 then throw("One attached payment expected")
242242 else if ((height > startHeight))
243243 then throw("Start height must be greater than blockchain height")
244244 else if (if (freezeAdditionalToken)
245245 then (size(freezeParams) != 3)
246246 else false)
247247 then throw("Freeze params list must have 3 items")
248248 else {
249249 let launchpadId = getLaunchpadNextId()
250250 let launchpadIdStr = toString(launchpadId)
251251 let $t077897864 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
252252 let pmtAmount = $t077897864._1
253253 let pmtAssetId = $t077897864._2
254254 let $t078737946 = getAssetInfo(pmtAssetId)
255255 let pmtStrAssetId = $t078737946._1
256256 let pmtAssetName = $t078737946._2
257257 let pmtDecimals = $t078737946._3
258258 let freezeAdditionalEntry = if (freezeAdditionalToken)
259259 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
260260 else nil
261261 ([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)
262262 })
263263
264264
265265
266266 @Callable(i)
267267 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
268268 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
269269 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
270270 let $t01072910873 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
271271 let tokenId = $t01072910873._1
272272 let tokenStrAssetId = $t01072910873._2
273273 let tokenAssetName = $t01072910873._3
274274 let tokenDecimals = $t01072910873._4
275275 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
276276 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
277277 let $t01109011240 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
278278 let buyAssetId = $t01109011240._1
279279 let buyAssetStrId = $t01109011240._2
280280 let buyAssetName = $t01109011240._3
281281 let buyAssetDecimals = $t01109011240._4
282282 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
283283 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
284284 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
285285 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
286286 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
287287 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
288288 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
289- let $t01196513105 = if ((i.payments[0].assetId == unit))
289+ let $t01196513098 = if ((i.payments[0].assetId == unit))
290290 then {
291291 let amntToGet = {
292292 let @ = ({
293293 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), base58'']], nil)
294294 if ($isInstanceOf(@, "List[Any]"))
295295 then @
296296 else throw(($getType(@) + " couldn't be cast to List[Any]"))
297297 })[0]
298298 if ($isInstanceOf(@, "Int"))
299299 then @
300300 else throw(($getType(@) + " couldn't be cast to Int"))
301301 }
302302 if ((amntToGet == amntToGet))
303303 then {
304304 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
305305 if ((ticketsAmount == 0))
306306 then throw("Not enought WAVES to buy tickets")
307307 else {
308308 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
309309 let amntToPay = {
310310 let @ = ({
311311 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
312312 if ($isInstanceOf(@, "List[Any]"))
313313 then @
314314 else throw(($getType(@) + " couldn't be cast to List[Any]"))
315315 })[0]
316316 if ($isInstanceOf(@, "Int"))
317317 then @
318318 else throw(($getType(@) + " couldn't be cast to Int"))
319319 }
320320 if ((amntToPay == amntToPay))
321321 then {
322322 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
323323 if ((ex == ex))
324324 then {
325- let change = (i.payments[0].amount - amntToGetTickets)
325+ let change = (i.payments[0].amount - amntToPay)
326326 let cEntry = if ((change > 0))
327327 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
328328 else nil
329329 $Tuple3(amntToGetTickets, buyAssetId, cEntry)
330330 }
331331 else throw("Strict value is not equal to itself.")
332332 }
333333 else throw("Strict value is not equal to itself.")
334334 }
335335 }
336336 else throw("Strict value is not equal to itself.")
337337 }
338338 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
339- let pmtAmount = $t01196513105._1
340- let pmtAssetId = $t01196513105._2
341- let changeEntry = $t01196513105._3
339+ let pmtAmount = $t01196513098._1
340+ let pmtAssetId = $t01196513098._2
341+ let changeEntry = $t01196513098._3
342342 if ((activeLaunchpadId != launchpadId))
343343 then throw("There is no active launchpad or this launchpad is ended")
344344 else if ((startHeight > height))
345345 then throw("Launchpad sale not started yet")
346346 else if ((height > (startHeight + duration)))
347347 then throw("Launchpad sale ended")
348348 else if (if (!(freezeAdditionalToken))
349349 then if ((size(i.payments) != 1))
350350 then true
351351 else (pmtAssetId != buyAssetId)
352352 else false)
353353 then throw((("One attached payment in " + buyAssetName) + " expected"))
354354 else if (if (freezeAdditionalToken)
355355 then if ((size(i.payments) != 2))
356356 then true
357357 else (pmtAssetId != buyAssetId)
358358 else false)
359359 then {
360360 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
361361 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
362362 }
363363 else if (if ((0 >= allowedTicketsAmountAll))
364364 then true
365365 else (0 >= allowedTicketsAmount))
366366 then throw("Not enought SWOP in staking to buy tickets")
367367 else {
368368 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
369369 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
370370 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
371371 let change = (pmtAmount - allowedBuyPriceWithComission)
372372 if ((buyTicketAmount == 0))
373373 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
374374 else if ((change != 0))
375375 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
376376 else {
377377 let freezeAdditionalEntry = if (freezeAdditionalToken)
378378 then {
379379 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
380380 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
381- let $t01494815035 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
382- let pmtAmountFreeze = $t01494815035._1
383- let pmtAssetIdFreeze = $t01494815035._2
384- let $t01505215143 = getAssetInfo(pmtAssetId)
385- let pmtFreezeStrAssetId = $t01505215143._1
386- let pmtFreezeAssetName = $t01505215143._2
387- let pmtFreezeDecimals = $t01505215143._3
381+ let $t01494115028 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
382+ let pmtAmountFreeze = $t01494115028._1
383+ let pmtAssetIdFreeze = $t01494115028._2
384+ let $t01504515136 = getAssetInfo(pmtAssetId)
385+ let pmtFreezeStrAssetId = $t01504515136._1
386+ let pmtFreezeAssetName = $t01504515136._2
387+ let pmtFreezeDecimals = $t01504515136._3
388388 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
389389 if (if ((pmtFreezeStrAssetId != freezeTokenId))
390390 then true
391391 else (needFreezeTokens != pmtAmountFreeze))
392392 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
393393 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
394394 }
395395 else nil
396396 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
397397 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
398398 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
399399 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
400400 then ("," + boughtRange)
401401 else ("" + boughtRange)))
402402 let inv = if ((buyAssetId == USDN))
403403 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
404404 else 0
405405 if ((inv == inv))
406406 then {
407407 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)
408408 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
409409 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
410410 else baseEntry
411411 }
412412 else throw("Strict value is not equal to itself.")
413413 }
414414 }
415415 })
416416
417417
418418
419419 @Callable(i)
420420 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
421- let $t01722917304 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
422- let pmtAmount = $t01722917304._1
423- let pmtAssetId = $t01722917304._2
424- let $t01730917459 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
425- let buyAssetId = $t01730917459._1
426- let buyAssetStrId = $t01730917459._2
427- let buyAssetName = $t01730917459._3
428- let buyAssetDecimals = $t01730917459._4
421+ let $t01722217297 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
422+ let pmtAmount = $t01722217297._1
423+ let pmtAssetId = $t01722217297._2
424+ let $t01730217452 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
425+ let buyAssetId = $t01730217452._1
426+ let buyAssetStrId = $t01730217452._2
427+ let buyAssetName = $t01730217452._3
428+ let buyAssetDecimals = $t01730217452._4
429429 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
430430 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
431431 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
432432 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
433433 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
434434 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
435- let $t01812818272 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
436- let tokenId = $t01812818272._1
437- let tokenStrAssetId = $t01812818272._2
438- let tokenAssetName = $t01812818272._3
439- let tokenDecimals = $t01812818272._4
435+ let $t01812118265 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
436+ let tokenId = $t01812118265._1
437+ let tokenStrAssetId = $t01812118265._2
438+ let tokenAssetName = $t01812118265._3
439+ let tokenDecimals = $t01812118265._4
440440 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
441441 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
442442 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
443443 if ((activeLaunchpadId != launchpadId))
444444 then throw("There is no active launchpad or this launchpad is ended")
445445 else if ((startHeight > height))
446446 then throw("Launchpad sale not started yet")
447447 else if ((height > (startHeight + duration)))
448448 then throw("Launchpad sale ended")
449449 else if (if ((size(i.payments) != 1))
450450 then true
451451 else (pmtAssetId != buyAssetId))
452452 then throw((("One attached payment in " + buyAssetName) + " expected"))
453453 else if ((boughtAllocations >= maxAllocationsAmount))
454454 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
455455 else if (if ((allocationPriceWithComission != pmtAmount))
456456 then ((allocationPriceWithComission * 2) != pmtAmount)
457457 else false)
458458 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
459459 else {
460460 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
461461 let inv = if ((buyAssetId == USDN))
462462 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
463463 else 0
464464 if ((inv == inv))
465465 then {
466466 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))]
467467 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
468468 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
469469 else baseEntry
470470 }
471471 else throw("Strict value is not equal to itself.")
472472 }
473473 })
474474
475475
476476
477477 @Callable(i)
478478 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
479- let $t02053020680 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
480- let buyAssetId = $t02053020680._1
481- let buyAssetStrId = $t02053020680._2
482- let buyAssetName = $t02053020680._3
483- let buyAssetDecimals = $t02053020680._4
479+ let $t02052320673 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
480+ let buyAssetId = $t02052320673._1
481+ let buyAssetStrId = $t02052320673._2
482+ let buyAssetName = $t02052320673._3
483+ let buyAssetDecimals = $t02052320673._4
484484 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
485485 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
486486 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
487487 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
488488 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
489489 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
490- let $t02129021434 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
491- let tokenId = $t02129021434._1
492- let tokenStrAssetId = $t02129021434._2
493- let tokenAssetName = $t02129021434._3
494- let tokenDecimals = $t02129021434._4
490+ let $t02128321427 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
491+ let tokenId = $t02128321427._1
492+ let tokenStrAssetId = $t02128321427._2
493+ let tokenAssetName = $t02128321427._3
494+ let tokenDecimals = $t02128321427._4
495495 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
496496 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
497- let $t02166722807 = if ((i.payments[0].assetId == unit))
497+ let $t02166022793 = if ((i.payments[0].assetId == unit))
498498 then {
499499 let amntToGet = {
500500 let @ = ({
501501 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), base58'']], nil)
502502 if ($isInstanceOf(@, "List[Any]"))
503503 then @
504504 else throw(($getType(@) + " couldn't be cast to List[Any]"))
505505 })[0]
506506 if ($isInstanceOf(@, "Int"))
507507 then @
508508 else throw(($getType(@) + " couldn't be cast to Int"))
509509 }
510510 if ((amntToGet == amntToGet))
511511 then {
512512 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
513513 if ((ticketsAmount == 0))
514514 then throw("Not enought WAVES to buy tickets")
515515 else {
516516 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
517517 let amntToPay = {
518518 let @ = ({
519519 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
520520 if ($isInstanceOf(@, "List[Any]"))
521521 then @
522522 else throw(($getType(@) + " couldn't be cast to List[Any]"))
523523 })[0]
524524 if ($isInstanceOf(@, "Int"))
525525 then @
526526 else throw(($getType(@) + " couldn't be cast to Int"))
527527 }
528528 if ((amntToPay == amntToPay))
529529 then {
530530 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
531531 if ((ex == ex))
532532 then {
533- let change = (i.payments[0].amount - amntToGetTickets)
533+ let change = (i.payments[0].amount - amntToPay)
534534 let cEntry = if ((change > 0))
535535 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
536536 else nil
537537 $Tuple3(amntToGetTickets, buyAssetId, cEntry)
538538 }
539539 else throw("Strict value is not equal to itself.")
540540 }
541541 else throw("Strict value is not equal to itself.")
542542 }
543543 }
544544 else throw("Strict value is not equal to itself.")
545545 }
546546 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
547- let pmtAmount = $t02166722807._1
548- let pmtAssetId = $t02166722807._2
549- let changeEntry = $t02166722807._3
547+ let pmtAmount = $t02166022793._1
548+ let pmtAssetId = $t02166022793._2
549+ let changeEntry = $t02166022793._3
550550 if ((activeLaunchpadId != launchpadId))
551551 then throw("There is no active launchpad or this launchpad is ended")
552552 else if (!(highCompetitionSale))
553553 then throw("There is no high competition sale for this launchpad")
554554 else if ((startHeight > height))
555555 then throw("Launchpad sale not started yet")
556556 else if ((height > (startHeight + duration)))
557557 then throw("Launchpad sale ended")
558558 else if (if ((size(i.payments) != 1))
559559 then true
560560 else (pmtAssetId != buyAssetId))
561561 then throw((("One attached payment in " + buyAssetName) + " expected"))
562562 else {
563563 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
564564 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
565565 let change = (pmtAmount - buyPriceWithComission)
566566 if ((buyTicketAmount == 0))
567567 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
568568 else if ((change != 0))
569569 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
570570 else {
571571 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
572572 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
573573 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
574574 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
575575 then ("," + boughtRange)
576576 else ("" + boughtRange)))
577577 let inv = if ((buyAssetId == USDN))
578578 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
579579 else 0
580580 if ((inv == inv))
581581 then {
582582 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)
583583 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
584584 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
585585 else baseEntry
586586 }
587587 else throw("Strict value is not equal to itself.")
588588 }
589589 }
590590 })
591591
592592
593593
594594 @Callable(i)
595595 func finalise (launchpadId,vrfHeight,secretWord) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
596596 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
597597 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
598598 if ((calcHash != savedHash))
599599 then throw("vrf Height hash not matching")
600600 else {
601- let $t02576025910 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
602- let buyAssetId = $t02576025910._1
603- let buyAssetStrId = $t02576025910._2
604- let buyAssetName = $t02576025910._3
605- let buyAssetDecimals = $t02576025910._4
601+ let $t02574625896 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
602+ let buyAssetId = $t02574625896._1
603+ let buyAssetStrId = $t02574625896._2
604+ let buyAssetName = $t02574625896._3
605+ let buyAssetDecimals = $t02574625896._4
606606 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
607607 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
608608 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
609609 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
610610 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
611611 let swopfiHCBuyAssetAmount = valueOrElse(getInteger(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
612612 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
613613 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
614614 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
615615 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
616616 let unstakeAmount = ((((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission) - transferedBuyAsset)
617617 if ((transferedBuyAsset > ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiHCBuyAssetAmount)))
618618 then throw("Can't transfer negative value to project")
619619 else {
620620 let inv = if ((buyAssetId == USDN))
621621 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
622622 else 0
623623 if ((inv == inv))
624624 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (((swopfiMembersBuyAssetAmount + swopfiHCBuyAssetAmount) + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
625625 else throw("Strict value is not equal to itself.")
626626 }
627627 }
628628 }))
629629
630630
631631
632632 @Callable(i)
633633 func claim (launchpadId) = valueOrElse(isActive(), {
634634 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
635635 let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
636636 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
637637 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
638638 let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
639639 if ((finalizeHeight == 0))
640640 then throw("You can't claim because results are not finalized")
641641 else if (userClaimStatus)
642642 then throw("You are already claimed")
643643 else if (if (if ((boughtTickets == 0))
644644 then (boughtAllocations == 0)
645645 else false)
646646 then (boughtHCTickets == 0)
647647 else false)
648648 then throw("You can't claim because you don't buy anything")
649649 else {
650- let $t02899429171 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
651- let buyAssetId = $t02899429171._1
652- let buyAssetStrId = $t02899429171._2
653- let buyAssetName = $t02899429171._3
654- let buyAssetDecimals = $t02899429171._4
650+ let $t02898029157 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
651+ let buyAssetId = $t02898029157._1
652+ let buyAssetStrId = $t02898029157._2
653+ let buyAssetName = $t02898029157._3
654+ let buyAssetDecimals = $t02898029157._4
655655 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
656656 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
657657 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
658658 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
659659 let commissionHC = valueOrElse(getInteger(this, (toString(launchpadId) + keyHighCompetitionComission)), 0)
660660 let allowedAllocations = min([boughtAllocations, awailableAllocations])
661661 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
662662 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
663- let $t03008730231 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
664- let tokenId = $t03008730231._1
665- let tokenStrAssetId = $t03008730231._2
666- let tokenAssetName = $t03008730231._3
667- let tokenDecimals = $t03008730231._4
663+ let $t03007330217 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
664+ let tokenId = $t03007330217._1
665+ let tokenStrAssetId = $t03007330217._2
666+ let tokenAssetName = $t03007330217._3
667+ let tokenDecimals = $t03007330217._4
668668 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
669669 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
670670 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
671671 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
672672 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
673673 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
674674 let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commissionHC), 100)
675675 let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
676676 if (if (if ((0 > buyAssetForAllocations))
677677 then true
678678 else (0 > buyAssetForUnwonnedTickets))
679679 then true
680680 else (0 > buyAssetForHCUnwonnedTickets))
681681 then throw("Error with allowed allocation param or wonned tickets param please contact support")
682682 else {
683683 let returnedBuyAssetAmount = (((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) + buyAssetForAllocations) - claimedBuyToken)
684684 let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
685685 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
686686 else nil
687687 let inv = if (if ((returnedBuyAssetAmount > 0))
688688 then (buyAssetId == USDN)
689689 else false)
690690 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
691691 else 0
692692 if ((inv == inv))
693693 then {
694694 let claimedParams = split(valueOrElse(getString(this, (toString(launchpadId) + keyClaimParams)), "claimAll"), ",")
695695 if ((claimedParams[0] == "claimAll"))
696696 then {
697697 let transferTokens = if ((transferTokensAmount > 0))
698698 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
699699 else nil
700700 (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
701701 }
702702 else if ((claimedParams[0] == "claimPeriod"))
703703 then {
704704 let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
705705 let unlockPeriod = value(parseInt(claimedParams[2]))
706706 let blockHeight = (value(parseInt(claimedParams[3])) + finalizeHeight)
707707 let unlockHeight = (unlockPeriod + blockHeight)
708708 let allowedStartAmount = fraction(transferTokensAmount, value(parseInt(claimedParams[1])), 100)
709709 let allowedTokensAmount = (allowedStartAmount + (if ((height > blockHeight))
710710 then (fraction((transferTokensAmount - allowedStartAmount), (min([height, unlockHeight]) - blockHeight), unlockPeriod) - claimedTokens)
711711 else (0 - claimedTokens)))
712712 let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
713713 then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
714714 else nil
715715 if (if ((allowedTokensAmount > 0))
716716 then true
717717 else (returnedBuyAssetAmount > 0))
718718 then {
719719 let transferTokens = if ((allowedTokensAmount > 0))
720720 then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
721721 else nil
722722 (transferBuyAsset ++ transferTokens)
723723 }
724724 else throw("Nothing to claim")
725725 }
726726 else throw("Unknown claim function")
727727 }
728728 else throw("Strict value is not equal to itself.")
729729 }
730730 }
731731 })
732732
733733
734734
735735 @Callable(i)
736736 func claimFreezeToken (launchpadId) = valueOrElse(isActive(), {
737737 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
738738 if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
739739 then throw("You can't claim because results are not finalized")
740740 else if (!(freezeAdditionalToken))
741741 then throw("There are no additional token freezing for this launchpad")
742742 else {
743743 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
744744 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
745745 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
746746 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
747747 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
748748 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
749749 if ((userTokensFreezed == 0))
750750 then throw("You are already claimed your tokens or not paid anything")
751751 else if ((blockEndHeight > height))
752752 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
753753 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
754754 }
755755 })
756756
757757
758758
759759 @Callable(i)
760760 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
761761 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
762- let $t03639636546 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
763- let buyAssetId = $t03639636546._1
764- let buyAssetStrId = $t03639636546._2
765- let buyAssetName = $t03639636546._3
766- let buyAssetDecimals = $t03639636546._4
762+ let $t03638236532 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
763+ let buyAssetId = $t03638236532._1
764+ let buyAssetStrId = $t03638236532._2
765+ let buyAssetName = $t03638236532._3
766+ let buyAssetDecimals = $t03638236532._4
767767 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
768768 let inv = if (if ((amount > 0))
769769 then (buyAssetId == USDN)
770770 else false)
771771 then invoke(stakingUSDNAddress, "unlockNeutrino", [amount, toBase58String(USDN)], nil)
772772 else 0
773773 if ((inv == inv))
774774 then [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), (transferedBuyAsset + amount)), ScriptTransfer(projectAddress, amount, buyAssetId)]
775775 else throw("Strict value is not equal to itself.")
776776 }))
777777
778778
779779
780780 @Callable(i)
781781 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
782782 then throw("DApp already inactive")
783783 else [BooleanEntry(keyActive, false)])
784784
785785
786786
787787 @Callable(i)
788788 func activate () = valueOrElse(isAdminCall(i), if (active)
789789 then throw("DApp already active")
790790 else [BooleanEntry(keyActive, true)])
791791
792792
793793 @Verifier(tx)
794794 func verify () = {
795795 let multiSignedByAdmins = {
796796 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
797797 then 1
798798 else 0
799799 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
800800 then 1
801801 else 0
802802 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
803803 then 1
804804 else 0
805805 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
806806 }
807807 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
808808 then true
809809 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
810810 then true
811811 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
812812 then true
813813 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
814814 match tx {
815815 case dtx: DataTransaction =>
816816 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
817817 then signedByAdmin
818818 else false
819819 case _ =>
820820 multiSignedByAdmins
821821 }
822822 }
823823

github/deemru/w8io/3ef1775 
175.65 ms