tx · GJKZ9F3aAnjj3dzt71c98cwobkn3otifNnvpgci5NaKY

3N6ALE8YyAYnRk9f38mdWRTvW77rFkg5hN1:  -0.03200000 Waves

2024.02.09 14:32 [2968651] smart account 3N6ALE8YyAYnRk9f38mdWRTvW77rFkg5hN1 > SELF 0.00000000 Waves

{ "type": 13, "id": "GJKZ9F3aAnjj3dzt71c98cwobkn3otifNnvpgci5NaKY", "fee": 3200000, "feeAssetId": null, "timestamp": 1707478019233, "version": 2, "chainId": 84, "sender": "3N6ALE8YyAYnRk9f38mdWRTvW77rFkg5hN1", "senderPublicKey": "HMMF9zUpZPBGLAhpc1yDdcJNJychSarGHS79P2mGvq7J", "proofs": [ "5wvXECaKisH4aeMMtctydoWC3LcSXRZ6UMGCANSDcntJEoRh6zC9voGg359T7L4T76MhxWrpZfAb1MXWLKCHN9b9" ], "script": "base64:BgJTCAISBgoECAgICBIHCgUICAgICBIDCgEIEgMKAQESBgoECAEBARIECgIBARIDCgEIEgMKAQgSBAoCCAgSAwoBCBIDCgEIEgASABIDCgEIEgMKAQiDAQAJU0VQQVJBVE9SAgJfXwAFV0FWRVMCBVdBVkVTAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMACEtFWV9JTklUAgRJTklUAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX01BTkFHRVICB01BTkFHRVIAC0tFWV9SRUZFUkVSAgdSRUZFUkVSAAxLRVlfRVhFQ1VUT1ICCEVYRUNVVE9SAApLRVlfT1JBQ0xFAgZPUkFDTEUAE0tFWV9DQUxMRVJfQ09OVFJBQ1QCD0NBTExFUl9DT05UUkFDVAAJS0VZX1BSSUNFAgVQUklDRQAPS0VZX1VOSVRTX0FTU0VUAgtVTklUU19BU1NFVAARS0VZX1VTRVJfUE9TSVRJT04CDVVTRVJfUE9TSVRJT04AFEtFWV9VU0VSX1VTRF9CQUxBTkNFAhBVU0VSX1VTRF9CQUxBTkNFACdLRVlfVVNFUl9VTklUU19QRVJfVVNEX0JBTEFOQ0VfSU5URUdSQUwCI1VTRVJfVU5JVFNfUEVSX1VTRF9CQUxBTkNFX0lOVEVHUkFMAClLRVlfVVNFUl9VTklUU19QRVJfUkVGRVJBTF9TSEFSRV9JTlRFR1JBTAIlVVNFUl9VTklUU19QRVJfUkVGRVJBTF9TSEFSRV9JTlRFR1JBTAAWS0VZX1VTRVJfQ0hFQ0tQT0lOVF9BVAISVVNFUl9DSEVDS1BPSU5UX0FUACJLRVlfVVNFUl9VTklUU19CQUxBTkNFX0RJU1RSSUJVVEVEAh5VU0VSX1VOSVRTX0JBTEFOQ0VfRElTVFJJQlVURUQAHUtFWV9VU0VSX1VOSVRTX1NIQVJFU19SRUZFUkFMAhlVU0VSX1VOSVRTX1NIQVJFU19SRUZFUkFMABdLRVlfVVNFUl9TSEFSRVNfUkVGRVJBTAITVVNFUl9TSEFSRVNfUkVGRVJBTAAPS0VZX1NUQVJUX0JMT0NLAgtTVEFSVF9CTE9DSwAQS0VZX0ZJTklTSF9CTE9DSwIMRklOSVNIX0JMT0NLABZLRVlfVE9UQUxfVU5JVFNfRk9SX0xQAhJUT1RBTF9VTklUU19GT1JfTFAAG0tFWV9UT1RBTF9VTklUU19GT1JfUkVGRVJBTAIXVE9UQUxfVU5JVFNfRk9SX1JFRkVSQUwAFUtFWV9UT1RBTF9VU0RfQkFMQU5DRQIRVE9UQUxfVVNEX0JBTEFOQ0UAIktFWV9VTklUU19QRVJfVVNEX0JBTEFOQ0VfSU5URUdSQUwCHlVOSVRTX1BFUl9VU0RfQkFMQU5DRV9JTlRFR1JBTAARS0VZX0NIRUNLUE9JTlRfQVQCDUNIRUNLUE9JTlRfQVQAHUtFWV9VTklUU19CQUxBTkNFX0RJU1RSSUJVVEVEAhlVTklUU19CQUxBTkNFX0RJU1RSSUJVVEVEABFLRVlfVE9LRU5fQkFMQU5DRQINVE9LRU5fQkFMQU5DRQAPS0VZX1VTRVJTX0NPVU5UAgtVU0VSU19DT1VOVAAkS0VZX1VOSVRTX1BFUl9SRUZFUkFMX1NIQVJFX0lOVEVHUkFMAiBVTklUU19QRVJfUkVGRVJBTF9TSEFSRV9JTlRFR1JBTAAYS0VZX1VOSVRTX1NIQVJFU19SRUZFUkFMAhRVTklUU19TSEFSRVNfUkVGRVJBTAAYS0VZX1RPVEFMX1NIQVJFU19SRUZFUkFMAhRUT1RBTF9TSEFSRVNfUkVGRVJBTAATS0VZX1NXQVZFU19DT05UUkFDVAIPU1dBVkVTX0NPTlRSQUNUABBLRVlfU1dBVkVTX0FTU0VUAgVBU1NFVAAMRlVOQ19ERVBPU0lUAgdkZXBvc2l0AA1GVU5DX0dFVF9SQVRFAgdnZXRSYXRlAA1GVU5DX1dJVEhEUkFXAgh3aXRoZHJhdwAHTUFYX0lOVAD//////////38ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgKCUpY0dAAtaRVJPX0JJR0lOVAkAtgIBAAAACk9ORV9CSUdJTlQJALYCAQABABJTV0FWRVNfUkFURV9GQUNUT1IJALYCAQCAoJSljR0BEF92YWxpZGF0ZUFkZHJlc3MCCGFkZHJlc3NfBGVycl8EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQxfdmFsaWRhdGVJbnQEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwMDCQBmAgUObG93ZXJCb3VuZGFyeV8FBHZhbF8GCQBmAgUEdmFsXwUOdXBwZXJCb3VuZGFyeV8JAAIBBQRlcnJfBgEPX3ZhbGlkYXRlQmlnSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAvwICBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAL8CAgUEdmFsXwUOdXBwZXJCb3VuZGFyeV8JAAIBBQRlcnJfBgEVX3ZhbGlkYXRlUGF5bWVudHNTaXplAwlwYXltZW50c18HdGFyZ2V0XwRlcnJfAwkBAiE9AgkAkAMBBQlwYXltZW50c18FB3RhcmdldF8JAAIBBQRlcnJfBgEVX3ZhbGlkYXRlV2F2ZXNQYXltZW50AghwYXltZW50XwRlcnJfBAckbWF0Y2gwCAUIcGF5bWVudF8HYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwCQACAQUEZXJyXwMJAAECBQckbWF0Y2gwAgRVbml0BgkAAgECC01hdGNoIGVycm9yARFfdmFsaWRhdGVFcUJpZ0ludAMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GAQ5fdmFsaWRhdGVBc3NldAIGYXNzZXRfBGVycl8EByRtYXRjaDAJAOwHAQkA2QQBBQZhc3NldF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEJX2xvYWRJbml0AAQHJG1hdGNoMAkAoAgBBQhLRVlfSU5JVAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEJX3NhdmVJbml0AQdpc0luaXRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQhLRVlfSU5JVAUHaXNJbml0XwUDbmlsAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDV9sb2FkRXhlY3V0b3IABAckbWF0Y2gwCQCiCAEFDEtFWV9FWEVDVVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQ1fc2F2ZUV4ZWN1dG9yAQlleGVjdXRvcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX0VYRUNVVE9SCQClCAEFCWV4ZWN1dG9yXwUDbmlsAQtfbG9hZE9yYWNsZQAEByRtYXRjaDAJAKIIAQUKS0VZX09SQUNMRQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZU9yYWNsZQEHb3JhY2xlXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfT1JBQ0xFCQClCAEFB29yYWNsZV8FA25pbAETX2xvYWRDYWxsZXJDb250cmFjdAAEByRtYXRjaDAJAKIIAQUTS0VZX0NBTExFUl9DT05UUkFDVAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAETX3NhdmVDYWxsZXJDb250cmFjdAEHY2FsbGVyXwkAzAgCCQELU3RyaW5nRW50cnkCBRNLRVlfQ0FMTEVSX0NPTlRSQUNUBQdjYWxsZXJfBQNuaWwBEV9sb2FkVXNlclBvc2l0aW9uAgZ0b2tlbl8FdXNlcl8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFEUtFWV9VU0VSX1BPU0lUSU9OCQDMCAIFBnRva2VuXwkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJAL0JAgUBYQUJU0VQQVJBVE9SCQCUCgIJAKcDAQkAkQMCBQZzdHJ1Y3QAAAkApwMBCQCRAwIFBnN0cnVjdAABCQCUCgIFC1pFUk9fQklHSU5UBQtaRVJPX0JJR0lOVAERX3NhdmVVc2VyUG9zaXRpb24DBnRva2VuXwV1c2VyXwlwb3NpdGlvbl8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFEUtFWV9VU0VSX1BPU0lUSU9OCQDMCAIFBnRva2VuXwkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IJALsJAgkAzAgCCQCmAwEIBQlwb3NpdGlvbl8CXzEJAMwIAgkApgMBCAUJcG9zaXRpb25fAl8yBQNuaWwFCVNFUEFSQVRPUgUDbmlsARNfbG9hZFVzZXJVU0RCYWxhbmNlAQV1c2VyXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUUS0VZX1VTRVJfVVNEX0JBTEFOQ0UJAMwIAgUFdXNlcl8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAETX3NhdmVVc2VyVVNEQmFsYW5jZQIFdXNlcl8GdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRRLRVlfVVNFUl9VU0RfQkFMQU5DRQkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IJAKYDAQUGdmFsdWVfBQNuaWwBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBXVzZXJfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBRdLRVlfVVNFUl9TSEFSRVNfUkVGRVJBTAkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UARZfc2F2ZVVzZXJTaGFyZXNSZWZlcmFsAgV1c2VyXwZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFF0tFWV9VU0VSX1NIQVJFU19SRUZFUkFMCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEfX2xvYWRVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAAEByRtYXRjaDAJAKIIAQUiS0VZX1VOSVRTX1BFUl9VU0RfQkFMQU5DRV9JTlRFR1JBTAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBH19zYXZlVW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBSJLRVlfVU5JVFNfUEVSX1VTRF9CQUxBTkNFX0lOVEVHUkFMCQCmAwEFBnZhbHVlXwUDbmlsASNfbG9hZFVzZXJVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAEFdXNlcl8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFJ0tFWV9VU0VSX1VOSVRTX1BFUl9VU0RfQkFMQU5DRV9JTlRFR1JBTAkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UASNfc2F2ZVVzZXJVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAIFdXNlcl8GdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBSdLRVlfVVNFUl9VTklUU19QRVJfVVNEX0JBTEFOQ0VfSU5URUdSQUwJAMwIAgUFdXNlcl8FA25pbAUJU0VQQVJBVE9SCQCmAwEFBnZhbHVlXwUDbmlsARFfbG9hZENoZWNrcG9pbnRBdAAEByRtYXRjaDAJAKIIAQURS0VZX0NIRUNLUE9JTlRfQVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UARFfc2F2ZUNoZWNrcG9pbnRBdAEGdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIFEUtFWV9DSEVDS1BPSU5UX0FUCQCmAwEFBnZhbHVlXwUDbmlsARVfbG9hZFVzZXJDaGVja3BvaW50QXQBBXVzZXJfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBRZLRVlfVVNFUl9DSEVDS1BPSU5UX0FUCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBFV9zYXZlVXNlckNoZWNrcG9pbnRBdAIFdXNlcl8GdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRZLRVlfVVNFUl9DSEVDS1BPSU5UX0FUCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEPX2xvYWRVbml0c0Fzc2V0AAQHJG1hdGNoMAkAoggBBQ9LRVlfVU5JVFNfQVNTRVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQDZBAEFAWEBAAEPX3NhdmVVbml0c0Fzc2V0AQZhc3NldF8JAMwIAgkBC1N0cmluZ0VudHJ5AgUPS0VZX1VOSVRTX0FTU0VUCQDYBAEFBmFzc2V0XwUDbmlsAQ9fbG9hZFN0YXJ0QmxvY2sABAckbWF0Y2gwCQCiCAEFD0tFWV9TVEFSVF9CTE9DSwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBD19zYXZlU3RhcnRCbG9jawEGdmFsdWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIFD0tFWV9TVEFSVF9CTE9DSwkApgMBBQZ2YWx1ZV8FA25pbAEQX2xvYWRGaW5pc2hCbG9jawAEByRtYXRjaDAJAKIIAQUQS0VZX0ZJTklTSF9CTE9DSwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBEF9zYXZlRmluaXNoQmxvY2sBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRBLRVlfRklOSVNIX0JMT0NLCQCmAwEFBnZhbHVlXwUDbmlsARxfbG9hZFVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAAQHJG1hdGNoMAkAoggBBR1LRVlfVU5JVFNfQkFMQU5DRV9ESVNUUklCVVRFRAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBHF9zYXZlVW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBR1LRVlfVU5JVFNfQkFMQU5DRV9ESVNUUklCVVRFRAkApgMBBQZ2YWx1ZV8FA25pbAEgX2xvYWRVc2VyVW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQBBXVzZXJfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBSJLRVlfVVNFUl9VTklUU19CQUxBTkNFX0RJU1RSSUJVVEVECQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBIF9zYXZlVXNlclVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAgV1c2VyXwZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFIktFWV9VU0VSX1VOSVRTX0JBTEFOQ0VfRElTVFJJQlVURUQJAMwIAgUFdXNlcl8FA25pbAUJU0VQQVJBVE9SCQCmAwEFBnZhbHVlXwUDbmlsARRfbG9hZFRvdGFsVVNEQmFsYW5jZQAEByRtYXRjaDAJAKIIAQUVS0VZX1RPVEFMX1VTRF9CQUxBTkNFAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEUX3NhdmVUb3RhbFVTREJhbGFuY2UBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRVLRVlfVE9UQUxfVVNEX0JBTEFOQ0UJAKYDAQUGdmFsdWVfBQNuaWwBE19sb2FkU1dhdmVzQ29udHJhY3QABAckbWF0Y2gwCQCiCAEFE0tFWV9TV0FWRVNfQ09OVFJBQ1QDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAETX3NhdmVTV2F2ZXNDb250cmFjdAEJY29udHJhY3RfCQDMCAIJAQtTdHJpbmdFbnRyeQIFE0tFWV9TV0FWRVNfQ09OVFJBQ1QJAKUIAQUJY29udHJhY3RfBQNuaWwBEF9sb2FkU1dhdmVzQXNzZXQBCWNvbnRyYWN0XwQHJG1hdGNoMAkAnQgCBQljb250cmFjdF8FEEtFWV9TV0FWRVNfQVNTRVQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQDZBAEFAWEJAAIBAhhfbG9hZFNXYXZlc0Fzc2V0OiByZXZlcnQBEV9sb2FkVG9rZW5CYWxhbmNlAQZ0b2tlbl8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFEUtFWV9UT0tFTl9CQUxBTkNFCQDMCAIFBnRva2VuXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UARFfc2F2ZVRva2VuQmFsYW5jZQIGdG9rZW5fBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgURS0VZX1RPS0VOX0JBTEFOQ0UJAMwIAgUGdG9rZW5fBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEPX2xvYWRVc2Vyc0NvdW50AAQHJG1hdGNoMAkAoggBBQ9LRVlfVVNFUlNfQ09VTlQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UAQ9fc2F2ZVVzZXJzQ291bnQBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBQ9LRVlfVVNFUlNfQ09VTlQJAKYDAQUGdmFsdWVfBQNuaWwBIV9sb2FkVW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAAEByRtYXRjaDAJAKIIAQUkS0VZX1VOSVRTX1BFUl9SRUZFUkFMX1NIQVJFX0lOVEVHUkFMAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEhX3NhdmVVbml0c1BlclJlZmVyYWxTaGFyZUludGVncmFsAQZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgUkS0VZX1VOSVRTX1BFUl9SRUZFUkFMX1NIQVJFX0lOVEVHUkFMCQCmAwEFBnZhbHVlXwUDbmlsARdfbG9hZFVuaXRzU2hhcmVzUmVmZXJhbAAEByRtYXRjaDAJAKIIAQUYS0VZX1VOSVRTX1NIQVJFU19SRUZFUkFMAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEXX3NhdmVVbml0c1NoYXJlc1JlZmVyYWwBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRhLRVlfVU5JVFNfU0hBUkVTX1JFRkVSQUwJAKYDAQUGdmFsdWVfBQNuaWwBFF9sb2FkVG90YWxVbml0c0ZvckxQAAQHJG1hdGNoMAkAoggBBRZLRVlfVE9UQUxfVU5JVFNfRk9SX0xQAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEUX3NhdmVUb3RhbFVuaXRzRm9yTFABBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRZLRVlfVE9UQUxfVU5JVFNfRk9SX0xQCQCmAwEFBnZhbHVlXwUDbmlsARlfbG9hZFRvdGFsVW5pdHNGb3JSZWZlcmFsAAQHJG1hdGNoMAkAoggBBRtLRVlfVE9UQUxfVU5JVFNfRk9SX1JFRkVSQUwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UARlfc2F2ZVRvdGFsVW5pdHNGb3JSZWZlcmFsAQZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgUbS0VZX1RPVEFMX1VOSVRTX0ZPUl9SRUZFUkFMCQCmAwEFBnZhbHVlXwUDbmlsARdfbG9hZFRvdGFsU2hhcmVzUmVmZXJhbAAEByRtYXRjaDAJAKIIAQUYS0VZX1RPVEFMX1NIQVJFU19SRUZFUkFMAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEXX3NhdmVUb3RhbFNoYXJlc1JlZmVyYWwBBnZhbHVlXwkAzAgCCQELU3RyaW5nRW50cnkCBRhLRVlfVE9UQUxfU0hBUkVTX1JFRkVSQUwJAKYDAQUGdmFsdWVfBQNuaWwBJV9sb2FkVXNlclVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwBBXVzZXJfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBSlLRVlfVVNFUl9VTklUU19QRVJfUkVGRVJBTF9TSEFSRV9JTlRFR1JBTAkAzAgCBQV1c2VyXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEFC1pFUk9fQklHSU5UASVfc2F2ZVVzZXJVbml0c1BlclJlZmVyYWxTaGFyZUludGVncmFsAgV1c2VyXwZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFKUtFWV9VU0VSX1VOSVRTX1BFUl9SRUZFUkFMX1NIQVJFX0lOVEVHUkFMCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEbX2xvYWRVc2VyVW5pdHNTaGFyZXNSZWZlcmFsAQV1c2VyXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUdS0VZX1VTRVJfVU5JVFNfU0hBUkVTX1JFRkVSQUwJAMwIAgUFdXNlcl8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEbX3NhdmVVc2VyVW5pdHNTaGFyZXNSZWZlcmFsAgV1c2VyXwZ2YWx1ZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFHUtFWV9VU0VSX1VOSVRTX1NIQVJFU19SRUZFUkFMCQDMCAIFBXVzZXJfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQZ2YWx1ZV8FA25pbAEMX2xvYWRNYW5hZ2VyAAQHJG1hdGNoMAkAoggBBQtLRVlfTUFOQUdFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQxfc2F2ZU1hbmFnZXIBCG1hbmFnZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9NQU5BR0VSCQClCAEFCG1hbmFnZXJfBQNuaWwBDF9sb2FkUmVmZXJlcgEJY29kZWhhc2hfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQtLRVlfUkVGRVJFUgkAzAgCBQljb2RlaGFzaF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQkAAgECFF9sb2FkUmVmZXJlcjogcmV2ZXJ0AQxfc2F2ZVJlZmVyZXICCWNvZGVoYXNoXwhhZGRyZXNzXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgULS0VZX1JFRkVSRVIJAMwIAgUJY29kZWhhc2hfBQNuaWwFCVNFUEFSQVRPUgUIYWRkcmVzc18FA25pbAEWX2NoZWNrUmVmZXJlckV4aXN0ZW5jZQEJY29kZWhhc2hfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQtLRVlfUkVGRVJFUgkAzAgCBQljb2RlaGFzaF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAYHARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQAAwkBCV9sb2FkSW5pdAAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAMJAQEhAQkBCV9sb2FkSW5pdAAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBDF9vbmx5TWFuYWdlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQxfbG9hZE1hbmFnZXIACQACAQIUX29ubHlNYW5hZ2VyOiByZXZlcnQGARFfdmFsaWRhdGVFeGVjdXRvcgIEdmFsXwRlcnJfAwkBAiE9AgUEdmFsXwkBDV9sb2FkRXhlY3V0b3IACQACAQUEZXJyXwYBD192YWxpZGF0ZUNhbGxlcgIEdmFsXwRlcnJfAwkBAiE9AgUEdmFsXwkBE19sb2FkQ2FsbGVyQ29udHJhY3QACQACAQUEZXJyXwYBDV9nZXRUb2tlblJhdGUBBnRva2VuXwQHJG1hdGNoMAkAnQgCCQELX2xvYWRPcmFjbGUACQC5CQIJAMwIAgUJS0VZX1BSSUNFCQDMCAIFBnRva2VuXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQCnAwEFAWEJAAIBCQCsAgICIV9nZXRUb2tlblJhdGU6IG5vIHJhdGUgZm9yIHRva2VuPQUGdG9rZW5fAQtfY2hlY2twb2ludAAEHnByZXZVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAkBH19sb2FkVW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwABBBwcmV2Q2hlY2twb2ludEF0CQCYAwEJAMwIAgkBD19sb2FkU3RhcnRCbG9jawAJAMwIAgkBEV9sb2FkQ2hlY2twb2ludEF0AAUDbmlsBBtwcmV2VW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQJARxfbG9hZFVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAAQgcHJldlVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwJASFfbG9hZFVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwABBZwcmV2VW5pdHNTaGFyZXNSZWZlcmFsCQEXX2xvYWRVbml0c1NoYXJlc1JlZmVyYWwABAxjdXJyZW50QmxvY2sJAJkDAQkAzAgCCQC2AgEFBmhlaWdodAkAzAgCCQEQX2xvYWRGaW5pc2hCbG9jawAFA25pbAMJAMACAgUQcHJldkNoZWNrcG9pbnRBdAUMY3VycmVudEJsb2NrCQCVCgMFA25pbAUecHJldlVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsBSBwcmV2VW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAQYdW5pdHNCYWxhbmNlVG9EaXN0cmlidXRlCQC8AgMJALgCAgkBFF9sb2FkVG90YWxVbml0c0ZvckxQAAUbcHJldlVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkCQC4AgIFDGN1cnJlbnRCbG9jawUQcHJldkNoZWNrcG9pbnRBdAkAuAICCQEQX2xvYWRGaW5pc2hCbG9jawAFEHByZXZDaGVja3BvaW50QXQEGnVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsCQC3AgIJALoCAgkAuQICBQ5QRVJDRU5UX0ZBQ1RPUgUYdW5pdHNCYWxhbmNlVG9EaXN0cmlidXRlCQEUX2xvYWRUb3RhbFVTREJhbGFuY2UABR5wcmV2VW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwEDSR0MDE3NzQ4MTgzMDEDCQC/AgIJARdfbG9hZFRvdGFsU2hhcmVzUmVmZXJhbAAFC1pFUk9fQklHSU5UBBJ1bml0c1NoYXJlc1JlZmVyYWwJALwCAwkAuAICCQEZX2xvYWRUb3RhbFVuaXRzRm9yUmVmZXJhbAAFFnByZXZVbml0c1NoYXJlc1JlZmVyYWwJALgCAgUMY3VycmVudEJsb2NrBRBwcmV2Q2hlY2twb2ludEF0CQC4AgIJARBfbG9hZEZpbmlzaEJsb2NrAAUQcHJldkNoZWNrcG9pbnRBdAQcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAkAtwICCQC6AgIJALkCAgUOUEVSQ0VOVF9GQUNUT1IFEnVuaXRzU2hhcmVzUmVmZXJhbAkBF19sb2FkVG90YWxTaGFyZXNSZWZlcmFsAAUgcHJldlVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwJAJQKAgUSdW5pdHNTaGFyZXNSZWZlcmFsBRx1bml0c1BlclJlZmVyYWxTaGFyZUludGVncmFsCQCUCgIFC1pFUk9fQklHSU5UBQtaRVJPX0JJR0lOVAQSdW5pdHNTaGFyZXNSZWZlcmFsCAUNJHQwMTc3NDgxODMwMQJfMQQcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAgFDSR0MDE3NzQ4MTgzMDECXzIJAJUKAwkAzggCCQDOCAIJAM4IAgkAzggCCQERX3NhdmVDaGVja3BvaW50QXQBBQxjdXJyZW50QmxvY2sJAR9fc2F2ZVVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsAQUadW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwJARxfc2F2ZVVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAQkAtwICBRh1bml0c0JhbGFuY2VUb0Rpc3RyaWJ1dGUFG3ByZXZVbml0c0JhbGFuY2VEaXN0cmlidXRlZAkBIV9zYXZlVW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAEFHHVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwJARdfc2F2ZVVuaXRzU2hhcmVzUmVmZXJhbAEJALcCAgUSdW5pdHNTaGFyZXNSZWZlcmFsBRZwcmV2VW5pdHNTaGFyZXNSZWZlcmFsBRp1bml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAUcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAEPX3VzZXJDaGVja3BvaW50AwV1c2VyXw91c2VyVVNEQmFsYW5jZV8SdXNlclNoYXJlc1JlZmVyYWxfBA0kdDAxODg4NzE4OTk5CQELX2NoZWNrcG9pbnQABBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDE4ODg3MTg5OTkCXzEEGnVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsCAUNJHQwMTg4ODcxODk5OQJfMgQcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAgFDSR0MDE4ODg3MTg5OTkCXzMEInByZXZVc2VyVW5pdHNQZXJVU0RCYWxhbmNlSW50ZWdyYWwJASNfbG9hZFVzZXJVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAEFBXVzZXJfBBRwcmV2VXNlckNoZWNrcG9pbnRBdAkAmAMBCQDMCAIJAQ9fbG9hZFN0YXJ0QmxvY2sACQDMCAIJARVfbG9hZFVzZXJDaGVja3BvaW50QXQBBQV1c2VyXwUDbmlsBB9wcmV2VXNlclVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkCQEgX2xvYWRVc2VyVW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQBBQV1c2VyXwQkcHJldlVzZXJVbml0c1BlclJlZmVyYWxTaGFyZUludGVncmFsCQElX2xvYWRVc2VyVW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAEFBXVzZXJfBBpwcmV2VXNlclVuaXRzU2hhcmVzUmVmZXJhbAkBG19sb2FkVXNlclVuaXRzU2hhcmVzUmVmZXJhbAEFBXVzZXJfBAxjdXJyZW50QmxvY2sJAJkDAQkAzAgCCQC2AgEFBmhlaWdodAkAzAgCCQEQX2xvYWRGaW5pc2hCbG9jawAFA25pbAMJAMACAgUUcHJldlVzZXJDaGVja3BvaW50QXQFDGN1cnJlbnRCbG9jawkAlQoDBRFjaGVja3BvaW50QWN0aW9ucwUfcHJldlVzZXJVbml0c0JhbGFuY2VEaXN0cmlidXRlZAUacHJldlVzZXJVbml0c1NoYXJlc1JlZmVyYWwEG3VzZXJVbml0c0JhbGFuY2VEaXN0cmlidXRlZAkAtwICCQC6AgIJALkCAgUPdXNlclVTREJhbGFuY2VfCQC4AgIFGnVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsBSJwcmV2VXNlclVuaXRzUGVyVVNEQmFsYW5jZUludGVncmFsBQ5QRVJDRU5UX0ZBQ1RPUgUfcHJldlVzZXJVbml0c0JhbGFuY2VEaXN0cmlidXRlZAQWdXNlclVuaXRzU2hhcmVzUmVmZXJhbAkAtwICCQC6AgIJALkCAgUSdXNlclNoYXJlc1JlZmVyYWxfCQC4AgIFHHVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwFJHByZXZVc2VyVW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAUOUEVSQ0VOVF9GQUNUT1IFGnByZXZVc2VyVW5pdHNTaGFyZXNSZWZlcmFsCQCVCgMJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBFV9zYXZlVXNlckNoZWNrcG9pbnRBdAIFBXVzZXJfBQxjdXJyZW50QmxvY2sJASNfc2F2ZVVzZXJVbml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAIFBXVzZXJfBRp1bml0c1BlclVTREJhbGFuY2VJbnRlZ3JhbAkBIF9zYXZlVXNlclVuaXRzQmFsYW5jZURpc3RyaWJ1dGVkAgUFdXNlcl8FG3VzZXJVbml0c0JhbGFuY2VEaXN0cmlidXRlZAkBJV9zYXZlVXNlclVuaXRzUGVyUmVmZXJhbFNoYXJlSW50ZWdyYWwCBQV1c2VyXwUcdW5pdHNQZXJSZWZlcmFsU2hhcmVJbnRlZ3JhbAkBG19zYXZlVXNlclVuaXRzU2hhcmVzUmVmZXJhbAIFBXVzZXJfBRZ1c2VyVW5pdHNTaGFyZXNSZWZlcmFsBRt1c2VyVW5pdHNCYWxhbmNlRGlzdHJpYnV0ZWQFFnVzZXJVbml0c1NoYXJlc1JlZmVyYWwPAWkBBGluaXQECWV4ZWN1dG9yXwdvcmFjbGVfB3BhdXNlcl8Pc1dhdmVzQ29udHJhY3RfBANlcnIDAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBE193aGVuTm90SW5pdGlhbGl6ZWQABwkBEF93aGVuTXVsdGlzaWdTZXQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQlleGVjdXRvcl8CFmluaXQ6IGludmFsaWQgZXhlY3V0b3IHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB29yYWNsZV8CFGluaXQ6IGludmFsaWQgb3JhY2xlBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhRpbml0OiBpbnZhbGlkIHBhdXNlcgcJARBfdmFsaWRhdGVBZGRyZXNzAgUPc1dhdmVzQ29udHJhY3RfAhxpbml0OiBpbnZhbGlkIHNXYXZlc0NvbnRyYWN0BwMJAAACBQNlcnIFA2VycgkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAQlfc2F2ZUluaXQBBgkBDV9zYXZlRXhlY3V0b3IBCQERQGV4dHJOYXRpdmUoMTA2MikBBQlleGVjdXRvcl8JAQtfc2F2ZU9yYWNsZQEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB29yYWNsZV8JAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8JARNfc2F2ZVNXYXZlc0NvbnRyYWN0AQkBEUBleHRyTmF0aXZlKDEwNjIpAQUPc1dhdmVzQ29udHJhY3RfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2RlcG9zaXQFD2NhbGxlckNvbnRyYWN0XwdzZW5kZXJfBnRva2VuXwdhbW91bnRfCXJlZmVycmVyXwQGYW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUHYW1vdW50XwIaZGVwb3NpdDogYW1vdW50IGlzIG5vdCBJbnQEA2VycgMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARFfdmFsaWRhdGVFeGVjdXRvcgIIBQFpBmNhbGxlcgIZZGVwb3NpdDogaW52YWxpZCBleGVjdXRvcgcJAQ9fdmFsaWRhdGVDYWxsZXICBQ9jYWxsZXJDb250cmFjdF8CF2RlcG9zaXQ6IGludmFsaWQgY2FsbGVyBwkBDF92YWxpZGF0ZUludAQFBmFtb3VudAABBQdNQVhfSU5UAhdkZXBvc2l0OiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEBHJhdGUJAQ1fZ2V0VG9rZW5SYXRlAQUGdG9rZW5fBA0kdDAyMTkyNjIyMDA4CQERX2xvYWRVc2VyUG9zaXRpb24CBQZ0b2tlbl8FB3NlbmRlcl8EEHVzZXJUb2tlbkJhbGFuY2UIBQ0kdDAyMTkyNjIyMDA4Al8xBBV1c2VyVG9rZW5CYWxhbmNlSW5VU0QIBQ0kdDAyMTkyNjIyMDA4Al8yBA51c2VyVVNEQmFsYW5jZQkBE19sb2FkVXNlclVTREJhbGFuY2UBBQdzZW5kZXJfBBF1c2VyU2hhcmVzUmVmZXJhbAkBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBQdzZW5kZXJfBA0kdDAyMjEyNzIyMjU0CQEPX3VzZXJDaGVja3BvaW50AwUHc2VuZGVyXwUOdXNlclVTREJhbGFuY2UFEXVzZXJTaGFyZXNSZWZlcmFsBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDIyMTI3MjIyNTQCXzEEEHVzZXJVbml0c0JhbGFuY2UIBQ0kdDAyMjEyNzIyMjU0Al8yBBZ1c2VyVW5pdHNTaGFyZXNSZWZlcmFsCAUNJHQwMjIxMjcyMjI1NAJfMwQTbmV3VXNlclRva2VuQmFsYW5jZQkAtwICBRB1c2VyVG9rZW5CYWxhbmNlCQC2AgEFBmFtb3VudAQYbmV3VXNlclRva2VuQmFsYW5jZUluVVNECQC9AgQFE25ld1VzZXJUb2tlbkJhbGFuY2UFBHJhdGUFDlBFUkNFTlRfRkFDVE9SBQRET1dOBBFuZXdVc2VyVVNEQmFsYW5jZQkAtwICCQC4AgIFDnVzZXJVU0RCYWxhbmNlBRV1c2VyVG9rZW5CYWxhbmNlSW5VU0QFGG5ld1VzZXJUb2tlbkJhbGFuY2VJblVTRAQTdG90YWxCYWxhbmNlVXBkYXRlZAkAtwICCQC4AgIJARRfbG9hZFRvdGFsVVNEQmFsYW5jZQAFFXVzZXJUb2tlbkJhbGFuY2VJblVTRAUYbmV3VXNlclRva2VuQmFsYW5jZUluVVNEBAp1c2Vyc0NvdW50AwkAAAIFDnVzZXJVU0RCYWxhbmNlBQtaRVJPX0JJR0lOVAkAtwICCQEPX2xvYWRVc2Vyc0NvdW50AAUKT05FX0JJR0lOVAkBD19sb2FkVXNlcnNDb3VudAAEDnJlZmVyZXJBY3Rpb25zAwMJAGYCCQCxAgEFCXJlZmVycmVyXwAACQEWX2NoZWNrUmVmZXJlckV4aXN0ZW5jZQEFCXJlZmVycmVyXwcEDnJlZmVyZXJBZGRyZXNzCQEMX2xvYWRSZWZlcmVyAQUJcmVmZXJyZXJfBBJzaGFyZXNUb0Rpc3RyaWJ1dGUJAL0CBAkAtgIBBQZhbW91bnQFBHJhdGUFDlBFUkNFTlRfRkFDVE9SBQRET1dOBAxzaGFyZXNUb1VzZXIJAL0CBAUSc2hhcmVzVG9EaXN0cmlidXRlCQC2AgEAFAkAtgIBAGQFBERPV04ED3NoYXJlc1RvUmVmZXJlcgkAuAICBRJzaGFyZXNUb0Rpc3RyaWJ1dGUFDHNoYXJlc1RvVXNlcgQUbmV3VXNlclNoYXJlc1JlZmVyYWwJALcCAgURdXNlclNoYXJlc1JlZmVyYWwFDHNoYXJlc1RvVXNlcgQUcmVmZXJlclNoYXJlc1JlZmVyYWwJARZfbG9hZFVzZXJTaGFyZXNSZWZlcmFsAQUOcmVmZXJlckFkZHJlc3MEF25ld1JlZmVyZXJTaGFyZXNSZWZlcmFsCQC3AgIFFHJlZmVyZXJTaGFyZXNSZWZlcmFsBQ9zaGFyZXNUb1JlZmVyZXIEFW5ld1RvdGFsU2hhcmVzUmVmZXJhbAkAtwICCQEXX2xvYWRUb3RhbFNoYXJlc1JlZmVyYWwABRJzaGFyZXNUb0Rpc3RyaWJ1dGUEDSR0MDIzNTg3MjM3NTgJAQ9fdXNlckNoZWNrcG9pbnQDBQ5yZWZlcmVyQWRkcmVzcwkBE19sb2FkVXNlclVTREJhbGFuY2UBBQ5yZWZlcmVyQWRkcmVzcwUUcmVmZXJlclNoYXJlc1JlZmVyYWwEGHJlZmVyZXJDaGVja3BvaW50QWN0aW9ucwgFDSR0MDIzNTg3MjM3NTgCXzEEE3JlZmVyZXJVbml0c0JhbGFuY2UIBQ0kdDAyMzU4NzIzNzU4Al8yBBlyZWZlcmVyVW5pdHNTaGFyZXNSZWZlcmFsCAUNJHQwMjM1ODcyMzc1OAJfMwkAzggCCQDOCAIJAM4IAgUYcmVmZXJlckNoZWNrcG9pbnRBY3Rpb25zCQEWX3NhdmVVc2VyU2hhcmVzUmVmZXJhbAIFB3NlbmRlcl8FFG5ld1VzZXJTaGFyZXNSZWZlcmFsCQEWX3NhdmVVc2VyU2hhcmVzUmVmZXJhbAIFDnJlZmVyZXJBZGRyZXNzBRduZXdSZWZlcmVyU2hhcmVzUmVmZXJhbAkBF19zYXZlVG90YWxTaGFyZXNSZWZlcmFsAQUVbmV3VG90YWxTaGFyZXNSZWZlcmFsBQNuaWwJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgURY2hlY2twb2ludEFjdGlvbnMFDnJlZmVyZXJBY3Rpb25zCQEUX3NhdmVUb3RhbFVTREJhbGFuY2UBBRN0b3RhbEJhbGFuY2VVcGRhdGVkCQERX3NhdmVUb2tlbkJhbGFuY2UCBQZ0b2tlbl8JALcCAgkBEV9sb2FkVG9rZW5CYWxhbmNlAQUGdG9rZW5fCQC2AgEFBmFtb3VudAkBE19zYXZlVXNlclVTREJhbGFuY2UCBQdzZW5kZXJfBRFuZXdVc2VyVVNEQmFsYW5jZQkBD19zYXZlVXNlcnNDb3VudAEFCnVzZXJzQ291bnQJARFfc2F2ZVVzZXJQb3NpdGlvbgMFBnRva2VuXwUHc2VuZGVyXwkAlAoCBRNuZXdVc2VyVG9rZW5CYWxhbmNlBRhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QFEHVzZXJVbml0c0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMZGVwb3NpdFdhdmVzAQlyZWZlcnJlcl8EA2VycgMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARVfdmFsaWRhdGVQYXltZW50c1NpemUDCAUBaQhwYXltZW50cwABAhhkZXBvc2l0V2F2ZXM6IG5vIHBheW1lbnQHCQEVX3ZhbGlkYXRlV2F2ZXNQYXltZW50AgkAkQMCCAUBaQhwYXltZW50cwAAAhtkZXBvc2l0V2F2ZXM6IGludmFsaWQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAkAaQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AGQAAQUHTUFYX0lOVAIcZGVwb3NpdFdhdmVzOiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEBmFtb3VudAkAaQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AGQEBnNlbmRlcgkApQgBCAUBaQZjYWxsZXIEBXRva2VuBQVXQVZFUwQEcmF0ZQkBDV9nZXRUb2tlblJhdGUBBQV0b2tlbgQNJHQwMjY2MzMyNjcxMwkBEV9sb2FkVXNlclBvc2l0aW9uAgUFdG9rZW4FBnNlbmRlcgQQdXNlclRva2VuQmFsYW5jZQgFDSR0MDI2NjMzMjY3MTMCXzEEFXVzZXJUb2tlbkJhbGFuY2VJblVTRAgFDSR0MDI2NjMzMjY3MTMCXzIEDnVzZXJVU0RCYWxhbmNlCQETX2xvYWRVc2VyVVNEQmFsYW5jZQEFBnNlbmRlcgQRdXNlclNoYXJlc1JlZmVyYWwJARZfbG9hZFVzZXJTaGFyZXNSZWZlcmFsAQUGc2VuZGVyBA0kdDAyNjgzMDI2OTU2CQEPX3VzZXJDaGVja3BvaW50AwUGc2VuZGVyBQ51c2VyVVNEQmFsYW5jZQURdXNlclNoYXJlc1JlZmVyYWwEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwMjY4MzAyNjk1NgJfMQQQdXNlclVuaXRzQmFsYW5jZQgFDSR0MDI2ODMwMjY5NTYCXzIEFnVzZXJVbml0c1NoYXJlc1JlZmVyYWwIBQ0kdDAyNjgzMDI2OTU2Al8zBBNuZXdVc2VyVG9rZW5CYWxhbmNlCQC3AgIFEHVzZXJUb2tlbkJhbGFuY2UJALYCAQUGYW1vdW50BBhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QJAL0CBAUTbmV3VXNlclRva2VuQmFsYW5jZQUEcmF0ZQUOUEVSQ0VOVF9GQUNUT1IFBERPV04EEW5ld1VzZXJVU0RCYWxhbmNlCQC3AgIJALgCAgUOdXNlclVTREJhbGFuY2UFFXVzZXJUb2tlbkJhbGFuY2VJblVTRAUYbmV3VXNlclRva2VuQmFsYW5jZUluVVNEBBN0b3RhbEJhbGFuY2VVcGRhdGVkCQC3AgIJALgCAgkBFF9sb2FkVG90YWxVU0RCYWxhbmNlAAUVdXNlclRva2VuQmFsYW5jZUluVVNEBRhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QECnVzZXJzQ291bnQDCQAAAgUOdXNlclVTREJhbGFuY2UFC1pFUk9fQklHSU5UCQC3AgIJAQ9fbG9hZFVzZXJzQ291bnQABQpPTkVfQklHSU5UCQEPX2xvYWRVc2Vyc0NvdW50AAQOcmVmZXJlckFjdGlvbnMDAwkAZgIJALECAQUJcmVmZXJyZXJfAAAJARZfY2hlY2tSZWZlcmVyRXhpc3RlbmNlAQUJcmVmZXJyZXJfBwQOcmVmZXJlckFkZHJlc3MJAQxfbG9hZFJlZmVyZXIBBQlyZWZlcnJlcl8EEnNoYXJlc1RvRGlzdHJpYnV0ZQkAvQIECQC2AgEFBmFtb3VudAUEcmF0ZQUOUEVSQ0VOVF9GQUNUT1IFBERPV04EDHNoYXJlc1RvVXNlcgkAvQIEBRJzaGFyZXNUb0Rpc3RyaWJ1dGUJALYCAQAUCQC2AgEAZAUERE9XTgQPc2hhcmVzVG9SZWZlcmVyCQC4AgIFEnNoYXJlc1RvRGlzdHJpYnV0ZQUMc2hhcmVzVG9Vc2VyBBRuZXdVc2VyU2hhcmVzUmVmZXJhbAkAtwICBRF1c2VyU2hhcmVzUmVmZXJhbAUMc2hhcmVzVG9Vc2VyBBRyZWZlcmVyU2hhcmVzUmVmZXJhbAkBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBQ5yZWZlcmVyQWRkcmVzcwQXbmV3UmVmZXJlclNoYXJlc1JlZmVyYWwJALcCAgUUcmVmZXJlclNoYXJlc1JlZmVyYWwFD3NoYXJlc1RvUmVmZXJlcgQVbmV3VG90YWxTaGFyZXNSZWZlcmFsCQC3AgIJARdfbG9hZFRvdGFsU2hhcmVzUmVmZXJhbAAFEnNoYXJlc1RvRGlzdHJpYnV0ZQQNJHQwMjgyODkyODQ2MAkBD191c2VyQ2hlY2twb2ludAMFDnJlZmVyZXJBZGRyZXNzCQETX2xvYWRVc2VyVVNEQmFsYW5jZQEFDnJlZmVyZXJBZGRyZXNzBRRyZWZlcmVyU2hhcmVzUmVmZXJhbAQYcmVmZXJlckNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwMjgyODkyODQ2MAJfMQQTcmVmZXJlclVuaXRzQmFsYW5jZQgFDSR0MDI4Mjg5Mjg0NjACXzIEGXJlZmVyZXJVbml0c1NoYXJlc1JlZmVyYWwIBQ0kdDAyODI4OTI4NDYwAl8zCQDOCAIJAM4IAgkAzggCBRhyZWZlcmVyQ2hlY2twb2ludEFjdGlvbnMJARZfc2F2ZVVzZXJTaGFyZXNSZWZlcmFsAgUGc2VuZGVyBRRuZXdVc2VyU2hhcmVzUmVmZXJhbAkBFl9zYXZlVXNlclNoYXJlc1JlZmVyYWwCBQ5yZWZlcmVyQWRkcmVzcwUXbmV3UmVmZXJlclNoYXJlc1JlZmVyYWwJARdfc2F2ZVRvdGFsU2hhcmVzUmVmZXJhbAEFFW5ld1RvdGFsU2hhcmVzUmVmZXJhbAUDbmlsBAppbnZvY2F0aW9uCQD8BwQJARNfbG9hZFNXYXZlc0NvbnRyYWN0AAUMRlVOQ19ERVBPU0lUBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwUOcmVmZXJlckFjdGlvbnMJARRfc2F2ZVRvdGFsVVNEQmFsYW5jZQEFE3RvdGFsQmFsYW5jZVVwZGF0ZWQJARFfc2F2ZVRva2VuQmFsYW5jZQIFBVdBVkVTCQC3AgIJARFfbG9hZFRva2VuQmFsYW5jZQEFBVdBVkVTCQC2AgEFBmFtb3VudAkBE19zYXZlVXNlclVTREJhbGFuY2UCBQZzZW5kZXIFEW5ld1VzZXJVU0RCYWxhbmNlCQEPX3NhdmVVc2Vyc0NvdW50AQUKdXNlcnNDb3VudAkBEV9zYXZlVXNlclBvc2l0aW9uAwUFdG9rZW4FBnNlbmRlcgkAlAoCBRNuZXdVc2VyVG9rZW5CYWxhbmNlBRhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QFEHVzZXJVbml0c0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENd2l0aGRyYXdXYXZlcwEHYW1vdW50XwQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAkAaQIFB2Ftb3VudF8AZAABBQdNQVhfSU5UAh13aXRoZHJhd1dhdmVzOiBpbnZhbGlkIGFtb3VudAcDCQDAAgIJARBfbG9hZEZpbmlzaEJsb2NrAAkAtgIBBQZoZWlnaHQJAAIBAhp3aXRoZHJhd1dhdmVzOiBub3QgYWxsb3dlZAYHAwkAAAIFA2VycgUDZXJyBA5pbnRlcm5hbEFtb3VudAkAaQIFB2Ftb3VudF8AZAQGc2VuZGVyCQClCAEIBQFpBmNhbGxlcgQFdG9rZW4FBVdBVkVTBARyYXRlCQENX2dldFRva2VuUmF0ZQEFBXRva2VuBA0kdDAyOTcyODI5ODA4CQERX2xvYWRVc2VyUG9zaXRpb24CBQV0b2tlbgUGc2VuZGVyBBB1c2VyVG9rZW5CYWxhbmNlCAUNJHQwMjk3MjgyOTgwOAJfMQQVdXNlclRva2VuQmFsYW5jZUluVVNECAUNJHQwMjk3MjgyOTgwOAJfMgQOdXNlclVTREJhbGFuY2UJARNfbG9hZFVzZXJVU0RCYWxhbmNlAQUGc2VuZGVyBBF1c2VyU2hhcmVzUmVmZXJhbAkBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBQZzZW5kZXIEDSR0MDI5OTI1MzAwNTEJAQ9fdXNlckNoZWNrcG9pbnQDBQZzZW5kZXIFDnVzZXJVU0RCYWxhbmNlBRF1c2VyU2hhcmVzUmVmZXJhbAQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDAyOTkyNTMwMDUxAl8xBBB1c2VyVW5pdHNCYWxhbmNlCAUNJHQwMjk5MjUzMDA1MQJfMgQWdXNlclVuaXRzU2hhcmVzUmVmZXJhbAgFDSR0MDI5OTI1MzAwNTECXzMEE25ld1VzZXJUb2tlbkJhbGFuY2UJALgCAgUQdXNlclRva2VuQmFsYW5jZQkAtgIBBQ5pbnRlcm5hbEFtb3VudAQEZXJyMQkBDF92YWxpZGF0ZUludAQJAKADAQUTbmV3VXNlclRva2VuQmFsYW5jZQAABQdNQVhfSU5UAih3aXRoZHJhd1dhdmVzOiBpbnN1ZmZpY2llbnQgdG9rZW4gYW1vdW50AwkAAAIFBGVycjEFBGVycjEEGG5ld1VzZXJUb2tlbkJhbGFuY2VJblVTRAkAvQIEBRNuZXdVc2VyVG9rZW5CYWxhbmNlBQRyYXRlBQ5QRVJDRU5UX0ZBQ1RPUgUERE9XTgQRbmV3VXNlclVTREJhbGFuY2UJALcCAgkAuAICBQ51c2VyVVNEQmFsYW5jZQUVdXNlclRva2VuQmFsYW5jZUluVVNEBRhuZXdVc2VyVG9rZW5CYWxhbmNlSW5VU0QEE3RvdGFsQmFsYW5jZVVwZGF0ZWQJALcCAgkAuAICCQEUX2xvYWRUb3RhbFVTREJhbGFuY2UABRV1c2VyVG9rZW5CYWxhbmNlSW5VU0QFGG5ld1VzZXJUb2tlbkJhbGFuY2VJblVTRAQOc1dhdmVzQ29udHJhY3QJARNfbG9hZFNXYXZlc0NvbnRyYWN0AAQLc1dhdmVzQXNzZXQJARBfbG9hZFNXYXZlc0Fzc2V0AQUOc1dhdmVzQ29udHJhY3QECmludm9jYXRpb24JAPwHBAUOc1dhdmVzQ29udHJhY3QFDUZVTkNfR0VUX1JBVEUFA25pbAUDbmlsBApzd2F2ZXNSYXRlBAckbWF0Y2gwBQppbnZvY2F0aW9uAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhCQACAQImd2l0aGRyYXdXYXZlczogc1dhdmVzIGdldFJhdGUoKSByZXZlcnQEEHNXYXZlc1RvV2l0aGRyYXcJAKADAQkAvQIECQC2AgEFB2Ftb3VudF8FElNXQVZFU19SQVRFX0ZBQ1RPUgUKc3dhdmVzUmF0ZQUHQ0VJTElORwQLaW52b2NhdGlvbjEJAPwHBAUOc1dhdmVzQ29udHJhY3QFDUZVTkNfV0lUSERSQVcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULc1dhdmVzQXNzZXQFEHNXYXZlc1RvV2l0aGRyYXcFA25pbAMJAAACBQtpbnZvY2F0aW9uMQULaW52b2NhdGlvbjEJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdhbW91bnRfBQR1bml0BQNuaWwFEWNoZWNrcG9pbnRBY3Rpb25zCQEUX3NhdmVUb3RhbFVTREJhbGFuY2UBBRN0b3RhbEJhbGFuY2VVcGRhdGVkCQERX3NhdmVUb2tlbkJhbGFuY2UCBQVXQVZFUwkAuAICCQERX2xvYWRUb2tlbkJhbGFuY2UBBQVXQVZFUwkAtgIBBQ5pbnRlcm5hbEFtb3VudAkBE19zYXZlVXNlclVTREJhbGFuY2UCBQZzZW5kZXIFEW5ld1VzZXJVU0RCYWxhbmNlCQERX3NhdmVVc2VyUG9zaXRpb24DBQV0b2tlbgUGc2VuZGVyCQCUCgIFE25ld1VzZXJUb2tlbkJhbGFuY2UFGG5ld1VzZXJUb2tlbkJhbGFuY2VJblVTRAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5zdGFydFJldHJvZHJvcAQLdW5pdHNBc3NldF8MYW1vdW50Rm9yTFBfEWFtb3VudEZvclJlZmVyYWxfCWJsb2Nrc0F0XwQDZXJyAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwkBDl92YWxpZGF0ZUFzc2V0AgULdW5pdHNBc3NldF8CI3N0YXJ0UmV0cm9kcm9wOiBpbnZhbGlkIHVuaXRzIGFzc2V0BwkBDF92YWxpZGF0ZUludAQFDGFtb3VudEZvckxQXwAABQdNQVhfSU5UAiNzdGFydFJldHJvZHJvcDogaW52YWxpZCBhbW91bnRGb3JMUAcJAQxfdmFsaWRhdGVJbnQEBRFhbW91bnRGb3JSZWZlcmFsXwAABQdNQVhfSU5UAihzdGFydFJldHJvZHJvcDogaW52YWxpZCBhbW91bnRGb3JSZWZlcmFsBwkBDF92YWxpZGF0ZUludAQFCWJsb2Nrc0F0XwABBQdNQVhfSU5UAiBzdGFydFJldHJvZHJvcDogaW52YWxpZCBibG9ja3NBdAcJARFfdmFsaWRhdGVFcUJpZ0ludAMJAQ9fbG9hZFN0YXJ0QmxvY2sABQtaRVJPX0JJR0lOVAIfc3RhcnRSZXRyb2Ryb3A6IGFscmVhZHkgc3RhcnRlZAcDCQAAAgUDZXJyBQNlcnIEC3N0YXJ0SGVpZ2h0CQC2AgEFBmhlaWdodAQMZmluaXNoSGVpZ2h0CQC3AgIFC3N0YXJ0SGVpZ2h0CQC2AgEFCWJsb2Nrc0F0XwQEZXJyMQMJAGYCCQBkAgUMYW1vdW50Rm9yTFBfBRFhbW91bnRGb3JSZWZlcmFsXwkA8AcCBQR0aGlzCQDZBAEFC3VuaXRzQXNzZXRfCQACAQIic3RhcnRSZXRyb2Ryb3A6IGluc3VmZmljaWVudCBmdW5kcwYDCQAAAgUEZXJyMQUEZXJyMQkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAQ9fc2F2ZVVuaXRzQXNzZXQBCQDZBAEFC3VuaXRzQXNzZXRfCQEPX3NhdmVTdGFydEJsb2NrAQULc3RhcnRIZWlnaHQJARBfc2F2ZUZpbmlzaEJsb2NrAQUMZmluaXNoSGVpZ2h0CQEUX3NhdmVUb3RhbFVuaXRzRm9yTFABCQC2AgEFDGFtb3VudEZvckxQXwkBGV9zYXZlVG90YWxVbml0c0ZvclJlZmVyYWwBCQC2AgEFEWFtb3VudEZvclJlZmVyYWxfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2luY3JlYXNlVW5pdHNTdXBwbHkCDGFtb3VudEZvckxQXxFhbW91bnRGb3JSZWZlcmFsXwQDZXJyAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFDGFtb3VudEZvckxQXwAABQdNQVhfSU5UAihpbmNyZWFzZVVuaXRzU3VwcGx5OiBpbnZhbGlkIGFtb3VudEZvckxQBwkBDF92YWxpZGF0ZUludAQFEWFtb3VudEZvclJlZmVyYWxfAAAFB01BWF9JTlQCLWluY3JlYXNlVW5pdHNTdXBwbHk6IGludmFsaWQgYW1vdW50Rm9yUmVmZXJhbAcJAQ9fdmFsaWRhdGVCaWdJbnQECQC2AgEFBmhlaWdodAkAtwICCQEPX2xvYWRTdGFydEJsb2NrAAUKT05FX0JJR0lOVAkAuAICCQEQX2xvYWRGaW5pc2hCbG9jawAFCk9ORV9CSUdJTlQCJGluY3JlYXNlVW5pdHNTdXBwbHk6IGRyb3Agbm90IGFjdGl2ZQcDCQAAAgUDZXJyBQNlcnIEDm5ld0Ftb3VudEZvckxQCQC3AgIJARRfbG9hZFRvdGFsVW5pdHNGb3JMUAAJALYCAQUMYW1vdW50Rm9yTFBfBBNuZXdBbW91bnRGb3JSZWZlcmFsCQC3AgIJARlfbG9hZFRvdGFsVW5pdHNGb3JSZWZlcmFsAAkAtgIBBRFhbW91bnRGb3JSZWZlcmFsXwQEZXJyMQMJAL8CAgkAtwICBQ5uZXdBbW91bnRGb3JMUAUTbmV3QW1vdW50Rm9yUmVmZXJhbAkAtgIBCQDwBwIFBHRoaXMJAQ9fbG9hZFVuaXRzQXNzZXQACQACAQInaW5jcmVhc2VVbml0c1N1cHBseTogaW5zdWZmaWNpZW50IGZ1bmRzBgMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkBFF9zYXZlVG90YWxVbml0c0ZvckxQAQUObmV3QW1vdW50Rm9yTFAJARlfc2F2ZVRvdGFsVW5pdHNGb3JSZWZlcmFsAQUTbmV3QW1vdW50Rm9yUmVmZXJhbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjaGVja3BvaW50AQV1c2VyXwQNJHQwMzM4MjAzMzk1OQkBD191c2VyQ2hlY2twb2ludAMFBXVzZXJfCQETX2xvYWRVc2VyVVNEQmFsYW5jZQEFBXVzZXJfCQEWX2xvYWRVc2VyU2hhcmVzUmVmZXJhbAEFBXVzZXJfBAdhY3Rpb25zCAUNJHQwMzM4MjAzMzk1OQJfMQQQdXNlclVuaXRzQmFsYW5jZQgFDSR0MDMzODIwMzM5NTkCXzIEFnVzZXJVbml0c1NoYXJlc1JlZmVyYWwIBQ0kdDAzMzgyMDMzOTU5Al8zCQCUCgIFB2FjdGlvbnMJAJQKAgUQdXNlclVuaXRzQmFsYW5jZQUWdXNlclVuaXRzU2hhcmVzUmVmZXJhbAFpAQhnZXRVbml0cwEFdXNlcl8EDSR0MDM0MDcyMzQyMTEJAQ9fdXNlckNoZWNrcG9pbnQDBQV1c2VyXwkBE19sb2FkVXNlclVTREJhbGFuY2UBBQV1c2VyXwkBFl9sb2FkVXNlclNoYXJlc1JlZmVyYWwBBQV1c2VyXwQHYWN0aW9ucwgFDSR0MDM0MDcyMzQyMTECXzEEEHVzZXJVbml0c0JhbGFuY2UIBQ0kdDAzNDA3MjM0MjExAl8yBBZ1c2VyVW5pdHNTaGFyZXNSZWZlcmFsCAUNJHQwMzQwNzIzNDIxMQJfMwkAlAoCBQNuaWwJAJQKAgUQdXNlclVuaXRzQmFsYW5jZQUWdXNlclVuaXRzU2hhcmVzUmVmZXJhbAFpAQpzZXRSZWZlcmVyAgljb2RlaGFzaF8IYWRkcmVzc18EA2VycgMJAQxfb25seU1hbmFnZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDF9zYXZlUmVmZXJlcgIFCWNvZGVoYXNoXwUIYWRkcmVzc18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKc2V0TWFuYWdlcgEIbWFuYWdlcl8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUIbWFuYWdlcl8CG3NldE1hbmFnZXI6IGludmFsaWQgbWFuYWdlcgcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDF9zYXZlTWFuYWdlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG1hbmFnZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFHVwZGF0ZUNhbGxlckNvbnRyYWN0AQ9jYWxsZXJDb250cmFjdF8EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQETX3NhdmVDYWxsZXJDb250cmFjdAEFD2NhbGxlckNvbnRyYWN0XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVwYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5wYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQtfd2hlblBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQcFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMdXBkYXRlUGF1c2VyAQdwYXVzZXJfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CHHVwZGF0ZVBhdXNlcjogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2V0TXVsdGlzaWcBCW11bHRpc2lnXwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCW11bHRpc2lnXwIdc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ1fc2F2ZU11bHRpc2lnAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbXVsdGlzaWdfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwkAuQkCCQDMCAIFCktFWV9TVEFUVVMJAMwIAgkApQgBBQR0aGlzCQDMCAIJANgEAQgFAnR4AmlkBQNuaWwFCVNFUEFSQVRPUgcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXk6QwYV", "height": 2968651, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CgH4buDCd78U4f4CW2aVuTYT8RwtVwUhVKDNTGwy3BNy Next: none Diff:
OldNewDifferences
647647 else false)
648648 then _validateCaller(callerContract_, "deposit: invalid caller")
649649 else false)
650- then _validateInt(amount, 0, MAX_INT, "deposit: invalid amount")
650+ then _validateInt(amount, 1, MAX_INT, "deposit: invalid amount")
651651 else false
652652 if ((err == err))
653653 then {
703703 else false)
704704 then _validateWavesPayment(i.payments[0], "depositWaves: invalid asset")
705705 else false)
706- then _validateInt((i.payments[0].amount / 100), 0, MAX_INT, "depositWaves: invalid amount")
706+ then _validateInt((i.payments[0].amount / 100), 1, MAX_INT, "depositWaves: invalid amount")
707707 else false
708708 if ((err == err))
709709 then {
761761 let err = if (if (if (_whenInitialized())
762762 then _whenNotPaused()
763763 else false)
764- then _validateInt((amount_ / 100), 0, MAX_INT, "withdrawWaves: invalid amount")
764+ then _validateInt((amount_ / 100), 1, MAX_INT, "withdrawWaves: invalid amount")
765765 else false)
766766 then if ((_loadFinishBlock() >= toBigInt(height)))
767767 then throw("withdrawWaves: not allowed")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEPARATOR = "__"
55
66 let WAVES = "WAVES"
77
88 let KEY_MULTISIG = "MULTISIG"
99
1010 let KEY_STATUS = "STATUS"
1111
1212 let KEY_INIT = "INIT"
1313
1414 let KEY_PAUSED = "PAUSED"
1515
1616 let KEY_PAUSER = "PAUSER"
1717
1818 let KEY_MANAGER = "MANAGER"
1919
2020 let KEY_REFERER = "REFERER"
2121
2222 let KEY_EXECUTOR = "EXECUTOR"
2323
2424 let KEY_ORACLE = "ORACLE"
2525
2626 let KEY_CALLER_CONTRACT = "CALLER_CONTRACT"
2727
2828 let KEY_PRICE = "PRICE"
2929
3030 let KEY_UNITS_ASSET = "UNITS_ASSET"
3131
3232 let KEY_USER_POSITION = "USER_POSITION"
3333
3434 let KEY_USER_USD_BALANCE = "USER_USD_BALANCE"
3535
3636 let KEY_USER_UNITS_PER_USD_BALANCE_INTEGRAL = "USER_UNITS_PER_USD_BALANCE_INTEGRAL"
3737
3838 let KEY_USER_UNITS_PER_REFERAL_SHARE_INTEGRAL = "USER_UNITS_PER_REFERAL_SHARE_INTEGRAL"
3939
4040 let KEY_USER_CHECKPOINT_AT = "USER_CHECKPOINT_AT"
4141
4242 let KEY_USER_UNITS_BALANCE_DISTRIBUTED = "USER_UNITS_BALANCE_DISTRIBUTED"
4343
4444 let KEY_USER_UNITS_SHARES_REFERAL = "USER_UNITS_SHARES_REFERAL"
4545
4646 let KEY_USER_SHARES_REFERAL = "USER_SHARES_REFERAL"
4747
4848 let KEY_START_BLOCK = "START_BLOCK"
4949
5050 let KEY_FINISH_BLOCK = "FINISH_BLOCK"
5151
5252 let KEY_TOTAL_UNITS_FOR_LP = "TOTAL_UNITS_FOR_LP"
5353
5454 let KEY_TOTAL_UNITS_FOR_REFERAL = "TOTAL_UNITS_FOR_REFERAL"
5555
5656 let KEY_TOTAL_USD_BALANCE = "TOTAL_USD_BALANCE"
5757
5858 let KEY_UNITS_PER_USD_BALANCE_INTEGRAL = "UNITS_PER_USD_BALANCE_INTEGRAL"
5959
6060 let KEY_CHECKPOINT_AT = "CHECKPOINT_AT"
6161
6262 let KEY_UNITS_BALANCE_DISTRIBUTED = "UNITS_BALANCE_DISTRIBUTED"
6363
6464 let KEY_TOKEN_BALANCE = "TOKEN_BALANCE"
6565
6666 let KEY_USERS_COUNT = "USERS_COUNT"
6767
6868 let KEY_UNITS_PER_REFERAL_SHARE_INTEGRAL = "UNITS_PER_REFERAL_SHARE_INTEGRAL"
6969
7070 let KEY_UNITS_SHARES_REFERAL = "UNITS_SHARES_REFERAL"
7171
7272 let KEY_TOTAL_SHARES_REFERAL = "TOTAL_SHARES_REFERAL"
7373
7474 let KEY_SWAVES_CONTRACT = "SWAVES_CONTRACT"
7575
7676 let KEY_SWAVES_ASSET = "ASSET"
7777
7878 let FUNC_DEPOSIT = "deposit"
7979
8080 let FUNC_GET_RATE = "getRate"
8181
8282 let FUNC_WITHDRAW = "withdraw"
8383
8484 let MAX_INT = 9223372036854775807
8585
8686 let PERCENT_FACTOR = toBigInt(1000000000000)
8787
8888 let ZERO_BIGINT = toBigInt(0)
8989
9090 let ONE_BIGINT = toBigInt(1)
9191
9292 let SWAVES_RATE_FACTOR = toBigInt(1000000000000)
9393
9494 func _validateAddress (address_,err_) = match addressFromString(address_) {
9595 case a: Address =>
9696 true
9797 case _ =>
9898 throw(err_)
9999 }
100100
101101
102102 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
103103 then true
104104 else (val_ > upperBoundary_))
105105 then throw(err_)
106106 else true
107107
108108
109109 func _validateBigInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
110110 then true
111111 else (val_ > upperBoundary_))
112112 then throw(err_)
113113 else true
114114
115115
116116 func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
117117 then throw(err_)
118118 else true
119119
120120
121121 func _validateWavesPayment (payment_,err_) = match payment_.assetId {
122122 case a: ByteVector =>
123123 throw(err_)
124124 case _: Unit =>
125125 true
126126 case _ =>
127127 throw("Match error")
128128 }
129129
130130
131131 func _validateEqBigInt (val1_,val2_,err_) = if ((val1_ != val2_))
132132 then throw(err_)
133133 else true
134134
135135
136136 func _validateAsset (asset_,err_) = match assetInfo(fromBase58String(asset_)) {
137137 case a: Asset =>
138138 true
139139 case _ =>
140140 throw(err_)
141141 }
142142
143143
144144 func _loadInit () = match getBoolean(KEY_INIT) {
145145 case a: Boolean =>
146146 a
147147 case _ =>
148148 false
149149 }
150150
151151
152152 func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
153153
154154
155155 func _loadPause () = match getBoolean(KEY_PAUSED) {
156156 case a: Boolean =>
157157 a
158158 case _ =>
159159 false
160160 }
161161
162162
163163 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
164164
165165
166166 func _loadPauser () = match getString(KEY_PAUSER) {
167167 case a: String =>
168168 addressFromStringValue(a)
169169 case _ =>
170170 Address(base58'')
171171 }
172172
173173
174174 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
175175
176176
177177 func _loadMultisig () = match getString(KEY_MULTISIG) {
178178 case a: String =>
179179 addressFromStringValue(a)
180180 case _ =>
181181 Address(base58'')
182182 }
183183
184184
185185 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
186186
187187
188188 func _loadExecutor () = match getString(KEY_EXECUTOR) {
189189 case a: String =>
190190 addressFromStringValue(a)
191191 case _ =>
192192 Address(base58'')
193193 }
194194
195195
196196 func _saveExecutor (executor_) = [StringEntry(KEY_EXECUTOR, toString(executor_))]
197197
198198
199199 func _loadOracle () = match getString(KEY_ORACLE) {
200200 case a: String =>
201201 addressFromStringValue(a)
202202 case _ =>
203203 Address(base58'')
204204 }
205205
206206
207207 func _saveOracle (oracle_) = [StringEntry(KEY_ORACLE, toString(oracle_))]
208208
209209
210210 func _loadCallerContract () = match getString(KEY_CALLER_CONTRACT) {
211211 case a: String =>
212212 a
213213 case _ =>
214214 ""
215215 }
216216
217217
218218 func _saveCallerContract (caller_) = [StringEntry(KEY_CALLER_CONTRACT, caller_)]
219219
220220
221221 func _loadUserPosition (token_,user_) = match getString(makeString([KEY_USER_POSITION, token_, user_], SEPARATOR)) {
222222 case a: String =>
223223 let struct = split_51C(a, SEPARATOR)
224224 $Tuple2(parseBigIntValue(struct[0]), parseBigIntValue(struct[1]))
225225 case _ =>
226226 $Tuple2(ZERO_BIGINT, ZERO_BIGINT)
227227 }
228228
229229
230230 func _saveUserPosition (token_,user_,position_) = [StringEntry(makeString([KEY_USER_POSITION, token_, user_], SEPARATOR), makeString_11C([toString(position_._1), toString(position_._2)], SEPARATOR))]
231231
232232
233233 func _loadUserUSDBalance (user_) = match getString(makeString([KEY_USER_USD_BALANCE, user_], SEPARATOR)) {
234234 case a: String =>
235235 parseBigIntValue(a)
236236 case _ =>
237237 ZERO_BIGINT
238238 }
239239
240240
241241 func _saveUserUSDBalance (user_,value_) = [StringEntry(makeString([KEY_USER_USD_BALANCE, user_], SEPARATOR), toString(value_))]
242242
243243
244244 func _loadUserSharesReferal (user_) = match getString(makeString([KEY_USER_SHARES_REFERAL, user_], SEPARATOR)) {
245245 case a: String =>
246246 parseBigIntValue(a)
247247 case _ =>
248248 ZERO_BIGINT
249249 }
250250
251251
252252 func _saveUserSharesReferal (user_,value_) = [StringEntry(makeString([KEY_USER_SHARES_REFERAL, user_], SEPARATOR), toString(value_))]
253253
254254
255255 func _loadUnitsPerUSDBalanceIntegral () = match getString(KEY_UNITS_PER_USD_BALANCE_INTEGRAL) {
256256 case a: String =>
257257 parseBigIntValue(a)
258258 case _ =>
259259 ZERO_BIGINT
260260 }
261261
262262
263263 func _saveUnitsPerUSDBalanceIntegral (value_) = [StringEntry(KEY_UNITS_PER_USD_BALANCE_INTEGRAL, toString(value_))]
264264
265265
266266 func _loadUserUnitsPerUSDBalanceIntegral (user_) = match getString(makeString([KEY_USER_UNITS_PER_USD_BALANCE_INTEGRAL, user_], SEPARATOR)) {
267267 case a: String =>
268268 parseBigIntValue(a)
269269 case _ =>
270270 ZERO_BIGINT
271271 }
272272
273273
274274 func _saveUserUnitsPerUSDBalanceIntegral (user_,value_) = [StringEntry(makeString([KEY_USER_UNITS_PER_USD_BALANCE_INTEGRAL, user_], SEPARATOR), toString(value_))]
275275
276276
277277 func _loadCheckpointAt () = match getString(KEY_CHECKPOINT_AT) {
278278 case a: String =>
279279 parseBigIntValue(a)
280280 case _ =>
281281 ZERO_BIGINT
282282 }
283283
284284
285285 func _saveCheckpointAt (value_) = [StringEntry(KEY_CHECKPOINT_AT, toString(value_))]
286286
287287
288288 func _loadUserCheckpointAt (user_) = match getString(makeString([KEY_USER_CHECKPOINT_AT, user_], SEPARATOR)) {
289289 case a: String =>
290290 parseBigIntValue(a)
291291 case _ =>
292292 ZERO_BIGINT
293293 }
294294
295295
296296 func _saveUserCheckpointAt (user_,value_) = [StringEntry(makeString([KEY_USER_CHECKPOINT_AT, user_], SEPARATOR), toString(value_))]
297297
298298
299299 func _loadUnitsAsset () = match getString(KEY_UNITS_ASSET) {
300300 case a: String =>
301301 fromBase58String(a)
302302 case _ =>
303303 base58''
304304 }
305305
306306
307307 func _saveUnitsAsset (asset_) = [StringEntry(KEY_UNITS_ASSET, toBase58String(asset_))]
308308
309309
310310 func _loadStartBlock () = match getString(KEY_START_BLOCK) {
311311 case a: String =>
312312 parseBigIntValue(a)
313313 case _ =>
314314 ZERO_BIGINT
315315 }
316316
317317
318318 func _saveStartBlock (value_) = [StringEntry(KEY_START_BLOCK, toString(value_))]
319319
320320
321321 func _loadFinishBlock () = match getString(KEY_FINISH_BLOCK) {
322322 case a: String =>
323323 parseBigIntValue(a)
324324 case _ =>
325325 ZERO_BIGINT
326326 }
327327
328328
329329 func _saveFinishBlock (value_) = [StringEntry(KEY_FINISH_BLOCK, toString(value_))]
330330
331331
332332 func _loadUnitsBalanceDistributed () = match getString(KEY_UNITS_BALANCE_DISTRIBUTED) {
333333 case a: String =>
334334 parseBigIntValue(a)
335335 case _ =>
336336 ZERO_BIGINT
337337 }
338338
339339
340340 func _saveUnitsBalanceDistributed (value_) = [StringEntry(KEY_UNITS_BALANCE_DISTRIBUTED, toString(value_))]
341341
342342
343343 func _loadUserUnitsBalanceDistributed (user_) = match getString(makeString([KEY_USER_UNITS_BALANCE_DISTRIBUTED, user_], SEPARATOR)) {
344344 case a: String =>
345345 parseBigIntValue(a)
346346 case _ =>
347347 ZERO_BIGINT
348348 }
349349
350350
351351 func _saveUserUnitsBalanceDistributed (user_,value_) = [StringEntry(makeString([KEY_USER_UNITS_BALANCE_DISTRIBUTED, user_], SEPARATOR), toString(value_))]
352352
353353
354354 func _loadTotalUSDBalance () = match getString(KEY_TOTAL_USD_BALANCE) {
355355 case a: String =>
356356 parseBigIntValue(a)
357357 case _ =>
358358 ZERO_BIGINT
359359 }
360360
361361
362362 func _saveTotalUSDBalance (value_) = [StringEntry(KEY_TOTAL_USD_BALANCE, toString(value_))]
363363
364364
365365 func _loadSWavesContract () = match getString(KEY_SWAVES_CONTRACT) {
366366 case a: String =>
367367 addressFromStringValue(a)
368368 case _ =>
369369 Address(base58'')
370370 }
371371
372372
373373 func _saveSWavesContract (contract_) = [StringEntry(KEY_SWAVES_CONTRACT, toString(contract_))]
374374
375375
376376 func _loadSWavesAsset (contract_) = match getString(contract_, KEY_SWAVES_ASSET) {
377377 case a: String =>
378378 fromBase58String(a)
379379 case _ =>
380380 throw("_loadSWavesAsset: revert")
381381 }
382382
383383
384384 func _loadTokenBalance (token_) = match getString(makeString([KEY_TOKEN_BALANCE, token_], SEPARATOR)) {
385385 case a: String =>
386386 parseBigIntValue(a)
387387 case _ =>
388388 ZERO_BIGINT
389389 }
390390
391391
392392 func _saveTokenBalance (token_,value_) = [StringEntry(makeString([KEY_TOKEN_BALANCE, token_], SEPARATOR), toString(value_))]
393393
394394
395395 func _loadUsersCount () = match getString(KEY_USERS_COUNT) {
396396 case a: String =>
397397 parseBigIntValue(a)
398398 case _ =>
399399 ZERO_BIGINT
400400 }
401401
402402
403403 func _saveUsersCount (value_) = [StringEntry(KEY_USERS_COUNT, toString(value_))]
404404
405405
406406 func _loadUnitsPerReferalShareIntegral () = match getString(KEY_UNITS_PER_REFERAL_SHARE_INTEGRAL) {
407407 case a: String =>
408408 parseBigIntValue(a)
409409 case _ =>
410410 ZERO_BIGINT
411411 }
412412
413413
414414 func _saveUnitsPerReferalShareIntegral (value_) = [StringEntry(KEY_UNITS_PER_REFERAL_SHARE_INTEGRAL, toString(value_))]
415415
416416
417417 func _loadUnitsSharesReferal () = match getString(KEY_UNITS_SHARES_REFERAL) {
418418 case a: String =>
419419 parseBigIntValue(a)
420420 case _ =>
421421 ZERO_BIGINT
422422 }
423423
424424
425425 func _saveUnitsSharesReferal (value_) = [StringEntry(KEY_UNITS_SHARES_REFERAL, toString(value_))]
426426
427427
428428 func _loadTotalUnitsForLP () = match getString(KEY_TOTAL_UNITS_FOR_LP) {
429429 case a: String =>
430430 parseBigIntValue(a)
431431 case _ =>
432432 ZERO_BIGINT
433433 }
434434
435435
436436 func _saveTotalUnitsForLP (value_) = [StringEntry(KEY_TOTAL_UNITS_FOR_LP, toString(value_))]
437437
438438
439439 func _loadTotalUnitsForReferal () = match getString(KEY_TOTAL_UNITS_FOR_REFERAL) {
440440 case a: String =>
441441 parseBigIntValue(a)
442442 case _ =>
443443 ZERO_BIGINT
444444 }
445445
446446
447447 func _saveTotalUnitsForReferal (value_) = [StringEntry(KEY_TOTAL_UNITS_FOR_REFERAL, toString(value_))]
448448
449449
450450 func _loadTotalSharesReferal () = match getString(KEY_TOTAL_SHARES_REFERAL) {
451451 case a: String =>
452452 parseBigIntValue(a)
453453 case _ =>
454454 ZERO_BIGINT
455455 }
456456
457457
458458 func _saveTotalSharesReferal (value_) = [StringEntry(KEY_TOTAL_SHARES_REFERAL, toString(value_))]
459459
460460
461461 func _loadUserUnitsPerReferalShareIntegral (user_) = match getString(makeString([KEY_USER_UNITS_PER_REFERAL_SHARE_INTEGRAL, user_], SEPARATOR)) {
462462 case a: String =>
463463 parseBigIntValue(a)
464464 case _ =>
465465 ZERO_BIGINT
466466 }
467467
468468
469469 func _saveUserUnitsPerReferalShareIntegral (user_,value_) = [StringEntry(makeString([KEY_USER_UNITS_PER_REFERAL_SHARE_INTEGRAL, user_], SEPARATOR), toString(value_))]
470470
471471
472472 func _loadUserUnitsSharesReferal (user_) = match getString(makeString([KEY_USER_UNITS_SHARES_REFERAL, user_], SEPARATOR)) {
473473 case a: String =>
474474 parseBigIntValue(a)
475475 case _ =>
476476 ZERO_BIGINT
477477 }
478478
479479
480480 func _saveUserUnitsSharesReferal (user_,value_) = [StringEntry(makeString([KEY_USER_UNITS_SHARES_REFERAL, user_], SEPARATOR), toString(value_))]
481481
482482
483483 func _loadManager () = match getString(KEY_MANAGER) {
484484 case a: String =>
485485 addressFromStringValue(a)
486486 case _ =>
487487 Address(base58'')
488488 }
489489
490490
491491 func _saveManager (manager_) = [StringEntry(KEY_MANAGER, toString(manager_))]
492492
493493
494494 func _loadReferer (codehash_) = match getString(makeString([KEY_REFERER, codehash_], SEPARATOR)) {
495495 case a: String =>
496496 a
497497 case _ =>
498498 throw("_loadReferer: revert")
499499 }
500500
501501
502502 func _saveReferer (codehash_,address_) = [StringEntry(makeString([KEY_REFERER, codehash_], SEPARATOR), address_)]
503503
504504
505505 func _checkRefererExistence (codehash_) = match getString(makeString([KEY_REFERER, codehash_], SEPARATOR)) {
506506 case a: String =>
507507 true
508508 case _ =>
509509 false
510510 }
511511
512512
513513 func _onlyThisContract (caller_) = if ((caller_ != this))
514514 then throw("_onlyThisContract: revert")
515515 else true
516516
517517
518518 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
519519 then throw("_whenMultisigSet: revert")
520520 else true
521521
522522
523523 func _whenNotInitialized () = if (_loadInit())
524524 then throw("_whenNotInitialized: revert")
525525 else true
526526
527527
528528 func _whenInitialized () = if (!(_loadInit()))
529529 then throw("_whenInitialized: revert")
530530 else true
531531
532532
533533 func _whenNotPaused () = if (_loadPause())
534534 then throw("_whenNotPaused: revert")
535535 else true
536536
537537
538538 func _whenPaused () = if (!(_loadPause()))
539539 then throw("_whenPaused: revert")
540540 else true
541541
542542
543543 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
544544 then throw("_onlyPauser: revert")
545545 else true
546546
547547
548548 func _onlyManager (caller_) = if ((caller_ != _loadManager()))
549549 then throw("_onlyManager: revert")
550550 else true
551551
552552
553553 func _validateExecutor (val_,err_) = if ((val_ != _loadExecutor()))
554554 then throw(err_)
555555 else true
556556
557557
558558 func _validateCaller (val_,err_) = if ((val_ != _loadCallerContract()))
559559 then throw(err_)
560560 else true
561561
562562
563563 func _getTokenRate (token_) = match getString(_loadOracle(), makeString([KEY_PRICE, token_], SEPARATOR)) {
564564 case a: String =>
565565 parseBigIntValue(a)
566566 case _ =>
567567 throw(("_getTokenRate: no rate for token=" + token_))
568568 }
569569
570570
571571 func _checkpoint () = {
572572 let prevUnitsPerUSDBalanceIntegral = _loadUnitsPerUSDBalanceIntegral()
573573 let prevCheckpointAt = max([_loadStartBlock(), _loadCheckpointAt()])
574574 let prevUnitsBalanceDistributed = _loadUnitsBalanceDistributed()
575575 let prevUnitsPerReferalShareIntegral = _loadUnitsPerReferalShareIntegral()
576576 let prevUnitsSharesReferal = _loadUnitsSharesReferal()
577577 let currentBlock = min([toBigInt(height), _loadFinishBlock()])
578578 if ((prevCheckpointAt >= currentBlock))
579579 then $Tuple3(nil, prevUnitsPerUSDBalanceIntegral, prevUnitsPerReferalShareIntegral)
580580 else {
581581 let unitsBalanceToDistribute = fraction((_loadTotalUnitsForLP() - prevUnitsBalanceDistributed), (currentBlock - prevCheckpointAt), (_loadFinishBlock() - prevCheckpointAt))
582582 let unitsPerUSDBalanceIntegral = (((PERCENT_FACTOR * unitsBalanceToDistribute) / _loadTotalUSDBalance()) + prevUnitsPerUSDBalanceIntegral)
583583 let $t01774818301 = if ((_loadTotalSharesReferal() > ZERO_BIGINT))
584584 then {
585585 let unitsSharesReferal = fraction((_loadTotalUnitsForReferal() - prevUnitsSharesReferal), (currentBlock - prevCheckpointAt), (_loadFinishBlock() - prevCheckpointAt))
586586 let unitsPerReferalShareIntegral = (((PERCENT_FACTOR * unitsSharesReferal) / _loadTotalSharesReferal()) + prevUnitsPerReferalShareIntegral)
587587 $Tuple2(unitsSharesReferal, unitsPerReferalShareIntegral)
588588 }
589589 else $Tuple2(ZERO_BIGINT, ZERO_BIGINT)
590590 let unitsSharesReferal = $t01774818301._1
591591 let unitsPerReferalShareIntegral = $t01774818301._2
592592 $Tuple3(((((_saveCheckpointAt(currentBlock) ++ _saveUnitsPerUSDBalanceIntegral(unitsPerUSDBalanceIntegral)) ++ _saveUnitsBalanceDistributed((unitsBalanceToDistribute + prevUnitsBalanceDistributed))) ++ _saveUnitsPerReferalShareIntegral(unitsPerReferalShareIntegral)) ++ _saveUnitsSharesReferal((unitsSharesReferal + prevUnitsSharesReferal))), unitsPerUSDBalanceIntegral, unitsPerReferalShareIntegral)
593593 }
594594 }
595595
596596
597597 func _userCheckpoint (user_,userUSDBalance_,userSharesReferal_) = {
598598 let $t01888718999 = _checkpoint()
599599 let checkpointActions = $t01888718999._1
600600 let unitsPerUSDBalanceIntegral = $t01888718999._2
601601 let unitsPerReferalShareIntegral = $t01888718999._3
602602 let prevUserUnitsPerUSDBalanceIntegral = _loadUserUnitsPerUSDBalanceIntegral(user_)
603603 let prevUserCheckpointAt = max([_loadStartBlock(), _loadUserCheckpointAt(user_)])
604604 let prevUserUnitsBalanceDistributed = _loadUserUnitsBalanceDistributed(user_)
605605 let prevUserUnitsPerReferalShareIntegral = _loadUserUnitsPerReferalShareIntegral(user_)
606606 let prevUserUnitsSharesReferal = _loadUserUnitsSharesReferal(user_)
607607 let currentBlock = min([toBigInt(height), _loadFinishBlock()])
608608 if ((prevUserCheckpointAt >= currentBlock))
609609 then $Tuple3(checkpointActions, prevUserUnitsBalanceDistributed, prevUserUnitsSharesReferal)
610610 else {
611611 let userUnitsBalanceDistributed = (((userUSDBalance_ * (unitsPerUSDBalanceIntegral - prevUserUnitsPerUSDBalanceIntegral)) / PERCENT_FACTOR) + prevUserUnitsBalanceDistributed)
612612 let userUnitsSharesReferal = (((userSharesReferal_ * (unitsPerReferalShareIntegral - prevUserUnitsPerReferalShareIntegral)) / PERCENT_FACTOR) + prevUserUnitsSharesReferal)
613613 $Tuple3((((((checkpointActions ++ _saveUserCheckpointAt(user_, currentBlock)) ++ _saveUserUnitsPerUSDBalanceIntegral(user_, unitsPerUSDBalanceIntegral)) ++ _saveUserUnitsBalanceDistributed(user_, userUnitsBalanceDistributed)) ++ _saveUserUnitsPerReferalShareIntegral(user_, unitsPerReferalShareIntegral)) ++ _saveUserUnitsSharesReferal(user_, userUnitsSharesReferal)), userUnitsBalanceDistributed, userUnitsSharesReferal)
614614 }
615615 }
616616
617617
618618 @Callable(i)
619619 func init (executor_,oracle_,pauser_,sWavesContract_) = {
620620 let err = if (if (if (if (if (if (_onlyThisContract(i.caller))
621621 then _whenNotInitialized()
622622 else false)
623623 then _whenMultisigSet()
624624 else false)
625625 then _validateAddress(executor_, "init: invalid executor")
626626 else false)
627627 then _validateAddress(oracle_, "init: invalid oracle")
628628 else false)
629629 then _validateAddress(pauser_, "init: invalid pauser")
630630 else false)
631631 then _validateAddress(sWavesContract_, "init: invalid sWavesContract")
632632 else false
633633 if ((err == err))
634634 then $Tuple2(((((_saveInit(true) ++ _saveExecutor(addressFromStringValue(executor_))) ++ _saveOracle(addressFromStringValue(oracle_))) ++ _savePauser(addressFromStringValue(pauser_))) ++ _saveSWavesContract(addressFromStringValue(sWavesContract_))), unit)
635635 else throw("Strict value is not equal to itself.")
636636 }
637637
638638
639639
640640 @Callable(i)
641641 func deposit (callerContract_,sender_,token_,amount_,referrer_) = {
642642 let amount = valueOrErrorMessage(parseInt(amount_), "deposit: amount is not Int")
643643 let err = if (if (if (if (_whenInitialized())
644644 then _whenNotPaused()
645645 else false)
646646 then _validateExecutor(i.caller, "deposit: invalid executor")
647647 else false)
648648 then _validateCaller(callerContract_, "deposit: invalid caller")
649649 else false)
650- then _validateInt(amount, 0, MAX_INT, "deposit: invalid amount")
650+ then _validateInt(amount, 1, MAX_INT, "deposit: invalid amount")
651651 else false
652652 if ((err == err))
653653 then {
654654 let rate = _getTokenRate(token_)
655655 let $t02192622008 = _loadUserPosition(token_, sender_)
656656 let userTokenBalance = $t02192622008._1
657657 let userTokenBalanceInUSD = $t02192622008._2
658658 let userUSDBalance = _loadUserUSDBalance(sender_)
659659 let userSharesReferal = _loadUserSharesReferal(sender_)
660660 let $t02212722254 = _userCheckpoint(sender_, userUSDBalance, userSharesReferal)
661661 let checkpointActions = $t02212722254._1
662662 let userUnitsBalance = $t02212722254._2
663663 let userUnitsSharesReferal = $t02212722254._3
664664 let newUserTokenBalance = (userTokenBalance + toBigInt(amount))
665665 let newUserTokenBalanceInUSD = fraction(newUserTokenBalance, rate, PERCENT_FACTOR, DOWN)
666666 let newUserUSDBalance = ((userUSDBalance - userTokenBalanceInUSD) + newUserTokenBalanceInUSD)
667667 let totalBalanceUpdated = ((_loadTotalUSDBalance() - userTokenBalanceInUSD) + newUserTokenBalanceInUSD)
668668 let usersCount = if ((userUSDBalance == ZERO_BIGINT))
669669 then (_loadUsersCount() + ONE_BIGINT)
670670 else _loadUsersCount()
671671 let refererActions = if (if ((size(referrer_) > 0))
672672 then _checkRefererExistence(referrer_)
673673 else false)
674674 then {
675675 let refererAddress = _loadReferer(referrer_)
676676 let sharesToDistribute = fraction(toBigInt(amount), rate, PERCENT_FACTOR, DOWN)
677677 let sharesToUser = fraction(sharesToDistribute, toBigInt(20), toBigInt(100), DOWN)
678678 let sharesToReferer = (sharesToDistribute - sharesToUser)
679679 let newUserSharesReferal = (userSharesReferal + sharesToUser)
680680 let refererSharesReferal = _loadUserSharesReferal(refererAddress)
681681 let newRefererSharesReferal = (refererSharesReferal + sharesToReferer)
682682 let newTotalSharesReferal = (_loadTotalSharesReferal() + sharesToDistribute)
683683 let $t02358723758 = _userCheckpoint(refererAddress, _loadUserUSDBalance(refererAddress), refererSharesReferal)
684684 let refererCheckpointActions = $t02358723758._1
685685 let refererUnitsBalance = $t02358723758._2
686686 let refererUnitsSharesReferal = $t02358723758._3
687687 (((refererCheckpointActions ++ _saveUserSharesReferal(sender_, newUserSharesReferal)) ++ _saveUserSharesReferal(refererAddress, newRefererSharesReferal)) ++ _saveTotalSharesReferal(newTotalSharesReferal))
688688 }
689689 else nil
690690 $Tuple2(((((((checkpointActions ++ refererActions) ++ _saveTotalUSDBalance(totalBalanceUpdated)) ++ _saveTokenBalance(token_, (_loadTokenBalance(token_) + toBigInt(amount)))) ++ _saveUserUSDBalance(sender_, newUserUSDBalance)) ++ _saveUsersCount(usersCount)) ++ _saveUserPosition(token_, sender_, $Tuple2(newUserTokenBalance, newUserTokenBalanceInUSD))), userUnitsBalance)
691691 }
692692 else throw("Strict value is not equal to itself.")
693693 }
694694
695695
696696
697697 @Callable(i)
698698 func depositWaves (referrer_) = {
699699 let err = if (if (if (if (_whenInitialized())
700700 then _whenNotPaused()
701701 else false)
702702 then _validatePaymentsSize(i.payments, 1, "depositWaves: no payment")
703703 else false)
704704 then _validateWavesPayment(i.payments[0], "depositWaves: invalid asset")
705705 else false)
706- then _validateInt((i.payments[0].amount / 100), 0, MAX_INT, "depositWaves: invalid amount")
706+ then _validateInt((i.payments[0].amount / 100), 1, MAX_INT, "depositWaves: invalid amount")
707707 else false
708708 if ((err == err))
709709 then {
710710 let amount = (i.payments[0].amount / 100)
711711 let sender = toString(i.caller)
712712 let token = WAVES
713713 let rate = _getTokenRate(token)
714714 let $t02663326713 = _loadUserPosition(token, sender)
715715 let userTokenBalance = $t02663326713._1
716716 let userTokenBalanceInUSD = $t02663326713._2
717717 let userUSDBalance = _loadUserUSDBalance(sender)
718718 let userSharesReferal = _loadUserSharesReferal(sender)
719719 let $t02683026956 = _userCheckpoint(sender, userUSDBalance, userSharesReferal)
720720 let checkpointActions = $t02683026956._1
721721 let userUnitsBalance = $t02683026956._2
722722 let userUnitsSharesReferal = $t02683026956._3
723723 let newUserTokenBalance = (userTokenBalance + toBigInt(amount))
724724 let newUserTokenBalanceInUSD = fraction(newUserTokenBalance, rate, PERCENT_FACTOR, DOWN)
725725 let newUserUSDBalance = ((userUSDBalance - userTokenBalanceInUSD) + newUserTokenBalanceInUSD)
726726 let totalBalanceUpdated = ((_loadTotalUSDBalance() - userTokenBalanceInUSD) + newUserTokenBalanceInUSD)
727727 let usersCount = if ((userUSDBalance == ZERO_BIGINT))
728728 then (_loadUsersCount() + ONE_BIGINT)
729729 else _loadUsersCount()
730730 let refererActions = if (if ((size(referrer_) > 0))
731731 then _checkRefererExistence(referrer_)
732732 else false)
733733 then {
734734 let refererAddress = _loadReferer(referrer_)
735735 let sharesToDistribute = fraction(toBigInt(amount), rate, PERCENT_FACTOR, DOWN)
736736 let sharesToUser = fraction(sharesToDistribute, toBigInt(20), toBigInt(100), DOWN)
737737 let sharesToReferer = (sharesToDistribute - sharesToUser)
738738 let newUserSharesReferal = (userSharesReferal + sharesToUser)
739739 let refererSharesReferal = _loadUserSharesReferal(refererAddress)
740740 let newRefererSharesReferal = (refererSharesReferal + sharesToReferer)
741741 let newTotalSharesReferal = (_loadTotalSharesReferal() + sharesToDistribute)
742742 let $t02828928460 = _userCheckpoint(refererAddress, _loadUserUSDBalance(refererAddress), refererSharesReferal)
743743 let refererCheckpointActions = $t02828928460._1
744744 let refererUnitsBalance = $t02828928460._2
745745 let refererUnitsSharesReferal = $t02828928460._3
746746 (((refererCheckpointActions ++ _saveUserSharesReferal(sender, newUserSharesReferal)) ++ _saveUserSharesReferal(refererAddress, newRefererSharesReferal)) ++ _saveTotalSharesReferal(newTotalSharesReferal))
747747 }
748748 else nil
749749 let invocation = invoke(_loadSWavesContract(), FUNC_DEPOSIT, nil, [AttachedPayment(unit, i.payments[0].amount)])
750750 if ((invocation == invocation))
751751 then $Tuple2(((((((checkpointActions ++ refererActions) ++ _saveTotalUSDBalance(totalBalanceUpdated)) ++ _saveTokenBalance(WAVES, (_loadTokenBalance(WAVES) + toBigInt(amount)))) ++ _saveUserUSDBalance(sender, newUserUSDBalance)) ++ _saveUsersCount(usersCount)) ++ _saveUserPosition(token, sender, $Tuple2(newUserTokenBalance, newUserTokenBalanceInUSD))), userUnitsBalance)
752752 else throw("Strict value is not equal to itself.")
753753 }
754754 else throw("Strict value is not equal to itself.")
755755 }
756756
757757
758758
759759 @Callable(i)
760760 func withdrawWaves (amount_) = {
761761 let err = if (if (if (_whenInitialized())
762762 then _whenNotPaused()
763763 else false)
764- then _validateInt((amount_ / 100), 0, MAX_INT, "withdrawWaves: invalid amount")
764+ then _validateInt((amount_ / 100), 1, MAX_INT, "withdrawWaves: invalid amount")
765765 else false)
766766 then if ((_loadFinishBlock() >= toBigInt(height)))
767767 then throw("withdrawWaves: not allowed")
768768 else true
769769 else false
770770 if ((err == err))
771771 then {
772772 let internalAmount = (amount_ / 100)
773773 let sender = toString(i.caller)
774774 let token = WAVES
775775 let rate = _getTokenRate(token)
776776 let $t02972829808 = _loadUserPosition(token, sender)
777777 let userTokenBalance = $t02972829808._1
778778 let userTokenBalanceInUSD = $t02972829808._2
779779 let userUSDBalance = _loadUserUSDBalance(sender)
780780 let userSharesReferal = _loadUserSharesReferal(sender)
781781 let $t02992530051 = _userCheckpoint(sender, userUSDBalance, userSharesReferal)
782782 let checkpointActions = $t02992530051._1
783783 let userUnitsBalance = $t02992530051._2
784784 let userUnitsSharesReferal = $t02992530051._3
785785 let newUserTokenBalance = (userTokenBalance - toBigInt(internalAmount))
786786 let err1 = _validateInt(toInt(newUserTokenBalance), 0, MAX_INT, "withdrawWaves: insufficient token amount")
787787 if ((err1 == err1))
788788 then {
789789 let newUserTokenBalanceInUSD = fraction(newUserTokenBalance, rate, PERCENT_FACTOR, DOWN)
790790 let newUserUSDBalance = ((userUSDBalance - userTokenBalanceInUSD) + newUserTokenBalanceInUSD)
791791 let totalBalanceUpdated = ((_loadTotalUSDBalance() - userTokenBalanceInUSD) + newUserTokenBalanceInUSD)
792792 let sWavesContract = _loadSWavesContract()
793793 let sWavesAsset = _loadSWavesAsset(sWavesContract)
794794 let invocation = invoke(sWavesContract, FUNC_GET_RATE, nil, nil)
795795 let swavesRate = match invocation {
796796 case a: String =>
797797 parseBigIntValue(a)
798798 case _ =>
799799 throw("withdrawWaves: sWaves getRate() revert")
800800 }
801801 let sWavesToWithdraw = toInt(fraction(toBigInt(amount_), SWAVES_RATE_FACTOR, swavesRate, CEILING))
802802 let invocation1 = invoke(sWavesContract, FUNC_WITHDRAW, nil, [AttachedPayment(sWavesAsset, sWavesToWithdraw)])
803803 if ((invocation1 == invocation1))
804804 then $Tuple2(((((([ScriptTransfer(i.caller, amount_, unit)] ++ checkpointActions) ++ _saveTotalUSDBalance(totalBalanceUpdated)) ++ _saveTokenBalance(WAVES, (_loadTokenBalance(WAVES) - toBigInt(internalAmount)))) ++ _saveUserUSDBalance(sender, newUserUSDBalance)) ++ _saveUserPosition(token, sender, $Tuple2(newUserTokenBalance, newUserTokenBalanceInUSD))), unit)
805805 else throw("Strict value is not equal to itself.")
806806 }
807807 else throw("Strict value is not equal to itself.")
808808 }
809809 else throw("Strict value is not equal to itself.")
810810 }
811811
812812
813813
814814 @Callable(i)
815815 func startRetrodrop (unitsAsset_,amountForLP_,amountForReferal_,blocksAt_) = {
816816 let err = if (if (if (if (if (if (if (_onlyThisContract(i.caller))
817817 then _whenInitialized()
818818 else false)
819819 then _whenNotPaused()
820820 else false)
821821 then _validateAsset(unitsAsset_, "startRetrodrop: invalid units asset")
822822 else false)
823823 then _validateInt(amountForLP_, 0, MAX_INT, "startRetrodrop: invalid amountForLP")
824824 else false)
825825 then _validateInt(amountForReferal_, 0, MAX_INT, "startRetrodrop: invalid amountForReferal")
826826 else false)
827827 then _validateInt(blocksAt_, 1, MAX_INT, "startRetrodrop: invalid blocksAt")
828828 else false)
829829 then _validateEqBigInt(_loadStartBlock(), ZERO_BIGINT, "startRetrodrop: already started")
830830 else false
831831 if ((err == err))
832832 then {
833833 let startHeight = toBigInt(height)
834834 let finishHeight = (startHeight + toBigInt(blocksAt_))
835835 let err1 = if (((amountForLP_ + amountForReferal_) > assetBalance(this, fromBase58String(unitsAsset_))))
836836 then throw("startRetrodrop: insufficient funds")
837837 else true
838838 if ((err1 == err1))
839839 then $Tuple2(((((_saveUnitsAsset(fromBase58String(unitsAsset_)) ++ _saveStartBlock(startHeight)) ++ _saveFinishBlock(finishHeight)) ++ _saveTotalUnitsForLP(toBigInt(amountForLP_))) ++ _saveTotalUnitsForReferal(toBigInt(amountForReferal_))), unit)
840840 else throw("Strict value is not equal to itself.")
841841 }
842842 else throw("Strict value is not equal to itself.")
843843 }
844844
845845
846846
847847 @Callable(i)
848848 func increaseUnitsSupply (amountForLP_,amountForReferal_) = {
849849 let err = if (if (if (if (_whenInitialized())
850850 then _whenNotPaused()
851851 else false)
852852 then _validateInt(amountForLP_, 0, MAX_INT, "increaseUnitsSupply: invalid amountForLP")
853853 else false)
854854 then _validateInt(amountForReferal_, 0, MAX_INT, "increaseUnitsSupply: invalid amountForReferal")
855855 else false)
856856 then _validateBigInt(toBigInt(height), (_loadStartBlock() + ONE_BIGINT), (_loadFinishBlock() - ONE_BIGINT), "increaseUnitsSupply: drop not active")
857857 else false
858858 if ((err == err))
859859 then {
860860 let newAmountForLP = (_loadTotalUnitsForLP() + toBigInt(amountForLP_))
861861 let newAmountForReferal = (_loadTotalUnitsForReferal() + toBigInt(amountForReferal_))
862862 let err1 = if (((newAmountForLP + newAmountForReferal) > toBigInt(assetBalance(this, _loadUnitsAsset()))))
863863 then throw("increaseUnitsSupply: insufficient funds")
864864 else true
865865 if ((err1 == err1))
866866 then $Tuple2((_saveTotalUnitsForLP(newAmountForLP) ++ _saveTotalUnitsForReferal(newAmountForReferal)), unit)
867867 else throw("Strict value is not equal to itself.")
868868 }
869869 else throw("Strict value is not equal to itself.")
870870 }
871871
872872
873873
874874 @Callable(i)
875875 func checkpoint (user_) = {
876876 let $t03382033959 = _userCheckpoint(user_, _loadUserUSDBalance(user_), _loadUserSharesReferal(user_))
877877 let actions = $t03382033959._1
878878 let userUnitsBalance = $t03382033959._2
879879 let userUnitsSharesReferal = $t03382033959._3
880880 $Tuple2(actions, $Tuple2(userUnitsBalance, userUnitsSharesReferal))
881881 }
882882
883883
884884
885885 @Callable(i)
886886 func getUnits (user_) = {
887887 let $t03407234211 = _userCheckpoint(user_, _loadUserUSDBalance(user_), _loadUserSharesReferal(user_))
888888 let actions = $t03407234211._1
889889 let userUnitsBalance = $t03407234211._2
890890 let userUnitsSharesReferal = $t03407234211._3
891891 $Tuple2(nil, $Tuple2(userUnitsBalance, userUnitsSharesReferal))
892892 }
893893
894894
895895
896896 @Callable(i)
897897 func setReferer (codehash_,address_) = {
898898 let err = if (_onlyManager(i.caller))
899899 then _whenInitialized()
900900 else false
901901 if ((err == err))
902902 then $Tuple2(_saveReferer(codehash_, address_), unit)
903903 else throw("Strict value is not equal to itself.")
904904 }
905905
906906
907907
908908 @Callable(i)
909909 func setManager (manager_) = {
910910 let err = if (if (_onlyThisContract(i.caller))
911911 then _whenInitialized()
912912 else false)
913913 then _validateAddress(manager_, "setManager: invalid manager")
914914 else false
915915 if ((err == err))
916916 then $Tuple2(_saveManager(addressFromStringValue(manager_)), unit)
917917 else throw("Strict value is not equal to itself.")
918918 }
919919
920920
921921
922922 @Callable(i)
923923 func updateCallerContract (callerContract_) = {
924924 let err = if (_onlyThisContract(i.caller))
925925 then _whenInitialized()
926926 else false
927927 if ((err == err))
928928 then $Tuple2(_saveCallerContract(callerContract_), unit)
929929 else throw("Strict value is not equal to itself.")
930930 }
931931
932932
933933
934934 @Callable(i)
935935 func pause () = {
936936 let err = if (if (_onlyPauser(i.caller))
937937 then _whenInitialized()
938938 else false)
939939 then _whenNotPaused()
940940 else false
941941 if ((err == err))
942942 then $Tuple2(_savePause(true), unit)
943943 else throw("Strict value is not equal to itself.")
944944 }
945945
946946
947947
948948 @Callable(i)
949949 func unpause () = {
950950 let err = if (if (_onlyPauser(i.caller))
951951 then _whenInitialized()
952952 else false)
953953 then _whenPaused()
954954 else false
955955 if ((err == err))
956956 then $Tuple2(_savePause(false), unit)
957957 else throw("Strict value is not equal to itself.")
958958 }
959959
960960
961961
962962 @Callable(i)
963963 func updatePauser (pauser_) = {
964964 let err = if (if (_onlyThisContract(i.caller))
965965 then _whenInitialized()
966966 else false)
967967 then _validateAddress(pauser_, "updatePauser: invalid pauser")
968968 else false
969969 if ((err == err))
970970 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
971971 else throw("Strict value is not equal to itself.")
972972 }
973973
974974
975975
976976 @Callable(i)
977977 func setMultisig (multisig_) = {
978978 let err = if (_onlyThisContract(i.caller))
979979 then _validateAddress(multisig_, "setMultisig: invalid multisig")
980980 else false
981981 if ((err == err))
982982 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
983983 else throw("Strict value is not equal to itself.")
984984 }
985985
986986
987987 @Verifier(tx)
988988 func verify () = match getString(KEY_MULTISIG) {
989989 case multisig: String =>
990990 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
991991 case _ =>
992992 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
993993 }
994994

github/deemru/w8io/026f985 
83.43 ms