tx · BXmzQLJEoX1U8VPzWWnYf71S7ofsbwVvC63LH5wfuG7u

3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS:  -0.01400000 Waves

2020.11.03 13:20 [1248989] smart account 3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS > SELF 0.00000000 Waves

{ "type": 13, "id": "BXmzQLJEoX1U8VPzWWnYf71S7ofsbwVvC63LH5wfuG7u", "fee": 1400000, "feeAssetId": null, "timestamp": 1604398848416, "version": 1, "sender": "3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS", "senderPublicKey": "Hxyif8HnnHh34SZ7PZewDcNUgrZfHNJsQvLNCcPbCW27", "proofs": [ "5SfFNXPkvKGjL9Jyzx3Z5GWugtzKjYuCZGTYBAMP5Tm8aoDr6Vu6zyc8mG8ASyr2ohW5SXg1V1ffMNqg9YB6Q8Ry" ], "script": "base64:AAIEAAAAAAAAAD0IAhIKCggICAEIAQEICBIRCg8ICAEIAQgBAQEBAQEBAQESAwoBCBIDCgEIEgQKAggBEgQKAggIEgQKAggIAAAAaQEAAAAWY29udmVydEpzb25BcnJheVRvTGlzdAAAAAIAAAAJanNvbkFycmF5AAAAC3NwbGl0U3ltYm9sCQAEtQAAAAIFAAAACWpzb25BcnJheQUAAAALc3BsaXRTeW1ib2wBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AgAAAAABAAAADGdldEJvb2xCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQcAAAAAA1NFUAIAAAACX18AAAAADGtleUFzc2V0Q29kZQAAAAAAAAAAAQAAAAAKa2V5QXNzZXRJZAAAAAAAAAAAAgAAAAAOa2V5QXNzZXRTdGF0dXMAAAAAAAAAAAMAAAAAFWtleUFzc2V0UHJpY2VEZWNpbWFscwAAAAAAAAAABAAAAAATa2V5QXNzZXRCYWtpbmdBc3NldAAAAAAAAAAABQAAAAAba2V5T3ZlcmNvbGxhdGVyYWxQZXJjZW50YWdlAAAAAAAAAAAGAAAAAAprZXlNaW5Qb29sAAAAAAAAAAAHAAAAABVrZXlQcmljZU9yYWNsZUFkZHJlc3MAAAAAAAAAAAgAAAAAEGtleU1pbkJ1eVBheW1lbnQAAAAAAAAAAAkAAAAAEWtleU1pblNlbGxQYXltZW50AAAAAAAAAAAKAAAAABJrZXlCdXlMb2NrSW50ZXJ2YWwAAAAAAAAAAAsAAAAAE2tleVNlbGxMb2NrSW50ZXJ2YWwAAAAAAAAAAAwAAAAACWtleUJ1eUZlZQAAAAAAAAAADQAAAAAKa2V5U2VsbEZlZQAAAAAAAAAADgAAAAAYa2V5UG9vbFJlZGVtcHRpb25UaW1lb3V0AAAAAAAAAAAPAAAAACFrZXlXZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQAAAAAAAAAABAAAAAADmFkbWluUHVibGljS2V5AgAAACxHMUVidTVBTUhhVEpGRWJaTmtaUWNKRlVROUtmaVlVd3VweUxHODU3RGNGcgAAAAAabmV1dHJpbm9Db250cmFjdEFkZHJlc3NLZXkCAAAAKyVzJXNfX2NvbW1vbkNvbmZpZ19fbmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAAAGW5ldXRyaW5vU3Rha2luZ0FkZHJlc3NLZXkCAAAAKiVzJXNfX2NvbW1vbkNvbmZpZ19fbmV1dHJpbm9TdGFraW5nQWRkcmVzcwAAAAAbbWluaW11blBvb2xGdW5kaW5nQW1vdW50S2V5AgAAACwlcyVzX19jb21tb25Db25maWdfX21pbmltdW1Qb29sRnVuZGluZ0Ftb3VudAAAAAAQaXNJbml0aWFsaXplZEtleQIAAAAfJXMlc19fY29tbW9uQ29uZmlnX19pbml0aWFsaXplZAAAAAAUY3VycmVudEFzc2V0SW5kZXhLZXkCAAAALyVzJXNfX2NvbW1vbkNvbmZpZ19fcHJlZGVmaW5lZEFzc2V0c0FjdGl2ZUluZGV4AAAAABRhc3NldHNBZGRyZXNzTGlzdEtleQIAAAAoJXMlc19fY29tbW9uQ29uZmlnX19wcmVkZWZpbmVkQXNzZXRzTGlzdAAAAAAOZGVidFRva2VuSWRLZXkCAAAAHyVzJXNfX2NvbW1vbkNvbmZpZ19fZGVidEFzc2V0SWQAAAAAGWRlYnRUb2tlbkV0YWxvbkJhbGFuY2VLZXkCAAAAKiVzJXNfX2NvbW1vbkNvbmZpZ19fZGVidEFzc2V0RXRhbG9uQmFsYW5jZQAAAAAVZGVmb1N0YWtpbmdBZGRyZXNzS2V5AgAAACYlcyVzX19jb21tb25Db25maWdfX2RlZm9TdGFraW5nQWRkcmVzcwAAAAAaZGVmb1N0YWtpbmdQYWNlbWFrZXJQdWJLZXkCAAAAKyVzJXNfX2NvbW1vbkNvbmZpZ19fZGVmb1N0YWtpbmdQYWNlbWFrZXJQdWIAAAAAFm1pblBvb2xJbnZlc3RBbW91bnRLZXkCAAAAJyVzJXNfX2NvbW1vbkNvbmZpZ19fbWluUG9vbEludmVzdEFtb3VudAAAAAASbmV1dHJpbm9Bc3NldElkS2V5AgAAABFuZXV0cmlub19hc3NldF9pZAAAAAAObnNidEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAADm5ldXRyaW5vUnBkS2V5AgAAAAxycGRfY29udHJhY3QAAAAADmRlZm9Bc3NldElkS2V5AgAAAA8lc19fZGVmb0Fzc2V0SWQAAAAAFXNldEFzc2V0U2NyaXB0VHhJZEtleQIAAAATJXNfX2Fzc2V0U2NyaXB0VHhJZAEAAAARZ2V0QXNzZXRDb25maWdLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAIX19jb25maWcBAAAAEGdldEFzc2V0UHJpY2VLZXkAAAABAAAACWFzc2V0Q29kZQkAASwAAAACAgAAAA0lcyVzX19wcmljZV9fBQAAAAlhc3NldENvZGUBAAAAFWdldEFzc2V0SW5pdEhlaWdodEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAAAxfX2luaXRIZWlnaHQBAAAAGWdldEFzc2V0QWN0aXZhdGVIZWlnaHRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAQX19hY3RpdmF0ZUhlaWdodAEAAAAdZ2V0QXNzZXRDdXJycmVudFBvb2xBbW91bnRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAANX19jdXJyZW50UG9vbAEAAAAYZ2V0QXNzZXRNYXhQb29sQW1vdW50S2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAxhc3NldEFkZHJlc3MCAAAACV9fbWF4UG9vbAEAAAAPZ2V0QXNzZXRNZXRhS2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAxhc3NldEFkZHJlc3MCAAAABl9fbWV0YQEAAAAVZ2V0QXNzZXRQb29sTWFrZXJzS2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAxhc3NldEFkZHJlc3MCAAAADF9fcG9vbE1ha2VycwEAAAAYZ2V0QXNzZXRBZGRyZXNzQnlDb2RlS2V5AAAAAQAAAAlhc3NldENvZGUJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAlhc3NldENvZGUCAAAAFF9fYWRkcmVzc0J5QXNzZXRDb2RlAQAAABtnZXRBc3NldEFkZHJlc3NCeUFzc2V0SWRLZXkAAAABAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAdhc3NldElkAgAAABJfX2FkZHJlc3NCeUFzc2V0SWQBAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnRLZXkAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVzJXNfX3Bvb2wJAARMAAAAAgUAAAAMYXNzZXRBZGRyZXNzCQAETAAAAAIFAAAAEHBvb2xNYWtlckFkZHJlc3MJAARMAAAAAgIAAAAGYW1vdW50BQAAAANuaWwFAAAAA1NFUAEAAAAlZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbk1heEFtb3VudEtleQAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAA4lcyVzJXMlc19fcG9vbAkABEwAAAACBQAAAAxhc3NldEFkZHJlc3MJAARMAAAAAgUAAAAQcG9vbE1ha2VyQWRkcmVzcwkABEwAAAACAgAAAAltYXhBbW91bnQFAAAAA25pbAUAAAADU0VQAQAAABtnZXRQb29sTWFrZXJMb2NrZWRBbW91bnRLZXkAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVzJXNfX3Bvb2wJAARMAAAAAgUAAAAMYXNzZXRBZGRyZXNzCQAETAAAAAIFAAAAEHBvb2xNYWtlckFkZHJlc3MJAARMAAAAAgIAAAAMbG9ja2VkQW1vdW50BQAAAANuaWwFAAAAA1NFUAEAAAAbZ2V0UG9vbE1ha2VyVW5sb2NrSGVpZ2h0S2V5AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAADiVzJXMlcyVzX19wb29sCQAETAAAAAIFAAAADGFzc2V0QWRkcmVzcwkABEwAAAACBQAAABBwb29sTWFrZXJBZGRyZXNzCQAETAAAAAICAAAADHVubG9ja0hlaWdodAUAAAADbmlsBQAAAANTRVABAAAAH2dldFBvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3RLZXkAAAADAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzAAAAAWgJAAS5AAAAAgkABEwAAAACAgAAABAlcyVzJXMlZCVzX19wb29sCQAETAAAAAIFAAAADGFzc2V0QWRkcmVzcwkABEwAAAACBQAAABBwb29sTWFrZXJBZGRyZXNzCQAETAAAAAIJAAGkAAAAAQUAAAABaAkABEwAAAACAgAAABBsaXF1aWRpdHlSZXF1ZXN0BQAAAANuaWwFAAAAA1NFUAEAAAAbZ2V0UG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAAwlcyVzJXNfX3Bvb2wJAARMAAAAAgUAAAAMYXNzZXRBZGRyZXNzCQAETAAAAAICAAAAEXRvdGFsTG9ja2VkQW1vdW50BQAAAANuaWwFAAAAA1NFUAEAAAATZ2V0QXNzZXRDb25maWdBcnJheQAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAAWY29udmVydEpzb25BcnJheVRvTGlzdAAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAABHRoaXMJAQAAABFnZXRBc3NldENvbmZpZ0tleQAAAAEFAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAADk5vIERFRk8gQXNzZXQgBQAAAAxhc3NldEFkZHJlc3MCAAAADmNvbmZpZyBwcmVzZW50AgAAAAJfXwAAAAANbXVsdGlwbGljYXRvcgAAAAAAAA9CQAAAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAGm5ldXRyaW5vQ29udHJhY3RBZGRyZXNzS2V5AgAAAB9ObyBuZXV0cmlubyBjb250cmFjdCBzcGVjaWZpZWQuAAAAABJuZXV0cmlub0Fzc2V0SWRTdHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABJuZXV0cmlub0Fzc2V0SWRLZXkCAAAAF05vIFVTRE4gYXNzZXQgaWQgZm91bmQuAAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQUAAAASbmV1dHJpbm9Bc3NldElkU3RyAAAAAAtuc2J0QXNzZXRJZAkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAObnNidEFzc2V0SWRLZXkCAAAAFk5vIE5TQlQgYXNzZXQgaWQgZm91bmQAAAAAEm1pbmltdW1Qb29sRnVuZGluZwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAG21pbmltdW5Qb29sRnVuZGluZ0Ftb3VudEtleQIAAAAtTWluaW11bSBwb29sIGZ1bmRpbmcgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQuAAAAABNtaW5Qb29sSW52ZXN0QW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFm1pblBvb2xJbnZlc3RBbW91bnRLZXkJAABoAAAAAgAAAAAAAAAACgUAAAANbXVsdGlwbGljYXRvcgAAAAANQVNTRXRQUk9QT1NFRAIAAAAIUFJPUE9TRUQAAAAACkFTU0V0UkVBRFkCAAAABVJFQURZAAAAAAtBU1NFdElTU1VFRAIAAAAGSVNTVUVEAAAAAAthc3NldFN0YXR1cwkABRUAAAADBQAAAA1BU1NFdFBST1BPU0VEBQAAAApBU1NFdFJFQURZBQAAAAtBU1NFdElTU1VFRAAAAAAYcHJlZGVmaW5lZEFzc2V0Q29udHJhY3RzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAUYXNzZXRzQWRkcmVzc0xpc3RLZXkCAAAALU5vIHBvb2wgb2YgcHJlZGVwbG95ZWQgYXNzZXQgY29udHJhY3RzIGZvdW5kLgAAAAAUcHJlZGVmaW5lZEFzc2V0c0xpc3QJAQAAABZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AAAAAgUAAAAYcHJlZGVmaW5lZEFzc2V0Q29udHJhY3RzAgAAAAEsAAAAABFjdXJyZW50QXNzZXRJbmRleAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABRjdXJyZW50QXNzZXRJbmRleEtleQAAAAAAAAAAAAAAAAAJZGVidFRva2VuCQACWQAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAA5kZWJ0VG9rZW5JZEtleQIAAAATTm8gZGVidCB0b2tlbiBmb3VuZAAAAAAWZGVidFRva2VuUmVpc3N1ZUFtb3VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABlkZWJ0VG9rZW5FdGFsb25CYWxhbmNlS2V5AAAAAAAAAAAAAAAAABNuZXV0cmlub1JwZENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAA5uZXV0cmlub1JwZEtleQEAAAAVZ2V0TmV1dHJpbm9ScGRCYWxhbmNlAAAAAQAAAAt1c2VyQWRkcmVzcwQAAAAWdXNlck5ldXRyaW5vUnBkQmFsYW5jZQkABLkAAAACCQAETAAAAAICAAAAC3JwZF9iYWxhbmNlCQAETAAAAAIFAAAAEm5ldXRyaW5vQXNzZXRJZFN0cgkABEwAAAACBQAAAAt1c2VyQWRkcmVzcwUAAAADbmlsAgAAAAFfCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAE25ldXRyaW5vUnBkQ29udHJhY3QFAAAAFnVzZXJOZXV0cmlub1JwZEJhbGFuY2UAAAAAAAAAAAABAAAAFWdldEFzc2V0QWRkcmVzc0J5Q29kZQAAAAEAAAALYXNzZXRTeW1ib2wJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAGGdldEFzc2V0QWRkcmVzc0J5Q29kZUtleQAAAAEFAAAAC2Fzc2V0U3ltYm9sAgAAAAABAAAAG2dldEFzc2V0QWRkcmVzc0J5Q29kZU9yRmFpbAAAAAEAAAALYXNzZXRTeW1ib2wJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAYZ2V0QXNzZXRBZGRyZXNzQnlDb2RlS2V5AAAAAQUAAAALYXNzZXRTeW1ib2wJAAEsAAAAAgkAASwAAAACAgAAAB1DYW5ub3QgZmluZCBhc3NldCBhZGRyZXNzIGJ5IAUAAAALYXNzZXRTeW1ib2wCAAAABSBjb2RlAQAAAAxnZXRBc3NldENvZGUAAAABAAAAC2Fzc2V0Q29uZmlnCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAAAxrZXlBc3NldENvZGUBAAAACmdldEFzc2V0SUQAAAABAAAAC2Fzc2V0Q29uZmlnCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAAAprZXlBc3NldElkAQAAAA5nZXRBc3NldFN0YXR1cwAAAAEAAAALYXNzZXRDb25maWcJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAADmtleUFzc2V0U3RhdHVzAQAAABVnZXRBc3NldFByaWNlRGVjaW1hbHMAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAFWtleUFzc2V0UHJpY2VEZWNpbWFscwEAAAAVZ2V0QXNzZXRCYWtpbmdBc3NldElkAAAAAQAAAAthc3NldENvbmZpZwkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAATa2V5QXNzZXRCYWtpbmdBc3NldAEAAAAdZ2V0QXNzZXRPdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAG2tleU92ZXJjb2xsYXRlcmFsUGVyY2VudGFnZQEAAAAdZ2V0QXNzZXRNaW5SZXF1aXJlZFBvb2xBbW91bnQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAACmtleU1pblBvb2wBAAAAGmdldEFzc2V0UHJpY2VPcmFjbGVBZGRyZXNzAAAAAQAAAAthc3NldENvbmZpZwkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAVa2V5UHJpY2VPcmFjbGVBZGRyZXNzAQAAABhnZXRNaW5CdXlQYXltZW50UGVyQXNzZXQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAEGtleU1pbkJ1eVBheW1lbnQBAAAAGWdldE1pblNlbGxQYXltZW50UGVyQXNzZXQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAEWtleU1pblNlbGxQYXltZW50AQAAABpnZXRCdXlMb2NrSW50ZXJ2YWxQZXJBc3NldAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAASa2V5QnV5TG9ja0ludGVydmFsAQAAABtnZXRTZWxsTG9ja0ludGVydmFsUGVyQXNzZXQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAE2tleVNlbGxMb2NrSW50ZXJ2YWwBAAAAEWdldEJ1eUZlZVBlckFzc2V0AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAAAlrZXlCdXlGZWUBAAAAEmdldFNlbGxGZWVQZXJBc3NldAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAKa2V5U2VsbEZlZQEAAAAaZ2V0UmVkZW1wdGlvblRpbWVvdXRCbG9ja3MAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAGGtleVBvb2xSZWRlbXB0aW9uVGltZW91dAEAAAAhZ2V0V2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAACFrZXlXZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQBAAAAEmdldEFzc2V0UG9vbE1ha2VycwAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAABVnZXRBc3NldFBvb2xNYWtlcnNLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MCAAAAAAEAAAASZ2V0QXNzZXRJbml0SGVpZ2h0AAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAFWdldEFzc2V0SW5pdEhlaWdodEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwAAAAAAAAAAAAEAAAAWZ2V0QXNzZXRBY3RpdmF0ZUhlaWdodAAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABlnZXRBc3NldEFjdGl2YXRlSGVpZ2h0S2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzAAAAAAAAAAAAAQAAABlnZXRBc3NldEN1cnJlbnRQb29sQW1vdW50AAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAHWdldEFzc2V0Q3VycnJlbnRQb29sQW1vdW50S2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzAAAAAAAAAAAAAQAAABVnZXRBc3NldE1heFBvb2xBbW91bnQAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAYZ2V0QXNzZXRNYXhQb29sQW1vdW50S2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzAAAAAAAAAAAAAQAAAAxnZXRBc3NldE1ldGEAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAPZ2V0QXNzZXRNZXRhS2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzAgAAAAABAAAAH2dldFBvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnQAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50S2V5AAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAABBwb29sTWFrZXJBZGRyZXNzAAAAAAAAAAAAAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uTWF4QW1vdW50AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAlZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbk1heEFtb3VudEtleQAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAAQcG9vbE1ha2VyQWRkcmVzcwAAAAAAAAAAAAEAAAAYZ2V0UG9vbE1ha2VyTG9ja2VkQW1vdW50AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAbZ2V0UG9vbE1ha2VyTG9ja2VkQW1vdW50S2V5AAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAABBwb29sTWFrZXJBZGRyZXNzAAAAAAAAAAAAAQAAABhnZXRQb29sTWFrZXJVbmxvY2tIZWlnaHQAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABtnZXRQb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAAEHBvb2xNYWtlckFkZHJlc3MAAAAAAAAAAAABAAAADWdldEFzc2V0UHJpY2UAAAACAAAAEnByaWNlT3JhY2xlQWRkcmVzcwAAAAlhc3NldENvZGUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAABJwcmljZU9yYWNsZUFkZHJlc3MJAQAAABBnZXRBc3NldFByaWNlS2V5AAAAAQUAAAAJYXNzZXRDb2RlAgAAABRObyBBc3NldCBwcmljZSBmb3VuZAEAAAAYZ2V0UG9vbFRvdGFsTG9ja2VkQW1vdW50AAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAG2dldFBvb2xUb3RhbExvY2tlZEFtb3VudEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwAAAAAAAAAAAAEAAAAfY29tcG9zZUFzc2V0Q29uZmlndXJhdGlvblN0cmluZwAAABAAAAAJYXNzZXRDb2RlAAAAB2Fzc2V0SWQAAAALYXNzZXRTdGF0dXMAAAANcHJpY2VEZWNpbWFscwAAAA5iYWNraW5nQXNzZXRJZAAAABVvdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAAHbWluUG9vbAAAABJwcmljZU9yYWNsZUFkZHJlc3MAAAANbWluQnV5UGF5bWVudAAAAA5taW5TZWxsUGF5bWVudAAAAA9idXlMb2NrSW50ZXJ2YWwAAAAQc2VsbExvY2tJbnRlcnZhbAAAAAZidXlGZWUAAAAHc2VsbEZlZQAAABVwb29sUmVkZW1wdGlvblRpbWVvdXQAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50CQAEuQAAAAIJAARMAAAAAgIAAAAeJXMlcyVzJWQlcyVkJWQlcyVkJWQlZCVkJWQlZCVkCQAETAAAAAIFAAAACWFzc2V0Q29kZQkABEwAAAACBQAAAAdhc3NldElkCQAETAAAAAIFAAAAC2Fzc2V0U3RhdHVzCQAETAAAAAIJAAGkAAAAAQUAAAANcHJpY2VEZWNpbWFscwkABEwAAAACBQAAAA5iYWNraW5nQXNzZXRJZAkABEwAAAACCQABpAAAAAEFAAAAFW92ZXJDb2xsYXRlcmFsUGVyY2VudAkABEwAAAACCQABpAAAAAEFAAAAB21pblBvb2wJAARMAAAAAgUAAAAScHJpY2VPcmFjbGVBZGRyZXNzCQAETAAAAAIJAAGkAAAAAQUAAAANbWluQnV5UGF5bWVudAkABEwAAAACCQABpAAAAAEFAAAADm1pblNlbGxQYXltZW50CQAETAAAAAIJAAGkAAAAAQUAAAAPYnV5TG9ja0ludGVydmFsCQAETAAAAAIJAAGkAAAAAQUAAAAQc2VsbExvY2tJbnRlcnZhbAkABEwAAAACCQABpAAAAAEFAAAABmJ1eUZlZQkABEwAAAACCQABpAAAAAEFAAAAB3NlbGxGZWUJAARMAAAAAgkAAaQAAAABBQAAABVwb29sUmVkZW1wdGlvblRpbWVvdXQJAARMAAAAAgkAAaQAAAABBQAAAB53ZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQFAAAAA25pbAIAAAACX18BAAAAFHVwZGF0ZUFzc2V0Q2ZnU3RhdHVzAAAAAgAAAAluZXdTdGF0dXMAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAFYUNvZGUJAQAAAAxnZXRBc3NldENvZGUAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAANhSUQJAQAAAApnZXRBc3NldElEAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAOYVByaWNlRGVjaW1hbHMJAQAAABVnZXRBc3NldFByaWNlRGVjaW1hbHMAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAA5hQmFraW5nQXNzZXRJZAkBAAAAFWdldEFzc2V0QmFraW5nQXNzZXRJZAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAFmFPdmVyQ29sbGF0ZXJhbFBlcmNlbnQJAQAAAB1nZXRBc3NldE92ZXJDb2xsYXRlcmFsUGVyY2VudAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAEGFNaW5SZXF1aXJlZFBvb2wJAQAAAB1nZXRBc3NldE1pblJlcXVpcmVkUG9vbEFtb3VudAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAE2FQcmljZU9yYWNsZUFkZHJlc3MJAQAAABpnZXRBc3NldFByaWNlT3JhY2xlQWRkcmVzcwAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAADmFNaW5CdXlQYXltZW50CQEAAAAYZ2V0TWluQnV5UGF5bWVudFBlckFzc2V0AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAPYU1pblNlbGxQYXltZW50CQEAAAAZZ2V0TWluU2VsbFBheW1lbnRQZXJBc3NldAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAEGFCdXlMb2NrSW50ZXJ2YWwJAQAAABpnZXRCdXlMb2NrSW50ZXJ2YWxQZXJBc3NldAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAEWFTZWxsTG9ja0ludGVydmFsCQEAAAAbZ2V0U2VsbExvY2tJbnRlcnZhbFBlckFzc2V0AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAHYUJ1eUZlZQkBAAAAEWdldEJ1eUZlZVBlckFzc2V0AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAIYVNlbGxGZWUJAQAAABJnZXRTZWxsRmVlUGVyQXNzZXQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAABhhUmVkZW1wdGlvblRpbWVvdXRCbG9ja3MJAQAAABpnZXRSZWRlbXB0aW9uVGltZW91dEJsb2NrcwAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAkBAAAAIWdldFdlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QJAQAAAB9jb21wb3NlQXNzZXRDb25maWd1cmF0aW9uU3RyaW5nAAAAEAUAAAAFYUNvZGUFAAAAA2FJRAUAAAAJbmV3U3RhdHVzBQAAAA5hUHJpY2VEZWNpbWFscwUAAAAOYUJha2luZ0Fzc2V0SWQFAAAAFmFPdmVyQ29sbGF0ZXJhbFBlcmNlbnQFAAAAEGFNaW5SZXF1aXJlZFBvb2wFAAAAE2FQcmljZU9yYWNsZUFkZHJlc3MFAAAADmFNaW5CdXlQYXltZW50BQAAAA9hTWluU2VsbFBheW1lbnQFAAAAEGFCdXlMb2NrSW50ZXJ2YWwFAAAAEWFTZWxsTG9ja0ludGVydmFsBQAAAAdhQnV5RmVlBQAAAAhhU2VsbEZlZQUAAAAYYVJlZGVtcHRpb25UaW1lb3V0QmxvY2tzBQAAAB53ZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQBAAAAGWNhbGNBbGxvd2VkQW1vdW50VG9SZWRlZW0AAAACAAAACWFzc2V0Q29kZQAAABBwb29sTWFrZXJBZGRyZXNzBAAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABtnZXRBc3NldEFkZHJlc3NCeUNvZGVPckZhaWwAAAABBQAAAAlhc3NldENvZGUEAAAADGFzc2V0QWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0CQEAAAATZ2V0QXNzZXRDb25maWdBcnJheQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgQAAAAKYXNzZXRJZFN0cgkBAAAACmdldEFzc2V0SUQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAAdhc3NldElkCQACWQAAAAEFAAAACmFzc2V0SWRTdHIEAAAADnBvb2xBY3R1YWxTaXplCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAB1nZXRBc3NldEN1cnJyZW50UG9vbEFtb3VudEtleQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgAAAAAAAAAAAAQAAAALcG9vbE1heFNpemUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAGGdldEFzc2V0TWF4UG9vbEFtb3VudEtleQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgAAAAAAAAAAAAQAAAAYcG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5CQEAAAAbZ2V0UG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAAA9wb29sVG90YWxMb2NrZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAYcG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5AAAAAAAAAAAABAAAABVhc3NldFVzZG5TdGFrZWRBbW91bnQJAQAAABVnZXROZXV0cmlub1JwZEJhbGFuY2UAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIEAAAAFmFzc2V0VXNkbkJhbGFuY2VBbW91bnQJAAPwAAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAAA9uZXV0cmlub0Fzc2V0SWQEAAAAFGFzc2V0VG90YWxVc2RuQW1vdW50CQAAZQAAAAIJAABkAAAAAgUAAAAVYXNzZXRVc2RuU3Rha2VkQW1vdW50BQAAABZhc3NldFVzZG5CYWxhbmNlQW1vdW50BQAAAA9wb29sVG90YWxMb2NrZWQEAAAAC3Vjb2xsYXRlcmFsCQAAZQAAAAIFAAAAFGFzc2V0VG90YWxVc2RuQW1vdW50BQAAAA5wb29sQWN0dWFsU2l6ZQQAAAAQZGVmb0Fzc2V0QmFsYW5jZQkAA/AAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAAB2Fzc2V0SWQEAAAAEmFzc2V0RW1pc3Npb25EaXJ0eQgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAdhc3NldElkCQABLAAAAAICAAAAGENhbm5vdCBmaW5kIGFzc2V0IGJ5IGlkIAUAAAAKYXNzZXRJZFN0cgAAAAhxdWFudGl0eQQAAAANYXNzZXRFbWlzc2lvbgkAAGUAAAACBQAAABJhc3NldEVtaXNzaW9uRGlydHkFAAAAEGRlZm9Bc3NldEJhbGFuY2UEAAAAEnByaWNlT3JhY2xlQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAGmdldEFzc2V0UHJpY2VPcmFjbGVBZGRyZXNzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAMY3VycmVudFByaWNlCQEAAAANZ2V0QXNzZXRQcmljZQAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwUAAAAJYXNzZXRDb2RlBAAAABtwcmljZVdpdGhPdmVyY29sbGF0ZXJhbFJhdGUJAABpAAAAAgkAAGgAAAACCQAAZAAAAAIFAAAADW11bHRpcGxpY2F0b3IJAQAAAB1nZXRBc3NldE92ZXJDb2xsYXRlcmFsUGVyY2VudAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QFAAAADGN1cnJlbnRQcmljZQUAAAANbXVsdGlwbGljYXRvcgQAAAAZdXNkbk5lZWRlZFRvQ292ZXJFbWlzc2lvbgkAAGsAAAADBQAAABtwcmljZVdpdGhPdmVyY29sbGF0ZXJhbFJhdGUFAAAADWFzc2V0RW1pc3Npb24FAAAADW11bHRpcGxpY2F0b3IEAAAAEnBvb2xNYWtlck1heEFtb3VudAkBAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnQAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAH3Bvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnRLZXkJAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50S2V5AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAABBwb29sTWFrZXJBZGRyZXNzBAAAABVwb29sTWFrZXJBY3R1YWxBbW91bnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAfcG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQAAAAAAAAAAAAQAAAAVcG9vbE1ha2VyTG9ja2VkQW1vdW50CQEAAAAYZ2V0UG9vbE1ha2VyTG9ja2VkQW1vdW50AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAABBwb29sTWFrZXJBZGRyZXNzBAAAAAdzdXJwbHVzCQAAZQAAAAIFAAAAC3Vjb2xsYXRlcmFsBQAAABl1c2RuTmVlZGVkVG9Db3ZlckVtaXNzaW9uBAAAABBwZXJjZW50VmlhQWN0dWFsCQAAawAAAAMFAAAAFXBvb2xNYWtlckFjdHVhbEFtb3VudAUAAAANbXVsdGlwbGljYXRvcgUAAAAOcG9vbEFjdHVhbFNpemUEAAAADXBlcmNlbnRWaWFNYXgJAABrAAAAAwUAAAAScG9vbE1ha2VyTWF4QW1vdW50BQAAAA1tdWx0aXBsaWNhdG9yBQAAAAtwb29sTWF4U2l6ZQQAAAAKZnJvemVuUGFydAMJAABnAAAAAgUAAAAHc3VycGx1cwAAAAAAAAAAAAAAAAAAAAAAAAkAAZYAAAABCQAETAAAAAIFAAAAEHBlcmNlbnRWaWFBY3R1YWwJAARMAAAAAgUAAAANcGVyY2VudFZpYU1heAUAAAADbmlsBAAAABVhbGxvd2VkQW1vdW50VG9SZWRlZW0JAABrAAAAAwkAAGUAAAACBQAAAA1tdWx0aXBsaWNhdG9yBQAAAApmcm96ZW5QYXJ0BQAAABVwb29sTWFrZXJBY3R1YWxBbW91bnQFAAAADW11bHRpcGxpY2F0b3IEAAAADndpdGhkcmF3SGVpZ2h0CQAAZAAAAAIFAAAABmhlaWdodAkBAAAAGmdldFJlZGVtcHRpb25UaW1lb3V0QmxvY2tzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAkABRoAAAAIBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAFWFsbG93ZWRBbW91bnRUb1JlZGVlbQUAAAAPcG9vbFRvdGFsTG9ja2VkBQAAAA5wb29sQWN0dWFsU2l6ZQUAAAAVcG9vbE1ha2VyQWN0dWFsQW1vdW50BQAAAA53aXRoZHJhd0hlaWdodAUAAAAVcG9vbE1ha2VyTG9ja2VkQW1vdW50CQAEuQAAAAIJAARMAAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyCQAETAAAAAIFAAAACmFzc2V0SWRTdHIJAARMAAAAAgUAAAAQcG9vbE1ha2VyQWRkcmVzcwkABEwAAAACCQABpAAAAAEFAAAAFWFzc2V0VXNkblN0YWtlZEFtb3VudAkABEwAAAACCQABpAAAAAEFAAAAFmFzc2V0VXNkbkJhbGFuY2VBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAABRhc3NldFRvdGFsVXNkbkFtb3VudAkABEwAAAACCQABpAAAAAEFAAAADnBvb2xBY3R1YWxTaXplCQAETAAAAAIJAAGkAAAAAQUAAAALcG9vbE1heFNpemUJAARMAAAAAgkAAaQAAAABBQAAAAt1Y29sbGF0ZXJhbAkABEwAAAACCQABpAAAAAEFAAAADWFzc2V0RW1pc3Npb24JAARMAAAAAgkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABtwcmljZVdpdGhPdmVyY29sbGF0ZXJhbFJhdGUJAARMAAAAAgkAAaQAAAABBQAAABJwb29sTWFrZXJNYXhBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAABVwb29sTWFrZXJBY3R1YWxBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAABVwb29sTWFrZXJMb2NrZWRBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAAdzdXJwbHVzCQAETAAAAAIJAAGkAAAAAQUAAAAQcGVyY2VudFZpYUFjdHVhbAkABEwAAAACCQABpAAAAAEFAAAADXBlcmNlbnRWaWFNYXgJAARMAAAAAgkAAaQAAAABBQAAAApmcm96ZW5QYXJ0CQAETAAAAAIJAAGkAAAAAQUAAAAVYWxsb3dlZEFtb3VudFRvUmVkZWVtBQAAAANuaWwFAAAAA1NFUAAAAAcAAAABaQEAAAAEaW5pdAAAAAgAAAAXbmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAAWbmV1dHJpbm9TdGFraW5nQWRkcmVzcwAAABhtaW5pbXVuUG9vbEZ1bmRpbmdBbW91bnQAAAATcHJlZGVmaW5lZEFzc2V0TGlzdAAAABFjdXJyZW50QXNzZXRJbmRleAAAABJkZWJ0RXRoYWxvbkJhbGFuY2UAAAASZGVmb1N0YWtpbmdBZGRyZXNzAAAAF2RlZm9TdGFraW5nUGFjZW1ha2VyUHViAwkBAAAAAiE9AAAAAgkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAADmFkbWluUHVibGljS2V5CQAAAgAAAAECAAAAKk9ubHkgQWRtaW4gY2FuIHBlcmZvcm0gY29udHJhY3Qgb3BlcmF0aW9uLgMJAAAAAAAAAgkBAAAADGdldEJvb2xCeUtleQAAAAEFAAAAEGlzSW5pdGlhbGl6ZWRLZXkGCQAAAgAAAAECAAAAIUNvbnRyYWN0IHdhcyBhbHJlYWR5IGluaXRpYWxpemVkLgQAAAAJaXNzdWVEZWJ0CQAEQgAAAAUCAAAACURFRk9fREVCVAIAAAAQREVGTyBEZWJ0IFRva2VuLgAAAAAAAAAAAQAAAAAAAAAABgYEAAAAC2RlYnRUb2tlbklkCQAEOAAAAAEFAAAACWlzc3VlRGVidAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABpuZXV0cmlub0NvbnRyYWN0QWRkcmVzc0tleQUAAAAXbmV1dHJpbm9Db250cmFjdEFkZHJlc3MJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAZbmV1dHJpbm9TdGFraW5nQWRkcmVzc0tleQUAAAAWbmV1dHJpbm9TdGFraW5nQWRkcmVzcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAbbWluaW11blBvb2xGdW5kaW5nQW1vdW50S2V5BQAAABhtaW5pbXVuUG9vbEZ1bmRpbmdBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAUYXNzZXRzQWRkcmVzc0xpc3RLZXkFAAAAE3ByZWRlZmluZWRBc3NldExpc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFGN1cnJlbnRBc3NldEluZGV4S2V5BQAAABFjdXJyZW50QXNzZXRJbmRleAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAZZGVidFRva2VuRXRhbG9uQmFsYW5jZUtleQUAAAASZGVidEV0aGFsb25CYWxhbmNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADmRlYnRUb2tlbklkS2V5CQACWAAAAAEFAAAAC2RlYnRUb2tlbklkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAFWRlZm9TdGFraW5nQWRkcmVzc0tleQUAAAASZGVmb1N0YWtpbmdBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAGmRlZm9TdGFraW5nUGFjZW1ha2VyUHViS2V5BQAAABdkZWZvU3Rha2luZ1BhY2VtYWtlclB1YgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAQaXNJbml0aWFsaXplZEtleQYJAARMAAAAAgUAAAAJaXNzdWVEZWJ0CQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAALZGVidFRva2VuSWQAAAAAAAAAAAEFAAAAA25pbAAAAAFpAQAAAAxwcm9wb3NlQXNzZXQAAAAPAAAACWFzc2V0Q29kZQAAAARtZXRhAAAAB21pblBvb2wAAAAScHJpY2VPcmFjbGVBZGRyZXNzAAAAFW92ZXJDb2xsYXRlcmFsUGVyY2VudAAAAA5iYWNraW5nQXNzZXRJZAAAAA1wcmljZURlY2ltYWxzAAAADW1pbkJ1eVBheW1lbnQAAAAObWluU2VsbFBheW1lbnQAAAAPYnV5TG9ja0ludGVydmFsAAAAEHNlbGxMb2NrSW50ZXJ2YWwAAAAGYnV5RmVlAAAAB3NlbGxGZWUAAAAVcG9vbFJlZGVtcHRpb25UaW1lb3V0AAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAMJAQAAAAIhPQAAAAIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5hZG1pblB1YmxpY0tleQkAAAIAAAABAgAAACpPbmx5IEFkbWluIGNhbiBwZXJmb3JtIGNvbnRyYWN0IG9wZXJhdGlvbi4DCQAAAAAAAAIJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAABBpc0luaXRpYWxpemVkS2V5BwkAAAIAAAABAgAAABpDb250cmFjdCBpcyBub3QgeWV0IHJlYWR5LgMJAQAAAAIhPQAAAAIJAAJZAAAAAQUAAAAOYmFja2luZ0Fzc2V0SWQFAAAAD25ldXRyaW5vQXNzZXRJZAkAAAIAAAABAgAAACNCYWtpbmcgYXNzZXQgaWQgY291bGQgYmUgVVNETiBvbmx5LgMJAQAAAAIhPQAAAAIJAQAAABVnZXRBc3NldEFkZHJlc3NCeUNvZGUAAAABBQAAAAlhc3NldENvZGUCAAAAAAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAXQXNzZXQgd2l0aCBwYXNzZWQgY29kZSAFAAAACWFzc2V0Q29kZQIAAAAbIGhhcyBhbHJlYWR5IGJlZW4gcHJvcG9zZWQuAwkAAGYAAAACBQAAABJtaW5pbXVtUG9vbEZ1bmRpbmcFAAAAB21pblBvb2wJAAACAAAAAQkAASwAAAACAgAAADNNaW5pbXVtIHBvb2wgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIG9yIGVxdWFscyB0byAJAAGkAAAAAQUAAAASbWluaW11bVBvb2xGdW5kaW5nAwMDAwMDAwMJAABmAAAAAgAAAAAAAAAAAAUAAAAVb3ZlckNvbGxhdGVyYWxQZXJjZW50BgkAAGYAAAACAAAAAAAAAAAABQAAAA1wcmljZURlY2ltYWxzBgkAAGYAAAACAAAAAAAAAAAABQAAAA1taW5CdXlQYXltZW50BgkAAGYAAAACAAAAAAAAAAAABQAAAA5taW5TZWxsUGF5bWVudAYJAABmAAAAAgAAAAAAAAAAAAUAAAAPYnV5TG9ja0ludGVydmFsBgkAAGYAAAACAAAAAAAAAAAABQAAABBzZWxsTG9ja0ludGVydmFsBgkAAGYAAAACAAAAAAAAAAAABQAAAAZidXlGZWUGCQAAZgAAAAIAAAAAAAAAAAAFAAAAB3NlbGxGZWUJAAACAAAAAQIAAAAoT25lIG9mIHRoZSBwYXNzZWQgcGFyYW1ldGVycyBpcyBpbnZhbGlkLgQAAAAXcHJpY2VPcmFjbGVBZGRyZXNzVmFsaWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAScHJpY2VPcmFjbGVBZGRyZXNzAgAAAClQYXNzZWQgUHJpY2UgT3JhY2xlIEFkZHJlc3MgaXMgbm90IHZhbGlkLgQAAAAMYXNzZXRBZGRyZXNzCQABkQAAAAIFAAAAFHByZWRlZmluZWRBc3NldHNMaXN0BQAAABFjdXJyZW50QXNzZXRJbmRleAQAAAALZGVmb0Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAAMYXNzZXRBZGRyZXNzAgAAAAAFAAAADmRlZm9Bc3NldElkS2V5AgAAABdObyBkZWZvIGFzc2V0IElEIGZvdW5kLgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARZ2V0QXNzZXRDb25maWdLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MJAQAAAB9jb21wb3NlQXNzZXRDb25maWd1cmF0aW9uU3RyaW5nAAAAEAUAAAAJYXNzZXRDb2RlBQAAAAtkZWZvQXNzZXRJZAgFAAAAC2Fzc2V0U3RhdHVzAAAAAl8xBQAAAA1wcmljZURlY2ltYWxzBQAAAA5iYWNraW5nQXNzZXRJZAUAAAAVb3ZlckNvbGxhdGVyYWxQZXJjZW50BQAAAAdtaW5Qb29sBQAAABJwcmljZU9yYWNsZUFkZHJlc3MFAAAADW1pbkJ1eVBheW1lbnQFAAAADm1pblNlbGxQYXltZW50BQAAAA9idXlMb2NrSW50ZXJ2YWwFAAAAEHNlbGxMb2NrSW50ZXJ2YWwFAAAABmJ1eUZlZQUAAAAHc2VsbEZlZQUAAAAVcG9vbFJlZGVtcHRpb25UaW1lb3V0BQAAAB53ZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGGdldEFzc2V0QWRkcmVzc0J5Q29kZUtleQAAAAEFAAAACWFzc2V0Q29kZQUAAAAMYXNzZXRBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9nZXRBc3NldE1ldGFLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MFAAAABG1ldGEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVnZXRBc3NldEluaXRIZWlnaHRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MFAAAABmhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUY3VycmVudEFzc2V0SW5kZXhLZXkJAABkAAAAAgUAAAARY3VycmVudEFzc2V0SW5kZXgAAAAAAAAAAAEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAG2dldEFzc2V0QWRkcmVzc0J5QXNzZXRJZEtleQAAAAEFAAAAC2RlZm9Bc3NldElkBQAAAAxhc3NldEFkZHJlc3MFAAAAA25pbAAAAAFpAQAAABFmdW5kTGlxdWlkaXR5UG9vbAAAAAEAAAAJYXNzZXRDb2RlBAAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABtnZXRBc3NldEFkZHJlc3NCeUNvZGVPckZhaWwAAAABBQAAAAlhc3NldENvZGUEAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QJAQAAABNnZXRBc3NldENvbmZpZ0FycmF5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAAA9hdHRhY2hlZFBheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAAEHBvb2xNYWtlckFkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQcJAAACAAAAAQIAAAAaQ29udHJhY3QgaXMgbm90IHlldCByZWFkeS4DCQEAAAACIT0AAAACCAUAAAAPYXR0YWNoZWRQYXltZW50AAAAB2Fzc2V0SWQFAAAAD25ldXRyaW5vQXNzZXRJZAkAAAIAAAABAgAAAC5MaXF1aWRpdHkgcG9vbCBjb3VsZCBiZSBmdW5kZWQgd2l0aCBVU0ROIG9ubHkuAwkAAGYAAAACBQAAABNtaW5Qb29sSW52ZXN0QW1vdW50CAUAAAAPYXR0YWNoZWRQYXltZW50AAAABmFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAMUF0dGFjaGVkIHBheW1lbnQgYW1vdW50IGlzIGxlc3MgdGhhIG1pbiBhbGxvd2VkOiAJAAGkAAAAAQUAAAATbWluUG9vbEludmVzdEFtb3VudAQAAAAUbmV3Q3VycmVudFBvb2xBbW91bnQJAABkAAAAAggFAAAAD2F0dGFjaGVkUGF5bWVudAAAAAZhbW91bnQJAQAAABlnZXRBc3NldEN1cnJlbnRQb29sQW1vdW50AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAAA1tYXhQb29sQW1vdW50CQEAAAAVZ2V0QXNzZXRNYXhQb29sQW1vdW50AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAABdjdXJyZW50UG9vbE1ha2VyQmFsYW5jZQkBAAAAH2dldFBvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnQAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAE21heFBvb2xNYWtlckJhbGFuY2UJAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uTWF4QW1vdW50AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAABBwb29sTWFrZXJBZGRyZXNzBAAAABJjdXJyZW50QXNzZXRTdGF0dXMJAQAAAA5nZXRBc3NldFN0YXR1cwAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAADm5ld0Fzc2V0U3RhdHVzAwMJAAAAAAAAAgUAAAASY3VycmVudEFzc2V0U3RhdHVzBQAAAA1BU1NFdFBST1BPU0VECQAAZwAAAAIFAAAAFG5ld0N1cnJlbnRQb29sQW1vdW50CQEAAAAdZ2V0QXNzZXRNaW5SZXF1aXJlZFBvb2xBbW91bnQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BwUAAAAKQVNTRXRSRUFEWQUAAAASY3VycmVudEFzc2V0U3RhdHVzBAAAABNuZXdQb29sTWFrZXJCYWxhbmNlCQAAZAAAAAIFAAAAF2N1cnJlbnRQb29sTWFrZXJCYWxhbmNlCAUAAAAPYXR0YWNoZWRQYXltZW50AAAABmFtb3VudAQAAAAZaW1tZWRpYXRlVHJhbnNmZXJJZklzc3VlZAMJAAAAAAAAAgUAAAASY3VycmVudEFzc2V0U3RhdHVzBQAAAAtBU1NFdElTU1VFRAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIIBQAAAA9hdHRhY2hlZFBheW1lbnQAAAAGYW1vdW50BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAUAAAADbmlsCQAETgAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50S2V5AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAABBwb29sTWFrZXJBZGRyZXNzBQAAABNuZXdQb29sTWFrZXJCYWxhbmNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAlZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbk1heEFtb3VudEtleQAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAQcG9vbE1ha2VyQWRkcmVzcwkAAZYAAAABCQAETAAAAAIFAAAAE25ld1Bvb2xNYWtlckJhbGFuY2UJAARMAAAAAgUAAAATbWF4UG9vbE1ha2VyQmFsYW5jZQUAAAADbmlsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAdZ2V0QXNzZXRDdXJycmVudFBvb2xBbW91bnRLZXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAFG5ld0N1cnJlbnRQb29sQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAYZ2V0QXNzZXRNYXhQb29sQW1vdW50S2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyCQABlgAAAAEJAARMAAAAAgUAAAANbWF4UG9vbEFtb3VudAkABEwAAAACBQAAABRuZXdDdXJyZW50UG9vbEFtb3VudAUAAAADbmlsCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFnZXRBc3NldENvbmZpZ0tleQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgkBAAAAFHVwZGF0ZUFzc2V0Q2ZnU3RhdHVzAAAAAgUAAAAObmV3QXNzZXRTdGF0dXMFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QFAAAAA25pbAUAAAAZaW1tZWRpYXRlVHJhbnNmZXJJZklzc3VlZAAAAAFpAQAAAA1hY3RpdmF0ZUFzc2V0AAAAAQAAAAlhc3NldENvZGUEAAAADGFzc2V0QWRkcmVzcwkBAAAAFWdldEFzc2V0QWRkcmVzc0J5Q29kZQAAAAEFAAAACWFzc2V0Q29kZQQAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAkBAAAAE2dldEFzc2V0Q29uZmlnQXJyYXkAAAABBQAAAAxhc3NldEFkZHJlc3MEAAAAFmFzc2V0Q3VycmVudFBvb2xBbW91bnQJAQAAABlnZXRBc3NldEN1cnJlbnRQb29sQW1vdW50AAAAAQUAAAAMYXNzZXRBZGRyZXNzBAAAAA5hQ3VycmVudFN0YXR1cwkBAAAADmdldEFzc2V0U3RhdHVzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAMJAQAAAAIhPQAAAAIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5hZG1pblB1YmxpY0tleQkAAAIAAAABAgAAACpPbmx5IEFkbWluIGNhbiBwZXJmb3JtIGNvbnRyYWN0IG9wZXJhdGlvbi4DCQAAAAAAAAIJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAABBpc0luaXRpYWxpemVkS2V5BwkAAAIAAAABAgAAABpDb250cmFjdCBpcyBub3QgeWV0IHJlYWR5LgMJAQAAAAIhPQAAAAIFAAAADmFDdXJyZW50U3RhdHVzCAUAAAALYXNzZXRTdGF0dXMAAAACXzIJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAMEFzc2V0IGlzIG5vdCBpbiBSRUFEWSBzdGF0dXMuIEN1cnJlbnQgc3RhdHVzIGlzIAUAAAAOYUN1cnJlbnRTdGF0dXMCAAAAAS4DCQAAAAAAAAIFAAAADGFzc2V0QWRkcmVzcwIAAAAACQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABJDYW5ub3QgZmluZCBhc3NldCAFAAAACWFzc2V0Q29kZQIAAAABLgMJAABmAAAAAgUAAAASbWluaW11bVBvb2xGdW5kaW5nBQAAABZhc3NldEN1cnJlbnRQb29sQW1vdW50CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAtQ2Fubm90IGlzc3VlIGFzc2V0IGFzIGxpcXVpZGl0eSBwb29sIGFtb3VudCAoCQABpAAAAAEFAAAAFmFzc2V0Q3VycmVudFBvb2xBbW91bnQCAAAAGSkgaXMgbGVzcyB0aGFuIHJlcXVpcmVkICgJAAGkAAAAAQUAAAASbWluaW11bVBvb2xGdW5kaW5nAgAAAAEpBAAAAAlpc3N1ZURlYnQJAQAAAAdSZWlzc3VlAAAAAwUAAAAJZGVidFRva2VuBQAAABZkZWJ0VG9rZW5SZWlzc3VlQW1vdW50BgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAGWdldEFzc2V0QWN0aXZhdGVIZWlnaHRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MFAAAABmhlaWdodAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARZ2V0QXNzZXRDb25maWdLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MJAQAAABR1cGRhdGVBc3NldENmZ1N0YXR1cwAAAAIIBQAAAAthc3NldFN0YXR1cwAAAAJfMwUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAkABEwAAAACBQAAAAlpc3N1ZURlYnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAMYXNzZXRBZGRyZXNzBQAAABZhc3NldEN1cnJlbnRQb29sQW1vdW50BQAAAA9uZXV0cmlub0Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAMYXNzZXRBZGRyZXNzBQAAABZkZWJ0VG9rZW5SZWlzc3VlQW1vdW50BQAAAAlkZWJ0VG9rZW4FAAAAA25pbAAAAAFpAQAAAA5yZWRlZW1Gcm9tUG9vbAAAAAIAAAAJYXNzZXRDb2RlAAAABmFtb3VudAQAAAANY2FsbGVyQWRkcmVzcwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAC3JlZGVlbVR1cGxlCQEAAAAZY2FsY0FsbG93ZWRBbW91bnRUb1JlZGVlbQAAAAIFAAAACWFzc2V0Q29kZQUAAAANY2FsbGVyQWRkcmVzcwQAAAAPYXNzZXRBZGRyZXNzU3RyCAUAAAALcmVkZWVtVHVwbGUAAAACXzEEAAAAFWFsbG93ZWRBbW91bnRUb1JlZGVlbQgFAAAAC3JlZGVlbVR1cGxlAAAAAl8yBAAAAA9wb29sVG90YWxMb2NrZWQIBQAAAAtyZWRlZW1UdXBsZQAAAAJfMwQAAAAOcG9vbEFjdHVhbFNpemUIBQAAAAtyZWRlZW1UdXBsZQAAAAJfNAQAAAAVcG9vbE1ha2VyQWN0dWFsQW1vdW50CAUAAAALcmVkZWVtVHVwbGUAAAACXzUEAAAADndpdGhkcmF3SGVpZ2h0CAUAAAALcmVkZWVtVHVwbGUAAAACXzYEAAAAFXBvb2xNYWtlckxvY2tlZEFtb3VudAgFAAAAC3JlZGVlbVR1cGxlAAAAAl83BAAAAAl0cmFjZURhdGEIBQAAAAtyZWRlZW1UdXBsZQAAAAJfOAQAAAAccG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQkBAAAAH2dldFBvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3RLZXkAAAADBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAADWNhbGxlckFkZHJlc3MFAAAADndpdGhkcmF3SGVpZ2h0AwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQcJAAACAAAAAQIAAAAaQ29udHJhY3QgaXMgbm90IHlldCByZWFkeS4DAwMJAABmAAAAAgAAAAAAAAAAAAUAAAAGYW1vdW50BgkAAGcAAAACAAAAAAAAAAAABQAAABVwb29sTWFrZXJBY3R1YWxBbW91bnQGCQAAZgAAAAIFAAAABmFtb3VudAUAAAAVYWxsb3dlZEFtb3VudFRvUmVkZWVtCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAACJDYW5ub3QgZmluZCBwb29sIG1ha2VyIGJ5IGFkZHJlc3MgBQAAAA1jYWxsZXJBZGRyZXNzAgAAACEgb3IgYW1vdW50IHBhc3NlZCBpcyBub3QgY29ycmVjdC4DCQAAZgAAAAIJAABoAAAAAgAAAAAAAAAAAQUAAAANbXVsdGlwbGljYXRvcgUAAAAGYW1vdW50CQAAAgAAAAECAAAAJlJlZGVlbSBhbW91bnQgaXMgbGVzcyB0aGVuIG1pbiBhbGxvd2VkAwkAAGYAAAACBQAAABVwb29sTWFrZXJMb2NrZWRBbW91bnQAAAAAAAAAAAAJAAACAAAAAQIAAABGUG9vbCBtYWtlciBhbHJlYWR5IGhhcyBpbml0aWF0ZWQgcmVkZW1wdGlvbiB0aGF0IGlzIG5vdCB3aXRoZHJhd24geWV0LgMJAQAAAAlpc0RlZmluZWQAAAABCQAEGgAAAAIFAAAABHRoaXMFAAAAHHBvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3RLZXkJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAMFBvb2wgbWFrZXIgaGFzIGFscmVhZHkgaW5pdGlhdGVkIHJlZGVtcHRpb24gZm9yIAkAAaQAAAABBQAAAAZoZWlnaHQCAAAAByBoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtnZXRQb29sVG90YWxMb2NrZWRBbW91bnRLZXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIJAABkAAAAAgUAAAAPcG9vbFRvdGFsTG9ja2VkBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAB1nZXRBc3NldEN1cnJyZW50UG9vbEFtb3VudEtleQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgkAAGUAAAACBQAAAA5wb29sQWN0dWFsU2l6ZQUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAANY2FsbGVyQWRkcmVzcwkAAGUAAAACBQAAABVwb29sTWFrZXJBY3R1YWxBbW91bnQFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAccG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAbZ2V0UG9vbE1ha2VyTG9ja2VkQW1vdW50S2V5AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtnZXRQb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAADWNhbGxlckFkZHJlc3MFAAAADndpdGhkcmF3SGVpZ2h0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAAGSVzJXNfdHJhY2VfcmVkZWVtRnJvbVBvb2wFAAAACXRyYWNlRGF0YQUAAAADbmlsAAAAAWkBAAAAG2dldE1heEFsbG93ZWRBbW91bnRUb1JlZGVlbQAAAAIAAAAJYXNzZXRDb2RlAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAC3JlZGVlbVR1cGxlCQEAAAAZY2FsY0FsbG93ZWRBbW91bnRUb1JlZGVlbQAAAAIFAAAACWFzc2V0Q29kZQUAAAAQcG9vbE1ha2VyQWRkcmVzcwQAAAAPYXNzZXRBZGRyZXNzU3RyCAUAAAALcmVkZWVtVHVwbGUAAAACXzEEAAAAFWFsbG93ZWRBbW91bnRUb1JlZGVlbQgFAAAAC3JlZGVlbVR1cGxlAAAAAl8yBAAAAA9wb29sVG90YWxMb2NrZWQIBQAAAAtyZWRlZW1UdXBsZQAAAAJfMwQAAAAOcG9vbEFjdHVhbFNpemUIBQAAAAtyZWRlZW1UdXBsZQAAAAJfNAQAAAAVcG9vbE1ha2VyQWN0dWFsQW1vdW50CAUAAAALcmVkZWVtVHVwbGUAAAACXzUEAAAADndpdGhkcmF3SGVpZ2h0CAUAAAALcmVkZWVtVHVwbGUAAAACXzYEAAAAFXBvb2xNYWtlckxvY2tlZEFtb3VudAgFAAAAC3JlZGVlbVR1cGxlAAAAAl83BAAAAAl0cmFjZURhdGEIBQAAAAtyZWRlZW1UdXBsZQAAAAJfOAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAF7AgAAABdhbGxvd2VkQW1vdW50VG9SZWRlZW06IAkAAaQAAAABBQAAABVhbGxvd2VkQW1vdW50VG9SZWRlZW0CAAAADSwgYXNzZXRDb2RlOiAFAAAACWFzc2V0Q29kZQIAAAANLCBwb29sTWFrZXI6IAUAAAAQcG9vbE1ha2VyQWRkcmVzcwIAAAAJLCB0cmFjZTogBQAAAAl0cmFjZURhdGECAAAAAX0AAAABaQEAAAAId2l0aGRyYXcAAAACAAAACWFzc2V0Q29kZQAAABBwb29sTWFrZXJBZGRyZXNzBAAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABtnZXRBc3NldEFkZHJlc3NCeUNvZGVPckZhaWwAAAABBQAAAAlhc3NldENvZGUEAAAADGFzc2V0QWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAABhwb29sTWFrZXJMb2NrZWRBbW91bnRLZXkJAQAAABtnZXRQb29sTWFrZXJMb2NrZWRBbW91bnRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAGXJlZ2lzdGVyZWRBbW91bnQ0V2l0aGRyYXcJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAYcG9vbE1ha2VyTG9ja2VkQW1vdW50S2V5AAAAAAAAAAAABAAAABhwb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkJAQAAABtnZXRQb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAADndpdGhkcmF3SGVpZ2h0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGHBvb2xNYWtlclVubG9ja0hlaWdodEtleQAAAAAAAAAAAAQAAAAYcG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5CQEAAAAbZ2V0UG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAAA9wb29sVG90YWxMb2NrZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAYcG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5AAAAAAAAAAAABAAAABxwb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5CQEAAAAfZ2V0UG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQAAAAMFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAQcG9vbE1ha2VyQWRkcmVzcwUAAAAOd2l0aGRyYXdIZWlnaHQDCQAAAAAAAAIJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAABBpc0luaXRpYWxpemVkS2V5BwkAAAIAAAABAgAAABpDb250cmFjdCBpcyBub3QgeWV0IHJlYWR5LgMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQaAAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAABxwb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5CQAAAgAAAAECAAAAM05lZWQgdG8gdHJhbnNmZXIgbGlxdWlkaXR5IGZyb20gYXNzZXQgYWNjb3VudCBmaXJzdAMJAABnAAAAAgAAAAAAAAAAAAUAAAAZcmVnaXN0ZXJlZEFtb3VudDRXaXRoZHJhdwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAiQ2Fubm90IGZpbmQgcG9vbCBtYWtlciBieSBhZGRyZXNzIAUAAAAQcG9vbE1ha2VyQWRkcmVzcwIAAAAVIG9yIG5vIGxvY2tlZCBhbW91bnQuAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAADndpdGhkcmF3SGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAxQbGVhc2Ugd2FpdCAJAAGkAAAAAQUAAAAOd2l0aGRyYXdIZWlnaHQCAAAAESBiZWZvcmUgd2l0aGRyYXcuCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABhwb29sTWFrZXJMb2NrZWRBbW91bnRLZXkAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGHBvb2xUb3RhbExvY2tlZEFtb3VudEtleQkAAGUAAAACBQAAAA9wb29sVG90YWxMb2NrZWQFAAAAGXJlZ2lzdGVyZWRBbW91bnQ0V2l0aGRyYXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGHBvb2xNYWtlclVubG9ja0hlaWdodEtleQAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAABBwb29sTWFrZXJBZGRyZXNzBQAAABlyZWdpc3RlcmVkQW1vdW50NFdpdGhkcmF3BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAAAAAAookL3", "chainId": 84, "height": 1248989, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DTGk32BBivkGKQFqVUq6XgxmZeQdfNtG6Bp3RviDtDzo Next: 7vKjHAJwjLZqV8nCqm1nxqjLTUqeMDfMnFTMViWq9Z8H Diff:
OldNewDifferences
474474
475475
476476 @Callable(i)
477-func withdraw (assetCode) = {
478- let callerAddress = toString(i.caller)
477+func withdraw (assetCode,poolMakerAddress) = {
479478 let assetAddressStr = getAssetAddressByCodeOrFail(assetCode)
480479 let assetAddress = addressFromStringValue(assetAddressStr)
481- let poolMakerLockedAmountKey = getPoolMakerLockedAmountKey(assetAddressStr, callerAddress)
480+ let poolMakerLockedAmountKey = getPoolMakerLockedAmountKey(assetAddressStr, poolMakerAddress)
482481 let registeredAmount4Withdraw = valueOrElse(getInteger(this, poolMakerLockedAmountKey), 0)
483- let poolMakerUnlockHeightKey = getPoolMakerUnlockHeightKey(assetAddressStr, callerAddress)
482+ let poolMakerUnlockHeightKey = getPoolMakerUnlockHeightKey(assetAddressStr, poolMakerAddress)
484483 let withdrawHeight = valueOrElse(getInteger(this, poolMakerUnlockHeightKey), 0)
485484 let poolTotalLockedAmountKey = getPoolTotalLockedAmountKey(assetAddressStr)
486485 let poolTotalLocked = valueOrElse(getInteger(this, poolTotalLockedAmountKey), 0)
487- let poolMakerLiquidityRequestKey = getPoolMakerLiquidityRequestKey(assetAddressStr, callerAddress, withdrawHeight)
486+ let poolMakerLiquidityRequestKey = getPoolMakerLiquidityRequestKey(assetAddressStr, poolMakerAddress, withdrawHeight)
488487 if ((getBoolByKey(isInitializedKey) == false))
489488 then throw("Contract is not yet ready.")
490489 else if (!(isDefined(getInteger(assetAddress, poolMakerLiquidityRequestKey))))
491490 then throw("Need to transfer liquidity from asset account first")
492491 else if ((0 >= registeredAmount4Withdraw))
493- then throw((("Cannot find pool maker by address " + callerAddress) + " or no locked amount."))
492+ then throw((("Cannot find pool maker by address " + poolMakerAddress) + " or no locked amount."))
494493 else if ((height > withdrawHeight))
495494 then throw((("Please wait " + toString(withdrawHeight)) + " before withdraw."))
496- else [IntegerEntry(poolMakerLockedAmountKey, 0), IntegerEntry(poolTotalLockedAmountKey, (poolTotalLocked - registeredAmount4Withdraw)), IntegerEntry(poolMakerUnlockHeightKey, 0), ScriptTransfer(addressFromStringValue(callerAddress), registeredAmount4Withdraw, neutrinoAssetId)]
495+ else [IntegerEntry(poolMakerLockedAmountKey, 0), IntegerEntry(poolTotalLockedAmountKey, (poolTotalLocked - registeredAmount4Withdraw)), IntegerEntry(poolMakerUnlockHeightKey, 0), ScriptTransfer(addressFromStringValue(poolMakerAddress), registeredAmount4Withdraw, neutrinoAssetId)]
497496 }
498497
499498
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func convertJsonArrayToList (jsonArray,splitSymbol) = split(jsonArray, splitSymbol)
55
66
77 func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
88
99
1010 func getBoolByKey (key) = valueOrElse(getBoolean(this, key), false)
1111
1212
1313 let SEP = "__"
1414
1515 let keyAssetCode = 1
1616
1717 let keyAssetId = 2
1818
1919 let keyAssetStatus = 3
2020
2121 let keyAssetPriceDecimals = 4
2222
2323 let keyAssetBakingAsset = 5
2424
2525 let keyOvercollateralPercentage = 6
2626
2727 let keyMinPool = 7
2828
2929 let keyPriceOracleAddress = 8
3030
3131 let keyMinBuyPayment = 9
3232
3333 let keyMinSellPayment = 10
3434
3535 let keyBuyLockInterval = 11
3636
3737 let keySellLockInterval = 12
3838
3939 let keyBuyFee = 13
4040
4141 let keySellFee = 14
4242
4343 let keyPoolRedemptionTimeout = 15
4444
4545 let keyWeekendsPriceChangeCoefficient = 16
4646
4747 let adminPublicKey = "G1Ebu5AMHaTJFEbZNkZQcJFUQ9KfiYUwupyLG857DcFr"
4848
4949 let neutrinoContractAddressKey = "%s%s__commonConfig__neutrinoContractAddress"
5050
5151 let neutrinoStakingAddressKey = "%s%s__commonConfig__neutrinoStakingAddress"
5252
5353 let minimunPoolFundingAmountKey = "%s%s__commonConfig__minimumPoolFundingAmount"
5454
5555 let isInitializedKey = "%s%s__commonConfig__initialized"
5656
5757 let currentAssetIndexKey = "%s%s__commonConfig__predefinedAssetsActiveIndex"
5858
5959 let assetsAddressListKey = "%s%s__commonConfig__predefinedAssetsList"
6060
6161 let debtTokenIdKey = "%s%s__commonConfig__debtAssetId"
6262
6363 let debtTokenEtalonBalanceKey = "%s%s__commonConfig__debtAssetEtalonBalance"
6464
6565 let defoStakingAddressKey = "%s%s__commonConfig__defoStakingAddress"
6666
6767 let defoStakingPacemakerPubKey = "%s%s__commonConfig__defoStakingPacemakerPub"
6868
6969 let minPoolInvestAmountKey = "%s%s__commonConfig__minPoolInvestAmount"
7070
7171 let neutrinoAssetIdKey = "neutrino_asset_id"
7272
7373 let nsbtAssetIdKey = "bond_asset_id"
7474
7575 let neutrinoRpdKey = "rpd_contract"
7676
7777 let defoAssetIdKey = "%s__defoAssetId"
7878
7979 let setAssetScriptTxIdKey = "%s__assetScriptTxId"
8080
8181 func getAssetConfigKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__config")
8282
8383
8484 func getAssetPriceKey (assetCode) = ("%s%s__price__" + assetCode)
8585
8686
8787 func getAssetInitHeightKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__initHeight")
8888
8989
9090 func getAssetActivateHeightKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__activateHeight")
9191
9292
9393 func getAssetCurrrentPoolAmountKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__currentPool")
9494
9595
9696 func getAssetMaxPoolAmountKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__maxPool")
9797
9898
9999 func getAssetMetaKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__meta")
100100
101101
102102 func getAssetPoolMakersKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__poolMakers")
103103
104104
105105 func getAssetAddressByCodeKey (assetCode) = (("%s%s%s__defoAsset__" + assetCode) + "__addressByAssetCode")
106106
107107
108108 func getAssetAddressByAssetIdKey (assetId) = (("%s%s%s__defoAsset__" + assetId) + "__addressByAssetId")
109109
110110
111111 func getPoolMakerParticipationAmountKey (assetAddress,poolMakerAddress) = makeString(["%s%s%s%s__pool", assetAddress, poolMakerAddress, "amount"], SEP)
112112
113113
114114 func getPoolMakerParticipationMaxAmountKey (assetAddress,poolMakerAddress) = makeString(["%s%s%s%s__pool", assetAddress, poolMakerAddress, "maxAmount"], SEP)
115115
116116
117117 func getPoolMakerLockedAmountKey (assetAddress,poolMakerAddress) = makeString(["%s%s%s%s__pool", assetAddress, poolMakerAddress, "lockedAmount"], SEP)
118118
119119
120120 func getPoolMakerUnlockHeightKey (assetAddress,poolMakerAddress) = makeString(["%s%s%s%s__pool", assetAddress, poolMakerAddress, "unlockHeight"], SEP)
121121
122122
123123 func getPoolMakerLiquidityRequestKey (assetAddress,poolMakerAddress,h) = makeString(["%s%s%s%d%s__pool", assetAddress, poolMakerAddress, toString(h), "liquidityRequest"], SEP)
124124
125125
126126 func getPoolTotalLockedAmountKey (assetAddress) = makeString(["%s%s%s__pool", assetAddress, "totalLockedAmount"], SEP)
127127
128128
129129 func getAssetConfigArray (assetAddress) = convertJsonArrayToList(valueOrErrorMessage(getStringByAddressAndKey(this, getAssetConfigKey(assetAddress)), (("No DEFO Asset " + assetAddress) + "config present")), "__")
130130
131131
132132 let multiplicator = 1000000
133133
134134 let neutrinoContract = addressFromStringValue(valueOrErrorMessage(getString(this, neutrinoContractAddressKey), "No neutrino contract specified."))
135135
136136 let neutrinoAssetIdStr = valueOrErrorMessage(getString(neutrinoContract, neutrinoAssetIdKey), "No USDN asset id found.")
137137
138138 let neutrinoAssetId = fromBase58String(neutrinoAssetIdStr)
139139
140140 let nsbtAssetId = fromBase58String(valueOrErrorMessage(getString(neutrinoContract, nsbtAssetIdKey), "No NSBT asset id found"))
141141
142142 let minimumPoolFunding = valueOrErrorMessage(getInteger(this, minimunPoolFundingAmountKey), "Minimum pool funding amount is not specified.")
143143
144144 let minPoolInvestAmount = valueOrElse(getInteger(this, minPoolInvestAmountKey), (10 * multiplicator))
145145
146146 let ASSEtPROPOSED = "PROPOSED"
147147
148148 let ASSEtREADY = "READY"
149149
150150 let ASSEtISSUED = "ISSUED"
151151
152152 let assetStatus = $Tuple3(ASSEtPROPOSED, ASSEtREADY, ASSEtISSUED)
153153
154154 let predefinedAssetContracts = valueOrErrorMessage(getString(this, assetsAddressListKey), "No pool of predeployed asset contracts found.")
155155
156156 let predefinedAssetsList = convertJsonArrayToList(predefinedAssetContracts, ",")
157157
158158 let currentAssetIndex = valueOrElse(getInteger(this, currentAssetIndexKey), 0)
159159
160160 let debtToken = fromBase58String(valueOrErrorMessage(getString(this, debtTokenIdKey), "No debt token found"))
161161
162162 let debtTokenReissueAmount = valueOrElse(getInteger(this, debtTokenEtalonBalanceKey), 0)
163163
164164 let neutrinoRpdContract = addressFromStringValue(getStringValue(neutrinoContract, neutrinoRpdKey))
165165
166166 func getNeutrinoRpdBalance (userAddress) = {
167167 let userNeutrinoRpdBalance = makeString(["rpd_balance", neutrinoAssetIdStr, userAddress], "_")
168168 valueOrElse(getInteger(neutrinoRpdContract, userNeutrinoRpdBalance), 0)
169169 }
170170
171171
172172 func getAssetAddressByCode (assetSymbol) = valueOrElse(getString(this, getAssetAddressByCodeKey(assetSymbol)), "")
173173
174174
175175 func getAssetAddressByCodeOrFail (assetSymbol) = valueOrErrorMessage(getString(this, getAssetAddressByCodeKey(assetSymbol)), (("Cannot find asset address by " + assetSymbol) + " code"))
176176
177177
178178 func getAssetCode (assetConfig) = assetConfig[keyAssetCode]
179179
180180
181181 func getAssetID (assetConfig) = assetConfig[keyAssetId]
182182
183183
184184 func getAssetStatus (assetConfig) = assetConfig[keyAssetStatus]
185185
186186
187187 func getAssetPriceDecimals (assetConfig) = parseIntValue(assetConfig[keyAssetPriceDecimals])
188188
189189
190190 func getAssetBakingAssetId (assetConfig) = assetConfig[keyAssetBakingAsset]
191191
192192
193193 func getAssetOverCollateralPercent (assetConfig) = parseIntValue(assetConfig[keyOvercollateralPercentage])
194194
195195
196196 func getAssetMinRequiredPoolAmount (assetConfig) = parseIntValue(assetConfig[keyMinPool])
197197
198198
199199 func getAssetPriceOracleAddress (assetConfig) = assetConfig[keyPriceOracleAddress]
200200
201201
202202 func getMinBuyPaymentPerAsset (assetConfig) = parseIntValue(assetConfig[keyMinBuyPayment])
203203
204204
205205 func getMinSellPaymentPerAsset (assetConfig) = parseIntValue(assetConfig[keyMinSellPayment])
206206
207207
208208 func getBuyLockIntervalPerAsset (assetConfig) = parseIntValue(assetConfig[keyBuyLockInterval])
209209
210210
211211 func getSellLockIntervalPerAsset (assetConfig) = parseIntValue(assetConfig[keySellLockInterval])
212212
213213
214214 func getBuyFeePerAsset (assetConfig) = parseIntValue(assetConfig[keyBuyFee])
215215
216216
217217 func getSellFeePerAsset (assetConfig) = parseIntValue(assetConfig[keySellFee])
218218
219219
220220 func getRedemptionTimeoutBlocks (assetConfig) = parseIntValue(assetConfig[keyPoolRedemptionTimeout])
221221
222222
223223 func getWeekendsPriceChangeCoefficient (assetConfig) = parseIntValue(assetConfig[keyWeekendsPriceChangeCoefficient])
224224
225225
226226 func getAssetPoolMakers (assetAddress) = valueOrElse(getString(this, getAssetPoolMakersKey(assetAddress)), "")
227227
228228
229229 func getAssetInitHeight (assetAddress) = valueOrElse(getInteger(this, getAssetInitHeightKey(assetAddress)), 0)
230230
231231
232232 func getAssetActivateHeight (assetAddress) = valueOrElse(getInteger(this, getAssetActivateHeightKey(assetAddress)), 0)
233233
234234
235235 func getAssetCurrentPoolAmount (assetAddress) = valueOrElse(getInteger(this, getAssetCurrrentPoolAmountKey(assetAddress)), 0)
236236
237237
238238 func getAssetMaxPoolAmount (assetAddress) = valueOrElse(getInteger(this, getAssetMaxPoolAmountKey(assetAddress)), 0)
239239
240240
241241 func getAssetMeta (assetAddress) = valueOrElse(getString(this, getAssetMetaKey(assetAddress)), "")
242242
243243
244244 func getPoolMakerParticipationAmount (assetAddress,poolMakerAddress) = valueOrElse(getInteger(this, getPoolMakerParticipationAmountKey(assetAddress, poolMakerAddress)), 0)
245245
246246
247247 func getPoolMakerParticipationMaxAmount (assetAddress,poolMakerAddress) = valueOrElse(getInteger(this, getPoolMakerParticipationMaxAmountKey(assetAddress, poolMakerAddress)), 0)
248248
249249
250250 func getPoolMakerLockedAmount (assetAddress,poolMakerAddress) = valueOrElse(getInteger(this, getPoolMakerLockedAmountKey(assetAddress, poolMakerAddress)), 0)
251251
252252
253253 func getPoolMakerUnlockHeight (assetAddress,poolMakerAddress) = valueOrElse(getInteger(this, getPoolMakerUnlockHeightKey(assetAddress, poolMakerAddress)), 0)
254254
255255
256256 func getAssetPrice (priceOracleAddress,assetCode) = valueOrErrorMessage(getInteger(priceOracleAddress, getAssetPriceKey(assetCode)), "No Asset price found")
257257
258258
259259 func getPoolTotalLockedAmount (assetAddress) = valueOrElse(getInteger(this, getPoolTotalLockedAmountKey(assetAddress)), 0)
260260
261261
262262 func composeAssetConfigurationString (assetCode,assetId,assetStatus,priceDecimals,backingAssetId,overCollateralPercent,minPool,priceOracleAddress,minBuyPayment,minSellPayment,buyLockInterval,sellLockInterval,buyFee,sellFee,poolRedemptionTimeout,weekendsPriceChangeCoefficient) = makeString(["%s%s%s%d%s%d%d%s%d%d%d%d%d%d%d", assetCode, assetId, assetStatus, toString(priceDecimals), backingAssetId, toString(overCollateralPercent), toString(minPool), priceOracleAddress, toString(minBuyPayment), toString(minSellPayment), toString(buyLockInterval), toString(sellLockInterval), toString(buyFee), toString(sellFee), toString(poolRedemptionTimeout), toString(weekendsPriceChangeCoefficient)], "__")
263263
264264
265265 func updateAssetCfgStatus (newStatus,assetConfigurationList) = {
266266 let aCode = getAssetCode(assetConfigurationList)
267267 let aID = getAssetID(assetConfigurationList)
268268 let aPriceDecimals = getAssetPriceDecimals(assetConfigurationList)
269269 let aBakingAssetId = getAssetBakingAssetId(assetConfigurationList)
270270 let aOverCollateralPercent = getAssetOverCollateralPercent(assetConfigurationList)
271271 let aMinRequiredPool = getAssetMinRequiredPoolAmount(assetConfigurationList)
272272 let aPriceOracleAddress = getAssetPriceOracleAddress(assetConfigurationList)
273273 let aMinBuyPayment = getMinBuyPaymentPerAsset(assetConfigurationList)
274274 let aMinSellPayment = getMinSellPaymentPerAsset(assetConfigurationList)
275275 let aBuyLockInterval = getBuyLockIntervalPerAsset(assetConfigurationList)
276276 let aSellLockInterval = getSellLockIntervalPerAsset(assetConfigurationList)
277277 let aBuyFee = getBuyFeePerAsset(assetConfigurationList)
278278 let aSellFee = getSellFeePerAsset(assetConfigurationList)
279279 let aRedemptionTimeoutBlocks = getRedemptionTimeoutBlocks(assetConfigurationList)
280280 let weekendsPriceChangeCoefficient = getWeekendsPriceChangeCoefficient(assetConfigurationList)
281281 composeAssetConfigurationString(aCode, aID, newStatus, aPriceDecimals, aBakingAssetId, aOverCollateralPercent, aMinRequiredPool, aPriceOracleAddress, aMinBuyPayment, aMinSellPayment, aBuyLockInterval, aSellLockInterval, aBuyFee, aSellFee, aRedemptionTimeoutBlocks, weekendsPriceChangeCoefficient)
282282 }
283283
284284
285285 func calcAllowedAmountToRedeem (assetCode,poolMakerAddress) = {
286286 let assetAddressStr = getAssetAddressByCodeOrFail(assetCode)
287287 let assetAddress = addressFromStringValue(assetAddressStr)
288288 let assetConfigurationList = getAssetConfigArray(assetAddressStr)
289289 let assetIdStr = getAssetID(assetConfigurationList)
290290 let assetId = fromBase58String(assetIdStr)
291291 let poolActualSize = valueOrElse(getInteger(this, getAssetCurrrentPoolAmountKey(assetAddressStr)), 0)
292292 let poolMaxSize = valueOrElse(getInteger(this, getAssetMaxPoolAmountKey(assetAddressStr)), 0)
293293 let poolTotalLockedAmountKey = getPoolTotalLockedAmountKey(assetAddressStr)
294294 let poolTotalLocked = valueOrElse(getInteger(this, poolTotalLockedAmountKey), 0)
295295 let assetUsdnStakedAmount = getNeutrinoRpdBalance(assetAddressStr)
296296 let assetUsdnBalanceAmount = assetBalance(assetAddress, neutrinoAssetId)
297297 let assetTotalUsdnAmount = ((assetUsdnStakedAmount + assetUsdnBalanceAmount) - poolTotalLocked)
298298 let ucollateral = (assetTotalUsdnAmount - poolActualSize)
299299 let defoAssetBalance = assetBalance(assetAddress, assetId)
300300 let assetEmissionDirty = valueOrErrorMessage(assetInfo(assetId), ("Cannot find asset by id " + assetIdStr)).quantity
301301 let assetEmission = (assetEmissionDirty - defoAssetBalance)
302302 let priceOracleAddress = addressFromStringValue(getAssetPriceOracleAddress(assetConfigurationList))
303303 let currentPrice = getAssetPrice(priceOracleAddress, assetCode)
304304 let priceWithOvercollateralRate = (((multiplicator + getAssetOverCollateralPercent(assetConfigurationList)) * currentPrice) / multiplicator)
305305 let usdnNeededToCoverEmission = fraction(priceWithOvercollateralRate, assetEmission, multiplicator)
306306 let poolMakerMaxAmount = getPoolMakerParticipationMaxAmount(assetAddressStr, poolMakerAddress)
307307 let poolMakerParticipationAmountKey = getPoolMakerParticipationAmountKey(assetAddressStr, poolMakerAddress)
308308 let poolMakerActualAmount = valueOrElse(getInteger(this, poolMakerParticipationAmountKey), 0)
309309 let poolMakerLockedAmount = getPoolMakerLockedAmount(assetAddressStr, poolMakerAddress)
310310 let surplus = (ucollateral - usdnNeededToCoverEmission)
311311 let percentViaActual = fraction(poolMakerActualAmount, multiplicator, poolActualSize)
312312 let percentViaMax = fraction(poolMakerMaxAmount, multiplicator, poolMaxSize)
313313 let frozenPart = if ((surplus >= 0))
314314 then 0
315315 else max([percentViaActual, percentViaMax])
316316 let allowedAmountToRedeem = fraction((multiplicator - frozenPart), poolMakerActualAmount, multiplicator)
317317 let withdrawHeight = (height + getRedemptionTimeoutBlocks(assetConfigurationList))
318318 $Tuple8(assetAddressStr, allowedAmountToRedeem, poolTotalLocked, poolActualSize, poolMakerActualAmount, withdrawHeight, poolMakerLockedAmount, makeString([assetAddressStr, assetIdStr, poolMakerAddress, toString(assetUsdnStakedAmount), toString(assetUsdnBalanceAmount), toString(assetTotalUsdnAmount), toString(poolActualSize), toString(poolMaxSize), toString(ucollateral), toString(assetEmission), toString(currentPrice), toString(priceWithOvercollateralRate), toString(poolMakerMaxAmount), toString(poolMakerActualAmount), toString(poolMakerLockedAmount), toString(surplus), toString(percentViaActual), toString(percentViaMax), toString(frozenPart), toString(allowedAmountToRedeem)], SEP))
319319 }
320320
321321
322322 @Callable(i)
323323 func init (neutrinoContractAddress,neutrinoStakingAddress,minimunPoolFundingAmount,predefinedAssetList,currentAssetIndex,debtEthalonBalance,defoStakingAddress,defoStakingPacemakerPub) = if ((toBase58String(i.callerPublicKey) != adminPublicKey))
324324 then throw("Only Admin can perform contract operation.")
325325 else if ((getBoolByKey(isInitializedKey) == true))
326326 then throw("Contract was already initialized.")
327327 else {
328328 let issueDebt = Issue("DEFO_DEBT", "DEFO Debt Token.", 1, 6, true)
329329 let debtTokenId = calculateAssetId(issueDebt)
330330 [StringEntry(neutrinoContractAddressKey, neutrinoContractAddress), StringEntry(neutrinoStakingAddressKey, neutrinoStakingAddress), IntegerEntry(minimunPoolFundingAmountKey, minimunPoolFundingAmount), StringEntry(assetsAddressListKey, predefinedAssetList), IntegerEntry(currentAssetIndexKey, currentAssetIndex), IntegerEntry(debtTokenEtalonBalanceKey, debtEthalonBalance), StringEntry(debtTokenIdKey, toBase58String(debtTokenId)), StringEntry(defoStakingAddressKey, defoStakingAddress), StringEntry(defoStakingPacemakerPubKey, defoStakingPacemakerPub), BooleanEntry(isInitializedKey, true), issueDebt, Burn(debtTokenId, 1)]
331331 }
332332
333333
334334
335335 @Callable(i)
336336 func proposeAsset (assetCode,meta,minPool,priceOracleAddress,overCollateralPercent,backingAssetId,priceDecimals,minBuyPayment,minSellPayment,buyLockInterval,sellLockInterval,buyFee,sellFee,poolRedemptionTimeout,weekendsPriceChangeCoefficient) = if ((toBase58String(i.callerPublicKey) != adminPublicKey))
337337 then throw("Only Admin can perform contract operation.")
338338 else if ((getBoolByKey(isInitializedKey) == false))
339339 then throw("Contract is not yet ready.")
340340 else if ((fromBase58String(backingAssetId) != neutrinoAssetId))
341341 then throw("Baking asset id could be USDN only.")
342342 else if ((getAssetAddressByCode(assetCode) != ""))
343343 then throw((("Asset with passed code " + assetCode) + " has already been proposed."))
344344 else if ((minimumPoolFunding > minPool))
345345 then throw(("Minimum pool amount should be greater or equals to " + toString(minimumPoolFunding)))
346346 else if (if (if (if (if (if (if (if ((0 > overCollateralPercent))
347347 then true
348348 else (0 > priceDecimals))
349349 then true
350350 else (0 > minBuyPayment))
351351 then true
352352 else (0 > minSellPayment))
353353 then true
354354 else (0 > buyLockInterval))
355355 then true
356356 else (0 > sellLockInterval))
357357 then true
358358 else (0 > buyFee))
359359 then true
360360 else (0 > sellFee))
361361 then throw("One of the passed parameters is invalid.")
362362 else {
363363 let priceOracleAddressValid = valueOrErrorMessage(addressFromStringValue(priceOracleAddress), "Passed Price Oracle Address is not valid.")
364364 let assetAddress = predefinedAssetsList[currentAssetIndex]
365365 let defoAssetId = valueOrErrorMessage(getString(valueOrErrorMessage(addressFromString(assetAddress), ""), defoAssetIdKey), "No defo asset ID found.")
366366 [StringEntry(getAssetConfigKey(assetAddress), composeAssetConfigurationString(assetCode, defoAssetId, assetStatus._1, priceDecimals, backingAssetId, overCollateralPercent, minPool, priceOracleAddress, minBuyPayment, minSellPayment, buyLockInterval, sellLockInterval, buyFee, sellFee, poolRedemptionTimeout, weekendsPriceChangeCoefficient)), StringEntry(getAssetAddressByCodeKey(assetCode), assetAddress), StringEntry(getAssetMetaKey(assetAddress), meta), IntegerEntry(getAssetInitHeightKey(assetAddress), height), IntegerEntry(currentAssetIndexKey, (currentAssetIndex + 1)), StringEntry(getAssetAddressByAssetIdKey(defoAssetId), assetAddress)]
367367 }
368368
369369
370370
371371 @Callable(i)
372372 func fundLiquidityPool (assetCode) = {
373373 let assetAddressStr = getAssetAddressByCodeOrFail(assetCode)
374374 let assetConfigurationList = getAssetConfigArray(assetAddressStr)
375375 let attachedPayment = value(i.payments[0])
376376 let poolMakerAddress = toString(i.caller)
377377 if ((getBoolByKey(isInitializedKey) == false))
378378 then throw("Contract is not yet ready.")
379379 else if ((attachedPayment.assetId != neutrinoAssetId))
380380 then throw("Liquidity pool could be funded with USDN only.")
381381 else if ((minPoolInvestAmount > attachedPayment.amount))
382382 then throw(("Attached payment amount is less tha min allowed: " + toString(minPoolInvestAmount)))
383383 else {
384384 let newCurrentPoolAmount = (attachedPayment.amount + getAssetCurrentPoolAmount(assetAddressStr))
385385 let maxPoolAmount = getAssetMaxPoolAmount(assetAddressStr)
386386 let currentPoolMakerBalance = getPoolMakerParticipationAmount(assetAddressStr, poolMakerAddress)
387387 let maxPoolMakerBalance = getPoolMakerParticipationMaxAmount(assetAddressStr, poolMakerAddress)
388388 let currentAssetStatus = getAssetStatus(assetConfigurationList)
389389 let newAssetStatus = if (if ((currentAssetStatus == ASSEtPROPOSED))
390390 then (newCurrentPoolAmount >= getAssetMinRequiredPoolAmount(assetConfigurationList))
391391 else false)
392392 then ASSEtREADY
393393 else currentAssetStatus
394394 let newPoolMakerBalance = (currentPoolMakerBalance + attachedPayment.amount)
395395 let immediateTransferIfIssued = if ((currentAssetStatus == ASSEtISSUED))
396396 then [ScriptTransfer(addressFromStringValue(assetAddressStr), attachedPayment.amount, neutrinoAssetId)]
397397 else nil
398398 ([IntegerEntry(getPoolMakerParticipationAmountKey(assetAddressStr, poolMakerAddress), newPoolMakerBalance), IntegerEntry(getPoolMakerParticipationMaxAmountKey(assetAddressStr, poolMakerAddress), max([newPoolMakerBalance, maxPoolMakerBalance])), IntegerEntry(getAssetCurrrentPoolAmountKey(assetAddressStr), newCurrentPoolAmount), IntegerEntry(getAssetMaxPoolAmountKey(assetAddressStr), max([maxPoolAmount, newCurrentPoolAmount])), StringEntry(getAssetConfigKey(assetAddressStr), updateAssetCfgStatus(newAssetStatus, assetConfigurationList))] ++ immediateTransferIfIssued)
399399 }
400400 }
401401
402402
403403
404404 @Callable(i)
405405 func activateAsset (assetCode) = {
406406 let assetAddress = getAssetAddressByCode(assetCode)
407407 let assetConfigurationList = getAssetConfigArray(assetAddress)
408408 let assetCurrentPoolAmount = getAssetCurrentPoolAmount(assetAddress)
409409 let aCurrentStatus = getAssetStatus(assetConfigurationList)
410410 if ((toBase58String(i.callerPublicKey) != adminPublicKey))
411411 then throw("Only Admin can perform contract operation.")
412412 else if ((getBoolByKey(isInitializedKey) == false))
413413 then throw("Contract is not yet ready.")
414414 else if ((aCurrentStatus != assetStatus._2))
415415 then throw((("Asset is not in READY status. Current status is " + aCurrentStatus) + "."))
416416 else if ((assetAddress == ""))
417417 then throw((("Cannot find asset " + assetCode) + "."))
418418 else if ((minimumPoolFunding > assetCurrentPoolAmount))
419419 then throw((((("Cannot issue asset as liquidity pool amount (" + toString(assetCurrentPoolAmount)) + ") is less than required (") + toString(minimumPoolFunding)) + ")"))
420420 else {
421421 let issueDebt = Reissue(debtToken, debtTokenReissueAmount, true)
422422 [IntegerEntry(getAssetActivateHeightKey(assetAddress), height), StringEntry(getAssetConfigKey(assetAddress), updateAssetCfgStatus(assetStatus._3, assetConfigurationList)), issueDebt, ScriptTransfer(addressFromStringValue(assetAddress), assetCurrentPoolAmount, neutrinoAssetId), ScriptTransfer(addressFromStringValue(assetAddress), debtTokenReissueAmount, debtToken)]
423423 }
424424 }
425425
426426
427427
428428 @Callable(i)
429429 func redeemFromPool (assetCode,amount) = {
430430 let callerAddress = toString(i.caller)
431431 let redeemTuple = calcAllowedAmountToRedeem(assetCode, callerAddress)
432432 let assetAddressStr = redeemTuple._1
433433 let allowedAmountToRedeem = redeemTuple._2
434434 let poolTotalLocked = redeemTuple._3
435435 let poolActualSize = redeemTuple._4
436436 let poolMakerActualAmount = redeemTuple._5
437437 let withdrawHeight = redeemTuple._6
438438 let poolMakerLockedAmount = redeemTuple._7
439439 let traceData = redeemTuple._8
440440 let poolMakerLiquidityRequestKey = getPoolMakerLiquidityRequestKey(assetAddressStr, callerAddress, withdrawHeight)
441441 if ((getBoolByKey(isInitializedKey) == false))
442442 then throw("Contract is not yet ready.")
443443 else if (if (if ((0 > amount))
444444 then true
445445 else (0 >= poolMakerActualAmount))
446446 then true
447447 else (amount > allowedAmountToRedeem))
448448 then throw((("Cannot find pool maker by address " + callerAddress) + " or amount passed is not correct."))
449449 else if (((1 * multiplicator) > amount))
450450 then throw("Redeem amount is less then min allowed")
451451 else if ((poolMakerLockedAmount > 0))
452452 then throw("Pool maker already has initiated redemption that is not withdrawn yet.")
453453 else if (isDefined(getInteger(this, poolMakerLiquidityRequestKey)))
454454 then throw((("Pool maker has already initiated redemption for " + toString(height)) + " height"))
455455 else [IntegerEntry(getPoolTotalLockedAmountKey(assetAddressStr), (poolTotalLocked + amount)), IntegerEntry(getAssetCurrrentPoolAmountKey(assetAddressStr), (poolActualSize - amount)), IntegerEntry(getPoolMakerParticipationAmountKey(assetAddressStr, callerAddress), (poolMakerActualAmount - amount)), IntegerEntry(poolMakerLiquidityRequestKey, amount), IntegerEntry(getPoolMakerLockedAmountKey(assetAddressStr, callerAddress), amount), IntegerEntry(getPoolMakerUnlockHeightKey(assetAddressStr, callerAddress), withdrawHeight), StringEntry("%s%s_trace_redeemFromPool", traceData)]
456456 }
457457
458458
459459
460460 @Callable(i)
461461 func getMaxAllowedAmountToRedeem (assetCode,poolMakerAddress) = {
462462 let redeemTuple = calcAllowedAmountToRedeem(assetCode, poolMakerAddress)
463463 let assetAddressStr = redeemTuple._1
464464 let allowedAmountToRedeem = redeemTuple._2
465465 let poolTotalLocked = redeemTuple._3
466466 let poolActualSize = redeemTuple._4
467467 let poolMakerActualAmount = redeemTuple._5
468468 let withdrawHeight = redeemTuple._6
469469 let poolMakerLockedAmount = redeemTuple._7
470470 let traceData = redeemTuple._8
471471 throw(((((((((("{" + "allowedAmountToRedeem: ") + toString(allowedAmountToRedeem)) + ", assetCode: ") + assetCode) + ", poolMaker: ") + poolMakerAddress) + ", trace: ") + traceData) + "}"))
472472 }
473473
474474
475475
476476 @Callable(i)
477-func withdraw (assetCode) = {
478- let callerAddress = toString(i.caller)
477+func withdraw (assetCode,poolMakerAddress) = {
479478 let assetAddressStr = getAssetAddressByCodeOrFail(assetCode)
480479 let assetAddress = addressFromStringValue(assetAddressStr)
481- let poolMakerLockedAmountKey = getPoolMakerLockedAmountKey(assetAddressStr, callerAddress)
480+ let poolMakerLockedAmountKey = getPoolMakerLockedAmountKey(assetAddressStr, poolMakerAddress)
482481 let registeredAmount4Withdraw = valueOrElse(getInteger(this, poolMakerLockedAmountKey), 0)
483- let poolMakerUnlockHeightKey = getPoolMakerUnlockHeightKey(assetAddressStr, callerAddress)
482+ let poolMakerUnlockHeightKey = getPoolMakerUnlockHeightKey(assetAddressStr, poolMakerAddress)
484483 let withdrawHeight = valueOrElse(getInteger(this, poolMakerUnlockHeightKey), 0)
485484 let poolTotalLockedAmountKey = getPoolTotalLockedAmountKey(assetAddressStr)
486485 let poolTotalLocked = valueOrElse(getInteger(this, poolTotalLockedAmountKey), 0)
487- let poolMakerLiquidityRequestKey = getPoolMakerLiquidityRequestKey(assetAddressStr, callerAddress, withdrawHeight)
486+ let poolMakerLiquidityRequestKey = getPoolMakerLiquidityRequestKey(assetAddressStr, poolMakerAddress, withdrawHeight)
488487 if ((getBoolByKey(isInitializedKey) == false))
489488 then throw("Contract is not yet ready.")
490489 else if (!(isDefined(getInteger(assetAddress, poolMakerLiquidityRequestKey))))
491490 then throw("Need to transfer liquidity from asset account first")
492491 else if ((0 >= registeredAmount4Withdraw))
493- then throw((("Cannot find pool maker by address " + callerAddress) + " or no locked amount."))
492+ then throw((("Cannot find pool maker by address " + poolMakerAddress) + " or no locked amount."))
494493 else if ((height > withdrawHeight))
495494 then throw((("Please wait " + toString(withdrawHeight)) + " before withdraw."))
496- else [IntegerEntry(poolMakerLockedAmountKey, 0), IntegerEntry(poolTotalLockedAmountKey, (poolTotalLocked - registeredAmount4Withdraw)), IntegerEntry(poolMakerUnlockHeightKey, 0), ScriptTransfer(addressFromStringValue(callerAddress), registeredAmount4Withdraw, neutrinoAssetId)]
495+ else [IntegerEntry(poolMakerLockedAmountKey, 0), IntegerEntry(poolTotalLockedAmountKey, (poolTotalLocked - registeredAmount4Withdraw)), IntegerEntry(poolMakerUnlockHeightKey, 0), ScriptTransfer(addressFromStringValue(poolMakerAddress), registeredAmount4Withdraw, neutrinoAssetId)]
497496 }
498497
499498

github/deemru/w8io/873ac7e 
58.53 ms