tx · B8vJvYsJ28VXeNALv6AxiAaYbAdG7YL6RNst99G9qEAY

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.03200000 Waves

2023.05.30 02:16 [2599919] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "B8vJvYsJ28VXeNALv6AxiAaYbAdG7YL6RNst99G9qEAY", "fee": 3200000, "feeAssetId": null, "timestamp": 1685402188271, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "58sYAjY5o2vb6sLXV8VYt66CKkaZeR6gNBBjxvGtvRd3xm79fJ4Vy9diPgRVyLkMqdRPd7WKH6LoF4cH4qmwaSLh" ], "script": "base64:BgIxCAISBAoCCBgSAwoBCBIECgIRERIECgIRERIDCgEREgQKAgEBEgQKAggIEgUKAwgICFkAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDcAgK3iBAAFTVVMVDgAgMLXLwAGTVVMVDEwAIDIr6AlAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgAUSWR4Q2ZnR292ZXJuYW5jZURhcHAAAwEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EABk5VTVJFUwAGABNGQUNUT1JZTUFYV0FSRUhPVVNFAIDIr6AlABBSRVNPVVJDRVBSSUNFTUlOANW1AgAKTUlOUEFZTUVOVACQTgAOU0VMTE1VTFRJUExJRVIAyAEADUJVWU1VTFRJUExJRVIArAIACkxBTkRQUkVGSVgCBExBTkQACkRVQ0tQUkVGSVgCBERVQ0sADFdITVVMVElQTElFUgCAyK+gJQAKQVVDVElPTkZFRQCQTgAOTUlOU0hPUFBBWU1FTlQAoI0GAAhyZXNUeXBlcwkAzAgCAgNPaWwJAMwIAgIDT3JlCQDMCAICBFdvb2QJAMwIAgIEU2FuZAkAzAgCAgRDbGF5CQDMCAICB09yZ2FuaWMFA25pbAAIbWF0VHlwZXMJAMwIAgIERnVlbAkAzAgCAgVNZXRhbAkAzAgCAgVQbGFuawkAzAgCAgVHbGFzcwkAzAgCAgdQbGFzdGljCQDMCAICB1Byb3RlaW4FA25pbAAJcHJvZFR5cGVzCQDMCAICDUZpcnN0IEFpZCBLaXQJAMwIAgIIQmFja3BhY2sJAMwIAgILRm9vZCBSYXRpb24JAMwIAgIISmV0IFBhY2sJAMwIAgIGU2hpZWxkBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAhIxXzFfMV8yXzJfNV8xXzEwXzAJAMwIAgITMl8yXzJfNF80XzEwXzFfMTBfMAkAzAgCAhMzXzNfM182XzZfMTVfMV8xMF8wCQDMCAICEzJfNV81XzJfN181XzJfMTAwXzEJAMwIAgIXNF8xMF8xMF80XzE0XzEwXzJfMTAwXzEJAMwIAgIXNl8xNV8xNV82XzIxXzE1XzJfMTAwXzEJAMwIAgISMV8xXzFfMV8xXzhfMV8xMF8yCQDMCAICEzJfMl8yXzJfMl8xNl8xXzEwXzIJAMwIAgITM18zXzNfM18zXzI0XzFfMTBfMgkAzAgCAhM5XzlfMV81XzVfMV81XzEwMF8zCQDMCAICFzE4XzE4XzJfMTBfMTBfMl81XzEwMF8zCQDMCAICFzI3XzI3XzNfMTVfMTVfM181XzEwMF8zCQDMCAICEjJfMl8xXzJfMl8yXzFfMTBfNAkAzAgCAhI0XzRfMl80XzRfNF8xXzEwXzQJAMwIAgISNl82XzNfNl82XzZfMV8xMF80BQNuaWwAD2NvbnRJZHhBbWVyaWNhcwAAAA1jb250SWR4RXVyb3BlAAEAC2NvbnRJZHhBc2lhAAIADWNvbnRJZHhBZnJpY2EAAwAOY29udElkeE9jZWFuaWEABAANcmVjaXBlSWR4RnVlbAAAAA5yZWNpcGVJZHhNZXRhbAABAA5yZWNpcGVJZHhQbGFuawACAA5yZWNpcGVJZHhHbGFzcwADABByZWNpcGVJZHhQbGFzdGljAAQAEHJlY2lwZUlkeFByb3RlaW4ABQAPcmVjaXBlSWR4V2VpZ2h0AAYAEXJlY2lwZUlkeFBhY2tzaXplAAcAEnJlY2lwZUlkeENvbnRpbmVudAAIAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCCWZhY3RvcnlJZAdyZXNUeXBlCQCsAgIJAKwCAgkArAICAhtmYWN0b3J5V2hCeUNvbnRpbmVudEFuZFJlc18FCWZhY3RvcnlJZAIBXwkApAMBBQdyZXNUeXBlAQ5rZXlPcmRlckJ5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIKbGFuZE9yZGVyXwULbGFuZEFzc2V0SWQBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBEWtleUJhY2twYWNrQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAgliYWNrUGFja18FC2R1Y2tBc3NldElkAQ9rZXlEdWNrTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDWR1Y2tMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQdhc3NldElkCQCsAgICCW5mdE93bmVyXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgtzdGFrZWRUaW1lXwUHYXNzZXRJZAEPa2V5QWRkcmVzc1JlZkJ5AQRhZGRyCQCsAgICCWFjY1JlZkJ5XwUEYWRkcgAPbG9jSWR4Q29udGluZW50AAAACmxvY0lkeFR5cGUAAQAIbG9jSWR4SWQAAgAKYnBJZHhMZXZlbAAAAAhicElkeFJlcwABAAhicElkeE1hdAACAAlicElkeFByb2QAAwALd2hJZHhMZXZlbHMAAAAId2hJZHhSZXMAAQAId2hJZHhNYXQAAgAJd2hJZHhQcm9kAAMACXdoSWR4TE9GVAAEAAl2b2xMb2NrZWQAAAALdm9sT2NjdXBpZWQAAQAHdm9sRnJlZQACAAh2b2xUb3RhbAADAAlvcmRJZHhSZXMAAAAJb3JkSWR4TWF0AAEACm9yZElkeFByb2QAAgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQhnZXRPcmRlcgEGb3JkS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUGb3JkS2V5AjAwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDowQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDoCAToJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQlvcmRJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQlvcmRJZHhSZXMCFzBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUJb3JkSWR4TWF0AgFfBQZOVU1SRVMJAJEDAgUBcAUJb3JkSWR4TWF0AhcwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMAkAzAgCCQCRAwIFAXAFCm9yZElkeFByb2QFA25pbAEIdG9Wb2x1bWUDBmFtb3VudAdwa2dTaXplCWlzUHJvZHVjdAMFCWlzUHJvZHVjdAQEcGtncwMJAGcCBQZhbW91bnQAAAkAaQIJAGUCCQBkAgUGYW1vdW50BQdwa2dTaXplAAEFB3BrZ1NpemUJAQEtAQkAaQIJAGUCCQBkAgkBAS0BBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkAaAIFBHBrZ3MFBU1VTFQ4BQZhbW91bnQBDHNlbGxJbnRlcm5hbAQFbG9jSWQHcmVzVHlwZQZhbW91bnQIbWluUHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB3Jlc1R5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAnIwAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFAAADCQBmAgkAZAIFAncwBQZhbW91bnQFE0ZBQ1RPUllNQVhXQVJFSE9VU0UJAGUCBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQJ3MAUGYW1vdW50BAx1c2R0UmVjZWl2ZWQJAGQCCQBrAwUCcjAJAGUCCQBoAgUOU0VMTE1VTFRJUExJRVIFEFJFU09VUkNFUFJJQ0VNSU4JAGsDCQBkAgkAaAIAZAUCdzAJAGgCADIFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQZNVUxUMTAJAGsDCQBlAgUGYW1vdW50BQJyMAUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgEBW1pbjk5CQBlAgUIbWluUHJpY2UJAGkCBQhtaW5QcmljZQBkAwkAZgIJAGgCBQVtaW45OQUGYW1vdW50CQBoAgUMdXNkdFJlY2VpdmVkBQVNVUxUOAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQWN0dWFsIHByaWNlID0gCQCkAwEFDHVzZHRSZWNlaXZlZAIDIC8gCQCkAwEFBmFtb3VudAIOIDwgbWluUHJpY2UgPSAJAKQDAQUIbWluUHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCHJlc1R5cGVzBQdyZXNUeXBlAgEpCQCUCgIJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZAIFAncwBQZhbW91bnQFDHVzZHRSZWNlaXZlZAELYnV5SW50ZXJuYWwEBWxvY0lkB21hdFR5cGUGYW1vdW50CG1heFByaWNlBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQdtYXRUeXBlBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABAJtMQMJAGYCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAlwMBCQDMCAIFBmFtb3VudAkAzAgCCQBlAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFA25pbAAABAJtMAkAlwMBCQDMCAIFAncwCQDMCAIJAGUCBQZhbW91bnQFAm0xBQNuaWwEAW0JAGQCBQJtMAUCbTEECXVzZHRTcGVudAkAZAIJAGsDBQJtMAkAZQIJAGgCBQ1CVVlNVUxUSVBMSUVSBRBSRVNPVVJDRVBSSUNFTUlOCQBrAwkAZQIJAGgCAGQFAncwCQBoAgAyBQJtMAUQUkVTT1VSQ0VQUklDRU1JTgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUGTVVMVDEwCQBrAwUCbTEJAGgCAAIFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4BAZtYXgxMDEJAGQCBQhtYXhQcmljZQkAaQIFCG1heFByaWNlAGQDCQBmAgkAaAIFCXVzZHRTcGVudAUFTVVMVDgJAGgCBQZtYXgxMDEFAW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0FjdHVhbCBwcmljZSA9IAkApAMBBQl1c2R0U3BlbnQCAyAvIAkApAMBBQFtAg4gPiBtYXhQcmljZSA9IAkApAMBBQhtYXhQcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIbWF0VHlwZXMFB21hdFR5cGUCASkJAJUKAwkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBlAgUCdzAFAW0FCXVzZHRTcGVudAUBbQELZ2V0QmFja3BhY2sBBWJwS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQVicEtleQIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToJAMwIAgkApAMBCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUBcAUKYnBJZHhMZXZlbAAACQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAXAFCWJwSWR4UHJvZAUDbmlsAQxjaGVja0Jsb2NrZWQAAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9zdGFraW5nQ29udHJhY3QJAQprZXlCbG9ja2VkAAcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlBQR1bml0AQlzZXRDb21tb24CA2FjYwRpdGVtBAFqCAUDYWNjAl8xBAZpc1Byb2QIBQNhY2MCXzgEB3BrZ1NpemUDBQZpc1Byb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUBagIBXwURcmVjaXBlSWR4UGFja3NpemUAAAQJaXRlbVBhcnRzCQC1CQIFBGl0ZW0CAUADCQECIT0CCQCQAwEFCWl0ZW1QYXJ0cwACCQACAQIuSW5jb3JyZWN0IG9yZGVyIGZvcm1hdCwgc2hvdWxkIGJlIGFtb3VudEBwcmljZQQIbmV3T3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAAQIbmV3T3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAQQJbmV3T3JkVXNkCQBrAwUIbmV3T3JkQW0FCG5ld09yZFByBQVNVUxUOAQJbmV3T3JkVm9sCQEIdG9Wb2x1bWUDBQhuZXdPcmRBbQUHcGtnU2l6ZQUGaXNQcm9kBAZ3aEluaXQDCQBmAgkAkAMBCAUDYWNjAl82BQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAggFA2FjYwJfNgUBagAABAtjdXJPcmRQYXJ0cwkAtQkCAwkAZgIJAJADAQgFA2FjYwJfNwUBagkAkQMCCAUDYWNjAl83BQFqAgMwQDACAUAECGN1ck9yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULY3VyT3JkUGFydHMAAAQIY3VyT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwABAwMJAGYCAAAFCGN1ck9yZFByBgkAZgIAAAUIbmV3T3JkUHIJAAIBAhdQcmljZSBjYW4ndCBiZSBuZWdhdGl2ZQQJY3VyT3JkVXNkCQBrAwUIY3VyT3JkQW0FCGN1ck9yZFByBQVNVUxUOAQJY3VyT3JkVm9sCQEIdG9Wb2x1bWUDBQhjdXJPcmRBbQUHcGtnU2l6ZQUGaXNQcm9kAwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAmgoICQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUGd2hJbml0CAUDYWNjAl8zCAUDYWNjAl80CQBlAggFA2FjYwJfNQUJY3VyT3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAJoKCAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFCGN1ck9yZEFtCAUDYWNjAl8zCAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QDCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtCQCaCggJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgUGd2hJbml0BQhjdXJPcmRBbQkAZAIIBQNhY2MCXzMFCW5ld09yZFZvbAgFA2FjYwJfNAkAZAIIBQNhY2MCXzUFCW5ld09yZFVzZAgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQCaCggJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQZ3aEluaXQJAGQCCAUDYWNjAl8zBQluZXdPcmRWb2wIBQNhY2MCXzQJAGUCCQBkAggFA2FjYwJfNQUJbmV3T3JkVXNkBQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGUCBQhjdXJPcmRBbQUIbmV3T3JkQW0DCQBmAgAACQBlAgUGd2hJbml0BQZhbURpZmYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQUGYW1EaWZmAhogZnJvbSB3YXJlaG91c2UsIGJ1dCBvbmx5IAkApAMBBQZ3aEluaXQCCiBhdmFpbGFibGUJAJoKCAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFBmFtRGlmZggFA2FjYwJfMwkAZQIIBQNhY2MCXzQFCW5ld09yZFZvbAgFA2FjYwJfNQgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kAwkAZgIAAAkAZAIFBndoSW5pdAUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQkBAS0BBQhuZXdPcmRBbQIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUGd2hJbml0AgogYXZhaWxhYmxlCQCaCggJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUGd2hJbml0BQhuZXdPcmRBbQgFA2FjYwJfMwkAZQIIBQNhY2MCXzQFCW5ld09yZFZvbAkAZQIIBQNhY2MCXzUFCWN1ck9yZFVzZAgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kAQtzZXRJbnRlcm5hbAMJY3VycmVudFdoCmN1cnJlbnRPcmQGbmV3T3JkBAljdXJyV2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAljdXJyV2hNYXQJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBApjdXJyV2hQcm9kAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgUJY3VycmVu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cnNlSW50VmFsdWUBCQCRAwIFCndoT3JkUGFydHMAAAQHd2hPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCndoT3JkUGFydHMAAQMDCQECIT0CBQdicE9yZEFtAAAJAQIhPQIFB2JwT3JkUHIFB3doT3JkUHIHCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICClByaWNlcyBvZiAJAJEDAggFA2FjYwNfMTEFAWoCFyBkb24ndCBtYXRjaCEgV0ggcHJpY2U9CQCkAwEFB3doT3JkUHICDSwgeW91ciBwcmljZT0JAKQDAQUHYnBPcmRQcgQId2hPcmRVc2QJAGsDBQd3aE9yZEFtBQd3aE9yZFByBQVNVUxUOAQIZGVsdGFWb2wJAQh0b1ZvbHVtZQMFB2JwT3JkQW0FB3BrZ1NpemUFBmlzUHJvZAMJAAACBQdicE9yZEFtAAAJAJ4KDAkAzQgCCAUDYWNjAl8xCQCkAwEFBndoSW5pdAkAzQgCCAUDYWNjAl8yCQCRAwIIBQNhY2MDXzEwBQFqCQDNCAIIBQNhY2MCXzMJAKQDAQUGYnBJbml0CAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82CQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAMJAGYCBQdicE9yZEFtAAADCQBmAgAABQd3aE9yZEFtAwkAZgIFB2JwT3JkQW0JAQEtAQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAKQDAQUHYnBPcmRBbQIEIG9mIAkAkQMCCAUDYWNjA18xMQUBagIbLCBidXQgd2FyZWhvdXNlIG9ubHkgc2VsbHMgCQCkAwEJAQEtAQUHd2hPcmRBbQkAngoMCQDNCAIIBQNhY2MCXzEJAKQDAQUGd2hJbml0CQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwkApAMBCQBkAgUGYnBJbml0BQdicE9yZEFtCQBkAggFA2FjYwJfNAUIZGVsdGFWb2wIBQNhY2MCXzUJAGQCCAUDYWNjAl82BQhicE9yZFVzZAkAZAIIBQNhY2MCXzcAAQgFA2FjYwJfOAgFA2FjYwJfOQgFA2FjYwNfMTAIBQNhY2MDXzExBQZpc1Byb2QJAAIBCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCRAwIIBQNhY2MDXzExBQFqAiAgd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3Qgc2VsbCBpdAMJAGYCBQd3aE9yZEFtAAADCQBmAgkBAS0BBQdicE9yZEFtBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAgQgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhosIGJ1dCB3YXJlaG91c2Ugb25seSBidXlzIAkApAMBBQd3aE9yZEFtAwkAZgIJAQEtAQUHYnBPcmRBbQUGYnBJbml0CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAhQsIGJ1dCB5b3Ugb25seSBoYXZlIAkApAMBBQZicEluaXQCBCBvZiAJAJEDAggFA2FjYwNfMTEFAWoJAJ4KDAkAzQgCCAUDYWNjAl8xCQCkAwEJAGUCBQZ3aEluaXQFB2JwT3JkQW0JAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQZicEluaXQFB2JwT3JkQW0JAGUCCAUDYWNjAl80BQhkZWx0YVZvbAkAZQIIBQNhY2MCXzUFCGJwT3JkVXNkCAUDYWNjAl82CQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAkAAgEJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCRAwIIBQNhY2MDXzExBQFqAh8gd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3QgYnV5IGl0CAFpARpyZWNhbGNMb2NrZWRWb2x1bWVSRUFET05MWQILbGFuZEFzc2V0SWQCd2gECmN1cnJlbnRPcmQJAQhnZXRPcmRlcgEJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBAF6CQELc2V0SW50ZXJuYWwDBQJ3aAUKY3VycmVudE9yZAUKY3VycmVudE9yZAkAlAoCBQNuaWwJAGQCCAUBegJfNAgFAXoCXzUBaQENY29uc3RydWN0b3JWMQEIcmVzdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgUDbmlsAWkBDXNlbGxSZXNvdXJjZXMCB2Ftb3VudHMJbWluUHJpY2VzBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAipzZWxsUmVzb3VyY2VzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB3Jlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8KAQVhZGRlcgIDYWNjAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVzTGlzdAUBagkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglZb3UgaGF2ZSAJAJEDAgUHcmVzTGlzdAUBagIEIG9mIAkAkQMCBQhyZXNUeXBlcwUBagIULCBidXQgdHJpZWQgdG8gc2VsbCAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIAAAkAkQMCBQdhbW91bnRzBQFqCQACAQkArAICCQCsAgIJAKwCAgIlWW91IHRyaWVkIHRvIHNlbGwgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhyZXNUeXBlcwUBagICOiAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagAABAFiCQEMc2VsbEludGVybmFsBAUFbG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltaW5QcmljZXMFAWoJAJUKAwkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVzTGlzdAUBagkAkQMCBQdhbW91bnRzBQFqCQBkAggFA2FjYwJfMwgFAWICXzIJAJUKAwgFA2FjYwJfMQkAzQgCCAUDYWNjAl8yCQCRAwIFB3Jlc0xpc3QFAWoIBQNhY2MCXzMEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsCQCUCgIJAM0IAggFBm1lcmdlZAJfMQkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCAUGbWVyZ2VkAl8zBQt1c2R0QXNzZXRJZAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGJ1eU1hdGVyaWFscwIHYW1vdW50cwltYXhQcmljZXMEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfCgEIbVVwZGF0ZXICA2FjYwFqAwkAZgIAAAkAkQMCBQdhbW91bnRzBQFqCQACAQkArAICCQCsAgIJAKwCAgIkWW91IHRyaWVkIHRvIGJ1eSBuZWdhdGl2ZSBhbW91bnQgb2YgCQCRAwIFCG1hdFR5cGVzBQFqAgI6IAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqAAAEAWIJAQtidXlJbnRlcm5hbAQFBWxvY0lkBQFqCQCRAwIFB2Ftb3VudHMFAWoJAJEDAgUJbWF4UHJpY2VzBQFqCQCVCgMJAM0IAggFA2FjYwJfMQgFAWICXzEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB21hdExpc3QFAWoIBQFiAl8zCQBkAggFA2FjYwJfMwgFAWICXzIJAJUKAwgFA2FjYwJfMQkAzQgCCAUDYWNjAl8yCQCRAwIFB21hdExpc3QFAWoIBQNhY2MCXzMEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCG1VcGRhdGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwkAZgIIBQZtZXJnZWQCXzMFA2FtdAkAAgEJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAKQDAQUDYW10AgssIHJlcXVpcmVkPQkApAMBCAUGbWVyZ2VkAl8zBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQIBQZtZXJnZWQCXzMAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQIBQZtZXJnZWQCXzMFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIIBQZtZXJnZWQCXzMAZAkAlAoCCQDNCAIJAM4IAggFBm1lcmdlZAJfMQUEcmVzdAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWV4Y2hhbmdlUmVzb3VyY2VzAQdhbW91bnRzBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCWV4Y2hhbmdlcgIDYWNjAWoEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFAWoEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEA2FtagkAkQMCBQdhbW91bnRzBQFqAwkAZgIFA2FtagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCGCwgYnV0IHRyaWVkIHRvIGV4Y2hhbmdlIAkApAMBBQNhbWoDCQBmAgAABQNhbWoJAAIBCQCsAgIJAKwCAgkArAICAilZb3UgdHJpZWQgdG8gZXhjaGFuZ2UgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhyZXNUeXBlcwUBagICOiAJAKQDAQUDYW1qAwkAZgIFA2FtagAACQCWCgQJAM0IAggFA2FjYwJfMQkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoFA2FtagkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBagUDYW1qCQBkAggFA2FjYwJfMwkAawMFA2FtagUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgJAM0IAggFA2FjYwJfNAkBDEludGVnZXJFbnRyeQIFBXdoS2V5BQJ3MAkAlgoECQDNCAIIBQNhY2MCXzEJAJEDAgUHcmVzTGlzdAUBagkAzQgCCAUDYWNjAl8yCQCRAwIFB21hdExpc3QFAWoIBQNhY2MCXzMIBQNhY2MCXzQEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZXhjaGFuZ2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwkAZgIIBQZtZXJnZWQCXzMFA2FtdAkAAgEJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAKQDAQUDYW10AgssIHJlcXVpcmVkPQkApAMBCAUGbWVyZ2VkAl8zBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIIBQZtZXJnZWQCXzECAV8JAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10CAUGbWVyZ2VkAl8zAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10CAUGbWVyZ2VkAl8zBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEEGFjdGl2aXRpZXNBbW91bnQJAGkCCAUGbWVyZ2VkAl8zAGQJAJQKAgkAzQgCCQDOCAIFBHJlc3QIBQZtZXJnZWQCXzQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjcmFmdEdvb2RzAgpwcm9kdWN0SWR4CHF1YW50aXR5BAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEDCQECIT0CBQNhbXQFBU1VTFQ2CQACAQIqZXhhY3RseSAxIFVTRFQgbXVzdCBiZSBhdHRhY2hlZCBhcyBwYXltZW50AwkAZwIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBzaG91bGQgYmUgcG9zaXRpdmUEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBTQkAAgEJAKwCAgIxRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBNYW51ZmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQEY29udAkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8DAwkAZgIAAAUKcHJvZHVjdElkeAYJAGcCBQpwcm9kdWN0SWR4CQCQAwEFEHByb2R1Y3Rpb25NYXRyaXgJAAIBCQCsAgICFFVua25vd24gcHJvZHVjdCBpZHg9CQCkAwEFCnByb2R1Y3RJZHgEBnJlY2lwZQkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgCAV8DCQECIT0CCQCQAwEFBnJlY2lwZQkAZAIFBk5VTVJFUwADCQACAQkArAICAhdGYXRhbDogdW5rbm93biByZWNpcGU6IAkAkQMCBRBwcm9kdWN0aW9uTWF0cml4BQpw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Y2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCHByb2R1Y2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQC5CQIFBm1lcmdlZAIBXwkAzAgCCQC5CQIFBmJwUHJvZAIBXwUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAkAlAoCBQNuaWwFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFzZXRXYXJlaG91c2VPcmRlcgIMY2FyZ29MaXN0U3RyC2xhbmRBc3NldElkBAR1c2VyCAUBaQxvcmlnaW5DYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQGcmVzdWx0AwkBAiE9AgUEdXNlcgUMcmVzdENvbnRyYWN0CQEMY2hlY2tCbG9ja2VkAAcEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwMJAQIhPQIFBHVzZXIFDHJlc3RDb250cmFjdAkBAiE9AgUFb3duZXIFBGFkZHIHCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBApjYXJnb1BhcnRzCQC8CQIFDGNhcmdvTGlzdFN0cgIBOgQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQEbG9mdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUAgFfBAp3aE9jY3VwaWVkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAULdm9sT2NjdXBpZWQEBndoRnJlZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFB3ZvbEZyZWUEBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQECmN1cnJlbnRPcmQJAQhnZXRPcmRlcgEFBm9yZEtleQQBegkBC3NldEludGVybmFsAwUJY3VycmVudFdoBQpjdXJyZW50T3JkBQpjYXJnb1BhcnRzBAtidXlWb2xTYWxkbwgFAXoCXzQEDHNlbGxWb2xTYWxkbwgFAXoCXzUDCQBmAgULYnV5Vm9sU2FsZG8FBndoRnJlZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgITQXR0ZW1wdCB0byByZXNlcnZlIAkApAMBBQtidXlWb2xTYWxkbwIgIHNwYWNlIGZvciBidXkgb3JkZXJzLCBidXQgb25seSAJAKQDAQUGd2hGcmVlAhsgd2FyZWhvdXNlIGVtcHR5IHNwYWNlIGxlZnQDCQBmAgUMc2VsbFZvbFNhbGRvBQp3aE9jY3VwaWVkCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIGxvY2sgCQCkAwEFDHNlbGxWb2xTYWxkbwIhIHNwYWNlIGZvciBzZWxsIG9yZGVycywgYnV0IG9ubHkgCQCkAwEFCndoT2NjdXBpZWQCGSB3YXJlaG91c2Ugc3BhY2Ugb2NjdXBpZWQEBXdoU3RyCQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJALkJAggFAXoCXzECAV8JAMwIAgkAuQkCCAUBegJfMgIBXwkAzAgCCQC5CQIIBQF6Al8zAgFfCQDMCAIJAKQDAQkAZAIFC2J1eVZvbFNhbGRvBQxzZWxsVm9sU2FsZG8FA25pbAIBOgQGd2hTYXZlCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUGd2hTYXZlBQZ3aFNhdmUECHVzZFNhbGRvCAUBegJfNgQHYWN0aW9ucwMJAGYCBQh1c2RTYWxkbwAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEDCQECIT0CBQNhbXQFCHVzZFNhbGRvCQACAQkArAICAhJQYXltZW50IG5lZWRlZCBpcyAJAKQDAQUIdXNkU2FsZG8JAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQxjYXJnb0xpc3RTdHIFA25pbAMJAAACBQh1c2RTYWxkbwAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQUMY2FyZ29MaXN0U3RyBQNuaWwDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUFb3duZXIJAQEtAQUIdXNkU2FsZG8FC3VzZHRBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQUMY2FyZ29MaXN0U3RyBQNuaWwJAJQKAgUHYWN0aW9ucwUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFGFjY2VwdFdhcmVob3VzZU9yZGVyAwpicE9yZGVyU3RyC2xhbmRBc3NldElkC2R1Y2tBc3NldElkBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEEXN0YWtlZER1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQpjYWxsZXJBZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBRFzdGFrZWREdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OBANsb2MJALUJAgkBBXZhbHVlAQULY3VyTG9jYXRpb24CAV8DCQECIT0CCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBTAkAAgEJAKwCAgkArAICAhZEdWNrIGxvY2F0aW9uIHR5cGUgaXMgCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIRLCBidXQgc2hvdWxkIGJlIEwDCQECIT0CBRFzdGFrZWREdWNrQXNzZXRJZAULZHVja0Fzc2V0SWQJAAIBCQCsAgIJAKwCAgkArAICAhRZb3VyIHN0YWtlZCBkdWNrIGlzIAURc3Rha2VkRHVja0Fzc2V0SWQCDSwgYnV0IHBhc3NlZCAFC2R1Y2tBc3NldElkBAlsYW5kQXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQlsYW5kQXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQECWxhbmRPd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFCWxhbmRBc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQAAAgUJbGFuZE93bmVyBQpjYWxsZXJBZGRyCQACAQIeWW91IGNhbm5vdCB0cmFkZSB3aXRoIHlvdXJzZWxmBAxicE9yZGVyUGFydHMJALwJAgUKYnBPcmRlclN0cgIBOgMJAQIhPQIJAJADAQUMYnBPcmRlclBhcnRzAAMJAAIBAjJicE9yZGVyU3RyIHNob3VsZCBjb250YWluIGV4YWN0bHkgMiAnOicgc2VwYXJhdG9ycwQIYnBPcmRSZXMJALUJAgkAkQMCBQxicE9yZGVyUGFydHMAAAIBXwQIYnBPcmRNYXQJALUJAgkAkQMCBQxicE9yZGVyUGFydHMAAQIBXwQJYnBPcmRQcm9kAwkAAAIJAJEDAgUMYnBPcmRlclBhcnRzAAICAAUDbmlsCQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAICAV8DCQECIT0CCQCQAwEFCGJwT3JkUmVzBQZOVU1SRVMJAAIBAiBBbGwgNiByZXNvdXJjZXMgc2hvdWxkIGJlIHBhc3NlZAMJAQIhPQIJAJADAQUIYnBPcmRNYXQFBk5VTVJFUwkAAgECIEFsbCA2IG1hdGVyaWFscyBzaG91bGQgYmUgcGFzc2VkBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAljdXJyV2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAljdXJyV2hNYXQJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBApjdXJyV2hQcm9kAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8ED2N1cnJXaExvY2tlZFZvbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwUJdm9sTG9ja2VkBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQJYnBSZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAlicE1hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECmJwUHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQEBXdoT3JkCQEIZ2V0T3JkZXIBBQZvcmRLZXkECHdoT3JkUmVzCQC1CQIJAJEDAgUFd2hPcmQFCW9yZElkeFJlcwIBXwQId2hPcmRNYXQJALUJAgkAkQMCBQV3aE9yZAUJb3JkSWR4TWF0AgFfBAl3aE9yZFByb2QDCQAAAgkAkQMCBQV3aE9yZAUKb3JkSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQV3aE9yZAUKb3JkSWR4UHJvZAIBXwQBcgoAAiRsBQhicE9yZFJlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJ4KDAUDbmlsBQNuaWwFA25pbAAAAAAAAAAABQlicFJlc0xpc3QFCWN1cnJXaFJlcwUId2hPcmRSZXMFCHJlc1R5cGVzBwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMYWNjZXB0Q29tbW9uAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYw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ZQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFBndoU2F2ZQUGd2hTYXZlBAZicFNhdmUJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQhuZXdCcFN0cgUDbmlsBQNuaWwDCQAAAgUGYnBTYXZlBQZicFNhdmUEB2FjdGlvbnMJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdXaE9yZFN0cgUDbmlsBA11c2RXaDJCcFNhbGRvCAUBcAJfNQQIYWN0aW9uczEDCQBmAgUNdXNkV2gyQnBTYWxkbwAABAt1c2RXaDJCcEZlZQkAawMIBQFwAl81BQpBVUNUSU9ORkVFBQVNVUxUNgQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQpjYWxsZXJBZGRyBAVyZWZCeQkAnQgCBQ9zdGFraW5nQ29udHJhY3QFCHJlZkJ5S2V5AwkBCWlzRGVmaW5lZAEFBXJlZkJ5CQDNCAIJAM0IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIJAGUCCAUBcAJfNQkAaAIAAwULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFcmVmQnkFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAkAzQgCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAZQIIBQFwAl81CQBoAgADBQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkBQdhY3Rpb25zBA11c2RCcDJXaFNhbGRvCAUBcAJfNgMJAGYCBQ11c2RCcDJXaFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUNdXNkQnAyV2hTYWxkbwkAAgEJAKwCAgISUGF5bWVudCBuZWVkZWQgaXMgCQCkAwEFDXVzZEJwMldoU2FsZG8DCQBmAgUOTUlOU0hPUFBBWU1FTlQFA2FtdAkAAgEJAKwCAgIbUGF5bWVudCBzaG91bGQgYmUgYXQgbGVhc3QgCQCkAwEFDk1JTlNIT1BQQVlNRU5UBAt1c2RCcDJXaEZlZQkAawMIBQFwAl82BQpBVUNUSU9ORkVFBQVNVUxUNgQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQlsYW5kT3duZXIEBXJlZkJ5CQCdCAIFD3N0YWtpbmdDb250cmFjdAUIcmVmQnlLZXkDCQEJaXNEZWZpbmVkAQUFcmVmQnkJAM0IAgkAzQgCCQDNCAIFCGFjdGlvbnMxCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlsYW5kT3duZXIJAGUCCAUBcAJfNgkAaAIAAwULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFcmVmQnkFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAkAzQgCCQDNCAIFCGFjdGlvbnMxCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlsYW5kT3duZXIJAGUCCAUBcAJfNgkAaAIAAwULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAUIYWN0aW9uczEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4A9Z4Hvg==", "height": 2599919, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Fpuy5PgkmwqLJ9QXA5m2BBySV8TBEGSQEJhH2EFnvYXp Next: 3wQ8pjGoxB995d3EYL98dkcif5V53i2GoLKQSw62f6sH Diff:
OldNewDifferences
216216 else amount
217217
218218
219-func getWarehouseTotalVolume (volPrefix) = {
220- let parts = split(volPrefix, "_")
221- ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
222- }
223-
224-
225-func getWarehouseCurrGoodsVolume (currentWh) = {
226- let goods = currentWh[whIdxProd]
227- if ((goods == ""))
228- then 0
229- else {
230- func sum (acc,item) = {
231- let idx = acc._1
232- let pkgSize = parseIntValue(split(productionMatrix[idx], "_")[recipeIdxPacksize])
233- $Tuple2((idx + 1), (acc._2 + toVolume(parseIntValue(item), pkgSize, true)))
234- }
235-
236-( let $l = split_4C(goods, "_")
237- let $s = size($l)
238- let $acc0 = $Tuple2(0, 0)
239- func $f0_1 ($a,$i) = if (($i >= $s))
240- then $a
241- else sum($a, $l[$i])
242-
243- func $f0_2 ($a,$i) = if (($i >= $s))
244- then $a
245- else throw("List size exceeds 50")
246-
247- $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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._2
248- }
249- }
250-
251-
252219 func sellInternal (locId,resType,amount,minPrice) = {
253220 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
254221 let w0 = valueOrElse(getInteger(whKey), 0)
348315 }
349316
350317
318+func setInternal (currentWh,currentOrd,newOrd) = {
319+ let currWhRes = split(currentWh[whIdxRes], "_")
320+ let currWhMat = split(currentWh[whIdxMat], "_")
321+ let currWhProd = if ((currentWh[whIdxProd] == ""))
322+ then nil
323+ else split(currentWh[whIdxProd], "_")
324+ let currentOrdRes = split(currentOrd[ordIdxRes], "_")
325+ let currentOrdMat = split(currentOrd[ordIdxMat], "_")
326+ let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
327+ then nil
328+ else split(currentOrd[ordIdxProd], "_")
329+ if ((size(newOrd) != 3))
330+ then throw("cargoListStr should contain exactly 2 ':' separators")
331+ else {
332+ let resParts = split(newOrd[0], "_")
333+ let matParts = split(newOrd[1], "_")
334+ let prodParts = if ((newOrd[2] == ""))
335+ then nil
336+ else split(newOrd[2], "_")
337+ if ((size(resParts) != NUMRES))
338+ then throw("All 6 resources should be passed")
339+ else if ((size(matParts) != NUMRES))
340+ then throw("All 6 materials should be passed")
341+ else {
342+ let r = {
343+ let $l = resParts
344+ let $s = size($l)
345+ let $acc0 = $Tuple8(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false)
346+ func $f0_1 ($a,$i) = if (($i >= $s))
347+ then $a
348+ else setCommon($a, $l[$i])
349+
350+ func $f0_2 ($a,$i) = if (($i >= $s))
351+ then $a
352+ else throw("List size exceeds 6")
353+
354+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
355+ }
356+ let m = {
357+ let $l = matParts
358+ let $s = size($l)
359+ let $acc0 = $Tuple8(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false)
360+ func $f1_1 ($a,$i) = if (($i >= $s))
361+ then $a
362+ else setCommon($a, $l[$i])
363+
364+ func $f1_2 ($a,$i) = if (($i >= $s))
365+ then $a
366+ else throw("List size exceeds 6")
367+
368+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
369+ }
370+ let p = if ((size(prodParts) != 0))
371+ then {
372+ let $l = prodParts
373+ let $s = size($l)
374+ let $acc0 = $Tuple8(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true)
375+ func $f2_1 ($a,$i) = if (($i >= $s))
376+ then $a
377+ else setCommon($a, $l[$i])
378+
379+ func $f2_2 ($a,$i) = if (($i >= $s))
380+ then $a
381+ else throw("List size exceeds 50")
382+
383+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
384+ }
385+ else $Tuple8(0, currWhProd, m._3, m._4, m._5, currWhProd, currentOrdProd, true)
386+ $Tuple6(r._2, m._2, p._2, p._3, p._4, p._5)
387+ }
388+ }
389+ }
390+
391+
351392 func acceptCommon (acc,bpOrdItem) = {
352393 let j = acc._7
353394 let isProd = acc._12
399440 }
400441 }
401442 }
443+
444+
445+@Callable(i)
446+func recalcLockedVolumeREADONLY (landAssetId,wh) = {
447+ let currentOrd = getOrder(keyOrderByLand(landAssetId))
448+ let z = setInternal(wh, currentOrd, currentOrd)
449+ $Tuple2(nil, (z._4 + z._5))
450+ }
451+
402452
403453
404454 @Callable(i)
717767 then throw((LANDPREFIX + " is not yours"))
718768 else {
719769 let cargoParts = split_4C(cargoListStr, ":")
720- if ((size(cargoParts) != 3))
721- then throw("cargoListStr should contain exactly 2 ':' separators")
722- else {
723- let resParts = split(cargoParts[0], "_")
724- let matParts = split(cargoParts[1], "_")
725- let prodParts = if ((cargoParts[2] == ""))
726- then nil
727- else split(cargoParts[2], "_")
728- if ((size(resParts) != NUMRES))
729- then throw("All 6 resources should be passed")
730- else if ((size(matParts) != NUMRES))
731- then throw("All 6 materials should be passed")
732- else {
733- let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
734- let currentWh = split_4C(wh, ":")
735- let currWhRes = split(currentWh[whIdxRes], "_")
736- let currWhMat = split(currentWh[whIdxMat], "_")
737- let currWhProd = if ((currentWh[whIdxProd] == ""))
738- then nil
739- else split(currentWh[whIdxProd], "_")
740- let loft = split(currentWh[whIdxLOFT], "_")
741- let whOccupied = parseIntValue(loft[volOccupied])
742- let whFree = parseIntValue(loft[volFree])
743- let ordKey = keyOrderByLand(landAssetId)
744- let currentOrd = getOrder(ordKey)
745- let currentOrdRes = split(currentOrd[ordIdxRes], "_")
746- let currentOrdMat = split(currentOrd[ordIdxMat], "_")
747- let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
748- then nil
749- else split(currentOrd[ordIdxProd], "_")
750- let usdtNeed2Lock = 0
751- let r = {
752- let $l = resParts
753- let $s = size($l)
754- let $acc0 = $Tuple8(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false)
755- func $f0_1 ($a,$i) = if (($i >= $s))
756- then $a
757- else setCommon($a, $l[$i])
758-
759- func $f0_2 ($a,$i) = if (($i >= $s))
760- then $a
761- else throw("List size exceeds 6")
762-
763- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
764- }
765- let m = {
766- let $l = matParts
767- let $s = size($l)
768- let $acc0 = $Tuple8(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false)
769- func $f1_1 ($a,$i) = if (($i >= $s))
770- then $a
771- else setCommon($a, $l[$i])
772-
773- func $f1_2 ($a,$i) = if (($i >= $s))
774- then $a
775- else throw("List size exceeds 6")
776-
777- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
778- }
779- let p = if ((size(prodParts) != 0))
780- then {
781- let $l = prodParts
782- let $s = size($l)
783- let $acc0 = $Tuple8(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true)
784- func $f2_1 ($a,$i) = if (($i >= $s))
785- then $a
786- else setCommon($a, $l[$i])
787-
788- func $f2_2 ($a,$i) = if (($i >= $s))
789- then $a
790- else throw("List size exceeds 50")
791-
792- $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
793- }
794- else $Tuple8(0, currWhProd, m._3, m._4, m._5, currWhProd, currentOrdProd, true)
795- let buyVolSaldo = p._3
796- let sellVolSaldo = p._4
797- if ((buyVolSaldo > whFree))
798- then throw((((("Attempt to reserve " + toString(buyVolSaldo)) + " space for buy orders, but only ") + toString(whFree)) + " warehouse empty space left"))
799- else if ((sellVolSaldo > whOccupied))
800- then throw((((("Attempt to lock " + toString(sellVolSaldo)) + " space for sell orders, but only ") + toString(whOccupied)) + " warehouse space occupied"))
770+ let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
771+ let currentWh = split_4C(wh, ":")
772+ let loft = split(currentWh[whIdxLOFT], "_")
773+ let whOccupied = parseIntValue(loft[volOccupied])
774+ let whFree = parseIntValue(loft[volFree])
775+ let ordKey = keyOrderByLand(landAssetId)
776+ let currentOrd = getOrder(ordKey)
777+ let z = setInternal(currentWh, currentOrd, cargoParts)
778+ let buyVolSaldo = z._4
779+ let sellVolSaldo = z._5
780+ if ((buyVolSaldo > whFree))
781+ then throw((((("Attempt to reserve " + toString(buyVolSaldo)) + " space for buy orders, but only ") + toString(whFree)) + " warehouse empty space left"))
782+ else if ((sellVolSaldo > whOccupied))
783+ then throw((((("Attempt to lock " + toString(sellVolSaldo)) + " space for sell orders, but only ") + toString(whOccupied)) + " warehouse space occupied"))
784+ else {
785+ let whStr = makeString_2C([currentWh[whIdxLevels], makeString(z._1, "_"), makeString(z._2, "_"), makeString(z._3, "_"), toString((buyVolSaldo + sellVolSaldo))], ":")
786+ let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
787+ if ((whSave == whSave))
788+ then {
789+ let usdSaldo = z._6
790+ let actions = if ((usdSaldo > 0))
791+ then if ((size(i.payments) != 1))
792+ then throw("exactly 1 payment must be attached")
801793 else {
802- let whStr = makeString_2C([currentWh[whIdxLevels], makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_"), toString((buyVolSaldo + sellVolSaldo))], ":")
803- let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
804- if ((whSave == whSave))
805- then {
806- let usdSaldo = p._5
807- let actions = if ((usdSaldo > 0))
808- then if ((size(i.payments) != 1))
809- then throw("exactly 1 payment must be attached")
810- else {
811- let pmt = i.payments[0]
812- let amt = pmt.amount
813- let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
814- if ((pmtAssetId != usdtAssetId))
815- then throw("USDT payments only!")
816- else if ((amt != usdSaldo))
817- then throw(("Payment needed is " + toString(usdSaldo)))
818- else [StringEntry(ordKey, cargoListStr)]
819- }
820- else if ((usdSaldo == 0))
821- then if ((size(i.payments) != 0))
822- then throw("No payments needed")
823- else [StringEntry(ordKey, cargoListStr)]
824- else if ((size(i.payments) != 0))
825- then throw("No payments needed")
826- else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, cargoListStr)]
827- $Tuple2(actions, result)
828- }
829- else throw("Strict value is not equal to itself.")
794+ let pmt = i.payments[0]
795+ let amt = pmt.amount
796+ let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
797+ if ((pmtAssetId != usdtAssetId))
798+ then throw("USDT payments only!")
799+ else if ((amt != usdSaldo))
800+ then throw(("Payment needed is " + toString(usdSaldo)))
801+ else [StringEntry(ordKey, cargoListStr)]
830802 }
803+ else if ((usdSaldo == 0))
804+ then if ((size(i.payments) != 0))
805+ then throw("No payments needed")
806+ else [StringEntry(ordKey, cargoListStr)]
807+ else if ((size(i.payments) != 0))
808+ then throw("No payments needed")
809+ else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, cargoListStr)]
810+ $Tuple2(actions, result)
831811 }
832- }
812+ else throw("Strict value is not equal to itself.")
813+ }
833814 }
834815 }
835816 }
895876 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
896877 then nil
897878 else split(whOrd[ordIdxProd], "_")
898- let usdtNeed2Lock = 0
899879 let r = {
900880 let $l = bpOrdRes
901881 let $s = size($l)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT7 = 10000000
99
1010 let MULT8 = 100000000
1111
1212 let MULT10 = 10000000000
1313
1414 let chain = take(drop(this.bytes, 1), 1)
1515
1616 let usdtAssetId = match chain {
1717 case _ =>
1818 if ((base58'2W' == $match0))
1919 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
2020 else if ((base58'2T' == $match0))
2121 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
2222 else throw("Unknown chain")
2323 }
2424
2525 let defaultRestAddressStr = match chain {
2626 case _ =>
2727 if ((base58'2W' == $match0))
2828 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
2929 else if ((base58'2T' == $match0))
3030 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
3131 else throw("Unknown chain")
3232 }
3333
3434 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
3535
3636
3737 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
3838
3939
4040 let IdxCfgStakingDapp = 1
4141
4242 let IdxCfgEconomyDapp = 2
4343
4444 let IdxCfgGovernanceDapp = 3
4545
4646 func keyRestCfg () = "%s__restConfig"
4747
4848
4949 func keyRestAddress () = "%s__restAddr"
5050
5151
5252 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
5353
5454
5555 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
5656
5757
5858 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
5959
6060 let restCfg = readRestCfgOrFail(restContract)
6161
6262 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
6363
6464 let DEFAULTLOCATION = "Africa_F_Africa"
6565
6666 let NUMRES = 6
6767
6868 let FACTORYMAXWAREHOUSE = 10000000000
6969
7070 let RESOURCEPRICEMIN = 39637
7171
7272 let MINPAYMENT = 10000
7373
7474 let SELLMULTIPLIER = 200
7575
7676 let BUYMULTIPLIER = 300
7777
7878 let LANDPREFIX = "LAND"
7979
8080 let DUCKPREFIX = "DUCK"
8181
8282 let WHMULTIPLIER = 10000000000
8383
8484 let AUCTIONFEE = 10000
8585
8686 let MINSHOPPAYMENT = 100000
8787
8888 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
8989
9090 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
9191
9292 let prodTypes = ["First Aid Kit", "Backpack", "Food Ration", "Jet Pack", "Shield"]
9393
9494 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
9595
9696 let productionMatrix = ["1_1_1_2_2_5_1_10_0", "2_2_2_4_4_10_1_10_0", "3_3_3_6_6_15_1_10_0", "2_5_5_2_7_5_2_100_1", "4_10_10_4_14_10_2_100_1", "6_15_15_6_21_15_2_100_1", "1_1_1_1_1_8_1_10_2", "2_2_2_2_2_16_1_10_2", "3_3_3_3_3_24_1_10_2", "9_9_1_5_5_1_5_100_3", "18_18_2_10_10_2_5_100_3", "27_27_3_15_15_3_5_100_3", "2_2_1_2_2_2_1_10_4", "4_4_2_4_4_4_1_10_4", "6_6_3_6_6_6_1_10_4"]
9797
9898 let contIdxAmericas = 0
9999
100100 let contIdxEurope = 1
101101
102102 let contIdxAsia = 2
103103
104104 let contIdxAfrica = 3
105105
106106 let contIdxOceania = 4
107107
108108 let recipeIdxFuel = 0
109109
110110 let recipeIdxMetal = 1
111111
112112 let recipeIdxPlank = 2
113113
114114 let recipeIdxGlass = 3
115115
116116 let recipeIdxPlastic = 4
117117
118118 let recipeIdxProtein = 5
119119
120120 let recipeIdxWeight = 6
121121
122122 let recipeIdxPacksize = 7
123123
124124 let recipeIdxContinent = 8
125125
126126 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
127127
128128
129129 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
130130
131131
132132 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
133133
134134
135135 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
136136
137137
138138 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
139139
140140
141141 func keyBlocked () = "contractsBlocked"
142142
143143
144144 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
145145
146146
147147 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
148148
149149
150150 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
151151
152152
153153 let locIdxContinent = 0
154154
155155 let locIdxType = 1
156156
157157 let locIdxId = 2
158158
159159 let bpIdxLevel = 0
160160
161161 let bpIdxRes = 1
162162
163163 let bpIdxMat = 2
164164
165165 let bpIdxProd = 3
166166
167167 let whIdxLevels = 0
168168
169169 let whIdxRes = 1
170170
171171 let whIdxMat = 2
172172
173173 let whIdxProd = 3
174174
175175 let whIdxLOFT = 4
176176
177177 let volLocked = 0
178178
179179 let volOccupied = 1
180180
181181 let volFree = 2
182182
183183 let volTotal = 3
184184
185185 let ordIdxRes = 0
186186
187187 let ordIdxMat = 1
188188
189189 let ordIdxProd = 2
190190
191191 func asString (v) = match v {
192192 case s: String =>
193193 s
194194 case _ =>
195195 throw("fail to cast into String")
196196 }
197197
198198
199199 func getOrder (ordKey) = {
200200 let p = split(valueOrElse(getString(ordKey), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"), ":")
201201 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
202202 then p[ordIdxRes]
203203 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
204204 then p[ordIdxMat]
205205 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
206206 }
207207
208208
209209 func toVolume (amount,pkgSize,isProduct) = if (isProduct)
210210 then {
211211 let pkgs = if ((amount >= 0))
212212 then (((amount + pkgSize) - 1) / pkgSize)
213213 else -((((-(amount) + pkgSize) - 1) / pkgSize))
214214 (pkgs * MULT8)
215215 }
216216 else amount
217217
218218
219-func getWarehouseTotalVolume (volPrefix) = {
220- let parts = split(volPrefix, "_")
221- ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
222- }
223-
224-
225-func getWarehouseCurrGoodsVolume (currentWh) = {
226- let goods = currentWh[whIdxProd]
227- if ((goods == ""))
228- then 0
229- else {
230- func sum (acc,item) = {
231- let idx = acc._1
232- let pkgSize = parseIntValue(split(productionMatrix[idx], "_")[recipeIdxPacksize])
233- $Tuple2((idx + 1), (acc._2 + toVolume(parseIntValue(item), pkgSize, true)))
234- }
235-
236-( let $l = split_4C(goods, "_")
237- let $s = size($l)
238- let $acc0 = $Tuple2(0, 0)
239- func $f0_1 ($a,$i) = if (($i >= $s))
240- then $a
241- else sum($a, $l[$i])
242-
243- func $f0_2 ($a,$i) = if (($i >= $s))
244- then $a
245- else throw("List size exceeds 50")
246-
247- $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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._2
248- }
249- }
250-
251-
252219 func sellInternal (locId,resType,amount,minPrice) = {
253220 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
254221 let w0 = valueOrElse(getInteger(whKey), 0)
255222 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
256223 then 0
257224 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
258225 then (FACTORYMAXWAREHOUSE - w0)
259226 else amount
260227 let usdtReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
261228 let min99 = (minPrice - (minPrice / 100))
262229 if (((min99 * amount) > (usdtReceived * MULT8)))
263230 then throw((((((((((("Actual price = " + toString(usdtReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
264231 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdtReceived)
265232 }
266233
267234
268235 func buyInternal (locId,matType,amount,maxPrice) = {
269236 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
270237 let w0 = valueOrElse(getInteger(whKey), 0)
271238 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
272239 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
273240 else 0
274241 let m0 = min([w0, (amount - m1)])
275242 let m = (m0 + m1)
276243 let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
277244 let max101 = (maxPrice + (maxPrice / 100))
278245 if (((usdtSpent * MULT8) > (max101 * m)))
279246 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
280247 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdtSpent, m)
281248 }
282249
283250
284251 func getBackpack (bpKey) = {
285252 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
286253 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
287254 then p[bpIdxRes]
288255 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
289256 then p[bpIdxMat]
290257 else "0_0_0_0_0_0", p[bpIdxProd]]
291258 }
292259
293260
294261 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
295262 then throw("Contracts are under maintenance")
296263 else unit
297264
298265
299266 func setCommon (acc,item) = {
300267 let j = acc._1
301268 let isProd = acc._8
302269 let pkgSize = if (isProd)
303270 then parseIntValue(split(productionMatrix[j], "_")[recipeIdxPacksize])
304271 else 0
305272 let itemParts = split(item, "@")
306273 if ((size(itemParts) != 2))
307274 then throw("Incorrect order format, should be amount@price")
308275 else {
309276 let newOrdAm = parseIntValue(itemParts[0])
310277 let newOrdPr = parseIntValue(itemParts[1])
311278 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
312279 let newOrdVol = toVolume(newOrdAm, pkgSize, isProd)
313280 let whInit = if ((size(acc._6) > j))
314281 then parseIntValue(acc._6[j])
315282 else 0
316283 let curOrdParts = split(if ((size(acc._7) > j))
317284 then acc._7[j]
318285 else "0@0", "@")
319286 let curOrdAm = parseIntValue(curOrdParts[0])
320287 let curOrdPr = parseIntValue(curOrdParts[1])
321288 if (if ((0 > curOrdPr))
322289 then true
323290 else (0 > newOrdPr))
324291 then throw("Price can't be negative")
325292 else {
326293 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
327294 let curOrdVol = toVolume(curOrdAm, pkgSize, isProd)
328295 if ((newOrdAm == 0))
329296 then if ((curOrdAm > 0))
330297 then $Tuple8((j + 1), (acc._2 :+ toString(whInit)), acc._3, acc._4, (acc._5 - curOrdUsd), acc._6, acc._7, isProd)
331298 else $Tuple8((j + 1), (acc._2 :+ toString((whInit - curOrdAm))), acc._3, acc._4, acc._5, acc._6, acc._7, isProd)
332299 else if ((newOrdAm > 0))
333300 then if ((0 > curOrdAm))
334301 then $Tuple8((j + 1), (acc._2 :+ toString((whInit - curOrdAm))), (acc._3 + newOrdVol), acc._4, (acc._5 + newOrdUsd), acc._6, acc._7, isProd)
335302 else $Tuple8((j + 1), (acc._2 :+ toString(whInit)), (acc._3 + newOrdVol), acc._4, ((acc._5 + newOrdUsd) - curOrdUsd), acc._6, acc._7, isProd)
336303 else if ((0 > curOrdAm))
337304 then {
338305 let amDiff = (curOrdAm - newOrdAm)
339306 if ((0 > (whInit - amDiff)))
340307 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whInit)) + " available"))
341308 else $Tuple8((j + 1), (acc._2 :+ toString((whInit - amDiff))), acc._3, (acc._4 - newOrdVol), acc._5, acc._6, acc._7, isProd)
342309 }
343310 else if ((0 > (whInit + newOrdAm)))
344311 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whInit)) + " available"))
345312 else $Tuple8((j + 1), (acc._2 :+ toString((whInit + newOrdAm))), acc._3, (acc._4 - newOrdVol), (acc._5 - curOrdUsd), acc._6, acc._7, isProd)
346313 }
347314 }
348315 }
349316
350317
318+func setInternal (currentWh,currentOrd,newOrd) = {
319+ let currWhRes = split(currentWh[whIdxRes], "_")
320+ let currWhMat = split(currentWh[whIdxMat], "_")
321+ let currWhProd = if ((currentWh[whIdxProd] == ""))
322+ then nil
323+ else split(currentWh[whIdxProd], "_")
324+ let currentOrdRes = split(currentOrd[ordIdxRes], "_")
325+ let currentOrdMat = split(currentOrd[ordIdxMat], "_")
326+ let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
327+ then nil
328+ else split(currentOrd[ordIdxProd], "_")
329+ if ((size(newOrd) != 3))
330+ then throw("cargoListStr should contain exactly 2 ':' separators")
331+ else {
332+ let resParts = split(newOrd[0], "_")
333+ let matParts = split(newOrd[1], "_")
334+ let prodParts = if ((newOrd[2] == ""))
335+ then nil
336+ else split(newOrd[2], "_")
337+ if ((size(resParts) != NUMRES))
338+ then throw("All 6 resources should be passed")
339+ else if ((size(matParts) != NUMRES))
340+ then throw("All 6 materials should be passed")
341+ else {
342+ let r = {
343+ let $l = resParts
344+ let $s = size($l)
345+ let $acc0 = $Tuple8(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false)
346+ func $f0_1 ($a,$i) = if (($i >= $s))
347+ then $a
348+ else setCommon($a, $l[$i])
349+
350+ func $f0_2 ($a,$i) = if (($i >= $s))
351+ then $a
352+ else throw("List size exceeds 6")
353+
354+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
355+ }
356+ let m = {
357+ let $l = matParts
358+ let $s = size($l)
359+ let $acc0 = $Tuple8(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false)
360+ func $f1_1 ($a,$i) = if (($i >= $s))
361+ then $a
362+ else setCommon($a, $l[$i])
363+
364+ func $f1_2 ($a,$i) = if (($i >= $s))
365+ then $a
366+ else throw("List size exceeds 6")
367+
368+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
369+ }
370+ let p = if ((size(prodParts) != 0))
371+ then {
372+ let $l = prodParts
373+ let $s = size($l)
374+ let $acc0 = $Tuple8(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true)
375+ func $f2_1 ($a,$i) = if (($i >= $s))
376+ then $a
377+ else setCommon($a, $l[$i])
378+
379+ func $f2_2 ($a,$i) = if (($i >= $s))
380+ then $a
381+ else throw("List size exceeds 50")
382+
383+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
384+ }
385+ else $Tuple8(0, currWhProd, m._3, m._4, m._5, currWhProd, currentOrdProd, true)
386+ $Tuple6(r._2, m._2, p._2, p._3, p._4, p._5)
387+ }
388+ }
389+ }
390+
391+
351392 func acceptCommon (acc,bpOrdItem) = {
352393 let j = acc._7
353394 let isProd = acc._12
354395 let pkgSize = if (isProd)
355396 then parseIntValue(split(productionMatrix[j], "_")[recipeIdxPacksize])
356397 else 0
357398 let bpOrdParts = split(bpOrdItem, "@")
358399 if ((size(bpOrdParts) != 2))
359400 then throw("Incorrect order format, should be amount@price")
360401 else {
361402 let bpOrdAm = parseIntValue(bpOrdParts[0])
362403 let bpOrdPr = parseIntValue(bpOrdParts[1])
363404 if ((0 > bpOrdPr))
364405 then throw("Price can't be negative")
365406 else {
366407 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
367408 let bpInit = if ((size(acc._8) > j))
368409 then parseIntValue(acc._8[j])
369410 else 0
370411 let whInit = if ((size(acc._9) > j))
371412 then parseIntValue(acc._9[j])
372413 else 0
373414 let whOrdParts = split(acc._10[j], "@")
374415 let whOrdAm = parseIntValue(whOrdParts[0])
375416 let whOrdPr = parseIntValue(whOrdParts[1])
376417 if (if ((bpOrdAm != 0))
377418 then (bpOrdPr != whOrdPr)
378419 else false)
379420 then throw(((((("Prices of " + acc._11[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
380421 else {
381422 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
382423 let deltaVol = toVolume(bpOrdAm, pkgSize, isProd)
383424 if ((bpOrdAm == 0))
384425 then $Tuple12((acc._1 :+ toString(whInit)), (acc._2 :+ acc._10[j]), (acc._3 :+ toString(bpInit)), acc._4, acc._5, acc._6, (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd)
385426 else if ((bpOrdAm > 0))
386427 then if ((0 > whOrdAm))
387428 then if ((bpOrdAm > -(whOrdAm)))
388429 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + acc._11[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
389430 else $Tuple12((acc._1 :+ toString(whInit)), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpInit + bpOrdAm))), (acc._4 + deltaVol), acc._5, (acc._6 + bpOrdUsd), (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd)
390431 else throw((("Attempt to buy " + acc._11[j]) + " while warehouse doesn't sell it"))
391432 else if ((whOrdAm > 0))
392433 then if ((-(bpOrdAm) > whOrdAm))
393434 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + acc._11[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
394435 else if ((-(bpOrdAm) > bpInit))
395436 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + toString(bpInit)) + " of ") + acc._11[j]))
396437 else $Tuple12((acc._1 :+ toString((whInit - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpInit + bpOrdAm))), (acc._4 - deltaVol), (acc._5 - bpOrdUsd), acc._6, (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd)
397438 else throw((("Attempt to sell " + acc._11[j]) + " while warehouse doesn't buy it"))
398439 }
399440 }
400441 }
401442 }
443+
444+
445+@Callable(i)
446+func recalcLockedVolumeREADONLY (landAssetId,wh) = {
447+ let currentOrd = getOrder(keyOrderByLand(landAssetId))
448+ let z = setInternal(wh, currentOrd, currentOrd)
449+ $Tuple2(nil, (z._4 + z._5))
450+ }
451+
402452
403453
404454 @Callable(i)
405455 func constructorV1 (restAddr) = if ((i.caller != this))
406456 then throw("Permission denied")
407457 else [StringEntry(keyRestAddress(), restAddr)]
408458
409459
410460
411461 @Callable(i)
412462 func sellResources (amounts,minPrices) = {
413463 let blocked = checkBlocked()
414464 if ((blocked == blocked))
415465 then {
416466 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
417467 if ((size(i.payments) != 0))
418468 then throw("sellResources doesn't require any payments")
419469 else {
420470 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
421471 if ((curLocation[locIdxType] != "F"))
422472 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
423473 else {
424474 let locId = curLocation[locIdxId]
425475 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
426476 let resList = split(currentPack[bpIdxRes], "_")
427477 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
428478 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
429479 else if ((0 > amounts[j]))
430480 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
431481 else if ((amounts[j] > 0))
432482 then {
433483 let b = sellInternal(locId, j, amounts[j], minPrices[j])
434484 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
435485 }
436486 else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
437487
438488 let merged = {
439489 let $l = [0, 1, 2, 3, 4, 5]
440490 let $s = size($l)
441491 let $acc0 = $Tuple3(nil, nil, 0)
442492 func $f0_1 ($a,$i) = if (($i >= $s))
443493 then $a
444494 else adder($a, $l[$i])
445495
446496 func $f0_2 ($a,$i) = if (($i >= $s))
447497 then $a
448498 else throw("List size exceeds 6")
449499
450500 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
451501 }
452502 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
453503 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
454504 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdtAssetId)), result)
455505 }
456506 }
457507 }
458508 else throw("Strict value is not equal to itself.")
459509 }
460510
461511
462512
463513 @Callable(i)
464514 func buyMaterials (amounts,maxPrices) = {
465515 let blocked = checkBlocked()
466516 if ((blocked == blocked))
467517 then {
468518 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
469519 if ((size(i.payments) != 1))
470520 then throw("exactly 1 payment must be attached")
471521 else {
472522 let pmt = i.payments[0]
473523 let amt = pmt.amount
474524 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
475525 if ((pmtAssetId != usdtAssetId))
476526 then throw("USDT payments only!")
477527 else {
478528 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
479529 if ((curLocation[locIdxType] != "F"))
480530 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
481531 else {
482532 let locId = curLocation[locIdxId]
483533 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
484534 let matList = split(currentPack[bpIdxMat], "_")
485535 func mUpdater (acc,j) = if ((0 > amounts[j]))
486536 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
487537 else if ((amounts[j] > 0))
488538 then {
489539 let b = buyInternal(locId, j, amounts[j], maxPrices[j])
490540 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
491541 }
492542 else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
493543
494544 let merged = {
495545 let $l = [0, 1, 2, 3, 4, 5]
496546 let $s = size($l)
497547 let $acc0 = $Tuple3(nil, nil, 0)
498548 func $f0_1 ($a,$i) = if (($i >= $s))
499549 then $a
500550 else mUpdater($a, $l[$i])
501551
502552 func $f0_2 ($a,$i) = if (($i >= $s))
503553 then $a
504554 else throw("List size exceeds 6")
505555
506556 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
507557 }
508558 if ((merged._3 > amt))
509559 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
510560 else {
511561 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
512562 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
513563 let rest = if (((amt - merged._3) > 0))
514564 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
515565 else nil
516566 let activitiesAmount = (merged._3 / 100)
517567 $Tuple2(((merged._1 ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), result)
518568 }
519569 }
520570 }
521571 }
522572 }
523573 else throw("Strict value is not equal to itself.")
524574 }
525575
526576
527577
528578 @Callable(i)
529579 func exchangeResources (amounts) = {
530580 let blocked = checkBlocked()
531581 if ((blocked == blocked))
532582 then {
533583 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
534584 if ((size(i.payments) != 1))
535585 then throw("exactly 1 payment must be attached")
536586 else {
537587 let pmt = i.payments[0]
538588 let amt = pmt.amount
539589 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
540590 if ((pmtAssetId != usdtAssetId))
541591 then throw("USDT payments only!")
542592 else {
543593 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
544594 if ((curLocation[locIdxType] != "F"))
545595 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
546596 else {
547597 let locId = curLocation[locIdxId]
548598 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
549599 let resList = split(currentPack[bpIdxRes], "_")
550600 let matList = split(currentPack[bpIdxMat], "_")
551601 func exchanger (acc,j) = {
552602 let whKey = keyFactoryWarehouseByIdAndType(locId, j)
553603 let w0 = valueOrElse(getInteger(whKey), 0)
554604 let amj = amounts[j]
555605 if ((amj > parseIntValue(resList[j])))
556606 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
557607 else if ((0 > amj))
558608 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
559609 else if ((amj > 0))
560610 then $Tuple4((acc._1 :+ toString((parseIntValue(resList[j]) - amj))), (acc._2 :+ toString((parseIntValue(matList[j]) + amj))), (acc._3 + fraction(amj, RESOURCEPRICEMIN, MULT8)), (acc._4 :+ IntegerEntry(whKey, w0)))
561611 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
562612 }
563613
564614 let merged = {
565615 let $l = [0, 1, 2, 3, 4, 5]
566616 let $s = size($l)
567617 let $acc0 = $Tuple4(nil, nil, 0, nil)
568618 func $f0_1 ($a,$i) = if (($i >= $s))
569619 then $a
570620 else exchanger($a, $l[$i])
571621
572622 func $f0_2 ($a,$i) = if (($i >= $s))
573623 then $a
574624 else throw("List size exceeds 6")
575625
576626 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
577627 }
578628 if ((merged._3 > amt))
579629 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
580630 else {
581631 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._1, "_"), makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
582632 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
583633 let rest = if (((amt - merged._3) > 0))
584634 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
585635 else nil
586636 let activitiesAmount = (merged._3 / 100)
587637 $Tuple2(((rest ++ merged._4) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), result)
588638 }
589639 }
590640 }
591641 }
592642 }
593643 else throw("Strict value is not equal to itself.")
594644 }
595645
596646
597647
598648 @Callable(i)
599649 func craftGoods (productIdx,quantity) = {
600650 let blocked = checkBlocked()
601651 if ((blocked == blocked))
602652 then if ((size(i.payments) != 1))
603653 then throw("exactly 1 payment must be attached")
604654 else {
605655 let pmt = i.payments[0]
606656 let amt = pmt.amount
607657 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
608658 if ((pmtAssetId != usdtAssetId))
609659 then throw("USDT payments only!")
610660 else if ((amt != MULT6))
611661 then throw("exactly 1 USDT must be attached as payment")
612662 else if ((0 >= quantity))
613663 then throw("Quantity should be positive")
614664 else {
615665 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
616666 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
617667 if ((curLocation[locIdxType] != "M"))
618668 then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
619669 else {
620670 let cont = curLocation[locIdxContinent]
621671 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
622672 let matList = split(currentPack[bpIdxMat], "_")
623673 if (if ((0 > productIdx))
624674 then true
625675 else (productIdx >= size(productionMatrix)))
626676 then throw(("Unknown product idx=" + toString(productIdx)))
627677 else {
628678 let recipe = split(productionMatrix[productIdx], "_")
629679 if ((size(recipe) != (NUMRES + 3)))
630680 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
631681 else {
632682 let productContIdx = parseIntValue(recipe[recipeIdxContinent])
633683 if ((continents[productContIdx] != cont))
634684 then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
635685 else {
636686 let prodList = if ((currentPack[bpIdxProd] == ""))
637687 then nil
638688 else split(currentPack[bpIdxProd], "_")
639689 func filler (acc,ignoredItem) = {
640690 let n = acc._2
641691 let xs = if ((size(prodList) > n))
642692 then prodList[n]
643693 else "0"
644694 let x = parseIntValue(xs)
645695 let amount = (quantity * parseIntValue(recipe[recipeIdxPacksize]))
646696 let y = if ((n == productIdx))
647697 then toString((x + amount))
648698 else xs
649699 $Tuple2((acc._1 :+ y), (n + 1))
650700 }
651701
652702 let bpProd = ( let $l = productionMatrix
653703 let $s = size($l)
654704 let $acc0 = $Tuple2(nil, 0)
655705 func $f0_1 ($a,$i) = if (($i >= $s))
656706 then $a
657707 else filler($a, $l[$i])
658708
659709 func $f0_2 ($a,$i) = if (($i >= $s))
660710 then $a
661711 else throw("List size exceeds 50")
662712
663713 $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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._1
664714 func producer (acc,j) = {
665715 let needMat = ((parseIntValue(recipe[j]) * MULT7) * quantity)
666716 let haveMat = parseIntValue(matList[j])
667717 if ((needMat > haveMat))
668718 then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity)))
669719 else if ((needMat > 0))
670720 then (acc :+ toString((haveMat - needMat)))
671721 else (acc :+ matList[j])
672722 }
673723
674724 let merged = {
675725 let $l = [0, 1, 2, 3, 4, 5]
676726 let $s = size($l)
677727 let $acc0 = nil
678728 func $f1_1 ($a,$i) = if (($i >= $s))
679729 then $a
680730 else producer($a, $l[$i])
681731
682732 func $f1_2 ($a,$i) = if (($i >= $s))
683733 then $a
684734 else throw("List size exceeds 6")
685735
686736 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
687737 }
688738 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged, "_"), makeString(bpProd, "_")], ":")
689739 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
690740 $Tuple2(nil, result)
691741 }
692742 }
693743 }
694744 }
695745 }
696746 }
697747 else throw("Strict value is not equal to itself.")
698748 }
699749
700750
701751
702752 @Callable(i)
703753 func setWarehouseOrder (cargoListStr,landAssetId) = {
704754 let user = i.originCaller
705755 let addr = toString(user)
706756 let result = if ((user != restContract))
707757 then checkBlocked()
708758 else false
709759 let asset = value(assetInfo(fromBase58String(landAssetId)))
710760 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
711761 then throw((("NFT " + asset.name) + " is not staked"))
712762 else {
713763 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
714764 if (if ((user != restContract))
715765 then (owner != addr)
716766 else false)
717767 then throw((LANDPREFIX + " is not yours"))
718768 else {
719769 let cargoParts = split_4C(cargoListStr, ":")
720- if ((size(cargoParts) != 3))
721- then throw("cargoListStr should contain exactly 2 ':' separators")
722- else {
723- let resParts = split(cargoParts[0], "_")
724- let matParts = split(cargoParts[1], "_")
725- let prodParts = if ((cargoParts[2] == ""))
726- then nil
727- else split(cargoParts[2], "_")
728- if ((size(resParts) != NUMRES))
729- then throw("All 6 resources should be passed")
730- else if ((size(matParts) != NUMRES))
731- then throw("All 6 materials should be passed")
732- else {
733- let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
734- let currentWh = split_4C(wh, ":")
735- let currWhRes = split(currentWh[whIdxRes], "_")
736- let currWhMat = split(currentWh[whIdxMat], "_")
737- let currWhProd = if ((currentWh[whIdxProd] == ""))
738- then nil
739- else split(currentWh[whIdxProd], "_")
740- let loft = split(currentWh[whIdxLOFT], "_")
741- let whOccupied = parseIntValue(loft[volOccupied])
742- let whFree = parseIntValue(loft[volFree])
743- let ordKey = keyOrderByLand(landAssetId)
744- let currentOrd = getOrder(ordKey)
745- let currentOrdRes = split(currentOrd[ordIdxRes], "_")
746- let currentOrdMat = split(currentOrd[ordIdxMat], "_")
747- let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
748- then nil
749- else split(currentOrd[ordIdxProd], "_")
750- let usdtNeed2Lock = 0
751- let r = {
752- let $l = resParts
753- let $s = size($l)
754- let $acc0 = $Tuple8(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false)
755- func $f0_1 ($a,$i) = if (($i >= $s))
756- then $a
757- else setCommon($a, $l[$i])
758-
759- func $f0_2 ($a,$i) = if (($i >= $s))
760- then $a
761- else throw("List size exceeds 6")
762-
763- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
764- }
765- let m = {
766- let $l = matParts
767- let $s = size($l)
768- let $acc0 = $Tuple8(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false)
769- func $f1_1 ($a,$i) = if (($i >= $s))
770- then $a
771- else setCommon($a, $l[$i])
772-
773- func $f1_2 ($a,$i) = if (($i >= $s))
774- then $a
775- else throw("List size exceeds 6")
776-
777- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
778- }
779- let p = if ((size(prodParts) != 0))
780- then {
781- let $l = prodParts
782- let $s = size($l)
783- let $acc0 = $Tuple8(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true)
784- func $f2_1 ($a,$i) = if (($i >= $s))
785- then $a
786- else setCommon($a, $l[$i])
787-
788- func $f2_2 ($a,$i) = if (($i >= $s))
789- then $a
790- else throw("List size exceeds 50")
791-
792- $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
793- }
794- else $Tuple8(0, currWhProd, m._3, m._4, m._5, currWhProd, currentOrdProd, true)
795- let buyVolSaldo = p._3
796- let sellVolSaldo = p._4
797- if ((buyVolSaldo > whFree))
798- then throw((((("Attempt to reserve " + toString(buyVolSaldo)) + " space for buy orders, but only ") + toString(whFree)) + " warehouse empty space left"))
799- else if ((sellVolSaldo > whOccupied))
800- then throw((((("Attempt to lock " + toString(sellVolSaldo)) + " space for sell orders, but only ") + toString(whOccupied)) + " warehouse space occupied"))
770+ let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
771+ let currentWh = split_4C(wh, ":")
772+ let loft = split(currentWh[whIdxLOFT], "_")
773+ let whOccupied = parseIntValue(loft[volOccupied])
774+ let whFree = parseIntValue(loft[volFree])
775+ let ordKey = keyOrderByLand(landAssetId)
776+ let currentOrd = getOrder(ordKey)
777+ let z = setInternal(currentWh, currentOrd, cargoParts)
778+ let buyVolSaldo = z._4
779+ let sellVolSaldo = z._5
780+ if ((buyVolSaldo > whFree))
781+ then throw((((("Attempt to reserve " + toString(buyVolSaldo)) + " space for buy orders, but only ") + toString(whFree)) + " warehouse empty space left"))
782+ else if ((sellVolSaldo > whOccupied))
783+ then throw((((("Attempt to lock " + toString(sellVolSaldo)) + " space for sell orders, but only ") + toString(whOccupied)) + " warehouse space occupied"))
784+ else {
785+ let whStr = makeString_2C([currentWh[whIdxLevels], makeString(z._1, "_"), makeString(z._2, "_"), makeString(z._3, "_"), toString((buyVolSaldo + sellVolSaldo))], ":")
786+ let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
787+ if ((whSave == whSave))
788+ then {
789+ let usdSaldo = z._6
790+ let actions = if ((usdSaldo > 0))
791+ then if ((size(i.payments) != 1))
792+ then throw("exactly 1 payment must be attached")
801793 else {
802- let whStr = makeString_2C([currentWh[whIdxLevels], makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_"), toString((buyVolSaldo + sellVolSaldo))], ":")
803- let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
804- if ((whSave == whSave))
805- then {
806- let usdSaldo = p._5
807- let actions = if ((usdSaldo > 0))
808- then if ((size(i.payments) != 1))
809- then throw("exactly 1 payment must be attached")
810- else {
811- let pmt = i.payments[0]
812- let amt = pmt.amount
813- let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
814- if ((pmtAssetId != usdtAssetId))
815- then throw("USDT payments only!")
816- else if ((amt != usdSaldo))
817- then throw(("Payment needed is " + toString(usdSaldo)))
818- else [StringEntry(ordKey, cargoListStr)]
819- }
820- else if ((usdSaldo == 0))
821- then if ((size(i.payments) != 0))
822- then throw("No payments needed")
823- else [StringEntry(ordKey, cargoListStr)]
824- else if ((size(i.payments) != 0))
825- then throw("No payments needed")
826- else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, cargoListStr)]
827- $Tuple2(actions, result)
828- }
829- else throw("Strict value is not equal to itself.")
794+ let pmt = i.payments[0]
795+ let amt = pmt.amount
796+ let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
797+ if ((pmtAssetId != usdtAssetId))
798+ then throw("USDT payments only!")
799+ else if ((amt != usdSaldo))
800+ then throw(("Payment needed is " + toString(usdSaldo)))
801+ else [StringEntry(ordKey, cargoListStr)]
830802 }
803+ else if ((usdSaldo == 0))
804+ then if ((size(i.payments) != 0))
805+ then throw("No payments needed")
806+ else [StringEntry(ordKey, cargoListStr)]
807+ else if ((size(i.payments) != 0))
808+ then throw("No payments needed")
809+ else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, cargoListStr)]
810+ $Tuple2(actions, result)
831811 }
832- }
812+ else throw("Strict value is not equal to itself.")
813+ }
833814 }
834815 }
835816 }
836817
837818
838819
839820 @Callable(i)
840821 func acceptWarehouseOrder (bpOrderStr,landAssetId,duckAssetId) = {
841822 let blocked = checkBlocked()
842823 if ((blocked == blocked))
843824 then {
844825 let caller = i.originCaller
845826 let callerAddr = toString(caller)
846827 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
847828 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
848829 let loc = split(value(curLocation), "_")
849830 if ((loc[locIdxType] != "L"))
850831 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
851832 else if ((stakedDuckAssetId != duckAssetId))
852833 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
853834 else {
854835 let landAsset = value(assetInfo(fromBase58String(landAssetId)))
855836 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
856837 then throw((("NFT " + landAsset.name) + " is not staked"))
857838 else {
858839 let landOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
859840 if ((landOwner == callerAddr))
860841 then throw("You cannot trade with yourself")
861842 else {
862843 let bpOrderParts = split_4C(bpOrderStr, ":")
863844 if ((size(bpOrderParts) != 3))
864845 then throw("bpOrderStr should contain exactly 2 ':' separators")
865846 else {
866847 let bpOrdRes = split(bpOrderParts[0], "_")
867848 let bpOrdMat = split(bpOrderParts[1], "_")
868849 let bpOrdProd = if ((bpOrderParts[2] == ""))
869850 then nil
870851 else split(bpOrderParts[2], "_")
871852 if ((size(bpOrdRes) != NUMRES))
872853 then throw("All 6 resources should be passed")
873854 else if ((size(bpOrdMat) != NUMRES))
874855 then throw("All 6 materials should be passed")
875856 else {
876857 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
877858 let currentWh = split_4C(wh, ":")
878859 let currWhRes = split(currentWh[whIdxRes], "_")
879860 let currWhMat = split(currentWh[whIdxMat], "_")
880861 let currWhProd = if ((currentWh[whIdxProd] == ""))
881862 then nil
882863 else split(currentWh[whIdxProd], "_")
883864 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
884865 let bpKey = keyBackpackByDuck(duckAssetId)
885866 let currentPack = getBackpack(bpKey)
886867 let bpResList = split(currentPack[bpIdxRes], "_")
887868 let bpMatList = split(currentPack[bpIdxMat], "_")
888869 let bpProdList = if ((currentPack[bpIdxProd] == ""))
889870 then nil
890871 else split(currentPack[bpIdxProd], "_")
891872 let ordKey = keyOrderByLand(landAssetId)
892873 let whOrd = getOrder(ordKey)
893874 let whOrdRes = split(whOrd[ordIdxRes], "_")
894875 let whOrdMat = split(whOrd[ordIdxMat], "_")
895876 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
896877 then nil
897878 else split(whOrd[ordIdxProd], "_")
898- let usdtNeed2Lock = 0
899879 let r = {
900880 let $l = bpOrdRes
901881 let $s = size($l)
902882 let $acc0 = $Tuple12(nil, nil, nil, 0, 0, 0, 0, bpResList, currWhRes, whOrdRes, resTypes, false)
903883 func $f0_1 ($a,$i) = if (($i >= $s))
904884 then $a
905885 else acceptCommon($a, $l[$i])
906886
907887 func $f0_2 ($a,$i) = if (($i >= $s))
908888 then $a
909889 else throw("List size exceeds 6")
910890
911891 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
912892 }
913893 let m = {
914894 let $l = bpOrdMat
915895 let $s = size($l)
916896 let $acc0 = $Tuple12(nil, nil, nil, r._4, r._5, r._6, 0, bpMatList, currWhMat, whOrdMat, matTypes, false)
917897 func $f1_1 ($a,$i) = if (($i >= $s))
918898 then $a
919899 else acceptCommon($a, $l[$i])
920900
921901 func $f1_2 ($a,$i) = if (($i >= $s))
922902 then $a
923903 else throw("List size exceeds 6")
924904
925905 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
926906 }
927907 let p = if ((size(bpOrdProd) != 0))
928908 then {
929909 let $l = bpOrdProd
930910 let $s = size($l)
931911 let $acc0 = $Tuple12(nil, nil, nil, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true)
932912 func $f2_1 ($a,$i) = if (($i >= $s))
933913 then $a
934914 else acceptCommon($a, $l[$i])
935915
936916 func $f2_2 ($a,$i) = if (($i >= $s))
937917 then $a
938918 else throw("List size exceeds 50")
939919
940920 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
941921 }
942922 else $Tuple12(currWhProd, whOrdProd, bpProdList, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true)
943923 let volSaldo = p._4
944924 let newLockedVol = if ((0 > (currWhLockedVol - volSaldo)))
945925 then 0
946926 else (currWhLockedVol - volSaldo)
947927 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(r._1, "_"), makeString(m._1, "_"), makeString(p._1, "_"), toString(newLockedVol)], ":")
948928 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_")], ":")
949929 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(r._3, "_"), makeString(m._3, "_"), makeString(p._3, "_")], ":")
950930 let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
951931 if ((whSave == whSave))
952932 then {
953933 let bpSave = invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil)
954934 if ((bpSave == bpSave))
955935 then {
956936 let actions = [StringEntry(ordKey, newWhOrdStr)]
957937 let usdWh2BpSaldo = p._5
958938 let actions1 = if ((usdWh2BpSaldo > 0))
959939 then {
960940 let usdWh2BpFee = fraction(p._5, AUCTIONFEE, MULT6)
961941 let refByKey = keyAddressRefBy(callerAddr)
962942 let refBy = getString(stakingContract, refByKey)
963943 if (isDefined(refBy))
964944 then (((actions :+ ScriptTransfer(caller, (p._5 - (3 * usdWh2BpFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId)) :+ ScriptTransfer(addressFromStringValue(value(refBy)), usdWh2BpFee, usdtAssetId))
965945 else ((actions :+ ScriptTransfer(caller, (p._5 - (3 * usdWh2BpFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId))
966946 }
967947 else actions
968948 let usdBp2WhSaldo = p._6
969949 if ((usdBp2WhSaldo > 0))
970950 then if ((size(i.payments) != 1))
971951 then throw("exactly 1 payment must be attached")
972952 else {
973953 let pmt = i.payments[0]
974954 let amt = pmt.amount
975955 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
976956 if ((pmtAssetId != usdtAssetId))
977957 then throw("USDT payments only!")
978958 else if ((amt != usdBp2WhSaldo))
979959 then throw(("Payment needed is " + toString(usdBp2WhSaldo)))
980960 else if ((MINSHOPPAYMENT > amt))
981961 then throw(("Payment should be at least " + toString(MINSHOPPAYMENT)))
982962 else {
983963 let usdBp2WhFee = fraction(p._6, AUCTIONFEE, MULT6)
984964 let refByKey = keyAddressRefBy(landOwner)
985965 let refBy = getString(stakingContract, refByKey)
986966 if (isDefined(refBy))
987967 then (((actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId)) :+ ScriptTransfer(addressFromStringValue(value(refBy)), usdBp2WhFee, usdtAssetId))
988968 else ((actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId))
989969 }
990970 }
991971 else if ((size(i.payments) != 0))
992972 then throw("No payments needed")
993973 else actions1
994974 }
995975 else throw("Strict value is not equal to itself.")
996976 }
997977 else throw("Strict value is not equal to itself.")
998978 }
999979 }
1000980 }
1001981 }
1002982 }
1003983 }
1004984 else throw("Strict value is not equal to itself.")
1005985 }
1006986
1007987

github/deemru/w8io/873ac7e 
134.52 ms