tx · 2CMq6UBdNGQRBo3xrH9WoVjobWWHQuekPFjoMLFTUPFJ

3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk:  -0.03600000 Waves

2023.10.11 21:59 [3860224] smart account 3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk > SELF 0.00000000 Waves

{ "type": 13, "id": "2CMq6UBdNGQRBo3xrH9WoVjobWWHQuekPFjoMLFTUPFJ", "fee": 3600000, "feeAssetId": null, "timestamp": 1697050719698, "version": 2, "chainId": 87, "sender": "3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk", "senderPublicKey": "46pxd1r6gmScNqdp82uEJMs2AZ1F9q2z1VtXZPFAtHYy", "proofs": [ "3Xhp7LqW5UFg5ZMRE8GF73CHJcxpR3sGoWYMPCdK2xmAmVzztPqUrwJfnWi1ffTxes2sJ7YdDpkY1VAtKLTvMikK" ], "script": "base64:BgICCAI0AAVXYXZlcwIFV0FWRVMABlNjYWxlNgDAhD0ABlNjYWxlOACAwtcvAAlTY2FsZThCaWcJALYCAQCAwtcvAAdTY2FsZTEwAIDIr6AlAAdTY2FsZTE2AICAhP6m3uERAApTY2FsZTE2QmlnCQC2AgEAgICE/qbe4REACWRheUJsb2NrcwCgCwAKeWVhckJsb2NrcwCgiiAADXllYXJCbG9ja3NCaWcJALYCAQCgiiAAC3Jlc2VydmVGdW5kABQABWFycjEyCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALBQNuaWwACXVzZHRJZFN0cgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kACXVzZGNJZFN0cgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cADW9yYWNsZUFkZHJlc3MJAQdBZGRyZXNzAQEaAVdJZtDL84r1V3qt/CFvccVbiYgr0IGzsX8AC2F4bHlBZGRyZXNzCQEHQWRkcmVzcwEBGgFXz8h13gt2/Imb93uvCUhEZwkqUEc/D0ItAAdheGx5TFBzCQDMCAICLDdLWmJKclZvcHdKaGtkd2JlMWVGREJiZXg0ZGtZNjNNeGpUTmpxWHRyemoxCQDMCAICLEJ0dzNHMWo0d1FnZHA0OVBUeGFGa052bjc1ZFF0cUdETTdlalFwcEhuV0MxCQDMCAICLEJpU3pGZThuU0w3OG9aYWViZm9pbjV2Qlo1UHplNmQ3a2FlaWpMcXI1eFplCQDMCAICLEYyQUtrQTUxM2s1eUhFSmtMc1U2dld4Q1lZazgxMUdwakxod0V2MldHd1o5CQDMCAICLDRDUTVDUEdMWExiV0JVczJKQmpLVWFScUY0OUNtS0hrd3p2UGdTdlFwQVFWCQDMCAICLDZpTUI2TEtTcmd2OXdhRXZFbk42WWR5eDdkZnhQbkdjVHc4MzE4V1ZtNWJSBQNuaWwBDGdldFJhdGVDdXJ2ZQEKYXNzZXRJZFN0cgQHJG1hdGNoMAUKYXNzZXRJZFN0cgMJAAACAiw5d2MzTFhOQTRURUJzWHlLdG9MRTltcmJERDdXTUhYdlhyQ2padmFiTEFzaQUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixIR2dhYlRxVVM4V3RWRlVKemZtclRETWdFY2NKdVpMQlBoRmdRRnh2bnNvVwUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiwzNE45WWNFRVRMV245M3FZUTY0RXNQMXg4OXRTcnVKVTQ0UnJFTVNYWEVQSgUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiw2WHRIanBYYnM5UlJKUDJTcjlHVXlWcXpBQ2NieTlUa1RoSFhualZDNUNESgUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixBanNvNm5UVGpwdHUyVUhMeDZoZlNYVnRIRnRSQkpDa0tZZDVTQXlqN3pmNQUHJG1hdGNoMAkAlgoEAICJegCAtIkTAIDokiYAgKPDRwMJAAACAixIRUI4UWF3OXhyV3BXczh0SHNpQVRZR0JXREJ0UDJTN2tjUEFMck11NDNBUwUHJG1hdGNoMAkAlgoEAAAAgMLXLwCA6JImAICI3r4BAwkAAAICBVdBVkVTBQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCAlfUqAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gwCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMAkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDAJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gwCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMAkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gwCQCWCgQAAACA4esXAIDokiYAgISvXwMJAAACAiwzVnVWNVdUbUR6NDdEbWRuM1FwY1lqemJTZGlwalFFNEpNZE5lMXhacFgxMwUHJG1hdGNoMAkAlgoEAAAAgMLXLwCA6JImAICI3r4BCQCWCgQAAACA2sQJAIDokiYAgOiSJgEDc3VtAgRzaXplBGRhdGEKAQRmb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFBHNpemUFBWFjY3VtCQBkAgUFYWNjdW0JAJEDAgUEZGF0YQUEbmV4dAoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwBDmdldFNldHVwVG9rZW5zAQ1tYXJrZXRBZGRyZXNzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCDHNldHVwX3Rva2VucwIBLAENZ2V0VG9rZW5QcmljZQEKYXNzZXRJZFN0cgMDCQAAAgUKYXNzZXRJZFN0cgUJdXNkdElkU3RyBgkAAAIFCmFzc2V0SWRTdHIFCXVzZGNJZFN0cgDAhD0DCQEPY29udGFpbnNFbGVtZW50AgUHYXhseUxQcwUKYXNzZXRJZFN0cgoAAUAJAPwHBAULYXhseUFkZHJlc3MCGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZCQDMCAIFCmFzc2V0SWRTdHIFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQFcHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDW9yYWNsZUFkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgUFcHJpY2UBDWdldEFzc2V0U2NhbGUBCmFzc2V0SWRTdHIECGRlY2ltYWxzAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTAAgICQEFdmFsdWUBCQDsBwEJANkEAQUKYXNzZXRJZFN0cghkZWNpbWFscwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04BEWdldExhc3RSYXRlSGVpZ2h0AQ1tYXJrZXRBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MCDmxhc3RSYXRlSGVpZ2h0AAABFmdldE91dGRhdGVkVG90YWxTdXBwbHkCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgAAARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93Ag1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIAAAEQZ2V0T3V0ZGF0ZWRTUmF0ZQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIGX3NSYXRlAAABEGdldE91dGRhdGVkQlJhdGUCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgIFCmFzc2V0SWRTdHICBl9iUmF0ZQAAAQ1nZXRPdXRkYXRlZFVyBBNvdXRkYXRlZFRvdGFsU3VwcGx5E291dGRhdGVkVG90YWxCb3Jyb3cNb3V0ZGF0ZWRTUmF0ZQ1vdXRkYXRlZEJSYXRlBARkb3duCQBrAwUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUNb3V0ZGF0ZWRTUmF0ZQUHU2NhbGUxNgMJAAACBQRkb3duAAAAAAkAawMFBlNjYWxlOAkAawMFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkQlJhdGUFB1NjYWxlMTYFBGRvd24BB2dldFJhdGUCCm91dGRhdGVkVXIKYXNzZXRJZFN0cgQFY3VydmUJAQxnZXRSYXRlQ3VydmUBBQphc3NldElkU3RyCQBkAggFBWN1cnZlAl8xAwkAZwIIBQVjdXJ2ZQJfMwUKb3V0ZGF0ZWRVcgkAawMFCm91dGRhdGVkVXIIBQVjdXJ2ZQJfMggFBWN1cnZlAl8zCQBkAggFBWN1cnZlAl8yCQBrAwkAZQIFCm91dGRhdGVkVXIIBQVjdXJ2ZQJfMwgFBWN1cnZlAl80CQBlAgCAwtcvCAUFY3VydmUCXzMBC2dldEludGVyZXN0AQRyYXRlCQCWAwEJAMwIAgkAawMFBHJhdGUFBlNjYWxlOAUKeWVhckJsb2NrcwkAzAgCAAEFA25pbAENZ2V0QXNzZXRJbmRleAILc2V0dXBUb2tlbnMKYXNzZXRJZFN0cgkBBXZhbHVlAQkAzwgCBQtzZXR1cFRva2VucwUKYXNzZXRJZFN0cgERZ2V0QXNzZXRQYXJhbXRlcnMCEG1hcmtldFBhcmFtZXRlcnMKYXNzZXRJbmRleAkAlQoDCQCRAwIIBRBtYXJrZXRQYXJhbWV0ZXJzAl8xBQphc3NldEluZGV4CQCRAwIIBRBtYXJrZXRQYXJhbWV0ZXJzAl8yBQphc3NldEluZGV4CQCRAwIIBRBtYXJrZXRQYXJhbWV0ZXJzAl8zBQphc3NldEluZGV4ARNnZXRNYXJrZXRQYXJhbWV0ZXJzAg1tYXJrZXRBZGRyZXNzC3NldHVwVG9rZW5zBAdzZXR1cENmCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCCnNldHVwX2x0dnMCASwEB3NldHVwTHQJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIJc2V0dXBfbHRzAgEsBAxzZXR1cFBlbmFsdHkJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIPc2V0dXBfcGVuYWx0aWVzAgEsBAp0b2tlbnNTaXplCQCQAwEFC3NldHVwVG9rZW5zCgEEZm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQp0b2tlbnNTaXplBQVhY2N1bQkAlQoDCQDNCAIIBQVhY2N1bQJfMQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwQ2YFBG5leHQJAM0IAggFBWFjY3VtAl8yCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBMdAUEbmV4dAkAzQgCCAUFYWNjdW0CXzMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxzZXR1cFBlbmFsdHkFBG5leHQKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAQxnZXRNYXhTdXBwbHkCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCdCAIFDW1hcmtldEFkZHJlc3MJAKwCAgIQc2V0dXBfbWF4U3VwcGx5XwUKYXNzZXRJZFN0cgIBMAEOZ2V0QWN0dWFsU1JhdGUEDmxhc3RSYXRlSGVpZ2h0CGludGVyZXN0Cm91dGRhdGVkVXINb3V0ZGF0ZWRTUmF0ZQQJbGFzdFNSYXRlCQCWAwEJAMwIAgUNb3V0ZGF0ZWRTUmF0ZQkAzAgCBQdTY2FsZTE2BQNuaWwECG5ld1NSYXRlCQBkAgUJbGFzdFNSYXRlCQBpAgkAaAIJAGgCCQBlAgUGaGVpZ2h0BQ5sYXN0UmF0ZUhlaWdodAkAawMFCGludGVyZXN0BQpvdXRkYXRlZFVyBQZTY2FsZTgJAGUCAGQFC3Jlc2VydmVGdW5kAGQFCG5ld1NSYXRlAQ5nZXRBY3R1YWxCUmF0ZQMObGFzdFJhdGVIZWlnaHQIaW50ZXJlc3QNb3V0ZGF0ZWRCUmF0ZQQJbGFzdEJSYXRlCQCWAwEJAMwIAgUNb3V0ZGF0ZWRCUmF0ZQkAzAgCBQdTY2FsZTE2BQNuaWwECG5ld0JSYXRlCQBkAgUJbGFzdEJSYXRlCQBoAgkAZQIFBmhlaWdodAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQhuZXdCUmF0ZQELZ2V0QWN0dWFsVXICDGFjdHVhbFN1cHBseQxhY3R1YWxCb3Jyb3cJAGsDBQxhY3R1YWxCb3Jyb3cFBlNjYWxlOAUMYWN0dWFsU3VwcGx5AQ9nZXRBY3R1YWxBbW91bnQCDm91dGRhdGVkQW1vdW50CmFjdHVhbFJhdGUJAGsDBQ5vdXRkYXRlZEFtb3VudAUKYWN0dWFsUmF0ZQUHU2NhbGUxNgEIZ2V0SW5Vc2QDDGFjdHVhbEFtb3VudAphc3NldFNjYWxlBXByaWNlCQBrAwUMYWN0dWFsQW1vdW50BQVwcmljZQUKYXNzZXRTY2FsZQEMZ2V0U3VwcGx5QXB5AgRyYXRlCGFjdHVhbFVyBApzdXBwbHlSYXRlCQBrAwkAawMFBHJhdGUAUABkBQhhY3R1YWxVcgUGU2NhbGU4CQBlAgkAoAMBCQB2BgkAtwICBQpTY2FsZTE2QmlnCQC8AgMJALYCAQUKc3VwcGx5UmF0ZQUJU2NhbGU4QmlnBQ15ZWFyQmxvY2tzQmlnABAFDXllYXJCbG9ja3NCaWcAAAAIBQRET1dOBQZTY2FsZTgBDGdldEJvcnJvd0FweQEEcmF0ZQkAZQIJAKADAQkAdgYJALcCAgUKU2NhbGUxNkJpZwkAvAIDCQC2AgEFBHJhdGUFCVNjYWxlOEJpZwUNeWVhckJsb2Nrc0JpZwAQBQ15ZWFyQmxvY2tzQmlnAAAACAUERE9XTgUGU2NhbGU4AQ9nZXRXYWxsZXRTdXBwbHkEDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgZ3YWxsZXQLYWN0dWFsU1JhdGUEFG91dGRhdGVkV2FsbGV0U3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgkArAICBQZ3YWxsZXQCCl9zdXBwbGllZF8FCmFzc2V0SWRTdHIAAAkBD2dldEFjdHVhbEFtb3VudAIFFG91dGRhdGVkV2FsbGV0U3VwcGx5BQthY3R1YWxTUmF0ZQEPZ2V0V2FsbGV0Qm9ycm93BA1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIGd2FsbGV0C2FjdHVhbEJSYXRlBBRvdXRkYXRlZFdhbGxldEJvcnJvdwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgIJAKwCAgUGd2FsbGV0AgpfYm9ycm93ZWRfBQphc3NldElkU3RyAAAJAQ9nZXRBY3R1YWxBbW91bnQCBRRvdXRkYXRlZFdhbGxldEJvcnJvdwULYWN0dWFsQlJhdGUBEGdldERhaWx5UGVyY2VudHMCA2FweQhxdWFudGl0eQkAawMJAGsDCQBlAgkAoAMBCQB2BgkAtwICBQlTY2FsZThCaWcJALYCAQUDYXB5AAgJALoCAgUKU2NhbGUxNkJpZwUNeWVhckJsb2Nrc0JpZwAQABAFBERPV04FB1NjYWxlMTYFCWRheUJsb2NrcwUGU2NhbGU4BQhxdWFudGl0eQUGU2NhbGU4ARBnZXRBY2NvdW50SGVhbHRoAht0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkAwkAAAIFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAAABQZTY2FsZTgJAGUCBQZTY2FsZTgJAGsDBRt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QFBlNjYWxlOAUbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkAQlnZXROZXRBcHkDFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QWdG90YWxXYWxsZXRCb3Jyb3dJblVzZBZ0b3RhbFdhbGxldE1hcmdpbkluVXNkAwkAAAIFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QAAAAAAwkAZgIFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QAAAkAawMFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QFBlNjYWxlOAUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAkAawMFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QFBlNjYWxlOAUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAELYXNzZXRUb0pzb24CCmFzc2V0SWRTdHIIcXVhbnRpdHkECyR0MDkyMjY5NDQxAwkAAAIFCmFzc2V0SWRTdHIFBVdhdmVzCQCUCgIACAIFV0FWRVMEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUKYXNzZXRJZFN0cgkAlAoCCAUFYXNzZXQIZGVjaW1hbHMIBQVhc3NldARuYW1lBAhkZWNpbWFscwgFCyR0MDkyMjY5NDQxAl8xBARuYW1lCAULJHQwOTIyNjk0NDECXzIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgx7InF1YW50aXR5IjoJAKQDAQUIcXVhbnRpdHkCDCwiZGVjaW1hbHMiOgkApAMBBQhkZWNpbWFscwIJLCJuYW1lIjoiBQRuYW1lAggiLCJpZCI6IgUKYXNzZXRJZFN0cgICIn0BD2Ftb3VudFRvRGVjaW1hbAIGYW1vdW50CmFzc2V0U2NhbGUEB2ludFBhcnQJAGkCBQZhbW91bnQFCmFzc2V0U2NhbGUECWZsb2F0UGFydAkAagIFBmFtb3VudAUKYXNzZXRTY2FsZQkArAICCQCsAgIJAKQDAQUHaW50UGFydAIBLgkApAMBBQlmbG9hdFBhcnQBDWdldE1hcmtldEpzb24DCW1hcmtldFN0cgZ3YWxsZXQFZGVidWcEDW1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW1hcmtldFN0cgQLbWFya2V0SW5kZXgJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgIHbWFya2V0XwUJbWFya2V0U3RyBAptYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUJbWFya2V0U3RyBAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUNbWFya2V0QWRkcmVzcwIMc2V0dXBfYWN0aXZlBgQLc2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFDW1hcmtldEFkZHJlc3MEC2Fzc2V0c0NvdW50CQCQAwEFC3NldHVwVG9rZW5zBA5sYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUNbWFya2V0QWRkcmVzcwoBCmFzc2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAULYXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAVwcmljZQkBDWdldFRva2VuUHJpY2UBBQphc3NldElkU3RyBAphc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxTdXBwbHkJARZnZXRPdXRkYXRlZFRvdGFsU3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkQlJhdGUJARBnZXRPdXRkYXRlZEJSYXRlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQIFCm91dGRhdGVkVXIFCmFzc2V0SWRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQRyYXRlBAVzUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEC3N1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQZzdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAtib3Jyb3dJblVzZAkBCGdldEluVXNkAwUGYm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQIcmVzZXJ2ZXMJAGUCBQZzdXBwbHkFBmJvcnJvdwQNcmVzZXJ2ZXNJblVzZAkBCGdldEluVXNkAwUIcmVzZXJ2ZXMFCmFzc2V0U2NhbGUFBXByaWNlBAJ1cgkBC2dldEFjdHVhbFVyAgUGc3VwcGx5BQZib3Jyb3cECXN1cHBseUFweQkBDGdldFN1cHBseUFweQIFBHJhdGUFAnVyBAlib3Jyb3dBcHkJAQxnZXRCb3Jyb3dBcHkBBQRyYXRlBA9tYXJrZXRBc3NldEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIJInN1cHBseSI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBQZzdXBwbHkCDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQtzdXBwbHlJblVzZAIKLCJib3Jyb3ciOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUGYm9ycm93Ag8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULYm9ycm93SW5Vc2QCDCwicmVzZXJ2ZXMiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUIcmVzZXJ2ZXMCESwicmVzZXJ2ZXNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFDXJlc2VydmVzSW5Vc2QCCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQINLCJzdXBwbHlBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCXN1cHBseUFweQUGU2NhbGU4Ag0sImJvcnJvd0FweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUJYm9ycm93QXB5BQZTY2FsZTgCFCwidXRpbGl6YXRpb25SYXRpbyI6CQEPYW1vdW50VG9EZWNpbWFsAgUCdXIFBlNjYWxlOAIJLCJzUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFc1JhdGUFB1NjYWxlMTYCCSwiYlJhdGUiOgkBD2Ftb3VudFRvRGVjaW1hbAIFBWJSYXRlBQdTY2FsZTE2AgF9CQCWCgQJAGQCCAUFYWNjdW0CXzEFC3N1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBQtib3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUNcmVzZXJ2ZXNJblVzZAkAzQgCCAUFYWNjdW0CXzQFD21hcmtldEFzc2V0SnNvbgQNJHQwMTI3MDAxMjgwOAoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQphc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQLc3VwcGx5SW5Vc2QIBQ0kdDAxMjcwMDEyODA4Al8xBAtib3Jyb3dJblVzZAgFDSR0MDEyNzAwMTI4MDgCXzIEDXJlc2VydmVzSW5Vc2QIBQ0kdDAxMjcwMDEyODA4Al8zBBBtYXJrZXRBc3NldHNKc29uCAUNJHQwMTI3MDAxMjgwOAJfNAQMbWFya2V0c0NvdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBAgdtYXJrZXRzCgELbWFya2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAUMbWFya2V0c0NvdW50BQVhY2N1bQQXY3VycmVudE1hcmtldEFkZHJlc3NTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIHbWFya2V0XwkApAMBBQRuZXh0BBFjdXJyZW50TWFya2V0TmFtZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgxtYXJrZXRfbmFtZV8FF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyBApzaW1wbGVKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIIm5hbWUiOiIFEWN1cnJlbnRNYXJrZXROYW1lAgEiAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgAAAhEsImFjY291bnRIZWFsdGgiOgkBD2Ftb3VudFRvRGVjaW1hbAIAAAUGU2NhbGU4AgF9AwkAAAIFBndhbGxldAIACQDNCAIFBWFjY3VtBQpzaW1wbGVKc29uBBRjdXJyZW50TWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUXY3VycmVudE1hcmtldEFkZHJlc3NTdHIEEmN1cnJlbnRTZXR1cFRva2VucwkBDmdldFNldHVwVG9rZW5zAQUUY3VycmVudE1hcmtldEFkZHJlc3MEEmN1cnJlbnRBc3NldHNDb3VudAkAkAMBBRJjdXJyZW50U2V0dXBUb2tlbnMEFmN1cnJlbnRNYXJrZXRTaG9ydE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIRbWFya2V0X3Nob3J0bmFtZV8FF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyBAdzZXR1cENmCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzAgpzZXR1cF9sdHZzAgEsBAdzZXR1cEx0CQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzAglzZXR1cF9sdHMCASwEFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUUY3VycmVudE1hcmtldEFkZHJlc3MKARBtYXJrZXRBc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFEmN1cnJlbnRBc3NldHNDb3VudAUFYWNjdW0ECmFzc2V0SWRTdHIJAJEDAgUSY3VycmVudFNldHVwVG9rZW5zBQRuZXh0BAJjZgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwQ2YFBG5leHQEAmx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBMdAUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAQUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsQm9ycm93CQEWZ2V0T3V0ZGF0ZWRUb3RhbEJvcnJvdwIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBApvdXRkYXRlZFVyCQENZ2V0T3V0ZGF0ZWRVcgQFE291dGRhdGVkVG90YWxTdXBwbHkFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkU1JhdGUFDW91dGRhdGVkQlJhdGUEBHJhdGUJAQdnZXRSYXRlAgUKb3V0ZGF0ZWRVcgUKYXNzZXRJZFN0cgQIaW50ZXJlc3QJAQtnZXRJbnRlcmVzdAEFBHJhdGUEBXNSYXRlCQEOZ2V0QWN0dWFsU1JhdGUEBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUVY3VycmVudExhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQMd2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFc1JhdGUEEXdhbGxldFN1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRTdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAx3YWxsZXRCb3Jyb3cJAQ9nZXRXYWxsZXRCb3Jyb3cEBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQViUmF0ZQQRd2FsbGV0Qm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldEJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UEFndhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAGsDBRF3YWxsZXRTdXBwbHlJblVzZAUCY2YFBlNjYWxlOAQWd2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAawMFEXdhbGxldEJvcnJvd0luVXNkBQZTY2FsZTgFAmx0CQCWCgQJAGQCCAUFYWNjdW0CXzEFEXdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRF3YWxsZXRCb3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUWd2FsbGV0Qm9ycm93TGltaXRJblVzZAkAZAIIBQVhY2N1bQJfNAUWd2FsbGV0Qm9ycm93VXNhZ2VJblVzZAQNJHQwMTU4OTQxNjA1NAoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBtYXJrZXRBc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQWdG90YWxXYWxsZXRTdXBwbHlJblVzZAgFDSR0MDE1ODk0MTYwNTQCXzEEFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QIBQ0kdDAxNTg5NDE2MDU0Al8yBBt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QIBQ0kdDAxNTg5NDE2MDU0Al8zBBt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QIBQ0kdDAxNTg5NDE2MDU0Al80BA1hY2NvdW50SGVhbHRoCQEQZ2V0QWNjb3VudEhlYWx0aAIFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAUbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkBAhmdWxsSnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIImluZGV4IjoJAKQDAQUEbmV4dAIJLCJuYW1lIjoiBRZjdXJyZW50TWFya2V0U2hvcnROYW1lAgEiAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgUNYWNjb3VudEhlYWx0aAUGU2NhbGU4AgF9CQDNCAIFBWFjY3VtBQhmdWxsSnNvbgQLbWFya2V0c0pzb24KAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC21hcmtldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCCJpbmRleCI6CQCkAwEFC21hcmtldEluZGV4AgksIm5hbWUiOiIFCm1hcmtldE5hbWUCASICCiwiYWN0aXZlIjoJAKUDAQUGYWN0aXZlAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULc3VwcGx5SW5Vc2QCDywiYm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQtib3Jyb3dJblVzZAIRLCJyZXNlcnZlc0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUNcmVzZXJ2ZXNJblVzZAILLCJhc3NldHMiOlsJALsJAgUQbWFya2V0QXNzZXRzSnNvbgIBLAIBXQIMLCJtYXJrZXRzIjpbCQC7CQIFC21hcmtldHNKc29uAgEsAgFdAgF9AwUFZGVidWcJAAIBBQRqc29uBQRqc29uAQtnZXRNZW51SnNvbgEFZGVidWcEDG1hcmtldHNDb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQIHbWFya2V0cwoBC21hcmtldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFDG1hcmtldHNDb3VudAUFYWNjdW0ECW1hcmtldFN0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFBG5leHQEDW1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW1hcmtldFN0cgQLc2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFDW1hcmtldEFkZHJlc3MEC2Fzc2V0c0NvdW50CQCQAwEFC3NldHVwVG9rZW5zBA5sYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUNbWFya2V0QWRkcmVzcwoBCmFzc2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAULYXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAVwcmljZQkBDWdldFRva2VuUHJpY2UBBQphc3NldElkU3RyBAphc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxTdXBwbHkJARZnZXRPdXRkYXRlZFRvdGFsU3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkQlJhdGUJARBnZXRPdXRkYXRlZEJSYXRlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQIFCm91dGRhdGVkVXIFCmFzc2V0SWRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQRyYXRlBAVzUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEC3N1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQZzdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAtib3Jyb3dJblVzZAkBCGdldEluVXNkAwUGYm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQIcmVzZXJ2ZXMJAGUCBQZzdXBwbHkFBmJvcnJvdwQNcmVzZXJ2ZXNJblVzZAkBCGdldEluVXNkAwUIcmVzZXJ2ZXMFCmFzc2V0U2NhbGUFBXByaWNlBA9tYXJrZXRBc3NldEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCCJhc3NldCI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyAAACCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQIJLCJzUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFc1JhdGUFB1NjYWxlMTYCCSwiYlJhdGUiOgkBD2Ftb3VudFRvRGVjaW1hbAIFBWJSYXRlBQdTY2FsZTE2AgF9CQCWCgQJAGQCCAUFYWNjdW0CXzEFC3N1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBQtib3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUNcmVzZXJ2ZXNJblVzZAkAzQgCCAUFYWNjdW0CXzQFD21hcmtldEFzc2V0SnNvbgQNJHQwMTk1ODkxOTY5NwoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQphc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQLc3VwcGx5SW5Vc2QIBQ0kdDAxOTU4OTE5Njk3Al8xBAtib3Jyb3dJblVzZAgFDSR0MDE5NTg5MTk2OTcCXzIEDXJlc2VydmVzSW5Vc2QIBQ0kdDAxOTU4OTE5Njk3Al8zBBBtYXJrZXRBc3NldHNKc29uCAUNJHQwMTk1ODkxOTY5NwJfNAQKbWFya2V0SnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AgsiYWRkcmVzcyI6IgUJbWFya2V0U3RyAgEiAgssImFzc2V0cyI6WwkAuwkCBRBtYXJrZXRBc3NldHNKc29uAgEsAgFdAgF9CQCWCgQJAGQCCAUFYWNjdW0CXzEFC3N1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBQtib3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUNcmVzZXJ2ZXNJblVzZAkAzQgCCAUFYWNjdW0CXzQFCm1hcmtldEpzb24EDSR0MDIwMDQ1MjAxNjQKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAAAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELbWFya2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBB0b3RhbFN1cHBseUluVXNkCAUNJHQwMjAwNDUyMDE2NAJfMQQQdG90YWxCb3Jyb3dJblVzZAgFDSR0MDIwMDQ1MjAxNjQCXzIEEnRvdGFsUmVzZXJ2ZXNJblVzZAgFDSR0MDIwMDQ1MjAxNjQCXzMEC21hcmtldHNKc29uCAUNJHQwMjAwNDUyMDE2NAJfNAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7Ag4ic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRB0b3RhbFN1cHBseUluVXNkAg8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUQdG90YWxCb3Jyb3dJblVzZAIRLCJyZXNlcnZlc0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUSdG90YWxSZXNlcnZlc0luVXNkAgwsIm1hcmtldHMiOlsJALsJAgULbWFya2V0c0pzb24CASwCAV0CAX0DBQVkZWJ1ZwkAAgEFBGpzb24FBGpzb24BDWdldFdhbGxldEpzb24DCW1hcmtldFN0cgZ3YWxsZXQFZGVidWcEDW1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW1hcmtldFN0cgQLbWFya2V0SW5kZXgJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgIHbWFya2V0XwUJbWFya2V0U3RyBAptYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUJbWFya2V0U3RyBAxtYXJrZXRzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQECB21hcmtldHMKAQttYXJrZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQxtYXJrZXRzQ291bnQFBWFjY3VtBBdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFBG5leHQEEWN1cnJlbnRNYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUXY3VycmVudE1hcmtldEFkZHJlc3NTdHIEFGN1cnJlbnRNYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgQSY3VycmVudFNldHVwVG9rZW5zCQEOZ2V0U2V0dXBUb2tlbnMBBRRjdXJyZW50TWFya2V0QWRkcmVzcwQSY3VycmVudEFzc2V0c0NvdW50CQCQAwEFEmN1cnJlbnRTZXR1cFRva2VucwQWY3VycmVudE1hcmtldFNob3J0TmFtZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAhFtYXJrZXRfc2hvcnRuYW1lXwUXY3VycmVudE1hcmtldEFkZHJlc3NTdHIEB3NldHVwQ2YJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUUY3VycmVudE1hcmtldEFkZHJlc3MCCnNldHVwX2x0dnMCASwEB3NldHVwTHQJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUUY3VycmVudE1hcmtldEFkZHJlc3MCCXNldHVwX2x0cwIBLAQVY3VycmVudExhc3RSYXRlSGVpZ2h0CQERZ2V0TGFzdFJhdGVIZWlnaHQBBRRjdXJyZW50TWFya2V0QWRkcmVzcwoBEG1hcmtldEFzc2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAUSY3VycmVudEFzc2V0c0NvdW50BQVhY2N1bQQKYXNzZXRJZFN0cgkAkQMCBRJjdXJyZW50U2V0dXBUb2tlbnMFBG5leHQEAmNmCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBDZgUEbmV4dAQCbHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQRuZXh0BAVwcmljZQkBDWdldFRva2VuUHJpY2UBBQphc3NldElkU3RyBAphc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxTdXBwbHkJARZnZXRPdXRkYXRlZFRvdGFsU3VwcGx5AgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkU1JhdGUJARBnZXRPdXRkYXRlZFNSYXRlAgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkQlJhdGUJARBnZXRPdXRkYXRlZEJSYXRlAgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUCBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCm91dGRhdGVkVXIFDW91dGRhdGVkU1JhdGUEBWJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEAnVyCQELZ2V0QWN0dWFsVXICBQZzdXBwbHkFBmJvcnJvdwQJc3VwcGx5QXB5CQEMZ2V0U3VwcGx5QXB5AgUEcmF0ZQUCdXIECWJvcnJvd0FweQkBDGdldEJvcnJvd0FweQEFBHJhdGUEDHdhbGxldFN1cHBseQkBD2dldFdhbGxldFN1cHBseQQFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBXNSYXRlBBF3YWxsZXRTdXBwbHlJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0U3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQMd2FsbGV0Qm9ycm93CQEPZ2V0V2FsbGV0Qm9ycm93BAUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBZ3YWxsZXRCb3Jyb3dMaW1pdEluVXNkCQBrAwURd2FsbGV0U3VwcGx5SW5Vc2QFAmNmBQZTY2FsZTgEFndhbGxldEJvcnJvd1VzYWdlSW5Vc2QJAGsDBRF3YWxsZXRCb3Jyb3dJblVzZAUGU2NhbGU4BQJsdAQRd2FsbGV0RGFpbHlJbmNvbWUJARBnZXREYWlseVBlcmNlbnRzAgUJc3VwcGx5QXB5BQx3YWxsZXRTdXBwbHkEFndhbGxldERhaWx5SW5jb21lSW5Vc2QJAQhnZXRJblVzZAMFEXdhbGxldERhaWx5SW5jb21lBQphc3NldFNjYWxlBQVwcmljZQQXd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3QJARBnZXREYWlseVBlcmNlbnRzAgUJYm9ycm93QXB5BQx3YWxsZXRCb3Jyb3cEHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QJAQhnZXRJblVzZAMFF3dhbGxldERhaWx5TG9hbkludGVyZXN0BQphc3NldFNjYWxlBQVwcmljZQQRd2FsbGV0TWFyZ2luSW5Vc2QJAGUCCQBrAwURd2FsbGV0U3VwcGx5SW5Vc2QFCXN1cHBseUFweQUGU2NhbGU4CQBrAwURd2FsbGV0Qm9ycm93SW5Vc2QFCWJvcnJvd0FweQUGU2NhbGU4CQCZCgcJAGQCCAUFYWNjdW0CXzEFEXdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRF3YWxsZXRCb3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUWd2FsbGV0Qm9ycm93TGltaXRJblVzZAkAZAIIBQVhY2N1bQJfNAUWd2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAZAIIBQVhY2N1bQJfNQUWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAkAZAIIBQVhY2N1bQJfNgUcd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAkAZAIIBQVhY2N1bQJfNwURd2FsbGV0TWFyZ2luSW5Vc2QEDSR0MDI0NjA2MjQ5NjAKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCZCgcAAAAAAAAAAAAAAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQbWFya2V0QXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QIBQ0kdDAyNDYwNjI0OTYwAl8xBBZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCAUNJHQwMjQ2MDYyNDk2MAJfMgQbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkCAUNJHQwMjQ2MDYyNDk2MAJfMwQbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkCAUNJHQwMjQ2MDYyNDk2MAJfNAQbdG90YWxXYWxsZXREYWlseUluY29tZUluVXNkCAUNJHQwMjQ2MDYyNDk2MAJfNQQhdG90YWxXYWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkCAUNJHQwMjQ2MDYyNDk2MAJfNgQWdG90YWxXYWxsZXRNYXJnaW5JblVzZAgFDSR0MDI0NjA2MjQ5NjACXzcEF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkAwkAZgIFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QJAGUCBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkAAAEDWFjY291bnRIZWFsdGgJARBnZXRBY2NvdW50SGVhbHRoAgUbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkBRt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QEBm5ldEFweQkBCWdldE5ldEFweQMFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QEC21hcmtldHNKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggiaW5kZXgiOgkApAMBBQRuZXh0AgksIm5hbWUiOiIFFmN1cnJlbnRNYXJrZXRTaG9ydE5hbWUCASICDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkAg8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAIRLCJhY2NvdW50SGVhbHRoIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQ1hY2NvdW50SGVhbHRoBQZTY2FsZTgCAX0KARB3YWxsZXRBc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFEmN1cnJlbnRBc3NldHNDb3VudAUFYWNjdW0ECmFzc2V0SWRTdHIJAJEDAgUSY3VycmVudFNldHVwVG9rZW5zBQRuZXh0BAVwcmljZQkBDWdldFRva2VuUHJpY2UBBQphc3NldElkU3RyBAphc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxTdXBwbHkJARZnZXRPdXRkYXRlZFRvdGFsU3VwcGx5AgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkU1JhdGUJARBnZXRPdXRkYXRlZFNSYXRlAgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkQlJhdGUJARBnZXRPdXRkYXRlZEJSYXRlAgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUCBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCm91dGRhdGVkVXIFDW91dGRhdGVkU1JhdGUEBWJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEAnVyCQELZ2V0QWN0dWFsVXICBQZzdXBwbHkFBmJvcnJvdwQJc3VwcGx5QXB5CQEMZ2V0U3VwcGx5QXB5AgUEcmF0ZQUCdXIECWJvcnJvd0FweQkBDGdldEJvcnJvd0FweQEFBHJhdGUEDHdhbGxldFN1cHBseQkBD2dldFdhbGxldFN1cHBseQQFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBXNSYXRlBBF3YWxsZXRTdXBwbHlJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0U3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQMd2FsbGV0Qm9ycm93CQEPZ2V0V2FsbGV0Qm9ycm93BAUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBF3YWxsZXREYWlseUluY29tZQkBEGdldERhaWx5UGVyY2VudHMCBQlzdXBwbHlBcHkFDHdhbGxldFN1cHBseQQWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAkBCGdldEluVXNkAwURd2FsbGV0RGFpbHlJbmNvbWUFCmFzc2V0U2NhbGUFBXByaWNlBBd3YWxsZXREYWlseUxvYW5JbnRlcmVzdAkBEGdldERhaWx5UGVyY2VudHMCBQlib3Jyb3dBcHkFDHdhbGxldEJvcnJvdwQcd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAkBCGdldEluVXNkAwUXd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3QFCmFzc2V0U2NhbGUFBXByaWNlBBBzdXBwbHlBc3NldHNKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCSJhbW91bnQiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUMd2FsbGV0U3VwcGx5Ag8sImFtb3VudEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgURd2FsbGV0U3VwcGx5SW5Vc2QCCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQIHLCJhcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCXN1cHBseUFweQUGU2NhbGU4AhEsImRhaWx5UGVyY2VudHMiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgURd2FsbGV0RGFpbHlJbmNvbWUCFiwiZGFpbHlQZXJjZW50c0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAIBfQQQYm9ycm93QXNzZXRzSnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AgkiYW1vdW50IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFDHdhbGxldEJvcnJvdwIPLCJhbW91bnRJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEXdhbGxldEJvcnJvd0luVXNkAgksInByaWNlIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUFcHJpY2UCBywiYXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQlib3Jyb3dBcHkFBlNjYWxlOAIRLCJkYWlseVBlcmNlbnRzIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFF3dhbGxldERhaWx5TG9hbkludGVyZXN0AhYsImRhaWx5UGVyY2VudHNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QCAX0JAJQKAgkAzQgCCAUFYWNjdW0CXzEFEHN1cHBseUFzc2V0c0pzb24JAM0IAggFBWFjY3VtAl8yBRBib3Jyb3dBc3NldHNKc29uBA0kdDAyODkzMjI5MDE4CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQd2FsbGV0QXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEEHN1cHBseUFzc2V0c0pzb24IBQ0kdDAyODkzMjI5MDE4Al8xBBBib3Jyb3dBc3NldHNKc29uCAUNJHQwMjg5MzIyOTAxOAJfMgMJAAACBQttYXJrZXRJbmRleAUEbmV4dAkAoQoPCQBkAggFBWFjY3VtAl8xBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCQBkAggFBWFjY3VtAl8zBRd0b3RhbFdhbGxldEJhZERlYnRJblVzZAkAZAIIBQVhY2N1bQJfNAUbdG90YWxXYWxsZXREYWlseUluY29tZUluVXNkCQBkAggFBWFjY3VtAl81BSF0b3RhbFdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QJAGQCCAUFYWNjdW0CXzYFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzcFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzgFF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkCQBkAggFBWFjY3VtAl85BRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QJAGQCCAUFYWNjdW0DXzEwBSF0b3RhbFdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QJAGQCCAUFYWNjdW0DXzExBQ1hY2NvdW50SGVhbHRoCQBkAggFBWFjY3VtA18xMgUGbmV0QXB5CQDNCAIIBQVhY2N1bQNfMTMFC21hcmtldHNKc29uCQDNCAIIBQVhY2N1bQNfMTQFEHN1cHBseUFzc2V0c0pzb24JAM0IAggFBWFjY3VtA18xNQUQYm9ycm93QXNzZXRzSnNvbgkAoQoPCQBkAggFBWFjY3VtAl8xBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCQBkAggFBWFjY3VtAl8zBRd0b3RhbFdhbGxldEJhZERlYnRJblVzZAkAZAIIBQVhY2N1bQJfNAUbdG90YWxXYWxsZXREYWlseUluY29tZUluVXNkCQBkAggFBWFjY3VtAl81BSF0b3RhbFdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QIBQVhY2N1bQJfNggFBWFjY3VtAl83CAUFYWNjdW0CXzgIBQVhY2N1bQJfOQgFBWFjY3VtA18xMAgFBWFjY3VtA18xMQgFBWFjY3VtA18xMgkAzQgCCAUFYWNjdW0DXzEzBQttYXJrZXRzSnNvbggFBWFjY3VtA18xNAgFBWFjY3VtA18xNQQNJHQwMzAzMDczMDg1MQoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAKEKDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUDbmlsBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELbWFya2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBZ0b3RhbFdhbGxldFN1cHBseUluVXNkCAUNJHQwMzAzMDczMDg1MQJfMQQWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAgFDSR0MDMwMzA3MzA4NTECXzIEF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkCAUNJHQwMzAzMDczMDg1MQJfMwQbdG90YWxXYWxsZXREYWlseUluY29tZUluVXNkCAUNJHQwMzAzMDczMDg1MQJfNAQhdG90YWxXYWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkCAUNJHQwMzAzMDczMDg1MQJfNQQRd2FsbGV0U3VwcGx5SW5Vc2QIBQ0kdDAzMDMwNzMwODUxAl82BBF3YWxsZXRCb3Jyb3dJblVzZAgFDSR0MDMwMzA3MzA4NTECXzcEEndhbGxldEJhZERlYnRJblVzZAgFDSR0MDMwMzA3MzA4NTECXzgEFndhbGxldERhaWx5SW5jb21lSW5Vc2QIBQ0kdDAzMDMwNzMwODUxAl85BBx3YWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkCAUNJHQwMzAzMDczMDg1MQNfMTAEE3dhbGxldEFjY291bnRIZWFsdGgIBQ0kdDAzMDMwNzMwODUxA18xMQQMd2FsbGV0TmV0QXB5CAUNJHQwMzAzMDczMDg1MQNfMTIEC21hcmtldHNKc29uCAUNJHQwMzAzMDczMDg1MQNfMTMEEHN1cHBseUFzc2V0c0pzb24IBQ0kdDAzMDMwNzMwODUxA18xNAQQYm9ycm93QXNzZXRzSnNvbggFDSR0MDMwMzA3MzA4NTEDXzE1BARqc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7Ag4ibWFya2V0SW5kZXgiOgkApAMBBQttYXJrZXRJbmRleAILLCJtYXJrZXQiOiIFCm1hcmtldE5hbWUCASICFCwidG90YWxTdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QCFCwidG90YWxCb3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QCFSwidG90YWxCYWREZWJ0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRd0b3RhbFdhbGxldEJhZERlYnRJblVzZAIZLCJ0b3RhbERhaWx5SW5jb21lSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QCHywidG90YWxEYWlseUxvYW5JbnRlcmVzdEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUhdG90YWxXYWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgURd2FsbGV0U3VwcGx5SW5Vc2QCDywiYm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRF3YWxsZXRCb3Jyb3dJblVzZAIQLCJiYWREZWJ0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRJ3YWxsZXRCYWREZWJ0SW5Vc2QCFCwiZGFpbHlJbmNvbWVJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFndhbGxldERhaWx5SW5jb21lSW5Vc2QCGiwiZGFpbHlMb2FuSW50ZXJlc3RJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgUTd2FsbGV0QWNjb3VudEhlYWx0aAUGU2NhbGU4AgosIm5ldEFweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUMd2FsbGV0TmV0QXB5BQZTY2FsZTgCESwic3VwcGx5QXNzZXRzIjpbCQC7CQIFEHN1cHBseUFzc2V0c0pzb24CASwCAV0CESwiYm9ycm93QXNzZXRzIjpbCQC7CQIFEGJvcnJvd0Fzc2V0c0pzb24CASwCAV0CDCwibWFya2V0cyI6WwkAuwkCBQttYXJrZXRzSnNvbgIBLAIBXQIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgEXZ2V0V2FsbGV0T3BlcmF0aW9uc0pzb24ECW1hcmtldFN0cgphc3NldElkU3RyBndhbGxldAVkZWJ1ZwQNbWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbWFya2V0U3RyBAttYXJrZXRJbmRleAkBEUBleHRyTmF0aXZlKDEwNTUpAQkArAICAgdtYXJrZXRfBQltYXJrZXRTdHIECm1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBQltYXJrZXRTdHIEBmFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1tYXJrZXRBZGRyZXNzAgxzZXR1cF9hY3RpdmUGBAtzZXR1cFRva2VucwkBDmdldFNldHVwVG9rZW5zAQUNbWFya2V0QWRkcmVzcwQHc2V0dXBDZgkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAgpzZXR1cF9sdHZzAgEsBAdzZXR1cEx0CQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCCXNldHVwX2x0cwIBLAQMc2V0dXBQZW5hbHR5CQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCD3NldHVwX3BlbmFsdGllcwIBLAQKYXNzZXRJbmRleAkBDWdldEFzc2V0SW5kZXgCBQtzZXR1cFRva2VucwUKYXNzZXRJZFN0cgQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQphc3NldEluZGV4BAJsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFCmFzc2V0SW5kZXgEB3BlbmFsdHkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxzZXR1cFBlbmFsdHkFCmFzc2V0SW5kZXgEC2Fzc2V0c0NvdW50CQCQAwEFC3NldHVwVG9rZW5zBA5sYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUNbWFya2V0QWRkcmVzcwQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAQUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUCBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUKb3V0ZGF0ZWRVcgUNb3V0ZGF0ZWRTUmF0ZQQFYlJhdGUJAQ5nZXRBY3R1YWxCUmF0ZQMFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQGc3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEBmJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAtzdXBwbHlJblVzZAkBCGdldEluVXNkAwUGc3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQLYm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFBmJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UECHJlc2VydmVzCQBlAgUGc3VwcGx5BQZib3Jyb3cEDXJlc2VydmVzSW5Vc2QJAQhnZXRJblVzZAMFCHJlc2VydmVzBQphc3NldFNjYWxlBQVwcmljZQQCdXIJAQtnZXRBY3R1YWxVcgIFBnN1cHBseQUGYm9ycm93BAlzdXBwbHlBcHkJAQxnZXRTdXBwbHlBcHkCBQRyYXRlBQJ1cgQJYm9ycm93QXB5CQEMZ2V0Qm9ycm93QXB5AQUEcmF0ZQQJbWF4U3VwcGx5CQEMZ2V0TWF4U3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQMd2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQVzUmF0ZQQRd2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldFN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEEXdhbGxldERhaWx5SW5jb21lCQEQZ2V0RGFpbHlQZXJjZW50cwIFCXN1cHBseUFweQUMd2FsbGV0U3VwcGx5BBZ3YWxsZXREYWlseUluY29tZUluVXNkCQEIZ2V0SW5Vc2QDBRF3YWxsZXREYWlseUluY29tZQUKYXNzZXRTY2FsZQUFcHJpY2UEDHdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBd3YWxsZXREYWlseUxvYW5QZXJjZW50cwkBEGdldERhaWx5UGVyY2VudHMCBQlib3Jyb3dBcHkFDHdhbGxldEJvcnJvdwQcd2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAkBCGdldEluVXNkAwUXd2FsbGV0RGFpbHlMb2FuUGVyY2VudHMFCmFzc2V0U2NhbGUFBXByaWNlCgEKYXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQthc3NldHNDb3VudAUFYWNjdW0EEWN1cnJlbnRBc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAljdXJyZW50Q2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0BAljdXJyZW50THQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQRuZXh0BAxjdXJyZW50UHJpY2UJAQ1nZXRUb2tlblByaWNlAQURY3VycmVudEFzc2V0SWRTdHIEEWN1cnJlbnRBc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFEWN1cnJlbnRBc3NldElkU3RyBBpjdXJyZW50T3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgQaY3VycmVudE91dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwURY3VycmVudEFzc2V0SWRTdHIEFGN1cnJlbnRPdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFDW1hcmtldEFkZHJlc3MFEWN1cnJlbnRBc3NldElkU3RyBBRjdXJyZW50T3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgQRY3VycmVudE91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUaY3VycmVudE91dGRhdGVkVG90YWxTdXBwbHkFGmN1cnJlbnRPdXRkYXRlZFRvdGFsQm9ycm93BRRjdXJyZW50T3V0ZGF0ZWRTUmF0ZQUUY3VycmVudE91dGRhdGVkQlJhdGUEC2N1cnJlbnRSYXRlCQEHZ2V0UmF0ZQIFEWN1cnJlbnRPdXRkYXRlZFVyBRFjdXJyZW50QXNzZXRJZFN0cgQPY3VycmVudEludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQtjdXJyZW50UmF0ZQQMY3VycmVudFNSYXRlCQEOZ2V0QWN0dWFsU1JhdGUEBQ5sYXN0UmF0ZUhlaWdodAUPY3VycmVudEludGVyZXN0BRFjdXJyZW50T3V0ZGF0ZWRVcgUUY3VycmVudE91dGRhdGVkU1JhdGUEDGN1cnJlbnRCUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUObGFzdFJhdGVIZWlnaHQFD2N1cnJlbnRJbnRlcmVzdAUUY3VycmVudE91dGRhdGVkQlJhdGUEDWN1cnJlbnRTdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRpjdXJyZW50T3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEDWN1cnJlbnRCb3Jyb3cJAQ9nZXRBY3R1YWxBbW91bnQCBRpjdXJyZW50T3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUECWN1cnJlbnRVcgkBC2dldEFjdHVhbFVyAgUNY3VycmVudFN1cHBseQUNY3VycmVudEJvcnJvdwQQY3VycmVudFN1cHBseUFweQkBDGdldFN1cHBseUFweQIFC2N1cnJlbnRSYXRlBQljdXJyZW50VXIEEGN1cnJlbnRCb3Jyb3dBcHkJAQxnZXRCb3Jyb3dBcHkBBQtjdXJyZW50UmF0ZQQTY3VycmVudFdhbGxldFN1cHBseQkBD2dldFdhbGxldFN1cHBseQQFDW1hcmtldEFkZHJlc3MFEWN1cnJlbnRBc3NldElkU3RyBQZ3YWxsZXQFDGN1cnJlbnRTUmF0ZQQYY3VycmVudFdhbGxldFN1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBRNjdXJyZW50V2FsbGV0U3VwcGx5BRFjdXJyZW50QXNzZXRTY2FsZQUMY3VycmVudFByaWNlBBNjdXJyZW50V2FsbGV0Qm9ycm93CQEPZ2V0V2FsbGV0Qm9ycm93BAUNbWFya2V0QWRkcmVzcwURY3VycmVudEFzc2V0SWRTdHIFBndhbGxldAUMY3VycmVudEJSYXRlBBhjdXJyZW50V2FsbGV0Qm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFE2N1cnJlbnRXYWxsZXRCb3Jyb3cFEWN1cnJlbnRBc3NldFNjYWxlBQxjdXJyZW50UHJpY2UEHWN1cnJlbnRXYWxsZXRCb3Jyb3dMaW1pdEluVXNkCQBrAwUYY3VycmVudFdhbGxldFN1cHBseUluVXNkBQljdXJyZW50Q2YFBlNjYWxlOAQdY3VycmVudFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QJAGsDBRhjdXJyZW50V2FsbGV0Qm9ycm93SW5Vc2QFBlNjYWxlOAUJY3VycmVudEx0BBF3YWxsZXRNYXJnaW5JblVzZAkAZQIJAGsDBRhjdXJyZW50V2FsbGV0U3VwcGx5SW5Vc2QFEGN1cnJlbnRTdXBwbHlBcHkFBlNjYWxlOAkAawMFGGN1cnJlbnRXYWxsZXRCb3Jyb3dJblVzZAUQY3VycmVudEJvcnJvd0FweQUGU2NhbGU4CQCXCgUJAGQCCAUFYWNjdW0CXzEFGGN1cnJlbnRXYWxsZXRTdXBwbHlJblVzZAkAZAIIBQVhY2N1bQJfMgUYY3VycmVudFdhbGxldEJvcnJvd0luVXNkCQBkAggFBWFjY3VtAl8zBR1jdXJyZW50V2FsbGV0Qm9ycm93TGltaXRJblVzZAkAZAIIBQVhY2N1bQJfNAUdY3VycmVudFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QJAGQCCAUFYWNjdW0CXzUFEXdhbGxldE1hcmdpbkluVXNkBA0kdDAzNzY4NjM3ODY3CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlwoFAAAAAAAAAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKYXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QIBQ0kdDAzNzY4NjM3ODY3Al8xBBZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCAUNJHQwMzc2ODYzNzg2NwJfMgQbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkCAUNJHQwMzc2ODYzNzg2NwJfMwQbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkCAUNJHQwMzc2ODYzNzg2NwJfNAQWdG90YWxXYWxsZXRNYXJnaW5JblVzZAgFDSR0MDM3Njg2Mzc4NjcCXzUEDWFjY291bnRIZWFsdGgJARBnZXRBY2NvdW50SGVhbHRoAgUbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkBRt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QEBm5ldEFweQkBCWdldE5ldEFweQMFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QEBGpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCDiJtYXJrZXRJbmRleCI6CQCkAwEFC21hcmtldEluZGV4AgssIm1hcmtldCI6IgUKbWFya2V0TmFtZQIBIgIOLCJhc3NldFByaWNlIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUFcHJpY2UCCiwic3VwcGx5IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFBnN1cHBseQIPLCJzdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFC3N1cHBseUluVXNkAg0sInN1cHBseUFweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUJc3VwcGx5QXB5BQZTY2FsZTgCCiwiYm9ycm93IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFBmJvcnJvdwIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFC2JvcnJvd0luVXNkAg0sImJvcnJvd0FweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUJYm9ycm93QXB5BQZTY2FsZTgCDCwicmVzZXJ2ZXMiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUIcmVzZXJ2ZXMCESwicmVzZXJ2ZXNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFDXJlc2VydmVzSW5Vc2QCFCwidXRpbGl6YXRpb25SYXRpbyI6CQEPYW1vdW50VG9EZWNpbWFsAgUCdXIFBlNjYWxlOAIULCJjb2xsYXRlcmFsRmFjdG9yIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQJjZgUGU2NhbGU4AhgsImxpcXVpZGF0aW9uVGhyZXNob2xkIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQJsdAUGU2NhbGU4AhYsImxpcXVpZGF0aW9uUGVuYWx0eSI6CQEPYW1vdW50VG9EZWNpbWFsAgUHcGVuYWx0eQUGU2NhbGU4Ag0sIm1heFN1cHBseSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFCW1heFN1cHBseQIQLCJ3YWxsZXRTdXBwbHkiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUMd2FsbGV0U3VwcGx5AhUsIndhbGxldFN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgURd2FsbGV0U3VwcGx5SW5Vc2QCFSwid2FsbGV0RGFpbHlJbmNvbWUiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgURd2FsbGV0RGFpbHlJbmNvbWUCGiwid2FsbGV0RGFpbHlJbmNvbWVJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFndhbGxldERhaWx5SW5jb21lSW5Vc2QCECwid2FsbGV0Qm9ycm93IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFDHdhbGxldEJvcnJvdwIVLCJ3YWxsZXRCb3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEXdhbGxldEJvcnJvd0luVXNkAhssIndhbGxldERhaWx5TG9hbkludGVyZXN0IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFF3dhbGxldERhaWx5TG9hblBlcmNlbnRzAiAsIndhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRx3YWxsZXREYWlseUxvYW5QZXJjZW50c0luVXNkAhEsImFjY291bnRIZWFsdGgiOgkBD2Ftb3VudFRvRGVjaW1hbAIFDWFjY291bnRIZWFsdGgFBlNjYWxlOAIKLCJuZXRBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFBm5ldEFweQUGU2NhbGU4AgF9AwUFZGVidWcJAAIBBQRqc29uBQRqc29uAADbd+xp", "height": 3860224, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Hx5hHx6PgdB3NDdD7WTnj3U8nC5xKL3omyQyeqgzz5Ju Next: DkZ1XNajGSG7wt8fVycpuUzDTDAY6qtMgUj36jfhaLEn Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 7 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Waves = "WAVES"
497497 }
498498
499499
500+func getWalletJson (marketStr,wallet,debug) = {
501+ let marketAddress = addressFromStringValue(marketStr)
502+ let marketIndex = getIntegerValue(("market_" + marketStr))
503+ let marketName = getStringValue(("market_name_" + marketStr))
504+ let marketsCount = getIntegerValue("markets")
505+ func marketsFold (accum,next) = if ((next >= marketsCount))
506+ then accum
507+ else {
508+ let currentMarketAddressStr = getStringValue(("market_" + toString(next)))
509+ let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr))
510+ let currentMarketAddress = addressFromStringValue(currentMarketAddressStr)
511+ let currentSetupTokens = getSetupTokens(currentMarketAddress)
512+ let currentAssetsCount = size(currentSetupTokens)
513+ let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr))
514+ let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
515+ let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",")
516+ let currentLastRateHeight = getLastRateHeight(currentMarketAddress)
517+ func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount))
518+ then accum
519+ else {
520+ let assetIdStr = currentSetupTokens[next]
521+ let cf = parseIntValue(setupCf[next])
522+ let lt = parseIntValue(setupLt[next])
523+ let price = getTokenPrice(assetIdStr)
524+ let assetScale = getAssetScale(assetIdStr)
525+ let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
526+ let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
527+ let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
528+ let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
529+ let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
530+ let rate = getRate(outdatedUr, assetIdStr)
531+ let interest = getInterest(rate)
532+ let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
533+ let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
534+ let supply = getActualAmount(outdatedTotalSupply, sRate)
535+ let borrow = getActualAmount(outdatedTotalBorrow, bRate)
536+ let ur = getActualUr(supply, borrow)
537+ let supplyApy = getSupplyApy(rate, ur)
538+ let borrowApy = getBorrowApy(rate)
539+ let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
540+ let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
541+ let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
542+ let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
543+ let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8)
544+ let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt)
545+ let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
546+ let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
547+ let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow)
548+ let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price)
549+ let walletMarginInUsd = (fraction(walletSupplyInUsd, supplyApy, Scale8) - fraction(walletBorrowInUsd, borrowApy, Scale8))
550+ $Tuple7((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd), (accum._5 + walletDailyIncomeInUsd), (accum._6 + walletDailyLoanInterestInUsd), (accum._7 + walletMarginInUsd))
551+ }
552+
553+ let $t02460624960 = {
554+ let $l = arr12
555+ let $s = size($l)
556+ let $acc0 = $Tuple7(0, 0, 0, 0, 0, 0, 0)
557+ func $f0_1 ($a,$i) = if (($i >= $s))
558+ then $a
559+ else marketAssetsFold($a, $l[$i])
560+
561+ func $f0_2 ($a,$i) = if (($i >= $s))
562+ then $a
563+ else throw("List size exceeds 12")
564+
565+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
566+ }
567+ let totalWalletSupplyInUsd = $t02460624960._1
568+ let totalWalletBorrowInUsd = $t02460624960._2
569+ let totalWalletBorrowLimitInUsd = $t02460624960._3
570+ let totalWalletBorrowUsageInUsd = $t02460624960._4
571+ let totalWalletDailyIncomeInUsd = $t02460624960._5
572+ let totalWalletDailyLoanInterestInUsd = $t02460624960._6
573+ let totalWalletMarginInUsd = $t02460624960._7
574+ let totalWalletBadDebtInUsd = if ((totalWalletSupplyInUsd > totalWalletBorrowInUsd))
575+ then (totalWalletBorrowInUsd - totalWalletSupplyInUsd)
576+ else 0
577+ let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
578+ let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
579+ let marketsJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, Scale8)) + "}")
580+ func walletAssetsFold (accum,next) = if ((next >= currentAssetsCount))
581+ then accum
582+ else {
583+ let assetIdStr = currentSetupTokens[next]
584+ let price = getTokenPrice(assetIdStr)
585+ let assetScale = getAssetScale(assetIdStr)
586+ let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
587+ let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
588+ let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
589+ let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
590+ let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
591+ let rate = getRate(outdatedUr, assetIdStr)
592+ let interest = getInterest(rate)
593+ let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
594+ let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
595+ let supply = getActualAmount(outdatedTotalSupply, sRate)
596+ let borrow = getActualAmount(outdatedTotalBorrow, bRate)
597+ let ur = getActualUr(supply, borrow)
598+ let supplyApy = getSupplyApy(rate, ur)
599+ let borrowApy = getBorrowApy(rate)
600+ let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
601+ let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
602+ let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
603+ let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
604+ let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
605+ let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
606+ let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow)
607+ let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price)
608+ let supplyAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletSupply)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(supplyApy, Scale8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + "}")
609+ let borrowAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(borrowApy, Scale8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyLoanInterest)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + "}")
610+ $Tuple2((accum._1 :+ supplyAssetsJson), (accum._2 :+ borrowAssetsJson))
611+ }
612+
613+ let $t02893229018 = {
614+ let $l = arr12
615+ let $s = size($l)
616+ let $acc0 = $Tuple2(nil, nil)
617+ func $f1_1 ($a,$i) = if (($i >= $s))
618+ then $a
619+ else walletAssetsFold($a, $l[$i])
620+
621+ func $f1_2 ($a,$i) = if (($i >= $s))
622+ then $a
623+ else throw("List size exceeds 12")
624+
625+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
626+ }
627+ let supplyAssetsJson = $t02893229018._1
628+ let borrowAssetsJson = $t02893229018._2
629+ if ((marketIndex == next))
630+ then $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), (accum._6 + totalWalletSupplyInUsd), (accum._7 + totalWalletBorrowInUsd), (accum._8 + totalWalletBadDebtInUsd), (accum._9 + totalWalletDailyIncomeInUsd), (accum._10 + totalWalletDailyLoanInterestInUsd), (accum._11 + accountHealth), (accum._12 + netApy), (accum._13 :+ marketsJson), (accum._14 :+ supplyAssetsJson), (accum._15 :+ borrowAssetsJson))
631+ else $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), accum._6, accum._7, accum._8, accum._9, accum._10, accum._11, accum._12, (accum._13 :+ marketsJson), accum._14, accum._15)
632+ }
633+
634+ let $t03030730851 = {
635+ let $l = arr12
636+ let $s = size($l)
637+ let $acc0 = $Tuple15(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil)
638+ func $f0_1 ($a,$i) = if (($i >= $s))
639+ then $a
640+ else marketsFold($a, $l[$i])
641+
642+ func $f0_2 ($a,$i) = if (($i >= $s))
643+ then $a
644+ else throw("List size exceeds 12")
645+
646+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
647+ }
648+ let totalWalletSupplyInUsd = $t03030730851._1
649+ let totalWalletBorrowInUsd = $t03030730851._2
650+ let totalWalletBadDebtInUsd = $t03030730851._3
651+ let totalWalletDailyIncomeInUsd = $t03030730851._4
652+ let totalWalletDailyLoanInterestInUsd = $t03030730851._5
653+ let walletSupplyInUsd = $t03030730851._6
654+ let walletBorrowInUsd = $t03030730851._7
655+ let walletBadDebtInUsd = $t03030730851._8
656+ let walletDailyIncomeInUsd = $t03030730851._9
657+ let walletDailyLoanInterestInUsd = $t03030730851._10
658+ let walletAccountHealth = $t03030730851._11
659+ let walletNetApy = $t03030730851._12
660+ let marketsJson = $t03030730851._13
661+ let supplyAssetsJson = $t03030730851._14
662+ let borrowAssetsJson = $t03030730851._15
663+ let json = ((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"market\":\"") + marketName) + "\"") + ",\"totalSupplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"totalBorrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"totalBadDebtInUsd\":") + assetToJson(usdtIdStr, totalWalletBadDebtInUsd)) + ",\"totalDailyIncomeInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyIncomeInUsd)) + ",\"totalDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyLoanInterestInUsd)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"badDebtInUsd\":") + assetToJson(usdtIdStr, walletBadDebtInUsd)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"dailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + ",\"accountHealth\":") + amountToDecimal(walletAccountHealth, Scale8)) + ",\"netApy\":") + amountToDecimal(walletNetApy, Scale8)) + ",\"supplyAssets\":[") + makeString_11C(supplyAssetsJson, ",")) + "]") + ",\"borrowAssets\":[") + makeString_11C(borrowAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
664+ if (debug)
665+ then throw(json)
666+ else json
667+ }
668+
669+
500670 func getWalletOperationsJson (marketStr,assetIdStr,wallet,debug) = {
501671 let marketAddress = addressFromStringValue(marketStr)
502672 let marketIndex = getIntegerValue(("market_" + marketStr))
573743 $Tuple5((accum._1 + currentWalletSupplyInUsd), (accum._2 + currentWalletBorrowInUsd), (accum._3 + currentWalletBorrowLimitInUsd), (accum._4 + currentWalletBorrowUsageInUsd), (accum._5 + walletMarginInUsd))
574744 }
575745
576- let $t02600226183 = {
746+ let $t03768637867 = {
577747 let $l = arr12
578748 let $s = size($l)
579749 let $acc0 = $Tuple5(0, 0, 0, 0, 0)
587757
588758 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
589759 }
590- let totalWalletSupplyInUsd = $t02600226183._1
591- let totalWalletBorrowInUsd = $t02600226183._2
592- let totalWalletBorrowLimitInUsd = $t02600226183._3
593- let totalWalletBorrowUsageInUsd = $t02600226183._4
594- let totalWalletMarginInUsd = $t02600226183._5
760+ let totalWalletSupplyInUsd = $t03768637867._1
761+ let totalWalletBorrowInUsd = $t03768637867._2
762+ let totalWalletBorrowLimitInUsd = $t03768637867._3
763+ let totalWalletBorrowUsageInUsd = $t03768637867._4
764+ let totalWalletMarginInUsd = $t03768637867._5
595765 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
596766 let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
597767 let json = (((((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"market\":\"") + marketName) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, Scale8)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, Scale8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(ur, Scale8)) + ",\"collateralFactor\":") + amountToDecimal(cf, Scale8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, Scale8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, Scale8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"walletDailyLoanInterest\":") + assetToJson(assetIdStr, walletDailyLoanPercents)) + ",\"walletDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanPercentsInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, Scale8)) + ",\"netApy\":") + amountToDecimal(netApy, Scale8)) + "}")
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 7 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Waves = "WAVES"
55
66 let Scale6 = 1000000
77
88 let Scale8 = 100000000
99
1010 let Scale8Big = toBigInt(100000000)
1111
1212 let Scale10 = 10000000000
1313
1414 let Scale16 = 10000000000000000
1515
1616 let Scale16Big = toBigInt(10000000000000000)
1717
1818 let dayBlocks = 1440
1919
2020 let yearBlocks = 525600
2121
2222 let yearBlocksBig = toBigInt(525600)
2323
2424 let reserveFund = 20
2525
2626 let arr12 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
2727
2828 let usdtIdStr = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"
2929
3030 let usdcIdStr = "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"
3131
3232 let oracleAddress = Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t')
3333
3434 let axlyAddress = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW')
3535
3636 let axlyLPs = ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", "Btw3G1j4wQgdp49PTxaFkNvn75dQtqGDM7ejQppHnWC1", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", "4CQ5CPGLXLbWBUs2JBjKUaRqF49CmKHkwzvPgSvQpAQV", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR"]
3737
3838 func getRateCurve (assetIdStr) = match assetIdStr {
3939 case _ =>
4040 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match0))
4141 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4242 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match0))
4343 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4444 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match0))
4545 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4646 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match0))
4747 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4848 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match0))
4949 then $Tuple4(2000000, 25000000, 80000000, 100000000)
5050 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match0))
5151 then $Tuple4(2000000, 40000000, 80000000, 150000000)
5252 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match0))
5353 then $Tuple4(0, 100000000, 80000000, 400000000)
5454 else if (("WAVES" == $match0))
5555 then $Tuple4(2000000, 30000000, 80000000, 90000000)
5656 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match0))
5757 then $Tuple4(0, 20000000, 80000000, 40000000)
5858 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match0))
5959 then $Tuple4(0, 20000000, 80000000, 100000000)
6060 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match0))
6161 then $Tuple4(0, 30000000, 80000000, 40000000)
6262 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match0))
6363 then $Tuple4(0, 25000000, 80000000, 40000000)
6464 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match0))
6565 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6666 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match0))
6767 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6868 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match0))
6969 then $Tuple4(2000000, 30000000, 80000000, 50000000)
7070 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match0))
7171 then $Tuple4(2000000, 40000000, 80000000, 100000000)
7272 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match0))
7373 then $Tuple4(2000000, 30000000, 80000000, 80000000)
7474 else if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match0))
7575 then $Tuple4(0, 50000000, 80000000, 200000000)
7676 else if (("3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" == $match0))
7777 then $Tuple4(0, 100000000, 80000000, 400000000)
7878 else $Tuple4(0, 20000000, 80000000, 80000000)
7979 }
8080
8181
8282 func sum (size,data) = {
8383 func fold (accum,next) = if ((next >= size))
8484 then accum
8585 else (accum + data[next])
8686
8787 let $l = arr12
8888 let $s = size($l)
8989 let $acc0 = 0
9090 func $f0_1 ($a,$i) = if (($i >= $s))
9191 then $a
9292 else fold($a, $l[$i])
9393
9494 func $f0_2 ($a,$i) = if (($i >= $s))
9595 then $a
9696 else throw("List size exceeds 12")
9797
9898 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
9999 }
100100
101101
102102 func getSetupTokens (marketAddress) = split(getStringValue(marketAddress, "setup_tokens"), ",")
103103
104104
105105 func getTokenPrice (assetIdStr) = if (if ((assetIdStr == usdtIdStr))
106106 then true
107107 else (assetIdStr == usdcIdStr))
108108 then 1000000
109109 else if (containsElement(axlyLPs, assetIdStr))
110110 then {
111111 let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil)
112112 if ($isInstanceOf(@, "Int"))
113113 then @
114114 else throw(($getType(@) + " couldn't be cast to Int"))
115115 }
116116 else {
117117 let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B"))
118118 price
119119 }
120120
121121
122122 func getAssetScale (assetIdStr) = {
123123 let decimals = if ((assetIdStr == "WAVES"))
124124 then 8
125125 else value(assetInfo(fromBase58String(assetIdStr))).decimals
126126 pow(10, 0, decimals, 0, 0, DOWN)
127127 }
128128
129129
130130 func getLastRateHeight (marketAddress) = valueOrElse(getInteger(marketAddress, "lastRateHeight"), 0)
131131
132132
133133 func getOutdatedTotalSupply (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_supplied_" + assetIdStr)), 0)
134134
135135
136136 func getOutdatedTotalBorrow (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_borrowed_" + assetIdStr)), 0)
137137
138138
139139 func getOutdatedSRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_sRate")), 0)
140140
141141
142142 func getOutdatedBRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_bRate")), 0)
143143
144144
145145 func getOutdatedUr (outdatedTotalSupply,outdatedTotalBorrow,outdatedSRate,outdatedBRate) = {
146146 let down = fraction(outdatedTotalSupply, outdatedSRate, Scale16)
147147 if ((down == 0))
148148 then 0
149149 else fraction(Scale8, fraction(outdatedTotalBorrow, outdatedBRate, Scale16), down)
150150 }
151151
152152
153153 func getRate (outdatedUr,assetIdStr) = {
154154 let curve = getRateCurve(assetIdStr)
155155 (curve._1 + (if ((curve._3 >= outdatedUr))
156156 then fraction(outdatedUr, curve._2, curve._3)
157157 else (curve._2 + fraction((outdatedUr - curve._3), curve._4, (100000000 - curve._3)))))
158158 }
159159
160160
161161 func getInterest (rate) = max([fraction(rate, Scale8, yearBlocks), 1])
162162
163163
164164 func getAssetIndex (setupTokens,assetIdStr) = value(indexOf(setupTokens, assetIdStr))
165165
166166
167167 func getAssetParamters (marketParameters,assetIndex) = $Tuple3(marketParameters._1[assetIndex], marketParameters._2[assetIndex], marketParameters._3[assetIndex])
168168
169169
170170 func getMarketParameters (marketAddress,setupTokens) = {
171171 let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
172172 let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
173173 let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
174174 let tokensSize = size(setupTokens)
175175 func fold (accum,next) = if ((next >= tokensSize))
176176 then accum
177177 else $Tuple3((accum._1 :+ parseIntValue(setupCf[next])), (accum._2 :+ parseIntValue(setupLt[next])), (accum._3 :+ parseIntValue(setupPenalty[next])))
178178
179179 let $l = arr12
180180 let $s = size($l)
181181 let $acc0 = $Tuple3(nil, nil, nil)
182182 func $f0_1 ($a,$i) = if (($i >= $s))
183183 then $a
184184 else fold($a, $l[$i])
185185
186186 func $f0_2 ($a,$i) = if (($i >= $s))
187187 then $a
188188 else throw("List size exceeds 12")
189189
190190 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
191191 }
192192
193193
194194 func getMaxSupply (marketAddress,assetIdStr) = parseIntValue(valueOrElse(getString(marketAddress, ("setup_maxSupply_" + assetIdStr)), "0"))
195195
196196
197197 func getActualSRate (lastRateHeight,interest,outdatedUr,outdatedSRate) = {
198198 let lastSRate = max([outdatedSRate, Scale16])
199199 let newSRate = (lastSRate + ((((height - lastRateHeight) * fraction(interest, outdatedUr, Scale8)) * (100 - reserveFund)) / 100))
200200 newSRate
201201 }
202202
203203
204204 func getActualBRate (lastRateHeight,interest,outdatedBRate) = {
205205 let lastBRate = max([outdatedBRate, Scale16])
206206 let newBRate = (lastBRate + ((height - lastRateHeight) * interest))
207207 newBRate
208208 }
209209
210210
211211 func getActualUr (actualSupply,actualBorrow) = fraction(actualBorrow, Scale8, actualSupply)
212212
213213
214214 func getActualAmount (outdatedAmount,actualRate) = fraction(outdatedAmount, actualRate, Scale16)
215215
216216
217217 func getInUsd (actualAmount,assetScale,price) = fraction(actualAmount, price, assetScale)
218218
219219
220220 func getSupplyApy (rate,actualUr) = {
221221 let supplyRate = fraction(fraction(rate, 80, 100), actualUr, Scale8)
222222 (toInt(pow((Scale16Big + fraction(toBigInt(supplyRate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8)
223223 }
224224
225225
226226 func getBorrowApy (rate) = (toInt(pow((Scale16Big + fraction(toBigInt(rate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8)
227227
228228
229229 func getWalletSupply (marketAddress,assetIdStr,wallet,actualSRate) = {
230230 let outdatedWalletSupply = valueOrElse(getInteger(marketAddress, ((wallet + "_supplied_") + assetIdStr)), 0)
231231 getActualAmount(outdatedWalletSupply, actualSRate)
232232 }
233233
234234
235235 func getWalletBorrow (marketAddress,assetIdStr,wallet,actualBRate) = {
236236 let outdatedWalletBorrow = valueOrElse(getInteger(marketAddress, ((wallet + "_borrowed_") + assetIdStr)), 0)
237237 getActualAmount(outdatedWalletBorrow, actualBRate)
238238 }
239239
240240
241241 func getDailyPercents (apy,quantity) = fraction(fraction((toInt(pow((Scale8Big + toBigInt(apy)), 8, (Scale16Big / yearBlocksBig), 16, 16, DOWN)) - Scale16), dayBlocks, Scale8), quantity, Scale8)
242242
243243
244244 func getAccountHealth (totalWalletBorrowLimitInUsd,totalWalletBorrowUsageInUsd) = if ((totalWalletBorrowLimitInUsd == 0))
245245 then Scale8
246246 else (Scale8 - fraction(totalWalletBorrowUsageInUsd, Scale8, totalWalletBorrowLimitInUsd))
247247
248248
249249 func getNetApy (totalWalletSupplyInUsd,totalWalletBorrowInUsd,totalWalletMarginInUsd) = if ((totalWalletMarginInUsd == 0))
250250 then 0
251251 else if ((totalWalletMarginInUsd > 0))
252252 then fraction(totalWalletMarginInUsd, Scale8, totalWalletSupplyInUsd)
253253 else fraction(totalWalletMarginInUsd, Scale8, totalWalletBorrowInUsd)
254254
255255
256256 func assetToJson (assetIdStr,quantity) = {
257257 let $t092269441 = if ((assetIdStr == Waves))
258258 then $Tuple2(8, "WAVES")
259259 else {
260260 let asset = value(assetInfo(fromBase58String(assetIdStr)))
261261 $Tuple2(asset.decimals, asset.name)
262262 }
263263 let decimals = $t092269441._1
264264 let name = $t092269441._2
265265 (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}")
266266 }
267267
268268
269269 func amountToDecimal (amount,assetScale) = {
270270 let intPart = (amount / assetScale)
271271 let floatPart = (amount % assetScale)
272272 ((toString(intPart) + ".") + toString(floatPart))
273273 }
274274
275275
276276 func getMarketJson (marketStr,wallet,debug) = {
277277 let marketAddress = addressFromStringValue(marketStr)
278278 let marketIndex = getIntegerValue(("market_" + marketStr))
279279 let marketName = getStringValue(("market_name_" + marketStr))
280280 let active = valueOrElse(getBoolean(marketAddress, "setup_active"), true)
281281 let setupTokens = getSetupTokens(marketAddress)
282282 let assetsCount = size(setupTokens)
283283 let lastRateHeight = getLastRateHeight(marketAddress)
284284 func assetsFold (accum,next) = if ((next >= assetsCount))
285285 then accum
286286 else {
287287 let assetIdStr = setupTokens[next]
288288 let price = getTokenPrice(assetIdStr)
289289 let assetScale = getAssetScale(assetIdStr)
290290 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
291291 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
292292 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
293293 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
294294 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
295295 let rate = getRate(outdatedUr, assetIdStr)
296296 let interest = getInterest(rate)
297297 let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
298298 let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
299299 let supply = getActualAmount(outdatedTotalSupply, sRate)
300300 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
301301 let supplyInUsd = getInUsd(supply, assetScale, price)
302302 let borrowInUsd = getInUsd(borrow, assetScale, price)
303303 let reserves = (supply - borrow)
304304 let reservesInUsd = getInUsd(reserves, assetScale, price)
305305 let ur = getActualUr(supply, borrow)
306306 let supplyApy = getSupplyApy(rate, ur)
307307 let borrowApy = getBorrowApy(rate)
308308 let marketAssetJson = ((((((((((((((((((((((((("{" + "\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, Scale8)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, Scale8)) + ",\"utilizationRatio\":") + amountToDecimal(ur, Scale8)) + ",\"sRate\":") + amountToDecimal(sRate, Scale16)) + ",\"bRate\":") + amountToDecimal(bRate, Scale16)) + "}")
309309 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
310310 }
311311
312312 let $t01270012808 = {
313313 let $l = arr12
314314 let $s = size($l)
315315 let $acc0 = $Tuple4(0, 0, 0, nil)
316316 func $f0_1 ($a,$i) = if (($i >= $s))
317317 then $a
318318 else assetsFold($a, $l[$i])
319319
320320 func $f0_2 ($a,$i) = if (($i >= $s))
321321 then $a
322322 else throw("List size exceeds 12")
323323
324324 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
325325 }
326326 let supplyInUsd = $t01270012808._1
327327 let borrowInUsd = $t01270012808._2
328328 let reservesInUsd = $t01270012808._3
329329 let marketAssetsJson = $t01270012808._4
330330 let marketsCount = getIntegerValue("markets")
331331 func marketsFold (accum,next) = if ((next >= marketsCount))
332332 then accum
333333 else {
334334 let currentMarketAddressStr = getStringValue(("market_" + toString(next)))
335335 let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr))
336336 let simpleJson = (((((((("{" + "\"name\":\"") + currentMarketName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, 0)) + ",\"accountHealth\":") + amountToDecimal(0, Scale8)) + "}")
337337 if ((wallet == ""))
338338 then (accum :+ simpleJson)
339339 else {
340340 let currentMarketAddress = addressFromStringValue(currentMarketAddressStr)
341341 let currentSetupTokens = getSetupTokens(currentMarketAddress)
342342 let currentAssetsCount = size(currentSetupTokens)
343343 let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr))
344344 let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
345345 let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",")
346346 let currentLastRateHeight = getLastRateHeight(currentMarketAddress)
347347 func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount))
348348 then accum
349349 else {
350350 let assetIdStr = currentSetupTokens[next]
351351 let cf = parseIntValue(setupCf[next])
352352 let lt = parseIntValue(setupLt[next])
353353 let price = getTokenPrice(assetIdStr)
354354 let assetScale = getAssetScale(assetIdStr)
355355 let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
356356 let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
357357 let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
358358 let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
359359 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
360360 let rate = getRate(outdatedUr, assetIdStr)
361361 let interest = getInterest(rate)
362362 let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
363363 let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
364364 let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
365365 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
366366 let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
367367 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
368368 let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8)
369369 let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt)
370370 $Tuple4((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd))
371371 }
372372
373373 let $t01589416054 = {
374374 let $l = arr12
375375 let $s = size($l)
376376 let $acc0 = $Tuple4(0, 0, 0, 0)
377377 func $f1_1 ($a,$i) = if (($i >= $s))
378378 then $a
379379 else marketAssetsFold($a, $l[$i])
380380
381381 func $f1_2 ($a,$i) = if (($i >= $s))
382382 then $a
383383 else throw("List size exceeds 12")
384384
385385 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
386386 }
387387 let totalWalletSupplyInUsd = $t01589416054._1
388388 let totalWalletBorrowInUsd = $t01589416054._2
389389 let totalWalletBorrowLimitInUsd = $t01589416054._3
390390 let totalWalletBorrowUsageInUsd = $t01589416054._4
391391 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
392392 let fullJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, Scale8)) + "}")
393393 (accum :+ fullJson)
394394 }
395395 }
396396
397397 let marketsJson = {
398398 let $l = arr12
399399 let $s = size($l)
400400 let $acc0 = nil
401401 func $f1_1 ($a,$i) = if (($i >= $s))
402402 then $a
403403 else marketsFold($a, $l[$i])
404404
405405 func $f1_2 ($a,$i) = if (($i >= $s))
406406 then $a
407407 else throw("List size exceeds 12")
408408
409409 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
410410 }
411411 let json = (((((((((((((((((((("{" + "\"index\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"active\":") + toString(active)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
412412 if (debug)
413413 then throw(json)
414414 else json
415415 }
416416
417417
418418 func getMenuJson (debug) = {
419419 let marketsCount = getIntegerValue("markets")
420420 func marketsFold (accum,next) = if ((next >= marketsCount))
421421 then accum
422422 else {
423423 let marketStr = getStringValue(("market_" + toString(next)))
424424 let marketAddress = addressFromStringValue(marketStr)
425425 let setupTokens = getSetupTokens(marketAddress)
426426 let assetsCount = size(setupTokens)
427427 let lastRateHeight = getLastRateHeight(marketAddress)
428428 func assetsFold (accum,next) = if ((next >= assetsCount))
429429 then accum
430430 else {
431431 let assetIdStr = setupTokens[next]
432432 let price = getTokenPrice(assetIdStr)
433433 let assetScale = getAssetScale(assetIdStr)
434434 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
435435 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
436436 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
437437 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
438438 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
439439 let rate = getRate(outdatedUr, assetIdStr)
440440 let interest = getInterest(rate)
441441 let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
442442 let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
443443 let supply = getActualAmount(outdatedTotalSupply, sRate)
444444 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
445445 let supplyInUsd = getInUsd(supply, assetScale, price)
446446 let borrowInUsd = getInUsd(borrow, assetScale, price)
447447 let reserves = (supply - borrow)
448448 let reservesInUsd = getInUsd(reserves, assetScale, price)
449449 let marketAssetJson = ((((((((("{" + "\"asset\":") + assetToJson(assetIdStr, 0)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"sRate\":") + amountToDecimal(sRate, Scale16)) + ",\"bRate\":") + amountToDecimal(bRate, Scale16)) + "}")
450450 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
451451 }
452452
453453 let $t01958919697 = {
454454 let $l = arr12
455455 let $s = size($l)
456456 let $acc0 = $Tuple4(0, 0, 0, nil)
457457 func $f0_1 ($a,$i) = if (($i >= $s))
458458 then $a
459459 else assetsFold($a, $l[$i])
460460
461461 func $f0_2 ($a,$i) = if (($i >= $s))
462462 then $a
463463 else throw("List size exceeds 12")
464464
465465 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
466466 }
467467 let supplyInUsd = $t01958919697._1
468468 let borrowInUsd = $t01958919697._2
469469 let reservesInUsd = $t01958919697._3
470470 let marketAssetsJson = $t01958919697._4
471471 let marketJson = ((((((("{" + "\"address\":\"") + marketStr) + "\"") + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + "}")
472472 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketJson))
473473 }
474474
475475 let $t02004520164 = {
476476 let $l = arr12
477477 let $s = size($l)
478478 let $acc0 = $Tuple4(0, 0, 0, nil)
479479 func $f0_1 ($a,$i) = if (($i >= $s))
480480 then $a
481481 else marketsFold($a, $l[$i])
482482
483483 func $f0_2 ($a,$i) = if (($i >= $s))
484484 then $a
485485 else throw("List size exceeds 12")
486486
487487 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
488488 }
489489 let totalSupplyInUsd = $t02004520164._1
490490 let totalBorrowInUsd = $t02004520164._2
491491 let totalReservesInUsd = $t02004520164._3
492492 let marketsJson = $t02004520164._4
493493 let json = (((((((((("{" + "\"supplyInUsd\":") + assetToJson(usdtIdStr, totalSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalBorrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, totalReservesInUsd)) + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
494494 if (debug)
495495 then throw(json)
496496 else json
497497 }
498498
499499
500+func getWalletJson (marketStr,wallet,debug) = {
501+ let marketAddress = addressFromStringValue(marketStr)
502+ let marketIndex = getIntegerValue(("market_" + marketStr))
503+ let marketName = getStringValue(("market_name_" + marketStr))
504+ let marketsCount = getIntegerValue("markets")
505+ func marketsFold (accum,next) = if ((next >= marketsCount))
506+ then accum
507+ else {
508+ let currentMarketAddressStr = getStringValue(("market_" + toString(next)))
509+ let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr))
510+ let currentMarketAddress = addressFromStringValue(currentMarketAddressStr)
511+ let currentSetupTokens = getSetupTokens(currentMarketAddress)
512+ let currentAssetsCount = size(currentSetupTokens)
513+ let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr))
514+ let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
515+ let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",")
516+ let currentLastRateHeight = getLastRateHeight(currentMarketAddress)
517+ func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount))
518+ then accum
519+ else {
520+ let assetIdStr = currentSetupTokens[next]
521+ let cf = parseIntValue(setupCf[next])
522+ let lt = parseIntValue(setupLt[next])
523+ let price = getTokenPrice(assetIdStr)
524+ let assetScale = getAssetScale(assetIdStr)
525+ let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
526+ let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
527+ let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
528+ let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
529+ let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
530+ let rate = getRate(outdatedUr, assetIdStr)
531+ let interest = getInterest(rate)
532+ let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
533+ let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
534+ let supply = getActualAmount(outdatedTotalSupply, sRate)
535+ let borrow = getActualAmount(outdatedTotalBorrow, bRate)
536+ let ur = getActualUr(supply, borrow)
537+ let supplyApy = getSupplyApy(rate, ur)
538+ let borrowApy = getBorrowApy(rate)
539+ let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
540+ let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
541+ let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
542+ let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
543+ let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8)
544+ let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt)
545+ let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
546+ let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
547+ let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow)
548+ let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price)
549+ let walletMarginInUsd = (fraction(walletSupplyInUsd, supplyApy, Scale8) - fraction(walletBorrowInUsd, borrowApy, Scale8))
550+ $Tuple7((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd), (accum._5 + walletDailyIncomeInUsd), (accum._6 + walletDailyLoanInterestInUsd), (accum._7 + walletMarginInUsd))
551+ }
552+
553+ let $t02460624960 = {
554+ let $l = arr12
555+ let $s = size($l)
556+ let $acc0 = $Tuple7(0, 0, 0, 0, 0, 0, 0)
557+ func $f0_1 ($a,$i) = if (($i >= $s))
558+ then $a
559+ else marketAssetsFold($a, $l[$i])
560+
561+ func $f0_2 ($a,$i) = if (($i >= $s))
562+ then $a
563+ else throw("List size exceeds 12")
564+
565+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
566+ }
567+ let totalWalletSupplyInUsd = $t02460624960._1
568+ let totalWalletBorrowInUsd = $t02460624960._2
569+ let totalWalletBorrowLimitInUsd = $t02460624960._3
570+ let totalWalletBorrowUsageInUsd = $t02460624960._4
571+ let totalWalletDailyIncomeInUsd = $t02460624960._5
572+ let totalWalletDailyLoanInterestInUsd = $t02460624960._6
573+ let totalWalletMarginInUsd = $t02460624960._7
574+ let totalWalletBadDebtInUsd = if ((totalWalletSupplyInUsd > totalWalletBorrowInUsd))
575+ then (totalWalletBorrowInUsd - totalWalletSupplyInUsd)
576+ else 0
577+ let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
578+ let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
579+ let marketsJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, Scale8)) + "}")
580+ func walletAssetsFold (accum,next) = if ((next >= currentAssetsCount))
581+ then accum
582+ else {
583+ let assetIdStr = currentSetupTokens[next]
584+ let price = getTokenPrice(assetIdStr)
585+ let assetScale = getAssetScale(assetIdStr)
586+ let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
587+ let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
588+ let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
589+ let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
590+ let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
591+ let rate = getRate(outdatedUr, assetIdStr)
592+ let interest = getInterest(rate)
593+ let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
594+ let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
595+ let supply = getActualAmount(outdatedTotalSupply, sRate)
596+ let borrow = getActualAmount(outdatedTotalBorrow, bRate)
597+ let ur = getActualUr(supply, borrow)
598+ let supplyApy = getSupplyApy(rate, ur)
599+ let borrowApy = getBorrowApy(rate)
600+ let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
601+ let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
602+ let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
603+ let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
604+ let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
605+ let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
606+ let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow)
607+ let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price)
608+ let supplyAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletSupply)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(supplyApy, Scale8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + "}")
609+ let borrowAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(borrowApy, Scale8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyLoanInterest)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + "}")
610+ $Tuple2((accum._1 :+ supplyAssetsJson), (accum._2 :+ borrowAssetsJson))
611+ }
612+
613+ let $t02893229018 = {
614+ let $l = arr12
615+ let $s = size($l)
616+ let $acc0 = $Tuple2(nil, nil)
617+ func $f1_1 ($a,$i) = if (($i >= $s))
618+ then $a
619+ else walletAssetsFold($a, $l[$i])
620+
621+ func $f1_2 ($a,$i) = if (($i >= $s))
622+ then $a
623+ else throw("List size exceeds 12")
624+
625+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
626+ }
627+ let supplyAssetsJson = $t02893229018._1
628+ let borrowAssetsJson = $t02893229018._2
629+ if ((marketIndex == next))
630+ then $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), (accum._6 + totalWalletSupplyInUsd), (accum._7 + totalWalletBorrowInUsd), (accum._8 + totalWalletBadDebtInUsd), (accum._9 + totalWalletDailyIncomeInUsd), (accum._10 + totalWalletDailyLoanInterestInUsd), (accum._11 + accountHealth), (accum._12 + netApy), (accum._13 :+ marketsJson), (accum._14 :+ supplyAssetsJson), (accum._15 :+ borrowAssetsJson))
631+ else $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), accum._6, accum._7, accum._8, accum._9, accum._10, accum._11, accum._12, (accum._13 :+ marketsJson), accum._14, accum._15)
632+ }
633+
634+ let $t03030730851 = {
635+ let $l = arr12
636+ let $s = size($l)
637+ let $acc0 = $Tuple15(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil)
638+ func $f0_1 ($a,$i) = if (($i >= $s))
639+ then $a
640+ else marketsFold($a, $l[$i])
641+
642+ func $f0_2 ($a,$i) = if (($i >= $s))
643+ then $a
644+ else throw("List size exceeds 12")
645+
646+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
647+ }
648+ let totalWalletSupplyInUsd = $t03030730851._1
649+ let totalWalletBorrowInUsd = $t03030730851._2
650+ let totalWalletBadDebtInUsd = $t03030730851._3
651+ let totalWalletDailyIncomeInUsd = $t03030730851._4
652+ let totalWalletDailyLoanInterestInUsd = $t03030730851._5
653+ let walletSupplyInUsd = $t03030730851._6
654+ let walletBorrowInUsd = $t03030730851._7
655+ let walletBadDebtInUsd = $t03030730851._8
656+ let walletDailyIncomeInUsd = $t03030730851._9
657+ let walletDailyLoanInterestInUsd = $t03030730851._10
658+ let walletAccountHealth = $t03030730851._11
659+ let walletNetApy = $t03030730851._12
660+ let marketsJson = $t03030730851._13
661+ let supplyAssetsJson = $t03030730851._14
662+ let borrowAssetsJson = $t03030730851._15
663+ let json = ((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"market\":\"") + marketName) + "\"") + ",\"totalSupplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"totalBorrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"totalBadDebtInUsd\":") + assetToJson(usdtIdStr, totalWalletBadDebtInUsd)) + ",\"totalDailyIncomeInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyIncomeInUsd)) + ",\"totalDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyLoanInterestInUsd)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"badDebtInUsd\":") + assetToJson(usdtIdStr, walletBadDebtInUsd)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"dailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + ",\"accountHealth\":") + amountToDecimal(walletAccountHealth, Scale8)) + ",\"netApy\":") + amountToDecimal(walletNetApy, Scale8)) + ",\"supplyAssets\":[") + makeString_11C(supplyAssetsJson, ",")) + "]") + ",\"borrowAssets\":[") + makeString_11C(borrowAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
664+ if (debug)
665+ then throw(json)
666+ else json
667+ }
668+
669+
500670 func getWalletOperationsJson (marketStr,assetIdStr,wallet,debug) = {
501671 let marketAddress = addressFromStringValue(marketStr)
502672 let marketIndex = getIntegerValue(("market_" + marketStr))
503673 let marketName = getStringValue(("market_name_" + marketStr))
504674 let active = valueOrElse(getBoolean(marketAddress, "setup_active"), true)
505675 let setupTokens = getSetupTokens(marketAddress)
506676 let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
507677 let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
508678 let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
509679 let assetIndex = getAssetIndex(setupTokens, assetIdStr)
510680 let cf = parseIntValue(setupCf[assetIndex])
511681 let lt = parseIntValue(setupLt[assetIndex])
512682 let penalty = parseIntValue(setupPenalty[assetIndex])
513683 let assetsCount = size(setupTokens)
514684 let lastRateHeight = getLastRateHeight(marketAddress)
515685 let price = getTokenPrice(assetIdStr)
516686 let assetScale = getAssetScale(assetIdStr)
517687 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
518688 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
519689 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
520690 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
521691 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
522692 let rate = getRate(outdatedUr, assetIdStr)
523693 let interest = getInterest(rate)
524694 let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
525695 let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
526696 let supply = getActualAmount(outdatedTotalSupply, sRate)
527697 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
528698 let supplyInUsd = getInUsd(supply, assetScale, price)
529699 let borrowInUsd = getInUsd(borrow, assetScale, price)
530700 let reserves = (supply - borrow)
531701 let reservesInUsd = getInUsd(reserves, assetScale, price)
532702 let ur = getActualUr(supply, borrow)
533703 let supplyApy = getSupplyApy(rate, ur)
534704 let borrowApy = getBorrowApy(rate)
535705 let maxSupply = getMaxSupply(marketAddress, assetIdStr)
536706 let walletSupply = getWalletSupply(marketAddress, assetIdStr, wallet, sRate)
537707 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
538708 let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
539709 let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
540710 let walletBorrow = getWalletBorrow(marketAddress, assetIdStr, wallet, bRate)
541711 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
542712 let walletDailyLoanPercents = getDailyPercents(borrowApy, walletBorrow)
543713 let walletDailyLoanPercentsInUsd = getInUsd(walletDailyLoanPercents, assetScale, price)
544714 func assetsFold (accum,next) = if ((next >= assetsCount))
545715 then accum
546716 else {
547717 let currentAssetIdStr = setupTokens[next]
548718 let currentCf = parseIntValue(setupCf[next])
549719 let currentLt = parseIntValue(setupLt[next])
550720 let currentPrice = getTokenPrice(currentAssetIdStr)
551721 let currentAssetScale = getAssetScale(currentAssetIdStr)
552722 let currentOutdatedTotalSupply = getOutdatedTotalSupply(marketAddress, currentAssetIdStr)
553723 let currentOutdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, currentAssetIdStr)
554724 let currentOutdatedSRate = getOutdatedSRate(marketAddress, currentAssetIdStr)
555725 let currentOutdatedBRate = getOutdatedBRate(marketAddress, currentAssetIdStr)
556726 let currentOutdatedUr = getOutdatedUr(currentOutdatedTotalSupply, currentOutdatedTotalBorrow, currentOutdatedSRate, currentOutdatedBRate)
557727 let currentRate = getRate(currentOutdatedUr, currentAssetIdStr)
558728 let currentInterest = getInterest(currentRate)
559729 let currentSRate = getActualSRate(lastRateHeight, currentInterest, currentOutdatedUr, currentOutdatedSRate)
560730 let currentBRate = getActualBRate(lastRateHeight, currentInterest, currentOutdatedBRate)
561731 let currentSupply = getActualAmount(currentOutdatedTotalSupply, sRate)
562732 let currentBorrow = getActualAmount(currentOutdatedTotalBorrow, bRate)
563733 let currentUr = getActualUr(currentSupply, currentBorrow)
564734 let currentSupplyApy = getSupplyApy(currentRate, currentUr)
565735 let currentBorrowApy = getBorrowApy(currentRate)
566736 let currentWalletSupply = getWalletSupply(marketAddress, currentAssetIdStr, wallet, currentSRate)
567737 let currentWalletSupplyInUsd = getInUsd(currentWalletSupply, currentAssetScale, currentPrice)
568738 let currentWalletBorrow = getWalletBorrow(marketAddress, currentAssetIdStr, wallet, currentBRate)
569739 let currentWalletBorrowInUsd = getInUsd(currentWalletBorrow, currentAssetScale, currentPrice)
570740 let currentWalletBorrowLimitInUsd = fraction(currentWalletSupplyInUsd, currentCf, Scale8)
571741 let currentWalletBorrowUsageInUsd = fraction(currentWalletBorrowInUsd, Scale8, currentLt)
572742 let walletMarginInUsd = (fraction(currentWalletSupplyInUsd, currentSupplyApy, Scale8) - fraction(currentWalletBorrowInUsd, currentBorrowApy, Scale8))
573743 $Tuple5((accum._1 + currentWalletSupplyInUsd), (accum._2 + currentWalletBorrowInUsd), (accum._3 + currentWalletBorrowLimitInUsd), (accum._4 + currentWalletBorrowUsageInUsd), (accum._5 + walletMarginInUsd))
574744 }
575745
576- let $t02600226183 = {
746+ let $t03768637867 = {
577747 let $l = arr12
578748 let $s = size($l)
579749 let $acc0 = $Tuple5(0, 0, 0, 0, 0)
580750 func $f0_1 ($a,$i) = if (($i >= $s))
581751 then $a
582752 else assetsFold($a, $l[$i])
583753
584754 func $f0_2 ($a,$i) = if (($i >= $s))
585755 then $a
586756 else throw("List size exceeds 12")
587757
588758 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
589759 }
590- let totalWalletSupplyInUsd = $t02600226183._1
591- let totalWalletBorrowInUsd = $t02600226183._2
592- let totalWalletBorrowLimitInUsd = $t02600226183._3
593- let totalWalletBorrowUsageInUsd = $t02600226183._4
594- let totalWalletMarginInUsd = $t02600226183._5
760+ let totalWalletSupplyInUsd = $t03768637867._1
761+ let totalWalletBorrowInUsd = $t03768637867._2
762+ let totalWalletBorrowLimitInUsd = $t03768637867._3
763+ let totalWalletBorrowUsageInUsd = $t03768637867._4
764+ let totalWalletMarginInUsd = $t03768637867._5
595765 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
596766 let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
597767 let json = (((((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"market\":\"") + marketName) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, Scale8)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, Scale8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(ur, Scale8)) + ",\"collateralFactor\":") + amountToDecimal(cf, Scale8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, Scale8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, Scale8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"walletDailyLoanInterest\":") + assetToJson(assetIdStr, walletDailyLoanPercents)) + ",\"walletDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanPercentsInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, Scale8)) + ",\"netApy\":") + amountToDecimal(netApy, Scale8)) + "}")
598768 if (debug)
599769 then throw(json)
600770 else json
601771 }
602772
603773
604774

github/deemru/w8io/3ef1775 
87.63 ms