tx · 2mpv6umohyuNVKvESwUrY9acrJvsuqhcR9NVgpvVxMgD

3MwukwUkp3PsyCrkjMgqiAnSfc1hBD5FQhH:  -0.02500000 Waves

2023.03.16 16:09 [2492622] smart account 3MwukwUkp3PsyCrkjMgqiAnSfc1hBD5FQhH > SELF 0.00000000 Waves

{ "type": 13, "id": "2mpv6umohyuNVKvESwUrY9acrJvsuqhcR9NVgpvVxMgD", "fee": 2500000, "feeAssetId": null, "timestamp": 1678972217856, "version": 2, "chainId": 84, "sender": "3MwukwUkp3PsyCrkjMgqiAnSfc1hBD5FQhH", "senderPublicKey": "5JqBVJpMCyD7dJLJttqYjL6CmJc4zahBHSFjFb7qQTga", "proofs": [ "3L1cCUiuDzZc31dtZxdwcNszC13S9vKbUjjn4cbD5BqjnH6c7xsJa6fDPMnyTdWuZWzyTZA1hBQV6BQj1reKY7nm" ], "script": "base64:BgIhCAISBAoCAQESBgoECAgICBIDCgEYEgASAwoBCBIDCgEBRAADU0VQAgFfAA5fbWluTG9ja3BlcmlvZAABAA1fdW5pdERlY2ltYWxzAIDC1y8ADl9taW5Mb2NrQW1vdW50CQBoAgABBQ1fdW5pdERlY2ltYWxzAA5fbWF4TG9ja0Ftb3VudAkAaAIA6AcFDV91bml0RGVjaW1hbHMAA19EdACAuJkpAQRfUHB5AQpsb2NrUGVyaW9kCQBrAwUNX3VuaXREZWNpbWFscwDtAgUKbG9ja1BlcmlvZAANX2luY3JlbWVudFJlZgkAaAIAwIQ9BQ1fdW5pdERlY2ltYWxzAA5fcGVyY2VudGFnZUZlZQkAawMFDV91bml0RGVjaW1hbHMACgBkABpfcGVyY2VudGFnZVJlZHVjdGlvbkZhY3RvcgIpQ3VycmVudF9QZXJjZW50YWdlUmVkdWN0aW9uX0ZhY3Rvcl9Gb3JfTXIAA19NcgIMTWludGluZ19SYXRlAAxfc3Rhd0Fzc2V0SWQCDFN0YXdfQXNzZXRJZAAIX21hbmFnZXICB21hbmFnZXIABF9EZngCA0RmeAAVX2NpcmN1bGF0aW9uSW5jckluZGV4AhlDaXJjdWxhdGlvbkluY3JlbWVudEluZGV4AA5fbGVzc2VlQWRkcmVzcwIJTGVhc2VOb2RlABpfdXNlckVtaXNzaW9uQW1vdW50Q2xhaW1lZAIVRW1pc3Npb25BbW91bnRDbGFpbWVkABtfdXNlckNhbkNsYWltRW1pc3Npb25BbW91bnQCFkNhbkNsYWltRW1pc3Npb25BbW91bnQADF91c2VyQWRkcmVzcwINV2FsbGV0QWRkcmVzcwAUX3VzZXJMb2NhbEluZGV4Q291bnQCFFRvdGFsRW50cnlJbmRleENvdW50ABBfdXNlclRvdGFsTG9ja2VkAgtUb3RhbExvY2tlZAANX2xvY2tEdXJhdGlvbgIMTG9ja0R1cmF0aW9uAApfbG9ja0luZGV4Ag9HbG9iYWxMb2NrSW5kZXgAB19sb2NrSWQCDkxvY2tJZGVudGlmaWVyAAxfd2F2ZXNBbW91bnQCDUFtb3VudEluV2F2ZXMAC19zdGF3QW1vdW50AgxBbW91bnRJblN0YXcADV9zdGF3TFBBbW91bnQCDkFtb3VudEluU3Rhd0xQAAVfdHhJZAIEVFhJRAANX2xvY2tBdEhlaWdodAIMTG9ja0F0SGVpZ2h0ABRfbG9ja1BlcmlvZEluTWlsaVNlYwIUTG9jS1BlcmlvZEluTWlsbGlTZWMAEl90b3RhbFdhdmVzQ2xhaW1lZAIRVG90YWxXYXZlc0NsYWltZWQAD191c2VyTGVhc2VTdGF0ZQIKTGVhc2VTdGF0ZQAKX3RvdGFsU3RhdwIPVG90YWxTdGF3TWludGVkAA5fdG90YWxXYXZlc1JlZgIQVG90YWxXYXZlc0xvY2tlZAAMX3RvdGFsU3Rhd0xQAgtUb3RhbFN0YXdMUAARX2dsb2JhbEluZGV4Q291bnQCCkluZGV4Q291bnQBBV9nZXRJAQNrZXkJAJoIAgUEdGhpcwUDa2V5AQVfZ2V0UwEDa2V5CQCdCAIFBHRoaXMFA2tleQEFX2dldEIBA2tleQkAmwgCBQR0aGlzBQNrZXkBBl9nZXRCVgEDa2V5CQEFdmFsdWUBCQCbCAIFBHRoaXMFA2tleQEGX2dldElWAQNrZXkJAQV2YWx1ZQEJAJoIAgUEdGhpcwUDa2V5AQZfZ2V0U1YBA2tleQkBBXZhbHVlAQkAnQgCBQR0aGlzBQNrZXkBDF9zZXRQYXJhbVZhbAIDa2V5CmRlZmF1bHRWYWwEByRtYXRjaDAFCmRlZmF1bHRWYWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBApkZWZhdWx0VmFsBQckbWF0Y2gwAwkBCWlzRGVmaW5lZAEJAQVfZ2V0UwEFA2tleQkBBl9nZXRTVgEFA2tleQUKZGVmYXVsdFZhbAMJAAECBQckbWF0Y2gwAgNJbnQECmRlZmF1bHRWYWwFByRtYXRjaDADCQEJaXNEZWZpbmVkAQkBBV9nZXRJAQUDa2V5CQEGX2dldElWAQUDa2V5BQpkZWZhdWx0VmFsAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4ECmRlZmF1bHRWYWwFByRtYXRjaDADCQEJaXNEZWZpbmVkAQkBBV9nZXRCAQUDa2V5CQEGX2dldEJWAQUDa2V5BQpkZWZhdWx0VmFsCQACAQkArAICAh12YWx1ZSB0eXBlIG5vdCBzdXBwb3J0ZWQgZm9yIAUDa2V5AQ9fdGhyb3dPclJldHVyblMCA3ZhbAVlcnJvcgQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACBlN0cmluZwQDdmFsBQckbWF0Y2gwBQN2YWwJAAIBBQVlcnJvcgEPX3Rocm93T3JSZXR1cm5JAgN2YWwFZXJyb3IEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgNJbnQEA3ZhbAUHJG1hdGNoMAUDdmFsCQACAQUFZXJyb3IBEl90aHJvd09yUmV0dXJuQm9vbAIDdmFsBWVycm9yBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQDdmFsBQckbWF0Y2gwBQN2YWwJAAIBBQVlcnJvcgEJX3dyaXRlSW50AgNrZXkFdmFsdWUDCQBmAgAABQV2YWx1ZQkAAgEJAKwCAgkArAICCQCsAgICF3dyaXRpbmcgbmVnYXRpdmUgdmFsdWUgCQCkAwEFBXZhbHVlAgkgZm9yIGtleSAFA2tleQkBDEludGVnZXJFbnRyeQIFA2tleQUFdmFsdWUBCV93cml0ZVN0cgIDa2V5BXZhbHVlAwkAAAICASAFBXZhbHVlCQACAQkArAICAhh3cml0aW5nIGFuIGVtcHR5IHN0cmluZyAFBXZhbHVlCQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlAQhfdGhyb3dJZgIJY29uZGl0aW9uBWVycm9yAwUJY29uZGl0aW9uCQACAQUFZXJyb3IGARFfd3JpdGVHbG9iYWxQYXJhbQIDa2V5Bl92YWx1ZQQHJG1hdGNoMAUGX3ZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQGX3ZhbHVlBQckbWF0Y2gwBAVlbnRyeQkAuQkCCQDMCAICAiVkCQDMCAIJAKQDAQUGX3ZhbHVlBQNuaWwFA1NFUAkBCV93cml0ZVN0cgIFA2tleQUFZW50cnkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZfdmFsdWUFByRtYXRjaDAEBWVudHJ5CQC5CQIJAMwIAgICJXMJAMwIAgUGX3ZhbHVlBQNuaWwFA1NFUAkBCV93cml0ZVN0cgIFA2tleQUFZW50cnkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQGX3ZhbHVlBQckbWF0Y2gwBAVlbnRyeQkAuQkCCQDMCAICAiViCQDMCAIJAKUDAQUGX3ZhbHVlBQNuaWwFA1NFUAkBCV93cml0ZVN0cgIFA2tleQUFZW50cnkJAAIBAhJ0eXBlIG5vdCBzdXBwb3J0ZWQBFl9nZXRSZWdpc3RyeUVudHJ5VmFsdWUBA2tleQQJX3Jhd1ZhbHVlCQEPX3Rocm93T3JSZXR1cm5TAgkBBV9nZXRTAQUDa2V5Ag9lbnRyeSBub3QgZm91bmQDCQAAAgUJX3Jhd1ZhbHVlBQlfcmF3VmFsdWUEAXgJALUJAgUJX3Jhd1ZhbHVlBQNTRVAED2Zvcm1hdFNwZWNpZmllcgkAsgICCQCRAwIFAXgAAAABBAxfdmFsdWVTdHJpbmcJAJEDAgUBeAkAZQIJAJADAQUBeAABBAZfdmFsdWUDCQAAAgUPZm9ybWF0U3BlY2lmaWVyAgFzBQxfdmFsdWVTdHJpbmcDCQAAAgUPZm9ybWF0U3BlY2lmaWVyAgFkCQENcGFyc2VJbnRWYWx1ZQEFDF92YWx1ZVN0cmluZwMJAAACBQ9mb3JtYXRTcGVjaWZpZXICAWIJANkEAQUMX3ZhbHVlU3RyaW5nCQACAQkArAICAiNjb3VsZCBub3QgcGFyc2UgcmVnaXN0cnkgdmFsdWUgZm9yIAUDa2V5BQZfdmFsdWUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDl9kYXlzVG9NaWxpU2VjAQRkYXlzBAVjaGVjawkBCF90aHJvd0lmAgkAZwIAAAUEZGF5cwIVaW52YWxpZCBsb2NraW5nIGRheXMhAwkAAAIFBWNoZWNrBQVjaGVjawkAaAIFBGRheXMFA19EdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERX3dyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAQVfZ2V0UwEFA2tleQkBCV93cml0ZVN0cgIFA2tleQUFdmFsdWUJAAIBCQCsAgICG2VudHJ5IGFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUDa2V5ARJfd3JpdGVDb25zdEludGVnZXICA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAQVfZ2V0UwEFA2tleQkBCV93cml0ZUludAIFA2tleQUFdmFsdWUJAAIBCQCsAgICHCBlbnRyeSBhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEMX29ubHlNYW5hZ2VyAQFpBAdtYW5hZ2VyBAckbWF0Y2gwCQEWX2dldFJlZ2lzdHJ5RW50cnlWYWx1ZQEFCF9tYW5hZ2VyAwkAAQIFByRtYXRjaDACBlN0cmluZwQDdmFsBQckbWF0Y2gwBQN2YWwCFWZhaWxlZCB0byBnZXQgbWFuYWdlcgMJAAACBQdtYW5hZ2VyBQdtYW5hZ2VyCQEIX3Rocm93SWYCCQECIT0CCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMFB21hbmFnZXICFmFkZHJlc3Mgbm90IGF1dGhvcml6ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BBF9hYnMBA3ZhbAMJAGYCAAAFA3ZhbAkBAS0BBQN2YWwFA3ZhbAEQX3ZhbGlkYXRlQWRkcmVzcwEHYWRkcmVzcwQHJG1hdGNoMAUHYWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEB2FkZHJlc3MFByRtYXRjaDAECF9hZGRyZXNzCQCmCAEFB2FkZHJlc3MEByRtYXRjaDEFCF9hZGRyZXNzAwkAAQIFByRtYXRjaDECB0FkZHJlc3MECF9hZGRyZXNzBQckbWF0Y2gxBgkAAgECD2ludmFsaWQgYWRkcmVzcwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAdhZGRyZXNzBQckbWF0Y2gwBAhfYWRkcmVzcwkApwgBBQdhZGRyZXNzBAckbWF0Y2gxBQhfYWRkcmVzcwMJAAECBQckbWF0Y2gxAgdBZGRyZXNzBAhfYWRkcmVzcwUHJG1hdGNoMQYJAAIBAhJpbnZhbGlkIHB1YmxpYyBrZXkJAAIBAhJpbnZhbGlkIGlucHV0IHR5cGUBDl92YWxpZGF0ZUFzc2V0AQdhc3NldElEBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJRAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAGBwEKX2NvbXB1dGVNcgAEEGN1cnJlbnRDaXJjSW5kZXgEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUVX2NpcmN1bGF0aW9uSW5jckluZGV4AwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECKGNpcmN1bGF0aW9uIGluZGV4IG5vdCBwcmV2aW91c2x5IGRlZmluZWQDCQAAAgUQY3VycmVudENpcmNJbmRleAUQY3VycmVudENpcmNJbmRleAQLc3Rhd0Fzc2V0SWQEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUMX3N0YXdBc3NldElkAwkAAQIFByRtYXRjaDACBlN0cmluZwQBdAUHJG1hdGNoMAUBdAkAAgECH2Fzc2V0IGlkIG5vdCBwcmV2aW91c2x5IGRlZmluZWQDCQAAAgULc3Rhd0Fzc2V0SWQFC3N0YXdBc3NldElkBBVzdGF3Q2lyY3VsYXRpbmdTdXBwbHkEByRtYXRjaDAJAOwHAQkA2QQBBQtzdGF3QXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhxdWFudGl0eQkAAgEJAKwCAgIUYXNzZXQgbm90IGZvdW5kIGZvciAFC3N0YXdBc3NldElkBA11bml0SW5jcmVtZW50CQBpAgkBBF9hYnMBCQBlAgUVc3Rhd0NpcmN1bGF0aW5nU3VwcGx5BQ1faW5jcmVtZW50UmVmBQ1faW5jcmVtZW50UmVmBBduZXdDaXJjdWxhdGlvbkluY3JJbmRleAMJAGYCBQ11bml0SW5jcmVtZW50BRBjdXJyZW50Q2lyY0luZGV4CQBkAgUNdW5pdEluY3JlbWVudAUQY3VycmVudENpcmNJbmRleAUQY3VycmVudENpcmNJbmRleAQJY3VycmVudE1yBAckbWF0Y2gwCQEWX2dldFJlZ2lzdHJ5RW50cnlWYWx1ZQEFA19NcgMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAhtmYWlsZWQgdG8gZ2V0IG1pbml0aW5nIHJhdGUDCQAAAgUXbmV3Q2lyY3VsYXRpb25JbmNySW5kZXgFEGN1cnJlbnRDaXJjSW5kZXgJAJQKAgUJY3VycmVudE1yBQNuaWwEEm5ld3JlZHVjdGlvbkZhY3RvcgQHJG1hdGNoMAkBFl9nZXRSZWdpc3RyeUVudHJ5VmFsdWUBBRpfcGVyY2VudGFnZVJlZHVjdGlvbkZhY3RvcgMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAilmYWlsZWQgdG8gZ2V0IHBlcmNlbnRhZ2UgcmVkdWN0aW9uIGZhY3RvcgQMbmV3Q3VycmVudE1yCQBlAgUJY3VycmVudE1yCQBrAwUJY3VycmVudE1yBRJuZXdyZWR1Y3Rpb25GYWN0b3IAZAQGc3RvcmUxCQERX3dyaXRlR2xvYmFsUGFyYW0CBQNfTXIFDG5ld0N1cnJlbnRNcgQGc3RvcmUyCQERX3dyaXRlR2xvYmFsUGFyYW0CBRpfcGVyY2VudGFnZVJlZHVjdGlvbkZhY3RvcgUSbmV3cmVkdWN0aW9uRmFjdG9yBAZzdG9yZTMJARFfd3JpdGVHbG9iYWxQYXJhbQIFFV9jaXJjdWxhdGlvbkluY3JJbmRleAUXbmV3Q2lyY3VsYXRpb25JbmNySW5kZXgJAJQKAgUMbmV3Q3VycmVudE1yCQDMCAIFBnN0b3JlMQkAzAgCBQZzdG9yZTIJAMwIAgUGc3RvcmUzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEl91cGRhdGVHbG9iYWxFbnRyeQQLd2F2ZXNBbW91bnQKc3Rhd0Ftb3VudAZzdGF3UEwKaW5kZXhDb3VudAQaX25ld0dsb2JhbFRvdGFsV2F2ZXNBbXRSZWYEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUOX3RvdGFsV2F2ZXNSZWYDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwCQBkAgUBdAULd2F2ZXNBbW91bnQJAAIBAiBmYWlsZWQgdG8gZ2V0IGdsb2JhbCB0b3RhbCB3YXZlcwMJAAACBRpfbmV3R2xvYmFsVG90YWxXYXZlc0FtdFJlZgUaX25ld0dsb2JhbFRvdGFsV2F2ZXNBbXRSZWYEGV9uZXdHbG9iYWxUb3RhbFN0YXdNaW50ZWQEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUKX3RvdGFsU3RhdwMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAJAGQCBQF0BQpzdGF3QW1vdW50CQACAQImZmFpbGVkIHRvIGdldCBnbG9iYWwgdG90YWwgc3RhdyBtaW50ZWQDCQAAAgUZX25ld0dsb2JhbFRvdGFsU3Rhd01pbnRlZAUZX25ld0dsb2JhbFRvdGFsU3Rhd01pbnRlZAQVX25ld0dsb2JhbFRvdGFsU3Rhd1BMBAckbWF0Y2gwCQEWX2dldFJlZ2lzdHJ5RW50cnlWYWx1ZQEFDF90b3RhbFN0YXdMUAMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAJAGQCBQF0BQZzdGF3UEwJAAIBAiFmYWlsZWQgdG8gZ2V0IGdsb2JhbCB0b3RhbCBzdGF3cGwDCQAAAgUVX25ld0dsb2JhbFRvdGFsU3Rhd1BMBRVfbmV3R2xvYmFsVG90YWxTdGF3UEwEE19uZXdHbG9iYUluZGV4Q291bnQEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQURX2dsb2JhbEluZGV4Q291bnQDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwCQBkAgUBdAUKaW5kZXhDb3VudAkAAgECIGZhaWxlZCB0byBnZXQgZ2xvYmFsIGluZGV4IGNvdW50AwkAAAIFE19uZXdHbG9iYUluZGV4Q291bnQFE19uZXdHbG9iYUluZGV4Q291bnQJAMwIAgkBEV93cml0ZUdsb2JhbFBhcmFtAgUOX3RvdGFsV2F2ZXNSZWYFGl9uZXdHbG9iYWxUb3RhbFdhdmVzQW10UmVmCQDMCAIJARFfd3JpdGVHbG9iYWxQYXJhbQIFCl90b3RhbFN0YXcFGV9uZXdHbG9iYWxUb3RhbFN0YXdNaW50ZWQJAMwIAgkBEV93cml0ZUdsb2JhbFBhcmFtAgUMX3RvdGFsU3Rhd0xQBRVfbmV3R2xvYmFsVG90YWxTdGF3UEwJAMwIAgkBEV93cml0ZUdsb2JhbFBhcmFtAgURX2dsb2JhbEluZGV4Q291bnQFE19uZXdHbG9iYUluZGV4Q291bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgESX3JlZ2lzdGVyVXNlckVudHJ5DQ10cmFuc2FjdGlvbklEC3VzZXJBZGRyZXNzDGxvY2tEdXJhdGlvbhJsb2NrRHVyYXRpb25Jbk1pbGkJbG9ja0luZGV4C3dhdmVzQW1vdW50CnN0YXdBbW91bnQMc3Rhd0xQQW1vdW50DGxvY2tBdEhlaWdodAZsb2NrSWQLdG90YWxMb2NrZWQPbG9jYWxJbmRleENvdW50CmxlYXNlU3RhdGUECF90eElkS2V5CQC5CQIJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JRAkAzAgCBQVfdHhJZAUDbmlsBQNTRVAEEF9sb2NrRHVyYXRpb25LZXkJALkJAgkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQ10cmFuc2FjdGlvbklECQDMCAIFDV9sb2NrRHVyYXRpb24FA25pbAUDU0VQBA1fbG9ja0luZGV4S2V5CQC5CQIJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JRAkAzAgCBQpfbG9ja0luZGV4BQNuaWwFA1NFUAQPX3dhdmVzQW1vdW50S2V5CQC5CQIJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JRAkAzAgCBQxfd2F2ZXNBbW91bnQFA25pbAUDU0VQBA5fc3Rhd0Ftb3VudEtleQkAuQkCCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDXRyYW5zYWN0aW9uSUQJAMwIAgULX3N0YXdBbW91bnQFA25pbAUDU0VQBBBfc3Rhd0xQQW1vdW50S2V5CQC5CQIJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JRAkAzAgCBQ1fc3Rhd0xQQW1vdW50BQNuaWwFA1NFUAQQX2xvY2tBdEhlaWdodEtleQkAuQkCCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDXRyYW5zYWN0aW9uSUQJAMwIAgUNX2xvY2tBdEhlaWdodAUDbmlsBQNTRVAECl9sb2NrSWRLZXkJALkJAgkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQ10cmFuc2FjdGlvbklECQDMCAIFB19sb2NrSWQFA25pbAUDU0VQBA9fdG90YWxMb2NrZWRLZXkJALkJAgkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBRBfdXNlclRvdGFsTG9ja2VkBQNuaWwFA1NFUAQSX2xvY2FsTG9ja0luZGV4S2V5CQC5CQIJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUUX3VzZXJMb2NhbEluZGV4Q291bnQFA25pbAUDU0VQBBdfbG9ja1BlcmlvZEluTWlsaVNlY0tleQkAuQkCCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDXRyYW5zYWN0aW9uSUQJAMwIAgUUX2xvY2tQZXJpb2RJbk1pbGlTZWMFA25pbAUDU0VQBBVfdG90YWxXYXZlc0NsYWltZWRLZXkJALkJAgkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQ10cmFuc2FjdGlvbklECQDMCAIFEl90b3RhbFdhdmVzQ2xhaW1lZAUDbmlsBQNTRVAEEl91c2VyTGVhc2VTdGF0ZUtleQkAuQkCCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDXRyYW5zYWN0aW9uSUQJAMwIAgUPX3VzZXJMZWFzZVN0YXRlBQNuaWwFA1NFUAQKdHJ4SWRFbnRyeQkAuQkCCQDMCAICAiVzCQDMCAIFDXRyYW5zYWN0aW9uSUQFA25pbAUDU0VQBBFsb2NrRHVyYXRpb25FbnRyeQkAuQkCCQDMCAICAiVkCQDMCAIJAKQDAQUMbG9ja0R1cmF0aW9uBQNuaWwFA1NFUAQObG9ja0luZGV4RW50cnkJALkJAgkAzAgCAgIlZAkAzAgCCQCkAwEFCWxvY2tJbmRleAUDbmlsBQNTRVAEEHdhdmVzQW1vdW50RW50cnkJALkJAgkAzAgCAgIlZAkAzAgCCQCkAwEFC3dhdmVzQW1vdW50BQNuaWwFA1NFUAQPc3Rhd0Ftb3VudEVudHJ5CQC5CQIJAMwIAgICJWQJAMwIAgkApAMBBQpzdGF3QW1vdW50BQNuaWwFA1NFUAQRc3Rhd0xQQW1vdW50RW50cnkJALkJAgkAzAgCAgIlZAkAzAgCCQCkAwEFDHN0YXdMUEFtb3VudAUDbmlsBQNTRVAEEWxvY2tBdEhlaWdodEVudHJ5CQC5CQIJAMwIAgICJWQJAMwIAgkApAMBBQxsb2NrQXRIZWlnaHQFA25pbAUDU0VQBAtsb2NrSWRFbnRyeQkAuQkCCQDMCAICAiViCQDMCAIFBmxvY2tJZAUDbmlsBQNTRVAEEHRvdGFsTG9ja2VkRW50cnkJALkJAgkAzAgCAgIlZAkAzAgCCQCkAwEFC3RvdGFsTG9ja2VkBQNuaWwFA1NFUAQTdXNlckxvY2FsSW5kZXhFbnRyeQkAuQkCCQDMCAICAiVkCQDMCAIJAKQDAQUPbG9jYWxJbmRleENvdW50BQNuaWwFA1NFUAQYbG9ja1BlcmlvZEluTWlsaVNlY0VudHJ5CQC5CQIJAMwIAgICJWQJAMwIAgkApAMBBRJsb2NrRHVyYXRpb25Jbk1pbGkFA25pbAUDU0VQBBZ0b3RhbFdhdmVzQ2xhaW1lZEVudHJ5CQC5CQIJAMwIAgICJWQJAMwIAgkApAMBAAAFA25pbAUDU0VQBBN1c2VyTGVhc2VTdGF0ZUVudHJ5CQC5CQIJAMwIAgICJXMJAMwIAgUKbGVhc2VTdGF0ZQUDbmlsBQNTRVAJAMwIAgkBEV93cml0ZUNvbnN0U3RyaW5nAgUIX3R4SWRLZXkFCnRyeElkRW50cnkJAMwIAgkBEV93cml0ZUNvbnN0U3RyaW5nAgUNX2xvY2tJbmRleEtleQUObG9ja0luZGV4RW50cnkJAMwIAgkBCV93cml0ZVN0cgIFEl9sb2NhbExvY2tJbmRleEtleQUTdXNlckxvY2FsSW5kZXhFbnRyeQkAzAgCCQEJX3dyaXRlU3RyAgUPX3RvdGFsTG9ja2VkS2V5BRB0b3RhbExvY2tlZEVudHJ5CQDMCAIJARFfd3JpdGVDb25zdFN0cmluZwIFEF9sb2NrRHVyYXRpb25LZXkFEWxvY2tEdXJhdGlvbkVudHJ5CQDMCAIJARFfd3JpdGVDb25zdFN0cmluZwIFF19sb2NrUGVyaW9kSW5NaWxpU2VjS2V5BRhsb2NrUGVyaW9kSW5NaWxpU2VjRW50cnkJAMwIAgkBEV93cml0ZUNvbnN0U3RyaW5nAgUPX3dhdmVzQW1vdW50S2V5BRB3YXZlc0Ftb3VudEVudHJ5CQDMCAIJARFfd3JpdGVDb25zdFN0cmluZwIFDl9zdGF3QW1vdW50S2V5BQ9zdGF3QW1vdW50RW50cnkJAMwIAgkBCV93cml0ZVN0cgIFEF9zdGF3TFBBbW91bnRLZXkFEXN0YXdMUEFtb3VudEVudHJ5CQDMCAIJAQlfd3JpdGVTdHICBRVfdG90YWxXYXZlc0NsYWltZWRLZXkFFnRvdGFsV2F2ZXNDbGFpbWVkRW50cnkJAMwIAgkBEV93cml0ZUNvbnN0U3RyaW5nAgUQX2xvY2tBdEhlaWdodEtleQURbG9ja0F0SGVpZ2h0RW50cnkJAMwIAgkBEV93cml0ZUNvbnN0U3RyaW5nAgUKX2xvY2tJZEtleQULbG9ja0lkRW50cnkJAMwIAgkBCV93cml0ZVN0cgIFEl91c2VyTGVhc2VTdGF0ZUtleQUTdXNlckxlYXNlU3RhdGVFbnRyeQUDbmlsAQdfc3Rhd01GAgpsb2NrUGVyaW9kD2NvbGxhdGVyYWxXYXZlcwQLX2FkanVzdGVkTXIJAQpfY29tcHV0ZU1yAAQDcmV0CQBoAgkAawMFDV91bml0RGVjaW1hbHMJAGgCBQNfRHQIBQtfYWRqdXN0ZWRNcgJfMQkBBF9QcHkBBQpsb2NrUGVyaW9kBQ9jb2xsYXRlcmFsV2F2ZXMDCQAAAgkAkAMBCAULX2FkanVzdGVkTXICXzIAAAkAlAoCBQNyZXQFA25pbAkAlAoCBQNyZXQIBQtfYWRqdXN0ZWRNcgJfMgESX2VtaXNzaW9uUmF0ZVdhdmVzAgpsb2NrUGVyaW9kCmNvbGxhdGVyYWwED2V4dGVuc2lvbkZhY3RvcgkAawMFCmxvY2tQZXJpb2QADwAKCQBoAgkAaQIFCmNvbGxhdGVyYWwJAGUCCQBoAgUKbG9ja1BlcmlvZAUPZXh0ZW5zaW9uRmFjdG9yBQpsb2NrUGVyaW9kBQNfRHQBEF9pbmNyVG90YWxTdGF3TFABBmFtb3VudAQJb2xkU3Rhd0xQCQEPX3Rocm93T3JSZXR1cm5JAgkBBV9nZXRJAQUMX3RvdGFsU3Rhd0xQAiBjb3VsZCBub3QgZ2V0IHRoZSBydW5uaW5nIFN0YXdMUAkAzAgCCQEJX3dyaXRlSW50AgUMX3RvdGFsU3Rhd0xQCQBkAgUJb2xkU3Rhd0xQBQZhbW91bnQFA25pbAEQX2RlY3JUb3RhbFN0YXdMUAEGYW1vdW50BAlvbGRTdGF3TFAJAQ9fdGhyb3dPclJldHVybkkCCQEFX2dldEkBBQxfdG90YWxTdGF3TFACIGNvdWxkIG5vdCBnZXQgdGhlIHJ1bm5pbmcgU3Rhd0xQCQDMCAIJAQlfd3JpdGVJbnQCBQxfdG90YWxTdGF3TFAJAGUCBQlvbGRTdGF3TFAFBmFtb3VudAUDbmlsARJfaW5jclRvdGFsV2F2ZXNSZWYBBmFtb3VudAQLb2xkV2F2ZXNSZWYJAQ9fdGhyb3dPclJldHVybkkCCQEFX2dldEkBBQ5fdG90YWxXYXZlc1JlZgIgY291bGQgbm90IGdldCB0b3RhbCBsb2NrZWQgd2F2ZXMJAMwIAgkBCV93cml0ZUludAIFDl90b3RhbFdhdmVzUmVmCQBkAgULb2xkV2F2ZXNSZWYFBmFtb3VudAUDbmlsARJfZGVjclRvdGFsV2F2ZXNSZWYBBmFtb3VudAQLb2xkV2F2ZXNSZWYJAQ9fdGhyb3dPclJldHVybkkCCQEFX2dldEkBBQ5fdG90YWxXYXZlc1JlZgIgY291bGQgbm90IGdldCB0b3RhbCBsb2NrZWQgd2F2ZXMJAMwIAgkBCV93cml0ZUludAIFDl90b3RhbFdhdmVzUmVmCQBlAgULb2xkV2F2ZXNSZWYFBmFtb3VudAUDbmlsARBfZ2V0TmV3VGltZVN0YW1wAQtibG9ja0hlaWdodAQEdGltZQQHJG1hdGNoMAkA7QcBBQtibG9ja0hlaWdodAMJAAECBQckbWF0Y2gwAglCbG9ja0luZm8ECHRpbWVJbmZvBQckbWF0Y2gwCAUIdGltZUluZm8JdGltZXN0YW1wCQACAQIUY291bmxkIGdldCB0aW1lc3RhbXAFBHRpbWUGAWkBC2dldEVtaXNzaW9uAgpsb2NrUGVyaW9kCmNvbGxhdGVyYWwEBmNoZWNrMQkBDF9vbmx5TWFuYWdlcgEFAWkDCQAAAgUGY2hlY2sxBQZjaGVjazEJAJQKAgUDbmlsCQESX2VtaXNzaW9uUmF0ZVdhdmVzAgUKbG9ja1BlcmlvZAUKY29sbGF0ZXJhbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQRpbml0BAdtYW5hZ2VyA2RmeAdhc3NldElECWxlYXNlTm9kZQQUbWFuYWdlckFscmVhZHlFeGlzdHMDCQEJaXNEZWZpbmVkAQkBBV9nZXRTAQUIX21hbmFnZXIJAQxfb25seU1hbmFnZXIBBQFpBgMJAAACBRRtYW5hZ2VyQWxyZWFkeUV4aXN0cwUUbWFuYWdlckFscmVhZHlFeGlzdHMEBmNoZWNrMQkBEF92YWxpZGF0ZUFkZHJlc3MBBQdtYW5hZ2VyAwkAAAIFBmNoZWNrMQUGY2hlY2sxBAZjaGVjazIJARBfdmFsaWRhdGVBZGRyZXNzAQUDZGZ4AwkAAAIFBmNoZWNrMgUGY2hlY2syBAZjaGVjazMJARBfdmFsaWRhdGVBZGRyZXNzAQUJbGVhc2VOb2RlAwkAAAIFBmNoZWNrMwUGY2hlY2szBAZjaGVjazQDCQEOX3ZhbGlkYXRlQXNzZXQBBQdhc3NldElEBgkAAgECEGludmFsaWQgYXNzZXQgSWQDCQAAAgUGY2hlY2s0BQZjaGVjazQEEGNpcmN1bGF0aW9uSW5kZXgJAQxfc2V0UGFyYW1WYWwCBRVfY2lyY3VsYXRpb25JbmNySW5kZXgAAAQXcGVyY2VudGFnZVJlZHVjdGlvbkluTXIJAQxfc2V0UGFyYW1WYWwCBRpfcGVyY2VudGFnZVJlZHVjdGlvbkZhY3RvcgAABAJNcgkBDF9zZXRQYXJhbVZhbAIFA19NcgUNX3VuaXREZWNpbWFscwQPdG90YWxTdGF3TWludGVkCQEMX3NldFBhcmFtVmFsAgUKX3RvdGFsU3RhdwAABBh0b3RhbFN0YXdMUEluQ2lyY3VsYXRpb24JAQxfc2V0UGFyYW1WYWwCBQxfdG90YWxTdGF3TFAAAAQQZ2xvYmFsSW5kZXhDb3VudAkBDF9zZXRQYXJhbVZhbAIFEV9nbG9iYWxJbmRleENvdW50AAAEDXRvdGFsV2F2ZXNSZWYJAQxfc2V0UGFyYW1WYWwCBQ5fdG90YWxXYXZlc1JlZgAACQDMCAIJARFfd3JpdGVHbG9iYWxQYXJhbQIFCF9tYW5hZ2VyBQdtYW5hZ2VyCQDMCAIJARFfd3JpdGVHbG9iYWxQYXJhbQIFBF9EZngFA2RmeAkAzAgCCQERX3dyaXRlR2xvYmFsUGFyYW0CBQxfc3Rhd0Fzc2V0SWQFB2Fzc2V0SUQJAMwIAgkBEV93cml0ZUdsb2JhbFBhcmFtAgUOX2xlc3NlZUFkZHJlc3MFCWxlYXNlTm9kZQkAzAgCCQERX3dyaXRlR2xvYmFsUGFyYW0CBRVfY2lyY3VsYXRpb25JbmNySW5kZXgFEGNpcmN1bGF0aW9uSW5kZXgJAMwIAgkBEV93cml0ZUdsb2JhbFBhcmFtAgUDX01yBQJNcgkAzAgCCQERX3dyaXRlR2xvYmFsUGFyYW0CBRpfcGVyY2VudGFnZVJlZHVjdGlvbkZhY3RvcgUXcGVyY2VudGFnZVJlZHVjdGlvbkluTXIJAMwIAgkBEV93cml0ZUdsb2JhbFBhcmFtAgUOX3RvdGFsV2F2ZXNSZWYFDXRvdGFsV2F2ZXNSZWYJAMwIAgkBEV93cml0ZUdsb2JhbFBhcmFtAgUMX3RvdGFsU3Rhd0xQBRh0b3RhbFN0YXdMUEluQ2lyY3VsYXRpb24JAMwIAgkBEV93cml0ZUdsb2JhbFBhcmFtAgUKX3RvdGFsU3RhdwUPdG90YWxTdGF3TWludGVkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESbW9kaWZ5R2xvYmFsUGFyYW1zAQN2YWwEBmNoZWNrMQkBDF9vbmx5TWFuYWdlcgEFAWkDCQAAAgUGY2hlY2sxBQZjaGVjazEECGVycm9yTXNnCQC5CQIJAMwIAgIDZ290CQDMCAICDGxpc3Qgc2l6ZSBvZgkAzAgCCQCkAwEJAJADAQUDdmFsCQDMCAICJWJ1dCBleHBlY3RlZCBbZ2xvYmFsX2tleSwgdmFsdWVdIHBhaXIFA25pbAIBIAQGY2hlY2syCQEIX3Rocm93SWYCCQECIT0CCQCQAwEFA3ZhbAACBQhlcnJvck1zZwMJAAACBQZjaGVjazIFBmNoZWNrMgQDa2V5CQCRAwIFA3ZhbAAABAd2YWxUeXBlCQC2CQEJAJEDAgUDdmFsAAEEByRtYXRjaDAFB3ZhbFR5cGUDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBAt2YWxpZGF0ZUtleQkBCF90aHJvd0lmAgkAAAIJAQVfZ2V0UwEFA2tleQUEdW5pdAkArAICCQCsAgICBGtleSAFA2tleQIPIG5vdCByZWNvZ25pemVkAwkAAAIFC3ZhbGlkYXRlS2V5BQt2YWxpZGF0ZUtleQQQZW5zdXJlVmFsaWRQYWlycwQHJG1hdGNoMQkBFl9nZXRSZWdpc3RyeUVudHJ5VmFsdWUBBQNrZXkDCQABAgUHJG1hdGNoMQIDSW50BAF0BQckbWF0Y2gxBgkAAgECFmludmFsaWQga2V5LXZhbHVlIHBhaXIDCQAAAgUQZW5zdXJlVmFsaWRQYWlycwUQZW5zdXJlVmFsaWRQYWlycwkAzAgCCQERX3dyaXRlR2xvYmFsUGFyYW0CBQNrZXkFAXgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAECBQckbWF0Y2gwAgRVbml0BAF4BQckbWF0Y2gwBAt2YWxpZGF0ZUtleQkBCF90aHJvd0lmAgkAAAIJAQVfZ2V0UwEFA2tleQUEdW5pdAkArAICCQCsAgICBGtleSAFA2tleQIPIG5vdCByZWNvZ25pemVkAwkAAAIFC3ZhbGlkYXRlS2V5BQt2YWxpZGF0ZUtleQQLc3RyaW5nVmFsdWUJAJEDAgUDdmFsAAEECnJlZkFkZHJlc3MJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUIX21hbmFnZXIEBmNoZWNrNAQHJG1hdGNoMQUKcmVmQWRkcmVzcwMJAAECBQckbWF0Y2gxAgZTdHJpbmcEB3N0clR5cGUFByRtYXRjaDEDCQAAAgkAsQIBBQdzdHJUeXBlCQCxAgEFC3N0cmluZ1ZhbHVlCQEQX3ZhbGlkYXRlQWRkcmVzcwEFC3N0cmluZ1ZhbHVlAwkBDl92YWxpZGF0ZUFzc2V0AQULc3RyaW5nVmFsdWUGCQACAQIjc3RyaW5nIHR5cGUgZm9yIHZhbHVlIG5vdCBzdXBwb3J0ZWQJAAIBAhx0eXBlIGZvciB2YWx1ZSBub3Qgc3VwcG9ydGVkAwkAAAIFBmNoZWNrNAUGY2hlY2s0CQDMCAIJARFfd3JpdGVHbG9iYWxQYXJhbQIFA2tleQULc3RyaW5nVmFsdWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgEJAKwCAgIRZmFpbGVkIHRvIG1vZGlmeSAJAJEDAgUDdmFsAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKcmV2b2tlTG9jawAEBmNoZWNrMQkBDF9vbmx5TWFuYWdlcgEFAWkDCQAAAgUGY2hlY2sxBQZjaGVjazEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQENdHJhbnNhY3Rpb25JRAQNY2FsbGVyQWRkcmVzcwkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBA1jb2xsYXRlcmFsS2V5CQC5CQIJAMwIAgUNY2FsbGVyQWRkcmVzcwkAzAgCBQ10cmFuc2FjdGlvbklECQDMCAIFDF93YXZlc0Ftb3VudAUDbmlsBQNTRVAEDWxvY2twZXJpb2RLZXkJALkJAgkAzAgCBQ1jYWxsZXJBZGRyZXNzCQDMCAIFDXRyYW5zYWN0aW9uSUQJAMwIAgUNX2xvY2tEdXJhdGlvbgUDbmlsBQNTRVAECWxvY2tJZEtleQkAuQkCCQDMCAIFDWNhbGxlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JRAkAzAgCBQdfbG9ja0lkBQNuaWwFA1NFUAQTbG9ja3BlcmlvZEluTWlsaUtleQkAuQkCCQDMCAIFDWNhbGxlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JRAkAzAgCBRRfbG9ja1BlcmlvZEluTWlsaVNlYwUDbmlsBQNTRVAEFHRvdGFsV2F2ZXNDbGFpbWVkS2V5CQC5CQIJAMwIAgUNY2FsbGVyQWRkcmVzcwkAzAgCBQ10cmFuc2FjdGlvbklECQDMCAIFEl90b3RhbFdhdmVzQ2xhaW1lZAUDbmlsBQNTRVAED3N0YXdMUEFtb3VudEtleQkAuQkCCQDMCAIFDWNhbGxlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JRAkAzAgCBQ1fc3Rhd0xQQW1vdW50BQNuaWwFA1NFUAQOd2F2ZXNBbW91bnRLZXkJALkJAgkAzAgCBQ1jYWxsZXJBZGRyZXNzCQDMCAIFDXRyYW5zYWN0aW9uSUQJAMwIAgUMX3dhdmVzQW1vdW50BQNuaWwFA1NFUAQXdXNlclRvdGFsV2F2ZXNMb2NrZWRLZXkJALkJAgkAzAgCBQ1jYWxsZXJBZGRyZXNzCQDMCAIFEF91c2VyVG90YWxMb2NrZWQFA25pbAUDU0VQBBF1c2VyTGVhc2VTdGF0ZUtleQkAuQkCCQDMCAIFDWNhbGxlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JRAkAzAgCBQ9fdXNlckxlYXNlU3RhdGUFA25pbAUDU0VQBA1sZWFzZVN0YXRlS2V5CQC5CQIJAMwIAgUNY2FsbGVyQWRkcmVzcwkAzAgCBQ10cmFuc2FjdGlvbklECQDMCAIFD191c2VyTGVhc2VTdGF0ZQUDbmlsBQNTRVAEDmdsb2JhbFdhdmVzUmVmBAckbWF0Y2gwCQEWX2dldFJlZ2lzdHJ5RW50cnlWYWx1ZQEFDl90b3RhbFdhdmVzUmVmAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECIGZhaWxlZCB0byBnZXQgZ2xvYmFsIHRvdGFsIHdhdmVzAwkAAAIFDmdsb2JhbFdhdmVzUmVmBQ5nbG9iYWxXYXZlc1JlZgQMZ2xvYmFsU3Rhd1BMBAckbWF0Y2gwCQEWX2dldFJlZ2lzdHJ5RW50cnlWYWx1ZQEFDF90b3RhbFN0YXdMUAMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAiBmYWlsZWQgdG8gZ2V0IGdsb2JhbCB0b3RhbCB3YXZlcwMJAAACBQxnbG9iYWxTdGF3UEwFDGdsb2JhbFN0YXdQTAQGbG9ja0lkBAckbWF0Y2gwCQEWX2dldFJlZ2lzdHJ5RW50cnlWYWx1ZQEFCWxvY2tJZEtleQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF0BQckbWF0Y2gwBQF0CQACAQIWZmFpbGVkIHRvIGdldCBsZWFzZSBpZAMJAAACBQZsb2NrSWQFBmxvY2tJZAQUdXNlclRvdGFsV2F2ZXNMb2NrZWQEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUXdXNlclRvdGFsV2F2ZXNMb2NrZWRLZXkDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBQF0CQACAQIwZmFpbGVkIHRvIGdldCB0b3RhbCB3YXZlcyBsb2NrZWQgYnkgdGhpcyBhZGRyZXNzAwkAAAIFFHVzZXJUb3RhbFdhdmVzTG9ja2VkBRR1c2VyVG90YWxXYXZlc0xvY2tlZAQLd2F2ZXNBbW91bnQEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUOd2F2ZXNBbW91bnRLZXkDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBQF0CQACAQIgZmFpbGVkIHRvIGdldCB0b3RhbCB3YXZlcyBsb2NrZWQDCQAAAgULd2F2ZXNBbW91bnQFC3dhdmVzQW1vdW50BBF0b3RhbFdhdmVzQ2xhaW1lZAQHJG1hdGNoMAkBFl9nZXRSZWdpc3RyeUVudHJ5VmFsdWUBBRR0b3RhbFdhdmVzQ2xhaW1lZEtleQMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAiFmYWlsZWQgdG8gZ2V0IHRvdGFsIHdhdmVzIGNsYWltZWQDCQAAAgURdG90YWxXYXZlc0NsYWltZWQFEXRvdGFsV2F2ZXNDbGFpbWVkBAxzdGF3TFBBbW91bnQEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUPc3Rhd0xQQW1vdW50S2V5AwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECFGZhaWxlZCB0byBnZXQgc3Rhd1BMAwkAAAIFDHN0YXdMUEFtb3VudAUMc3Rhd0xQQW1vdW50BBBsb2NrUGVyaW9kSW5NaWxpBAckbWF0Y2gwCQEWX2dldFJlZ2lzdHJ5RW50cnlWYWx1ZQEFE2xvY2twZXJpb2RJbk1pbGlLZXkDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBQF0CQACAQIiZmFpbGVkIHRvIGdldCBsb2NrIHBlcmlvZCB0aW1lc3BhbQMJAAACBRBsb2NrUGVyaW9kSW5NaWxpBRBsb2NrUGVyaW9kSW5NaWxpBBBjdXJyZW50VGltZVN0YW1wBAckbWF0Y2gwCQEQX2dldE5ld1RpbWVTdGFtcAEFBmhlaWdodAMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAh9mYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdGltZXN0YW1wAwkAAAIFEGN1cnJlbnRUaW1lU3RhbXAFEGN1cnJlbnRUaW1lU3RhbXAECmNvbGxhdGVyYWwEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUNY29sbGF0ZXJhbEtleQMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAhhmYWlsZWQgdG8gZ2V0IGNvbGxhdGVyYWwDCQAAAgUKY29sbGF0ZXJhbAUKY29sbGF0ZXJhbAQKbG9ja1BlcmlvZAQHJG1hdGNoMAkBFl9nZXRSZWdpc3RyeUVudHJ5VmFsdWUBBQ1sb2NrcGVyaW9kS2V5AwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECGGZhaWxlZCB0byBnZXQgbG9ja1BlcmlvZAMJAAACBQpsb2NrUGVyaW9kBQpsb2NrUGVyaW9kBBFjdXJyZW50TGVhc2VTdGF0ZQQHJG1hdGNoMAkBFl9nZXRSZWdpc3RyeUVudHJ5VmFsdWUBBRF1c2VyTGVhc2VTdGF0ZUtleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXQFByRtYXRjaDAFAXQJAAIBAhlmYWlsZWQgdG8gZ2V0IGxlYXNlIHN0YXRlAwkAAAIFEWN1cnJlbnRMZWFzZVN0YXRlBRFjdXJyZW50TGVhc2VTdGF0ZQQKbGVhc2VTdGF0ZQQHJG1hdGNoMAkBFl9nZXRSZWdpc3RyeUVudHJ5VmFsdWUBBQ1sZWFzZVN0YXRlS2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBdAUHJG1hdGNoMAUBdAkAAgECImZhaWxlZCB0byBnZXQgbGVhc2Ugc3RhdGUgZm9yIHVzZXIDCQAAAgUKbGVhc2VTdGF0ZQUKbGVhc2VTdGF0ZQQGY2hlY2sxCQEIX3Rocm93SWYCCQBmAgUQbG9ja1BlcmlvZEluTWlsaQUQY3VycmVudFRpbWVTdGFtcAIqbG9jayBwZXJpb2QgZm9yIHRoaXMgZW50cnkgaGFzIG5vdCBlbGFwc2VkAwkAAAIFBmNoZWNrMQUGY2hlY2sxBAtsZWFzZUFjdGlvbgMJAAACBRFjdXJyZW50TGVhc2VTdGF0ZQIGbGVhc2VkCQCUCgIJAQtMZWFzZUNhbmNlbAEFBmxvY2tJZAkBCV93cml0ZVN0cgIFEXVzZXJMZWFzZVN0YXRlS2V5AgljYW5jZWxsZWQJAJQKAgkBCV93cml0ZVN0cgIFEXVzZXJMZWFzZVN0YXRlS2V5AgljYW5jZWxsZWQJAQlfd3JpdGVTdHICBRF1c2VyTGVhc2VTdGF0ZUtleQIJY2FuY2VsbGVkAwkAAAIFC2xlYXNlQWN0aW9uBQtsZWFzZUFjdGlvbgQGY2hlY2syCQEIX3Rocm93SWYCAwkAAAIAAAULd2F2ZXNBbW91bnQGCQAAAgAABQxzdGF3TFBBbW91bnQCIWFsbCBjbGFpbXMgZXhoYXVzdGVkIGZvciB0aGlzIHRyeAMJAAACBQZjaGVjazIFBmNoZWNrMgQSZW1pc3Npb25WYWx1ZVBlckRUCQBoAgkBEl9lbWlzc2lvblJhdGVXYXZlcwIFCmxvY2tQZXJpb2QFCmNvbGxhdGVyYWwFA19EdAQLY2xhaW1BY3Rpb24EDXRpbWVTdGFtcERpZmYJAGUCBRBjdXJyZW50VGltZVN0YW1wBRBsb2NrUGVyaW9kSW5NaWxpBBpkYXlzQWZ0ZXJMb2NrUGVyaW9kRWxhc3BlZAkAaQIFDXRpbWVTdGFtcERpZmYFA19EdAMJAAACBRpkYXlzQWZ0ZXJMb2NrUGVyaW9kRWxhc3BlZAAACQACAQIibGVzcyB0aGFuIDI0aHJzIGJlZm9yZSBmaXJzdCBjbGFpbQMJAQIhPQIJAGoCBQ10aW1lU3RhbXBEaWZmBQNfRHQAAAkAAgECNGFscmVhZHkgY2xhaW1lZCBvciBsZXNzIHRoYW4gMjRocnMgYmVmb3JlIG5leHQgY2xhaW0DCQBmAgUaZGF5c0FmdGVyTG9ja1BlcmlvZEVsYXNwZWQFCmxvY2tQZXJpb2QJAAIBAhRhbGwgY2xhaW1zIGV4aGF1c3RlZAQUdG90YWxBbW91bnRDbGFpbWFibGUJAGgCBRpkYXlzQWZ0ZXJMb2NrUGVyaW9kRWxhc3BlZAUSZW1pc3Npb25WYWx1ZVBlckRUBAhjaGVjazNfMQkBCF90aHJvd0lmAgkAAAIFFHRvdGFsQW1vdW50Q2xhaW1hYmxlBRF0b3RhbFdhdmVzQ2xhaW1lZAIcY2FuIG9ubHkgY2xhaW0gb25jZSBpbiAyNGhycwMJAAACBQhjaGVjazNfMQUIY2hlY2szXzEECGNoZWNrM18yCQEIX3Rocm93SWYCCQBmAgkAZAIFFHRvdGFsQW1vdW50Q2xhaW1hYmxlBRF0b3RhbFdhdmVzQ2xhaW1lZAULd2F2ZXNBbW91bnQCFGFsbCBjbGFpbXMgZXhoYXVzdGVkAwkAAAIFCGNoZWNrM18yBQhjaGVjazNfMgQRY2xhaW1BbW91bnRUb1NlbmQDCQAAAgUaZGF5c0FmdGVyTG9ja1BlcmlvZEVsYXNwZWQAAQUUdG90YWxBbW91bnRDbGFpbWFibGUJAGUCBRR0b3RhbEFtb3VudENsYWltYWJsZQURdG90YWxXYXZlc0NsYWltZWQEEm5ld1RvdGFsV2F2ZXNDbGFpbQUUdG90YWxBbW91bnRDbGFpbWFibGUEDm5ld1dhdmVzQW1vdW50AwkAAAIFGmRheXNBZnRlckxvY2tQZXJpb2RFbGFzcGVkAAEJAGUCBQt3YXZlc0Ftb3VudAUUdG90YWxBbW91bnRDbGFpbWFibGUJAGUCBQt3YXZlc0Ftb3VudAkAZQIFFHRvdGFsQW1vdW50Q2xhaW1hYmxlBRF0b3RhbFdhdmVzQ2xhaW1lZAQPbmV3U3Rhd0xQQW1vdW50AwkAAAIFGmRheXNBZnRlckxvY2tQZXJpb2RFbGFzcGVkAAEJAGUCBQxzdGF3TFBBbW91bnQFFHRvdGFsQW1vdW50Q2xhaW1hYmxlCQBlAgUMc3Rhd0xQQW1vdW50CQBlAgUUdG90YWxBbW91bnRDbGFpbWFibGUFEXRvdGFsV2F2ZXNDbGFpbWVkBBBuZXdHbG9iYWxXYXZlUmVmCQBlAgUOZ2xvYmFsV2F2ZXNSZWYFDm5ld1dhdmVzQW1vdW50BA9uZXdHbG9iYWxTdGF3UEwJAGUCBQxnbG9iYWxTdGF3UEwFD25ld1N0YXdMUEFtb3VudAQXbmV3VXNlclRvdGFsV2F2ZXNMb2NrZWQJAGUCBRR1c2VyVG90YWxXYXZlc0xvY2tlZAURY2xhaW1BbW91bnRUb1NlbmQEEHdhdmVzQW1vdW50RW50cnkJALkJAgkAzAgCAgIlZAkAzAgCCQCkAwEFDm5ld1dhdmVzQW1vdW50BQNuaWwFA1NFUAQRc3Rhd0xQQW1vdW50RW50cnkJALkJAgkAzAgCAgIlZAkAzAgCCQCkAwEFD25ld1N0YXdMUEFtb3VudAUDbmlsBQNTRVAEFnRvdGFsV2F2ZXNDbGFpbWVkRW50cnkJALkJAgkAzAgCAgIlZAkAzAgCCQCkAwEFEm5ld1RvdGFsV2F2ZXNDbGFpbQUDbmlsBQNTRVAEHG5ld1VzZXJUb3RhbFdhdmVzTG9ja2VkRW50cnkJALkJAgkAzAgCAgIlZAkAzAgCCQCkAwEFF25ld1VzZXJUb3RhbFdhdmVzTG9ja2VkBQNuaWwFA1NFUAkAzAgCCAULbGVhc2VBY3Rpb24CXzEJAMwIAggFC2xlYXNlQWN0aW9uAl8yCQDMCAIJAQlfd3JpdGVTdHICBQ53YXZlc0Ftb3VudEtleQUQd2F2ZXNBbW91bnRFbnRyeQkAzAgCCQEJX3dyaXRlU3RyAgUPc3Rhd0xQQW1vdW50S2V5BRFzdGF3TFBBbW91bnRFbnRyeQkAzAgCCQEJX3dyaXRlU3RyAgUUdG90YWxXYXZlc0NsYWltZWRLZXkFFnRvdGFsV2F2ZXNDbGFpbWVkRW50cnkJAMwIAgkBCV93cml0ZVN0cgIFF3VzZXJUb3RhbFdhdmVzTG9ja2VkS2V5BRxuZXdVc2VyVG90YWxXYXZlc0xvY2tlZEVudHJ5CQDMCAIJARFfd3JpdGVHbG9iYWxQYXJhbQIFDl90b3RhbFdhdmVzUmVmBRBuZXdHbG9iYWxXYXZlUmVmCQDMCAIJARFfd3JpdGVHbG9iYWxQYXJhbQIFDF90b3RhbFN0YXdMUAUPbmV3R2xvYmFsU3Rhd1BMCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQgIBQFpBmNhbGxlcgVieXRlcwURY2xhaW1BbW91bnRUb1NlbmQFBHVuaXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQtjbGFpbUFjdGlvbgULY2xhaW1BY3Rpb24FC2NsYWltQWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCG1pbnRTdGF3AQpsb2NrUGVyaW9kBA1jYWxsZXJBZGRyZXNzCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEBXRyeElECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQEBmNoZWNrMQkBCF90aHJvd0lmAgkBAiE9AgABCQCQAwEIBQFpCHBheW1lbnRzAhRubyBwYXltZW50cyBhdHRhY2hlZAMJAAACBQZjaGVjazEFBmNoZWNrMQQGY2hlY2syAwkBCWlzRGVmaW5lZAEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkAAgECFG9ubHkgd2F2ZXMgc3VwcG9ydGVkBgMJAAACBQZjaGVjazIFBmNoZWNrMgQNYW1vdW50SW5XYXZlcwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEBmNoZWNrMwMDCQBmAgUOX21pbkxvY2tBbW91bnQFDWFtb3VudEluV2F2ZXMGCQBmAgUNYW1vdW50SW5XYXZlcwUOX21heExvY2tBbW91bnQJAAIBAj9sb2NrIGFtb3VudCBvdXQgb2YgcmFuZ2UsIG1pbmltdW06IDEgd2F2ZXMsIG1heGltdW06IDEwMDAgd2F2ZXMGAwkAAAIFBmNoZWNrMwUGY2hlY2szBAZjaGVjazQDCQBmAgUOX21pbkxvY2twZXJpb2QFCmxvY2tQZXJpb2QJAAIBAh5taW5pbXVtIG9mIDE0IGRheXMgbG9jayBwZXJpb2QGAwkAAAIFBmNoZWNrNAUGY2hlY2s0BA10b3RhbFN0YXdNaW50CQEHX3N0YXdNRgIFCmxvY2tQZXJpb2QFDWFtb3VudEluV2F2ZXMEBnN0YXdQTAUNYW1vdW50SW5XYXZlcwQDZmVlCQBrAwgFDXRvdGFsU3Rhd01pbnQCXzEACgBkBBF1c2VyR2V0U3Rhd0Ftb3VudAkAZQIIBQ10b3RhbFN0YXdNaW50Al8xBQNmZWUEE2xvY2tQZXJpb2RUb01pbGlzZWMJAGQCCQEQX2dldE5ld1RpbWVTdGFtcAEFBmhlaWdodAkBDl9kYXlzVG9NaWxpU2VjAQUKbG9ja1BlcmlvZAMJAAACBRNsb2NrUGVyaW9kVG9NaWxpc2VjBRNsb2NrUGVyaW9kVG9NaWxpc2VjBAluZXdfaW5kZXgEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQURX2dsb2JhbEluZGV4Q291bnQDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwCQBkAgUBdAABCQACAQIoZmFpbGVkIHRvIGdldCBjdXJyZW50IGdsb2JhbCBpbmRleCBjb3VudAMJAAACBQluZXdfaW5kZXgFCW5ld19pbmRleAQKYWRkcmVzc0ZlZQQHJG1hdGNoMAkBFl9nZXRSZWdpc3RyeUVudHJ5VmFsdWUBBQRfRGZ4AwkAAQIFByRtYXRjaDACBlN0cmluZwQBdAUHJG1hdGNoMAkBB0FkZHJlc3MBCQDZBAEFAXQJAAIBAhlmYWlsZWQgdG8gZ2V0IGRmeCBhZGRyZXNzAwkAAAIFCmFkZHJlc3NGZWUFCmFkZHJlc3NGZWUEC3N0YXdBc3NldElkBAckbWF0Y2gwCQEWX2dldFJlZ2lzdHJ5RW50cnlWYWx1ZQEFDF9zdGF3QXNzZXRJZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXQFByRtYXRjaDAJANkEAQUBdAkAAgECFmZhaWxlZCB0byBnZXQgYXNzZXQgaWQDCQAAAgULc3Rhd0Fzc2V0SWQFC3N0YXdBc3NldElkBAZsZXNzZWUEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUOX2xlc3NlZUFkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF0BQckbWF0Y2gwCQEHQWRkcmVzcwEJANkEAQUBdAkAAgECIGZhaWxlZCB0byBnZXQgbGVhc2Ugbm9kZSBhZGRyZXNzAwkAAAIFBmxlc3NlZQUGbGVzc2VlBBB1c2VyTG9ja0luZGV4S2V5CQC5CQIJAMwIAgUNY2FsbGVyQWRkcmVzcwkAzAgCBRRfdXNlckxvY2FsSW5kZXhDb3VudAUDbmlsBQNTRVAEEnVzZXJUb3RhbExvY2tlZEtleQkAuQkCCQDMCAIFDWNhbGxlckFkZHJlc3MJAMwIAgUQX3VzZXJUb3RhbExvY2tlZAUDbmlsBQNTRVAEDnVzZXJJbmRleENvdW50BAckbWF0Y2gwCQEWX2dldFJlZ2lzdHJ5RW50cnlWYWx1ZQEFEHVzZXJMb2NrSW5kZXhLZXkDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwCQBkAgUBeAABAAADCQAAAgUOdXNlckluZGV4Q291bnQFDnVzZXJJbmRleENvdW50BA91c2VyVG90YWxMb2NrZWQEByRtYXRjaDAJARZfZ2V0UmVnaXN0cnlFbnRyeVZhbHVlAQUSdXNlclRvdGFsTG9ja2VkS2V5AwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAkAZAIFAXgFDWFtb3VudEluV2F2ZXMFDWFtb3VudEluV2F2ZXMDCQAAAgUPdXNlclRvdGFsTG9ja2VkBQ91c2VyVG90YWxMb2NrZWQECGxlYXNlT3V0CQDECAIFBmxlc3NlZQUNYW1vdW50SW5XYXZlcwMJAAACBQhsZWFzZU91dAUIbGVhc2VPdXQECmxlYXNlSWRTdHIJANgEAQkAuQgBBQhsZWFzZU91dAMJAAACBQpsZWFzZUlkU3RyBQpsZWFzZUlkU3RyCQDOCAIJAM4IAgkAzggCCQDMCAIFCGxlYXNlT3V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCmFkZHJlc3NGZWUFA2ZlZQULc3Rhd0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCAgFAWkGY2FsbGVyBWJ5dGVzBRF1c2VyR2V0U3Rhd0Ftb3VudAULc3Rhd0Fzc2V0SWQFA25pbAkBEl9yZWdpc3RlclVzZXJFbnRyeQ0FBXRyeElEBQ1jYWxsZXJBZGRyZXNzBQpsb2NrUGVyaW9kBRNsb2NrUGVyaW9kVG9NaWxpc2VjBQluZXdfaW5kZXgFDWFtb3VudEluV2F2ZXMFEXVzZXJHZXRTdGF3QW1vdW50BQZzdGF3UEwFBmhlaWdodAUKbGVhc2VJZFN0cgUPdXNlclRvdGFsTG9ja2VkBQ51c2VySW5kZXhDb3VudAIGbGVhc2VkCQESX3VwZGF0ZUdsb2JhbEVudHJ5BAUNYW1vdW50SW5XYXZlcwgFDXRvdGFsU3Rhd01pbnQCXzEFBnN0YXdQTAUJbmV3X2luZGV4CAUNdG90YWxTdGF3TWludAJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgC4vKCX", "height": 2492622, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4sUvwCRrA7CrbAf9mzqWZ75sgoVJDyGtVbZsLYiL6HKp Next: FVXRvsAJjA4HdbRDCngJKawU5UMqKpkf5ATRYw5nxtSC Diff:
OldNewDifferences
246246 case asset: Asset =>
247247 true
248248 case _ =>
249- throw(("invalid asset id: " + assetID))
249+ false
250250 }
251251
252252
455455 let check3 = _validateAddress(leaseNode)
456456 if ((check3 == check3))
457457 then {
458- let check4 = _validateAsset(assetID)
458+ let check4 = if (_validateAsset(assetID))
459+ then true
460+ else throw("invalid asset Id")
459461 if ((check4 == check4))
460462 then {
461463 let circulationIndex = _setParamVal(_circulationIncrIndex, 0)
495497 case x: Int =>
496498 let validateKey = _throwIf((_getS(key) == unit), (("key " + key) + " not recognized"))
497499 if ((validateKey == validateKey))
498- then [_writeGlobalParam(key, x)]
500+ then {
501+ let ensureValidPairs = match _getRegistryEntryValue(key) {
502+ case t: Int =>
503+ true
504+ case _ =>
505+ throw("invalid key-value pair")
506+ }
507+ if ((ensureValidPairs == ensureValidPairs))
508+ then [_writeGlobalParam(key, x)]
509+ else throw("Strict value is not equal to itself.")
510+ }
499511 else throw("Strict value is not equal to itself.")
500512 case x: Unit =>
501513 let validateKey = _throwIf((_getS(key) == unit), (("key " + key) + " not recognized"))
507519 case strType: String =>
508520 if ((size(strType) == size(stringValue)))
509521 then _validateAddress(stringValue)
510- else _validateAsset(stringValue)
522+ else if (_validateAsset(stringValue))
523+ then true
524+ else throw("string type for value not supported")
511525 case _ =>
512- throw("value type not supported")
526+ throw("type for value not supported")
513527 }
514528 if ((check4 == check4))
515529 then [_writeGlobalParam(key, stringValue)]
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "_"
55
66 let _minLockperiod = 1
77
88 let _unitDecimals = 100000000
99
1010 let _minLockAmount = (1 * _unitDecimals)
1111
1212 let _maxLockAmount = (1000 * _unitDecimals)
1313
1414 let _Dt = 86400000
1515
1616 func _Ppy (lockPeriod) = fraction(_unitDecimals, 365, lockPeriod)
1717
1818
1919 let _incrementRef = (1000000 * _unitDecimals)
2020
2121 let _percentageFee = fraction(_unitDecimals, 10, 100)
2222
2323 let _percentageReductionFactor = "Current_PercentageReduction_Factor_For_Mr"
2424
2525 let _Mr = "Minting_Rate"
2626
2727 let _stawAssetId = "Staw_AssetId"
2828
2929 let _manager = "manager"
3030
3131 let _Dfx = "Dfx"
3232
3333 let _circulationIncrIndex = "CirculationIncrementIndex"
3434
3535 let _lesseeAddress = "LeaseNode"
3636
3737 let _userEmissionAmountClaimed = "EmissionAmountClaimed"
3838
3939 let _userCanClaimEmissionAmount = "CanClaimEmissionAmount"
4040
4141 let _userAddress = "WalletAddress"
4242
4343 let _userLocalIndexCount = "TotalEntryIndexCount"
4444
4545 let _userTotalLocked = "TotalLocked"
4646
4747 let _lockDuration = "LockDuration"
4848
4949 let _lockIndex = "GlobalLockIndex"
5050
5151 let _lockId = "LockIdentifier"
5252
5353 let _wavesAmount = "AmountInWaves"
5454
5555 let _stawAmount = "AmountInStaw"
5656
5757 let _stawLPAmount = "AmountInStawLP"
5858
5959 let _txId = "TXID"
6060
6161 let _lockAtHeight = "LockAtHeight"
6262
6363 let _lockPeriodInMiliSec = "LocKPeriodInMilliSec"
6464
6565 let _totalWavesClaimed = "TotalWavesClaimed"
6666
6767 let _userLeaseState = "LeaseState"
6868
6969 let _totalStaw = "TotalStawMinted"
7070
7171 let _totalWavesRef = "TotalWavesLocked"
7272
7373 let _totalStawLP = "TotalStawLP"
7474
7575 let _globalIndexCount = "IndexCount"
7676
7777 func _getI (key) = getInteger(this, key)
7878
7979
8080 func _getS (key) = getString(this, key)
8181
8282
8383 func _getB (key) = getBoolean(this, key)
8484
8585
8686 func _getBV (key) = value(getBoolean(this, key))
8787
8888
8989 func _getIV (key) = value(getInteger(this, key))
9090
9191
9292 func _getSV (key) = value(getString(this, key))
9393
9494
9595 func _setParamVal (key,defaultVal) = match defaultVal {
9696 case defaultVal: String =>
9797 if (isDefined(_getS(key)))
9898 then _getSV(key)
9999 else defaultVal
100100 case defaultVal: Int =>
101101 if (isDefined(_getI(key)))
102102 then _getIV(key)
103103 else defaultVal
104104 case defaultVal: Boolean =>
105105 if (isDefined(_getB(key)))
106106 then _getBV(key)
107107 else defaultVal
108108 case _ =>
109109 throw(("value type not supported for " + key))
110110 }
111111
112112
113113 func _throwOrReturnS (val,error) = match val {
114114 case val: String =>
115115 val
116116 case _ =>
117117 throw(error)
118118 }
119119
120120
121121 func _throwOrReturnI (val,error) = match val {
122122 case val: Int =>
123123 val
124124 case _ =>
125125 throw(error)
126126 }
127127
128128
129129 func _throwOrReturnBool (val,error) = match val {
130130 case val: Boolean =>
131131 val
132132 case _ =>
133133 throw(error)
134134 }
135135
136136
137137 func _writeInt (key,value) = if ((0 > value))
138138 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
139139 else IntegerEntry(key, value)
140140
141141
142142 func _writeStr (key,value) = if ((" " == value))
143143 then throw(("writing an empty string " + value))
144144 else StringEntry(key, value)
145145
146146
147147 func _throwIf (condition,error) = if (condition)
148148 then throw(error)
149149 else true
150150
151151
152152 func _writeGlobalParam (key,_value) = match _value {
153153 case _value: Int =>
154154 let entry = makeString(["%d", toString(_value)], SEP)
155155 _writeStr(key, entry)
156156 case _value: String =>
157157 let entry = makeString(["%s", _value], SEP)
158158 _writeStr(key, entry)
159159 case _value: Boolean =>
160160 let entry = makeString(["%b", toString(_value)], SEP)
161161 _writeStr(key, entry)
162162 case _ =>
163163 throw("type not supported")
164164 }
165165
166166
167167 func _getRegistryEntryValue (key) = {
168168 let _rawValue = _throwOrReturnS(_getS(key), "entry not found")
169169 if ((_rawValue == _rawValue))
170170 then {
171171 let x = split(_rawValue, SEP)
172172 let formatSpecifier = takeRight(x[0], 1)
173173 let _valueString = x[(size(x) - 1)]
174174 let _value = if ((formatSpecifier == "s"))
175175 then _valueString
176176 else if ((formatSpecifier == "d"))
177177 then parseIntValue(_valueString)
178178 else if ((formatSpecifier == "b"))
179179 then fromBase58String(_valueString)
180180 else throw(("could not parse registry value for " + key))
181181 _value
182182 }
183183 else throw("Strict value is not equal to itself.")
184184 }
185185
186186
187187 func _daysToMiliSec (days) = {
188188 let check = _throwIf((0 >= days), "invalid locking days!")
189189 if ((check == check))
190190 then (days * _Dt)
191191 else throw("Strict value is not equal to itself.")
192192 }
193193
194194
195195 func _writeConstString (key,value) = if (!(isDefined(_getS(key))))
196196 then _writeStr(key, value)
197197 else throw(("entry already initialized: " + key))
198198
199199
200200 func _writeConstInteger (key,value) = if (!(isDefined(_getS(key))))
201201 then _writeInt(key, value)
202202 else throw((" entry already initialized: " + key))
203203
204204
205205 func _onlyManager (i) = {
206206 let manager = match _getRegistryEntryValue(_manager) {
207207 case val: String =>
208208 val
209209 case _ =>
210210 "failed to get manager"
211211 }
212212 if ((manager == manager))
213213 then _throwIf((toBase58String(i.caller.bytes) != manager), "address not authorized")
214214 else throw("Strict value is not equal to itself.")
215215 }
216216
217217
218218 func _abs (val) = if ((0 > val))
219219 then -(val)
220220 else val
221221
222222
223223 func _validateAddress (address) = match address {
224224 case address: String =>
225225 let _address = addressFromString(address)
226226 match _address {
227227 case _address: Address =>
228228 true
229229 case _ =>
230230 throw("invalid address")
231231 }
232232 case address: ByteVector =>
233233 let _address = addressFromPublicKey(address)
234234 match _address {
235235 case _address: Address =>
236236 true
237237 case _ =>
238238 throw("invalid public key")
239239 }
240240 case _ =>
241241 throw("invalid input type")
242242 }
243243
244244
245245 func _validateAsset (assetID) = match assetInfo(fromBase58String(assetID)) {
246246 case asset: Asset =>
247247 true
248248 case _ =>
249- throw(("invalid asset id: " + assetID))
249+ false
250250 }
251251
252252
253253 func _computeMr () = {
254254 let currentCircIndex = match _getRegistryEntryValue(_circulationIncrIndex) {
255255 case t: Int =>
256256 t
257257 case _ =>
258258 throw("circulation index not previously defined")
259259 }
260260 if ((currentCircIndex == currentCircIndex))
261261 then {
262262 let stawAssetId = match _getRegistryEntryValue(_stawAssetId) {
263263 case t: String =>
264264 t
265265 case _ =>
266266 throw("asset id not previously defined")
267267 }
268268 if ((stawAssetId == stawAssetId))
269269 then {
270270 let stawCirculatingSupply = match assetInfo(fromBase58String(stawAssetId)) {
271271 case asset: Asset =>
272272 asset.quantity
273273 case _ =>
274274 throw(("asset not found for " + stawAssetId))
275275 }
276276 let unitIncrement = (_abs((stawCirculatingSupply - _incrementRef)) / _incrementRef)
277277 let newCirculationIncrIndex = if ((unitIncrement > currentCircIndex))
278278 then (unitIncrement + currentCircIndex)
279279 else currentCircIndex
280280 let currentMr = match _getRegistryEntryValue(_Mr) {
281281 case t: Int =>
282282 t
283283 case _ =>
284284 throw("failed to get miniting rate")
285285 }
286286 if ((newCirculationIncrIndex == currentCircIndex))
287287 then $Tuple2(currentMr, nil)
288288 else {
289289 let newreductionFactor = match _getRegistryEntryValue(_percentageReductionFactor) {
290290 case t: Int =>
291291 t
292292 case _ =>
293293 throw("failed to get percentage reduction factor")
294294 }
295295 let newCurrentMr = (currentMr - fraction(currentMr, newreductionFactor, 100))
296296 let store1 = _writeGlobalParam(_Mr, newCurrentMr)
297297 let store2 = _writeGlobalParam(_percentageReductionFactor, newreductionFactor)
298298 let store3 = _writeGlobalParam(_circulationIncrIndex, newCirculationIncrIndex)
299299 $Tuple2(newCurrentMr, [store1, store2, store3])
300300 }
301301 }
302302 else throw("Strict value is not equal to itself.")
303303 }
304304 else throw("Strict value is not equal to itself.")
305305 }
306306
307307
308308 func _updateGlobalEntry (wavesAmount,stawAmount,stawPL,indexCount) = {
309309 let _newGlobalTotalWavesAmtRef = match _getRegistryEntryValue(_totalWavesRef) {
310310 case t: Int =>
311311 (t + wavesAmount)
312312 case _ =>
313313 throw("failed to get global total waves")
314314 }
315315 if ((_newGlobalTotalWavesAmtRef == _newGlobalTotalWavesAmtRef))
316316 then {
317317 let _newGlobalTotalStawMinted = match _getRegistryEntryValue(_totalStaw) {
318318 case t: Int =>
319319 (t + stawAmount)
320320 case _ =>
321321 throw("failed to get global total staw minted")
322322 }
323323 if ((_newGlobalTotalStawMinted == _newGlobalTotalStawMinted))
324324 then {
325325 let _newGlobalTotalStawPL = match _getRegistryEntryValue(_totalStawLP) {
326326 case t: Int =>
327327 (t + stawPL)
328328 case _ =>
329329 throw("failed to get global total stawpl")
330330 }
331331 if ((_newGlobalTotalStawPL == _newGlobalTotalStawPL))
332332 then {
333333 let _newGlobaIndexCount = match _getRegistryEntryValue(_globalIndexCount) {
334334 case t: Int =>
335335 (t + indexCount)
336336 case _ =>
337337 throw("failed to get global index count")
338338 }
339339 if ((_newGlobaIndexCount == _newGlobaIndexCount))
340340 then [_writeGlobalParam(_totalWavesRef, _newGlobalTotalWavesAmtRef), _writeGlobalParam(_totalStaw, _newGlobalTotalStawMinted), _writeGlobalParam(_totalStawLP, _newGlobalTotalStawPL), _writeGlobalParam(_globalIndexCount, _newGlobaIndexCount)]
341341 else throw("Strict value is not equal to itself.")
342342 }
343343 else throw("Strict value is not equal to itself.")
344344 }
345345 else throw("Strict value is not equal to itself.")
346346 }
347347 else throw("Strict value is not equal to itself.")
348348 }
349349
350350
351351 func _registerUserEntry (transactionID,userAddress,lockDuration,lockDurationInMili,lockIndex,wavesAmount,stawAmount,stawLPAmount,lockAtHeight,lockId,totalLocked,localIndexCount,leaseState) = {
352352 let _txIdKey = makeString([userAddress, transactionID, _txId], SEP)
353353 let _lockDurationKey = makeString([userAddress, transactionID, _lockDuration], SEP)
354354 let _lockIndexKey = makeString([userAddress, transactionID, _lockIndex], SEP)
355355 let _wavesAmountKey = makeString([userAddress, transactionID, _wavesAmount], SEP)
356356 let _stawAmountKey = makeString([userAddress, transactionID, _stawAmount], SEP)
357357 let _stawLPAmountKey = makeString([userAddress, transactionID, _stawLPAmount], SEP)
358358 let _lockAtHeightKey = makeString([userAddress, transactionID, _lockAtHeight], SEP)
359359 let _lockIdKey = makeString([userAddress, transactionID, _lockId], SEP)
360360 let _totalLockedKey = makeString([userAddress, _userTotalLocked], SEP)
361361 let _localLockIndexKey = makeString([userAddress, _userLocalIndexCount], SEP)
362362 let _lockPeriodInMiliSecKey = makeString([userAddress, transactionID, _lockPeriodInMiliSec], SEP)
363363 let _totalWavesClaimedKey = makeString([userAddress, transactionID, _totalWavesClaimed], SEP)
364364 let _userLeaseStateKey = makeString([userAddress, transactionID, _userLeaseState], SEP)
365365 let trxIdEntry = makeString(["%s", transactionID], SEP)
366366 let lockDurationEntry = makeString(["%d", toString(lockDuration)], SEP)
367367 let lockIndexEntry = makeString(["%d", toString(lockIndex)], SEP)
368368 let wavesAmountEntry = makeString(["%d", toString(wavesAmount)], SEP)
369369 let stawAmountEntry = makeString(["%d", toString(stawAmount)], SEP)
370370 let stawLPAmountEntry = makeString(["%d", toString(stawLPAmount)], SEP)
371371 let lockAtHeightEntry = makeString(["%d", toString(lockAtHeight)], SEP)
372372 let lockIdEntry = makeString(["%b", lockId], SEP)
373373 let totalLockedEntry = makeString(["%d", toString(totalLocked)], SEP)
374374 let userLocalIndexEntry = makeString(["%d", toString(localIndexCount)], SEP)
375375 let lockPeriodInMiliSecEntry = makeString(["%d", toString(lockDurationInMili)], SEP)
376376 let totalWavesClaimedEntry = makeString(["%d", toString(0)], SEP)
377377 let userLeaseStateEntry = makeString(["%s", leaseState], SEP)
378378 [_writeConstString(_txIdKey, trxIdEntry), _writeConstString(_lockIndexKey, lockIndexEntry), _writeStr(_localLockIndexKey, userLocalIndexEntry), _writeStr(_totalLockedKey, totalLockedEntry), _writeConstString(_lockDurationKey, lockDurationEntry), _writeConstString(_lockPeriodInMiliSecKey, lockPeriodInMiliSecEntry), _writeConstString(_wavesAmountKey, wavesAmountEntry), _writeConstString(_stawAmountKey, stawAmountEntry), _writeStr(_stawLPAmountKey, stawLPAmountEntry), _writeStr(_totalWavesClaimedKey, totalWavesClaimedEntry), _writeConstString(_lockAtHeightKey, lockAtHeightEntry), _writeConstString(_lockIdKey, lockIdEntry), _writeStr(_userLeaseStateKey, userLeaseStateEntry)]
379379 }
380380
381381
382382 func _stawMF (lockPeriod,collateralWaves) = {
383383 let _adjustedMr = _computeMr()
384384 let ret = (fraction(_unitDecimals, (_Dt * _adjustedMr._1), _Ppy(lockPeriod)) * collateralWaves)
385385 if ((size(_adjustedMr._2) == 0))
386386 then $Tuple2(ret, nil)
387387 else $Tuple2(ret, _adjustedMr._2)
388388 }
389389
390390
391391 func _emissionRateWaves (lockPeriod,collateral) = {
392392 let extensionFactor = fraction(lockPeriod, 15, 10)
393393 ((collateral / ((lockPeriod * extensionFactor) - lockPeriod)) * _Dt)
394394 }
395395
396396
397397 func _incrTotalStawLP (amount) = {
398398 let oldStawLP = _throwOrReturnI(_getI(_totalStawLP), "could not get the running StawLP")
399399 [_writeInt(_totalStawLP, (oldStawLP + amount))]
400400 }
401401
402402
403403 func _decrTotalStawLP (amount) = {
404404 let oldStawLP = _throwOrReturnI(_getI(_totalStawLP), "could not get the running StawLP")
405405 [_writeInt(_totalStawLP, (oldStawLP - amount))]
406406 }
407407
408408
409409 func _incrTotalWavesRef (amount) = {
410410 let oldWavesRef = _throwOrReturnI(_getI(_totalWavesRef), "could not get total locked waves")
411411 [_writeInt(_totalWavesRef, (oldWavesRef + amount))]
412412 }
413413
414414
415415 func _decrTotalWavesRef (amount) = {
416416 let oldWavesRef = _throwOrReturnI(_getI(_totalWavesRef), "could not get total locked waves")
417417 [_writeInt(_totalWavesRef, (oldWavesRef - amount))]
418418 }
419419
420420
421421 func _getNewTimeStamp (blockHeight) = {
422422 let time = match blockInfoByHeight(blockHeight) {
423423 case timeInfo: BlockInfo =>
424424 timeInfo.timestamp
425425 case _ =>
426426 throw("counld get timestamp")
427427 }
428428 time
429429 }
430430
431431
432432 @Callable(i)
433433 func getEmission (lockPeriod,collateral) = {
434434 let check1 = _onlyManager(i)
435435 if ((check1 == check1))
436436 then $Tuple2(nil, _emissionRateWaves(lockPeriod, collateral))
437437 else throw("Strict value is not equal to itself.")
438438 }
439439
440440
441441
442442 @Callable(i)
443443 func init (manager,dfx,assetID,leaseNode) = {
444444 let managerAlreadyExists = if (isDefined(_getS(_manager)))
445445 then _onlyManager(i)
446446 else true
447447 if ((managerAlreadyExists == managerAlreadyExists))
448448 then {
449449 let check1 = _validateAddress(manager)
450450 if ((check1 == check1))
451451 then {
452452 let check2 = _validateAddress(dfx)
453453 if ((check2 == check2))
454454 then {
455455 let check3 = _validateAddress(leaseNode)
456456 if ((check3 == check3))
457457 then {
458- let check4 = _validateAsset(assetID)
458+ let check4 = if (_validateAsset(assetID))
459+ then true
460+ else throw("invalid asset Id")
459461 if ((check4 == check4))
460462 then {
461463 let circulationIndex = _setParamVal(_circulationIncrIndex, 0)
462464 let percentageReductionInMr = _setParamVal(_percentageReductionFactor, 0)
463465 let Mr = _setParamVal(_Mr, _unitDecimals)
464466 let totalStawMinted = _setParamVal(_totalStaw, 0)
465467 let totalStawLPInCirculation = _setParamVal(_totalStawLP, 0)
466468 let globalIndexCount = _setParamVal(_globalIndexCount, 0)
467469 let totalWavesRef = _setParamVal(_totalWavesRef, 0)
468470 [_writeGlobalParam(_manager, manager), _writeGlobalParam(_Dfx, dfx), _writeGlobalParam(_stawAssetId, assetID), _writeGlobalParam(_lesseeAddress, leaseNode), _writeGlobalParam(_circulationIncrIndex, circulationIndex), _writeGlobalParam(_Mr, Mr), _writeGlobalParam(_percentageReductionFactor, percentageReductionInMr), _writeGlobalParam(_totalWavesRef, totalWavesRef), _writeGlobalParam(_totalStawLP, totalStawLPInCirculation), _writeGlobalParam(_totalStaw, totalStawMinted)]
469471 }
470472 else throw("Strict value is not equal to itself.")
471473 }
472474 else throw("Strict value is not equal to itself.")
473475 }
474476 else throw("Strict value is not equal to itself.")
475477 }
476478 else throw("Strict value is not equal to itself.")
477479 }
478480 else throw("Strict value is not equal to itself.")
479481 }
480482
481483
482484
483485 @Callable(i)
484486 func modifyGlobalParams (val) = {
485487 let check1 = _onlyManager(i)
486488 if ((check1 == check1))
487489 then {
488490 let errorMsg = makeString(["got", "list size of", toString(size(val)), "but expected [global_key, value] pair"], " ")
489491 let check2 = _throwIf((size(val) != 2), errorMsg)
490492 if ((check2 == check2))
491493 then {
492494 let key = val[0]
493495 let valType = parseInt(val[1])
494496 match valType {
495497 case x: Int =>
496498 let validateKey = _throwIf((_getS(key) == unit), (("key " + key) + " not recognized"))
497499 if ((validateKey == validateKey))
498- then [_writeGlobalParam(key, x)]
500+ then {
501+ let ensureValidPairs = match _getRegistryEntryValue(key) {
502+ case t: Int =>
503+ true
504+ case _ =>
505+ throw("invalid key-value pair")
506+ }
507+ if ((ensureValidPairs == ensureValidPairs))
508+ then [_writeGlobalParam(key, x)]
509+ else throw("Strict value is not equal to itself.")
510+ }
499511 else throw("Strict value is not equal to itself.")
500512 case x: Unit =>
501513 let validateKey = _throwIf((_getS(key) == unit), (("key " + key) + " not recognized"))
502514 if ((validateKey == validateKey))
503515 then {
504516 let stringValue = val[1]
505517 let refAddress = _getRegistryEntryValue(_manager)
506518 let check4 = match refAddress {
507519 case strType: String =>
508520 if ((size(strType) == size(stringValue)))
509521 then _validateAddress(stringValue)
510- else _validateAsset(stringValue)
522+ else if (_validateAsset(stringValue))
523+ then true
524+ else throw("string type for value not supported")
511525 case _ =>
512- throw("value type not supported")
526+ throw("type for value not supported")
513527 }
514528 if ((check4 == check4))
515529 then [_writeGlobalParam(key, stringValue)]
516530 else throw("Strict value is not equal to itself.")
517531 }
518532 else throw("Strict value is not equal to itself.")
519533 case _ =>
520534 throw(("failed to modify " + val[0]))
521535 }
522536 }
523537 else throw("Strict value is not equal to itself.")
524538 }
525539 else throw("Strict value is not equal to itself.")
526540 }
527541
528542
529543
530544 @Callable(i)
531545 func revokeLock () = {
532546 let check1 = _onlyManager(i)
533547 if ((check1 == check1))
534548 then nil
535549 else throw("Strict value is not equal to itself.")
536550 }
537551
538552
539553
540554 @Callable(i)
541555 func claim (transactionID) = {
542556 let callerAddress = toBase58String(i.caller.bytes)
543557 let collateralKey = makeString([callerAddress, transactionID, _wavesAmount], SEP)
544558 let lockperiodKey = makeString([callerAddress, transactionID, _lockDuration], SEP)
545559 let lockIdKey = makeString([callerAddress, transactionID, _lockId], SEP)
546560 let lockperiodInMiliKey = makeString([callerAddress, transactionID, _lockPeriodInMiliSec], SEP)
547561 let totalWavesClaimedKey = makeString([callerAddress, transactionID, _totalWavesClaimed], SEP)
548562 let stawLPAmountKey = makeString([callerAddress, transactionID, _stawLPAmount], SEP)
549563 let wavesAmountKey = makeString([callerAddress, transactionID, _wavesAmount], SEP)
550564 let userTotalWavesLockedKey = makeString([callerAddress, _userTotalLocked], SEP)
551565 let userLeaseStateKey = makeString([callerAddress, transactionID, _userLeaseState], SEP)
552566 let leaseStateKey = makeString([callerAddress, transactionID, _userLeaseState], SEP)
553567 let globalWavesRef = match _getRegistryEntryValue(_totalWavesRef) {
554568 case t: Int =>
555569 t
556570 case _ =>
557571 throw("failed to get global total waves")
558572 }
559573 if ((globalWavesRef == globalWavesRef))
560574 then {
561575 let globalStawPL = match _getRegistryEntryValue(_totalStawLP) {
562576 case t: Int =>
563577 t
564578 case _ =>
565579 throw("failed to get global total waves")
566580 }
567581 if ((globalStawPL == globalStawPL))
568582 then {
569583 let lockId = match _getRegistryEntryValue(lockIdKey) {
570584 case t: ByteVector =>
571585 t
572586 case _ =>
573587 throw("failed to get lease id")
574588 }
575589 if ((lockId == lockId))
576590 then {
577591 let userTotalWavesLocked = match _getRegistryEntryValue(userTotalWavesLockedKey) {
578592 case t: Int =>
579593 t
580594 case _ =>
581595 throw("failed to get total waves locked by this address")
582596 }
583597 if ((userTotalWavesLocked == userTotalWavesLocked))
584598 then {
585599 let wavesAmount = match _getRegistryEntryValue(wavesAmountKey) {
586600 case t: Int =>
587601 t
588602 case _ =>
589603 throw("failed to get total waves locked")
590604 }
591605 if ((wavesAmount == wavesAmount))
592606 then {
593607 let totalWavesClaimed = match _getRegistryEntryValue(totalWavesClaimedKey) {
594608 case t: Int =>
595609 t
596610 case _ =>
597611 throw("failed to get total waves claimed")
598612 }
599613 if ((totalWavesClaimed == totalWavesClaimed))
600614 then {
601615 let stawLPAmount = match _getRegistryEntryValue(stawLPAmountKey) {
602616 case t: Int =>
603617 t
604618 case _ =>
605619 throw("failed to get stawPL")
606620 }
607621 if ((stawLPAmount == stawLPAmount))
608622 then {
609623 let lockPeriodInMili = match _getRegistryEntryValue(lockperiodInMiliKey) {
610624 case t: Int =>
611625 t
612626 case _ =>
613627 throw("failed to get lock period timespam")
614628 }
615629 if ((lockPeriodInMili == lockPeriodInMili))
616630 then {
617631 let currentTimeStamp = match _getNewTimeStamp(height) {
618632 case t: Int =>
619633 t
620634 case _ =>
621635 throw("failed to get current timestamp")
622636 }
623637 if ((currentTimeStamp == currentTimeStamp))
624638 then {
625639 let collateral = match _getRegistryEntryValue(collateralKey) {
626640 case t: Int =>
627641 t
628642 case _ =>
629643 throw("failed to get collateral")
630644 }
631645 if ((collateral == collateral))
632646 then {
633647 let lockPeriod = match _getRegistryEntryValue(lockperiodKey) {
634648 case t: Int =>
635649 t
636650 case _ =>
637651 throw("failed to get lockPeriod")
638652 }
639653 if ((lockPeriod == lockPeriod))
640654 then {
641655 let currentLeaseState = match _getRegistryEntryValue(userLeaseStateKey) {
642656 case t: String =>
643657 t
644658 case _ =>
645659 throw("failed to get lease state")
646660 }
647661 if ((currentLeaseState == currentLeaseState))
648662 then {
649663 let leaseState = match _getRegistryEntryValue(leaseStateKey) {
650664 case t: String =>
651665 t
652666 case _ =>
653667 throw("failed to get lease state for user")
654668 }
655669 if ((leaseState == leaseState))
656670 then {
657671 let check1 = _throwIf((lockPeriodInMili > currentTimeStamp), "lock period for this entry has not elapsed")
658672 if ((check1 == check1))
659673 then {
660674 let leaseAction = if ((currentLeaseState == "leased"))
661675 then $Tuple2(LeaseCancel(lockId), _writeStr(userLeaseStateKey, "cancelled"))
662676 else $Tuple2(_writeStr(userLeaseStateKey, "cancelled"), _writeStr(userLeaseStateKey, "cancelled"))
663677 if ((leaseAction == leaseAction))
664678 then {
665679 let check2 = _throwIf(if ((0 == wavesAmount))
666680 then true
667681 else (0 == stawLPAmount), "all claims exhausted for this trx")
668682 if ((check2 == check2))
669683 then {
670684 let emissionValuePerDT = (_emissionRateWaves(lockPeriod, collateral) * _Dt)
671685 let claimAction = {
672686 let timeStampDiff = (currentTimeStamp - lockPeriodInMili)
673687 let daysAfterLockPeriodElasped = (timeStampDiff / _Dt)
674688 if ((daysAfterLockPeriodElasped == 0))
675689 then throw("less than 24hrs before first claim")
676690 else if (((timeStampDiff % _Dt) != 0))
677691 then throw("already claimed or less than 24hrs before next claim")
678692 else if ((daysAfterLockPeriodElasped > lockPeriod))
679693 then throw("all claims exhausted")
680694 else {
681695 let totalAmountClaimable = (daysAfterLockPeriodElasped * emissionValuePerDT)
682696 let check3_1 = _throwIf((totalAmountClaimable == totalWavesClaimed), "can only claim once in 24hrs")
683697 if ((check3_1 == check3_1))
684698 then {
685699 let check3_2 = _throwIf(((totalAmountClaimable + totalWavesClaimed) > wavesAmount), "all claims exhausted")
686700 if ((check3_2 == check3_2))
687701 then {
688702 let claimAmountToSend = if ((daysAfterLockPeriodElasped == 1))
689703 then totalAmountClaimable
690704 else (totalAmountClaimable - totalWavesClaimed)
691705 let newTotalWavesClaim = totalAmountClaimable
692706 let newWavesAmount = if ((daysAfterLockPeriodElasped == 1))
693707 then (wavesAmount - totalAmountClaimable)
694708 else (wavesAmount - (totalAmountClaimable - totalWavesClaimed))
695709 let newStawLPAmount = if ((daysAfterLockPeriodElasped == 1))
696710 then (stawLPAmount - totalAmountClaimable)
697711 else (stawLPAmount - (totalAmountClaimable - totalWavesClaimed))
698712 let newGlobalWaveRef = (globalWavesRef - newWavesAmount)
699713 let newGlobalStawPL = (globalStawPL - newStawLPAmount)
700714 let newUserTotalWavesLocked = (userTotalWavesLocked - claimAmountToSend)
701715 let wavesAmountEntry = makeString(["%d", toString(newWavesAmount)], SEP)
702716 let stawLPAmountEntry = makeString(["%d", toString(newStawLPAmount)], SEP)
703717 let totalWavesClaimedEntry = makeString(["%d", toString(newTotalWavesClaim)], SEP)
704718 let newUserTotalWavesLockedEntry = makeString(["%d", toString(newUserTotalWavesLocked)], SEP)
705719 [leaseAction._1, leaseAction._2, _writeStr(wavesAmountKey, wavesAmountEntry), _writeStr(stawLPAmountKey, stawLPAmountEntry), _writeStr(totalWavesClaimedKey, totalWavesClaimedEntry), _writeStr(userTotalWavesLockedKey, newUserTotalWavesLockedEntry), _writeGlobalParam(_totalWavesRef, newGlobalWaveRef), _writeGlobalParam(_totalStawLP, newGlobalStawPL), ScriptTransfer(Address(i.caller.bytes), claimAmountToSend, unit)]
706720 }
707721 else throw("Strict value is not equal to itself.")
708722 }
709723 else throw("Strict value is not equal to itself.")
710724 }
711725 }
712726 if ((claimAction == claimAction))
713727 then claimAction
714728 else throw("Strict value is not equal to itself.")
715729 }
716730 else throw("Strict value is not equal to itself.")
717731 }
718732 else throw("Strict value is not equal to itself.")
719733 }
720734 else throw("Strict value is not equal to itself.")
721735 }
722736 else throw("Strict value is not equal to itself.")
723737 }
724738 else throw("Strict value is not equal to itself.")
725739 }
726740 else throw("Strict value is not equal to itself.")
727741 }
728742 else throw("Strict value is not equal to itself.")
729743 }
730744 else throw("Strict value is not equal to itself.")
731745 }
732746 else throw("Strict value is not equal to itself.")
733747 }
734748 else throw("Strict value is not equal to itself.")
735749 }
736750 else throw("Strict value is not equal to itself.")
737751 }
738752 else throw("Strict value is not equal to itself.")
739753 }
740754 else throw("Strict value is not equal to itself.")
741755 }
742756 else throw("Strict value is not equal to itself.")
743757 }
744758 else throw("Strict value is not equal to itself.")
745759 }
746760 else throw("Strict value is not equal to itself.")
747761 }
748762
749763
750764
751765 @Callable(i)
752766 func mintStaw (lockPeriod) = {
753767 let callerAddress = toBase58String(i.caller.bytes)
754768 let trxID = toBase58String(i.transactionId)
755769 let check1 = _throwIf((1 != size(i.payments)), "no payments attached")
756770 if ((check1 == check1))
757771 then {
758772 let check2 = if (isDefined(i.payments[0].assetId))
759773 then throw("only waves supported")
760774 else true
761775 if ((check2 == check2))
762776 then {
763777 let amountInWaves = i.payments[0].amount
764778 let check3 = if (if ((_minLockAmount > amountInWaves))
765779 then true
766780 else (amountInWaves > _maxLockAmount))
767781 then throw("lock amount out of range, minimum: 1 waves, maximum: 1000 waves")
768782 else true
769783 if ((check3 == check3))
770784 then {
771785 let check4 = if ((_minLockperiod > lockPeriod))
772786 then throw("minimum of 14 days lock period")
773787 else true
774788 if ((check4 == check4))
775789 then {
776790 let totalStawMint = _stawMF(lockPeriod, amountInWaves)
777791 let stawPL = amountInWaves
778792 let fee = fraction(totalStawMint._1, 10, 100)
779793 let userGetStawAmount = (totalStawMint._1 - fee)
780794 let lockPeriodToMilisec = (_getNewTimeStamp(height) + _daysToMiliSec(lockPeriod))
781795 if ((lockPeriodToMilisec == lockPeriodToMilisec))
782796 then {
783797 let new_index = match _getRegistryEntryValue(_globalIndexCount) {
784798 case t: Int =>
785799 (t + 1)
786800 case _ =>
787801 throw("failed to get current global index count")
788802 }
789803 if ((new_index == new_index))
790804 then {
791805 let addressFee = match _getRegistryEntryValue(_Dfx) {
792806 case t: String =>
793807 Address(fromBase58String(t))
794808 case _ =>
795809 throw("failed to get dfx address")
796810 }
797811 if ((addressFee == addressFee))
798812 then {
799813 let stawAssetId = match _getRegistryEntryValue(_stawAssetId) {
800814 case t: String =>
801815 fromBase58String(t)
802816 case _ =>
803817 throw("failed to get asset id")
804818 }
805819 if ((stawAssetId == stawAssetId))
806820 then {
807821 let lessee = match _getRegistryEntryValue(_lesseeAddress) {
808822 case t: String =>
809823 Address(fromBase58String(t))
810824 case _ =>
811825 throw("failed to get lease node address")
812826 }
813827 if ((lessee == lessee))
814828 then {
815829 let userLockIndexKey = makeString([callerAddress, _userLocalIndexCount], SEP)
816830 let userTotalLockedKey = makeString([callerAddress, _userTotalLocked], SEP)
817831 let userIndexCount = match _getRegistryEntryValue(userLockIndexKey) {
818832 case x: Int =>
819833 (x + 1)
820834 case _ =>
821835 0
822836 }
823837 if ((userIndexCount == userIndexCount))
824838 then {
825839 let userTotalLocked = match _getRegistryEntryValue(userTotalLockedKey) {
826840 case x: Int =>
827841 (x + amountInWaves)
828842 case _ =>
829843 amountInWaves
830844 }
831845 if ((userTotalLocked == userTotalLocked))
832846 then {
833847 let leaseOut = Lease(lessee, amountInWaves)
834848 if ((leaseOut == leaseOut))
835849 then {
836850 let leaseIdStr = toBase58String(calculateLeaseId(leaseOut))
837851 if ((leaseIdStr == leaseIdStr))
838852 then ((([leaseOut, ScriptTransfer(addressFee, fee, stawAssetId), ScriptTransfer(Address(i.caller.bytes), userGetStawAmount, stawAssetId)] ++ _registerUserEntry(trxID, callerAddress, lockPeriod, lockPeriodToMilisec, new_index, amountInWaves, userGetStawAmount, stawPL, height, leaseIdStr, userTotalLocked, userIndexCount, "leased")) ++ _updateGlobalEntry(amountInWaves, totalStawMint._1, stawPL, new_index)) ++ totalStawMint._2)
839853 else throw("Strict value is not equal to itself.")
840854 }
841855 else throw("Strict value is not equal to itself.")
842856 }
843857 else throw("Strict value is not equal to itself.")
844858 }
845859 else throw("Strict value is not equal to itself.")
846860 }
847861 else throw("Strict value is not equal to itself.")
848862 }
849863 else throw("Strict value is not equal to itself.")
850864 }
851865 else throw("Strict value is not equal to itself.")
852866 }
853867 else throw("Strict value is not equal to itself.")
854868 }
855869 else throw("Strict value is not equal to itself.")
856870 }
857871 else throw("Strict value is not equal to itself.")
858872 }
859873 else throw("Strict value is not equal to itself.")
860874 }
861875 else throw("Strict value is not equal to itself.")
862876 }
863877 else throw("Strict value is not equal to itself.")
864878 }
865879
866880

github/deemru/w8io/169f3d6 
84.52 ms