tx · 3P1kaoW1vZHheFai94Xa5CfRaQe3iAFRFpw443svSAqE 3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V: -0.10000000 Waves 2024.01.26 14:02 [4014169] smart account 3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V > SELF 0.00000000 Waves
{ "type": 13, "id": "3P1kaoW1vZHheFai94Xa5CfRaQe3iAFRFpw443svSAqE", "fee": 10000000, "feeAssetId": null, "timestamp": 1706272355000, "version": 2, "chainId": 87, "sender": "3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V", "senderPublicKey": "Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS", "proofs": [ "2EGhWN4AKZqj1n9s1WtRQd4K1Q7SLVPpJf91rc2FgxywNhe86e5bYnj4aPUSrkQWX9V7Ad5F2BLoyCNtQpBcpWXR", "3oAYQr9cWAHgjHgYxdcBbzeMVYpogR7B6gTdMvWM4UM9amKSfDMvbuBpqef1gna7up4TK2Ft3VmDmKaM7xSExaah" ], "script": "base64:BgKBAQgCEgkKBwgICAEICAgSABIECgIIARIAEgMKAQgSABIGCgQICAgIEgYKBAgICAgSBAoCCAgSBAoCCAgSAwoBBBIDCgEEEggKBgQIAQgICBIHCgUECAgIARIGCgQECAQIEgUKAwQICBIDCgEEEgQKAggEEgQKAggEEgMKAQQSAwoBBCQAC2F4bHlBZGRyZXNzCQEHQWRkcmVzcwEBGgFXz8h13gt2/Imb93uvCUhEZwkqUEc/D0ItAAdheGx5TFBzCQDMCAICLDdLWmJKclZvcHdKaGtkd2JlMWVGREJiZXg0ZGtZNjNNeGpUTmpxWHRyemoxCQDMCAICLEJ0dzNHMWo0d1FnZHA0OVBUeGFGa052bjc1ZFF0cUdETTdlalFwcEhuV0MxCQDMCAICLEJpU3pGZThuU0w3OG9aYWViZm9pbjV2Qlo1UHplNmQ3a2FlaWpMcXI1eFplCQDMCAICLEYyQUtrQTUxM2s1eUhFSmtMc1U2dld4Q1lZazgxMUdwakxod0V2MldHd1o5CQDMCAICLDRDUTVDUEdMWExiV0JVczJKQmpLVWFScUY0OUNtS0hrd3p2UGdTdlFwQVFWCQDMCAICLDZpTUI2TEtTcmd2OXdhRXZFbk42WWR5eDdkZnhQbkdjVHc4MzE4V1ZtNWJSBQNuaWwAEmF4bHlGYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBARoBVw0BWZY1FHCZ5lzdPjsnXRNYpbnNNV3lwgAScmVzZXJ2ZUZ1bmRBZGRyZXNzCQEHQWRkcmVzcwEBGgFXHuH7QDFrgebsS1YbBSxRoZNu3wmxPNLBAAtyZXNlcnZlRnVuZAAUABFhZ2dyZWdhdG9yQWRkcmVzcwkBB0FkZHJlc3MBARoBV50MqsYTUaluy4D3Y33BZHji73JNqAy60wARc2h1dGRvd25XaGl0ZWxpc3QJAMwIAgEaAVfX4SNRjnyriFrV1yiXddiIddOPriMFpuEJAMwIAgEaAVdjDQOBpn9bVNIcueQoKvOngDTw2LWN1WUJAMwIAgEaAVez1ZJUSQmaKhD7xvifEHar7z8PcqWJFYwJAMwIAgEaAVf4+voCJsBRi+xqO0YzSdIccbB1i/mkypoJAMwIAgEaAVer3aoi85i5H0XYLNSn6vkSYq+JNmpQO3IJAMwIAgEaAVcwORzRpGYYO35/49jeov24Z5j/V00RJp0FA25pbAEWdmVyaWZ5TGlxdWlkYXRvclJpZ2h0cwEHYWRkcmVzcwkBASEBAwMDCQECIT0CBQdhZGRyZXNzCQEHQWRkcmVzcwEBGgFXknk9t7KW82FEBfQVEbQTU5SFwS21x/ezCQECIT0CBQdhZGRyZXNzCQEHQWRkcmVzcwEBGgFXd6rO0XhW6KmeXquV77/p4XFYdV4ymnGBBwkBAiE9AgUHYWRkcmVzcwkBB0FkZHJlc3MBARoBV9fhI1GOfKuIWtXXKJd12Ih104+uIwWm4QcJAQIhPQIFB2FkZHJlc3MJAQdBZGRyZXNzAQEaAVer3aoi85i5H0XYLNSn6vkSYq+JNmpQO3IHARR2ZXJpZnlTZW50aW5lbFJpZ2h0cwEHYWRkcmVzcwkBASEBAwkBAiE9AgUHYWRkcmVzcwUScmVzZXJ2ZUZ1bmRBZGRyZXNzCQECIT0CBQdhZGRyZXNzBQtheGx5QWRkcmVzcwcBDGdldFJhdGVDdXJ2ZQEKYXNzZXRJZFN0cgQHJG1hdGNoMAUKYXNzZXRJZFN0cgMJAAACAiw5d2MzTFhOQTRURUJzWHlLdG9MRTltcmJERDdXTUhYdlhyQ2padmFiTEFzaQUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixIR2dhYlRxVVM4V3RWRlVKemZtclRETWdFY2NKdVpMQlBoRmdRRnh2bnNvVwUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiwzNE45WWNFRVRMV245M3FZUTY0RXNQMXg4OXRTcnVKVTQ0UnJFTVNYWEVQSgUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiw2WHRIanBYYnM5UlJKUDJTcjlHVXlWcXpBQ2NieTlUa1RoSFhualZDNUNESgUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixBanNvNm5UVGpwdHUyVUhMeDZoZlNYVnRIRnRSQkpDa0tZZDVTQXlqN3pmNQUHJG1hdGNoMAkAlgoEAICJegCAtIkTAIDokiYAgKPDRwMJAAACAixIRUI4UWF3OXhyV3BXczh0SHNpQVRZR0JXREJ0UDJTN2tjUEFMck11NDNBUwUHJG1hdGNoMAkAlgoEAAAAgNrECQCA6JImAIC0iRMDCQAAAgIFV0FWRVMFByRtYXRjaDAJAJYKBACAiXoAgIenDgCA6JImAIDh6xcDCQAAAgIsQXRxdjU5RVl6akZHdWl0S1ZuTVJrNkg4RnVram9WM2t0UG9yYkV5czI1b24FByRtYXRjaDAJAJYKBAAAAIDaxAkAgOiSJgCAtIkTAwkAAAICLERTYmJoTHNTVGVEZzVMc2l1ZmsyQW5laDNEalZxSnVQcjJNOXVVMWd3eTVwBQckbWF0Y2gwCQCWCgQAAACA2sQJAIDokiYAgMLXLwMJAAACAiw4dDREUFdUd1B6cGF0SEE5QWtUeFdBQjQ3VEhuWXpCc0Rub1k3ZlFxYkc5MQUHJG1hdGNoMAkAlgoEAAAAgIenDgCA6JImAIC0iRMDCQAAAgIsQXQ4RDZORkZwaGVDYnZLVm5qVm9lTEw4NEVvOE5abjZvdk1hbnhmTGFGV0wFByRtYXRjaDAJAJYKBAAAAMDw9QsAgOiSJgCAtIkTAwkAAAICLDhMUVc4ZjdQNWQ1UFpNN0d0WkVCZ2FxUlBHU3pTM0RmUHVpWHJVUko0QUpTBQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDQ3NGpUZVl4MnIyVmEzNTc5NHRDU2NBWFdKRzloVTJIY2d4ek1vd2FaVW51BQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDVVWUJQcHE0V29VNW40TXdwRmtnSm5XM0ZxNEIxdTN1a3BLMzNpazRRZXJSBQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDJ0aHNBQ3VIbXpETXVOZXpQTTMyd2c5YTNCd1V6QldEZVNLYWtnejNjdzIxBQckbWF0Y2gwCQCWCgQAgIl6AIC0iRMAgOiSJgCAwtcvAwkAAAICK1lpTmJvZkZ6QzE3akVISENNd3JSY3B5OU1ycmphYk1NTFp4ZzhnNXhtZjcFByRtYXRjaDAJAJYKBACAiXoAgIenDgCA6JImAIDokiYJAJYKBAAAAIDaxAkAgOiSJgCA6JImAAZTY2FsZTgAgMLXLwAHU2NhbGUxMACAyK+gJQAHU2NhbGUxNgkAaAIFBlNjYWxlOAUGU2NhbGU4AAlkYXlCbG9ja3MAoAsBCmxpSW50VG9TdHIBAmxpCgEBZgIFYWNjdW0EbmV4dAkArAICCQCsAgIFBWFjY3VtCQCkAwEFBG5leHQCASwKAAIkbAUCbGkKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBAWYCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAJsIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFiBQckbWF0Y2gwBQFiAgABDHRyeUdldEJpbmFyeQEDa2V5BAckbWF0Y2gwCQCcCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwBQFiAQABDmdldEFzc2V0U3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIFV0FWRVMBDWdldEFzc2V0Qnl0ZXMBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFBHVuaXQJANkEAQUKYXNzZXRJZFN0cgEKZ2V0QmFsYW5jZQEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQphc3NldElkU3RyAQ9nZXRNYXJrZXRBc3NldHMACQC1CQIJAQx0cnlHZXRTdHJpbmcBAgxzZXR1cF90b2tlbnMCASwBEmdldEFzc2V0c01heFN1cHBseQAEAXMJAQx0cnlHZXRTdHJpbmcBAg9zZXR1cF9tYXhzdXBwbHkDCQAAAgUBcwIACQDMCAIA////////////AQkAzAgCAP///////////wEJAMwIAgD///////////8BCQDMCAIA////////////AQkAzAgCAP///////////wEJAMwIAgD///////////8BCQDMCAIA////////////AQUDbmlsCQC1CQIFAXMCASwBDWdldE91dGRhdGVkVXIBCmFzc2V0SWRTdHIEBGRvd24JAGsDCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIGX3NSYXRlBQdTY2FsZTE2AwkAAAIFBGRvd24AAAAACQBrAwUGU2NhbGU4CQBrAwkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICBl9iUmF0ZQUHU2NhbGUxNgUEZG93bgELZ2V0SW50ZXJlc3QBCmFzc2V0SWRTdHIEAnVyCQENZ2V0T3V0ZGF0ZWRVcgEFCmFzc2V0SWRTdHIEBWN1cnZlCQEMZ2V0UmF0ZUN1cnZlAQUKYXNzZXRJZFN0cgQEcmF0ZQkAZAIIBQVjdXJ2ZQJfMQMJAGcCCAUFY3VydmUCXzMFAnVyCQBrAwUCdXIIBQVjdXJ2ZQJfMggFBWN1cnZlAl8zCQBkAggFBWN1cnZlAl8yCQBrAwkAZQIFAnVyCAUFY3VydmUCXzMIBQVjdXJ2ZQJfNAkAZQIAgMLXLwgFBWN1cnZlAl8zCQCWAwEJAMwIAgkAawMFBHJhdGUFBlNjYWxlOAkAaAIFCWRheUJsb2NrcwDtAgkAzAgCAAEFA25pbAEQdG9rZW5SYXRlc1JlY2FsYwEKYXNzZXRJZFN0cgMJAQIhPQIJAM8IAgUHYXhseUxQcwUKYXNzZXRJZFN0cgUEdW5pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgZfc1JhdGUFB1NjYWxlMTYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlBQdTY2FsZTE2CQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5sYXN0UmF0ZUhlaWdodAUGaGVpZ2h0BQNuaWwECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQphc3NldElkU3RyBAJ1cgkBDWdldE91dGRhdGVkVXIBBQphc3NldElkU3RyBBBsYXN0UmVjYWxjSGVpZ2h0CQENdHJ5R2V0SW50ZWdlcgECDmxhc3RSYXRlSGVpZ2h0BAlsYXN0QlJhdGUJAJYDAQkAzAgCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlCQDMCAIFB1NjYWxlMTYFA25pbAQIbmV3QlJhdGUJAGQCBQlsYXN0QlJhdGUJAGgCCQBlAgUGaGVpZ2h0BRBsYXN0UmVjYWxjSGVpZ2h0BQhpbnRlcmVzdAQJbGFzdFNSYXRlCQCWAwEJAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICBl9zUmF0ZQkAzAgCBQdTY2FsZTE2BQNuaWwECG5ld1NSYXRlCQBkAgUJbGFzdFNSYXRlCQBpAgkAaAIJAGgCCQBlAgUGaGVpZ2h0BRBsYXN0UmVjYWxjSGVpZ2h0CQBrAwUIaW50ZXJlc3QFAnVyBQZTY2FsZTgJAGUCAGQFC3Jlc2VydmVGdW5kAGQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIGX3NSYXRlBQhuZXdTUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgZfYlJhdGUFCG5ld0JSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5sYXN0UmF0ZUhlaWdodAUGaGVpZ2h0BQNuaWwBDWdldEFjdHVhbFJhdGUCCmFzc2V0SWRTdHIIcmF0ZVR5cGUKAQFmAgVhY2N1bQV0b2tlbgQGcmVjYWxjCQEQdG9rZW5SYXRlc1JlY2FsYwEFBXRva2VuCQCUCgIDCQECIT0CBQV0b2tlbgUKYXNzZXRJZFN0cggFBWFjY3VtAl8xAwkAAAIFCHJhdGVUeXBlAgVzUmF0ZQgJAJEDAgUGcmVjYWxjAAAFdmFsdWUICQCRAwIFBnJlY2FsYwABBXZhbHVlCQDOCAIIBQVhY2N1bQJfMgUGcmVjYWxjCgACJGwJAQ9nZXRNYXJrZXRBc3NldHMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEBZgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwBBWdldFVyAQphc3NldElkU3RyBAVyYXRlcwkBEHRva2VuUmF0ZXNSZWNhbGMBBQphc3NldElkU3RyBARkb3duCQBrAwkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cggJAJEDAgUFcmF0ZXMAAAV2YWx1ZQUHU2NhbGUxNgkAawMFBlNjYWxlOAkAawMJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIICQCRAwIFBXJhdGVzAAEFdmFsdWUFB1NjYWxlMTYFBGRvd24BC3JhdGVzUmVjYWxjAAoBAWYCBWFjY3VtBXRva2VuCQDOCAIFBWFjY3VtCQEQdG9rZW5SYXRlc1JlY2FsYwEFBXRva2VuCgACJGwJAQ9nZXRNYXJrZXRBc3NldHMACgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAEVZ2V0VG9rZW5QcmljZVdpdGhSaXNrAgphc3NldElkU3RyDHJpc2tBdmVyc2l0eQMDCQAAAgUKYXNzZXRJZFN0cgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kGCQAAAgUKYXNzZXRJZFN0cgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cJAJQKAgDAhD0AwIQ9BAVwcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgkBB0FkZHJlc3MBARoBV0lm0MvzivVXeq38IW9xxVuJiCvQgbOxfwkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBAlyaXNrTGV2ZWwJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAQdBZGRyZXNzAQEaAVdJZtDL84r1V3qt/CFvccVbiYgr0IGzsX8JAKwCAgUKYXNzZXRJZFN0cgIKX3Jpc2tMZXZlbAMJAQIhPQIJAM8IAgUHYXhseUxQcwUKYXNzZXRJZFN0cgUEdW5pdAQBcAoAAUAJAP0HBAULYXhseUFkZHJlc3MCGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZCQDMCAIFCmFzc2V0SWRTdHIFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQFwBQFwCQCUCgIFAXAFAXAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBnAgUMcmlza0F2ZXJzaXR5BQlyaXNrTGV2ZWwJAJQKAgUFcHJpY2UFBXByaWNlCQACAQkArAICCQCsAgICG29yYWNsZSBwcmljZXMgZG9uJ3QgbWF0Y2g6IAkApAMBBQVwcmljZQIjIGlzIHRoZSBwcmljZSwgYnV0IHJpc2sgaXMgdG9vIGhpZ2gBDWdldFRva2VuUHJpY2UBCmFzc2V0SWRTdHIJARVnZXRUb2tlblByaWNlV2l0aFJpc2sCBQphc3NldElkU3RyAAEBDmNhbGNBc3NldFNjYWxlAQphc3NldElkU3RyBAhkZWNpbWFscwMJAAACBQphc3NldElkU3RyAgVXQVZFUwAICAkBBXZhbHVlAQkA7AcBCQDZBAEFCmFzc2V0SWRTdHIIZGVjaW1hbHMJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOARJjYWxjVXNlckNvbGxhdGVyYWwBB2FkZHJlc3MEFHVzZXJDb2xsYXRlcmFsSW52b2tlCQD8BwQFBHRoaXMCEWdldFVzZXJDb2xsYXRlcmFsCQDMCAIHCQDMCAIFB2FkZHJlc3MJAMwIAgYJAMwIAgIABQNuaWwFA25pbAMJAAACBRR1c2VyQ29sbGF0ZXJhbEludm9rZQUUdXNlckNvbGxhdGVyYWxJbnZva2UEE3VzZXJDb2xsYXRlcmFsVmFsdWUEByRtYXRjaDAFFHVzZXJDb2xsYXRlcmFsSW52b2tlAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAkAAgECJGlzc3VlIHdoaWxlIGRvaW5nIGluLWRhcHAgaW52b2NhdGlvbgMJAAACBRN1c2VyQ29sbGF0ZXJhbFZhbHVlBRN1c2VyQ29sbGF0ZXJhbFZhbHVlBRN1c2VyQ29sbGF0ZXJhbFZhbHVlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ5zdXBwbHlJbnRlcm5hbAMKYXNzZXRJZFN0cgthc3NldEFtb3VudAdhZGRyZXNzAwkBASEBCQENdHJ5R2V0Qm9vbGVhbgECDHNldHVwX2FjdGl2ZQkAAgECEW1hcmtldCBpcyBzdG9wcGVkBAskdDA5MDQ4OTExNQkBDWdldEFjdHVhbFJhdGUCBQphc3NldElkU3RyAgVzUmF0ZQQFc1JhdGUIBQskdDA5MDQ4OTExNQJfMQQRcmF0ZXNSZWNhbGNSZXN1bHQIBQskdDA5MDQ4OTExNQJfMgQGYW1vdW50CQBuBAULYXNzZXRBbW91bnQFB1NjYWxlMTYFBXNSYXRlBQRET1dOBAltYXhTdXBwbHkEByRtYXRjaDAJAKIIAQkArAICAhBzZXR1cF9tYXhTdXBwbHlfBQphc3NldElkU3RyAwkAAQIFByRtYXRjaDACBlN0cmluZwQBeAUHJG1hdGNoMAkBDXBhcnNlSW50VmFsdWUBBQF4AAAECmFzc2V0UHJpY2UJAQ1nZXRUb2tlblByaWNlAQUKYXNzZXRJZFN0cgQQbmV3VG90YWxTdXBwbGllZAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FCmFzc2V0SWRTdHIFBmFtb3VudAQEcmF0ZQgJAQ1nZXRBY3R1YWxSYXRlAgUKYXNzZXRJZFN0cgIFc1JhdGUCXzEECmFzc2V0U2NhbGUJAQ5jYWxjQXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE25ld1RvdGFsU3VwcGxpZWRVc2QJAGsDCQBrAwUQbmV3VG90YWxTdXBwbGllZAUEcmF0ZQUHU2NhbGUxNggFCmFzc2V0UHJpY2UCXzEFCmFzc2V0U2NhbGUDCQAAAgkAswkCCQEMdHJ5R2V0U3RyaW5nAQIMc2V0dXBfdG9rZW5zBQphc3NldElkU3RyBQR1bml0CQACAQIpdGhpcyBhc3NldCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBtYXJrZXQDAwkBAiE9AgUJbWF4U3VwcGx5AAAJAGYCBRNuZXdUb3RhbFN1cHBsaWVkVXNkBQltYXhTdXBwbHkHCQACAQIzbWF4IHRvdGFsIHN1cHBseSBmb3IgdGhpcyB0b2tlbiByZWFjaGVkIGluIHRoZSBwb29sCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FCmFzc2V0SWRTdHIFEG5ld1RvdGFsU3VwcGxpZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyCQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgUGYW1vdW50BQNuaWwFEXJhdGVzUmVjYWxjUmVzdWx0BQthc3NldEFtb3VudAEOYm9ycm93SW50ZXJuYWwECmFzc2V0SWRTdHILYXNzZXRBbW91bnQHYWRkcmVzcwtzdXBwbHlMYXRlcgQNJHQwMTAzMzcxMDQwNAkBDWdldEFjdHVhbFJhdGUCBQphc3NldElkU3RyAgViUmF0ZQQFYlJhdGUIBQ0kdDAxMDMzNzEwNDA0Al8xBBFyYXRlc1JlY2FsY1Jlc3VsdAgFDSR0MDEwMzM3MTA0MDQCXzIEBmFtb3VudAkAbgQFC2Fzc2V0QW1vdW50BQdTY2FsZTE2BQViUmF0ZQUHQ0VJTElORwQSY29sbGF0ZXJhbFZhbHVlSW52CQD8BwQFBHRoaXMCEWdldFVzZXJDb2xsYXRlcmFsCQDMCAIHCQDMCAIFB2FkZHJlc3MJAMwIAgYJAMwIAgkArAICCQCsAgIFCmFzc2V0SWRTdHICCixib3Jyb3dlZCwJAKQDAQUGYW1vdW50BQNuaWwFA25pbAMJAAACBRJjb2xsYXRlcmFsVmFsdWVJbnYFEmNvbGxhdGVyYWxWYWx1ZUludgQPY29sbGF0ZXJhbFZhbHVlBAckbWF0Y2gwBRJjb2xsYXRlcmFsVmFsdWVJbnYDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQIfY2FuJ3QgZ2V0IHVzZXIgY29sbGF0ZXJhbCB2YWx1ZQMJAQEhAQkBDXRyeUdldEJvb2xlYW4BAgxzZXR1cF9hY3RpdmUJAAIBAhFtYXJrZXQgaXMgc3RvcHBlZAMJAQIhPQIJAM8IAgUHYXhseUxQcwUKYXNzZXRJZFN0cgUEdW5pdAkAAgECHXRoaXMgdG9rZW4gY2Fubm90IGJlIGJvcnJvd2VkAwMJAQEhAQULc3VwcGx5TGF0ZXIJAGYCAAAFD2NvbGxhdGVyYWxWYWx1ZQcJAAIBAiF5b3UgaGF2ZSB0byBzdXBwbHkgbW9yZSB0byBib3Jyb3cEDWFzc2V0U3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIEDWFzc2V0Qm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIEEXVzZXJBc3NldEJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQphc3NldElkU3RyAwkAZgIFBmFtb3VudAkAZQIFDWFzc2V0U3VwcGxpZWQFDWFzc2V0Qm9ycm93ZWQJAAIBAhx0aGlzIGFtb3VudCBpcyBub3QgYXZhaWxhYmxlCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIJAGQCBRF1c2VyQXNzZXRCb3Jyb3dlZAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgkAZAIFDWFzc2V0Qm9ycm93ZWQFBmFtb3VudAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICBl9iUmF0ZQUFYlJhdGUFA25pbAULYXNzZXRBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4VAWkBDWZsYXNoUG9zaXRpb24HBHVzZXILc0Fzc2V0SWRTdHILYkFzc2V0SWRTdHIHYkFtb3VudA9jYWxsYmFja0FkZHJlc3MQY2FsbGJhY2tGdW5jdGlvbgxjYWxsYmFja0FyZ3MDCQECIT0CCAUBaQZjYWxsZXIFC2F4bHlBZGRyZXNzCQACAQIgYXZhaWxhYmxlIG9ubHkgZm9yIEF4bHkgcHJvdG9jb2wECWJvcnJvd1JlcwkBDmJvcnJvd0ludGVybmFsBAULYkFzc2V0SWRTdHIFB2JBbW91bnQFBHVzZXIGBAhiQXNzZXRJZAkBDWdldEFzc2V0Qnl0ZXMBBQtiQXNzZXRJZFN0cgQIY2FsbGJhY2sJAP0HBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUPY2FsbGJhY2tBZGRyZXNzBRBjYWxsYmFja0Z1bmN0aW9uCQC1CQIFDGNhbGxiYWNrQXJncwIBLAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIYkFzc2V0SWQFB2JBbW91bnQFA25pbAMJAAACBQhjYWxsYmFjawUIY2FsbGJhY2sEB3NBbW91bnQKAAFABQhjYWxsYmFjawMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUHc0Ftb3VudAUHc0Ftb3VudAQJc3VwcGx5UmVzCQEOc3VwcGx5SW50ZXJuYWwDBQtzQXNzZXRJZFN0cgUHc0Ftb3VudAUEdXNlcgQPY29sbGF0ZXJhbFZhbHVlCgABQAkA/AcEBQR0aGlzAhFnZXRVc2VyQ29sbGF0ZXJhbAkAzAgCBwkAzAgCBQR1c2VyCQDMCAIGCQDMCAIJAKwCAgkArAICBQtzQXNzZXRJZFN0cgIKLHN1cHBsaWVkLAkApAMBBQdzQW1vdW50BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUPY29sbGF0ZXJhbFZhbHVlBQ9jb2xsYXRlcmFsVmFsdWUEC2JvcnJvd1ZhbHVlCgABQAkA/AcEBQR0aGlzAhFnZXRVc2VyQ29sbGF0ZXJhbAkAzAgCBwkAzAgCBQR1c2VyCQDMCAIGCQDMCAIJAKwCAgkArAICBQtiQXNzZXRJZFN0cgIKLGJvcnJvd2VkLAkApAMBBQdiQW1vdW50BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgULYm9ycm93VmFsdWUFC2JvcnJvd1ZhbHVlAwkAZgIFC2JvcnJvd1ZhbHVlBQ9jb2xsYXRlcmFsVmFsdWUJAAIBAh5ub3QgZW5vdWdoIGNvbGxhdGVyYWwgcHJvdmlkZWQJAM4IAggFCWJvcnJvd1JlcwJfMQgFCXN1cHBseVJlcwJfMQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQZzdXBwbHkAAwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAACQACAQIcMSBwYXltZW50IGhhcyB0byBiZSBhdHRhY2hlZAQKYXNzZXRJZFN0cgkBDmdldEFzc2V0U3RyaW5nAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAthc3NldEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECmF4bHlOb3RpZnkJAPwHBAUSYXhseUZhcm1pbmdBZGRyZXNzAgpsZW5kQWN0aW9uCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFCmFzc2V0SWRTdHIFA25pbAUDbmlsAwkAAAIFCmF4bHlOb3RpZnkFCmF4bHlOb3RpZnkJAQ5zdXBwbHlJbnRlcm5hbAMFCmFzc2V0SWRTdHIFC2Fzc2V0QW1vdW50CQClCAEIBQFpBmNhbGxlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwIKYXNzZXRJZFN0cgthc3NldEFtb3VudAQNJHQwMTMyMzgxMzMwNQkBDWdldEFjdHVhbFJhdGUCBQphc3NldElkU3RyAgVzUmF0ZQQFc1JhdGUIBQ0kdDAxMzIzODEzMzA1Al8xBBFyYXRlc1JlY2FsY1Jlc3VsdAgFDSR0MDEzMjM4MTMzMDUCXzIEBmFtb3VudAkAbgQFC2Fzc2V0QW1vdW50BQdTY2FsZTE2BQVzUmF0ZQUHQ0VJTElORwQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDWFzc2V0U3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIEDWFzc2V0Qm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIEEXVzZXJBc3NldFN1cHBsaWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQphc3NldElkU3RyBBF1c2VyQXNzZXRCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgQKYXhseU5vdGlmeQkA/AcEBRJheGx5RmFybWluZ0FkZHJlc3MCCmxlbmRBY3Rpb24JAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUKYXNzZXRJZFN0cgUDbmlsBQNuaWwDCQAAAgUKYXhseU5vdGlmeQUKYXhseU5vdGlmeQQSY29sbGF0ZXJhbFZhbHVlSW52CQD8BwQFBHRoaXMCEWdldFVzZXJDb2xsYXRlcmFsCQDMCAIHCQDMCAIFB2FkZHJlc3MJAMwIAgYJAMwIAgkArAICCQCsAgIFCmFzc2V0SWRTdHICCixzdXBwbGllZCwJAKQDAQkBAS0BBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFEmNvbGxhdGVyYWxWYWx1ZUludgUSY29sbGF0ZXJhbFZhbHVlSW52BA9jb2xsYXRlcmFsVmFsdWUEByRtYXRjaDAFEmNvbGxhdGVyYWxWYWx1ZUludgMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgJAAIBAh9jYW4ndCBnZXQgdXNlciBjb2xsYXRlcmFsIHZhbHVlAwkBASEBCQENdHJ5R2V0Qm9vbGVhbgECDHNldHVwX2FjdGl2ZQkAAgECEW1hcmtldCBpcyBzdG9wcGVkAwkAZgIAAAUPY29sbGF0ZXJhbFZhbHVlCQACAQIyeW91IGRvbnQgaGF2ZSBlbm91Z2ggY29sbGF0ZXJhbCBmb3IgdGhpcyBvcGVyYXRpb24DCQBmAgUGYW1vdW50CQBlAgUNYXNzZXRTdXBwbGllZAUNYXNzZXRCb3Jyb3dlZAkAAgECKnRoaXMgYW1vdW50IGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIG1hcmtldAMJAGYCBQZhbW91bnQJAGUCBRF1c2VyQXNzZXRTdXBwbGllZAURdXNlckFzc2V0Qm9ycm93ZWQJAAIBAip0aGlzIGFtb3VudCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIHVzZXIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FCmFzc2V0SWRTdHIJAGUCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQphc3NldElkU3RyBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyCQBlAgkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgUGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULYXNzZXRBbW91bnQJAQ1nZXRBc3NldEJ5dGVzAQUKYXNzZXRJZFN0cgUDbmlsBRFyYXRlc1JlY2FsY1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVyZXBheQADCQEBIQEJAQ10cnlHZXRCb29sZWFuAQIMc2V0dXBfYWN0aXZlCQACAQIRbWFya2V0IGlzIHN0b3BwZWQDAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABBgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAJAAIBAhwxIHBheW1lbnQgaGFzIHRvIGJlIGF0dGFjaGVkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEC2Fzc2V0QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQNJHQwMTUxMjIxNTE4OQkBDWdldEFjdHVhbFJhdGUCBQphc3NldElkU3RyAgViUmF0ZQQFYlJhdGUIBQ0kdDAxNTEyMjE1MTg5Al8xBBFyYXRlc1JlY2FsY1Jlc3VsdAgFDSR0MDE1MTIyMTUxODkCXzIEBmFtb3VudAkAbgQFC2Fzc2V0QW1vdW50BQdTY2FsZTE2BQViUmF0ZQUHQ0VJTElORwQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDWFzc2V0U3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIEDWFzc2V0Qm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIEEXVzZXJBc3NldEJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQphc3NldElkU3RyBAphbW91bnRMZWZ0CQBlAgURdXNlckFzc2V0Qm9ycm93ZWQFBmFtb3VudAQLcmVwYXlBbW91bnQDCQBnAgUKYW1vdW50TGVmdAAABQZhbW91bnQFEXVzZXJBc3NldEJvcnJvd2VkAwkAAAIJALMJAgkBDHRyeUdldFN0cmluZwECDHNldHVwX3Rva2VucwUKYXNzZXRJZFN0cgUEdW5pdAkAAgECKXRoaXMgYXNzZXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbWFya2V0CQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIJAGUCBRF1c2VyQXNzZXRCb3Jyb3dlZAULcmVwYXlBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQphc3NldElkU3RyCQBlAgUNYXNzZXRCb3Jyb3dlZAULcmVwYXlBbW91bnQFA25pbAURcmF0ZXNSZWNhbGNSZXN1bHQDCQBnAgUKYW1vdW50TGVmdAAABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQEBLQEFCmFtb3VudExlZnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsAWkBCHJlcGF5Rm9yAQdhZGRyZXNzAwkBASEBCQENdHJ5R2V0Qm9vbGVhbgECDHNldHVwX2FjdGl2ZQkAAgECEW1hcmtldCBpcyBzdG9wcGVkAwkBASEBCQEUdmVyaWZ5U2VudGluZWxSaWdodHMBCAUBaQZjYWxsZXIJAAIBAhxhdmFpbGFibGUgb25seSBmb3Igd2hpdGVsaXN0AwkAAAIFB2FkZHJlc3MCBmdsb2JhbAkAAgECIHlvdSBjYW4ndCByZXBheSBmb3IgZXZlcnlvbmUgOl8pAwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAACQACAQIcMSBwYXltZW50IGhhcyB0byBiZSBhdHRhY2hlZAQKYXNzZXRJZFN0cgkBDmdldEFzc2V0U3RyaW5nAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAthc3NldEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEDSR0MDE2NjUyMTY3MTkJAQ1nZXRBY3R1YWxSYXRlAgUKYXNzZXRJZFN0cgIFYlJhdGUEBWJSYXRlCAUNJHQwMTY2NTIxNjcxOQJfMQQRcmF0ZXNSZWNhbGNSZXN1bHQIBQ0kdDAxNjY1MjE2NzE5Al8yBAZhbW91bnQJAG4EBQthc3NldEFtb3VudAUHU2NhbGUxNgUFYlJhdGUFB0NFSUxJTkcEDWFzc2V0U3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIEDWFzc2V0Qm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIEEXVzZXJBc3NldEJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQphc3NldElkU3RyBAphbW91bnRMZWZ0CQBlAgURdXNlckFzc2V0Qm9ycm93ZWQFBmFtb3VudAQLcmVwYXlBbW91bnQDCQBnAgUKYW1vdW50TGVmdAAABQZhbW91bnQFEXVzZXJBc3NldEJvcnJvd2VkBBFleHRyYUFtb3VudFJlc3VsdAMJAGcCBQphbW91bnRMZWZ0AAAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAQEtAQUKYW1vdW50TGVmdAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwEDndpdGhkcmF3UmVzdWx0AwkAAAIIBQFpBmNhbGxlcgULYXhseUFkZHJlc3MKAQRmb2xkAgVhY2N1bQphc3NldElkU3RyBAx1c2VyU3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIDCQBmAgUMdXNlclN1cHBsaWVkAAAJAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQphc3NldElkU3RyAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyCQBlAgkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgUMdXNlclN1cHBsaWVkBQNuaWwFBWFjY3VtCgACJGwFB2F4bHlMUHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDgJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIBQNuaWwDCQAAAgkAswkCCQEMdHJ5R2V0U3RyaW5nAQIMc2V0dXBfdG9rZW5zBQphc3NldElkU3RyBQR1bml0CQACAQIpdGhpcyBhc3NldCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBtYXJrZXQJAM4IAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQphc3NldElkU3RyCQBlAgURdXNlckFzc2V0Qm9ycm93ZWQFC3JlcGF5QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgkAZQIFDWFzc2V0Qm9ycm93ZWQFC3JlcGF5QW1vdW50BQNuaWwFEXJhdGVzUmVjYWxjUmVzdWx0BRFleHRyYUFtb3VudFJlc3VsdAUOd2l0aGRyYXdSZXN1bHQBaQETYWRkSW50ZXJlc3RFWFRFUk5BTAAEBmFtb3VudAkAawMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AFAAZAQHYXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkBAZlYXJuZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAhVhdXRvc3Rha2VfbGFzdEVhcm5lZF8FCmFzc2V0SWRTdHIECmxhc3RIZWlnaHQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAhRhdXRvc3Rha2VfbGFzdEJsb2NrXwUKYXNzZXRJZFN0cgQMc3RhdGVDaGFuZ2VzAwMJAAACBQpsYXN0SGVpZ2h0BQZoZWlnaHQGCQAAAgUGYW1vdW50AAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhhhdXRvc3Rha2VfcHJlTGFzdEVhcm5lZF8FCmFzc2V0SWRTdHIFBmVhcm5lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhdhdXRvc3Rha2VfcHJlTGFzdEJsb2NrXwUKYXNzZXRJZFN0cgUKbGFzdEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhVhdXRvc3Rha2VfbGFzdEVhcm5lZF8FCmFzc2V0SWRTdHIJAGQCBQZlYXJuZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhRhdXRvc3Rha2VfbGFzdEJsb2NrXwUKYXNzZXRJZFN0cgUGaGVpZ2h0BQNuaWwJAM4IAgUMc3RhdGVDaGFuZ2VzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICBl9zUmF0ZQkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphc3NldElkU3RyAgZfc1JhdGUJAGsDBQdTY2FsZTE2BQZhbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIFA25pbAFpAQdwcmVJbml0BAZ0b2tlbnMEbHR2cwNsdHMJcGVuYWx0aWVzCgEBZgIFYWNjdW0FdG9rZW4JAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUFdG9rZW4CBl9iUmF0ZQUHU2NhbGUxNgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQV0b2tlbgIGX3NSYXRlBQdTY2FsZTE2BQNuaWwDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgphZG1pbiBvbmx5BAVyYXRlcwoAAiRsCQC1CQIFBnRva2VucwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEBZgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCAgxzZXR1cF90b2tlbnMFBnRva2VucwkAzAgCCQELU3RyaW5nRW50cnkCAgpzZXR1cF9sdHZzBQRsdHZzCQDMCAIJAQtTdHJpbmdFbnRyeQICCXNldHVwX2x0cwUDbHRzCQDMCAIJAQtTdHJpbmdFbnRyeQICD3NldHVwX3BlbmFsdGllcwUJcGVuYWx0aWVzCQDMCAIJAQxCb29sZWFuRW50cnkCAgxzZXR1cF9hY3RpdmUGBQNuaWwFBXJhdGVzAWkBDGluaXROZXdUb2tlbgQFdG9rZW4DbHR2Amx0B3BlbmFsdHkDAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQEaAVcUeViFwPoaZ+cUNI0M98TwbUXt9hz5PUEHCQACAQIKYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCAgxzZXR1cF90b2tlbnMJAKwCAgkArAICCQEMdHJ5R2V0U3RyaW5nAQIMc2V0dXBfdG9rZW5zAgEsBQV0b2tlbgkAzAgCCQELU3RyaW5nRW50cnkCAgpzZXR1cF9sdHZzCQCsAgIJAKwCAgkBDHRyeUdldFN0cmluZwECCnNldHVwX2x0dnMCASwFA2x0dgkAzAgCCQELU3RyaW5nRW50cnkCAglzZXR1cF9sdHMJAKwCAgkArAICCQEMdHJ5R2V0U3RyaW5nAQIJc2V0dXBfbHRzAgEsBQJsdAkAzAgCCQELU3RyaW5nRW50cnkCAg9zZXR1cF9wZW5hbHRpZXMJAKwCAgkArAICCQEMdHJ5R2V0U3RyaW5nAQIPc2V0dXBfcGVuYWx0aWVzAgEsBQdwZW5hbHR5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBXRva2VuAgZfYlJhdGUFB1NjYWxlMTYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUFdG9rZW4CBl9zUmF0ZQUHU2NhbGUxNgUDbmlsAWkBD3VwZGF0ZVBhcmFtZXRlcgIDa2V5A3ZhbAMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAQIhPQIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBARoBVxR5WIXA+hpn5xQ0jQz3xPBtRe32HPk9QQcJAAIBAgphZG1pbiBvbmx5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQNrZXkJAQ1wYXJzZUludFZhbHVlAQUDdmFsBQNuaWwBaQEMdXBkYXRlU3RyaW5nAgNrZXkDdmFsAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkGY2FsbGVyCQEHQWRkcmVzcwEBGgFXFHlYhcD6GmfnFDSNDPfE8G1F7fYc+T1BBwkAAgECCmFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAFpARJjbGFpbVRvUmVzZXJ2ZUZ1bmQBBWRlYnVnBAZhc3NldHMJAQ9nZXRNYXJrZXRBc3NldHMABAVyYXRlcwgJAQ1nZXRBY3R1YWxSYXRlAgkAkQMCBQZhc3NldHMAAAIFc1JhdGUCXzIEAmxpCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALBQNuaWwKAQFmAgVhY2N1bQFuAwkAZwIFAW4JAJADAQUGYXNzZXRzBQVhY2N1bQQKYXNzZXRJZFN0cgkAkQMCBQZhc3NldHMFAW4ED2F1dG9zdGFrZUFtb3VudAkBDHRyeUdldFN0cmluZwEJAKwCAgIRYXV0b3N0YWtlX2Ftb3VudF8FCmFzc2V0SWRTdHIEBmFtb3VudAkAZQIJAGQCCQBkAgkAZAIJAQpnZXRCYWxhbmNlAQUKYXNzZXRJZFN0cgkBDXRyeUdldEludGVnZXIBCQCsAgICEWF1dG9zdGFrZV9hbW91bnRfBQphc3NldElkU3RyAwkBAiE9AgUPYXV0b3N0YWtlQW1vdW50AgAJAQ1wYXJzZUludFZhbHVlAQUPYXV0b3N0YWtlQW1vdW50AAAJAGsDCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQphc3NldElkU3RyCAkAkQMCBQVyYXRlcwkAZAIJAGgCBQFuAAMAAQV2YWx1ZQUHU2NhbGUxNgkAawMJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIICQCRAwIFBXJhdGVzCQBoAgUBbgADBXZhbHVlBQdTY2FsZTE2BANpbnYDCQBmAgkBDXRyeUdldEludGVnZXIBCQCsAgICEWF1dG9zdGFrZV9hbW91bnRfBQphc3NldElkU3RyAAAJAPwHBAUEdGhpcwIMdW5zdGFrZVRva2VuCQDMCAIFCmFzc2V0SWRTdHIJAMwIAgkAlgMBCQDMCAIFBmFtb3VudAkAzAgCAAAFA25pbAUDbmlsBQNuaWwAAAMJAAACBQNpbnYFA2ludgkAzggCBQVhY2N1bQkAzAgCBQZhbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQJcGFyYW1ldGVyCgACJGwFAmxpCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAoBAmYyAgVhY2N1bQFuAwkAZwIFAW4JAJADAQUGYXNzZXRzBQVhY2N1bQQKYXNzZXRJZFN0cgkAkQMCBQZhc3NldHMFAW4JAM4IAgUFYWNjdW0JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUScmVzZXJ2ZUZ1bmRBZGRyZXNzCQCWAwEJAMwIAgkAkQMCBQlwYXJhbWV0ZXIFAW4JAMwIAgAABQNuaWwJAQ1nZXRBc3NldEJ5dGVzAQUKYXNzZXRJZFN0cgUDbmlsAwUFZGVidWcJAAIBCQEKbGlJbnRUb1N0cgEFCXBhcmFtZXRlcgkAlAoCCgACJGwFAmxpCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQJmMgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwFCXBhcmFtZXRlcgFpAQhzaHV0ZG93bgEIc2h1dGRvd24DCQAAAgkAzwgCBRFzaHV0ZG93bldoaXRlbGlzdAgIBQFpBmNhbGxlcgVieXRlcwUEdW5pdAkAAgECF3VzZXIgbm90IGluIGEgd2hpdGVsaXN0CQDMCAIJAQxCb29sZWFuRW50cnkCAgxzZXR1cF9hY3RpdmUJAQEhAQUIc2h1dGRvd24FA25pbAFpAQlsaXF1aWRhdGUGBWRlYnVnB2FkZHJlc3MLYXNzZXRBbW91bnQLc0Fzc2V0SWRTdHILYkFzc2V0SWRTdHIIcm91dGVTdHIDCQEBIQEJARZ2ZXJpZnlMaXF1aWRhdG9yUmlnaHRzAQgFAWkGY2FsbGVyCQACAQIcYXZhaWxhYmxlIGZvciB3aGl0ZWxpc3Qgb25seQMJAQEhAQkBDXRyeUdldEJvb2xlYW4BAgxzZXR1cF9hY3RpdmUJAAIBAhFtYXJrZXQgaXMgc3RvcHBlZAQOdXNlckNvbGxhdGVyYWwJARJjYWxjVXNlckNvbGxhdGVyYWwBBQdhZGRyZXNzAwkAAAIFDnVzZXJDb2xsYXRlcmFsBQ51c2VyQ29sbGF0ZXJhbAQNJHQwMjI4NTUyMjkxNwkBDWdldEFjdHVhbFJhdGUCBQtzQXNzZXRJZFN0cgIFc1JhdGUEBXNSYXRlCAUNJHQwMjI4NTUyMjkxNwJfMQQLcmF0ZXNSZXN1bHQIBQ0kdDAyMjg1NTIyOTE3Al8yBA0kdDAyMjkyMjIyOTkxCQENZ2V0QWN0dWFsUmF0ZQIFC2JBc3NldElkU3RyAgViUmF0ZQQFYlJhdGUIBQ0kdDAyMjkyMjIyOTkxAl8xBBJyYXRlc1JlY2FsY1Jlc3VsdDIIBQ0kdDAyMjkyMjIyOTkxAl8yBAxzQXNzZXRBbW91bnQJAGsDBQthc3NldEFtb3VudAUHU2NhbGUxNgUFc1JhdGUEEGN1cnJlbnRTUG9zaXRpb24JAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FC3NBc3NldElkU3RyBBNjdXJyZW50QlBvc2l0aW9uVmFsCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQtiQXNzZXRJZFN0cgQQY3VycmVudEJQb3NpdGlvbgMJAGYCBRNjdXJyZW50QlBvc2l0aW9uVmFsAAAFE2N1cnJlbnRCUG9zaXRpb25WYWwJAAIBAiB1c2VyIGhhcyBubyBib3Jyb3cgaW4gdGhpcyB0b2tlbgMJAGYCBQ51c2VyQ29sbGF0ZXJhbAAACQACAQIYdXNlciBjYW4ndCBiZSBsaXF1aWRhdGVkAwkAZgIFDHNBc3NldEFtb3VudAUQY3VycmVudFNQb3NpdGlvbgkAAgECMnBvc2l0aW9uIHRvIGxpcXVpZGF0ZSBpcyBiaWdnZXIgdGhhbiB1c2VyJ3Mgc3VwcGx5BANpbnYDCQECIT0CCQDPCAIFB2F4bHlMUHMFC3NBc3NldElkU3RyBQR1bml0BAVwb3NJZAkAkQMCCQC1CQIFB2FkZHJlc3MCAV8AAQQJYWRkcmVzc0lkCQCRAwIJALUJAgUHYWRkcmVzcwIBXwAACQD9BwQFC2F4bHlBZGRyZXNzAglsaXF1aWRhdGUJAMwIAgUJYWRkcmVzc0lkCQDMCAIFBXBvc0lkCQDMCAIFDHNBc3NldEFtb3VudAUDbmlsBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQOYmFsYW5jZTBCZWZvcmUJAQpnZXRCYWxhbmNlAQULc0Fzc2V0SWRTdHIDCQAAAgUOYmFsYW5jZTBCZWZvcmUFDmJhbGFuY2UwQmVmb3JlBA5iYWxhbmNlMUJlZm9yZQkBCmdldEJhbGFuY2UBBQtiQXNzZXRJZFN0cgMJAAACBQ5iYWxhbmNlMUJlZm9yZQUOYmFsYW5jZTFCZWZvcmUEDmV4Y2hhbmdlSW52b2tlCQD8BwQFEWFnZ3JlZ2F0b3JBZGRyZXNzAgRzd2FwCQDMCAIFCHJvdXRlU3RyCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0QXNzZXRCeXRlcwEFC3NBc3NldElkU3RyBQthc3NldEFtb3VudAUDbmlsAwkAAAIFDmV4Y2hhbmdlSW52b2tlBQ5leGNoYW5nZUludm9rZQQKYXNzZXQwU29sZAkAZQIFDmJhbGFuY2UwQmVmb3JlCQEKZ2V0QmFsYW5jZQEFC3NBc3NldElkU3RyAwkAAAIFCmFzc2V0MFNvbGQFCmFzc2V0MFNvbGQEDGFzc2V0MUJvdWdodAkAZQIJAQpnZXRCYWxhbmNlAQULYkFzc2V0SWRTdHIFDmJhbGFuY2UxQmVmb3JlAwkAAAIFDGFzc2V0MUJvdWdodAUMYXNzZXQxQm91Z2h0BAthc3NldDBQcmljZQgJAQ1nZXRUb2tlblByaWNlAQULc0Fzc2V0SWRTdHICXzEEC2Fzc2V0MFNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBBQtzQXNzZXRJZFN0cgQJYXNzZXQwVXNkCQBrAwUKYXNzZXQwU29sZAULYXNzZXQwUHJpY2UFC2Fzc2V0MFNjYWxlBAthc3NldDFQcmljZQgJAQ1nZXRUb2tlblByaWNlAQULYkFzc2V0SWRTdHICXzIEC2Fzc2V0MVNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBBQtiQXNzZXRJZFN0cgQJYXNzZXQxVXNkCQBrAwUMYXNzZXQxQm91Z2h0BQthc3NldDFQcmljZQULYXNzZXQxU2NhbGUEB3BlbmFsdHkJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAQx0cnlHZXRTdHJpbmcBAg9zZXR1cF9wZW5hbHRpZXMCASwJAQV2YWx1ZQEJAM8IAgkBD2dldE1hcmtldEFzc2V0cwAFC2JBc3NldElkU3RyBBFsaXF1aWRhdGlvblByb2ZpdAkAZQIFCWFzc2V0MVVzZAkAawMFCWFzc2V0MFVzZAkAZQIFBlNjYWxlOAUHcGVuYWx0eQUGU2NhbGU4BAxzQXNzZXRDaGFuZ2UJAGsDBQphc3NldDBTb2xkBQdTY2FsZTE2BQVzUmF0ZQQMYkFzc2V0Q2hhbmdlCQBrAwkAawMFDGFzc2V0MUJvdWdodAUHU2NhbGUxNgUFYlJhdGUJAGUCBQZTY2FsZTgJAGsDBRFsaXF1aWRhdGlvblByb2ZpdAUGU2NhbGU4BQlhc3NldDFVc2QFBlNjYWxlOAMJAGYCBQphc3NldDBTb2xkBQthc3NldEFtb3VudAkAAgECI21vcmUgYXNzZXRzIGV4Y2hhbmdlZCB0aGFuIGV4cGVjdGVkAwkAZgIAAAURbGlxdWlkYXRpb25Qcm9maXQJAAIBAi9wcmljZSBpbXBhY3QgaXMgYmlnZ2VyIHRoYW4gbGlxdWlkYXRpb24gcGVuYWx0eQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FC3NBc3NldElkU3RyCQBlAgUQY3VycmVudFNQb3NpdGlvbgUMc0Fzc2V0Q2hhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwULYkFzc2V0SWRTdHIJAGUCBRBjdXJyZW50QlBvc2l0aW9uBQxiQXNzZXRDaGFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQtzQXNzZXRJZFN0cgkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FC3NBc3NldElkU3RyBQxzQXNzZXRDaGFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQtiQXNzZXRJZFN0cgkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FC2JBc3NldElkU3RyBQxiQXNzZXRDaGFuZ2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtsaXF1aWRhdGVWMgUFZGVidWcHYWRkcmVzcwtzQXNzZXRJZFN0cgtiQXNzZXRJZFN0chBsaXF1aWRhdGVQZXJjZW50AwkBASEBCQEWdmVyaWZ5TGlxdWlkYXRvclJpZ2h0cwEIBQFpBmNhbGxlcgkAAgECHGF2YWlsYWJsZSBmb3Igd2hpdGVsaXN0IG9ubHkDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQIMc2V0dXBfYWN0aXZlCQACAQIRbWFya2V0IGlzIHN0b3BwZWQEDnVzZXJDb2xsYXRlcmFsCQESY2FsY1VzZXJDb2xsYXRlcmFsAQUHYWRkcmVzcwMJAAACBQ51c2VyQ29sbGF0ZXJhbAUOdXNlckNvbGxhdGVyYWwEEGN1cnJlbnRTUG9zaXRpb24JAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FC3NBc3NldElkU3RyBBBjdXJyZW50QlBvc2l0aW9uCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQtiQXNzZXRJZFN0cgMJAAACCQDPCAIFB2F4bHlMUHMFC3NBc3NldElkU3RyBQR1bml0CQACAQIOd3JvbmcgbHAgYXNzZXQDCQBnAgAABRBjdXJyZW50QlBvc2l0aW9uCQACAQIgdXNlciBoYXMgbm8gYm9ycm93IGluIHRoaXMgdG9rZW4DAwkAZgIFDnVzZXJDb2xsYXRlcmFsAAAGCQAAAgUQY3VycmVudEJQb3NpdGlvbgAACQACAQIYdXNlciBjYW4ndCBiZSBsaXF1aWRhdGVkBAhiQXNzZXRJZAkBDWdldEFzc2V0Qnl0ZXMBBQtiQXNzZXRJZFN0cgQMbWFya2V0QXNzZXRzCQEPZ2V0TWFya2V0QXNzZXRzAAQJYXNzZXQxTnVtCQEFdmFsdWUBCQDPCAIFDG1hcmtldEFzc2V0cwULYkFzc2V0SWRTdHIECWFzc2V0ME51bQkBBXZhbHVlAQkAzwgCBQxtYXJrZXRBc3NldHMFC3NBc3NldElkU3RyBAdwZW5hbHR5CQENcGFyc2VJbnRWYWx1ZQEJAQV2YWx1ZQEJAJEDAgkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIPc2V0dXBfcGVuYWx0aWVzAgEsBQlhc3NldDFOdW0EDSR0MDI2NzA2MjY3NjgJAQ1nZXRBY3R1YWxSYXRlAgULYkFzc2V0SWRTdHICBWJSYXRlBAViUmF0ZQgFDSR0MDI2NzA2MjY3NjgCXzEEC3JhdGVzUmVzdWx0CAUNJHQwMjY3MDYyNjc2OAJfMgQHYkFtb3VudAkAawMFEGN1cnJlbnRCUG9zaXRpb24FBWJSYXRlBQdTY2FsZTE2BAdsQW1vdW50CQBrAwUHYkFtb3VudAUQbGlxdWlkYXRlUGVyY2VudABkBBJsQW1vdW50V2l0aFBlbmFsdHkJAGsDBQdsQW1vdW50CQBkAgUGU2NhbGU4BQdwZW5hbHR5BQZTY2FsZTgECGxiQW1vdW50CQBrAwUHbEFtb3VudAUHU2NhbGUxNgUFYlJhdGUEBXBvc0lkCQCRAwIJALUJAgUHYWRkcmVzcwIBXwABBAlhZGRyZXNzSWQJAJEDAgkAtQkCBQdhZGRyZXNzAgFfAAAECXNBbW91bnRMcAoAAUAJAP0HBAULYXhseUFkZHJlc3MCCWxpcXVpZGF0ZQkAzAgCBQlhZGRyZXNzSWQJAMwIAgUFcG9zSWQJAMwIAgUSbEFtb3VudFdpdGhQZW5hbHR5BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUJc0Ftb3VudExwBQlzQW1vdW50THAEB3NBbW91bnQJAGsDBQlzQW1vdW50THAFB1NjYWxlMTYICQCRAwIFC3JhdGVzUmVzdWx0CQBkAgkAaAIFCWFzc2V0ME51bQADAAEFdmFsdWUDBQVkZWJ1ZwkAAgECFWxpcXVpZGF0aW9uIHdpbGwgcGFzcwkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFEmxBbW91bnRXaXRoUGVuYWx0eQUHbEFtb3VudAUIYkFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQtzQXNzZXRJZFN0cgkAZQIFEGN1cnJlbnRTUG9zaXRpb24FB3NBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQtiQXNzZXRJZFN0cgkAZQIFEGN1cnJlbnRCUG9zaXRpb24FCGxiQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX3N1cHBsaWVkXwULc0Fzc2V0SWRTdHIJAGUCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQtzQXNzZXRJZFN0cgUHc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAg90b3RhbF9ib3Jyb3dlZF8FC2JBc3NldElkU3RyCQBlAgkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX2JvcnJvd2VkXwULYkFzc2V0SWRTdHIFCGxiQW1vdW50BQNuaWwFC3JhdGVzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWdldFVzZXJDb2xsYXRlcmFsBAVkZWJ1ZwdhZGRyZXNzDW1pbnVzQm9ycm93ZWQLYWZ0ZXJDaGFuZ2UEBmFzc2V0cwkBD2dldE1hcmtldEFzc2V0cwAEBGx0dnMJALUJAgkBDHRyeUdldFN0cmluZwECCnNldHVwX2x0dnMCASwEA2x0cwkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIJc2V0dXBfbHRzAgEsBAVyYXRlcwgJAQ1nZXRBY3R1YWxSYXRlAgkAkQMCBQZhc3NldHMAAAIFc1JhdGUCXzIEDWNoYW5nZUhhbmRsZXIJALUJAgULYWZ0ZXJDaGFuZ2UCASwKAQFmAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQJAJADAQUGYXNzZXRzBQVhY2N1bQQMdXNlclN1cHBsaWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfCQCRAwIFBmFzc2V0cwUEbmV4dAQMdXNlckJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfCQCRAwIFBmFzc2V0cwUEbmV4dAQTbmVlZFRva2VuQWNjb3VudGluZwMJAAACBQthZnRlckNoYW5nZQIAAwMJAQIhPQIFDHVzZXJCb3Jyb3dlZAAABgkBAiE9AgUMdXNlclN1cHBsaWVkAAAGBwYDBRNuZWVkVG9rZW5BY2NvdW50aW5nBAphc3NldFNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBCQCRAwIFBmFzc2V0cwUEbmV4dAQKYXNzZXRQcmljZQkBDWdldFRva2VuUHJpY2UBCQCRAwIFBmFzc2V0cwUEbmV4dAkAZQIJAGQCBQVhY2N1bQkAawMJAGsDCQBrAwkAZAIFDHVzZXJTdXBwbGllZAMDAwkBAiE9AgULYWZ0ZXJDaGFuZ2UCAAkAAAIJAJEDAgUNY2hhbmdlSGFuZGxlcgAACQCRAwIFBmFzc2V0cwUEbmV4dAcJAAACCQCRAwIFDWNoYW5nZUhhbmRsZXIAAQIIc3VwcGxpZWQHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUNY2hhbmdlSGFuZGxlcgACAAAICQCRAwIFBXJhdGVzCQBoAgUEbmV4dAADBXZhbHVlBQdTY2FsZTE2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbHR2cwUEbmV4dAUGU2NhbGU4CAUKYXNzZXRQcmljZQJfMQUKYXNzZXRTY2FsZQMFDW1pbnVzQm9ycm93ZWQJAGsDCQBrAwkAawMJAGQCBQx1c2VyQm9ycm93ZWQDAwMJAQIhPQIFC2FmdGVyQ2hhbmdlAgAJAAACCQCRAwIFDWNoYW5nZUhhbmRsZXIAAAkAkQMCBQZhc3NldHMFBG5leHQHCQAAAgkAkQMCBQ1jaGFuZ2VIYW5kbGVyAAECCGJvcnJvd2VkBwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWNoYW5nZUhhbmRsZXIAAgAACAkAkQMCBQVyYXRlcwkAZAIJAGgCBQRuZXh0AAMAAQV2YWx1ZQUHU2NhbGUxNgUGU2NhbGU4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbHRzBQRuZXh0CAUKYXNzZXRQcmljZQJfMgUKYXNzZXRTY2FsZQAABQVhY2N1bQQGcmVzdWx0CgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEBZgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwDBQVkZWJ1ZwkAAgEJAKQDAQUGcmVzdWx0CQCUCgIFA25pbAUGcmVzdWx0AWkBDGdldEFzc2V0RGVidAMFZGVidWcHYWRkcmVzcwphc3NldElkU3RyBAx1c2VyQm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ5jYWxjQXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEBHJhdGUICQENZ2V0QWN0dWFsUmF0ZQIFCmFzc2V0SWRTdHICBWJSYXRlAl8xBAZyZXN1bHQJAGsDBQx1c2VyQm9ycm93ZWQFBHJhdGUFB1NjYWxlMTYDBQVkZWJ1ZwkAAgEJAKQDAQUGcmVzdWx0CQCUCgIFA25pbAUGcmVzdWx0AWkBCWdldFByaWNlcwEFZGVidWcEBmFzc2V0cwkBD2dldE1hcmtldEFzc2V0cwAKAQFmAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQJAJADAQUGYXNzZXRzBQVhY2N1bQQKYXNzZXRQcmljZQkBFWdldFRva2VuUHJpY2VXaXRoUmlzawIJAJEDAgUGYXNzZXRzBQRuZXh0AAMJAKwCAgkArAICCQCsAgIJAKwCAgUFYWNjdW0JAKQDAQgFCmFzc2V0UHJpY2UCXzECASwJAKQDAQgFCmFzc2V0UHJpY2UCXzICAXwEBnJlc3VsdAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBAWYCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAwUFZGVidWcJAAIBBQZyZXN1bHQJAJQKAgUDbmlsBQZyZXN1bHQBaQEZY2FsY3VsYXRlVXRpbGl6YXRpb25SYXRpbwIKYXNzZXRJZFN0cgVkZWJ1ZwMFBWRlYnVnCQACAQkApAMBCQEFZ2V0VXIBBQphc3NldElkU3RyCQCUCgIFA25pbAkBBWdldFVyAQUKYXNzZXRJZFN0cgFpARNjYWxjdWxhdGVPdXRkYXRlZFVSAgphc3NldElkU3RyBWRlYnVnAwUFZGVidWcJAAIBCQCkAwEJAQ1nZXRPdXRkYXRlZFVyAQUKYXNzZXRJZFN0cgkAlAoCBQNuaWwJAQ1nZXRPdXRkYXRlZFVyAQUKYXNzZXRJZFN0cgFpARNjYWxjdWxhdGVUb2tlblJhdGVzAQVkZWJ1ZwoBAWYCBWFjY3VtCmFzc2V0SWRTdHIEBXJhdGVzCQEQdG9rZW5SYXRlc1JlY2FsYwEFCmFzc2V0SWRTdHIJAJQKAgkArAICCQCsAgIJAKwCAgkArAICCAUFYWNjdW0CXzEJAKQDAQgJAJEDAgUFcmF0ZXMAAQV2YWx1ZQIBfAkApAMBCAkAkQMCBQVyYXRlcwAABXZhbHVlAgEsCQDOCAIIBQVhY2N1bQJfMgUFcmF0ZXMECXBhcmFtZXRlcgoAAiRsCQEPZ2V0TWFya2V0QXNzZXRzAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgIABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBAWYCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAwUFZGVidWcJAAIBCAUJcGFyYW1ldGVyAl8xCQCUCgIIBQlwYXJhbWV0ZXICXzIIBQlwYXJhbWV0ZXICXzEBaQEXY2FsY3VsYXRlVG9rZW5zSW50ZXJlc3QBBWRlYnVnCgEBZgIFYWNjdW0KYXNzZXRJZFN0cgQEcmF0ZQkAawMJAQtnZXRJbnRlcmVzdAEFCmFzc2V0SWRTdHIFCWRheUJsb2NrcwUGU2NhbGU4CQCsAgIJAKwCAgUFYWNjdW0JAKQDAQUEcmF0ZQIBLAQJcGFyYW1ldGVyCgACJGwJAQ9nZXRNYXJrZXRBc3NldHMACgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAMFBWRlYnVnCQACAQUJcGFyYW1ldGVyCQCUCgIFA25pbAUJcGFyYW1ldGVyAQJ0eAEGdmVyaWZ5AAMDAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAEg/XXg3oez6DuanjNsQ3pWRVALIo9nVy/USV6BgJV9XQEGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAAASCQpp9/Me/Ta3E4MktVjg3Z8DeDRSAIRX8xeT7HVuKEewYDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAAASCrbxa8v207ZHzhqtYYnaB9Vbwn7a+w8MVfVlHIR6e+DwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAEgKbckhk5myg/hITioMUdwF/LzLKDoZhzjA4uiFMJALjsHBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAEgg+9yjO0MVG+H/6tptnuhDhRCcXb/2yh0N7GUlEBy6A2E9HlU", "height": 4014169, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GizFyRV8cWRw9hGEGxn8NZE38yTdyqNCaejp6XLbA3wT Next: GXeptUFu1Z2v2tiQG2CLhDiLhBuNaMHpozfgmTtBhqUk Diff:
Old | New | Differences | |
---|---|---|---|
799 | 799 | ||
800 | 800 | ||
801 | 801 | @Callable(aR) | |
802 | - | func liquidateV2 (bB,i,aT,aU) = if (!(h(aR.caller))) | |
802 | + | func liquidateV2 (bB,i,aT,aU,cl) = if (!(h(aR.caller))) | |
803 | 803 | then throw("available for whitelist only") | |
804 | 804 | else if (!(G("setup_active"))) | |
805 | 805 | then throw("market is stopped") | |
819 | 819 | then throw("user can't be liquidated") | |
820 | 820 | else { | |
821 | 821 | let ba = L(aU) | |
822 | - | let cl = N() | |
823 | - | let cm = value(indexOf(cl, aU)) | |
824 | - | let bz = parseIntValue(value(split(H("setup_penalties"), ",")[cm])) | |
825 | - | let cn = ad(aU, "bRate") | |
826 | - | let aL = cn._1 | |
827 | - | let bO = cn._2 | |
822 | + | let cm = N() | |
823 | + | let cn = value(indexOf(cm, aU)) | |
824 | + | let co = value(indexOf(cm, aT)) | |
825 | + | let bz = parseIntValue(value(split(H("setup_penalties"), ",")[cn])) | |
826 | + | let cp = ad(aU, "bRate") | |
827 | + | let aL = cp._1 | |
828 | + | let bO = cp._2 | |
828 | 829 | let aV = fraction(bU, aL, p) | |
829 | - | let | |
830 | - | let | |
831 | - | let | |
830 | + | let cq = fraction(aV, cl, 100) | |
831 | + | let cr = fraction(cq, (n + bz), n) | |
832 | + | let cs = fraction(cq, p, aL) | |
832 | 833 | let bV = split(i, "_")[1] | |
833 | 834 | let bW = split(i, "_")[0] | |
834 | - | let | |
835 | - | let ap = reentrantInvoke(a, "liquidate", [bW, bV, | |
835 | + | let ct = { | |
836 | + | let ap = reentrantInvoke(a, "liquidate", [bW, bV, cr], nil) | |
836 | 837 | if ($isInstanceOf(ap, "Int")) | |
837 | 838 | then ap | |
838 | 839 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
839 | 840 | } | |
840 | - | if ((bc == bc)) | |
841 | - | then if (bB) | |
842 | - | then throw("liquidation will pass") | |
843 | - | else ([ScriptTransfer(aR.caller, (cp - co), ba), IntegerEntry(((i + "_supplied_") + aT), (bS - bc)), IntegerEntry(((i + "_borrowed_") + aU), (bU - cq)), IntegerEntry(("total_supplied_" + aT), (D(("total_supplied_" + aT)) - bc)), IntegerEntry(("total_borrowed_" + aU), (D(("total_borrowed_" + aU)) - cq))] ++ bO) | |
841 | + | if ((ct == ct)) | |
842 | + | then { | |
843 | + | let bc = fraction(ct, p, bO[((co * 3) + 1)].value) | |
844 | + | if (bB) | |
845 | + | then throw("liquidation will pass") | |
846 | + | else ([ScriptTransfer(aR.caller, (cr - cq), ba), IntegerEntry(((i + "_supplied_") + aT), (bS - bc)), IntegerEntry(((i + "_borrowed_") + aU), (bU - cs)), IntegerEntry(("total_supplied_" + aT), (D(("total_supplied_" + aT)) - bc)), IntegerEntry(("total_borrowed_" + aU), (D(("total_borrowed_" + aU)) - cs))] ++ bO) | |
847 | + | } | |
844 | 848 | else throw("Strict value is not equal to itself.") | |
845 | 849 | } | |
846 | 850 | } | |
850 | 854 | ||
851 | 855 | ||
852 | 856 | @Callable(aR) | |
853 | - | func getUserCollateral (bB,i, | |
857 | + | func getUserCollateral (bB,i,cu,cv) = { | |
854 | 858 | let bC = N() | |
855 | 859 | let bu = split(H("setup_ltvs"), ",") | |
856 | 860 | let bv = split(H("setup_lts"), ",") | |
857 | 861 | let ai = ad(bC[0], "sRate")._2 | |
858 | - | let | |
862 | + | let cw = split(cv, ",") | |
859 | 863 | func t (u,v) = if ((v >= size(bC))) | |
860 | 864 | then u | |
861 | 865 | else { | |
862 | 866 | let bp = D(((i + "_supplied_") + bC[v])) | |
863 | - | let | |
864 | - | let | |
865 | - | then if (if (( | |
867 | + | let cx = D(((i + "_borrowed_") + bC[v])) | |
868 | + | let cy = if ((cv == "")) | |
869 | + | then if (if ((cx != 0)) | |
866 | 870 | then true | |
867 | 871 | else (bp != 0)) | |
868 | 872 | then true | |
869 | 873 | else false | |
870 | 874 | else true | |
871 | - | if ( | |
875 | + | if (cy) | |
872 | 876 | then { | |
873 | 877 | let aG = ar(bC[v]) | |
874 | 878 | let aE = aq(bC[v]) | |
875 | - | ((u + fraction(fraction(fraction((bp + (if (if (if (( | |
876 | - | then ( | |
879 | + | ((u + fraction(fraction(fraction((bp + (if (if (if ((cv != "")) | |
880 | + | then (cw[0] == bC[v]) | |
877 | 881 | else false) | |
878 | - | then ( | |
882 | + | then (cw[1] == "supplied") | |
879 | 883 | else false) | |
880 | - | then parseIntValue( | |
881 | - | else 0)), ai[(v * 3)].value, p), parseIntValue(bu[v]), n), aE._1, aG)) - (if ( | |
882 | - | then fraction(fraction(fraction(( | |
883 | - | then ( | |
884 | + | then parseIntValue(cw[2]) | |
885 | + | else 0)), ai[(v * 3)].value, p), parseIntValue(bu[v]), n), aE._1, aG)) - (if (cu) | |
886 | + | then fraction(fraction(fraction((cx + (if (if (if ((cv != "")) | |
887 | + | then (cw[0] == bC[v]) | |
884 | 888 | else false) | |
885 | - | then ( | |
889 | + | then (cw[1] == "borrowed") | |
886 | 890 | else false) | |
887 | - | then parseIntValue( | |
891 | + | then parseIntValue(cw[2]) | |
888 | 892 | else 0)), ai[((v * 3) + 1)].value, p), n, parseIntValue(bv[v])), aE._2, aG) | |
889 | 893 | else 0)) | |
890 | 894 | } | |
891 | 895 | else u | |
892 | 896 | } | |
893 | 897 | ||
894 | - | let | |
898 | + | let cz = { | |
895 | 899 | let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
896 | 900 | let x = size(w) | |
897 | 901 | let y = 0 | |
906 | 910 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
907 | 911 | } | |
908 | 912 | if (bB) | |
909 | - | then throw(toString( | |
910 | - | else $Tuple2(nil, | |
913 | + | then throw(toString(cz)) | |
914 | + | else $Tuple2(nil, cz) | |
911 | 915 | } | |
912 | 916 | ||
913 | 917 | ||
914 | 918 | ||
915 | 919 | @Callable(aR) | |
916 | 920 | func getAssetDebt (bB,i,l) = { | |
917 | - | let | |
921 | + | let cx = D(((i + "_borrowed_") + l)) | |
918 | 922 | let aG = ar(l) | |
919 | 923 | let V = ad(l, "bRate")._1 | |
920 | - | let | |
924 | + | let cz = fraction(cx, V, p) | |
921 | 925 | if (bB) | |
922 | - | then throw(toString( | |
923 | - | else $Tuple2(nil, | |
926 | + | then throw(toString(cz)) | |
927 | + | else $Tuple2(nil, cz) | |
924 | 928 | } | |
925 | 929 | ||
926 | 930 | ||
935 | 939 | ((((u + toString(aE._1)) + ",") + toString(aE._2)) + "|") | |
936 | 940 | } | |
937 | 941 | ||
938 | - | let | |
942 | + | let cz = { | |
939 | 943 | let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
940 | 944 | let x = size(w) | |
941 | 945 | let y = "" | |
950 | 954 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
951 | 955 | } | |
952 | 956 | if (bB) | |
953 | - | then throw( | |
954 | - | else $Tuple2(nil, | |
957 | + | then throw(cz) | |
958 | + | else $Tuple2(nil, cz) | |
955 | 959 | } | |
956 | 960 | ||
957 | 961 | ||
1025 | 1029 | } | |
1026 | 1030 | ||
1027 | 1031 | ||
1028 | - | @Verifier( | |
1029 | - | func | |
1032 | + | @Verifier(cA) | |
1033 | + | func cB () = if (if (if (sigVerify(cA.bodyBytes, cA.proofs[0], base58'J4QQBsh6FGgZbijQPMDZ7GtNALx2N15K3eHvGhjq43Lt')) | |
1030 | 1034 | then true | |
1031 | - | else sigVerify( | |
1035 | + | else sigVerify(cA.bodyBytes, cA.proofs[0], base58'Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS')) | |
1032 | 1036 | then true | |
1033 | - | else if (sigVerify( | |
1034 | - | then sigVerify( | |
1037 | + | else if (sigVerify(cA.bodyBytes, cA.proofs[0], base58'CYCxuKusNeomQkH9wbcEd4rRP1mDYMc7bw8pr82Agi4N')) | |
1038 | + | then sigVerify(cA.bodyBytes, cA.proofs[0], base58'3oqguA2LUTZFFjJCJ62UybbXFTLwv88tSJ3oMrNSGhiA') | |
1035 | 1039 | else false) | |
1036 | 1040 | then true | |
1037 | - | else sigVerify( | |
1041 | + | else sigVerify(cA.bodyBytes, cA.proofs[0], base58'9t2BGHP6EddYu5xvArqDkhHPGbf8ZiYUaWgFcEPtRZhE') | |
1038 | 1042 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW') | |
5 | 5 | ||
6 | 6 | let b = ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", "Btw3G1j4wQgdp49PTxaFkNvn75dQtqGDM7ejQppHnWC1", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", "4CQ5CPGLXLbWBUs2JBjKUaRqF49CmKHkwzvPgSvQpAQV", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR"] | |
7 | 7 | ||
8 | 8 | let c = Address(base58'3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9') | |
9 | 9 | ||
10 | 10 | let d = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe') | |
11 | 11 | ||
12 | 12 | let e = 20 | |
13 | 13 | ||
14 | 14 | let f = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU') | |
15 | 15 | ||
16 | 16 | let g = [base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL', base58'3PAxdDSmN758L5SHSGRC5apEtQE2aApZotG', base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD', base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o', base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3', base58'3P6Ksahs71SiKQgQ4qaZuFAVhqncdi2nvJQ'] | |
17 | 17 | ||
18 | 18 | func h (i) = !(if (if (if ((i != Address(base58'3PFHNdEPu71QwBAnc2HZPcrbxoseNfUvHEA'))) | |
19 | 19 | then (i != Address(base58'3PCqdm1mAoQqR46oZotFanmqb5CLUvrKEo2')) | |
20 | 20 | else false) | |
21 | 21 | then (i != Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL')) | |
22 | 22 | else false) | |
23 | 23 | then (i != Address(base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3')) | |
24 | 24 | else false) | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func j (i) = !(if ((i != d)) | |
28 | 28 | then (i != a) | |
29 | 29 | else false) | |
30 | 30 | ||
31 | 31 | ||
32 | 32 | func k (l) = { | |
33 | 33 | let m = l | |
34 | 34 | if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == m)) | |
35 | 35 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
36 | 36 | else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == m)) | |
37 | 37 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
38 | 38 | else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == m)) | |
39 | 39 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
40 | 40 | else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == m)) | |
41 | 41 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
42 | 42 | else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == m)) | |
43 | 43 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
44 | 44 | else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == m)) | |
45 | 45 | then $Tuple4(2000000, 40000000, 80000000, 150000000) | |
46 | 46 | else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == m)) | |
47 | 47 | then $Tuple4(0, 20000000, 80000000, 40000000) | |
48 | 48 | else if (("WAVES" == m)) | |
49 | 49 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
50 | 50 | else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == m)) | |
51 | 51 | then $Tuple4(0, 20000000, 80000000, 40000000) | |
52 | 52 | else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == m)) | |
53 | 53 | then $Tuple4(0, 20000000, 80000000, 100000000) | |
54 | 54 | else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == m)) | |
55 | 55 | then $Tuple4(0, 30000000, 80000000, 40000000) | |
56 | 56 | else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == m)) | |
57 | 57 | then $Tuple4(0, 25000000, 80000000, 40000000) | |
58 | 58 | else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == m)) | |
59 | 59 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
60 | 60 | else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == m)) | |
61 | 61 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
62 | 62 | else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == m)) | |
63 | 63 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
64 | 64 | else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == m)) | |
65 | 65 | then $Tuple4(2000000, 40000000, 80000000, 100000000) | |
66 | 66 | else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == m)) | |
67 | 67 | then $Tuple4(2000000, 30000000, 80000000, 80000000) | |
68 | 68 | else $Tuple4(0, 20000000, 80000000, 80000000) | |
69 | 69 | } | |
70 | 70 | ||
71 | 71 | ||
72 | 72 | let n = 100000000 | |
73 | 73 | ||
74 | 74 | let o = 10000000000 | |
75 | 75 | ||
76 | 76 | let p = (n * n) | |
77 | 77 | ||
78 | 78 | let q = 1440 | |
79 | 79 | ||
80 | 80 | func r (s) = { | |
81 | 81 | func t (u,v) = ((u + toString(v)) + ",") | |
82 | 82 | ||
83 | 83 | let w = s | |
84 | 84 | let x = size(w) | |
85 | 85 | let y = "" | |
86 | 86 | func z (A,B) = if ((B >= x)) | |
87 | 87 | then A | |
88 | 88 | else t(A, w[B]) | |
89 | 89 | ||
90 | 90 | func C (A,B) = if ((B >= x)) | |
91 | 91 | then A | |
92 | 92 | else throw("List size exceeds 12") | |
93 | 93 | ||
94 | 94 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
95 | 95 | } | |
96 | 96 | ||
97 | 97 | ||
98 | 98 | func D (E) = { | |
99 | 99 | let m = getInteger(this, E) | |
100 | 100 | if ($isInstanceOf(m, "Int")) | |
101 | 101 | then { | |
102 | 102 | let F = m | |
103 | 103 | F | |
104 | 104 | } | |
105 | 105 | else 0 | |
106 | 106 | } | |
107 | 107 | ||
108 | 108 | ||
109 | 109 | func G (E) = { | |
110 | 110 | let m = getBoolean(this, E) | |
111 | 111 | if ($isInstanceOf(m, "Boolean")) | |
112 | 112 | then { | |
113 | 113 | let F = m | |
114 | 114 | F | |
115 | 115 | } | |
116 | 116 | else false | |
117 | 117 | } | |
118 | 118 | ||
119 | 119 | ||
120 | 120 | func H (E) = { | |
121 | 121 | let m = getString(this, E) | |
122 | 122 | if ($isInstanceOf(m, "String")) | |
123 | 123 | then { | |
124 | 124 | let F = m | |
125 | 125 | F | |
126 | 126 | } | |
127 | 127 | else "" | |
128 | 128 | } | |
129 | 129 | ||
130 | 130 | ||
131 | 131 | func I (E) = { | |
132 | 132 | let m = getBinary(this, E) | |
133 | 133 | if ($isInstanceOf(m, "ByteVector")) | |
134 | 134 | then { | |
135 | 135 | let F = m | |
136 | 136 | F | |
137 | 137 | } | |
138 | 138 | else base58'' | |
139 | 139 | } | |
140 | 140 | ||
141 | 141 | ||
142 | 142 | func J (K) = { | |
143 | 143 | let m = K | |
144 | 144 | if ($isInstanceOf(m, "ByteVector")) | |
145 | 145 | then { | |
146 | 146 | let F = m | |
147 | 147 | toBase58String(F) | |
148 | 148 | } | |
149 | 149 | else "WAVES" | |
150 | 150 | } | |
151 | 151 | ||
152 | 152 | ||
153 | 153 | func L (l) = if ((l == "WAVES")) | |
154 | 154 | then unit | |
155 | 155 | else fromBase58String(l) | |
156 | 156 | ||
157 | 157 | ||
158 | 158 | func M (l) = if ((l == "WAVES")) | |
159 | 159 | then wavesBalance(this).available | |
160 | 160 | else assetBalance(this, fromBase58String(l)) | |
161 | 161 | ||
162 | 162 | ||
163 | 163 | func N () = split(H("setup_tokens"), ",") | |
164 | 164 | ||
165 | 165 | ||
166 | 166 | func O () = { | |
167 | 167 | let P = H("setup_maxsupply") | |
168 | 168 | if ((P == "")) | |
169 | 169 | then [-1, -1, -1, -1, -1, -1, -1] | |
170 | 170 | else split(P, ",") | |
171 | 171 | } | |
172 | 172 | ||
173 | 173 | ||
174 | 174 | func Q (l) = { | |
175 | 175 | let R = fraction(D(("total_supplied_" + l)), D((l + "_sRate")), p) | |
176 | 176 | if ((R == 0)) | |
177 | 177 | then 0 | |
178 | 178 | else fraction(n, fraction(D(("total_borrowed_" + l)), D((l + "_bRate")), p), R) | |
179 | 179 | } | |
180 | 180 | ||
181 | 181 | ||
182 | 182 | func S (l) = { | |
183 | 183 | let T = Q(l) | |
184 | 184 | let U = k(l) | |
185 | 185 | let V = (U._1 + (if ((U._3 >= T)) | |
186 | 186 | then fraction(T, U._2, U._3) | |
187 | 187 | else (U._2 + fraction((T - U._3), U._4, (100000000 - U._3))))) | |
188 | 188 | max([fraction(V, n, (q * 365)), 1]) | |
189 | 189 | } | |
190 | 190 | ||
191 | 191 | ||
192 | 192 | func W (l) = if ((indexOf(b, l) != unit)) | |
193 | 193 | then [IntegerEntry((l + "_sRate"), p), IntegerEntry((l + "_bRate"), p), IntegerEntry("lastRateHeight", height)] | |
194 | 194 | else { | |
195 | 195 | let X = S(l) | |
196 | 196 | let T = Q(l) | |
197 | 197 | let Y = D("lastRateHeight") | |
198 | 198 | let Z = max([D((l + "_bRate")), p]) | |
199 | 199 | let aa = (Z + ((height - Y) * X)) | |
200 | 200 | let ab = max([D((l + "_sRate")), p]) | |
201 | 201 | let ac = (ab + ((((height - Y) * fraction(X, T, n)) * (100 - e)) / 100)) | |
202 | 202 | [IntegerEntry((l + "_sRate"), ac), IntegerEntry((l + "_bRate"), aa), IntegerEntry("lastRateHeight", height)] | |
203 | 203 | } | |
204 | 204 | ||
205 | 205 | ||
206 | 206 | func ad (l,ae) = { | |
207 | 207 | func t (u,af) = { | |
208 | 208 | let ag = W(af) | |
209 | 209 | $Tuple2(if ((af != l)) | |
210 | 210 | then u._1 | |
211 | 211 | else if ((ae == "sRate")) | |
212 | 212 | then ag[0].value | |
213 | 213 | else ag[1].value, (u._2 ++ ag)) | |
214 | 214 | } | |
215 | 215 | ||
216 | 216 | let w = N() | |
217 | 217 | let x = size(w) | |
218 | 218 | let y = $Tuple2(0, nil) | |
219 | 219 | func z (A,B) = if ((B >= x)) | |
220 | 220 | then A | |
221 | 221 | else t(A, w[B]) | |
222 | 222 | ||
223 | 223 | func C (A,B) = if ((B >= x)) | |
224 | 224 | then A | |
225 | 225 | else throw("List size exceeds 12") | |
226 | 226 | ||
227 | 227 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
228 | 228 | } | |
229 | 229 | ||
230 | 230 | ||
231 | 231 | func ah (l) = { | |
232 | 232 | let ai = W(l) | |
233 | 233 | let R = fraction(D(("total_supplied_" + l)), ai[0].value, p) | |
234 | 234 | fraction(n, fraction(D(("total_borrowed_" + l)), ai[1].value, p), R) | |
235 | 235 | } | |
236 | 236 | ||
237 | 237 | ||
238 | 238 | func aj () = { | |
239 | 239 | func t (u,af) = (u ++ W(af)) | |
240 | 240 | ||
241 | 241 | let w = N() | |
242 | 242 | let x = size(w) | |
243 | 243 | let y = nil | |
244 | 244 | func z (A,B) = if ((B >= x)) | |
245 | 245 | then A | |
246 | 246 | else t(A, w[B]) | |
247 | 247 | ||
248 | 248 | func C (A,B) = if ((B >= x)) | |
249 | 249 | then A | |
250 | 250 | else throw("List size exceeds 12") | |
251 | 251 | ||
252 | 252 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
253 | 253 | } | |
254 | 254 | ||
255 | 255 | ||
256 | 256 | func ak (l,al) = if (if ((l == "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi")) | |
257 | 257 | then true | |
258 | 258 | else (l == "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW")) | |
259 | 259 | then $Tuple2(1000000, 1000000) | |
260 | 260 | else { | |
261 | 261 | let am = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_twap5B")) | |
262 | 262 | let an = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_riskLevel")) | |
263 | 263 | if ((indexOf(b, l) != unit)) | |
264 | 264 | then { | |
265 | 265 | let ao = { | |
266 | 266 | let ap = reentrantInvoke(a, "getShareAssetPriceREADONLY", [l], nil) | |
267 | 267 | if ($isInstanceOf(ap, "Int")) | |
268 | 268 | then ap | |
269 | 269 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
270 | 270 | } | |
271 | 271 | if ((ao == ao)) | |
272 | 272 | then $Tuple2(ao, ao) | |
273 | 273 | else throw("Strict value is not equal to itself.") | |
274 | 274 | } | |
275 | 275 | else if ((al >= an)) | |
276 | 276 | then $Tuple2(am, am) | |
277 | 277 | else throw((("oracle prices don't match: " + toString(am)) + " is the price, but risk is too high")) | |
278 | 278 | } | |
279 | 279 | ||
280 | 280 | ||
281 | 281 | func aq (l) = ak(l, 1) | |
282 | 282 | ||
283 | 283 | ||
284 | 284 | func ar (l) = { | |
285 | 285 | let as = if ((l == "WAVES")) | |
286 | 286 | then 8 | |
287 | 287 | else value(assetInfo(fromBase58String(l))).decimals | |
288 | 288 | pow(10, 0, as, 0, 0, DOWN) | |
289 | 289 | } | |
290 | 290 | ||
291 | 291 | ||
292 | 292 | func at (i) = { | |
293 | 293 | let au = invoke(this, "getUserCollateral", [false, i, true, ""], nil) | |
294 | 294 | if ((au == au)) | |
295 | 295 | then { | |
296 | 296 | let av = { | |
297 | 297 | let m = au | |
298 | 298 | if ($isInstanceOf(m, "Int")) | |
299 | 299 | then { | |
300 | 300 | let aw = m | |
301 | 301 | aw | |
302 | 302 | } | |
303 | 303 | else throw("issue while doing in-dapp invocation") | |
304 | 304 | } | |
305 | 305 | if ((av == av)) | |
306 | 306 | then av | |
307 | 307 | else throw("Strict value is not equal to itself.") | |
308 | 308 | } | |
309 | 309 | else throw("Strict value is not equal to itself.") | |
310 | 310 | } | |
311 | 311 | ||
312 | 312 | ||
313 | 313 | func ax (l,ay,i) = if (!(G("setup_active"))) | |
314 | 314 | then throw("market is stopped") | |
315 | 315 | else { | |
316 | 316 | let az = ad(l, "sRate") | |
317 | 317 | let aA = az._1 | |
318 | 318 | let aB = az._2 | |
319 | 319 | let aC = fraction(ay, p, aA, DOWN) | |
320 | 320 | let aD = { | |
321 | 321 | let m = getString(("setup_maxSupply_" + l)) | |
322 | 322 | if ($isInstanceOf(m, "String")) | |
323 | 323 | then { | |
324 | 324 | let aw = m | |
325 | 325 | parseIntValue(aw) | |
326 | 326 | } | |
327 | 327 | else 0 | |
328 | 328 | } | |
329 | 329 | let aE = aq(l) | |
330 | 330 | let aF = (D(((i + "_supplied_") + l)) + aC) | |
331 | 331 | let V = ad(l, "sRate")._1 | |
332 | 332 | let aG = ar(l) | |
333 | 333 | let aH = fraction(fraction(aF, V, p), aE._1, aG) | |
334 | 334 | if ((indexOf(H("setup_tokens"), l) == unit)) | |
335 | 335 | then throw("this asset is not supported by the market") | |
336 | 336 | else if (if ((aD != 0)) | |
337 | 337 | then (aH > aD) | |
338 | 338 | else false) | |
339 | 339 | then throw("max total supply for this token reached in the pool") | |
340 | 340 | else $Tuple2(([IntegerEntry(((i + "_supplied_") + l), aF), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) + aC))] ++ aB), ay) | |
341 | 341 | } | |
342 | 342 | ||
343 | 343 | ||
344 | 344 | func aI (l,ay,i,aJ) = { | |
345 | 345 | let aK = ad(l, "bRate") | |
346 | 346 | let aL = aK._1 | |
347 | 347 | let aB = aK._2 | |
348 | 348 | let aC = fraction(ay, p, aL, CEILING) | |
349 | 349 | let aM = invoke(this, "getUserCollateral", [false, i, true, ((l + ",borrowed,") + toString(aC))], nil) | |
350 | 350 | if ((aM == aM)) | |
351 | 351 | then { | |
352 | 352 | let aN = { | |
353 | 353 | let m = aM | |
354 | 354 | if ($isInstanceOf(m, "Int")) | |
355 | 355 | then { | |
356 | 356 | let aw = m | |
357 | 357 | aw | |
358 | 358 | } | |
359 | 359 | else throw("can't get user collateral value") | |
360 | 360 | } | |
361 | 361 | if (!(G("setup_active"))) | |
362 | 362 | then throw("market is stopped") | |
363 | 363 | else if ((indexOf(b, l) != unit)) | |
364 | 364 | then throw("this token cannot be borrowed") | |
365 | 365 | else if (if (!(aJ)) | |
366 | 366 | then (0 > aN) | |
367 | 367 | else false) | |
368 | 368 | then throw("you have to supply more to borrow") | |
369 | 369 | else { | |
370 | 370 | let aO = D(("total_supplied_" + l)) | |
371 | 371 | let aP = D(("total_borrowed_" + l)) | |
372 | 372 | let aQ = D(((i + "_borrowed_") + l)) | |
373 | 373 | if ((aC > (aO - aP))) | |
374 | 374 | then throw("this amount is not available") | |
375 | 375 | else $Tuple2(([IntegerEntry(((i + "_borrowed_") + l), (aQ + aC)), IntegerEntry(("total_borrowed_" + l), (aP + aC))] ++ [IntegerEntry((l + "_bRate"), aL)]), ay) | |
376 | 376 | } | |
377 | 377 | } | |
378 | 378 | else throw("Strict value is not equal to itself.") | |
379 | 379 | } | |
380 | 380 | ||
381 | 381 | ||
382 | 382 | @Callable(aR) | |
383 | 383 | func flashPosition (aS,aT,aU,aV,aW,aX,aY) = if ((aR.caller != a)) | |
384 | 384 | then throw("available only for Axly protocol") | |
385 | 385 | else { | |
386 | 386 | let aZ = aI(aU, aV, aS, true) | |
387 | 387 | let ba = L(aU) | |
388 | 388 | let bb = reentrantInvoke(addressFromStringValue(aW), aX, split(aY, ","), [AttachedPayment(ba, aV)]) | |
389 | 389 | if ((bb == bb)) | |
390 | 390 | then { | |
391 | 391 | let bc = { | |
392 | 392 | let ap = bb | |
393 | 393 | if ($isInstanceOf(ap, "Int")) | |
394 | 394 | then ap | |
395 | 395 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
396 | 396 | } | |
397 | 397 | if ((bc == bc)) | |
398 | 398 | then { | |
399 | 399 | let bd = ax(aT, bc, aS) | |
400 | 400 | let aN = { | |
401 | 401 | let ap = invoke(this, "getUserCollateral", [false, aS, true, ((aT + ",supplied,") + toString(bc))], nil) | |
402 | 402 | if ($isInstanceOf(ap, "Int")) | |
403 | 403 | then ap | |
404 | 404 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
405 | 405 | } | |
406 | 406 | if ((aN == aN)) | |
407 | 407 | then { | |
408 | 408 | let be = { | |
409 | 409 | let ap = invoke(this, "getUserCollateral", [false, aS, true, ((aU + ",borrowed,") + toString(aV))], nil) | |
410 | 410 | if ($isInstanceOf(ap, "Int")) | |
411 | 411 | then ap | |
412 | 412 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
413 | 413 | } | |
414 | 414 | if ((be == be)) | |
415 | 415 | then if ((be > aN)) | |
416 | 416 | then throw("not enough collateral provided") | |
417 | 417 | else (aZ._1 ++ bd._1) | |
418 | 418 | else throw("Strict value is not equal to itself.") | |
419 | 419 | } | |
420 | 420 | else throw("Strict value is not equal to itself.") | |
421 | 421 | } | |
422 | 422 | else throw("Strict value is not equal to itself.") | |
423 | 423 | } | |
424 | 424 | else throw("Strict value is not equal to itself.") | |
425 | 425 | } | |
426 | 426 | ||
427 | 427 | ||
428 | 428 | ||
429 | 429 | @Callable(aR) | |
430 | 430 | func supply () = if (if ((size(aR.payments) != 1)) | |
431 | 431 | then true | |
432 | 432 | else (aR.payments[0].amount == 0)) | |
433 | 433 | then throw("1 payment has to be attached") | |
434 | 434 | else { | |
435 | 435 | let l = J(aR.payments[0].assetId) | |
436 | 436 | let ay = aR.payments[0].amount | |
437 | 437 | let bf = invoke(c, "lendAction", [toString(aR.caller), l], nil) | |
438 | 438 | if ((bf == bf)) | |
439 | 439 | then ax(l, ay, toString(aR.caller)) | |
440 | 440 | else throw("Strict value is not equal to itself.") | |
441 | 441 | } | |
442 | 442 | ||
443 | 443 | ||
444 | 444 | ||
445 | 445 | @Callable(aR) | |
446 | 446 | func withdraw (l,ay) = { | |
447 | 447 | let bg = ad(l, "sRate") | |
448 | 448 | let aA = bg._1 | |
449 | 449 | let aB = bg._2 | |
450 | 450 | let aC = fraction(ay, p, aA, CEILING) | |
451 | 451 | let i = toString(aR.caller) | |
452 | 452 | let aO = D(("total_supplied_" + l)) | |
453 | 453 | let aP = D(("total_borrowed_" + l)) | |
454 | 454 | let bh = D(((i + "_supplied_") + l)) | |
455 | 455 | let aQ = D(((i + "_borrowed_") + l)) | |
456 | 456 | let bf = invoke(c, "lendAction", [toString(aR.caller), l], nil) | |
457 | 457 | if ((bf == bf)) | |
458 | 458 | then { | |
459 | 459 | let aM = invoke(this, "getUserCollateral", [false, i, true, ((l + ",supplied,") + toString(-(aC)))], nil) | |
460 | 460 | if ((aM == aM)) | |
461 | 461 | then { | |
462 | 462 | let aN = { | |
463 | 463 | let m = aM | |
464 | 464 | if ($isInstanceOf(m, "Int")) | |
465 | 465 | then { | |
466 | 466 | let aw = m | |
467 | 467 | aw | |
468 | 468 | } | |
469 | 469 | else throw("can't get user collateral value") | |
470 | 470 | } | |
471 | 471 | if (!(G("setup_active"))) | |
472 | 472 | then throw("market is stopped") | |
473 | 473 | else if ((0 > aN)) | |
474 | 474 | then throw("you dont have enough collateral for this operation") | |
475 | 475 | else if ((aC > (aO - aP))) | |
476 | 476 | then throw("this amount is not available on the market") | |
477 | 477 | else if ((aC > (bh - aQ))) | |
478 | 478 | then throw("this amount is not available for this user") | |
479 | 479 | else ([IntegerEntry(((i + "_supplied_") + l), (D(((i + "_supplied_") + l)) - aC)), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) - aC)), ScriptTransfer(aR.caller, ay, L(l))] ++ aB) | |
480 | 480 | } | |
481 | 481 | else throw("Strict value is not equal to itself.") | |
482 | 482 | } | |
483 | 483 | else throw("Strict value is not equal to itself.") | |
484 | 484 | } | |
485 | 485 | ||
486 | 486 | ||
487 | 487 | ||
488 | 488 | @Callable(aR) | |
489 | 489 | func repay () = if (!(G("setup_active"))) | |
490 | 490 | then throw("market is stopped") | |
491 | 491 | else if (if ((size(aR.payments) != 1)) | |
492 | 492 | then true | |
493 | 493 | else (aR.payments[0].amount == 0)) | |
494 | 494 | then throw("1 payment has to be attached") | |
495 | 495 | else { | |
496 | 496 | let l = J(aR.payments[0].assetId) | |
497 | 497 | let ay = aR.payments[0].amount | |
498 | 498 | let bi = ad(l, "bRate") | |
499 | 499 | let aL = bi._1 | |
500 | 500 | let aB = bi._2 | |
501 | 501 | let aC = fraction(ay, p, aL, CEILING) | |
502 | 502 | let i = toString(aR.caller) | |
503 | 503 | let aO = D(("total_supplied_" + l)) | |
504 | 504 | let aP = D(("total_borrowed_" + l)) | |
505 | 505 | let aQ = D(((i + "_borrowed_") + l)) | |
506 | 506 | let bj = (aQ - aC) | |
507 | 507 | let bk = if ((bj >= 0)) | |
508 | 508 | then aC | |
509 | 509 | else aQ | |
510 | 510 | if ((indexOf(H("setup_tokens"), l) == unit)) | |
511 | 511 | then throw("this asset is not supported by the market") | |
512 | 512 | else (([IntegerEntry(((i + "_borrowed_") + l), (aQ - bk)), IntegerEntry(("total_borrowed_" + l), (aP - bk))] ++ aB) ++ (if ((bj >= 0)) | |
513 | 513 | then nil | |
514 | 514 | else [ScriptTransfer(aR.caller, -(bj), aR.payments[0].assetId)])) | |
515 | 515 | } | |
516 | 516 | ||
517 | 517 | ||
518 | 518 | ||
519 | 519 | @Callable(aR) | |
520 | 520 | func repayFor (i) = if (!(G("setup_active"))) | |
521 | 521 | then throw("market is stopped") | |
522 | 522 | else if (!(j(aR.caller))) | |
523 | 523 | then throw("available only for whitelist") | |
524 | 524 | else if ((i == "global")) | |
525 | 525 | then throw("you can't repay for everyone :_)") | |
526 | 526 | else if (if ((size(aR.payments) != 1)) | |
527 | 527 | then true | |
528 | 528 | else (aR.payments[0].amount == 0)) | |
529 | 529 | then throw("1 payment has to be attached") | |
530 | 530 | else { | |
531 | 531 | let l = J(aR.payments[0].assetId) | |
532 | 532 | let ay = aR.payments[0].amount | |
533 | 533 | let bl = ad(l, "bRate") | |
534 | 534 | let aL = bl._1 | |
535 | 535 | let aB = bl._2 | |
536 | 536 | let aC = fraction(ay, p, aL, CEILING) | |
537 | 537 | let aO = D(("total_supplied_" + l)) | |
538 | 538 | let aP = D(("total_borrowed_" + l)) | |
539 | 539 | let aQ = D(((i + "_borrowed_") + l)) | |
540 | 540 | let bj = (aQ - aC) | |
541 | 541 | let bk = if ((bj >= 0)) | |
542 | 542 | then aC | |
543 | 543 | else aQ | |
544 | 544 | let bm = if ((bj >= 0)) | |
545 | 545 | then nil | |
546 | 546 | else [ScriptTransfer(aR.caller, -(bj), aR.payments[0].assetId)] | |
547 | 547 | let bn = if ((aR.caller == a)) | |
548 | 548 | then { | |
549 | 549 | func bo (u,l) = { | |
550 | 550 | let bp = D(((i + "_borrowed_") + l)) | |
551 | 551 | if ((bp > 0)) | |
552 | 552 | then (u ++ [IntegerEntry(((i + "_supplied_") + l), 0), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) - bp))]) | |
553 | 553 | else u | |
554 | 554 | } | |
555 | 555 | ||
556 | 556 | let w = b | |
557 | 557 | let x = size(w) | |
558 | 558 | let y = nil | |
559 | 559 | func z (A,B) = if ((B >= x)) | |
560 | 560 | then A | |
561 | 561 | else bo(A, w[B]) | |
562 | 562 | ||
563 | 563 | func C (A,B) = if ((B >= x)) | |
564 | 564 | then A | |
565 | 565 | else throw("List size exceeds 8") | |
566 | 566 | ||
567 | 567 | C(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8) | |
568 | 568 | } | |
569 | 569 | else nil | |
570 | 570 | if ((indexOf(H("setup_tokens"), l) == unit)) | |
571 | 571 | then throw("this asset is not supported by the market") | |
572 | 572 | else ((([IntegerEntry(((i + "_borrowed_") + l), (aQ - bk)), IntegerEntry(("total_borrowed_" + l), (aP - bk))] ++ aB) ++ bm) ++ bn) | |
573 | 573 | } | |
574 | 574 | ||
575 | 575 | ||
576 | 576 | ||
577 | 577 | @Callable(aR) | |
578 | 578 | func addInterestEXTERNAL () = { | |
579 | 579 | let aC = fraction(aR.payments[0].amount, 80, 100) | |
580 | 580 | let K = aR.payments[0].assetId | |
581 | 581 | let l = J(K) | |
582 | 582 | let bq = D(("autostake_lastEarned_" + l)) | |
583 | 583 | let br = D(("autostake_lastBlock_" + l)) | |
584 | 584 | let bs = if (if ((br == height)) | |
585 | 585 | then true | |
586 | 586 | else (aC == 0)) | |
587 | 587 | then nil | |
588 | 588 | else [IntegerEntry(("autostake_preLastEarned_" + l), bq), IntegerEntry(("autostake_preLastBlock_" + l), br), IntegerEntry(("autostake_lastEarned_" + l), (bq + aC)), IntegerEntry(("autostake_lastBlock_" + l), height)] | |
589 | 589 | (bs ++ [IntegerEntry((l + "_sRate"), (D((l + "_sRate")) + fraction(p, aC, D(("total_supplied_" + l)))))]) | |
590 | 590 | } | |
591 | 591 | ||
592 | 592 | ||
593 | 593 | ||
594 | 594 | @Callable(aR) | |
595 | 595 | func preInit (bt,bu,bv,bw) = { | |
596 | 596 | func t (u,af) = (u ++ [IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p)]) | |
597 | 597 | ||
598 | 598 | if ((aR.caller != this)) | |
599 | 599 | then throw("admin only") | |
600 | 600 | else { | |
601 | 601 | let ai = { | |
602 | 602 | let w = split(bt, ",") | |
603 | 603 | let x = size(w) | |
604 | 604 | let y = nil | |
605 | 605 | func z (A,B) = if ((B >= x)) | |
606 | 606 | then A | |
607 | 607 | else t(A, w[B]) | |
608 | 608 | ||
609 | 609 | func C (A,B) = if ((B >= x)) | |
610 | 610 | then A | |
611 | 611 | else throw("List size exceeds 12") | |
612 | 612 | ||
613 | 613 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
614 | 614 | } | |
615 | 615 | ([StringEntry("setup_tokens", bt), StringEntry("setup_ltvs", bu), StringEntry("setup_lts", bv), StringEntry("setup_penalties", bw), BooleanEntry("setup_active", true)] ++ ai) | |
616 | 616 | } | |
617 | 617 | } | |
618 | 618 | ||
619 | 619 | ||
620 | 620 | ||
621 | 621 | @Callable(aR) | |
622 | 622 | func initNewToken (af,bx,by,bz) = if (if ((aR.caller != this)) | |
623 | 623 | then (aR.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8')) | |
624 | 624 | else false) | |
625 | 625 | then throw("admin only") | |
626 | 626 | else [StringEntry("setup_tokens", ((H("setup_tokens") + ",") + af)), StringEntry("setup_ltvs", ((H("setup_ltvs") + ",") + bx)), StringEntry("setup_lts", ((H("setup_lts") + ",") + by)), StringEntry("setup_penalties", ((H("setup_penalties") + ",") + bz)), IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p)] | |
627 | 627 | ||
628 | 628 | ||
629 | 629 | ||
630 | 630 | @Callable(aR) | |
631 | 631 | func updateParameter (E,bA) = if (if ((aR.caller != this)) | |
632 | 632 | then (aR.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8')) | |
633 | 633 | else false) | |
634 | 634 | then throw("admin only") | |
635 | 635 | else [IntegerEntry(E, parseIntValue(bA))] | |
636 | 636 | ||
637 | 637 | ||
638 | 638 | ||
639 | 639 | @Callable(aR) | |
640 | 640 | func updateString (E,bA) = if (if ((aR.caller != this)) | |
641 | 641 | then (aR.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8')) | |
642 | 642 | else false) | |
643 | 643 | then throw("admin only") | |
644 | 644 | else [StringEntry(E, bA)] | |
645 | 645 | ||
646 | 646 | ||
647 | 647 | ||
648 | 648 | @Callable(aR) | |
649 | 649 | func claimToReserveFund (bB) = { | |
650 | 650 | let bC = N() | |
651 | 651 | let ai = ad(bC[0], "sRate")._2 | |
652 | 652 | let s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
653 | 653 | func t (u,bD) = if ((bD >= size(bC))) | |
654 | 654 | then u | |
655 | 655 | else { | |
656 | 656 | let l = bC[bD] | |
657 | 657 | let bE = H(("autostake_amount_" + l)) | |
658 | 658 | let aC = ((((M(l) + D(("autostake_amount_" + l))) + (if ((bE != "")) | |
659 | 659 | then parseIntValue(bE) | |
660 | 660 | else 0)) + fraction(D(("total_borrowed_" + l)), ai[((bD * 3) + 1)].value, p)) - fraction(D(("total_supplied_" + l)), ai[(bD * 3)].value, p)) | |
661 | 661 | let bF = if ((D(("autostake_amount_" + l)) > 0)) | |
662 | 662 | then invoke(this, "unstakeToken", [l, max([aC, 0])], nil) | |
663 | 663 | else 0 | |
664 | 664 | if ((bF == bF)) | |
665 | 665 | then (u ++ [aC]) | |
666 | 666 | else throw("Strict value is not equal to itself.") | |
667 | 667 | } | |
668 | 668 | ||
669 | 669 | let bG = { | |
670 | 670 | let w = s | |
671 | 671 | let x = size(w) | |
672 | 672 | let y = nil | |
673 | 673 | func z (A,B) = if ((B >= x)) | |
674 | 674 | then A | |
675 | 675 | else t(A, w[B]) | |
676 | 676 | ||
677 | 677 | func C (A,B) = if ((B >= x)) | |
678 | 678 | then A | |
679 | 679 | else throw("List size exceeds 12") | |
680 | 680 | ||
681 | 681 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
682 | 682 | } | |
683 | 683 | func bH (u,bD) = if ((bD >= size(bC))) | |
684 | 684 | then u | |
685 | 685 | else { | |
686 | 686 | let l = bC[bD] | |
687 | 687 | (u ++ [ScriptTransfer(d, max([bG[bD], 0]), L(l))]) | |
688 | 688 | } | |
689 | 689 | ||
690 | 690 | if (bB) | |
691 | 691 | then throw(r(bG)) | |
692 | 692 | else $Tuple2({ | |
693 | 693 | let w = s | |
694 | 694 | let x = size(w) | |
695 | 695 | let y = nil | |
696 | 696 | func bI (A,B) = if ((B >= x)) | |
697 | 697 | then A | |
698 | 698 | else bH(A, w[B]) | |
699 | 699 | ||
700 | 700 | func bJ (A,B) = if ((B >= x)) | |
701 | 701 | then A | |
702 | 702 | else throw("List size exceeds 12") | |
703 | 703 | ||
704 | 704 | bJ(bI(bI(bI(bI(bI(bI(bI(bI(bI(bI(bI(bI(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
705 | 705 | }, bG) | |
706 | 706 | } | |
707 | 707 | ||
708 | 708 | ||
709 | 709 | ||
710 | 710 | @Callable(aR) | |
711 | 711 | func shutdown (bK) = if ((indexOf(g, aR.caller.bytes) == unit)) | |
712 | 712 | then throw("user not in a whitelist") | |
713 | 713 | else [BooleanEntry("setup_active", !(bK))] | |
714 | 714 | ||
715 | 715 | ||
716 | 716 | ||
717 | 717 | @Callable(aR) | |
718 | 718 | func liquidate (bB,i,ay,aT,aU,bL) = if (!(h(aR.caller))) | |
719 | 719 | then throw("available for whitelist only") | |
720 | 720 | else if (!(G("setup_active"))) | |
721 | 721 | then throw("market is stopped") | |
722 | 722 | else { | |
723 | 723 | let bM = at(i) | |
724 | 724 | if ((bM == bM)) | |
725 | 725 | then { | |
726 | 726 | let bN = ad(aT, "sRate") | |
727 | 727 | let aA = bN._1 | |
728 | 728 | let bO = bN._2 | |
729 | 729 | let bP = ad(aU, "bRate") | |
730 | 730 | let aL = bP._1 | |
731 | 731 | let bQ = bP._2 | |
732 | 732 | let bR = fraction(ay, p, aA) | |
733 | 733 | let bS = D(((i + "_supplied_") + aT)) | |
734 | 734 | let bT = D(((i + "_borrowed_") + aU)) | |
735 | 735 | let bU = if ((bT > 0)) | |
736 | 736 | then bT | |
737 | 737 | else throw("user has no borrow in this token") | |
738 | 738 | if ((bM > 0)) | |
739 | 739 | then throw("user can't be liquidated") | |
740 | 740 | else if ((bR > bS)) | |
741 | 741 | then throw("position to liquidate is bigger than user's supply") | |
742 | 742 | else { | |
743 | 743 | let bF = if ((indexOf(b, aT) != unit)) | |
744 | 744 | then { | |
745 | 745 | let bV = split(i, "_")[1] | |
746 | 746 | let bW = split(i, "_")[0] | |
747 | 747 | reentrantInvoke(a, "liquidate", [bW, bV, bR], nil) | |
748 | 748 | } | |
749 | 749 | else nil | |
750 | 750 | if ((bF == bF)) | |
751 | 751 | then { | |
752 | 752 | let bX = M(aT) | |
753 | 753 | if ((bX == bX)) | |
754 | 754 | then { | |
755 | 755 | let bY = M(aU) | |
756 | 756 | if ((bY == bY)) | |
757 | 757 | then { | |
758 | 758 | let bZ = invoke(f, "swap", [bL, 0], [AttachedPayment(L(aT), ay)]) | |
759 | 759 | if ((bZ == bZ)) | |
760 | 760 | then { | |
761 | 761 | let ca = (bX - M(aT)) | |
762 | 762 | if ((ca == ca)) | |
763 | 763 | then { | |
764 | 764 | let cb = (M(aU) - bY) | |
765 | 765 | if ((cb == cb)) | |
766 | 766 | then { | |
767 | 767 | let cc = aq(aT)._1 | |
768 | 768 | let cd = ar(aT) | |
769 | 769 | let ce = fraction(ca, cc, cd) | |
770 | 770 | let cf = aq(aU)._2 | |
771 | 771 | let cg = ar(aU) | |
772 | 772 | let ch = fraction(cb, cf, cg) | |
773 | 773 | let bz = parseIntValue(split(H("setup_penalties"), ",")[value(indexOf(N(), aU))]) | |
774 | 774 | let ci = (ch - fraction(ce, (n - bz), n)) | |
775 | 775 | let cj = fraction(ca, p, aA) | |
776 | 776 | let ck = fraction(fraction(cb, p, aL), (n - fraction(ci, n, ch)), n) | |
777 | 777 | if ((ca > ay)) | |
778 | 778 | then throw("more assets exchanged than expected") | |
779 | 779 | else if ((0 > ci)) | |
780 | 780 | then throw("price impact is bigger than liquidation penalty") | |
781 | 781 | else [IntegerEntry(((i + "_supplied_") + aT), (bS - cj)), IntegerEntry(((i + "_borrowed_") + aU), (bU - ck)), IntegerEntry(("total_supplied_" + aT), (D(("total_supplied_" + aT)) - cj)), IntegerEntry(("total_borrowed_" + aU), (D(("total_borrowed_" + aU)) - ck))] | |
782 | 782 | } | |
783 | 783 | else throw("Strict value is not equal to itself.") | |
784 | 784 | } | |
785 | 785 | else throw("Strict value is not equal to itself.") | |
786 | 786 | } | |
787 | 787 | else throw("Strict value is not equal to itself.") | |
788 | 788 | } | |
789 | 789 | else throw("Strict value is not equal to itself.") | |
790 | 790 | } | |
791 | 791 | else throw("Strict value is not equal to itself.") | |
792 | 792 | } | |
793 | 793 | else throw("Strict value is not equal to itself.") | |
794 | 794 | } | |
795 | 795 | } | |
796 | 796 | else throw("Strict value is not equal to itself.") | |
797 | 797 | } | |
798 | 798 | ||
799 | 799 | ||
800 | 800 | ||
801 | 801 | @Callable(aR) | |
802 | - | func liquidateV2 (bB,i,aT,aU) = if (!(h(aR.caller))) | |
802 | + | func liquidateV2 (bB,i,aT,aU,cl) = if (!(h(aR.caller))) | |
803 | 803 | then throw("available for whitelist only") | |
804 | 804 | else if (!(G("setup_active"))) | |
805 | 805 | then throw("market is stopped") | |
806 | 806 | else { | |
807 | 807 | let bM = at(i) | |
808 | 808 | if ((bM == bM)) | |
809 | 809 | then { | |
810 | 810 | let bS = D(((i + "_supplied_") + aT)) | |
811 | 811 | let bU = D(((i + "_borrowed_") + aU)) | |
812 | 812 | if ((indexOf(b, aT) == unit)) | |
813 | 813 | then throw("wrong lp asset") | |
814 | 814 | else if ((0 >= bU)) | |
815 | 815 | then throw("user has no borrow in this token") | |
816 | 816 | else if (if ((bM > 0)) | |
817 | 817 | then true | |
818 | 818 | else (bU == 0)) | |
819 | 819 | then throw("user can't be liquidated") | |
820 | 820 | else { | |
821 | 821 | let ba = L(aU) | |
822 | - | let cl = N() | |
823 | - | let cm = value(indexOf(cl, aU)) | |
824 | - | let bz = parseIntValue(value(split(H("setup_penalties"), ",")[cm])) | |
825 | - | let cn = ad(aU, "bRate") | |
826 | - | let aL = cn._1 | |
827 | - | let bO = cn._2 | |
822 | + | let cm = N() | |
823 | + | let cn = value(indexOf(cm, aU)) | |
824 | + | let co = value(indexOf(cm, aT)) | |
825 | + | let bz = parseIntValue(value(split(H("setup_penalties"), ",")[cn])) | |
826 | + | let cp = ad(aU, "bRate") | |
827 | + | let aL = cp._1 | |
828 | + | let bO = cp._2 | |
828 | 829 | let aV = fraction(bU, aL, p) | |
829 | - | let | |
830 | - | let | |
831 | - | let | |
830 | + | let cq = fraction(aV, cl, 100) | |
831 | + | let cr = fraction(cq, (n + bz), n) | |
832 | + | let cs = fraction(cq, p, aL) | |
832 | 833 | let bV = split(i, "_")[1] | |
833 | 834 | let bW = split(i, "_")[0] | |
834 | - | let | |
835 | - | let ap = reentrantInvoke(a, "liquidate", [bW, bV, | |
835 | + | let ct = { | |
836 | + | let ap = reentrantInvoke(a, "liquidate", [bW, bV, cr], nil) | |
836 | 837 | if ($isInstanceOf(ap, "Int")) | |
837 | 838 | then ap | |
838 | 839 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
839 | 840 | } | |
840 | - | if ((bc == bc)) | |
841 | - | then if (bB) | |
842 | - | then throw("liquidation will pass") | |
843 | - | else ([ScriptTransfer(aR.caller, (cp - co), ba), IntegerEntry(((i + "_supplied_") + aT), (bS - bc)), IntegerEntry(((i + "_borrowed_") + aU), (bU - cq)), IntegerEntry(("total_supplied_" + aT), (D(("total_supplied_" + aT)) - bc)), IntegerEntry(("total_borrowed_" + aU), (D(("total_borrowed_" + aU)) - cq))] ++ bO) | |
841 | + | if ((ct == ct)) | |
842 | + | then { | |
843 | + | let bc = fraction(ct, p, bO[((co * 3) + 1)].value) | |
844 | + | if (bB) | |
845 | + | then throw("liquidation will pass") | |
846 | + | else ([ScriptTransfer(aR.caller, (cr - cq), ba), IntegerEntry(((i + "_supplied_") + aT), (bS - bc)), IntegerEntry(((i + "_borrowed_") + aU), (bU - cs)), IntegerEntry(("total_supplied_" + aT), (D(("total_supplied_" + aT)) - bc)), IntegerEntry(("total_borrowed_" + aU), (D(("total_borrowed_" + aU)) - cs))] ++ bO) | |
847 | + | } | |
844 | 848 | else throw("Strict value is not equal to itself.") | |
845 | 849 | } | |
846 | 850 | } | |
847 | 851 | else throw("Strict value is not equal to itself.") | |
848 | 852 | } | |
849 | 853 | ||
850 | 854 | ||
851 | 855 | ||
852 | 856 | @Callable(aR) | |
853 | - | func getUserCollateral (bB,i, | |
857 | + | func getUserCollateral (bB,i,cu,cv) = { | |
854 | 858 | let bC = N() | |
855 | 859 | let bu = split(H("setup_ltvs"), ",") | |
856 | 860 | let bv = split(H("setup_lts"), ",") | |
857 | 861 | let ai = ad(bC[0], "sRate")._2 | |
858 | - | let | |
862 | + | let cw = split(cv, ",") | |
859 | 863 | func t (u,v) = if ((v >= size(bC))) | |
860 | 864 | then u | |
861 | 865 | else { | |
862 | 866 | let bp = D(((i + "_supplied_") + bC[v])) | |
863 | - | let | |
864 | - | let | |
865 | - | then if (if (( | |
867 | + | let cx = D(((i + "_borrowed_") + bC[v])) | |
868 | + | let cy = if ((cv == "")) | |
869 | + | then if (if ((cx != 0)) | |
866 | 870 | then true | |
867 | 871 | else (bp != 0)) | |
868 | 872 | then true | |
869 | 873 | else false | |
870 | 874 | else true | |
871 | - | if ( | |
875 | + | if (cy) | |
872 | 876 | then { | |
873 | 877 | let aG = ar(bC[v]) | |
874 | 878 | let aE = aq(bC[v]) | |
875 | - | ((u + fraction(fraction(fraction((bp + (if (if (if (( | |
876 | - | then ( | |
879 | + | ((u + fraction(fraction(fraction((bp + (if (if (if ((cv != "")) | |
880 | + | then (cw[0] == bC[v]) | |
877 | 881 | else false) | |
878 | - | then ( | |
882 | + | then (cw[1] == "supplied") | |
879 | 883 | else false) | |
880 | - | then parseIntValue( | |
881 | - | else 0)), ai[(v * 3)].value, p), parseIntValue(bu[v]), n), aE._1, aG)) - (if ( | |
882 | - | then fraction(fraction(fraction(( | |
883 | - | then ( | |
884 | + | then parseIntValue(cw[2]) | |
885 | + | else 0)), ai[(v * 3)].value, p), parseIntValue(bu[v]), n), aE._1, aG)) - (if (cu) | |
886 | + | then fraction(fraction(fraction((cx + (if (if (if ((cv != "")) | |
887 | + | then (cw[0] == bC[v]) | |
884 | 888 | else false) | |
885 | - | then ( | |
889 | + | then (cw[1] == "borrowed") | |
886 | 890 | else false) | |
887 | - | then parseIntValue( | |
891 | + | then parseIntValue(cw[2]) | |
888 | 892 | else 0)), ai[((v * 3) + 1)].value, p), n, parseIntValue(bv[v])), aE._2, aG) | |
889 | 893 | else 0)) | |
890 | 894 | } | |
891 | 895 | else u | |
892 | 896 | } | |
893 | 897 | ||
894 | - | let | |
898 | + | let cz = { | |
895 | 899 | let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
896 | 900 | let x = size(w) | |
897 | 901 | let y = 0 | |
898 | 902 | func z (A,B) = if ((B >= x)) | |
899 | 903 | then A | |
900 | 904 | else t(A, w[B]) | |
901 | 905 | ||
902 | 906 | func C (A,B) = if ((B >= x)) | |
903 | 907 | then A | |
904 | 908 | else throw("List size exceeds 12") | |
905 | 909 | ||
906 | 910 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
907 | 911 | } | |
908 | 912 | if (bB) | |
909 | - | then throw(toString( | |
910 | - | else $Tuple2(nil, | |
913 | + | then throw(toString(cz)) | |
914 | + | else $Tuple2(nil, cz) | |
911 | 915 | } | |
912 | 916 | ||
913 | 917 | ||
914 | 918 | ||
915 | 919 | @Callable(aR) | |
916 | 920 | func getAssetDebt (bB,i,l) = { | |
917 | - | let | |
921 | + | let cx = D(((i + "_borrowed_") + l)) | |
918 | 922 | let aG = ar(l) | |
919 | 923 | let V = ad(l, "bRate")._1 | |
920 | - | let | |
924 | + | let cz = fraction(cx, V, p) | |
921 | 925 | if (bB) | |
922 | - | then throw(toString( | |
923 | - | else $Tuple2(nil, | |
926 | + | then throw(toString(cz)) | |
927 | + | else $Tuple2(nil, cz) | |
924 | 928 | } | |
925 | 929 | ||
926 | 930 | ||
927 | 931 | ||
928 | 932 | @Callable(aR) | |
929 | 933 | func getPrices (bB) = { | |
930 | 934 | let bC = N() | |
931 | 935 | func t (u,v) = if ((v >= size(bC))) | |
932 | 936 | then u | |
933 | 937 | else { | |
934 | 938 | let aE = ak(bC[v], 3) | |
935 | 939 | ((((u + toString(aE._1)) + ",") + toString(aE._2)) + "|") | |
936 | 940 | } | |
937 | 941 | ||
938 | - | let | |
942 | + | let cz = { | |
939 | 943 | let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
940 | 944 | let x = size(w) | |
941 | 945 | let y = "" | |
942 | 946 | func z (A,B) = if ((B >= x)) | |
943 | 947 | then A | |
944 | 948 | else t(A, w[B]) | |
945 | 949 | ||
946 | 950 | func C (A,B) = if ((B >= x)) | |
947 | 951 | then A | |
948 | 952 | else throw("List size exceeds 12") | |
949 | 953 | ||
950 | 954 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
951 | 955 | } | |
952 | 956 | if (bB) | |
953 | - | then throw( | |
954 | - | else $Tuple2(nil, | |
957 | + | then throw(cz) | |
958 | + | else $Tuple2(nil, cz) | |
955 | 959 | } | |
956 | 960 | ||
957 | 961 | ||
958 | 962 | ||
959 | 963 | @Callable(aR) | |
960 | 964 | func calculateUtilizationRatio (l,bB) = if (bB) | |
961 | 965 | then throw(toString(ah(l))) | |
962 | 966 | else $Tuple2(nil, ah(l)) | |
963 | 967 | ||
964 | 968 | ||
965 | 969 | ||
966 | 970 | @Callable(aR) | |
967 | 971 | func calculateOutdatedUR (l,bB) = if (bB) | |
968 | 972 | then throw(toString(Q(l))) | |
969 | 973 | else $Tuple2(nil, Q(l)) | |
970 | 974 | ||
971 | 975 | ||
972 | 976 | ||
973 | 977 | @Callable(aR) | |
974 | 978 | func calculateTokenRates (bB) = { | |
975 | 979 | func t (u,l) = { | |
976 | 980 | let ai = W(l) | |
977 | 981 | $Tuple2(((((u._1 + toString(ai[1].value)) + "|") + toString(ai[0].value)) + ","), (u._2 ++ ai)) | |
978 | 982 | } | |
979 | 983 | ||
980 | 984 | let bG = { | |
981 | 985 | let w = N() | |
982 | 986 | let x = size(w) | |
983 | 987 | let y = $Tuple2("", nil) | |
984 | 988 | func z (A,B) = if ((B >= x)) | |
985 | 989 | then A | |
986 | 990 | else t(A, w[B]) | |
987 | 991 | ||
988 | 992 | func C (A,B) = if ((B >= x)) | |
989 | 993 | then A | |
990 | 994 | else throw("List size exceeds 12") | |
991 | 995 | ||
992 | 996 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
993 | 997 | } | |
994 | 998 | if (bB) | |
995 | 999 | then throw(bG._1) | |
996 | 1000 | else $Tuple2(bG._2, bG._1) | |
997 | 1001 | } | |
998 | 1002 | ||
999 | 1003 | ||
1000 | 1004 | ||
1001 | 1005 | @Callable(aR) | |
1002 | 1006 | func calculateTokensInterest (bB) = { | |
1003 | 1007 | func t (u,l) = { | |
1004 | 1008 | let V = fraction(S(l), q, n) | |
1005 | 1009 | ((u + toString(V)) + ",") | |
1006 | 1010 | } | |
1007 | 1011 | ||
1008 | 1012 | let bG = { | |
1009 | 1013 | let w = N() | |
1010 | 1014 | let x = size(w) | |
1011 | 1015 | let y = "" | |
1012 | 1016 | func z (A,B) = if ((B >= x)) | |
1013 | 1017 | then A | |
1014 | 1018 | else t(A, w[B]) | |
1015 | 1019 | ||
1016 | 1020 | func C (A,B) = if ((B >= x)) | |
1017 | 1021 | then A | |
1018 | 1022 | else throw("List size exceeds 12") | |
1019 | 1023 | ||
1020 | 1024 | C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
1021 | 1025 | } | |
1022 | 1026 | if (bB) | |
1023 | 1027 | then throw(bG) | |
1024 | 1028 | else $Tuple2(nil, bG) | |
1025 | 1029 | } | |
1026 | 1030 | ||
1027 | 1031 | ||
1028 | - | @Verifier( | |
1029 | - | func | |
1032 | + | @Verifier(cA) | |
1033 | + | func cB () = if (if (if (sigVerify(cA.bodyBytes, cA.proofs[0], base58'J4QQBsh6FGgZbijQPMDZ7GtNALx2N15K3eHvGhjq43Lt')) | |
1030 | 1034 | then true | |
1031 | - | else sigVerify( | |
1035 | + | else sigVerify(cA.bodyBytes, cA.proofs[0], base58'Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS')) | |
1032 | 1036 | then true | |
1033 | - | else if (sigVerify( | |
1034 | - | then sigVerify( | |
1037 | + | else if (sigVerify(cA.bodyBytes, cA.proofs[0], base58'CYCxuKusNeomQkH9wbcEd4rRP1mDYMc7bw8pr82Agi4N')) | |
1038 | + | then sigVerify(cA.bodyBytes, cA.proofs[0], base58'3oqguA2LUTZFFjJCJ62UybbXFTLwv88tSJ3oMrNSGhiA') | |
1035 | 1039 | else false) | |
1036 | 1040 | then true | |
1037 | - | else sigVerify( | |
1041 | + | else sigVerify(cA.bodyBytes, cA.proofs[0], base58'9t2BGHP6EddYu5xvArqDkhHPGbf8ZiYUaWgFcEPtRZhE') | |
1038 | 1042 |
github/deemru/w8io/873ac7e 296.50 ms ◑![]()