tx · E4WgVHUj1Dz2VTcm3YVhgTPDpa54V3htkWGSyk6HC8u4

3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP:  -0.03700000 Waves

2025.01.10 16:55 [3453147] smart account 3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP > SELF 0.00000000 Waves

{ "type": 13, "id": "E4WgVHUj1Dz2VTcm3YVhgTPDpa54V3htkWGSyk6HC8u4", "fee": 3700000, "feeAssetId": null, "timestamp": 1736517349009, "version": 2, "chainId": 84, "sender": "3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP", "senderPublicKey": "AoKo4segKHU4DeJnxXQYJj2u7J6XJeux6r8KLW52cd2Q", "proofs": [ "3nDUertQ984JNmB4wJv88osMo9aXVged6McdZcGrrYL2r9dmzmAC1QfPgdVDDedTgk7jZM2KHqfFVd49nSvN8rdq" ], "script": "base64:BwJHCAISABIDCgECEgcKBQIBAQEBEgYKBAEBAQESAwoBAhIDCgECEgQKAgICEgQKAgIIEgQKAgIYEgQKAgIIEgQKAgIYEgMKAQJIAANTRVACAl9fAA1DT05UUkFDVF9OQU1FAg9jYWxjdWxhdG9yLnJpZGUABlNDQUxFOACAwtcvAAdQRU5ESU5HAgdQRU5ESU5HAAVXQVZFUwIFV0FWRVMAHGJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemVNYXgACgEHd3JhcEVycgEBcwkArAICCQCsAgIFDUNPTlRSQUNUX05BTUUCAjogBQFzAQh0aHJvd0VycgEBcwkAAgEJAQd3cmFwRXJyAQUBcwEPYXNzZXRJZFRvU3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgMJAAECBQckbWF0Y2gwAgRVbml0BQVXQVZFUwkAAgECC01hdGNoIGVycm9yAQ9zdHJpbmdUb0Fzc2V0SWQBAXMDCQAAAgUBcwUFV0FWRVMFBHVuaXQJANkEAQUBcwEDYWJzAQFuAwkAZgIAAAUBbgkBAS0BBQFuBQFuARFrZXlGYWN0b3J5QWRkcmVzcwAJALkJAgkAzAgCAgIlcwkAzAgCAgdmYWN0b3J5BQNuaWwFA1NFUAETa2V5TWFuYWdlclB1YmxpY0tleQAJALkJAgkAzAgCAgIlcwkAzAgCAhBtYW5hZ2VyUHVibGljS2V5BQNuaWwFA1NFUAEMa2V5THBBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCWxwQXNzZXRJZAUDbmlsBQNTRVABF2tleVByb3h5VHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDXByb3h5VHJlYXN1cnkFA25pbAUDU0VQARZrZXlNYWluVHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDG1haW5UcmVhc3VyeQUDbmlsBQNTRVABGmtleUJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICEGJ1c2luZXNzVHJlYXN1cnkFA25pbAUDU0VQAR1rZXlUcnVzdGVkRmluYWxpemVBZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhJ0cnVzdGVkQWRkcmVzc0xpc3QFA25pbAUDU0VQARdrZXlCdXNpbmVzc1RyZWFzdXJ5UGFydAAJALkJAgkAzAgCAgIlcwkAzAgCAhRidXNpbmVzc1RyZWFzdXJ5UGFydAUDbmlsBQNTRVABF2tleVBvd2VyQ29udHJhY3RBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDXBvd2VyQ29udHJhY3QFA25pbAUDU0VQARJrZXlQb3dlclNoYXJlUmF0aW8ACQC5CQIJAMwIAgICJXMJAMwIAgIPcG93ZXJTaGFyZVJhdGlvBQNuaWwFA1NFUAEPa2V5UG93ZXJBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICDHBvd2VyQXNzZXRJZAUDbmlsBQNTRVABDmtleUwybXBBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICC2wybXBBc3NldElkBQNuaWwFA1NFUAETa2V5TDJtcFByb3h5QWRkcmVzcwAJALkJAgkAzAgCAgIlcwkAzAgCAglsMm1wUHJveHkFA25pbAUDU0VQAQtrZXlJbnZlc3RlZAEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIIaW52ZXN0ZWQJAMwIAgkBD2Fzc2V0SWRUb1N0cmluZwEFB2Fzc2V0SWQFA25pbAUDU0VQAQprZXlEb25hdGVkAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgdkb25hdGVkCQDMCAIJAQ9hc3NldElkVG9TdHJpbmcBBQdhc3NldElkBQNuaWwFA1NFUAEMa2V5QXZhaWxhYmxlAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIJYXZhaWxhYmxlCQDMCAIJAKUIAQULdXNlckFkZHJlc3MFA25pbAUDU0VQAQprZXlDbGFpbWVkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHY2xhaW1lZAkAzAgCCQClCAEFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEQa2V5Q3VycmVudFBlcmlvZAAJALkJAgkAzAgCAgIlcwkAzAgCAg1jdXJyZW50UGVyaW9kBQNuaWwFA1NFUAERa2V5UHJpY2VGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICBCVzJWQJAMwIAgIFcHJpY2UJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQAQ5rZXlTdGFydEhlaWdodAEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgtzdGFydEhlaWdodAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFGtleVBvd2VyTWFuYWdlckJvbnVzAQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICEXBvd2VyTWFuYWdlckJvbnVzCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAETa2V5Q2xhaW1XYXZlc0Ftb3VudAEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAhBjbGFpbVdhdmVzQW1vdW50CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEPa2V5UGVyaW9kTGVuZ3RoAAIQJXNfX3BlcmlvZExlbmd0aAEVa2V5SW52ZXN0UGVyaW9kTGVuZ3RoAAIWJXNfX2ludmVzdFBlcmlvZExlbmd0aAEYa2V5QmxvY2tQcm9jZXNzaW5nUmV3YXJkAAIZJXNfX2Jsb2NrUHJvY2Vzc2luZ1Jld2FyZAEVa2V5TmV4dEJsb2NrVG9Qcm9jZXNzAAIWJXNfX25leHRCbG9ja1RvUHJvY2VzcwERa2V5QmxvY2tQcm9jZXNzZWQBBmhlaWdodAkAuQkCCQDMCAICBCVzJWQJAMwIAgIOYmxvY2tQcm9jZXNzZWQJAMwIAgkApAMBBQZoZWlnaHQFA25pbAUDU0VQAQ1rZXlXaXRoZHJhd2FsAAIOJXNfX3dpdGhkcmF3YWwBE2tleVdpdGhkcmF3YWxQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICBCVzJWQJAMwIAgIQd2l0aGRyYXdhbFBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFGtleVdpdGhkcmF3YWxSZXF1ZXN0Agt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCndpdGhkcmF3YWwJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUDU0VQARZ2YWx1ZVdpdGhkcmF3YWxSZXF1ZXN0BAZzdGF0dXMNbHBBc3NldEFtb3VudAx0YXJnZXRQZXJpb2QJY2xhaW1UeElkBAxjbGFpbVR4SWRTdHIEByRtYXRjaDAFCWNsYWltVHhJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWIDCQABAgUHJG1hdGNoMAIEVW5pdAIEU09PTgkAAgECC01hdGNoIGVycm9yCQC5CQIJAMwIAgIIJXMlZCVkJXMJAMwIAgUGc3RhdHVzCQDMCAIJAKQDAQUNbHBBc3NldEFtb3VudAkAzAgCCQCkAwEFDHRhcmdldFBlcmlvZAkAzAgCBQxjbGFpbVR4SWRTdHIFA25pbAUDU0VQARRrZXlXaXRoZHJhd2FsSGlzdG9yeQILdXNlckFkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhF3aXRoZHJhd2FsSGlzdG9yeQkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQNTRVABG2tleVBlcmlvZFdpdGhkcmF3YWxBc3NldElkcwEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgxwZXJpb2RSZXdhcmQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARprZXlQZXJpb2RXaXRoZHJhd2FsQW1vdW50cwEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAhJwZXJpb2RSZXdhcmRBbW91bnQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQASFwYXJzZVdpdGhkcmF3YWxSZXF1ZXN0VmFsdWVPckZhaWwBAXMEBXBhcnRzCQC1CQIFAXMFA1NFUAMJAAACCQCQAwEFBXBhcnRzAAUEBnN0YXR1cwkAkQMCBQVwYXJ0cwABBA1scEFzc2V0QW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwACCQEHd3JhcEVycgECFWludmFsaWQgbHBBc3NldEFtb3VudAQMdGFyZ2V0UGVyaW9kCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwADCQEHd3JhcEVycgECFGludmFsaWQgdGFyZ2V0UGVyaW9kBAljbGFpbVR4SWQJAJEDAgUFcGFydHMABAkAlgoEBQZzdGF0dXMFDWxwQXNzZXRBbW91bnQFDHRhcmdldFBlcmlvZAUJY2xhaW1UeElkCQEIdGhyb3dFcnIBAiBpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCB2YWx1ZQAUZmFjdG9yeUFkZHJlc3NPcHRpb24EByRtYXRjaDAJAJ0IAgUEdGhpcwkBEWtleUZhY3RvcnlBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFGZhY3RvcnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECF2ludmFsaWQgZmFjdG9yeSBhZGRyZXNzAA9scEFzc2V0SWRPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBDGtleUxwQXNzZXRJZAADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQDZBAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAPbHBBc3NldElkT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFD2xwQXNzZXRJZE9wdGlvbgkBB3dyYXBFcnIBAhFpbnZhbGlkIGxwQXNzZXRJZAAacHJveHlUcmVhc3VyeUFkZHJlc3NPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBF2tleVByb3h5VHJlYXN1cnlBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAh5pbnZhbGlkIHByb3h5IHRyZWFzdXJ5IGFkZHJlc3MAGW1haW5UcmVhc3VyeUFkZHJlc3NPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBFmtleU1haW5UcmVhc3VyeUFkZHJlc3MAAwkAAQIFByRtYXRjaDECBlN0cmluZwQBcwUHJG1hdGNoMQkApggBBQFzAwkAAQIFByRtYXRjaDECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAHWJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzT3B0aW9uBAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARprZXlCdXNpbmVzc1RyZWFzdXJ5QWRkcmVzcwADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQCmCAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAZbWFpblRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRltYWluVHJlYXN1cnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECHWludmFsaWQgbWFpbiB0cmVhc3VyeSBhZGRyZXNzAB1idXNpbmVzc1RyZWFzdXJ5QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBR1idXNpbmVzc1RyZWFzdXJ5QWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAiFpbnZhbGlkIGJ1c2luZXNzIHRyZWFzdXJ5IGFkZHJlc3MAGnBvd2VyQ29udHJhY3RBZGRyZXNzT3B0aW9uBAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARdrZXlQb3dlckNvbnRyYWN0QWRkcmVzcwADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQCmCAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAacG93ZXJDb250cmFjdEFkZHJlc3NPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUacG93ZXJDb250cmFjdEFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIeaW52YWxpZCBwb3dlciBjb250cmFjdCBhZGRyZXNzABhwb3dlckFzc2V0SWRTdHJpbmdPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBvd2VyQXNzZXRJZAAJAQd3cmFwRXJyAQIYcG93ZXIgYXNzZXQgaWQgbm90IGZvdW5kABZsMm1wUHJveHlBZGRyZXNzT3B0aW9uBAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARNrZXlMMm1wUHJveHlBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABZsMm1wUHJveHlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFmwybXBQcm94eUFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIaaW52YWxpZCBsMm1wIHByb3h5IGFkZHJlc3MAF2wybXBBc3NldElkU3RyaW5nT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ5rZXlMMm1wQXNzZXRJZAAJAQd3cmFwRXJyAQIXbDJtcCBhc3NldCBpZCBub3QgZm91bmQBGWdldE1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAJmYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQJmYQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDECBlN0cmluZwQDcHViBQckbWF0Y2gxCQDZBAEFA3B1YgUEdW5pdAUEdW5pdAELb25seUFkZHJlc3MCAWkHYWRkcmVzcwMJAAACCAUBaQZjYWxsZXIFB2FkZHJlc3MGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAELb25seUZhY3RvcnkBAWkJAQtvbmx5QWRkcmVzcwIFAWkFFGZhY3RvcnlBZGRyZXNzT3JGYWlsARBpc1RydXN0ZWRBZGRyZXNzAQFpBApsaXN0U3RyaW5nCQELdmFsdWVPckVsc2UCCQCdCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEda2V5VHJ1c3RlZEZpbmFsaXplQWRkcmVzc0xpc3QAAgAEC2FkZHJlc3NMaXN0CQC1CQIFCmxpc3RTdHJpbmcFA1NFUAkBD2NvbnRhaW5zRWxlbWVudAIFC2FkZHJlc3NMaXN0CQClCAEIBQFpDG9yaWdpbkNhbGxlcgEPcmV3YXJkRm9yT3B0aW9uAgdyZXdhcmRzBnRhcmdldAQBcwkAkAMBBQdyZXdhcmRzBAskdDA3NzAwNzcyNQkAkQMCBQdyZXdhcmRzAAAEAmEwCAULJHQwNzcwMDc3MjUCXzEEAnIwCAULJHQwNzcwMDc3MjUCXzIECyR0MDc3Mjg3NzUzCQCRAwIFB3Jld2FyZHMAAQQCYTEIBQskdDA3NzI4Nzc1MwJfMQQCcjEIBQskdDA3NzI4Nzc1MwJfMgQLJHQwNzc1Njc3ODEJAJEDAgUHcmV3YXJkcwACBAJhMggFCyR0MDc3NTY3NzgxAl8xBAJyMggFCyR0MDc3NTY3NzgxAl8yAwMJAGYCBQFzAAAJAAACBQJhMAUGdGFyZ2V0BwUCcjADAwkAZgIFAXMAAQkAAAIFAmExBQZ0YXJnZXQHBQJyMQMDCQBmAgUBcwACCQAAAgUCYTIFBnRhcmdldAcFAnIyBQR1bml0AQ5jYWxjdWxhdGVQcmljZQENbHBQYXJ0SW5XYXZlcwQTbHBBc3NldEFtb3VudFRvQnVybgkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDWtleVdpdGhkcmF3YWwAAAAED2xwQXNzZXRRdWFudGl0eQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQ9scEFzc2V0SWRPckZhaWwJAQd3cmFwRXJyAQIUaW52YWxpZCBscEFzc2V0IGluZm8IcXVhbnRpdHkECG5ld1ByaWNlCQBrAwUNbHBQYXJ0SW5XYXZlcwUGU0NBTEU4CQBlAgUPbHBBc3NldFF1YW50aXR5BRNscEFzc2V0QW1vdW50VG9CdXJuBBNjaGVja0lmUHJpY2VOb3RaZXJvAwkBAiE9AgUIbmV3UHJpY2UAAAYJAQh0aHJvd0VycgECFExQIHByaWNlIGNhbm5vdCBiZSAwAwkAAAIFE2NoZWNrSWZQcmljZU5vdFplcm8FE2NoZWNrSWZQcmljZU5vdFplcm8EFGxwQXNzZXRGaW5hbFF1YW50aXR5CQBlAgUPbHBBc3NldFF1YW50aXR5BRNscEFzc2V0QW1vdW50VG9CdXJuCQCVCgMFCG5ld1ByaWNlBRNscEFzc2V0QW1vdW50VG9CdXJuBRRscEFzc2V0RmluYWxRdWFudGl0eQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEXY2xhaW1Db2xsYXRlcmFsSU5URVJOQUwCEHVzZXJBZGRyZXNzQnl0ZXMEdHhJZAQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEF3dpdGhkcmF3YWxSZXF1ZXN0T3B0aW9uCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzBQR0eElkCQEHd3JhcEVycgECGmludmFsaWQgd2l0aGRyYXdhbCByZXF1ZXN0BAskdDA4OTQ4OTA2MQkBIXBhcnNlV2l0aGRyYXdhbFJlcXVlc3RWYWx1ZU9yRmFpbAEFF3dpdGhkcmF3YWxSZXF1ZXN0T3B0aW9uBAZzdGF0dXMIBQskdDA4OTQ4OTA2MQJfMQQNbHBBc3NldEFtb3VudAgFCyR0MDg5NDg5MDYxAl8yBAx1bmxvY2tQZXJpb2QIBQskdDA4OTQ4OTA2MQJfMwQJY2xhaW1UeElkCAULJHQwODk0ODkwNjECXzQDCQBmAgUMdW5sb2NrUGVyaW9kBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEIdGhyb3dFcnIBAiFpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCBwZXJpb2QEC3ByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFDHVubG9ja1BlcmlvZAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBAt3YXZlc0Ftb3VudAMJAGYCBQtwcmljZU9yRmFpbAAACQBrAwUNbHBBc3NldEFtb3VudAULcHJpY2VPckZhaWwFBlNDQUxFOAAABAx0YXJnZXRQZXJpb2QJAGUCBQx1bmxvY2tQZXJpb2QAAQQMYXNzZXRzU3RyaW5nCQERQGV4dHJOYXRpdmUoMTA1MykCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBG2tleVBlcmlvZFdpdGhkcmF3YWxBc3NldElkcwEFDHRhcmdldFBlcmlvZAQNYW1vdW50c1N0cmluZwkBEUBleHRyTmF0aXZlKDEwNTMpAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARprZXlQZXJpb2RXaXRoZHJhd2FsQW1vdW50cwEFDHRhcmdldFBlcmlvZAQVdG90YWxMcEFtb3VudEluUGVyaW9kCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQETa2V5V2l0aGRyYXdhbFBlcmlvZAEFDHRhcmdldFBlcmlvZAAABA51c2VyUGFydFNDQUxFOAMJAAACBRV0b3RhbExwQW1vdW50SW5QZXJpb2QAAAAACQBrAwUNbHBBc3NldEFtb3VudAUGU0NBTEU4BRV0b3RhbExwQW1vdW50SW5QZXJpb2QKARJnZXRVc2VyUGFydEFtb3VudHMCDGN1cnJlbnRTdGF0ZQZhbW91bnQEDnVzZXJQYXJ0QW1vdW50CQBrAwkBDXBhcnNlSW50VmFsdWUBBQZhbW91bnQFDnVzZXJQYXJ0U0NBTEU4BQZTQ0FMRTgJAM0IAgUMY3VycmVudFN0YXRlCQCkAwEFDnVzZXJQYXJ0QW1vdW50BAthbW91bnRzTGlzdAkAvQkCBQ1hbW91bnRzU3RyaW5nBQNTRVAEDWFtb3VudHNQcmVmaXgJAQV2YWx1ZQEJAJEDAgULYW1vdW50c0xpc3QAAAQYYW1vdW50c0xpc3RXaXRob3V0UHJlZml4CQDRCAIJAL0JAgUNYW1vdW50c1N0cmluZwUDU0VQAAAED3VzZXJQYXJ0QW1vdW50cwoAAiRsBRhhbW91bnRzTGlzdFdpdGhvdXRQcmVmaXgKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdldFVzZXJQYXJ0QW1vdW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQVdXNlclBhcnRBbW91bnRzU3RyaW5nCQC5CQIJAMwIAgUNYW1vdW50c1ByZWZpeAkAzAgCCQC5CQIFD3VzZXJQYXJ0QW1vdW50cwUDU0VQBQNuaWwFA1NFUAkAmAoGBQt1c2VyQWRkcmVzcwUNbHBBc3NldEFtb3VudAUMdGFyZ2V0UGVyaW9kBQt3YXZlc0Ftb3VudAUMYXNzZXRzU3RyaW5nBRV1c2VyUGFydEFtb3VudHNTdHJpbmcBJWNsYWltQ29sbGF0ZXJhbFJFQURPTkxZU3RyaW5nUmVzcG9uc2UCEHVzZXJBZGRyZXNzQnl0ZXMEdHhJZAQNJHQwMTA3NTAxMDkxNgkBF2NsYWltQ29sbGF0ZXJhbElOVEVSTkFMAgUQdXNlckFkZHJlc3NCeXRlcwUEdHhJZAQLdXNlckFkZHJlc3MIBQ0kdDAxMDc1MDEwOTE2Al8xBA1scEFzc2V0QW1vdW50CAUNJHQwMTA3NTAxMDkxNgJfMgQMdGFyZ2V0UGVyaW9kCAUNJHQwMTA3NTAxMDkxNgJfMwQLd2F2ZXNBbW91bnQIBQ0kdDAxMDc1MDEwOTE2Al80BAxhc3NldHNTdHJpbmcIBQ0kdDAxMDc1MDEwOTE2Al81BA1hbW91bnRzU3RyaW5nCAUNJHQwMTA3NTAxMDkxNgJfNgQGYXNzZXRzCQC5CQIJANEIAgkAvQkCBQxhc3NldHNTdHJpbmcFA1NFUAAAAgE6BAdhbW91bnRzCQC5CQIJANEIAgkAvQkCBQ1hbW91bnRzU3RyaW5nBQNTRVAAAAIBOgkAuQkCCQDMCAICBiVkJXMlcwkAzAgCCQCkAwEFC3dhdmVzQW1vdW50CQDMCAIFBmFzc2V0cwkAzAgCBQdhbW91bnRzBQNuaWwFA1NFUAEOZ2V0UmV3YXJkU3BsaXQBFWdlbmVyYXRvclJld2FyZEFtb3VudAQPcG93ZXJTaGFyZVJhdGlvCQCWAwEJAMwIAgAACQDMCAIJAJcDAQkAzAgCCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQESa2V5UG93ZXJTaGFyZVJhdGlvAAAACQDMCAIFBlNDQUxFOAUDbmlsBQNuaWwEEWJ1c2luZXNzUGFydFJhdGlvCQCWAwEJAMwIAgAACQDMCAIJAJcDAQkAzAgCCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEXa2V5QnVzaW5lc3NUcmVhc3VyeVBhcnQAAAAJAMwIAgUGU0NBTEU4BQNuaWwFA25pbAQRYW1vdW50VG9Qb3dlclBhcnQJAGsDBRVnZW5lcmF0b3JSZXdhcmRBbW91bnQFD3Bvd2VyU2hhcmVSYXRpbwUGU0NBTEU4BBpidXNpbmVzc1RyZWFzdXJ5QW1vdW50UGFydAkAawMFFWdlbmVyYXRvclJld2FyZEFtb3VudAURYnVzaW5lc3NQYXJ0UmF0aW8FBlNDQUxFOAQPcmV3YXJkUmVtYWluZGVyCQBlAgkAZQIFFWdlbmVyYXRvclJld2FyZEFtb3VudAURYW1vdW50VG9Qb3dlclBhcnQFGmJ1c2luZXNzVHJlYXN1cnlBbW91bnRQYXJ0AwkAZgIFD3Jld2FyZFJlbWFpbmRlcgAACQCVCgMFEWFtb3VudFRvUG93ZXJQYXJ0BRpidXNpbmVzc1RyZWFzdXJ5QW1vdW50UGFydAUPcmV3YXJkUmVtYWluZGVyCQEIdGhyb3dFcnIBAiphbW91bnQgdG8gbWFpbiB0cmVhc3VyeSBjYW5ub3QgYmUgbmVnYXRpdmUBGGNhbGNSZXdhcmRTcGxpdEZvckFtb3VudAEGYW1vdW50BA0kdDAxMjAxNTEyMTA4CQEOZ2V0UmV3YXJkU3BsaXQBBQZhbW91bnQEEWFtb3VudFRvUG93ZXJQYXJ0CAUNJHQwMTIwMTUxMjEwOAJfMQQaYnVzaW5lc3NUcmVhc3VyeUFtb3VudFBhcnQIBQ0kdDAxMjAxNTEyMTA4Al8yBA9yZXdhcmRSZW1haW5kZXIIBQ0kdDAxMjAxNTEyMTA4Al8zBBVibG9ja1Byb2Nlc3NpbmdSZXdhcmQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBGGtleUJsb2NrUHJvY2Vzc2luZ1Jld2FyZAAJAQd3cmFwRXJyAQIfaW52YWxpZCBibG9jayBwcm9jZXNzaW5nIHJld2FyZAQgYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3IJAGkCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQFHGJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemVNYXgECnRvTHBBbW91bnQJAGUCBQ9yZXdhcmRSZW1haW5kZXIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAkAlwoFBRFhbW91bnRUb1Bvd2VyUGFydAUaYnVzaW5lc3NUcmVhc3VyeUFtb3VudFBhcnQFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUKdG9McEFtb3VudAUGYW1vdW50DAFpARNyZXdhcmRTcGxpdFJFQURPTkxZAAQRdGFyZ2V0QmxvY2tIZWlnaHQJAGUCBQZoZWlnaHQAAQQPdGFyZ2V0QmxvY2tJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAO0HAQURdGFyZ2V0QmxvY2tIZWlnaHQJAQd3cmFwRXJyAQISaW52YWxpZCBibG9jayBpbmZvBBR0cmVhc3VyeVJld2FyZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEPcmV3YXJkRm9yT3B0aW9uAggFD3RhcmdldEJsb2NrSW5mbwdyZXdhcmRzBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBB3dyYXBFcnIBCQCsAgICI2ludmFsaWQgdHJlYXN1cnkgcmV3YXJkIGZvciBoZWlnaHQgCQCkAwEFEXRhcmdldEJsb2NrSGVpZ2h0CQCUCgIFA25pbAkBGGNhbGNSZXdhcmRTcGxpdEZvckFtb3VudAEFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsAWkBB2NsYWltTFABEHVzZXJBZGRyZXNzQnl0ZXMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQJYXZhaWxhYmxlCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEMa2V5QXZhaWxhYmxlAQULdXNlckFkZHJlc3MAAAQHY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBCmtleUNsYWltZWQBBQt1c2VyQWRkcmVzcwAABA5mYWN0b3J5QWN0aW9ucwMJAGYCBQlhdmFpbGFibGUAAAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAg10cmFuc2ZlckFzc2V0CQDMCAIFEHVzZXJBZGRyZXNzQnl0ZXMJAMwIAgUJYXZhaWxhYmxlCQDMCAIFD2xwQXNzZXRJZE9yRmFpbAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQxrZXlBdmFpbGFibGUBBQt1c2VyQWRkcmVzcwkAzAgCAAAFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEKa2V5Q2xhaW1lZAEFC3VzZXJBZGRyZXNzCQDMCAIJAGQCBQdjbGFpbWVkBQlhdmFpbGFibGUFA25pbAUDbmlsBQNuaWwJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0JAJQKAgUDbmlsBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhmaW5hbGl6ZQUQdXNlckFkZHJlc3NCeXRlcxNkb25hdGlvblBhcnRJbldhdmVzDWxwUGFydEluV2F2ZXMQY2xhaW1QYXJ0SW5XYXZlcxVwb3dlclN0YWtlUGFydEluV2F2ZXMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEDHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEPa2V5UGVyaW9kTGVuZ3RoAAkBB3dyYXBFcnIBAhVpbnZhbGlkIHBlcmlvZCBsZW5ndGgEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBBJuZXh0QmxvY2tUb1Byb2Nlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAQd3cmFwRXJyAQIdaW52YWxpZCBuZXh0IGJsb2NrIHRvIHByb2Nlc3MED3BlcmlvZEVuZEhlaWdodAkAZQIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBAZjaGVja3MJAMwIAgMDCQEQaXNUcnVzdGVkQWRkcmVzcwEFAWkGCQAAAggFAWkMb3JpZ2luQ2FsbGVyBRltYWluVHJlYXN1cnlBZGRyZXNzT3JGYWlsBgkBCHRocm93RXJyAQkArAICAh1wZXJtaXNzaW9uIGRlbmllZCAoZmluYWxpemUpIAkApQgBCAUBaQxvcmlnaW5DYWxsZXIJAMwIAgMJAGYCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFD3BlcmlvZEVuZEhlaWdodAYJAQh0aHJvd0VycgECEnVucHJvY2Vzc2VkIGJsb2NrcwkAzAgCAwkAZwIFE2RvbmF0aW9uUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECFWludmFsaWQgZG9uYXRpb24gcGFydAkAzAgCAwkAZwIFDWxwUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECD2ludmFsaWQgbHAgcGFydAkAzAgCAwkAZwIFEGNsYWltUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECEmludmFsaWQgY2xhaW0gcGFydAkAzAgCAwkAZwIFFXBvd2VyU3Rha2VQYXJ0SW5XYXZlcwAABgkBCHRocm93RXJyAQIWaW52YWxpZCBQV1Igc3Rha2UgcGFydAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA0kdDAxNTUxMDE1NjE1CQEOY2FsY3VsYXRlUHJpY2UBBQ1scFBhcnRJbldhdmVzBAhuZXdQcmljZQgFDSR0MDE1NTEwMTU2MTUCXzEEE2xwQXNzZXRBbW91bnRUb0J1cm4IBQ0kdDAxNTUxMDE1NjE1Al8yBBRscEFzc2V0RmluYWxRdWFudGl0eQgFDSR0MDE1NTEwMTU2MTUCXzMECW5ld1BlcmlvZAkAZAIFE2N1cnJlbnRQZXJpb2RPckZhaWwAAQoBDGFkZE5ld0FjdGlvbgIHYWN0aW9ucwdwYXltZW50BA0kdDAxNTc2MzE1ODI1BQdhY3Rpb25zBA9zY3JpcHRUcmFuc2ZlcnMIBQ0kdDAxNTc2MzE1ODI1Al8xBA5hc3NldElkc1N0cmluZwgFDSR0MDE1NzYzMTU4MjUCXzIEDWFtb3VudHNTdHJpbmcIBQ0kdDAxNTc2MzE1ODI1Al8zBA1wYXltZW50QW1vdW50CAUHcGF5bWVudAZhbW91bnQEDnBheW1lbnRBc3NldElkCAUHcGF5bWVudAdhc3NldElkAwkAAAIJAQ9hc3NldElkVG9TdHJpbmcBBQ5wYXltZW50QXNzZXRJZAUXbDJtcEFzc2V0SWRTdHJpbmdPckZhaWwEE3RyYW5zZmVyVG9MMm1wUHJveHkJAQ5TY3JpcHRUcmFuc2ZlcgMFFmwybXBQcm94eUFkZHJlc3NPckZhaWwFDXBheW1lbnRBbW91bnQFDnBheW1lbnRBc3NldElkCQCVCgMJAM0IAgUPc2NyaXB0VHJhbnNmZXJzBRN0cmFuc2ZlclRvTDJtcFByb3h5BQ5hc3NldElkc1N0cmluZwUNYW1vdW50c1N0cmluZwQRbmV3QXNzZXRJZHNTdHJpbmcJAKwCAgICJXMJALkJAgkAzAgCBQ5hc3NldElkc1N0cmluZwkAzAgCCQEPYXNzZXRJZFRvU3RyaW5nAQUOcGF5bWVudEFzc2V0SWQFA25pbAUDU0VQBBBuZXdBbW91bnRzU3RyaW5nCQCsAgICAiVkCQC5CQIJAMwIAgUNYW1vdW50c1N0cmluZwkAzAgCCQCkAwEFDXBheW1lbnRBbW91bnQFA25pbAUDU0VQBBFuZXdTY3JpcHRUcmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwUUZmFjdG9yeUFkZHJlc3NPckZhaWwFDXBheW1lbnRBbW91bnQFDnBheW1lbnRBc3NldElkCQCVCgMJAM0IAgUPc2NyaXB0VHJhbnNmZXJzBRFuZXdTY3JpcHRUcmFuc2ZlcgURbmV3QXNzZXRJZHNTdHJpbmcFEG5ld0Ftb3VudHNTdHJpbmcEDSR0MDE2NjE5MTY3MTAKAAIkbAgFAWkIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAIAAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGFkZE5ld0FjdGlvbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQPc2NyaXB0VHJhbnNmZXJzCAUNJHQwMTY2MTkxNjcxMAJfMQQIQXNzZXRJZHMIBQ0kdDAxNjYxOTE2NzEwAl8yBAdBbW91bnRzCAUNJHQwMTY2MTkxNjcxMAJfMwQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARRrZXlQb3dlck1hbmFnZXJCb251cwEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAMwIAgUVcG93ZXJTdGFrZVBhcnRJbldhdmVzBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBE2tleUNsYWltV2F2ZXNBbW91bnQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQDMCAIFEGNsYWltUGFydEluV2F2ZXMFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEQa2V5Q3VycmVudFBlcmlvZAAJAMwIAgUJbmV3UGVyaW9kBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBEWtleVByaWNlRm9yUGVyaW9kAQUJbmV3UGVyaW9kCQDMCAIFCG5ld1ByaWNlBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDmtleVN0YXJ0SGVpZ2h0AQUJbmV3UGVyaW9kCQDMCAIJAGQCBQ9wZXJpb2RFbmRIZWlnaHQAAQUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIEYnVybgkAzAgCBRNscEFzc2V0QW1vdW50VG9CdXJuBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDWtleVdpdGhkcmF3YWwACQDMCAIAAAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARNrZXlXaXRoZHJhd2FsUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkAzAgCBRNscEFzc2V0QW1vdW50VG9CdXJuBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBC2tleUludmVzdGVkAQUEdW5pdAkAzAgCBQ1scFBhcnRJbldhdmVzBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBCmtleURvbmF0ZWQBBQR1bml0CQDMCAIFE2RvbmF0aW9uUGFydEluV2F2ZXMFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC3N0cmluZ0VudHJ5CQDMCAIJARtrZXlQZXJpb2RXaXRoZHJhd2FsQXNzZXRJZHMBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQDMCAIFCEFzc2V0SWRzBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtzdHJpbmdFbnRyeQkAzAgCCQEaa2V5UGVyaW9kV2l0aGRyYXdhbEFtb3VudHMBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQDMCAIFB0Ftb3VudHMFA25pbAUDbmlsBQNuaWwJAJQKAgUPc2NyaXB0VHJhbnNmZXJzBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBmaW5hbGl6ZVJFQURPTkxZBBNkb25hdGlvblBhcnRJbldhdmVzDWxwUGFydEluV2F2ZXMQY2xhaW1QYXJ0SW5XYXZlcxVwb3dlclN0YWtlUGFydEluV2F2ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBlcmlvZExlbmd0aAAJAQd3cmFwRXJyAQIVaW52YWxpZCBwZXJpb2QgbGVuZ3RoBBJjdXJyZW50U3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDmtleVN0YXJ0SGVpZ2h0AQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIHN0YXJ0IGhlaWdodAQSY3VycmVudFByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQSbmV4dEJsb2NrVG9Qcm9jZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MACQEHd3JhcEVycgECHWludmFsaWQgbmV4dCBibG9jayB0byBwcm9jZXNzBA9wZXJpb2RFbmRIZWlnaHQJAGUCCQBkAgUSY3VycmVudFN0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgAAQQGY2hlY2tzCQDMCAIDCQBmAgUSbmV4dEJsb2NrVG9Qcm9jZXNzBQ9wZXJpb2RFbmRIZWlnaHQGCQEIdGhyb3dFcnIBAhJ1bnByb2Nlc3NlZCBibG9ja3MJAMwIAgMJAGcCBRNkb25hdGlvblBhcnRJbldhdmVzAAAGCQEIdGhyb3dFcnIBAhVpbnZhbGlkIGRvbmF0aW9uIHBhcnQJAMwIAgMJAGcCBQ1scFBhcnRJbldhdmVzAAAGCQEIdGhyb3dFcnIBAg9pbnZhbGlkIGxwIHBhcnQJAMwIAgMJAGcCBRBjbGFpbVBhcnRJbldhdmVzAAAGCQEIdGhyb3dFcnIBAhJpbnZhbGlkIGNsYWltIHBhcnQJAMwIAgMJAGcCBRVwb3dlclN0YWtlUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECFmludmFsaWQgUFdSIHN0YWtlIHBhcnQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNJHQwMTk3MjcxOTgzMgkBDmNhbGN1bGF0ZVByaWNlAQUNbHBQYXJ0SW5XYXZlcwQIbmV3UHJpY2UIBQ0kdDAxOTcyNzE5ODMyAl8xBBNscEFzc2V0QW1vdW50VG9CdXJuCAUNJHQwMTk3MjcxOTgzMgJfMgQUbHBBc3NldEZpbmFsUXVhbnRpdHkIBQ0kdDAxOTcyNzE5ODMyAl8zCQCUCgIFA25pbAkAmAoGBRBjbGFpbVBhcnRJbldhdmVzBQ1scFBhcnRJbldhdmVzBRNkb25hdGlvblBhcnRJbldhdmVzBQhuZXdQcmljZQUTbHBBc3NldEFtb3VudFRvQnVybgUUbHBBc3NldEZpbmFsUXVhbnRpdHkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEGaW52ZXN0ARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBBJjdXJyZW50U3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDmtleVN0YXJ0SGVpZ2h0AQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIHN0YXJ0IGhlaWdodAQSaW52ZXN0UGVyaW9kTGVuZ3RoCQERQGV4dHJOYXRpdmUoMTA1MCkCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFWtleUludmVzdFBlcmlvZExlbmd0aAAEC2hlaWdodENoZWNrAwkAZgIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFEmludmVzdFBlcmlvZExlbmd0aAUGaGVpZ2h0BgkBCHRocm93RXJyAQIhdG9vIGxhdGUgdG8gaW52ZXN0IGluIHRoaXMgcGVyaW9kAwkAAAIFC2hlaWdodENoZWNrBQtoZWlnaHRDaGVjawQSY3VycmVudFByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQHcGF5bWVudAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkBCHRocm93RXJyAQIQaW52YWxpZCBwYXltZW50cwQNJHQwMjA5NDEyMTExOAMDCQAAAggFB3BheW1lbnQHYXNzZXRJZAUEdW5pdAkAZgIIBQdwYXltZW50BmFtb3VudAAABwkAlAoCCAUHcGF5bWVudAZhbW91bnQIBQdwYXltZW50B2Fzc2V0SWQJAQh0aHJvd0VycgECFmludmFsaWQgcGF5bWVudCBhbW91bnQEDXBheW1lbnRBbW91bnQIBQ0kdDAyMDk0MTIxMTE4Al8xBA5wYXltZW50QXNzZXRJZAgFDSR0MDIwOTQxMjExMTgCXzIEDHRyZWFzdXJ5UGFydAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBF2tleUJ1c2luZXNzVHJlYXN1cnlQYXJ0AAAABBtwYXltZW50c1dpdGhvdXRUcmVhc3VyeVBhcnQJAGsDBQ1wYXltZW50QW1vdW50CQBlAgUGU0NBTEU4BQx0cmVhc3VyeVBhcnQFBlNDQUxFOAQNbHBBc3NldEFtb3VudAMJAGYCBRJjdXJyZW50UHJpY2VPckZhaWwAAAkAawMFG3BheW1lbnRzV2l0aG91dFRyZWFzdXJ5UGFydAUGU0NBTEU4BRJjdXJyZW50UHJpY2VPckZhaWwAAAQIaW52ZXN0ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQtrZXlJbnZlc3RlZAEFBHVuaXQAAAQHYWN0aW9ucwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRltYWluVHJlYXN1cnlBZGRyZXNzT3JGYWlsBRtwYXltZW50c1dpdGhvdXRUcmVhc3VyeVBhcnQFDnBheW1lbnRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFHWJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzT3JGYWlsBQx0cmVhc3VyeVBhcnQFDnBheW1lbnRBc3NldElkBQNuaWwEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQELa2V5SW52ZXN0ZWQBBQR1bml0CQDMCAIJAGQCBQhpbnZlc3RlZAUbcGF5bWVudHNXaXRob3V0VHJlYXN1cnlQYXJ0BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgdyZWlzc3VlCQDMCAIFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDXRyYW5zZmVyQXNzZXQJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBQ1scEFzc2V0QW1vdW50CQDMCAIFD2xwQXNzZXRJZE9yRmFpbAUDbmlsBQNuaWwFA25pbAkAlAoCBQdhY3Rpb25zBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwEQdXNlckFkZHJlc3NCeXRlcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBBNjdXJyZW50UGVyaW9kT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARBrZXlDdXJyZW50UGVyaW9kAAkBB3dyYXBFcnIBAg5pbnZhbGlkIHBlcmlvZAQMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ9rZXlQZXJpb2RMZW5ndGgACQEHd3JhcEVycgECFWludmFsaWQgcGVyaW9kIGxlbmd0aAQSY3VycmVudFN0YXJ0SGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ5rZXlTdGFydEhlaWdodAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQIUaW52YWxpZCBzdGFydCBoZWlnaHQEC2hlaWdodENoZWNrAwkAZgIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAUGaGVpZ2h0BgkBCHRocm93RXJyAQIjdG9vIGxhdGUgdG8gd2l0aGRyYXcgaW4gdGhpcyBwZXJpb2QDCQAAAgULaGVpZ2h0Q2hlY2sFC2hlaWdodENoZWNrBAdwYXltZW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQEIdGhyb3dFcnIBCQEHd3JhcEVycgECEGludmFsaWQgcGF5bWVudHMEDnBheW1lbnRBc3NldElkAwkAAAIIBQdwYXltZW50B2Fzc2V0SWQFD2xwQXNzZXRJZE9yRmFpbAUPbHBBc3NldElkT3JGYWlsCQEIdGhyb3dFcnIBAhVpbnZhbGlkIHBheW1lbnQgYXNzZXQEDXBheW1lbnRBbW91bnQDCQBmAggFB3BheW1lbnQGYW1vdW50AAAIBQdwYXltZW50BmFtb3VudAkBCHRocm93RXJyAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAQKd2l0aGRyYXdhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDWtleVdpdGhkcmF3YWwAAAAEB2FjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUUZmFjdG9yeUFkZHJlc3NPckZhaWwFDXBheW1lbnRBbW91bnQFDnBheW1lbnRBc3NldElkBQNuaWwEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQENa2V5V2l0aGRyYXdhbAAJAMwIAgkAZAIFCndpdGhkcmF3YWwFDXBheW1lbnRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC3N0cmluZ0VudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJARZ2YWx1ZVdpdGhkcmF3YWxSZXF1ZXN0BAUHUEVORElORwUNcGF5bWVudEFtb3VudAkAZAIFE2N1cnJlbnRQZXJpb2RPckZhaWwAAQUEdW5pdAUDbmlsBQNuaWwFA25pbAMJAAACBQ5mYWN0b3J5QWN0aW9ucwUOZmFjdG9yeUFjdGlvbnMJAJQKAgUHYWN0aW9ucwUOZmFjdG9yeUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY2FuY2VsV2l0aGRyYXcCEHVzZXJBZGRyZXNzQnl0ZXMEdHhJZAQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQEIdGhyb3dFcnIBAhxjYW5jZWxXaXRoZHJhdyBpcyBkZXByZWNhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD2NsYWltQ29sbGF0ZXJhbAIQdXNlckFkZHJlc3NCeXRlcwR0eElkBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEDSR0MDI0MDg1MjQyNzAJARdjbGFpbUNvbGxhdGVyYWxJTlRFUk5BTAIFEHVzZXJBZGRyZXNzQnl0ZXMJANkEAQUEdHhJZAQLdXNlckFkZHJlc3MIBQ0kdDAyNDA4NTI0MjcwAl8xBA1scEFzc2V0QW1vdW50CAUNJHQwMjQwODUyNDI3MAJfMgQMdGFyZ2V0UGVyaW9kCAUNJHQwMjQwODUyNDI3MAJfMwQLd2F2ZXNBbW91bnQIBQ0kdDAyNDA4NTI0MjcwAl80BAxhc3NldHNTdHJpbmcIBQ0kdDAyNDA4NTI0MjcwAl81BA1hbW91bnRzU3RyaW5nCAUNJHQwMjQwODUyNDI3MAJfNgQKYXNzZXRzTGlzdAkA0QgCCQC9CQIFDGFzc2V0c1N0cmluZwUDU0VQAAAEC2Ftb3VudHNMaXN0CQDRCAIJAL0JAgUNYW1vdW50c1N0cmluZwUDU0VQAAAEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC2RlbGV0ZUVudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzCQDZBAEFBHR4SWQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbEhpc3RvcnkCBQt1c2VyQWRkcmVzcwkA2QQBBQR0eElkCQDMCAIFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDnRyYW5zZmVyQXNzZXRzCQDMCAIFEHVzZXJBZGRyZXNzQnl0ZXMJAMwIAgUKYXNzZXRzTGlzdAkAzAgCBQthbW91bnRzTGlzdAUDbmlsBQNuaWwFA25pbAkAlAoCBQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NsYWltQ29sbGF0ZXJhbEJ1bGsCEHVzZXJBZGRyZXNzQnl0ZXMFdHhJZHMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgoBDGFkZE5ld0FjdGlvbgIFc3RhdGUEdHhJZAQNJHQwMjUwMjYyNTIyNQkBF2NsYWltQ29sbGF0ZXJhbElOVEVSTkFMAgUQdXNlckFkZHJlc3NCeXRlcwkA2QQBBQR0eElkBAt1c2VyQWRkcmVzcwgFDSR0MDI1MDI2MjUyMjUCXzEEDWxwQXNzZXRBbW91bnQIBQ0kdDAyNTAyNjI1MjI1Al8yBAx0YXJnZXRQZXJpb2QIBQ0kdDAyNTAyNjI1MjI1Al8zBAt3YXZlc0Ftb3VudAgFDSR0MDI1MDI2MjUyMjUCXzQEDGFzc2V0c1N0cmluZwgFDSR0MDI1MDI2MjUyMjUCXzUEDWFtb3VudHNTdHJpbmcIBQ0kdDAyNTAyNjI1MjI1Al82BAphc3NldHNMaXN0CQDRCAIJAL0JAgUMYXNzZXRzU3RyaW5nBQNTRVAAAAQLYW1vdW50c0xpc3QJANEIAgkAvQkCBQ1hbW91bnRzU3RyaW5nBQNTRVAAAAQKbmV3QWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtkZWxldGVFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCBQt1c2VyQWRkcmVzcwkA2QQBBQR0eElkBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBFGtleVdpdGhkcmF3YWxIaXN0b3J5AgULdXNlckFkZHJlc3MJANkEAQUEdHhJZAkAzAgCBQ1scEFzc2V0QW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAg50cmFuc2ZlckFzc2V0cwkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFCmFzc2V0c0xpc3QJAMwIAgULYW1vdW50c0xpc3QFA25pbAUDbmlsBQNuaWwJAM4IAgUFc3RhdGUFCm5ld0FjdGlvbnMEEWFsbEZhY3RvcnlBY3Rpb25zCgACJGwFBXR4SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxhZGROZXdBY3Rpb24CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAgUDbmlsBRFhbGxGYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdjbGFpbUNvbGxhdGVyYWxSRUFET05MWQIQdXNlckFkZHJlc3NCeXRlcwR0eElkBAhyZXNwb25zZQkBJWNsYWltQ29sbGF0ZXJhbFJFQURPTkxZU3RyaW5nUmVzcG9uc2UCBRB1c2VyQWRkcmVzc0J5dGVzCQDZBAEFBHR4SWQJAJQKAgUDbmlsBQhyZXNwb25zZQFpARtjbGFpbUNvbGxhdGVyYWxCdWxrUkVBRE9OTFkCEHVzZXJBZGRyZXNzQnl0ZXMFdHhJZHMKAQtwcm9jZXNzVHhJZAIFc3RhdGUEdHhJZAQIcmVzcG9uc2UJASVjbGFpbUNvbGxhdGVyYWxSRUFET05MWVN0cmluZ1Jlc3BvbnNlAgUQdXNlckFkZHJlc3NCeXRlcwkA2QQBBQR0eElkCQDNCAIFBXN0YXRlBQhyZXNwb25zZQQMYWxsUmVzcG9uc2VzCgACJGwFBXR4SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQtwcm9jZXNzVHhJZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCBQNuaWwFDGFsbFJlc3BvbnNlcwFpAQ1wcm9jZXNzQmxvY2tzARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBlcmlvZExlbmd0aAAJAQd3cmFwRXJyAQIVaW52YWxpZCBwZXJpb2QgbGVuZ3RoBBJjdXJyZW50U3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDmtleVN0YXJ0SGVpZ2h0AQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIHN0YXJ0IGhlaWdodAQSY3VycmVudFByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQSbmV4dEJsb2NrVG9Qcm9jZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MACQEHd3JhcEVycgECHWludmFsaWQgbmV4dCBibG9jayB0byBwcm9jZXNzBA9wZXJpb2RFbmRIZWlnaHQJAGUCCQBkAgUSY3VycmVudFN0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgAAQQZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQMDAwkAZwIFBmhlaWdodAUSbmV4dEJsb2NrVG9Qcm9jZXNzAwkAZwIFEm5leHRCbG9ja1RvUHJvY2VzcwUSY3VycmVudFN0YXJ0SGVpZ2h0BgkAAAIFE2N1cnJlbnRQZXJpb2RPckZhaWwAAAcJAGcCBQ9wZXJpb2RFbmRIZWlnaHQFEm5leHRCbG9ja1RvUHJvY2VzcwcJAJcDAQkAzAgCCQBkAgkAZQIFD3BlcmlvZEVuZEhlaWdodAUSbmV4dEJsb2NrVG9Qcm9jZXNzAAEJAMwIAgUcYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZU1heAUDbmlsCQEIdGhyb3dFcnIBCQEHd3JhcEVycgECFGludmFsaWQgdGFyZ2V0IGJsb2NrBBVibG9ja1Byb2Nlc3NpbmdSZXdhcmQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBGGtleUJsb2NrUHJvY2Vzc2luZ1Jld2FyZAAJAQd3cmFwRXJyAQIfaW52YWxpZCBibG9jayBwcm9jZXNzaW5nIHJld2FyZAQgYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3IJAGkCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUEKWJsb2NrUHJvY2Vzc2luZ1Jld2FyZEJ5R2VuZXJhdG9yUmVtYWluZGVyCQBlAgUVYmxvY2tQcm9jZXNzaW5nUmV3YXJkCQBoAgUgYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3IFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUKAQNtYXACA2FjYwNpbmMDCQBnAgUDaW5jBRlibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplBQNhY2MEEXRhcmdldEJsb2NrSGVpZ2h0CQBkAgUSbmV4dEJsb2NrVG9Qcm9jZXNzBQNpbmMED3RhcmdldEJsb2NrSW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDtBwEFEXRhcmdldEJsb2NrSGVpZ2h0CQEHd3JhcEVycgECEmludmFsaWQgYmxvY2sgaW5mbwQUdHJlYXN1cnlSZXdhcmRPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBD3Jld2FyZEZvck9wdGlvbgIIBQ90YXJnZXRCbG9ja0luZm8HcmV3YXJkcwUacHJveHlUcmVhc3VyeUFkZHJlc3NPckZhaWwJAQd3cmFwRXJyAQkArAICAiNpbnZhbGlkIHRyZWFzdXJ5IHJld2FyZCBmb3IgaGVpZ2h0IAkApAMBBRF0YXJnZXRCbG9ja0hlaWdodAQJZ2VuZXJhdG9yCAUPdGFyZ2V0QmxvY2tJbmZvCWdlbmVyYXRvcgQJYXZhaWxhYmxlCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEMa2V5QXZhaWxhYmxlAQUJZ2VuZXJhdG9yAAAEDGNhbGxlclJld2FyZAMJAAACBQNpbmMJAGUCBRlibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplAAEJAGQCBSBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgUpYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3JSZW1haW5kZXIFIGJsb2NrUHJvY2Vzc2luZ1Jld2FyZEJ5R2VuZXJhdG9yBA0kdDAyOTEyNTI5MjMzCQEOZ2V0UmV3YXJkU3BsaXQBBRR0cmVhc3VyeVJld2FyZE9yRmFpbAQSc2hhcmVBbW91bnRUb1Bvd2VyCAUNJHQwMjkxMjUyOTIzMwJfMQQaYnVzaW5lc3NUcmVhc3VyeUFtb3VudFBhcnQIBQ0kdDAyOTEyNTI5MjMzAl8yBA9yZXdhcmRSZW1haW5kZXIIBQ0kdDAyOTEyNTI5MjMzAl8zBA1scEFzc2V0QW1vdW50AwkAZgIFEmN1cnJlbnRQcmljZU9yRmFpbAAACQBrAwkAZQIFD3Jld2FyZFJlbWFpbmRlcgUMY2FsbGVyUmV3YXJkBQZTQ0FMRTgFEmN1cnJlbnRQcmljZU9yRmFpbAAABBRmYWN0b3J5QWN0aW9uc1NpbmdsZQkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtzdHJpbmdFbnRyeQkAzAgCCQERa2V5QmxvY2tQcm9jZXNzZWQBBRF0YXJnZXRCbG9ja0hlaWdodAkAzAgCCQC5CQIJAMwIAgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZE9yRmFpbAkAzAgCCQClCAEFCWdlbmVyYXRvcgkAzAgCCQDYBAEFEHVzZXJBZGRyZXNzQnl0ZXMJAMwIAgkApAMBBRR0cmVhc3VyeVJld2FyZE9yRmFpbAkAzAgCCQCkAwEFDGNhbGxlclJld2FyZAkAzAgCCQCkAwEFDWxwQXNzZXRBbW91bnQJAMwIAgkApAMBBRJzaGFyZUFtb3VudFRvUG93ZXIFA25pbAUDU0VQBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDGtleUF2YWlsYWJsZQEFCWdlbmVyYXRvcgkAzAgCCQBkAgUJYXZhaWxhYmxlBQ1scEFzc2V0QW1vdW50BQNuaWwFA25pbAUDbmlsAwkAAAIFFGZhY3RvcnlBY3Rpb25zU2luZ2xlBRRmYWN0b3J5QWN0aW9uc1NpbmdsZQQNJHQwMzAwODEzMDE1NgUDYWNjBApscEFzc2V0QWNjCAUNJHQwMzAwODEzMDE1NgJfMQQJcmV3YXJkQWNjCAUNJHQwMzAwODEzMDE1NgJfMgQTYnVzaW5lc3NUcmVhc3VyeUFjYwgFDSR0MDMwMDgxMzAxNTYCXzMEE3Bvd2VyU2hhcmVEYXRhVHVwbGUIBQ0kdDAzMDA4MTMwMTU2Al80BA0kdDAzMDE2MzMwMjI5BRNwb3dlclNoYXJlRGF0YVR1cGxlBA1wb3dlclNoYXJlQWNjCAUNJHQwMzAxNjMzMDIyOQJfMQQXZ2VuZXJhdG9yUG93ZXJTaGFyZUxpc3QIBQ0kdDAzMDE2MzMwMjI5Al8yBBpuZXdHZW5lcmF0b3JQb3dlclNoYXJlTGlzdAkAzQgCBRdnZW5lcmF0b3JQb3dlclNoYXJlTGlzdAkAlAoCCQClCAEFCWdlbmVyYXRvcgUSc2hhcmVBbW91bnRUb1Bvd2VyCQCWCgQJAGQCBQpscEFzc2V0QWNjBQ1scEFzc2V0QW1vdW50CQBkAgUJcmV3YXJkQWNjBRR0cmVhc3VyeVJld2FyZE9yRmFpbAkAZAIFE2J1c2luZXNzVHJlYXN1cnlBY2MFGmJ1c2luZXNzVHJlYXN1cnlBbW91bnRQYXJ0CQCUCgIJAGQCBQ1wb3dlclNoYXJlQWNjBRJzaGFyZUFtb3VudFRvUG93ZXIFGm5ld0dlbmVyYXRvclBvd2VyU2hhcmVMaXN0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBARsaXN0CQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwkAzAgCABAJAMwIAgARCQDMCAIAEgkAzAgCABMFA25pbAQNJHQwMzA2NzczMDgzOQoAAiRsBQRsaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAAACQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNtYXACBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAMJAAACBQ0kdDAzMDY3NzMwODM5BQ0kdDAzMDY3NzMwODM5BBNwb3dlclNoYXJlRGF0YVR1cGxlCAUNJHQwMzA2NzczMDgzOQJfNAQecmV3YXJkVG9CdXNpbmVzc1RyZWFzdXJ5QW1vdW50CAUNJHQwMzA2NzczMDgzOQJfMwQRcmV3YXJkQW1vdW50VG90YWwIBQ0kdDAzMDY3NzMwODM5Al8yBBJscEFzc2V0QW1vdW50VG90YWwIBQ0kdDAzMDY3NzMwODM5Al8xBA0kdDAzMDg0MzMwOTEyBRNwb3dlclNoYXJlRGF0YVR1cGxlBBJhbW91bnRUb1Bvd2VyVG90YWwIBQ0kdDAzMDg0MzMwOTEyAl8xBBVwb3dlclNoYXJlQW1vdW50c0xpc3QIBQ0kdDAzMDg0MzMwOTEyAl8yBBpyZXdhcmRUb01haW5UcmVhc3VyeUFtb3VudAkAZQIJAGUCCQBlAgURcmV3YXJkQW1vdW50VG90YWwFHnJld2FyZFRvQnVzaW5lc3NUcmVhc3VyeUFtb3VudAUVYmxvY2tQcm9jZXNzaW5nUmV3YXJkBRJhbW91bnRUb1Bvd2VyVG90YWwECGludmVzdGVkCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQELa2V5SW52ZXN0ZWQBBQR1bml0AAAEEXBvd2VyU2hhcmVBY3Rpb25zAwkAZgIFEmFtb3VudFRvUG93ZXJUb3RhbAAABA50cmFuc2ZlckFjdGlvbgkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAhl0cmFuc2ZlckZyb21Qcm94eVRyZWFzdXJ5CQDMCAIIBRRmYWN0b3J5QWRkcmVzc09yRmFpbAVieXRlcwkAzAgCBRJhbW91bnRUb1Bvd2VyVG90YWwFA25pbAUDbmlsBQNuaWwDCQAAAgUOdHJhbnNmZXJBY3Rpb24FDnRyYW5zZmVyQWN0aW9uBBB0b3RhbFBvd2VyQW1vdW50CQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgRzd2FwCQDMCAIFGHBvd2VyQXNzZXRJZFN0cmluZ09yRmFpbAkAzAgCBQVXQVZFUwkAzAgCBRJhbW91bnRUb1Bvd2VyVG90YWwFA25pbAUDbmlsAwkAAAIFEHRvdGFsUG93ZXJBbW91bnQFEHRvdGFsUG93ZXJBbW91bnQEE3RvdGFsUG93ZXJBbW91bnRJbnQEByRtYXRjaDAFEHRvdGFsUG93ZXJBbW91bnQDCQABAgUHJG1hdGNoMAIDSW50BAdwQW1vdW50BQckbWF0Y2gwBQdwQW1vdW50AAAKARBzdGFrZVBvd2VySW52b2tlAgNhY2MEbmV4dAQNJHQwMzE3ODYzMTgyMQUEbmV4dAQJZ2VuZXJhdG9yCAUNJHQwMzE3ODYzMTgyMQJfMQQLc2hhcmVBbW91bnQIBQ0kdDAzMTc4NjMxODIxAl8yAwkAZgIFEmFtb3VudFRvUG93ZXJUb3RhbAAABAtwb3dlckFtb3VudAkAawMFC3NoYXJlQW1vdW50BRN0b3RhbFBvd2VyQW1vdW50SW50BRJhbW91bnRUb1Bvd2VyVG90YWwEA2ludgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIKcG93ZXJTdGFrZQkAzAgCCQDZBAEFCWdlbmVyYXRvcgkAzAgCCQDZBAEFGHBvd2VyQXNzZXRJZFN0cmluZ09yRmFpbAkAzAgCBQtwb3dlckFtb3VudAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsBBJwb3dlclN0YWtlc0FjdGlvbnMKAAIkbAUVcG93ZXJTaGFyZUFtb3VudHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBzdGFrZVBvd2VySW52b2tlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQDCQAAAgUScG93ZXJTdGFrZXNBY3Rpb25zBRJwb3dlclN0YWtlc0FjdGlvbnMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFEXBvd2VyU2hhcmVBY3Rpb25zBRFwb3dlclNoYXJlQWN0aW9ucwQHYWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgdyZWlzc3VlCQDMCAIFEmxwQXNzZXRBbW91bnRUb3RhbAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MACQDMCAIJAGQCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCGXRyYW5zZmVyRnJvbVByb3h5VHJlYXN1cnkJAMwIAggFGW1haW5UcmVhc3VyeUFkZHJlc3NPckZhaWwFYnl0ZXMJAMwIAgUacmV3YXJkVG9NYWluVHJlYXN1cnlBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCGXRyYW5zZmVyRnJvbVByb3h5VHJlYXN1cnkJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCGXRyYW5zZmVyRnJvbVByb3h5VHJlYXN1cnkJAMwIAggFHWJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzT3JGYWlsBWJ5dGVzCQDMCAIFHnJld2FyZFRvQnVzaW5lc3NUcmVhc3VyeUFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQtrZXlJbnZlc3RlZAEFBHVuaXQJAMwIAgkAZAIFCGludmVzdGVkBRpyZXdhcmRUb01haW5UcmVhc3VyeUFtb3VudAUDbmlsBQNuaWwFA25pbAMJAAACBQdhY3Rpb25zBQdhY3Rpb25zCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECXB1YmxpY0tleQQHJG1hdGNoMAkBGWdldE1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA3B1YgUHJG1hdGNoMAUDcHViCAUCdHgPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlwdWJsaWNLZXlD4YJ1", "height": 3453147, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9auSb7mq1i7KcWQ95rZhZbh39kdENqw3ofeUsHtcH5dm Next: none Diff:
OldNewDifferences
491491 then true
492492 else (i.originCaller == mainTreasuryAddressOrFail))
493493 then true
494- else throwErr("permission denied (finalize)"), if ((nextBlockToProcess > periodEndHeight))
494+ else throwErr(("permission denied (finalize) " + toString(i.originCaller))), if ((nextBlockToProcess > periodEndHeight))
495495 then true
496496 else throwErr("unprocessed blocks"), if ((donationPartInWaves >= 0))
497497 then true
504504 else throwErr("invalid PWR stake part")]
505505 if ((checks == checks))
506506 then {
507- let $t01548115586 = calculatePrice(lpPartInWaves)
508- let newPrice = $t01548115586._1
509- let lpAssetAmountToBurn = $t01548115586._2
510- let lpAssetFinalQuantity = $t01548115586._3
507+ let $t01551015615 = calculatePrice(lpPartInWaves)
508+ let newPrice = $t01551015615._1
509+ let lpAssetAmountToBurn = $t01551015615._2
510+ let lpAssetFinalQuantity = $t01551015615._3
511511 let newPeriod = (currentPeriodOrFail + 1)
512512 func addNewAction (actions,payment) = {
513- let $t01573415796 = actions
514- let scriptTransfers = $t01573415796._1
515- let assetIdsString = $t01573415796._2
516- let amountsString = $t01573415796._3
513+ let $t01576315825 = actions
514+ let scriptTransfers = $t01576315825._1
515+ let assetIdsString = $t01576315825._2
516+ let amountsString = $t01576315825._3
517517 let paymentAmount = payment.amount
518518 let paymentAssetId = payment.assetId
519519 if ((assetIdToString(paymentAssetId) == l2mpAssetIdStringOrFail))
529529 }
530530 }
531531
532- let $t01659016681 = {
532+ let $t01661916710 = {
533533 let $l = i.payments
534534 let $s = size($l)
535535 let $acc0 = $Tuple3(nil, "", "")
543543
544544 $f0_2($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)
545545 }
546- let scriptTransfers = $t01659016681._1
547- let AssetIds = $t01659016681._2
548- let Amounts = $t01659016681._3
546+ let scriptTransfers = $t01661916710._1
547+ let AssetIds = $t01661916710._2
548+ let Amounts = $t01661916710._3
549549 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), powerStakePartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimWavesAmount(currentPeriodOrFail), claimPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyCurrentPeriod(), newPeriod], nil), invoke(factoryAddressOrFail, "integerEntry", [keyPriceForPeriod(newPeriod), newPrice], nil), invoke(factoryAddressOrFail, "integerEntry", [keyStartHeight(newPeriod), (periodEndHeight + 1)], nil), invoke(factoryAddressOrFail, "burn", [lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalPeriod(currentPeriodOrFail), lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), lpPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donationPartInWaves], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAssetIds(currentPeriodOrFail), AssetIds], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAmounts(currentPeriodOrFail), Amounts], nil)]
550550 $Tuple2(scriptTransfers, factoryActions)
551551 }
577577 else throwErr("invalid PWR stake part")]
578578 if ((checks == checks))
579579 then {
580- let $t01969819803 = calculatePrice(lpPartInWaves)
581- let newPrice = $t01969819803._1
582- let lpAssetAmountToBurn = $t01969819803._2
583- let lpAssetFinalQuantity = $t01969819803._3
580+ let $t01972719832 = calculatePrice(lpPartInWaves)
581+ let newPrice = $t01972719832._1
582+ let lpAssetAmountToBurn = $t01972719832._2
583+ let lpAssetFinalQuantity = $t01972719832._3
584584 $Tuple2(nil, $Tuple6(claimPartInWaves, lpPartInWaves, donationPartInWaves, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity))
585585 }
586586 else throw("Strict value is not equal to itself.")
606606 let payment = if ((size(i.payments) == 1))
607607 then i.payments[0]
608608 else throwErr("invalid payments")
609- let $t02091221089 = if (if ((payment.assetId == unit))
609+ let $t02094121118 = if (if ((payment.assetId == unit))
610610 then (payment.amount > 0)
611611 else false)
612612 then $Tuple2(payment.amount, payment.assetId)
613613 else throwErr("invalid payment amount")
614- let paymentAmount = $t02091221089._1
615- let paymentAssetId = $t02091221089._2
614+ let paymentAmount = $t02094121118._1
615+ let paymentAssetId = $t02094121118._2
616616 let treasuryPart = valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0)
617617 let paymentsWithoutTreasuryPart = fraction(paymentAmount, (SCALE8 - treasuryPart), SCALE8)
618618 let lpAssetAmount = if ((currentPriceOrFail > 0))
682682 let checkCaller = onlyFactory(i)
683683 if ((checkCaller == checkCaller))
684684 then {
685- let $t02405624241 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
686- let userAddress = $t02405624241._1
687- let lpAssetAmount = $t02405624241._2
688- let targetPeriod = $t02405624241._3
689- let wavesAmount = $t02405624241._4
690- let assetsString = $t02405624241._5
691- let amountsString = $t02405624241._6
685+ let $t02408524270 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
686+ let userAddress = $t02408524270._1
687+ let lpAssetAmount = $t02408524270._2
688+ let targetPeriod = $t02408524270._3
689+ let wavesAmount = $t02408524270._4
690+ let assetsString = $t02408524270._5
691+ let amountsString = $t02408524270._6
692692 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
693693 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
694694 let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
705705 if ((checkCaller == checkCaller))
706706 then {
707707 func addNewAction (state,txId) = {
708- let $t02499725196 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
709- let userAddress = $t02499725196._1
710- let lpAssetAmount = $t02499725196._2
711- let targetPeriod = $t02499725196._3
712- let wavesAmount = $t02499725196._4
713- let assetsString = $t02499725196._5
714- let amountsString = $t02499725196._6
708+ let $t02502625225 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
709+ let userAddress = $t02502625225._1
710+ let lpAssetAmount = $t02502625225._2
711+ let targetPeriod = $t02502625225._3
712+ let wavesAmount = $t02502625225._4
713+ let assetsString = $t02502625225._5
714+ let amountsString = $t02502625225._6
715715 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
716716 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
717717 let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
808808 let callerReward = if ((inc == (blocksProcessingBatchSize - 1)))
809809 then (blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder)
810810 else blockProcessingRewardByGenerator
811- let $t02909629204 = getRewardSplit(treasuryRewardOrFail)
812- let shareAmountToPower = $t02909629204._1
813- let businessTreasuryAmountPart = $t02909629204._2
814- let rewardRemainder = $t02909629204._3
811+ let $t02912529233 = getRewardSplit(treasuryRewardOrFail)
812+ let shareAmountToPower = $t02912529233._1
813+ let businessTreasuryAmountPart = $t02912529233._2
814+ let rewardRemainder = $t02912529233._3
815815 let lpAssetAmount = if ((currentPriceOrFail > 0))
816816 then fraction((rewardRemainder - callerReward), SCALE8, currentPriceOrFail)
817817 else 0
818818 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount), toString(shareAmountToPower)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
819819 if ((factoryActionsSingle == factoryActionsSingle))
820820 then {
821- let $t03005230127 = acc
822- let lpAssetAcc = $t03005230127._1
823- let rewardAcc = $t03005230127._2
824- let businessTreasuryAcc = $t03005230127._3
825- let powerShareDataTuple = $t03005230127._4
826- let $t03013430200 = powerShareDataTuple
827- let powerShareAcc = $t03013430200._1
828- let generatorPowerShareList = $t03013430200._2
821+ let $t03008130156 = acc
822+ let lpAssetAcc = $t03008130156._1
823+ let rewardAcc = $t03008130156._2
824+ let businessTreasuryAcc = $t03008130156._3
825+ let powerShareDataTuple = $t03008130156._4
826+ let $t03016330229 = powerShareDataTuple
827+ let powerShareAcc = $t03016330229._1
828+ let generatorPowerShareList = $t03016330229._2
829829 let newGeneratorPowerShareList = (generatorPowerShareList :+ $Tuple2(toString(generator), shareAmountToPower))
830830 $Tuple4((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail), (businessTreasuryAcc + businessTreasuryAmountPart), $Tuple2((powerShareAcc + shareAmountToPower), newGeneratorPowerShareList))
831831 }
833833 }
834834
835835 let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
836- let $t03064830810 = {
836+ let $t03067730839 = {
837837 let $l = list
838838 let $s = size($l)
839839 let $acc0 = $Tuple4(0, 0, 0, $Tuple2(0, nil))
847847
848848 $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)
849849 }
850- if (($t03064830810 == $t03064830810))
850+ if (($t03067730839 == $t03067730839))
851851 then {
852- let powerShareDataTuple = $t03064830810._4
853- let rewardToBusinessTreasuryAmount = $t03064830810._3
854- let rewardAmountTotal = $t03064830810._2
855- let lpAssetAmountTotal = $t03064830810._1
856- let $t03081430883 = powerShareDataTuple
857- let amountToPowerTotal = $t03081430883._1
858- let powerShareAmountsList = $t03081430883._2
852+ let powerShareDataTuple = $t03067730839._4
853+ let rewardToBusinessTreasuryAmount = $t03067730839._3
854+ let rewardAmountTotal = $t03067730839._2
855+ let lpAssetAmountTotal = $t03067730839._1
856+ let $t03084330912 = powerShareDataTuple
857+ let amountToPowerTotal = $t03084330912._1
858+ let powerShareAmountsList = $t03084330912._2
859859 let rewardToMainTreasuryAmount = (((rewardAmountTotal - rewardToBusinessTreasuryAmount) - blockProcessingReward) - amountToPowerTotal)
860860 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
861861 let powerShareActions = if ((amountToPowerTotal > 0))
873873 0
874874 }
875875 func stakePowerInvoke (acc,next) = {
876- let $t03175731792 = next
877- let generator = $t03175731792._1
878- let shareAmount = $t03175731792._2
876+ let $t03178631821 = next
877+ let generator = $t03178631821._1
878+ let shareAmount = $t03178631821._2
879879 if ((amountToPowerTotal > 0))
880880 then {
881881 let powerAmount = fraction(shareAmount, totalPowerAmountInt, amountToPowerTotal)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let CONTRACT_NAME = "calculator.ride"
77
88 let SCALE8 = 100000000
99
1010 let PENDING = "PENDING"
1111
1212 let WAVES = "WAVES"
1313
1414 let blocksProcessingBatchSizeMax = 10
1515
1616 func wrapErr (s) = ((CONTRACT_NAME + ": ") + s)
1717
1818
1919 func throwErr (s) = throw(wrapErr(s))
2020
2121
2222 func assetIdToString (assetId) = match assetId {
2323 case b: ByteVector =>
2424 toBase58String(b)
2525 case _: Unit =>
2626 WAVES
2727 case _ =>
2828 throw("Match error")
2929 }
3030
3131
3232 func stringToAssetId (s) = if ((s == WAVES))
3333 then unit
3434 else fromBase58String(s)
3535
3636
3737 func abs (n) = if ((0 > n))
3838 then -(n)
3939 else n
4040
4141
4242 func keyFactoryAddress () = makeString(["%s", "factory"], SEP)
4343
4444
4545 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
4646
4747
4848 func keyLpAssetId () = makeString(["%s", "lpAssetId"], SEP)
4949
5050
5151 func keyProxyTreasuryAddress () = makeString(["%s", "proxyTreasury"], SEP)
5252
5353
5454 func keyMainTreasuryAddress () = makeString(["%s", "mainTreasury"], SEP)
5555
5656
5757 func keyBusinessTreasuryAddress () = makeString(["%s", "businessTreasury"], SEP)
5858
5959
6060 func keyTrustedFinalizeAddressList () = makeString(["%s", "trustedAddressList"], SEP)
6161
6262
6363 func keyBusinessTreasuryPart () = makeString(["%s", "businessTreasuryPart"], SEP)
6464
6565
6666 func keyPowerContractAddress () = makeString(["%s", "powerContract"], SEP)
6767
6868
6969 func keyPowerShareRatio () = makeString(["%s", "powerShareRatio"], SEP)
7070
7171
7272 func keyPowerAssetId () = makeString(["%s", "powerAssetId"], SEP)
7373
7474
7575 func keyL2mpAssetId () = makeString(["%s", "l2mpAssetId"], SEP)
7676
7777
7878 func keyL2mpProxyAddress () = makeString(["%s", "l2mpProxy"], SEP)
7979
8080
8181 func keyInvested (assetId) = makeString(["%s%s", "invested", assetIdToString(assetId)], SEP)
8282
8383
8484 func keyDonated (assetId) = makeString(["%s%s", "donated", assetIdToString(assetId)], SEP)
8585
8686
8787 func keyAvailable (userAddress) = makeString(["%s%s", "available", toString(userAddress)], SEP)
8888
8989
9090 func keyClaimed (userAddress) = makeString(["%s%s", "claimed", toString(userAddress)], SEP)
9191
9292
9393 func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP)
9494
9595
9696 func keyPriceForPeriod (period) = makeString(["%s%d", "price", toString(period)], SEP)
9797
9898
9999 func keyStartHeight (period) = makeString(["%s%d", "startHeight", toString(period)], SEP)
100100
101101
102102 func keyPowerManagerBonus (period) = makeString(["%s%d", "powerManagerBonus", toString(period)], SEP)
103103
104104
105105 func keyClaimWavesAmount (period) = makeString(["%s%d", "claimWavesAmount", toString(period)], SEP)
106106
107107
108108 func keyPeriodLength () = "%s__periodLength"
109109
110110
111111 func keyInvestPeriodLength () = "%s__investPeriodLength"
112112
113113
114114 func keyBlockProcessingReward () = "%s__blockProcessingReward"
115115
116116
117117 func keyNextBlockToProcess () = "%s__nextBlockToProcess"
118118
119119
120120 func keyBlockProcessed (height) = makeString(["%s%d", "blockProcessed", toString(height)], SEP)
121121
122122
123123 func keyWithdrawal () = "%s__withdrawal"
124124
125125
126126 func keyWithdrawalPeriod (period) = makeString(["%s%d", "withdrawalPeriod", toString(period)], SEP)
127127
128128
129129 func keyWithdrawalRequest (userAddress,txId) = makeString(["%s%s%s", "withdrawal", toString(userAddress), toBase58String(txId)], SEP)
130130
131131
132132 func valueWithdrawalRequest (status,lpAssetAmount,targetPeriod,claimTxId) = {
133133 let claimTxIdStr = match claimTxId {
134134 case b: ByteVector =>
135135 toBase58String(b)
136136 case _: Unit =>
137137 "SOON"
138138 case _ =>
139139 throw("Match error")
140140 }
141141 makeString(["%s%d%d%s", status, toString(lpAssetAmount), toString(targetPeriod), claimTxIdStr], SEP)
142142 }
143143
144144
145145 func keyWithdrawalHistory (userAddress,txId) = makeString(["%s%s%s", "withdrawalHistory", toString(userAddress), toBase58String(txId)], SEP)
146146
147147
148148 func keyPeriodWithdrawalAssetIds (period) = makeString(["%s%d", "periodReward", toString(period)], SEP)
149149
150150
151151 func keyPeriodWithdrawalAmounts (period) = makeString(["%s%d", "periodRewardAmount", toString(period)], SEP)
152152
153153
154154 func parseWithdrawalRequestValueOrFail (s) = {
155155 let parts = split(s, SEP)
156156 if ((size(parts) == 5))
157157 then {
158158 let status = parts[1]
159159 let lpAssetAmount = valueOrErrorMessage(parseInt(parts[2]), wrapErr("invalid lpAssetAmount"))
160160 let targetPeriod = valueOrErrorMessage(parseInt(parts[3]), wrapErr("invalid targetPeriod"))
161161 let claimTxId = parts[4]
162162 $Tuple4(status, lpAssetAmount, targetPeriod, claimTxId)
163163 }
164164 else throwErr("invalid withdrawal request value")
165165 }
166166
167167
168168 let factoryAddressOption = match getString(this, keyFactoryAddress()) {
169169 case s: String =>
170170 addressFromString(s)
171171 case _: Unit =>
172172 unit
173173 case _ =>
174174 throw("Match error")
175175 }
176176
177177 let factoryAddressOrFail = valueOrErrorMessage(factoryAddressOption, wrapErr("invalid factory address"))
178178
179179 let lpAssetIdOption = match factoryAddressOption {
180180 case a: Address =>
181181 match getString(a, keyLpAssetId()) {
182182 case s: String =>
183183 fromBase58String(s)
184184 case _: Unit =>
185185 unit
186186 case _ =>
187187 throw("Match error")
188188 }
189189 case _: Unit =>
190190 unit
191191 case _ =>
192192 throw("Match error")
193193 }
194194
195195 let lpAssetIdOrFail = valueOrErrorMessage(lpAssetIdOption, wrapErr("invalid lpAssetId"))
196196
197197 let proxyTreasuryAddressOption = match factoryAddressOption {
198198 case a: Address =>
199199 match getString(a, keyProxyTreasuryAddress()) {
200200 case s: String =>
201201 addressFromString(s)
202202 case _: Unit =>
203203 unit
204204 case _ =>
205205 throw("Match error")
206206 }
207207 case _: Unit =>
208208 unit
209209 case _ =>
210210 throw("Match error")
211211 }
212212
213213 let proxyTreasuryAddressOrFail = valueOrErrorMessage(proxyTreasuryAddressOption, wrapErr("invalid proxy treasury address"))
214214
215215 let mainTreasuryAddressOption = match factoryAddressOption {
216216 case a: Address =>
217217 match getString(a, keyMainTreasuryAddress()) {
218218 case s: String =>
219219 addressFromString(s)
220220 case _: Unit =>
221221 unit
222222 case _ =>
223223 throw("Match error")
224224 }
225225 case _: Unit =>
226226 unit
227227 case _ =>
228228 throw("Match error")
229229 }
230230
231231 let businessTreasuryAddressOption = match factoryAddressOption {
232232 case a: Address =>
233233 match getString(a, keyBusinessTreasuryAddress()) {
234234 case s: String =>
235235 addressFromString(s)
236236 case _: Unit =>
237237 unit
238238 case _ =>
239239 throw("Match error")
240240 }
241241 case _: Unit =>
242242 unit
243243 case _ =>
244244 throw("Match error")
245245 }
246246
247247 let mainTreasuryAddressOrFail = valueOrErrorMessage(mainTreasuryAddressOption, wrapErr("invalid main treasury address"))
248248
249249 let businessTreasuryAddressOrFail = valueOrErrorMessage(businessTreasuryAddressOption, wrapErr("invalid business treasury address"))
250250
251251 let powerContractAddressOption = match factoryAddressOption {
252252 case a: Address =>
253253 match getString(a, keyPowerContractAddress()) {
254254 case s: String =>
255255 addressFromString(s)
256256 case _: Unit =>
257257 unit
258258 case _ =>
259259 throw("Match error")
260260 }
261261 case _: Unit =>
262262 unit
263263 case _ =>
264264 throw("Match error")
265265 }
266266
267267 let powerContractAddressOrFail = valueOrErrorMessage(powerContractAddressOption, wrapErr("invalid power contract address"))
268268
269269 let powerAssetIdStringOrFail = valueOrErrorMessage(getString(factoryAddressOrFail, keyPowerAssetId()), wrapErr("power asset id not found"))
270270
271271 let l2mpProxyAddressOption = match factoryAddressOption {
272272 case a: Address =>
273273 match getString(a, keyL2mpProxyAddress()) {
274274 case s: String =>
275275 addressFromString(s)
276276 case _: Unit =>
277277 unit
278278 case _ =>
279279 throw("Match error")
280280 }
281281 case _: Unit =>
282282 unit
283283 case _ =>
284284 throw("Match error")
285285 }
286286
287287 let l2mpProxyAddressOrFail = valueOrErrorMessage(l2mpProxyAddressOption, wrapErr("invalid l2mp proxy address"))
288288
289289 let l2mpAssetIdStringOrFail = valueOrErrorMessage(getString(factoryAddressOrFail, keyL2mpAssetId()), wrapErr("l2mp asset id not found"))
290290
291291 func getManagerPublicKeyOrUnit () = match factoryAddressOption {
292292 case fa: Address =>
293293 match getString(fa, keyManagerPublicKey()) {
294294 case pub: String =>
295295 fromBase58String(pub)
296296 case _ =>
297297 unit
298298 }
299299 case _ =>
300300 unit
301301 }
302302
303303
304304 func onlyAddress (i,address) = if ((i.caller == address))
305305 then true
306306 else throwErr("permission denied")
307307
308308
309309 func onlyFactory (i) = onlyAddress(i, factoryAddressOrFail)
310310
311311
312312 func isTrustedAddress (i) = {
313313 let listString = valueOrElse(getString(factoryAddressOrFail, keyTrustedFinalizeAddressList()), "")
314314 let addressList = split(listString, SEP)
315315 containsElement(addressList, toString(i.originCaller))
316316 }
317317
318318
319319 func rewardForOption (rewards,target) = {
320320 let s = size(rewards)
321321 let $t077007725 = rewards[0]
322322 let a0 = $t077007725._1
323323 let r0 = $t077007725._2
324324 let $t077287753 = rewards[1]
325325 let a1 = $t077287753._1
326326 let r1 = $t077287753._2
327327 let $t077567781 = rewards[2]
328328 let a2 = $t077567781._1
329329 let r2 = $t077567781._2
330330 if (if ((s > 0))
331331 then (a0 == target)
332332 else false)
333333 then r0
334334 else if (if ((s > 1))
335335 then (a1 == target)
336336 else false)
337337 then r1
338338 else if (if ((s > 2))
339339 then (a2 == target)
340340 else false)
341341 then r2
342342 else unit
343343 }
344344
345345
346346 func calculatePrice (lpPartInWaves) = {
347347 let lpAssetAmountToBurn = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
348348 let lpAssetQuantity = valueOrErrorMessage(assetInfo(lpAssetIdOrFail), wrapErr("invalid lpAsset info")).quantity
349349 let newPrice = fraction(lpPartInWaves, SCALE8, (lpAssetQuantity - lpAssetAmountToBurn))
350350 let checkIfPriceNotZero = if ((newPrice != 0))
351351 then true
352352 else throwErr("LP price cannot be 0")
353353 if ((checkIfPriceNotZero == checkIfPriceNotZero))
354354 then {
355355 let lpAssetFinalQuantity = (lpAssetQuantity - lpAssetAmountToBurn)
356356 $Tuple3(newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity)
357357 }
358358 else throw("Strict value is not equal to itself.")
359359 }
360360
361361
362362 func claimCollateralINTERNAL (userAddressBytes,txId) = {
363363 let userAddress = Address(userAddressBytes)
364364 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
365365 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
366366 let $t089489061 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
367367 let status = $t089489061._1
368368 let lpAssetAmount = $t089489061._2
369369 let unlockPeriod = $t089489061._3
370370 let claimTxId = $t089489061._4
371371 if ((unlockPeriod > currentPeriodOrFail))
372372 then throwErr("invalid withdrawal request period")
373373 else {
374374 let priceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(unlockPeriod)), wrapErr("invalid price"))
375375 let wavesAmount = if ((priceOrFail > 0))
376376 then fraction(lpAssetAmount, priceOrFail, SCALE8)
377377 else 0
378378 let targetPeriod = (unlockPeriod - 1)
379379 let assetsString = getStringValue(factoryAddressOrFail, keyPeriodWithdrawalAssetIds(targetPeriod))
380380 let amountsString = getStringValue(factoryAddressOrFail, keyPeriodWithdrawalAmounts(targetPeriod))
381381 let totalLpAmountInPeriod = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawalPeriod(targetPeriod)), 0)
382382 let userPartSCALE8 = if ((totalLpAmountInPeriod == 0))
383383 then 0
384384 else fraction(lpAssetAmount, SCALE8, totalLpAmountInPeriod)
385385 func getUserPartAmounts (currentState,amount) = {
386386 let userPartAmount = fraction(parseIntValue(amount), userPartSCALE8, SCALE8)
387387 (currentState :+ toString(userPartAmount))
388388 }
389389
390390 let amountsList = split_51C(amountsString, SEP)
391391 let amountsPrefix = value(amountsList[0])
392392 let amountsListWithoutPrefix = removeByIndex(split_51C(amountsString, SEP), 0)
393393 let userPartAmounts = {
394394 let $l = amountsListWithoutPrefix
395395 let $s = size($l)
396396 let $acc0 = nil
397397 func $f0_1 ($a,$i) = if (($i >= $s))
398398 then $a
399399 else getUserPartAmounts($a, $l[$i])
400400
401401 func $f0_2 ($a,$i) = if (($i >= $s))
402402 then $a
403403 else throw("List size exceeds 10")
404404
405405 $f0_2($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)
406406 }
407407 let userPartAmountsString = makeString([amountsPrefix, makeString(userPartAmounts, SEP)], SEP)
408408 $Tuple6(userAddress, lpAssetAmount, targetPeriod, wavesAmount, assetsString, userPartAmountsString)
409409 }
410410 }
411411
412412
413413 func claimCollateralREADONLYStringResponse (userAddressBytes,txId) = {
414414 let $t01075010916 = claimCollateralINTERNAL(userAddressBytes, txId)
415415 let userAddress = $t01075010916._1
416416 let lpAssetAmount = $t01075010916._2
417417 let targetPeriod = $t01075010916._3
418418 let wavesAmount = $t01075010916._4
419419 let assetsString = $t01075010916._5
420420 let amountsString = $t01075010916._6
421421 let assets = makeString(removeByIndex(split_51C(assetsString, SEP), 0), ":")
422422 let amounts = makeString(removeByIndex(split_51C(amountsString, SEP), 0), ":")
423423 makeString(["%d%s%s", toString(wavesAmount), assets, amounts], SEP)
424424 }
425425
426426
427427 func getRewardSplit (generatorRewardAmount) = {
428428 let powerShareRatio = max([0, min([valueOrElse(getInteger(factoryAddressOrFail, keyPowerShareRatio()), 0), SCALE8])])
429429 let businessPartRatio = max([0, min([valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0), SCALE8])])
430430 let amountToPowerPart = fraction(generatorRewardAmount, powerShareRatio, SCALE8)
431431 let businessTreasuryAmountPart = fraction(generatorRewardAmount, businessPartRatio, SCALE8)
432432 let rewardRemainder = ((generatorRewardAmount - amountToPowerPart) - businessTreasuryAmountPart)
433433 if ((rewardRemainder > 0))
434434 then $Tuple3(amountToPowerPart, businessTreasuryAmountPart, rewardRemainder)
435435 else throwErr("amount to main treasury cannot be negative")
436436 }
437437
438438
439439 func calcRewardSplitForAmount (amount) = {
440440 let $t01201512108 = getRewardSplit(amount)
441441 let amountToPowerPart = $t01201512108._1
442442 let businessTreasuryAmountPart = $t01201512108._2
443443 let rewardRemainder = $t01201512108._3
444444 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
445445 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSizeMax)
446446 let toLpAmount = (rewardRemainder - blockProcessingReward)
447447 $Tuple5(amountToPowerPart, businessTreasuryAmountPart, blockProcessingReward, toLpAmount, amount)
448448 }
449449
450450
451451 @Callable(i)
452452 func rewardSplitREADONLY () = {
453453 let targetBlockHeight = (height - 1)
454454 let targetBlockInfo = valueOrErrorMessage(blockInfoByHeight(targetBlockHeight), wrapErr("invalid block info"))
455455 let treasuryRewardOrFail = valueOrErrorMessage(rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail), wrapErr(("invalid treasury reward for height " + toString(targetBlockHeight))))
456456 $Tuple2(nil, calcRewardSplitForAmount(treasuryRewardOrFail))
457457 }
458458
459459
460460
461461 @Callable(i)
462462 func claimLP (userAddressBytes) = {
463463 let checkCaller = onlyFactory(i)
464464 if ((checkCaller == checkCaller))
465465 then {
466466 let userAddress = Address(userAddressBytes)
467467 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(userAddress)), 0)
468468 let claimed = valueOrElse(getInteger(factoryAddressOrFail, keyClaimed(userAddress)), 0)
469469 let factoryActions = if ((available > 0))
470470 then [invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, available, lpAssetIdOrFail], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(userAddress), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimed(userAddress), (claimed + available)], nil)]
471471 else throwErr("nothing to claim")
472472 $Tuple2(nil, factoryActions)
473473 }
474474 else throw("Strict value is not equal to itself.")
475475 }
476476
477477
478478
479479 @Callable(i)
480480 func finalize (userAddressBytes,donationPartInWaves,lpPartInWaves,claimPartInWaves,powerStakePartInWaves) = {
481481 let checkCaller = onlyFactory(i)
482482 if ((checkCaller == checkCaller))
483483 then {
484484 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
485485 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
486486 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
487487 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
488488 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
489489 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
490490 let checks = [if (if (isTrustedAddress(i))
491491 then true
492492 else (i.originCaller == mainTreasuryAddressOrFail))
493493 then true
494- else throwErr("permission denied (finalize)"), if ((nextBlockToProcess > periodEndHeight))
494+ else throwErr(("permission denied (finalize) " + toString(i.originCaller))), if ((nextBlockToProcess > periodEndHeight))
495495 then true
496496 else throwErr("unprocessed blocks"), if ((donationPartInWaves >= 0))
497497 then true
498498 else throwErr("invalid donation part"), if ((lpPartInWaves >= 0))
499499 then true
500500 else throwErr("invalid lp part"), if ((claimPartInWaves >= 0))
501501 then true
502502 else throwErr("invalid claim part"), if ((powerStakePartInWaves >= 0))
503503 then true
504504 else throwErr("invalid PWR stake part")]
505505 if ((checks == checks))
506506 then {
507- let $t01548115586 = calculatePrice(lpPartInWaves)
508- let newPrice = $t01548115586._1
509- let lpAssetAmountToBurn = $t01548115586._2
510- let lpAssetFinalQuantity = $t01548115586._3
507+ let $t01551015615 = calculatePrice(lpPartInWaves)
508+ let newPrice = $t01551015615._1
509+ let lpAssetAmountToBurn = $t01551015615._2
510+ let lpAssetFinalQuantity = $t01551015615._3
511511 let newPeriod = (currentPeriodOrFail + 1)
512512 func addNewAction (actions,payment) = {
513- let $t01573415796 = actions
514- let scriptTransfers = $t01573415796._1
515- let assetIdsString = $t01573415796._2
516- let amountsString = $t01573415796._3
513+ let $t01576315825 = actions
514+ let scriptTransfers = $t01576315825._1
515+ let assetIdsString = $t01576315825._2
516+ let amountsString = $t01576315825._3
517517 let paymentAmount = payment.amount
518518 let paymentAssetId = payment.assetId
519519 if ((assetIdToString(paymentAssetId) == l2mpAssetIdStringOrFail))
520520 then {
521521 let transferToL2mpProxy = ScriptTransfer(l2mpProxyAddressOrFail, paymentAmount, paymentAssetId)
522522 $Tuple3((scriptTransfers :+ transferToL2mpProxy), assetIdsString, amountsString)
523523 }
524524 else {
525525 let newAssetIdsString = ("%s" + makeString([assetIdsString, assetIdToString(paymentAssetId)], SEP))
526526 let newAmountsString = ("%d" + makeString([amountsString, toString(paymentAmount)], SEP))
527527 let newScriptTransfer = ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)
528528 $Tuple3((scriptTransfers :+ newScriptTransfer), newAssetIdsString, newAmountsString)
529529 }
530530 }
531531
532- let $t01659016681 = {
532+ let $t01661916710 = {
533533 let $l = i.payments
534534 let $s = size($l)
535535 let $acc0 = $Tuple3(nil, "", "")
536536 func $f0_1 ($a,$i) = if (($i >= $s))
537537 then $a
538538 else addNewAction($a, $l[$i])
539539
540540 func $f0_2 ($a,$i) = if (($i >= $s))
541541 then $a
542542 else throw("List size exceeds 10")
543543
544544 $f0_2($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)
545545 }
546- let scriptTransfers = $t01659016681._1
547- let AssetIds = $t01659016681._2
548- let Amounts = $t01659016681._3
546+ let scriptTransfers = $t01661916710._1
547+ let AssetIds = $t01661916710._2
548+ let Amounts = $t01661916710._3
549549 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), powerStakePartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimWavesAmount(currentPeriodOrFail), claimPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyCurrentPeriod(), newPeriod], nil), invoke(factoryAddressOrFail, "integerEntry", [keyPriceForPeriod(newPeriod), newPrice], nil), invoke(factoryAddressOrFail, "integerEntry", [keyStartHeight(newPeriod), (periodEndHeight + 1)], nil), invoke(factoryAddressOrFail, "burn", [lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalPeriod(currentPeriodOrFail), lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), lpPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donationPartInWaves], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAssetIds(currentPeriodOrFail), AssetIds], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAmounts(currentPeriodOrFail), Amounts], nil)]
550550 $Tuple2(scriptTransfers, factoryActions)
551551 }
552552 else throw("Strict value is not equal to itself.")
553553 }
554554 else throw("Strict value is not equal to itself.")
555555 }
556556
557557
558558
559559 @Callable(i)
560560 func finalizeREADONLY (donationPartInWaves,lpPartInWaves,claimPartInWaves,powerStakePartInWaves) = {
561561 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
562562 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
563563 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
564564 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
565565 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
566566 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
567567 let checks = [if ((nextBlockToProcess > periodEndHeight))
568568 then true
569569 else throwErr("unprocessed blocks"), if ((donationPartInWaves >= 0))
570570 then true
571571 else throwErr("invalid donation part"), if ((lpPartInWaves >= 0))
572572 then true
573573 else throwErr("invalid lp part"), if ((claimPartInWaves >= 0))
574574 then true
575575 else throwErr("invalid claim part"), if ((powerStakePartInWaves >= 0))
576576 then true
577577 else throwErr("invalid PWR stake part")]
578578 if ((checks == checks))
579579 then {
580- let $t01969819803 = calculatePrice(lpPartInWaves)
581- let newPrice = $t01969819803._1
582- let lpAssetAmountToBurn = $t01969819803._2
583- let lpAssetFinalQuantity = $t01969819803._3
580+ let $t01972719832 = calculatePrice(lpPartInWaves)
581+ let newPrice = $t01972719832._1
582+ let lpAssetAmountToBurn = $t01972719832._2
583+ let lpAssetFinalQuantity = $t01972719832._3
584584 $Tuple2(nil, $Tuple6(claimPartInWaves, lpPartInWaves, donationPartInWaves, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity))
585585 }
586586 else throw("Strict value is not equal to itself.")
587587 }
588588
589589
590590
591591 @Callable(i)
592592 func invest (userAddressBytes) = {
593593 let checkCaller = onlyFactory(i)
594594 if ((checkCaller == checkCaller))
595595 then {
596596 let userAddress = Address(userAddressBytes)
597597 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
598598 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
599599 let investPeriodLength = getIntegerValue(factoryAddressOrFail, keyInvestPeriodLength())
600600 let heightCheck = if (((currentStartHeight + investPeriodLength) > height))
601601 then true
602602 else throwErr("too late to invest in this period")
603603 if ((heightCheck == heightCheck))
604604 then {
605605 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
606606 let payment = if ((size(i.payments) == 1))
607607 then i.payments[0]
608608 else throwErr("invalid payments")
609- let $t02091221089 = if (if ((payment.assetId == unit))
609+ let $t02094121118 = if (if ((payment.assetId == unit))
610610 then (payment.amount > 0)
611611 else false)
612612 then $Tuple2(payment.amount, payment.assetId)
613613 else throwErr("invalid payment amount")
614- let paymentAmount = $t02091221089._1
615- let paymentAssetId = $t02091221089._2
614+ let paymentAmount = $t02094121118._1
615+ let paymentAssetId = $t02094121118._2
616616 let treasuryPart = valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0)
617617 let paymentsWithoutTreasuryPart = fraction(paymentAmount, (SCALE8 - treasuryPart), SCALE8)
618618 let lpAssetAmount = if ((currentPriceOrFail > 0))
619619 then fraction(paymentsWithoutTreasuryPart, SCALE8, currentPriceOrFail)
620620 else 0
621621 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
622622 let actions = [ScriptTransfer(mainTreasuryAddressOrFail, paymentsWithoutTreasuryPart, paymentAssetId), ScriptTransfer(businessTreasuryAddressOrFail, treasuryPart, paymentAssetId)]
623623 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + paymentsWithoutTreasuryPart)], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
624624 $Tuple2(actions, factoryActions)
625625 }
626626 else throw("Strict value is not equal to itself.")
627627 }
628628 else throw("Strict value is not equal to itself.")
629629 }
630630
631631
632632
633633 @Callable(i)
634634 func withdraw (userAddressBytes) = {
635635 let checkCaller = onlyFactory(i)
636636 if ((checkCaller == checkCaller))
637637 then {
638638 let userAddress = Address(userAddressBytes)
639639 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
640640 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
641641 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
642642 let heightCheck = if (((currentStartHeight + periodLength) > height))
643643 then true
644644 else throwErr("too late to withdraw in this period")
645645 if ((heightCheck == heightCheck))
646646 then {
647647 let payment = if ((size(i.payments) == 1))
648648 then i.payments[0]
649649 else throwErr(wrapErr("invalid payments"))
650650 let paymentAssetId = if ((payment.assetId == lpAssetIdOrFail))
651651 then lpAssetIdOrFail
652652 else throwErr("invalid payment asset")
653653 let paymentAmount = if ((payment.amount > 0))
654654 then payment.amount
655655 else throwErr("invalid payment amount")
656656 let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
657657 let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
658658 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
659659 if ((factoryActions == factoryActions))
660660 then $Tuple2(actions, factoryActions)
661661 else throw("Strict value is not equal to itself.")
662662 }
663663 else throw("Strict value is not equal to itself.")
664664 }
665665 else throw("Strict value is not equal to itself.")
666666 }
667667
668668
669669
670670 @Callable(i)
671671 func cancelWithdraw (userAddressBytes,txId) = {
672672 let checkCaller = onlyFactory(i)
673673 if ((checkCaller == checkCaller))
674674 then throwErr("cancelWithdraw is deprecated")
675675 else throw("Strict value is not equal to itself.")
676676 }
677677
678678
679679
680680 @Callable(i)
681681 func claimCollateral (userAddressBytes,txId) = {
682682 let checkCaller = onlyFactory(i)
683683 if ((checkCaller == checkCaller))
684684 then {
685- let $t02405624241 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
686- let userAddress = $t02405624241._1
687- let lpAssetAmount = $t02405624241._2
688- let targetPeriod = $t02405624241._3
689- let wavesAmount = $t02405624241._4
690- let assetsString = $t02405624241._5
691- let amountsString = $t02405624241._6
685+ let $t02408524270 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
686+ let userAddress = $t02408524270._1
687+ let lpAssetAmount = $t02408524270._2
688+ let targetPeriod = $t02408524270._3
689+ let wavesAmount = $t02408524270._4
690+ let assetsString = $t02408524270._5
691+ let amountsString = $t02408524270._6
692692 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
693693 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
694694 let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
695695 $Tuple2(nil, factoryActions)
696696 }
697697 else throw("Strict value is not equal to itself.")
698698 }
699699
700700
701701
702702 @Callable(i)
703703 func claimCollateralBulk (userAddressBytes,txIds) = {
704704 let checkCaller = onlyFactory(i)
705705 if ((checkCaller == checkCaller))
706706 then {
707707 func addNewAction (state,txId) = {
708- let $t02499725196 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
709- let userAddress = $t02499725196._1
710- let lpAssetAmount = $t02499725196._2
711- let targetPeriod = $t02499725196._3
712- let wavesAmount = $t02499725196._4
713- let assetsString = $t02499725196._5
714- let amountsString = $t02499725196._6
708+ let $t02502625225 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
709+ let userAddress = $t02502625225._1
710+ let lpAssetAmount = $t02502625225._2
711+ let targetPeriod = $t02502625225._3
712+ let wavesAmount = $t02502625225._4
713+ let assetsString = $t02502625225._5
714+ let amountsString = $t02502625225._6
715715 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
716716 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
717717 let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
718718 (state ++ newActions)
719719 }
720720
721721 let allFactoryActions = {
722722 let $l = txIds
723723 let $s = size($l)
724724 let $acc0 = nil
725725 func $f0_1 ($a,$i) = if (($i >= $s))
726726 then $a
727727 else addNewAction($a, $l[$i])
728728
729729 func $f0_2 ($a,$i) = if (($i >= $s))
730730 then $a
731731 else throw("List size exceeds 10")
732732
733733 $f0_2($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)
734734 }
735735 $Tuple2(nil, allFactoryActions)
736736 }
737737 else throw("Strict value is not equal to itself.")
738738 }
739739
740740
741741
742742 @Callable(i)
743743 func claimCollateralREADONLY (userAddressBytes,txId) = {
744744 let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId))
745745 $Tuple2(nil, response)
746746 }
747747
748748
749749
750750 @Callable(i)
751751 func claimCollateralBulkREADONLY (userAddressBytes,txIds) = {
752752 func processTxId (state,txId) = {
753753 let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId))
754754 (state :+ response)
755755 }
756756
757757 let allResponses = {
758758 let $l = txIds
759759 let $s = size($l)
760760 let $acc0 = nil
761761 func $f0_1 ($a,$i) = if (($i >= $s))
762762 then $a
763763 else processTxId($a, $l[$i])
764764
765765 func $f0_2 ($a,$i) = if (($i >= $s))
766766 then $a
767767 else throw("List size exceeds 10")
768768
769769 $f0_2($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)
770770 }
771771 $Tuple2(nil, allResponses)
772772 }
773773
774774
775775
776776 @Callable(i)
777777 func processBlocks (userAddressBytes) = {
778778 let checkCaller = onlyFactory(i)
779779 if ((checkCaller == checkCaller))
780780 then {
781781 let userAddress = Address(userAddressBytes)
782782 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
783783 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
784784 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
785785 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
786786 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
787787 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
788788 let blocksProcessingBatchSize = if (if (if ((height >= nextBlockToProcess))
789789 then if ((nextBlockToProcess >= currentStartHeight))
790790 then true
791791 else (currentPeriodOrFail == 0)
792792 else false)
793793 then (periodEndHeight >= nextBlockToProcess)
794794 else false)
795795 then min([((periodEndHeight - nextBlockToProcess) + 1), blocksProcessingBatchSizeMax])
796796 else throwErr(wrapErr("invalid target block"))
797797 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
798798 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSize)
799799 let blockProcessingRewardByGeneratorRemainder = (blockProcessingReward - (blockProcessingRewardByGenerator * blocksProcessingBatchSize))
800800 func map (acc,inc) = if ((inc >= blocksProcessingBatchSize))
801801 then acc
802802 else {
803803 let targetBlockHeight = (nextBlockToProcess + inc)
804804 let targetBlockInfo = valueOrErrorMessage(blockInfoByHeight(targetBlockHeight), wrapErr("invalid block info"))
805805 let treasuryRewardOrFail = valueOrErrorMessage(rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail), wrapErr(("invalid treasury reward for height " + toString(targetBlockHeight))))
806806 let generator = targetBlockInfo.generator
807807 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(generator)), 0)
808808 let callerReward = if ((inc == (blocksProcessingBatchSize - 1)))
809809 then (blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder)
810810 else blockProcessingRewardByGenerator
811- let $t02909629204 = getRewardSplit(treasuryRewardOrFail)
812- let shareAmountToPower = $t02909629204._1
813- let businessTreasuryAmountPart = $t02909629204._2
814- let rewardRemainder = $t02909629204._3
811+ let $t02912529233 = getRewardSplit(treasuryRewardOrFail)
812+ let shareAmountToPower = $t02912529233._1
813+ let businessTreasuryAmountPart = $t02912529233._2
814+ let rewardRemainder = $t02912529233._3
815815 let lpAssetAmount = if ((currentPriceOrFail > 0))
816816 then fraction((rewardRemainder - callerReward), SCALE8, currentPriceOrFail)
817817 else 0
818818 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount), toString(shareAmountToPower)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
819819 if ((factoryActionsSingle == factoryActionsSingle))
820820 then {
821- let $t03005230127 = acc
822- let lpAssetAcc = $t03005230127._1
823- let rewardAcc = $t03005230127._2
824- let businessTreasuryAcc = $t03005230127._3
825- let powerShareDataTuple = $t03005230127._4
826- let $t03013430200 = powerShareDataTuple
827- let powerShareAcc = $t03013430200._1
828- let generatorPowerShareList = $t03013430200._2
821+ let $t03008130156 = acc
822+ let lpAssetAcc = $t03008130156._1
823+ let rewardAcc = $t03008130156._2
824+ let businessTreasuryAcc = $t03008130156._3
825+ let powerShareDataTuple = $t03008130156._4
826+ let $t03016330229 = powerShareDataTuple
827+ let powerShareAcc = $t03016330229._1
828+ let generatorPowerShareList = $t03016330229._2
829829 let newGeneratorPowerShareList = (generatorPowerShareList :+ $Tuple2(toString(generator), shareAmountToPower))
830830 $Tuple4((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail), (businessTreasuryAcc + businessTreasuryAmountPart), $Tuple2((powerShareAcc + shareAmountToPower), newGeneratorPowerShareList))
831831 }
832832 else throw("Strict value is not equal to itself.")
833833 }
834834
835835 let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
836- let $t03064830810 = {
836+ let $t03067730839 = {
837837 let $l = list
838838 let $s = size($l)
839839 let $acc0 = $Tuple4(0, 0, 0, $Tuple2(0, nil))
840840 func $f0_1 ($a,$i) = if (($i >= $s))
841841 then $a
842842 else map($a, $l[$i])
843843
844844 func $f0_2 ($a,$i) = if (($i >= $s))
845845 then $a
846846 else throw("List size exceeds 20")
847847
848848 $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)
849849 }
850- if (($t03064830810 == $t03064830810))
850+ if (($t03067730839 == $t03067730839))
851851 then {
852- let powerShareDataTuple = $t03064830810._4
853- let rewardToBusinessTreasuryAmount = $t03064830810._3
854- let rewardAmountTotal = $t03064830810._2
855- let lpAssetAmountTotal = $t03064830810._1
856- let $t03081430883 = powerShareDataTuple
857- let amountToPowerTotal = $t03081430883._1
858- let powerShareAmountsList = $t03081430883._2
852+ let powerShareDataTuple = $t03067730839._4
853+ let rewardToBusinessTreasuryAmount = $t03067730839._3
854+ let rewardAmountTotal = $t03067730839._2
855+ let lpAssetAmountTotal = $t03067730839._1
856+ let $t03084330912 = powerShareDataTuple
857+ let amountToPowerTotal = $t03084330912._1
858+ let powerShareAmountsList = $t03084330912._2
859859 let rewardToMainTreasuryAmount = (((rewardAmountTotal - rewardToBusinessTreasuryAmount) - blockProcessingReward) - amountToPowerTotal)
860860 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
861861 let powerShareActions = if ((amountToPowerTotal > 0))
862862 then {
863863 let transferAction = [invoke(factoryAddressOrFail, "transferFromProxyTreasury", [factoryAddressOrFail.bytes, amountToPowerTotal], nil)]
864864 if ((transferAction == transferAction))
865865 then {
866866 let totalPowerAmount = invoke(factoryAddressOrFail, "swap", [powerAssetIdStringOrFail, WAVES, amountToPowerTotal], nil)
867867 if ((totalPowerAmount == totalPowerAmount))
868868 then {
869869 let totalPowerAmountInt = match totalPowerAmount {
870870 case pAmount: Int =>
871871 pAmount
872872 case _ =>
873873 0
874874 }
875875 func stakePowerInvoke (acc,next) = {
876- let $t03175731792 = next
877- let generator = $t03175731792._1
878- let shareAmount = $t03175731792._2
876+ let $t03178631821 = next
877+ let generator = $t03178631821._1
878+ let shareAmount = $t03178631821._2
879879 if ((amountToPowerTotal > 0))
880880 then {
881881 let powerAmount = fraction(shareAmount, totalPowerAmountInt, amountToPowerTotal)
882882 let inv = invoke(factoryAddressOrFail, "powerStake", [fromBase58String(generator), fromBase58String(powerAssetIdStringOrFail), powerAmount], nil)
883883 if ((inv == inv))
884884 then nil
885885 else throw("Strict value is not equal to itself.")
886886 }
887887 else nil
888888 }
889889
890890 let powerStakesActions = {
891891 let $l = powerShareAmountsList
892892 let $s = size($l)
893893 let $acc0 = 0
894894 func $f1_1 ($a,$i) = if (($i >= $s))
895895 then $a
896896 else stakePowerInvoke($a, $l[$i])
897897
898898 func $f1_2 ($a,$i) = if (($i >= $s))
899899 then $a
900900 else throw("List size exceeds 20")
901901
902902 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
903903 }
904904 if ((powerStakesActions == powerStakesActions))
905905 then nil
906906 else throw("Strict value is not equal to itself.")
907907 }
908908 else throw("Strict value is not equal to itself.")
909909 }
910910 else throw("Strict value is not equal to itself.")
911911 }
912912 else nil
913913 if ((powerShareActions == powerShareActions))
914914 then {
915915 let actions = [invoke(factoryAddressOrFail, "reissue", [lpAssetAmountTotal], nil), invoke(factoryAddressOrFail, "integerEntry", [keyNextBlockToProcess(), (nextBlockToProcess + blocksProcessingBatchSize)], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [mainTreasuryAddressOrFail.bytes, rewardToMainTreasuryAmount], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [userAddressBytes, blockProcessingReward], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [businessTreasuryAddressOrFail.bytes, rewardToBusinessTreasuryAmount], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + rewardToMainTreasuryAmount)], nil)]
916916 if ((actions == actions))
917917 then $Tuple2(nil, unit)
918918 else throw("Strict value is not equal to itself.")
919919 }
920920 else throw("Strict value is not equal to itself.")
921921 }
922922 else throw("Strict value is not equal to itself.")
923923 }
924924 else throw("Strict value is not equal to itself.")
925925 }
926926
927927
928928 @Verifier(tx)
929929 func verify () = {
930930 let publicKey = match getManagerPublicKeyOrUnit() {
931931 case pub: ByteVector =>
932932 pub
933933 case _ =>
934934 tx.senderPublicKey
935935 }
936936 sigVerify(tx.bodyBytes, tx.proofs[0], publicKey)
937937 }
938938

github/deemru/w8io/169f3d6 
129.43 ms