2023.12.19 17:43 [3959622] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "8e8HrE5nV2B1FG5BNKfsTWynyzVzm1dhnYgLwWcZrWfY", "fee": 3100000, "feeAssetId": null, "timestamp": 1702997016714, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "4bUU4WPs2pbcVdnYURwQgEBibq5p4w4fkzhUpbo2GzAAzDtR56EcMRPdhJiXJa28CSho9Tk7s9x5Xm3499qJwSm5" ], "script": "base64:BgKRAQgCEgMKAQgSBAoCCAQSBQoDCAQIEgMKAQgSBAoCCAESABIAEgQKAggBEgQKAggBEgMKAQgSBAoCCAESAwoBCBIECgIIARIECgIIARIECgIIARIECgIBBBIFCgMIAQQSBAoCBAQSAwoBCBIECgIBBBIAEgQKAggEEgASBAoCCAESAwoBCBIAEgQKAggIEgMKAQg5AAtmYWN0b3JzQmFzZQDoBwEDZkNpAwV2YWx1ZQludW1lcmF0b3ILZGVub21pbmF0b3IEBGNhbmQJAGsDBQV2YWx1ZQUJbnVtZXJhdG9yBQtkZW5vbWluYXRvcgQBRACz5pOoCwQFZXhhY3QJAAACCQBqAgkAaAIJAGoCBQRjYW5kBQFECQBqAgULZGVub21pbmF0b3IFAUQFAUQJAGoCCQBoAgkAagIFBXZhbHVlBQFECQBqAgUJbnVtZXJhdG9yBQFEBQFEAwUFZXhhY3QFBGNhbmQJAGQCBQRjYW5kAAEBC3B1cmVBc3NldElkAQdhc3NldElkBAFpCQCRAwIJALUJAgUHYXNzZXRJZAIBXwAAAwkAAAIFAWkCBVdBVkVTBQR1bml0CQDZBAEFAWkBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIDbToxAQZhc0ludDMBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAg8oSW50LCBJbnQsIEludCkEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgEyARFhc1VzZXJCYWxhbmNlRGF0YQEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACIihJbnQsIEludCwgSW50LCBJbnQsIEludCwgQm9vbGVhbikEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgEzAAtjb25maWdTdG9yZQIGY29uZmlnAAVhVElkUwIIYVRva2VuSWQABGFJZFMCB2Fzc2V0SWQADWNvbmZpZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFC2NvbmZpZ1N0b3JlAAttYXliZUxvY2tlcgkAnQgCBQ1jb25maWdBZGRyZXNzAglscF9sb2NrZXIAC3Jlc2VydmVzU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIQcHJpbWFyeV9yZXNlcnZlcwIWbm8gcmVzZXJ2ZXMgcmVnaXN0ZXJlZAAIcmVzZXJ2ZXMJALwJAgULcmVzZXJ2ZXNTdHICAXwAFWlnbm9yZVZhbGlkYXRpb25Vc2VycwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhtpZ25vcmVfdmFsaWRhdGlvbl9hZGRyZXNzZXMCIzNQODRldlhTV01jaFlNYTZoa0xMUm1RNHVzSGY0Y05zak5wAANlYlIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAgplYl9yZXdhcmRzAg1ubyBlYl9yZXdhcmRzAAt2aXJlc01pbnRlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAgx2aXJlc19taW50ZXICFG1haW46IG5vIHZpcmVzTWludGVyAgpiYWQgbWludGVyAAdtYXliZXZTCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHZpcmVzX3N0YWtlcgACdlMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUHbWF5YmV2UwIPbm8gdmlyZXNfc3Rha2VyAAJkQwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhJkaXZpZGVuZHNfY29udHJhY3QCFW5vIGRpdmlkZW5kc19jb250cmFjdAIHYmFkIGRpdgADbVZEBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEXZpcmVzX2Rpc3RyaWJ1dG9yAwkAAQIFByRtYXRjaDACBlN0cmluZwQBZAUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBZAUEdW5pdAACVkQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUDbVZEAghubyBkaXN0cgAHbGltaXRlcgQHJG1hdGNoMAkAnQgCBQ1jb25maWdBZGRyZXNzAgdsaW1pdGVyAwkAAQIFByRtYXRjaDACBlN0cmluZwQBZAUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBZAUEdW5pdAARbWF5YmVWaXJlc0Fzc2V0SWQJAJ0IAgULdmlyZXNNaW50ZXIFBGFJZFMADHZpcmVzQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgURbWF5YmVWaXJlc0Fzc2V0SWQCC25vIHZpcmVzIGlkAhBpbnZhbGlkIHZpcmVzIGlkAQx2aXJlc1BheW1lbnQBAWkDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAAAAADCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDHZpcmVzQXNzZXRJZAkAAgECCW5vdCB2aXJlcwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQBEGFzc2V0SWRPZlJlc2VydmUBA3JzcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFA3JzcgUEYUlkUwIRbm8gYXNzZXRJZCBpbiByc3IBEGNvbGxhdGVyYWxGYWN0b3IBA3JzcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MJAKwCAgkBEGFzc2V0SWRPZlJlc2VydmUBBQNyc3ICEV9Db2xsYXRlcmFsRmFjdG9yAgRubyAxARRsaXF1aWRhdGlvblRocmVzaG9sZAEDcnNyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwkArAICCQEQYXNzZXRJZE9mUmVzZXJ2ZQEFA3JzcgIVX0xpcXVpZGF0aW9uVGhyZXNob2xkAgRubyAyABZhY2NvdW50SGVhbHRoVGhyZXNob2xkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwIYYWNjb3VudF9oZWFsdGhfdGhyZXNob2xkAgRubyA0ABRhY2NvdW50SGVhbHRoT3ZlcmxhcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFmFjY291bnRfaGVhbHRoX292ZXJsYXACBG5vIDUAC2xpcXVpZGF0b3JzCQELdmFsdWVPckVsc2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCC2xpcXVpZGF0b3JzAgABCXJlc2VydmVCeQIFc3RvcmUFdmFsdWUKAQRmb2xkAgFhAXIEByRtYXRjaDAFAWEDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQFZm91bmQFByRtYXRjaDAFBWZvdW5kBANyc3IJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFyAg9yc3IgYmFkIGFkZHJlc3MDCQAAAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFA3JzcgUFc3RvcmUJAKwCAgILcnNyIGhhcyBubyAFBXN0b3JlBQV2YWx1ZQUDcnNyBQR1bml0BAckbWF0Y2gwCgACJGwFCHJlc2VydmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUEdW5pdAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEBWZvdW5kBQckbWF0Y2gwBQVmb3VuZAkAAgEJAKwCAgIIdW5rbm93biAFBXN0b3JlAQN2bFIBAXIDCQEIY29udGFpbnMCBQtyZXNlcnZlc1N0cgUBcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAXICDW1haW46IGJhZCByc3IJAAIBCQCsAgICDHVua25vd24gcnNyOgUBcgELdXNlckJhbGFuY2UCA3JzcgR1c2VyCQERYXNVc2VyQmFsYW5jZURhdGEBCQD8BwQFA3JzcgILdXNlckJhbGFuY2UJAMwIAgUEdXNlcgUDbmlsBQNuaWwADm1heWJlUHJvdGVjdGVkBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEXByb3RlY3RlZF9yZXNlcnZlAwkAAQIFByRtYXRjaDACBlN0cmluZwQDcGRzBQckbWF0Y2gwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUDcGRzAg1iYWQgcHJvdGVjdGVkBQR1bml0ABBwcm90ZWN0ZWRSZXNlcnZlCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDm1heWJlUHJvdGVjdGVkAhBubyBwcm90ZWN0ZWQgcnNyABxwcm9oaWJpdGVkQ29sbGF0ZXJhbFJlc2VydmVzBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCHHByb2hpYml0ZWRDb2xsYXRlcmFsUmVzZXJ2ZXMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMCAXwFA25pbAEdZW5zdXJlTm9Qcm9oaWJpdGVkQ29sbGF0ZXJhbHMBBHVzZXIKAQhmb2xkRnVuYwIBYRFwcm9oaWJpdGVkUmVzZXJ2ZQQDYXRiCQELdmFsdWVPckVsc2UCCQCaCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXByb2hpYml0ZWRSZXNlcnZlCQCsAgIFBHVzZXICDl9hVG9rZW5CYWxhbmNlAAADCQBmAgUDYXRiAAEJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICJm9wZXJhdGlvbiBkZW5pZWQ6IHVzZXIgaGFzIGRlcG9zaXQgaW4gBRFwcm9oaWJpdGVkUmVzZXJ2ZQICOiAJAKQDAQUDYXRiAgsobHAgdG9rZW5zKQYEG2Vuc3VyZU5vUHJvdGVjdGVkVVNETm9yRVVSTgQDYW55CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBRBwcm90ZWN0ZWRSZXNlcnZlCQCsAgICOHVzZXJTaGFyZXNfREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHBfBQR1c2VyAAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUQcHJvdGVjdGVkUmVzZXJ2ZQkArAICAjh1c2VyU2hhcmVzX0RVazJZVHhoUm9BcU1KTHVzNEcyYjNmUjhoTUhWaDZlaXlGeDVyMjlWUjZ0XwUEdXNlcgAAAwkAZgIFA2FueQAACQACAQIwaGFzIG5vbi1ib3Jyb3dhYmxlIE5ldXRyaW5vIGFzc2V0cyBhcyBjb2xsYXRlcmFsBgoAAiRsBRxwcm9oaWJpdGVkQ29sbGF0ZXJhbFJlc2VydmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUbZW5zdXJlTm9Qcm90ZWN0ZWRVU0ROb3JFVVJOCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEmVuc3VyZU5vUHJvaGliaXRlZAMEdXNlcgNicHUHcmVzZXJ2ZQMDCQAAAgUDYnB1AAAGCQEJaXNEZWZpbmVkAQkAzwgCBRxwcm9oaWJpdGVkQ29sbGF0ZXJhbFJlc2VydmVzBQdyZXNlcnZlBgkBHWVuc3VyZU5vUHJvaGliaXRlZENvbGxhdGVyYWxzAQUEdXNlcgERZW5zdXJlTm9Qcm90ZWN0ZWQBBHVzZXIEA2hhcwQHJG1hdGNoMAUObWF5YmVQcm90ZWN0ZWQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQCcGEFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUCcGEJAKwCAgIVcHJvdGVjdGVkX2NvbGxhdGVyYWxfBQR1c2VyBwcDBQNoYXMJAAIBAgpkaXNhbGxvd2VkBQR1bml0AQtlbnN1cmVMaW1pdAQGYWN0aW9uA3JzcgR1c2VyBmFtb3VudAQHJG1hdGNoMAUHbGltaXRlcgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFsBQckbWF0Y2gwCQEFYXNJbnQBCQD8BwQFAWwCDXZhbGlkYXRlTGltaXQJAMwIAgUGYWN0aW9uCQDMCAIJAKUIAQUDcnNyCQDMCAIFBHVzZXIJAMwIAgUGYW1vdW50BQNuaWwFA25pbAYBCXVzZXJQb3dlcgEEdXNlcgQQcHJvdGVjdGVkRGVwb3NpdAQHJG1hdGNoMAUObWF5YmVQcm90ZWN0ZWQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQCcGEFByRtYXRjaDAJAQVhc0ludAEJAPwHBAUCcGECC2JvcnJvd1Bvd2VyCQDMCAIFBHVzZXIFA25pbAUDbmlsAAAKAQRmb2xkAgZ0b3RhbHMBcgQLJHQwOTIyNzkyNzMFBnRvdGFscwQGdG90YWxECAULJHQwOTIyNzkyNzMCXzEEBnRvdGFsQggFCyR0MDkyMjc5MjczAl8yBA9udW1iZXJPZkJvcnJvd3MIBQskdDA5MjI3OTI3MwJfMwQDcnNyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUBcgIPcnNyIGJhZCBhZGRyZXNzBAJjZgkBEGNvbGxhdGVyYWxGYWN0b3IBBQNyc3IEAmx0CQEUbGlxdWlkYXRpb25UaHJlc2hvbGQBBQNyc3IECyR0MDk0Mjc5NTExCQELdXNlckJhbGFuY2UCBQNyc3IFBHVzZXIEBXRva2VuCAULJHQwOTQyNzk1MTECXzEEBWFzc2V0CAULJHQwOTQyNzk1MTECXzIECmRlcG9zaXRVc2QIBQskdDA5NDI3OTUxMQJfMwQEZGVidAgFCyR0MDk0Mjc5NTExAl80BAdkZWJ0VXNkCAULJHQwOTQyNzk1MTECXzUEDGFzQ29sbGF0ZXJhbAgFCyR0MDk0Mjc5NTExAl82BAx0b3RhbEJvcnJvd3MJAGQCBQ9udW1iZXJPZkJvcnJvd3MDCQBmAgUEZGVidAAAAAEAAAQTZWZmZWN0aXZlRGVwb3NpdFVzZAMFDGFzQ29sbGF0ZXJhbAUKZGVwb3NpdFVzZAAABApvdmVybGFwVXNkCQCXAwEJAMwIAgUHZGVidFVzZAkAzAgCBRNlZmZlY3RpdmVEZXBvc2l0VXNkBQNuaWwEDW92ZXJsYXBDaGFyZ2UJAQNmQ2kDBQpvdmVybGFwVXNkBRRhY2NvdW50SGVhbHRoT3ZlcmxhcAULZmFjdG9yc0Jhc2UDCQBmAgUHZGVidFVzZAUTZWZmZWN0aXZlRGVwb3NpdFVzZAkAlQoDBQZ0b3RhbEQJAGQCCQBkAgUGdG90YWxCCQBrAwkAZQIFB2RlYnRVc2QFE2VmZmVjdGl2ZURlcG9zaXRVc2QFC2ZhY3RvcnNCYXNlBQJsdAUNb3ZlcmxhcENoYXJnZQUMdG90YWxCb3Jyb3dzCQCVCgMJAGQCBQZ0b3RhbEQJAGsDCQBlAgUTZWZmZWN0aXZlRGVwb3NpdFVzZAUHZGVidFVzZAUCY2YFC2ZhY3RvcnNCYXNlCQBkAgUGdG90YWxCBQ1vdmVybGFwQ2hhcmdlBQx0b3RhbEJvcnJvd3MEAXIKAAIkbAUIcmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFEHByb3RlY3RlZERlcG9zaXQAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQDAwkAZgIFEHByb3RlY3RlZERlcG9zaXQAAAkAZgIIBQFyAl8zAAQHCQACAQIeY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gNCBib3Jyb3dzBQFyAQ1nZXRVc2VySGVhbHRoAQdhY2NvdW50BA0kdDAxMDI2NjEwMzE3CQEGYXNJbnQzAQkBCXVzZXJQb3dlcgEFB2FjY291bnQEAmJwCAUNJHQwMTAyNjYxMDMxNwJfMQQDYnB1CAUNJHQwMTAyNjYxMDMxNwJfMgQGaWdub3JlCAUNJHQwMTAyNjYxMDMxNwJfMwkArAICCQCsAgIJAKwCAgIDYnA6CQCkAwEFAmJwAgYsIGJwdToJAKQDAQUDYnB1AQ12YWxpZGF0ZUFmdGVyAgR1c2VyAm9wBA0kdDAxMDQyOTEwNDYwCQEJdXNlclBvd2VyAQUEdXNlcgQCYnAIBQ0kdDAxMDQyOTEwNDYwAl8xBANicHUIBQ0kdDAxMDQyOTEwNDYwAl8yBAlhY2NIZWFsdGgJAGkCCQBoAgkAZQIFAmJwBQNicHUFC2ZhY3RvcnNCYXNlBQJicAMDCQAAAgUCYnAAAAkAAAIFA2JwdQAABwAAAwMJAAACBQJicAAACQBmAgUDYnB1AAAHCQACAQkArAICCQCsAgIFAm9wAiw6IGJyZWFjaGluZyBsaXF1aWRhdGlvbiB0aHJlc2hvbGQoYnA9MCwgYnB1PQkApAMBBQNicHUDCQBmAgUWYWNjb3VudEhlYWx0aFRocmVzaG9sZAUJYWNjSGVhbHRoCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQJvcAIlOiBicmVhY2hpbmcgbGlxdWlkYXRpb24gdGhyZXNob2xkKGJwPQkApAMBBQJicAIGLCBicHU9CQCkAwEFA2JwdQIJLCBoZWFsdGg9CQCkAwEFCWFjY0hlYWx0aAIBKQUDYnB1AQJ1UwUDcnNyBmFjdGlvbgR1c2VyCnVzZXJDaGFuZ2UMc3RyZWFtQ2hhbmdlBAckbWF0Y2gwBQNtVkQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAkA/AcEBQFhAghvbkFjdGlvbgkAzAgCBQNyc3IJAMwIAgUGYWN0aW9uCQDMCAIFBHVzZXIJAMwIAgUKdXNlckNoYW5nZQkAzAgCBQxzdHJlYW1DaGFuZ2UFA25pbAUDbmlsBQR1bml0AQptb3ZlU3RyZWFtBQNyc3IGYWN0aW9uBGZyb20Gc3RyaW5nA2FtdAQHJG1hdGNoMAUDbVZEAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAJAPwHBAUBYQIEbW92ZQkAzAgCBQNyc3IJAMwIAgUGYWN0aW9uCQDMCAIFBGZyb20JAMwIAgUGc3RyaW5nCQDMCAIFA2FtdAUDbmlsBQNuaWwFBHVuaXQBAnNSAQNyc3IEByRtYXRjaDAFA21WRAMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwCQD8BwQFAWECCnN5bmNIZWlnaHQJAMwIAgUDcnNyBQNuaWwFA25pbAUEdW5pdAEMbG9ja09yUGF5b3V0AwlyZWNpcGllbnQDYW10BGxvY2sDCQEBIQEFBGxvY2sJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUJcmVjaXBpZW50BQNhbXQFDHZpcmVzQXNzZXRJZAUDbmlsBAZkb0xvY2sJAPwHBAUCZEMCB2xvY2tGb3IJAMwIAgkApQgBBQlyZWNpcGllbnQJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHZpcmVzQXNzZXRJZAUDYW10BQNuaWwDCQAAAgUGZG9Mb2NrBQZkb0xvY2sFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEJZG9EZXBvc2l0AwFpA3JzcgVhc0NvbAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkBEWVuc3VyZU5vUHJvdGVjdGVkAQUEdXNlcgMJAAACBQZjaGVja3MFBmNoZWNrcwQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEBmFjdGlvbgkA/AcECQEDdmxSAQUDcnNyAgpkZXBvc2l0Rm9yCQDMCAIFBHVzZXIJAMwIAgUFYXNDb2wFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUGYWN0aW9uBQZhY3Rpb24EA2FtdAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEA3BSdwkBAnVTBQUDcnNyAgdkZXBvc2l0BQR1c2VyBQNhbXQFA2FtdAMJAAACBQNwUncFA3BSdwQCdmEDCQEBIQEFBWFzQ29sCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICCmRlcG9zaXRpbmcAAAMJAAACBQJ2YQUCdmEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAOcmV3YXJkUmVzZXJ2ZXMJALwJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCE3Jld2FyZGFibGVfcmVzZXJ2ZXMCCW5vIHN0cmluZwIBfAEWY2xhaW1BbGxSZXdhcmRzRm9yVXNlcgEEdXNlcgQJY2xhaW1lZEViCQEFYXNJbnQBCQD8BwQFA2ViUgIQY2xhaW1FYlJld2FyZEZvcgkAzAgCBQR1c2VyCQDMCAIA////////////AQUDbmlsBQNuaWwDCQAAAgUJY2xhaW1lZEViBQljbGFpbWVkRWIKAQRmb2xkAgNhY2MDcnNyBAdjbGFpbWVkCQEFYXNJbnQBCQD8BwQFAlZEAg5jbGFpbVJld2FyZEZvcgkAzAgCBQNyc3IJAMwIAgUEdXNlcgkAzAgCAP///////////wEFA25pbAUDbmlsAwkAAAIFB2NsYWltZWQFB2NsYWltZWQJAGQCBQNhY2MFB2NsYWltZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDGNsYWltZWRUb3RhbAoAAiRsBQ5yZXdhcmRSZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUCQBkAgUMY2xhaW1lZFRvdGFsBQljbGFpbWVkRWIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGGNsYWltQWxsTHBSZXdhcmRzRm9yVXNlcgEEdXNlcgQHJG1hdGNoMAULbWF5YmVMb2NrZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBAZsb2NrZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFzAh9iYWQgbHBfbG9ja2VyIGFkZHJlc3MgaW4gY29uZmlnCgEEZm9sZAIDYWNjA3JzcgQIYVRva2VuSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQNyc3IFBWFUSWRTAhZubyBhVG9rZW5JZCBpbiByZXNlcnZlBAdjbGFpbWVkCQEFYXNJbnQBCQD8BwQFBmxvY2tlcgIQY2xhaW1McFJld2FyZEZvcgkAzAgCBQR1c2VyCQDMCAIFCGFUb2tlbklkCQDMCAIA////////////AQUDbmlsBQNuaWwDCQAAAgUHY2xhaW1lZAUHY2xhaW1lZAkAZAIFA2FjYwUHY2xhaW1lZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQMY2xhaW1lZFRvdGFsCgACJGwFDnJld2FyZFJlc2VydmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQFDGNsYWltZWRUb3RhbAAAAQ5tb3ZlQ29sbGF0ZXJhbAQEYWRkcghhc3NldFN0cgNyc3IKcmVzZXJ2ZVN0cgQDYW10CQEFYXNJbnQBCQD8BwQFEHByb3RlY3RlZFJlc2VydmUCDndpdGhkcmF3VG9NYWluCQDMCAIFBGFkZHIJAMwIAgUIYXNzZXRTdHIFA25pbAUDbmlsAwkAAAIFA2FtdAUDYW10BANkZXAJAPwHBAUDcnNyAgpkZXBvc2l0Rm9yCQDMCAIFBGFkZHIJAMwIAgYFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBC3B1cmVBc3NldElkAQUIYXNzZXRTdHIFA2FtdAUDbmlsAwkAAAIFA2RlcAUDZGVwBARwcm9wCQECdVMFBQpyZXNlcnZlU3RyAgdkZXBvc2l0BQRhZGRyBQNhbXQFA2FtdAMJAAACBQRwcm9wBQRwcm9wBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQRzcGZyAAkA/AcEBQJkQwIXc2hhcmVQcm9maXRGcm9tUmVzZXJ2ZXMFA25pbAUDbmlsAQp3ZEludGVybmFsBAR1c2VyA3JzcgNhbXQCb3AEAnNoCQECc1IBCQClCAEFA3JzcgMJAAACBQJzaAUCc2gED3dpdGhkcmF3bkFtb3VudAkBBWFzSW50AQkA/AcEBQNyc3IFAm9wCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQ93aXRoZHJhd25BbW91bnQFD3dpdGhkcmF3bkFtb3VudAQDcFJ3CQECdVMFCQClCAEFA3JzcgIHZGVwb3NpdAUEdXNlcgkBAS0BBQ93aXRoZHJhd25BbW91bnQJAQEtAQUPd2l0aGRyYXduQW1vdW50AwkAAAIFA3BSdwUDcFJ3BAFlCQELZW5zdXJlTGltaXQEAgh3aXRoZHJhdwUDcnNyBQR1c2VyBQ93aXRoZHJhd25BbW91bnQDCQAAAgUBZQUBZQUPd2l0aGRyYXduQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdyZXBheVdpdGhBdG9rZW5JbnRlcm5hbAIEdXNlcgdwYXltZW50BAhhVG9rZW5JZAkA2AQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQdwYXltZW50B2Fzc2V0SWQCHmJhZCBhc3NldElkOiB3YXZlcyBub3QgYWxsb3dlZAQBdAkBCXJlc2VydmVCeQIFBWFUSWRTBQhhVG9rZW5JZAQCc2gJAQJzUgEJAKUIAQUBdAMJAAACBQJzaAUCc2gEA2FtdAkBBWFzSW50AQkA/AcEBQF0Ah5yZXBsZW5pc2hGb3JSZXBheVdpdGhBdG9rZW5Gb3IJAMwIAgUEdXNlcgUDbmlsCQDMCAIFB3BheW1lbnQFA25pbAMJAAACBQNhbXQFA2FtdAQBYwkBBWFzSW50AQkA/AcEBQF0AhFjb2xsYXBzZUZvckFtb3VudAkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYwUBYwMJAGYCBQNhbXQFAWMJAAIBAhFyZXBheWluZyB0b28gbXVjaAQDcFJ3CQECdVMFCQClCAEFAXQCBmJvcnJvdwUEdXNlcgkBAS0BBQFjCQEBLQEFAWMDCQAAAgUDcFJ3BQNwUncEBHBSdzIJAQJ1UwUJAKUIAQUBdAIHZGVwb3NpdAUEdXNlcgkAZQIFA2FtdAUBYwkBAS0BBQFjAwkAAAIFBHBSdzIFBHBSdzIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhwBaQEKaW5pdGlhbGl6ZQECY2EJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCBQtjb25maWdTdG9yZQUCY2EFA25pbAFpAQdkZXBvc2l0AgNyc3IFYXNDb2wJAQlkb0RlcG9zaXQDBQFpBQNyc3IFBWFzQ29sAWkBCmRlcG9zaXRSZWYDA3JzcgVhc0NvbANyZWYJAQlkb0RlcG9zaXQDBQFpBQNyc3IFBWFzQ29sAWkBBXJlcGF5AQNyc3IEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAJzaAkBAnNSAQUDcnNyAwkAAAIFAnNoBQJzaAQGcmVwYWlkCQEFYXNJbnQBCQD8BwQJAQN2bFIBBQNyc3ICCHJlcGF5Rm9yCQDMCAIFBHVzZXIFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUGcmVwYWlkBQZyZXBhaWQEA3BSdwkBAnVTBQUDcnNyAgZib3Jyb3cFBHVzZXIJAQEtAQUGcmVwYWlkCQEBLQEFBnJlcGFpZAMJAAACBQNwUncFA3BSdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCm1pbnRBdG9rZW4CCGFUb2tlbklkA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAXQJAQlyZXNlcnZlQnkCBQVhVElkUwUIYVRva2VuSWQEAnNoCQECc1IBCQClCAEFAXQDCQAAAgUCc2gFAnNoBAZhY3R1YWwJAQVhc0ludAEJAPwHBAUBdAINbWludEF0b2tlbkZvcgkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUGYWN0dWFsBQZhY3R1YWwEA3BSdwkBAnVTBQkApQgBBQF0AgdkZXBvc2l0BQR1c2VyCQEBLQEFBmFjdHVhbAAAAwkAAAIFA3BSdwUDcFJ3BANicHUJAQVhc0ludAEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIHbWludGluZwMJAAACBQNicHUFA2JwdQQCcGMJARJlbnN1cmVOb1Byb2hpYml0ZWQDBQR1c2VyBQNicHUJAKUIAQUBdAMJAAACBQJwYwUCcGMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNyZXBsZW5pc2hXaXRoQXRva2VuAAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkBEWVuc3VyZU5vUHJvdGVjdGVkAQUEdXNlcgMJAAACBQZjaGVja3MFBmNoZWNrcwQIYVRva2VuSWQJANgEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCDmJhZCBhc3NldElkKHcpBANyc3IJAQlyZXNlcnZlQnkCBQVhVElkUwUIYVRva2VuSWQEAnNoCQECc1IBCQClCAEFA3JzcgMJAAACBQJzaAUCc2gEA2FtdAkBBWFzSW50AQkA/AcEBQNyc3ICFnJlcGxlbmlzaFdpdGhBdG9rZW5Gb3IJAMwIAgUEdXNlcgUDbmlsCAUBaQhwYXltZW50cwMJAAACBQNhbXQFA2FtdAQDcFJ3CQECdVMFCQClCAEFA3JzcgIHZGVwb3NpdAUEdXNlcgUDYW10AAADCQAAAgUDcFJ3BQNwUncEAWUJAQtlbnN1cmVMaW1pdAQCBmltcG9ydAUDcnNyBQR1c2VyBQNhbXQDCQAAAgUBZQUBZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXJlZGVlbUF0b2tlbnMABAR1c2VyCQClCAEIBQFpBmNhbGxlcgQIYVRva2VuSWQJANgEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCEmJhZCBhc3NldElkOiBXQVZFUwQDcnNyCQEJcmVzZXJ2ZUJ5AgUFYVRJZFMFCGFUb2tlbklkBAJzaAkBAnNSAQkApQgBBQNyc3IDCQAAAgUCc2gFAnNoBANhbXQJAQVhc0ludAEJAPwHBAUDcnNyAhByZWRlZW1BdG9rZW5zRm9yCQDMCAIFBHVzZXIFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUDYW10BQNhbXQEA3BSdwkBAnVTBQkApQgBBQNyc3ICB2RlcG9zaXQFBHVzZXIAAAkBAS0BBQNhbXQDCQAAAgUDcFJ3BQNwUncEAWUJAQtlbnN1cmVMaW1pdAQCBnJlZGVlbQUDcnNyBQR1c2VyBQNhbXQDCQAAAgUBZQUBZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Agdhc3NldElkA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAXIJAQlyZXNlcnZlQnkCBQRhSWRTBQdhc3NldElkBAZyZXN1bHQJAQVhc0ludAEJAQp3ZEludGVybmFsBAUEdXNlcgUBcgUDYW10Agt3aXRoZHJhd0ZvcgMJAAACBQZyZXN1bHQFBnJlc3VsdAQDYnB1CQEFYXNJbnQBCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICC3dpdGhkcmF3aW5nAwkAAAIFA2JwdQUDYnB1BAJwYwkBEmVuc3VyZU5vUHJvaGliaXRlZAMFBHVzZXIFA2JwdQkApQgBBQFyAwkAAAIFAnBjBQJwYwkAlAoCBQNuaWwFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQl3aXRoZHJhdzICA3JzcgNhbXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAJzaAkBAnNSAQUDcnNyAwkAAAIFAnNoBQJzaAQHcnNyQWRkcgkBA3ZsUgEFA3JzcgQGYWN0dWFsCQEFYXNJbnQBCQD8BwQFB3JzckFkZHICC3dpdGhkcmF3Rm9yCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQZhY3R1YWwFBmFjdHVhbAQDcFJ3CQECdVMFBQNyc3ICB2RlcG9zaXQFBHVzZXIJAQEtAQUGYWN0dWFsCQEBLQEFBmFjdHVhbAMJAAACBQNwUncFA3BSdwQDYnB1AwkBCGNvbnRhaW5zAgULbGlxdWlkYXRvcnMFBHVzZXIAAAQBZQkBC2Vuc3VyZUxpbWl0BAIId2l0aGRyYXcFB3JzckFkZHIFBHVzZXIFBmFjdHVhbAMJAAACBQFlBQFlCQEFYXNJbnQBCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICDHdpdGhkcmF3aW5nMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQCcGMJARJlbnN1cmVOb1Byb2hpYml0ZWQDBQR1c2VyBQNicHUFA3JzcgMJAAACBQJwYwUCcGMJAJQKAgUDbmlsBQZhY3R1YWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERcHJvdGVjdENvbGxhdGVyYWwBA3JzcgQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAXIJAQN2bFIBBQNyc3IEA2FtdAkBBWFzSW50AQkBCndkSW50ZXJuYWwEBQR1c2VyBQFyAP///////////wECDndpdGhkcmF3VG9NYWluAwkAAAIFA2FtdAUDYW10BAphc3NldElkU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQFyBQRhSWRTBAFwCQD8BwQFEHByb3RlY3RlZFJlc2VydmUCCXN1cHBseUZvcgkAzAgCBQR1c2VyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQtwdXJlQXNzZXRJZAEFCmFzc2V0SWRTdHIFA2FtdAUDbmlsAwkAAAIFAXAFAXAJAJQKAgUDbmlsBQNhbXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEbd2l0aGRyYXdQcm90ZWN0ZWRDb2xsYXRlcmFsAgdhc3NldElkA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWEJAQVhc0ludAEJAPwHBAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRBwcm90ZWN0ZWRSZXNlcnZlAhNubyBwcm90ZWN0ZWRSZXNlcnZlAgt3aXRoZHJhd0ZvcgkAzAgCBQR1c2VyCQDMCAIFB2Fzc2V0SWQJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFhBQFhAwkBCGNvbnRhaW5zAgUVaWdub3JlVmFsaWRhdGlvblVzZXJzBQR1c2VyBQNuaWwEAnZhCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICFXdpdGhkcmF3aW5nIHByb3RlY3RlZAMJAAACBQJ2YQUCdmEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNub3JtYWxpemVDb2xsYXRlcmFsAQNyc3IEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAJyQQkBA3ZsUgEFA3JzcgMJAAACBQJyQQUCckEEAnNoCQECc1IBBQNyc3IDCQAAAgUCc2gFAnNoBAphc3NldElkU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCckEFBGFJZFMJAKwCAgITbm8gYXNzZXRJZCBpbiByc3Y6IAUDcnNyBAJtYwkBDm1vdmVDb2xsYXRlcmFsBAUEYWRkcgUKYXNzZXRJZFN0cgUCckEFA3JzcgMJAAACBQJtYwUCbWMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQZib3Jyb3cCB2Fzc2V0SWQDYW10BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQDcnNyCQEJcmVzZXJ2ZUJ5AgUEYUlkUwUHYXNzZXRJZAQCc2gJAQJzUgEJAKUIAQUDcnNyAwkAAAIFAnNoBQJzaAQBYQkA/AcEBQNyc3ICCWJvcnJvd0ZvcgkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYQUBYQQDcFJ3CQECdVMFCQClCAEFA3JzcgIGYm9ycm93BQR1c2VyBQNhbXQFA2FtdAMJAAACBQNwUncFA3BSdwQBZQkBC2Vuc3VyZUxpbWl0BAIGYm9ycm93BQNyc3IFBHVzZXIFA2FtdAMJAAACBQFlBQFlBANicHUJAQVhc0ludAEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIJYm9ycm93aW5nAwkAAAIFA2JwdQUDYnB1BAJwYwkBHWVuc3VyZU5vUHJvaGliaXRlZENvbGxhdGVyYWxzAQUEdXNlcgMJAAACBQJwYwUCcGMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdib3Jyb3cyAgNyc3IDYW10BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBcgkBA3ZsUgEFA3JzcgQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEAWEJAPwHBAUBcgIJYm9ycm93Rm9yCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFhBQFhBANwUncJAQJ1UwUFA3JzcgIGYm9ycm93BQR1c2VyBQNhbXQFA2FtdAMJAAACBQNwUncFA3BSdwQBZQkBC2Vuc3VyZUxpbWl0BAIGYm9ycm93BQFyBQR1c2VyBQNhbXQDCQAAAgUBZQUBZQQDYnB1CQEFYXNJbnQBCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICCWJvcnJvd2luZwMJAAACBQNicHUFA2JwdQQCcGMJAR1lbnN1cmVOb1Byb2hpYml0ZWRDb2xsYXRlcmFscwEFBHVzZXIDCQAAAgUCcGMFAnBjBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIY29sbGFwc2UCA3JzcgNhbXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAJzaAkBAnNSAQUDcnNyAwkAAAIFAnNoBQJzaAQBYwkBBWFzSW50AQkA/AcECQEDdmxSAQUDcnNyAhFjb2xsYXBzZUZvckFtb3VudAkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYwUBYwQDcFJ3CQECdVMFBQNyc3ICBmJvcnJvdwUEdXNlcgkBAS0BBQFjCQEBLQEFAWMDCQAAAgUDcFJ3BQNwUncEBHBSdzIJAQJ1UwUFA3JzcgIHZGVwb3NpdAUEdXNlcgkBAS0BBQFjCQEBLQEFAWMDCQAAAgUEcFJ3MgUEcFJ3MgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltRWJSZXdhcmQyAgNhbXQEbG9jawQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWMJAQVhc0ludAEJAPwHBAUDZWJSAhBjbGFpbUViUmV3YXJkRm9yCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFjBQFjCQEMbG9ja09yUGF5b3V0AwgFAWkGY2FsbGVyBQFjBQRsb2NrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGNsYWltUmV3YXJkMgMDcnNyA2FtdARsb2NrBAF2CQEDdmxSAQUDcnNyAwkAAAIFAXYFAXYEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFjCQEFYXNJbnQBCQD8BwQFAlZEAg5jbGFpbVJld2FyZEZvcgkAzAgCBQNyc3IJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFAWMFAWMJAQxsb2NrT3JQYXlvdXQDCAUBaQZjYWxsZXIFAWMFBGxvY2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEhY2xhaW1BbGxSZXdhcmRzQW5kQWxsRWJBdmFpbGFibGUyAgRsb2NrDXVuc3Rha2VMZWdhY3kEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAJjcgkBFmNsYWltQWxsUmV3YXJkc0ZvclVzZXIBBQR1c2VyAwkAAAIFAmNyBQJjcgQEY3JMcAkBGGNsYWltQWxsTHBSZXdhcmRzRm9yVXNlcgEFBHVzZXIDCQAAAgUEY3JMcAUEY3JMcAQCbEEDBQ11bnN0YWtlTGVnYWN5CQEFYXNJbnQBCQD8BwQFAnZTAhN1bnN0YWtlQWxsVmlyZXNGcm9tCQDMCAIFBHVzZXIFA25pbAUDbmlsAAADCQAAAgUCbEEFAmxBCQEMbG9ja09yUGF5b3V0AwgFAWkGY2FsbGVyCQBkAgkAZAIFAmNyBQRjckxwBQJsQQUEbG9jawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZkaXNhYmxlVXNlQXNDb2xsYXRlcmFsAQNyc3IEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFkCQD8BwQJAQN2bFIBBQNyc3ICGWRpc2FibGVVc2VBc0NvbGxhdGVyYWxGb3IJAMwIAgUEdXNlcgUDbmlsBQNuaWwDCQAAAgUBZAUBZAQCdmEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIaY2hhbmdpbmcgY29sbGF0ZXJhbCBzdGF0dXMDCQAAAgUCdmEFAnZhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJbG9ja1ZpcmVzAgZmYWN0b3IHbWlncmF0ZQQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWEJAQRzcGZyAAMJAAACBQFhBQFhBA1taWdyYXRlQW1vdW50AwUHbWlncmF0ZQkBBWFzSW50AQkA/AcEBQJ2UwITdW5zdGFrZUFsbFZpcmVzRnJvbQkAzAgCBQR1c2VyBQNuaWwFA25pbAAABAV0b3RhbAkAZAIFDW1pZ3JhdGVBbW91bnQJAQx2aXJlc1BheW1lbnQBBQFpBAFsCQD8BwQFAmRDAgdsb2NrRm9yCQDMCAIFBHVzZXIJAMwIAgUGZmFjdG9yBQNuaWwDCQAAAgUFdG90YWwAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQx2aXJlc0Fzc2V0SWQFBXRvdGFsBQNuaWwDCQAAAgUBbAUBbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGHdpdGhkcmF3QWxsUG9zc2libGVWaXJlcwAEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFhCQEEc3BmcgADCQAAAgUBYQUBYQQRc3Rha2VyVmlyZXNBbW91bnQJAQVhc0ludAEJAPwHBAUCdlMCE3Vuc3Rha2VBbGxWaXJlc0Zyb20JAMwIAgUEdXNlcgUDbmlsBQNuaWwDCQAAAgURc3Rha2VyVmlyZXNBbW91bnQFEXN0YWtlclZpcmVzQW1vdW50BAF1CQD8BwQFAmRDAhN3aXRoZHJhd1VubG9ja2VkRm9yCQDMCAIFBHVzZXIFA25pbAUDbmlsAwkAAAIFAXUFAXUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRFzdGFrZXJWaXJlc0Ftb3VudAUMdmlyZXNBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXY2xhaW1Qcm90b2NvbFByb2ZpdEZyb20CBGZyb20GcmVsb2NrBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBYQkBBHNwZnIAAwkAAAIFAWEFAWEEAXUJAPwHBAUCZEMCC2NsYWltUHJvZml0CQDMCAIFBGZyb20JAMwIAgUEdXNlcgkAzAgCBQZyZWxvY2sFA25pbAUDbmlsAwkAAAIFAXUFAXUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARV3aXRoZHJhd1VubG9ja2VkVmlyZXMABAFhCQEEc3BmcgADCQAAAgUBYQUBYQQBdQkA/AcEBQJkQwITd2l0aGRyYXdVbmxvY2tlZEZvcgkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUBdQUBdQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmxvY2tTdXBwbHkCB3Jlc2VydmUGcGVyaW9kBAFkCQACAQIGZGVuaWVkAwkAAAIFAWQFAWQEA3JzcgkBA3ZsUgEFB3Jlc2VydmUEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAZjaGVja3MJARFlbnN1cmVOb1Byb3RlY3RlZAEFBHVzZXIDCQAAAgUGY2hlY2tzBQZjaGVja3MECGFUb2tlbklkCQEFdmFsdWUBCQELcHVyZUFzc2V0SWQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUDcnNyAghhVG9rZW5JZAIWbm8gYVRva2VuSWQgaW4gcmVzZXJ2ZQQJbWlncmF0aW9uAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAUEdW5pdAMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFCGFUb2tlbklkBQR1bml0AwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBC3B1cmVBc3NldElkAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFA3JzcgUEYUlkUwIVbm8gYXNzZXRJZCBpbiByZXNlcnZlBAJzaAkBAnNSAQUHcmVzZXJ2ZQMJAAACBQJzaAUCc2gEBmFjdGlvbgkA/AcEBQNyc3ICCmRlcG9zaXRGb3IJAMwIAgUEdXNlcgkAzAgCBgUDbmlsCAUBaQhwYXltZW50cwMJAAACBQZhY3Rpb24FBmFjdGlvbgQDYW10CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQDcFJ3CQECdVMFBQdyZXNlcnZlAgdkZXBvc2l0BQR1c2VyBQNhbXQFA2FtdAMJAAACBQNwUncFA3BSdwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECEmJhZCBhc3NldCBhdHRhY2hlZAMJAAACBQltaWdyYXRpb24FCW1pZ3JhdGlvbgQEbWludAQCc2gJAQJzUgEFB3Jlc2VydmUDCQAAAgUCc2gFAnNoBAZhY3R1YWwJAQVhc0ludAEJAPwHBAUDcnNyAg9taW50QXRva2VuRm9yVG8JAMwIAgUEdXNlcgkAzAgCAP///////////wEJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAACBQZhY3R1YWwFBmFjdHVhbAQDcFJ3CQECdVMFCQClCAEFA3JzcgIHZGVwb3NpdAUEdXNlcgkBAS0BBQZhY3R1YWwAAAMJAAACBQNwUncFA3BSdwQCdmEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIMbG9jay1taW50aW5nAwkAAAIFAnZhBQJ2YQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBG1pbnQFBG1pbnQEB2JhbGFuY2UJAPAHAgUEdGhpcwUIYVRva2VuSWQEAXIJAPwHBAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgULbWF5YmVMb2NrZXICFm5vIGxwX2xvY2tlciBpbiBjb25maWcCH2JhZCBscF9sb2NrZXIgYWRkcmVzcyBpbiBjb25maWcCBmxvY2tMUAkAzAgCBQR1c2VyCQDMCAIFBnBlcmlvZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhhVG9rZW5JZAUHYmFsYW5jZQUDbmlsAwkAAAIFAXIFAXIJAJQKAgUDbmlsBQdiYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnJlcGF5V2l0aEF0b2tlbkZvcgEEdXNlcgQGY2hlY2tzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQR1c2VyCQACAQIIYmFkIHVzZXIGAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEXcmVwYXlXaXRoQXRva2VuSW50ZXJuYWwCBQR1c2VyCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPcmVwYXlXaXRoQXRva2VuAAkBF3JlcGF5V2l0aEF0b2tlbkludGVybmFsAgkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAAFpAQhyZXBheUZvcgIDcnNyBHVzZXIEBmNoZWNrcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUEdXNlcgkAAgECCGJhZCB1c2VyBgMJAAACBQZjaGVja3MFBmNoZWNrcwQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEBnJlcGFpZAkBBWFzSW50AQkA/AcECQEDdmxSAQUDcnNyAghyZXBheUZvcgkAzAgCBQR1c2VyBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFBnJlcGFpZAUGcmVwYWlkBANwUncJAQJ1UwUFA3JzcgIGYm9ycm93BQR1c2VyCQEBLQEFBnJlcGFpZAkBAS0BBQZyZXBhaWQDCQAAAgUDcFJ3BQNwUncFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhoZWFsdGhPZgEHYWRkcmVzcwQNJHQwMjQ2MTQyNDY2NQkBBmFzSW50MwEJAQl1c2VyUG93ZXIBBQdhZGRyZXNzBAJicAgFDSR0MDI0NjE0MjQ2NjUCXzEEA2JwdQgFDSR0MDI0NjE0MjQ2NjUCXzIEBmlnbm9yZQgFDSR0MDI0NjE0MjQ2NjUCXzMJAJQKAgUDbmlsCQCUCgIFAmJwBQNicHUBAnR4AQZ2ZXJpZnkABBJtYXliZU9yYWNsZUFkZHJlc3MEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIOb3JhY2xlX2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQEBkhFSUdIVAUGaGVpZ2h0BARCQVNFAOgHBAtxdW9ydW1SYXRpbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFXByb3Bvc2FsX3F1b3J1bV9yYXRpbwIicHJvcG9zYWxRdW9ydW1SYXRpbyBpcyBub3QgZGVmaW5lZAQLcGFzc2VkUmF0aW8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhVwcm9wb3NhbF9wYXNzZWRfcmF0aW8CJXByb3Bvc2FsVGhyZXNob2xkUmF0aW8gaXMgbm90IGRlZmluZWQEDmdWaXJlc0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kc19jb250cmFjdAIVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AhppbnZhbGlkIGRpdmlkZW5kc19jb250cmFjdAQOdm90aW5nQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIPdm90aW5nX2NvbnRyYWN0AhJubyB2b3RpbmdfY29udHJhY3QCF2ludmFsaWQgdm90aW5nX2NvbnRyYWN0BAJpZAkA2AQBCAUCdHgCaWQECHZvdGVzWWVzCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICDXByb3Bvc2FsX3llc18FAmlkAAAEB3ZvdGVzTm8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIMcHJvcG9zYWxfbm9fBQJpZAAABA5wcm9wb3NhbEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEHByb3Bvc2FsX2hlaWdodF8FAmlkAhdwcm9wb3NhbCBub3QgcmVnaXN0ZXJlZAQKYXBwbHlTdGFydAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhRwcm9wb3NhbF9hcHBseXN0YXJ0XwUCaWQAAAQIYXBwbHlFbmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIScHJvcG9zYWxfYXBwbHllbmRfBQJpZAAABAt0b3RhbEdWaXJlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhBwcm9wb3NhbF9ndmlyZXNfBQJpZAAABAdlbmFibGVkCQELdmFsdWVPckVsc2UCCQCbCAIFDWNvbmZpZ0FkZHJlc3MCHW9wX2dvdmVybmFuY2VfYXBwbHlfdHhfcGF1c2VkBwQHdm90ZVllcwUIdm90ZXNZZXMEBnZvdGVObwUHdm90ZXNObwQKdG90YWxWb3RlcwkAZAIFB3ZvdGVZZXMFBnZvdGVObwQJaGFzUXVvcnVtCQBnAgkAaQIJAGgCBQp0b3RhbFZvdGVzBQRCQVNFBQt0b3RhbEdWaXJlcwULcXVvcnVtUmF0aW8ECWhhc1Bhc3NlZAkAZwIJAGkCCQBoAgUHdm90ZVllcwUEQkFTRQUKdG90YWxWb3RlcwULcGFzc2VkUmF0aW8ECHRvb0Vhcmx5CQBnAgUKYXBwbHlTdGFydAUGSEVJR0hUBAd0b29MYXRlCQBnAgUGSEVJR0hUBQhhcHBseUVuZAQJdGltZURlYnVnCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEXByb3Bvc2FsSGVpZ2h0ID0gCQCkAwEFDnByb3Bvc2FsSGVpZ2h0Ag8sIGFwcGx5U3RhcnQgPSAJAKQDAQUKYXBwbHlTdGFydAINLCBhcHBseUVuZCA9IAkApAMBBQhhcHBseUVuZAILLCBIRUlHSFQgPSAJAKQDAQUGSEVJR0hUBAhieVZvdGluZwMJAQEhAQUHZW5hYmxlZAkAAgECK3R4IGFwcGxpY2F0aW9uIHRocm93IGdvdmVybmFuY2Ugbm90IGVuYWJsZWQDBQh0b29FYXJseQkAAgEJAKwCAgIucHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gZWFybHk6IAUJdGltZURlYnVnAwUHdG9vTGF0ZQkAAgEJAKwCAgIscHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gbGF0ZToFCXRpbWVEZWJ1ZwMJAQEhAQUJaGFzUXVvcnVtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgILbm8gcXVvcnVtOiACDHRvdGFsVm90ZXM6IAkApAMBBQp0b3RhbFZvdGVzAg8sIHRvdGFsR1ZpcmVzOiAJAKQDAQULdG90YWxHVmlyZXMCDywgcXVvcnVtUmF0aW86IAkApAMBBQtxdW9ydW1SYXRpbwMJAQEhAQUJaGFzUGFzc2VkCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIXbm8gdGhyZXNob2xkIGFjaGlldmVkOiACCXZvdGVZZXM6IAkApAMBBQd2b3RlWWVzAgosIHZvdGVObzogCQCkAwEFBnZvdGVObwIPLCBwYXNzZWRSYXRpbzogCQCkAwEFC3Bhc3NlZFJhdGlvBgMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkGBQhieVZvdGluZ1KnZdo=", "chainId": 87, "height": 3959622, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GvEUf6wG56CYPTHvGeBbynFdJPQqwVqBoNUBbeuQtFmU Next: none Diff:
OldNewDifferences
10071007
10081008 @Callable(i)
10091009 func lockSupply (reserve,period) = {
1010- let rsr = vlR(reserve)
1011- let user = toString(i.caller)
1012- let checks = ensureNoProtected(user)
1013- if ((checks == checks))
1010+ let d = throw("denied")
1011+ if ((d == d))
10141012 then {
1015- let aTokenId = value(pureAssetId(valueOrErrorMessage(getString(rsr, "aTokenId"), "no aTokenId in reserve")))
1016- let migration = if ((size(i.payments) == 0))
1017- then unit
1018- else if ((i.payments[0].assetId == aTokenId))
1019- then unit
1020- else if ((i.payments[0].assetId == pureAssetId(valueOrErrorMessage(getString(rsr, aIdS), "no assetId in reserve"))))
1021- then {
1022- let sh = sR(reserve)
1023- if ((sh == sh))
1013+ let rsr = vlR(reserve)
1014+ let user = toString(i.caller)
1015+ let checks = ensureNoProtected(user)
1016+ if ((checks == checks))
1017+ then {
1018+ let aTokenId = value(pureAssetId(valueOrErrorMessage(getString(rsr, "aTokenId"), "no aTokenId in reserve")))
1019+ let migration = if ((size(i.payments) == 0))
1020+ then unit
1021+ else if ((i.payments[0].assetId == aTokenId))
1022+ then unit
1023+ else if ((i.payments[0].assetId == pureAssetId(valueOrErrorMessage(getString(rsr, aIdS), "no assetId in reserve"))))
10241024 then {
1025- let action = invoke(rsr, "depositFor", [user, true], i.payments)
1026- if ((action == action))
1025+ let sh = sR(reserve)
1026+ if ((sh == sh))
10271027 then {
1028- let amt = i.payments[0].amount
1029- let pRw = uS(reserve, "deposit", user, amt, amt)
1030- if ((pRw == pRw))
1031- then unit
1028+ let action = invoke(rsr, "depositFor", [user, true], i.payments)
1029+ if ((action == action))
1030+ then {
1031+ let amt = i.payments[0].amount
1032+ let pRw = uS(reserve, "deposit", user, amt, amt)
1033+ if ((pRw == pRw))
1034+ then unit
1035+ else throw("Strict value is not equal to itself.")
1036+ }
10321037 else throw("Strict value is not equal to itself.")
10331038 }
10341039 else throw("Strict value is not equal to itself.")
10351040 }
1036- else throw("Strict value is not equal to itself.")
1037- }
1038- else throw("bad asset attached")
1039- if ((migration == migration))
1040- then {
1041- let mint = {
1042- let sh = sR(reserve)
1043- if ((sh == sh))
1044- then {
1045- let actual = asInt(invoke(rsr, "mintAtokenForTo", [user, -1, toString(this)], nil))
1046- if ((actual == actual))
1041+ else throw("bad asset attached")
1042+ if ((migration == migration))
1043+ then {
1044+ let mint = {
1045+ let sh = sR(reserve)
1046+ if ((sh == sh))
10471047 then {
1048- let pRw = uS(toString(rsr), "deposit", user, -(actual), 0)
1049- if ((pRw == pRw))
1048+ let actual = asInt(invoke(rsr, "mintAtokenForTo", [user, -1, toString(this)], nil))
1049+ if ((actual == actual))
10501050 then {
1051- let va = validateAfter(user, "lock-minting")
1052- if ((va == va))
1053- then nil
1051+ let pRw = uS(toString(rsr), "deposit", user, -(actual), 0)
1052+ if ((pRw == pRw))
1053+ then {
1054+ let va = validateAfter(user, "lock-minting")
1055+ if ((va == va))
1056+ then nil
1057+ else throw("Strict value is not equal to itself.")
1058+ }
10541059 else throw("Strict value is not equal to itself.")
10551060 }
10561061 else throw("Strict value is not equal to itself.")
10571062 }
10581063 else throw("Strict value is not equal to itself.")
10591064 }
1060- else throw("Strict value is not equal to itself.")
1061- }
1062- if ((mint == mint))
1063- then {
1064- let balance = assetBalance(this, aTokenId)
1065- let r = invoke(valueOrErrorMessage(addressFromString(valueOrErrorMessage(maybeLocker, "no lp_locker in config")), "bad lp_locker address in config"), "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
1066- if ((r == r))
1067- then $Tuple2(nil, balance)
1065+ if ((mint == mint))
1066+ then {
1067+ let balance = assetBalance(this, aTokenId)
1068+ let r = invoke(valueOrErrorMessage(addressFromString(valueOrErrorMessage(maybeLocker, "no lp_locker in config")), "bad lp_locker address in config"), "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
1069+ if ((r == r))
1070+ then $Tuple2(nil, balance)
1071+ else throw("Strict value is not equal to itself.")
1072+ }
10681073 else throw("Strict value is not equal to itself.")
10691074 }
10701075 else throw("Strict value is not equal to itself.")
11221127
11231128 @Callable(i)
11241129 func healthOf (address) = {
1125- let $t02458324634 = asInt3(userPower(address))
1126- let bp = $t02458324634._1
1127- let bpu = $t02458324634._2
1128- let ignore = $t02458324634._3
1130+ let $t02461424665 = asInt3(userPower(address))
1131+ let bp = $t02461424665._1
1132+ let bpu = $t02461424665._2
1133+ let ignore = $t02461424665._3
11291134 $Tuple2(nil, $Tuple2(bp, bpu))
11301135 }
11311136
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let factorsBase = 1000
55
66 func fCi (value,numerator,denominator) = {
77 let cand = fraction(value, numerator, denominator)
88 let D = 3037000499
99 let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
1010 if (exact)
1111 then cand
1212 else (cand + 1)
1313 }
1414
1515
1616 func pureAssetId (assetId) = {
1717 let i = split(assetId, "_")[0]
1818 if ((i == "WAVES"))
1919 then unit
2020 else fromBase58String(i)
2121 }
2222
2323
2424 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
2525 then StringEntry(key, value)
2626 else throw(("already initialized: " + key))
2727
2828
2929 func asInt (value) = match value {
3030 case int: Int =>
3131 int
3232 case _ =>
3333 throw("m:1")
3434 }
3535
3636
3737 func asInt3 (value) = match value {
3838 case x: (Int, Int, Int) =>
3939 x
4040 case t =>
4141 throw("2")
4242 }
4343
4444
4545 func asUserBalanceData (value) = match value {
4646 case x: (Int, Int, Int, Int, Int, Boolean) =>
4747 x
4848 case t =>
4949 throw("3")
5050 }
5151
5252
5353 let configStore = "config"
5454
5555 let aTIdS = "aTokenId"
5656
5757 let aIdS = "assetId"
5858
5959 let configAddress = addressFromStringValue(getStringValue(this, configStore))
6060
6161 let maybeLocker = getString(configAddress, "lp_locker")
6262
6363 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
6464
6565 let reserves = split_4C(reservesStr, "|")
6666
6767 let ignoreValidationUsers = valueOrElse(getString(configAddress, "ignore_validation_addresses"), "3P84evXSWMchYMa6hkLLRmQ4usHf4cNsjNp")
6868
6969 let ebR = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "eb_rewards"), "no eb_rewards"))
7070
7171 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "main: no viresMinter")), "bad minter")
7272
7373 let maybevS = getString(configAddress, "vires_staker")
7474
7575 let vS = addressFromStringValue(valueOrErrorMessage(maybevS, "no vires_staker"))
7676
7777 let dC = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "bad div")
7878
7979 let mVD = match getString(configAddress, "vires_distributor") {
8080 case d: String =>
8181 addressFromStringValue(d)
8282 case _ =>
8383 unit
8484 }
8585
8686 let VD = valueOrErrorMessage(mVD, "no distr")
8787
8888 let limiter = match getString(configAddress, "limiter") {
8989 case d: String =>
9090 addressFromStringValue(d)
9191 case _ =>
9292 unit
9393 }
9494
9595 let maybeViresAssetId = getString(viresMinter, aIdS)
9696
9797 let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "no vires id")), "invalid vires id")
9898
9999 func viresPayment (i) = if ((size(i.payments) == 0))
100100 then 0
101101 else if ((i.payments[0].assetId != viresAssetId))
102102 then throw("not vires")
103103 else i.payments[0].amount
104104
105105
106106 func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, aIdS), "no assetId in rsr")
107107
108108
109109 func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no 1")
110110
111111
112112 func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no 2")
113113
114114
115115 let accountHealthThreshold = valueOrErrorMessage(getInteger(configAddress, "account_health_threshold"), "no 4")
116116
117117 let accountHealthOverlap = valueOrErrorMessage(getInteger(configAddress, "account_health_overlap"), "no 5")
118118
119119 let liquidators = valueOrElse(getString(configAddress, "liquidators"), "")
120120
121121 func reserveBy (store,value) = {
122122 func fold (a,r) = match a {
123123 case found: Address =>
124124 found
125125 case _ =>
126126 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
127127 if ((valueOrErrorMessage(getString(rsr, store), ("rsr has no " + store)) == value))
128128 then rsr
129129 else unit
130130 }
131131
132132 match let $l = reserves
133133 let $s = size($l)
134134 let $acc0 = unit
135135 func $f0_1 ($a,$i) = if (($i >= $s))
136136 then $a
137137 else fold($a, $l[$i])
138138
139139 func $f0_2 ($a,$i) = if (($i >= $s))
140140 then $a
141141 else throw("List size exceeds 20")
142142
143143 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) {
144144 case found: Address =>
145145 found
146146 case _ =>
147147 throw(("unknown " + store))
148148 }
149149 }
150150
151151
152152 func vlR (r) = if (contains(reservesStr, r))
153153 then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
154154 else throw(("unknown rsr:" + r))
155155
156156
157157 func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
158158
159159
160160 let maybeProtected = match getString(configAddress, "protected_reserve") {
161161 case pds: String =>
162162 valueOrErrorMessage(addressFromString(pds), "bad protected")
163163 case _ =>
164164 unit
165165 }
166166
167167 let protectedReserve = valueOrErrorMessage(maybeProtected, "no protected rsr")
168168
169169 let prohibitedCollateralReserves = match getString(configAddress, "prohibitedCollateralReserves") {
170170 case s: String =>
171171 split(s, "|")
172172 case _ =>
173173 nil
174174 }
175175
176176 func ensureNoProhibitedCollaterals (user) = {
177177 func foldFunc (a,prohibitedReserve) = {
178178 let atb = valueOrElse(getInteger(addressFromStringValue(prohibitedReserve), (user + "_aTokenBalance")), 0)
179179 if ((atb > 1))
180180 then throw((((("operation denied: user has deposit in " + prohibitedReserve) + ": ") + toString(atb)) + "(lp tokens)"))
181181 else true
182182 }
183183
184184 let ensureNoProtectedUSDNorEURN = {
185185 let any = (valueOrElse(getInteger(protectedReserve, ("userShares_DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p_" + user)), 0) + valueOrElse(getInteger(protectedReserve, ("userShares_DUk2YTxhRoAqMJLus4G2b3fR8hMHVh6eiyFx5r29VR6t_" + user)), 0))
186186 if ((any > 0))
187187 then throw("has non-borrowable Neutrino assets as collateral")
188188 else true
189189 }
190190 let $l = prohibitedCollateralReserves
191191 let $s = size($l)
192192 let $acc0 = ensureNoProtectedUSDNorEURN
193193 func $f0_1 ($a,$i) = if (($i >= $s))
194194 then $a
195195 else foldFunc($a, $l[$i])
196196
197197 func $f0_2 ($a,$i) = if (($i >= $s))
198198 then $a
199199 else throw("List size exceeds 15")
200200
201201 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
202202 }
203203
204204
205205 func ensureNoProhibited (user,bpu,reserve) = if (if ((bpu == 0))
206206 then true
207207 else isDefined(indexOf(prohibitedCollateralReserves, reserve)))
208208 then true
209209 else ensureNoProhibitedCollaterals(user)
210210
211211
212212 func ensureNoProtected (user) = {
213213 let has = match maybeProtected {
214214 case pa: Address =>
215215 valueOrElse(getBoolean(pa, ("protected_collateral_" + user)), false)
216216 case _ =>
217217 false
218218 }
219219 if (has)
220220 then throw("disallowed")
221221 else unit
222222 }
223223
224224
225225 func ensureLimit (action,rsr,user,amount) = match limiter {
226226 case l: Address =>
227227 asInt(invoke(l, "validateLimit", [action, toString(rsr), user, amount], nil))
228228 case _ =>
229229 true
230230 }
231231
232232
233233 func userPower (user) = {
234234 let protectedDeposit = match maybeProtected {
235235 case pa: Address =>
236236 asInt(invoke(pa, "borrowPower", [user], nil))
237237 case _ =>
238238 0
239239 }
240240 func fold (totals,r) = {
241241 let $t092279273 = totals
242242 let totalD = $t092279273._1
243243 let totalB = $t092279273._2
244244 let numberOfBorrows = $t092279273._3
245245 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
246246 let cf = collateralFactor(rsr)
247247 let lt = liquidationThreshold(rsr)
248248 let $t094279511 = userBalance(rsr, user)
249249 let token = $t094279511._1
250250 let asset = $t094279511._2
251251 let depositUsd = $t094279511._3
252252 let debt = $t094279511._4
253253 let debtUsd = $t094279511._5
254254 let asCollateral = $t094279511._6
255255 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
256256 then 1
257257 else 0))
258258 let effectiveDepositUsd = if (asCollateral)
259259 then depositUsd
260260 else 0
261261 let overlapUsd = min([debtUsd, effectiveDepositUsd])
262262 let overlapCharge = fCi(overlapUsd, accountHealthOverlap, factorsBase)
263263 if ((debtUsd > effectiveDepositUsd))
264264 then $Tuple3(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge), totalBorrows)
265265 else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
266266 }
267267
268268 let r = {
269269 let $l = reserves
270270 let $s = size($l)
271271 let $acc0 = $Tuple3(protectedDeposit, 0, 0)
272272 func $f0_1 ($a,$i) = if (($i >= $s))
273273 then $a
274274 else fold($a, $l[$i])
275275
276276 func $f0_2 ($a,$i) = if (($i >= $s))
277277 then $a
278278 else throw("List size exceeds 20")
279279
280280 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
281281 }
282282 if (if ((protectedDeposit > 0))
283283 then (r._3 > 4)
284284 else false)
285285 then throw("can't have more than 4 borrows")
286286 else r
287287 }
288288
289289
290290 func getUserHealth (account) = {
291291 let $t01026610317 = asInt3(userPower(account))
292292 let bp = $t01026610317._1
293293 let bpu = $t01026610317._2
294294 let ignore = $t01026610317._3
295295 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
296296 }
297297
298298
299299 func validateAfter (user,op) = {
300300 let $t01042910460 = userPower(user)
301301 let bp = $t01042910460._1
302302 let bpu = $t01042910460._2
303303 let accHealth = (((bp - bpu) * factorsBase) / bp)
304304 if (if ((bp == 0))
305305 then (bpu == 0)
306306 else false)
307307 then 0
308308 else if (if ((bp == 0))
309309 then (bpu > 0)
310310 else false)
311311 then throw(((op + ": breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
312312 else if ((accountHealthThreshold > accHealth))
313313 then throw((((((((op + ": breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
314314 else bpu
315315 }
316316
317317
318318 func uS (rsr,action,user,userChange,streamChange) = match mVD {
319319 case a: Address =>
320320 invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
321321 case _ =>
322322 unit
323323 }
324324
325325
326326 func moveStream (rsr,action,from,string,amt) = match mVD {
327327 case a: Address =>
328328 invoke(a, "move", [rsr, action, from, string, amt], nil)
329329 case _ =>
330330 unit
331331 }
332332
333333
334334 func sR (rsr) = match mVD {
335335 case a: Address =>
336336 invoke(a, "syncHeight", [rsr], nil)
337337 case _ =>
338338 unit
339339 }
340340
341341
342342 func lockOrPayout (recipient,amt,lock) = if (!(lock))
343343 then [ScriptTransfer(recipient, amt, viresAssetId)]
344344 else {
345345 let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amt)])
346346 if ((doLock == doLock))
347347 then nil
348348 else throw("Strict value is not equal to itself.")
349349 }
350350
351351
352352 func doDeposit (i,rsr,asCol) = {
353353 let user = toString(i.caller)
354354 let checks = ensureNoProtected(user)
355355 if ((checks == checks))
356356 then {
357357 let sh = sR(rsr)
358358 if ((sh == sh))
359359 then {
360360 let action = invoke(vlR(rsr), "depositFor", [user, asCol], i.payments)
361361 if ((action == action))
362362 then {
363363 let amt = i.payments[0].amount
364364 let pRw = uS(rsr, "deposit", user, amt, amt)
365365 if ((pRw == pRw))
366366 then {
367367 let va = if (!(asCol))
368368 then validateAfter(user, "depositing")
369369 else 0
370370 if ((va == va))
371371 then nil
372372 else throw("Strict value is not equal to itself.")
373373 }
374374 else throw("Strict value is not equal to itself.")
375375 }
376376 else throw("Strict value is not equal to itself.")
377377 }
378378 else throw("Strict value is not equal to itself.")
379379 }
380380 else throw("Strict value is not equal to itself.")
381381 }
382382
383383
384384 let rewardReserves = split_4C(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
385385
386386 func claimAllRewardsForUser (user) = {
387387 let claimedEb = asInt(invoke(ebR, "claimEbRewardFor", [user, -1], nil))
388388 if ((claimedEb == claimedEb))
389389 then {
390390 func fold (acc,rsr) = {
391391 let claimed = asInt(invoke(VD, "claimRewardFor", [rsr, user, -1], nil))
392392 if ((claimed == claimed))
393393 then (acc + claimed)
394394 else throw("Strict value is not equal to itself.")
395395 }
396396
397397 let claimedTotal = {
398398 let $l = rewardReserves
399399 let $s = size($l)
400400 let $acc0 = 0
401401 func $f0_1 ($a,$i) = if (($i >= $s))
402402 then $a
403403 else fold($a, $l[$i])
404404
405405 func $f0_2 ($a,$i) = if (($i >= $s))
406406 then $a
407407 else throw("List size exceeds 20")
408408
409409 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
410410 }
411411 (claimedTotal + claimedEb)
412412 }
413413 else throw("Strict value is not equal to itself.")
414414 }
415415
416416
417417 func claimAllLpRewardsForUser (user) = match maybeLocker {
418418 case s: String =>
419419 let locker = valueOrErrorMessage(addressFromString(s), "bad lp_locker address in config")
420420 func fold (acc,rsr) = {
421421 let aTokenId = valueOrErrorMessage(getString(addressFromStringValue(rsr), aTIdS), "no aTokenId in reserve")
422422 let claimed = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, -1], nil))
423423 if ((claimed == claimed))
424424 then (acc + claimed)
425425 else throw("Strict value is not equal to itself.")
426426 }
427427
428428 let claimedTotal = {
429429 let $l = rewardReserves
430430 let $s = size($l)
431431 let $acc0 = 0
432432 func $f0_1 ($a,$i) = if (($i >= $s))
433433 then $a
434434 else fold($a, $l[$i])
435435
436436 func $f0_2 ($a,$i) = if (($i >= $s))
437437 then $a
438438 else throw("List size exceeds 20")
439439
440440 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
441441 }
442442 claimedTotal
443443 case _ =>
444444 0
445445 }
446446
447447
448448 func moveCollateral (addr,assetStr,rsr,reserveStr) = {
449449 let amt = asInt(invoke(protectedReserve, "withdrawToMain", [addr, assetStr], nil))
450450 if ((amt == amt))
451451 then {
452452 let dep = invoke(rsr, "depositFor", [addr, true], [AttachedPayment(pureAssetId(assetStr), amt)])
453453 if ((dep == dep))
454454 then {
455455 let prop = uS(reserveStr, "deposit", addr, amt, amt)
456456 if ((prop == prop))
457457 then unit
458458 else throw("Strict value is not equal to itself.")
459459 }
460460 else throw("Strict value is not equal to itself.")
461461 }
462462 else throw("Strict value is not equal to itself.")
463463 }
464464
465465
466466 func spfr () = invoke(dC, "shareProfitFromReserves", nil, nil)
467467
468468
469469 func wdInternal (user,rsr,amt,op) = {
470470 let sh = sR(toString(rsr))
471471 if ((sh == sh))
472472 then {
473473 let withdrawnAmount = asInt(invoke(rsr, op, [user, amt], nil))
474474 if ((withdrawnAmount == withdrawnAmount))
475475 then {
476476 let pRw = uS(toString(rsr), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
477477 if ((pRw == pRw))
478478 then {
479479 let e = ensureLimit("withdraw", rsr, user, withdrawnAmount)
480480 if ((e == e))
481481 then withdrawnAmount
482482 else throw("Strict value is not equal to itself.")
483483 }
484484 else throw("Strict value is not equal to itself.")
485485 }
486486 else throw("Strict value is not equal to itself.")
487487 }
488488 else throw("Strict value is not equal to itself.")
489489 }
490490
491491
492492 func repayWithAtokenInternal (user,payment) = {
493493 let aTokenId = toBase58String(valueOrErrorMessage(payment.assetId, "bad assetId: waves not allowed"))
494494 let t = reserveBy(aTIdS, aTokenId)
495495 let sh = sR(toString(t))
496496 if ((sh == sh))
497497 then {
498498 let amt = asInt(invoke(t, "replenishForRepayWithAtokenFor", [user], [payment]))
499499 if ((amt == amt))
500500 then {
501501 let c = asInt(invoke(t, "collapseForAmount", [user, amt], nil))
502502 if ((c == c))
503503 then if ((amt > c))
504504 then throw("repaying too much")
505505 else {
506506 let pRw = uS(toString(t), "borrow", user, -(c), -(c))
507507 if ((pRw == pRw))
508508 then {
509509 let pRw2 = uS(toString(t), "deposit", user, (amt - c), -(c))
510510 if ((pRw2 == pRw2))
511511 then nil
512512 else throw("Strict value is not equal to itself.")
513513 }
514514 else throw("Strict value is not equal to itself.")
515515 }
516516 else throw("Strict value is not equal to itself.")
517517 }
518518 else throw("Strict value is not equal to itself.")
519519 }
520520 else throw("Strict value is not equal to itself.")
521521 }
522522
523523
524524 @Callable(i)
525525 func initialize (ca) = [writeConstString(configStore, ca)]
526526
527527
528528
529529 @Callable(i)
530530 func deposit (rsr,asCol) = doDeposit(i, rsr, asCol)
531531
532532
533533
534534 @Callable(i)
535535 func depositRef (rsr,asCol,ref) = doDeposit(i, rsr, asCol)
536536
537537
538538
539539 @Callable(i)
540540 func repay (rsr) = {
541541 let user = toString(i.caller)
542542 let sh = sR(rsr)
543543 if ((sh == sh))
544544 then {
545545 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
546546 if ((repaid == repaid))
547547 then {
548548 let pRw = uS(rsr, "borrow", user, -(repaid), -(repaid))
549549 if ((pRw == pRw))
550550 then nil
551551 else throw("Strict value is not equal to itself.")
552552 }
553553 else throw("Strict value is not equal to itself.")
554554 }
555555 else throw("Strict value is not equal to itself.")
556556 }
557557
558558
559559
560560 @Callable(i)
561561 func mintAtoken (aTokenId,amt) = {
562562 let user = toString(i.caller)
563563 let t = reserveBy(aTIdS, aTokenId)
564564 let sh = sR(toString(t))
565565 if ((sh == sh))
566566 then {
567567 let actual = asInt(invoke(t, "mintAtokenFor", [user, amt], nil))
568568 if ((actual == actual))
569569 then {
570570 let pRw = uS(toString(t), "deposit", user, -(actual), 0)
571571 if ((pRw == pRw))
572572 then {
573573 let bpu = asInt(validateAfter(user, "minting"))
574574 if ((bpu == bpu))
575575 then {
576576 let pc = ensureNoProhibited(user, bpu, toString(t))
577577 if ((pc == pc))
578578 then nil
579579 else throw("Strict value is not equal to itself.")
580580 }
581581 else throw("Strict value is not equal to itself.")
582582 }
583583 else throw("Strict value is not equal to itself.")
584584 }
585585 else throw("Strict value is not equal to itself.")
586586 }
587587 else throw("Strict value is not equal to itself.")
588588 }
589589
590590
591591
592592 @Callable(i)
593593 func replenishWithAtoken () = {
594594 let user = toString(i.caller)
595595 let checks = ensureNoProtected(user)
596596 if ((checks == checks))
597597 then {
598598 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId(w)"))
599599 let rsr = reserveBy(aTIdS, aTokenId)
600600 let sh = sR(toString(rsr))
601601 if ((sh == sh))
602602 then {
603603 let amt = asInt(invoke(rsr, "replenishWithAtokenFor", [user], i.payments))
604604 if ((amt == amt))
605605 then {
606606 let pRw = uS(toString(rsr), "deposit", user, amt, 0)
607607 if ((pRw == pRw))
608608 then {
609609 let e = ensureLimit("import", rsr, user, amt)
610610 if ((e == e))
611611 then nil
612612 else throw("Strict value is not equal to itself.")
613613 }
614614 else throw("Strict value is not equal to itself.")
615615 }
616616 else throw("Strict value is not equal to itself.")
617617 }
618618 else throw("Strict value is not equal to itself.")
619619 }
620620 else throw("Strict value is not equal to itself.")
621621 }
622622
623623
624624
625625 @Callable(i)
626626 func redeemAtokens () = {
627627 let user = toString(i.caller)
628628 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: WAVES"))
629629 let rsr = reserveBy(aTIdS, aTokenId)
630630 let sh = sR(toString(rsr))
631631 if ((sh == sh))
632632 then {
633633 let amt = asInt(invoke(rsr, "redeemAtokensFor", [user], i.payments))
634634 if ((amt == amt))
635635 then {
636636 let pRw = uS(toString(rsr), "deposit", user, 0, -(amt))
637637 if ((pRw == pRw))
638638 then {
639639 let e = ensureLimit("redeem", rsr, user, amt)
640640 if ((e == e))
641641 then nil
642642 else throw("Strict value is not equal to itself.")
643643 }
644644 else throw("Strict value is not equal to itself.")
645645 }
646646 else throw("Strict value is not equal to itself.")
647647 }
648648 else throw("Strict value is not equal to itself.")
649649 }
650650
651651
652652
653653 @Callable(i)
654654 func withdraw (assetId,amt) = {
655655 let user = toString(i.caller)
656656 let r = reserveBy(aIdS, assetId)
657657 let result = asInt(wdInternal(user, r, amt, "withdrawFor"))
658658 if ((result == result))
659659 then {
660660 let bpu = asInt(validateAfter(user, "withdrawing"))
661661 if ((bpu == bpu))
662662 then {
663663 let pc = ensureNoProhibited(user, bpu, toString(r))
664664 if ((pc == pc))
665665 then $Tuple2(nil, result)
666666 else throw("Strict value is not equal to itself.")
667667 }
668668 else throw("Strict value is not equal to itself.")
669669 }
670670 else throw("Strict value is not equal to itself.")
671671 }
672672
673673
674674
675675 @Callable(i)
676676 func withdraw2 (rsr,amt) = {
677677 let user = toString(i.caller)
678678 let sh = sR(rsr)
679679 if ((sh == sh))
680680 then {
681681 let rsrAddr = vlR(rsr)
682682 let actual = asInt(invoke(rsrAddr, "withdrawFor", [user, amt], nil))
683683 if ((actual == actual))
684684 then {
685685 let pRw = uS(rsr, "deposit", user, -(actual), -(actual))
686686 if ((pRw == pRw))
687687 then {
688688 let bpu = if (contains(liquidators, user))
689689 then 0
690690 else {
691691 let e = ensureLimit("withdraw", rsrAddr, user, actual)
692692 if ((e == e))
693693 then asInt(validateAfter(user, "withdrawing2"))
694694 else throw("Strict value is not equal to itself.")
695695 }
696696 let pc = ensureNoProhibited(user, bpu, rsr)
697697 if ((pc == pc))
698698 then $Tuple2(nil, actual)
699699 else throw("Strict value is not equal to itself.")
700700 }
701701 else throw("Strict value is not equal to itself.")
702702 }
703703 else throw("Strict value is not equal to itself.")
704704 }
705705 else throw("Strict value is not equal to itself.")
706706 }
707707
708708
709709
710710 @Callable(i)
711711 func protectCollateral (rsr) = {
712712 let user = toString(i.caller)
713713 let r = vlR(rsr)
714714 let amt = asInt(wdInternal(user, r, -1, "withdrawToMain"))
715715 if ((amt == amt))
716716 then {
717717 let assetIdStr = getStringValue(r, aIdS)
718718 let p = invoke(protectedReserve, "supplyFor", [user], [AttachedPayment(pureAssetId(assetIdStr), amt)])
719719 if ((p == p))
720720 then $Tuple2(nil, amt)
721721 else throw("Strict value is not equal to itself.")
722722 }
723723 else throw("Strict value is not equal to itself.")
724724 }
725725
726726
727727
728728 @Callable(i)
729729 func withdrawProtectedCollateral (assetId,amt) = {
730730 let user = toString(i.caller)
731731 let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amt], nil))
732732 if ((a == a))
733733 then if (contains(ignoreValidationUsers, user))
734734 then nil
735735 else {
736736 let va = validateAfter(user, "withdrawing protected")
737737 if ((va == va))
738738 then nil
739739 else throw("Strict value is not equal to itself.")
740740 }
741741 else throw("Strict value is not equal to itself.")
742742 }
743743
744744
745745
746746 @Callable(i)
747747 func normalizeCollateral (rsr) = {
748748 let addr = toString(i.caller)
749749 let rA = vlR(rsr)
750750 if ((rA == rA))
751751 then {
752752 let sh = sR(rsr)
753753 if ((sh == sh))
754754 then {
755755 let assetIdStr = valueOrErrorMessage(getString(rA, aIdS), ("no assetId in rsv: " + rsr))
756756 let mc = moveCollateral(addr, assetIdStr, rA, rsr)
757757 if ((mc == mc))
758758 then nil
759759 else throw("Strict value is not equal to itself.")
760760 }
761761 else throw("Strict value is not equal to itself.")
762762 }
763763 else throw("Strict value is not equal to itself.")
764764 }
765765
766766
767767
768768 @Callable(i)
769769 func borrow (assetId,amt) = {
770770 let user = toString(i.caller)
771771 let rsr = reserveBy(aIdS, assetId)
772772 let sh = sR(toString(rsr))
773773 if ((sh == sh))
774774 then {
775775 let a = invoke(rsr, "borrowFor", [user, amt], nil)
776776 if ((a == a))
777777 then {
778778 let pRw = uS(toString(rsr), "borrow", user, amt, amt)
779779 if ((pRw == pRw))
780780 then {
781781 let e = ensureLimit("borrow", rsr, user, amt)
782782 if ((e == e))
783783 then {
784784 let bpu = asInt(validateAfter(user, "borrowing"))
785785 if ((bpu == bpu))
786786 then {
787787 let pc = ensureNoProhibitedCollaterals(user)
788788 if ((pc == pc))
789789 then nil
790790 else throw("Strict value is not equal to itself.")
791791 }
792792 else throw("Strict value is not equal to itself.")
793793 }
794794 else throw("Strict value is not equal to itself.")
795795 }
796796 else throw("Strict value is not equal to itself.")
797797 }
798798 else throw("Strict value is not equal to itself.")
799799 }
800800 else throw("Strict value is not equal to itself.")
801801 }
802802
803803
804804
805805 @Callable(i)
806806 func borrow2 (rsr,amt) = {
807807 let user = toString(i.caller)
808808 let r = vlR(rsr)
809809 let sh = sR(rsr)
810810 if ((sh == sh))
811811 then {
812812 let a = invoke(r, "borrowFor", [user, amt], nil)
813813 if ((a == a))
814814 then {
815815 let pRw = uS(rsr, "borrow", user, amt, amt)
816816 if ((pRw == pRw))
817817 then {
818818 let e = ensureLimit("borrow", r, user, amt)
819819 if ((e == e))
820820 then {
821821 let bpu = asInt(validateAfter(user, "borrowing"))
822822 if ((bpu == bpu))
823823 then {
824824 let pc = ensureNoProhibitedCollaterals(user)
825825 if ((pc == pc))
826826 then nil
827827 else throw("Strict value is not equal to itself.")
828828 }
829829 else throw("Strict value is not equal to itself.")
830830 }
831831 else throw("Strict value is not equal to itself.")
832832 }
833833 else throw("Strict value is not equal to itself.")
834834 }
835835 else throw("Strict value is not equal to itself.")
836836 }
837837 else throw("Strict value is not equal to itself.")
838838 }
839839
840840
841841
842842 @Callable(i)
843843 func collapse (rsr,amt) = {
844844 let user = toString(i.caller)
845845 let sh = sR(rsr)
846846 if ((sh == sh))
847847 then {
848848 let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amt], nil))
849849 if ((c == c))
850850 then {
851851 let pRw = uS(rsr, "borrow", user, -(c), -(c))
852852 if ((pRw == pRw))
853853 then {
854854 let pRw2 = uS(rsr, "deposit", user, -(c), -(c))
855855 if ((pRw2 == pRw2))
856856 then nil
857857 else throw("Strict value is not equal to itself.")
858858 }
859859 else throw("Strict value is not equal to itself.")
860860 }
861861 else throw("Strict value is not equal to itself.")
862862 }
863863 else throw("Strict value is not equal to itself.")
864864 }
865865
866866
867867
868868 @Callable(i)
869869 func claimEbReward2 (amt,lock) = {
870870 let user = toString(i.caller)
871871 let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amt], nil))
872872 if ((c == c))
873873 then lockOrPayout(i.caller, c, lock)
874874 else throw("Strict value is not equal to itself.")
875875 }
876876
877877
878878
879879 @Callable(i)
880880 func claimReward2 (rsr,amt,lock) = {
881881 let v = vlR(rsr)
882882 if ((v == v))
883883 then {
884884 let user = toString(i.caller)
885885 let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amt], nil))
886886 if ((c == c))
887887 then lockOrPayout(i.caller, c, lock)
888888 else throw("Strict value is not equal to itself.")
889889 }
890890 else throw("Strict value is not equal to itself.")
891891 }
892892
893893
894894
895895 @Callable(i)
896896 func claimAllRewardsAndAllEbAvailable2 (lock,unstakeLegacy) = {
897897 let user = toString(i.caller)
898898 let cr = claimAllRewardsForUser(user)
899899 if ((cr == cr))
900900 then {
901901 let crLp = claimAllLpRewardsForUser(user)
902902 if ((crLp == crLp))
903903 then {
904904 let lA = if (unstakeLegacy)
905905 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
906906 else 0
907907 if ((lA == lA))
908908 then lockOrPayout(i.caller, ((cr + crLp) + lA), lock)
909909 else throw("Strict value is not equal to itself.")
910910 }
911911 else throw("Strict value is not equal to itself.")
912912 }
913913 else throw("Strict value is not equal to itself.")
914914 }
915915
916916
917917
918918 @Callable(i)
919919 func disableUseAsCollateral (rsr) = {
920920 let user = toString(i.caller)
921921 let d = invoke(vlR(rsr), "disableUseAsCollateralFor", [user], nil)
922922 if ((d == d))
923923 then {
924924 let va = validateAfter(user, "changing collateral status")
925925 if ((va == va))
926926 then nil
927927 else throw("Strict value is not equal to itself.")
928928 }
929929 else throw("Strict value is not equal to itself.")
930930 }
931931
932932
933933
934934 @Callable(i)
935935 func lockVires (factor,migrate) = {
936936 let user = toString(i.caller)
937937 let a = spfr()
938938 if ((a == a))
939939 then {
940940 let migrateAmount = if (migrate)
941941 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
942942 else 0
943943 let total = (migrateAmount + viresPayment(i))
944944 let l = invoke(dC, "lockFor", [user, factor], if ((total == 0))
945945 then nil
946946 else [AttachedPayment(viresAssetId, total)])
947947 if ((l == l))
948948 then nil
949949 else throw("Strict value is not equal to itself.")
950950 }
951951 else throw("Strict value is not equal to itself.")
952952 }
953953
954954
955955
956956 @Callable(i)
957957 func withdrawAllPossibleVires () = {
958958 let user = toString(i.caller)
959959 let a = spfr()
960960 if ((a == a))
961961 then {
962962 let stakerViresAmount = asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
963963 if ((stakerViresAmount == stakerViresAmount))
964964 then {
965965 let u = invoke(dC, "withdrawUnlockedFor", [user], nil)
966966 if ((u == u))
967967 then [ScriptTransfer(i.caller, stakerViresAmount, viresAssetId)]
968968 else throw("Strict value is not equal to itself.")
969969 }
970970 else throw("Strict value is not equal to itself.")
971971 }
972972 else throw("Strict value is not equal to itself.")
973973 }
974974
975975
976976
977977 @Callable(i)
978978 func claimProtocolProfitFrom (from,relock) = {
979979 let user = toString(i.caller)
980980 let a = spfr()
981981 if ((a == a))
982982 then {
983983 let u = invoke(dC, "claimProfit", [from, user, relock], nil)
984984 if ((u == u))
985985 then nil
986986 else throw("Strict value is not equal to itself.")
987987 }
988988 else throw("Strict value is not equal to itself.")
989989 }
990990
991991
992992
993993 @Callable(i)
994994 func withdrawUnlockedVires () = {
995995 let a = spfr()
996996 if ((a == a))
997997 then {
998998 let u = invoke(dC, "withdrawUnlockedFor", [toString(i.caller)], nil)
999999 if ((u == u))
10001000 then nil
10011001 else throw("Strict value is not equal to itself.")
10021002 }
10031003 else throw("Strict value is not equal to itself.")
10041004 }
10051005
10061006
10071007
10081008 @Callable(i)
10091009 func lockSupply (reserve,period) = {
1010- let rsr = vlR(reserve)
1011- let user = toString(i.caller)
1012- let checks = ensureNoProtected(user)
1013- if ((checks == checks))
1010+ let d = throw("denied")
1011+ if ((d == d))
10141012 then {
1015- let aTokenId = value(pureAssetId(valueOrErrorMessage(getString(rsr, "aTokenId"), "no aTokenId in reserve")))
1016- let migration = if ((size(i.payments) == 0))
1017- then unit
1018- else if ((i.payments[0].assetId == aTokenId))
1019- then unit
1020- else if ((i.payments[0].assetId == pureAssetId(valueOrErrorMessage(getString(rsr, aIdS), "no assetId in reserve"))))
1021- then {
1022- let sh = sR(reserve)
1023- if ((sh == sh))
1013+ let rsr = vlR(reserve)
1014+ let user = toString(i.caller)
1015+ let checks = ensureNoProtected(user)
1016+ if ((checks == checks))
1017+ then {
1018+ let aTokenId = value(pureAssetId(valueOrErrorMessage(getString(rsr, "aTokenId"), "no aTokenId in reserve")))
1019+ let migration = if ((size(i.payments) == 0))
1020+ then unit
1021+ else if ((i.payments[0].assetId == aTokenId))
1022+ then unit
1023+ else if ((i.payments[0].assetId == pureAssetId(valueOrErrorMessage(getString(rsr, aIdS), "no assetId in reserve"))))
10241024 then {
1025- let action = invoke(rsr, "depositFor", [user, true], i.payments)
1026- if ((action == action))
1025+ let sh = sR(reserve)
1026+ if ((sh == sh))
10271027 then {
1028- let amt = i.payments[0].amount
1029- let pRw = uS(reserve, "deposit", user, amt, amt)
1030- if ((pRw == pRw))
1031- then unit
1028+ let action = invoke(rsr, "depositFor", [user, true], i.payments)
1029+ if ((action == action))
1030+ then {
1031+ let amt = i.payments[0].amount
1032+ let pRw = uS(reserve, "deposit", user, amt, amt)
1033+ if ((pRw == pRw))
1034+ then unit
1035+ else throw("Strict value is not equal to itself.")
1036+ }
10321037 else throw("Strict value is not equal to itself.")
10331038 }
10341039 else throw("Strict value is not equal to itself.")
10351040 }
1036- else throw("Strict value is not equal to itself.")
1037- }
1038- else throw("bad asset attached")
1039- if ((migration == migration))
1040- then {
1041- let mint = {
1042- let sh = sR(reserve)
1043- if ((sh == sh))
1044- then {
1045- let actual = asInt(invoke(rsr, "mintAtokenForTo", [user, -1, toString(this)], nil))
1046- if ((actual == actual))
1041+ else throw("bad asset attached")
1042+ if ((migration == migration))
1043+ then {
1044+ let mint = {
1045+ let sh = sR(reserve)
1046+ if ((sh == sh))
10471047 then {
1048- let pRw = uS(toString(rsr), "deposit", user, -(actual), 0)
1049- if ((pRw == pRw))
1048+ let actual = asInt(invoke(rsr, "mintAtokenForTo", [user, -1, toString(this)], nil))
1049+ if ((actual == actual))
10501050 then {
1051- let va = validateAfter(user, "lock-minting")
1052- if ((va == va))
1053- then nil
1051+ let pRw = uS(toString(rsr), "deposit", user, -(actual), 0)
1052+ if ((pRw == pRw))
1053+ then {
1054+ let va = validateAfter(user, "lock-minting")
1055+ if ((va == va))
1056+ then nil
1057+ else throw("Strict value is not equal to itself.")
1058+ }
10541059 else throw("Strict value is not equal to itself.")
10551060 }
10561061 else throw("Strict value is not equal to itself.")
10571062 }
10581063 else throw("Strict value is not equal to itself.")
10591064 }
1060- else throw("Strict value is not equal to itself.")
1061- }
1062- if ((mint == mint))
1063- then {
1064- let balance = assetBalance(this, aTokenId)
1065- let r = invoke(valueOrErrorMessage(addressFromString(valueOrErrorMessage(maybeLocker, "no lp_locker in config")), "bad lp_locker address in config"), "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
1066- if ((r == r))
1067- then $Tuple2(nil, balance)
1065+ if ((mint == mint))
1066+ then {
1067+ let balance = assetBalance(this, aTokenId)
1068+ let r = invoke(valueOrErrorMessage(addressFromString(valueOrErrorMessage(maybeLocker, "no lp_locker in config")), "bad lp_locker address in config"), "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
1069+ if ((r == r))
1070+ then $Tuple2(nil, balance)
1071+ else throw("Strict value is not equal to itself.")
1072+ }
10681073 else throw("Strict value is not equal to itself.")
10691074 }
10701075 else throw("Strict value is not equal to itself.")
10711076 }
10721077 else throw("Strict value is not equal to itself.")
10731078 }
10741079 else throw("Strict value is not equal to itself.")
10751080 }
10761081
10771082
10781083
10791084 @Callable(i)
10801085 func repayWithAtokenFor (user) = {
10811086 let checks = if (!(isDefined(addressFromString(user))))
10821087 then throw("bad user")
10831088 else true
10841089 if ((checks == checks))
10851090 then repayWithAtokenInternal(user, i.payments[0])
10861091 else throw("Strict value is not equal to itself.")
10871092 }
10881093
10891094
10901095
10911096 @Callable(i)
10921097 func repayWithAtoken () = repayWithAtokenInternal(toString(i.caller), i.payments[0])
10931098
10941099
10951100
10961101 @Callable(i)
10971102 func repayFor (rsr,user) = {
10981103 let checks = if (!(isDefined(addressFromString(user))))
10991104 then throw("bad user")
11001105 else true
11011106 if ((checks == checks))
11021107 then {
11031108 let sh = sR(rsr)
11041109 if ((sh == sh))
11051110 then {
11061111 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
11071112 if ((repaid == repaid))
11081113 then {
11091114 let pRw = uS(rsr, "borrow", user, -(repaid), -(repaid))
11101115 if ((pRw == pRw))
11111116 then nil
11121117 else throw("Strict value is not equal to itself.")
11131118 }
11141119 else throw("Strict value is not equal to itself.")
11151120 }
11161121 else throw("Strict value is not equal to itself.")
11171122 }
11181123 else throw("Strict value is not equal to itself.")
11191124 }
11201125
11211126
11221127
11231128 @Callable(i)
11241129 func healthOf (address) = {
1125- let $t02458324634 = asInt3(userPower(address))
1126- let bp = $t02458324634._1
1127- let bpu = $t02458324634._2
1128- let ignore = $t02458324634._3
1130+ let $t02461424665 = asInt3(userPower(address))
1131+ let bp = $t02461424665._1
1132+ let bpu = $t02461424665._2
1133+ let ignore = $t02461424665._3
11291134 $Tuple2(nil, $Tuple2(bp, bpu))
11301135 }
11311136
11321137
11331138 @Verifier(tx)
11341139 func verify () = {
11351140 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
11361141 case s: String =>
11371142 addressFromString(s)
11381143 case _ =>
11391144 unit
11401145 }
11411146 let HEIGHT = height
11421147 let BASE = 1000
11431148 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
11441149 let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
11451150 let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
11461151 let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
11471152 let id = toBase58String(tx.id)
11481153 let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
11491154 let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
11501155 let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
11511156 let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
11521157 let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
11531158 let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
11541159 let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
11551160 let voteYes = votesYes
11561161 let voteNo = votesNo
11571162 let totalVotes = (voteYes + voteNo)
11581163 let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
11591164 let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
11601165 let tooEarly = (applyStart >= HEIGHT)
11611166 let tooLate = (HEIGHT >= applyEnd)
11621167 let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
11631168 let byVoting = if (!(enabled))
11641169 then throw("tx application throw governance not enabled")
11651170 else if (tooEarly)
11661171 then throw(("proposal can't be executed as it's too early: " + timeDebug))
11671172 else if (tooLate)
11681173 then throw(("proposal can't be executed as it's too late:" + timeDebug))
11691174 else if (!(hasQuorum))
11701175 then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
11711176 else if (!(hasPassed))
11721177 then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
11731178 else true
11741179 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
11751180 then true
11761181 else byVoting
11771182 }
11781183

github/deemru/w8io/786bc32 
98.45 ms