tx · 29MqNtLd5E39dYMdKAF2PiujpJsVFdk1FbtRPy1y3aWe

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.03200000 Waves

2023.05.15 18:46 [2579282] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "29MqNtLd5E39dYMdKAF2PiujpJsVFdk1FbtRPy1y3aWe", "fee": 3200000, "feeAssetId": null, "timestamp": 1684165602446, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "4qScupR5QF3E5yfMtG7TnvovKcRxZsfTvtV1dxEbojzaSit67Wqj1JN8zxWthidgd3QBR6iZp2KCk1Z9heY4WXzK" ], "script": "base64:BgIrCAISAwoBCBIECgIRERIECgIRERIDCgEREgQKAgEBEgQKAggIEgUKAwgICFYAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDcAgK3iBAAFTVVMVDgAgMLXLwAGTVVMVDEwAIDIr6AlAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgAUSWR4Q2ZnR292ZXJuYW5jZURhcHAAAwEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EABk5VTVJFUwAGABNGQUNUT1JZTUFYV0FSRUhPVVNFAIDIr6AlABBSRVNPVVJDRVBSSUNFTUlOANW1AgAKTUlOUEFZTUVOVACQTgAOU0VMTE1VTFRJUExJRVIAyAEADUJVWU1VTFRJUExJRVIArAIACkxBTkRQUkVGSVgCBExBTkQACkRVQ0tQUkVGSVgCBERVQ0sADFdITVVMVElQTElFUgCAyK+gJQAKQVVDVElPTkZFRQCQTgAOTUlOU0hPUFBBWU1FTlQAoI0GAAhyZXNUeXBlcwkAzAgCAgNPaWwJAMwIAgIDT3JlCQDMCAICBFdvb2QJAMwIAgIEU2FuZAkAzAgCAgRDbGF5CQDMCAICB09yZ2FuaWMFA25pbAAIbWF0VHlwZXMJAMwIAgIERnVlbAkAzAgCAgVNZXRhbAkAzAgCAgVQbGFuawkAzAgCAgVHbGFzcwkAzAgCAgdQbGFzdGljCQDMCAICB1Byb3RlaW4FA25pbAAJcHJvZFR5cGVzCQDMCAICDUZpcnN0IEFpZCBLaXQJAMwIAgIIQmFja3BhY2sJAMwIAgILRm9vZCBSYXRpb24JAMwIAgIISmV0IFBhY2sJAMwIAgIGU2hpZWxkBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAhAxXzFfMV8yXzJfNV8xXzEwCQDMCAICETJfNV81XzJfN181XzJfMTAwCQDMCAICEDFfMV8xXzJfMl81XzFfMTAJAMwIAgIROV85XzFfNV81XzFfNV8xMDAJAMwIAgIQMl8yXzFfMl8yXzJfMV8xMAkAzAgCAhEyXzJfMl80XzRfMTBfMV8xMAkAzAgCAhU0XzEwXzEwXzRfMTRfMTBfMl8xMDAJAMwIAgIRMl8yXzJfNF80XzEwXzFfMTAJAMwIAgIVMThfMThfMl8xMF8xMF8yXzVfMTAwCQDMCAICEDRfNF8yXzRfNF80XzFfMTAJAMwIAgIRM18zXzNfNl82XzE1XzFfMTAJAMwIAgIVNl8xNV8xNV82XzIxXzE1XzJfMTAwCQDMCAICETNfM18zXzZfNl8xNV8xXzEwCQDMCAICFTI3XzI3XzNfMTVfMTVfM181XzEwMAkAzAgCAhA2XzZfM182XzZfNl8xXzEwBQNuaWwAD2NvbnRJZHhBbWVyaWNhcwAAAA1jb250SWR4RXVyb3BlAAEAC2NvbnRJZHhBc2lhAAIADWNvbnRJZHhBZnJpY2EAAwAOY29udElkeE9jZWFuaWEABAANcmVjaXBlSWR4RnVlbAAAAA5yZWNpcGVJZHhNZXRhbAABAA5yZWNpcGVJZHhQbGFuawACAA5yZWNpcGVJZHhHbGFzcwADABByZWNpcGVJZHhQbGFzdGljAAQAEHJlY2lwZUlkeFByb3RlaW4ABQAPcmVjaXBlSWR4V2VpZ2h0AAYAEXJlY2lwZUlkeFBhY2tzaXplAAcBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIJZmFjdG9yeUlkB3Jlc1R5cGUJAKwCAgkArAICCQCsAgICG2ZhY3RvcnlXaEJ5Q29udGluZW50QW5kUmVzXwUJZmFjdG9yeUlkAgFfCQCkAwEFB3Jlc1R5cGUBDmtleU9yZGVyQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAgpsYW5kT3JkZXJfBQtsYW5kQXNzZXRJZAEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIJbmZ0T3duZXJfBQdhc3NldElkARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQdhc3NldElkCQCsAgICC3N0YWtlZFRpbWVfBQdhc3NldElkAQ9rZXlBZGRyZXNzUmVmQnkBBGFkZHIJAKwCAgIJYWNjUmVmQnlfBQRhZGRyAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAAh3aElkeFZvbAAAAAh3aElkeFJlcwABAAh3aElkeE1hdAACAAl3aElkeFByb2QAAwAOd2hJZHhMb2NrZWRWb2wABAAJb3JkSWR4UmVzAAAACW9yZElkeE1hdAABAApvcmRJZHhQcm9kAAIBCGFzU3RyaW5nAQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwEIZ2V0T3JkZXIBBm9yZEtleQQBcAkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFBm9yZEtleQIwMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6MEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6AgE6CQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUJb3JkSWR4UmVzAgFfBQZOVU1SRVMJAJEDAgUBcAUJb3JkSWR4UmVzAhcwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCW9yZElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCW9yZElk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aW5QcmljZQQFd2hLZXkJAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCBQVsb2NJZAUHcmVzVHlwZQQCdzAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUFd2hLZXkAAAQCcjADCQBmAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UAAAMJAGYCCQBkAgUCdzAFBmFtb3VudAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAZQIFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFAncwBQZhbW91bnQEDHVzZHRSZWNlaXZlZAkAZAIJAGsDBQJyMAkAZQIJAGgCBQ5TRUxMTVVMVElQTElFUgUQUkVTT1VSQ0VQUklDRU1JTgkAawMJAGQCCQBoAgBkBQJ3MAkAaAIAMgUCcjAFEFJFU09VUkNFUFJJQ0VNSU4FE0ZBQ1RPUllNQVhXQVJFSE9VU0UFBk1VTFQxMAkAawMJAGUCBQZhbW91bnQFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAQFbWluOTkJAGUCBQhtaW5QcmljZQkAaQIFCG1pblByaWNlAGQDCQBmAgkAaAIFBW1pbjk5BQZhbW91bnQJAGgCBQx1c2R0UmVjZWl2ZWQFBU1VTFQ4CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BY3R1YWwgcHJpY2UgPSAJAKQDAQUMdXNkdFJlY2VpdmVkAgMgLyAJAKQDAQUGYW1vdW50Ag4gPCBtaW5QcmljZSA9IAkApAMBBQhtaW5QcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIcmVzVHlwZXMFB3Jlc1R5cGUCASkJAJQKAgkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBkAgUCdzAFBmFtb3VudAUMdXNkdFJlY2VpdmVkAQtidXlJbnRlcm5hbAQFbG9jSWQHbWF0VHlwZQZhbW91bnQIbWF4UHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB21hdFR5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAm0xAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFCQCXAwEJAMwIAgUGYW1vdW50CQDMCAIJAGUCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQUDbmlsAAAEAm0wCQCXAwEJAMwIAgUCdzAJAMwIAgkAZQIFBmFtb3VudAUCbTEFA25pbAQBbQkAZAIFAm0wBQJtMQQJdXNkdFNwZW50CQBkAgkAawMFAm0wCQBlAgkAaAIFDUJVWU1VTFRJUExJRVIFEFJFU09VUkNFUFJJQ0VNSU4JAGsDCQBlAgkAaAIAZAUCdzAJAGgCADIFAm0wBRBSRVNPVVJDRVBSSUNFTUlOBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQZNVUxUMTAJAGsDBQJtMQkAaAIAAgUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgEBm1heDEwMQkAZAIFCG1heFByaWNlCQBpAgUIbWF4UHJpY2UAZAMJAGYCCQBoAgUJdXNkdFNwZW50BQVNVUxUOAkAaAIFBm1heDEwMQUBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQWN0dWFsIHByaWNlID0gCQCkAwEFCXVzZHRTcGVudAIDIC8gCQCkAwEFAW0CDiA+IG1heFByaWNlID0gCQCkAwEFCG1heFByaWNlAgMsICgFBWxvY0lkAgIsIAkAkQMCBQhtYXRUeXBlcwUHbWF0VHlwZQIBKQkAlQoDCQEMSW50ZWdlckVudHJ5AgUFd2hLZXkJAGUCBQJ3MAUBbQUJdXNkdFNwZW50BQFtAQtnZXRCYWNrcGFjawEFYnBLZXkEAXAJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QFBWJwS2V5AhowOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOgIBOgkAzAgCCQCkAwEJAQt2YWx1ZU9yRWxzZQIJALYJAQkAkQMCBQFwBQpicElkeExldmVsAAAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeFJlcwIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4UmVzAgswXzBfMF8wXzBfMAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCGJwSWR4TWF0AgFfBQZOVU1SRVMJAJEDAgUBcAUIYnBJZHhNYXQCCzBfMF8wXzBfMF8wCQDMCAIJAJEDAgUBcAUJYnBJZHhQcm9kBQNuaWwBDGNoZWNrQmxvY2tlZAADCQELdmFsdWVPckVsc2UCCQCbCAIFD3N0YWtpbmdDb250cmFjdAkBCmtleUJsb2NrZWQABwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UFBHVuaXQBCXNldENvbW1vbgIDYWNjBGl0ZW0EAWoIBQNhY2MCXzEECWl0ZW1QYXJ0cwkAtQkCBQRpdGVtAgFAAwkBAiE9AgkAkAMBBQlpdGVtUGFydHMAAgkAAgECLkluY29ycmVjdCBvcmRlciBmb3JtYXQsIHNob3VsZCBiZSBhbW91bnRAcHJpY2UECG5ld09yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAAECG5ld09yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAEECW5ld09yZFVzZAkAawMFCG5ld09yZEFtBQhuZXdPcmRQcgUFTVVMVDgEA3docAkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzUFAWoEC2N1ck9yZFBhcnRzCQC1CQIJAJEDAggFA2FjYwJfNgUBagIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDCQBmAgAABQhjdXJPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAmAoGCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUDd2hwCQBlAggFA2FjYwJfMwUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QIBQNhY2MCXzUIBQNhY2MCXzYJAJgKBgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHAFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUIY3VyT3JkQW0IBQNhY2MCXzQIBQNhY2MCXzUIBQNhY2MCXzYDCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGQCBQhuZXdPcmRBbQUIY3VyT3JkQW0JAJgKBgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHAFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUGYW1EaWZmCQBkAggFA2FjYwJfNAUJbmV3T3JkVXNkCAUDYWNjAl81CAUDYWNjAl82CQCYCgYJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQN3aHAJAGUCCQBkAggFA2FjYwJfMwUIbmV3T3JkQW0FCGN1ck9yZEFtCQBlAgkAZAIIBQNhY2MCXzQFCW5ld09yZFVzZAUJY3VyT3JkVXNkCAUDYWNjAl81CAUDYWNjAl82AwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQN3aHAFBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFA3docAIKIGF2YWlsYWJsZQkAmAoGCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFA3docAUGYW1EaWZmCQBkAggFA2FjYwJfMwUGYW1EaWZmCAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82AwkAZgIAAAkAZAIFA3docAUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQkBAS0BBQhuZXdPcmRBbQIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUDd2hwAgogYXZhaWxhYmxlCQCYCgYJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUDd2hwBQhuZXdPcmRBbQkAZQIJAGUCCAUDYWNjAl8zBQhuZXdPcmRBbQUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QIBQNhY2MCXzUIBQNhY2MCXzYBDGFjY2VwdENvbW1vbgIDYWNjDWJwT3JkUHJvZEl0ZW0EAWoIBQNhY2MCXzcEDmJwT3JkUHJvZFBhcnRzCQC1CQIFDWJwT3JkUHJvZEl0ZW0CAUADCQECIT0CCQCQAwEFDmJwT3JkUHJvZFBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAdicE9yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOYnBPcmRQcm9kUGFydHMAAAQHYnBPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmJwT3JkUHJvZFBhcnRzAAEDCQBmAgAABQdicE9yZFByCQACAQIXUHJpY2UgY2FuJ3QgYmUgbmVnYXRpdmUECGJwT3JkVXNkCQBrAwUHYnBPcmRBbQUHYnBPcmRQcgUFTVVMVDgEA2JwcAkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzgFAWoEA3docAkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzkFAWoECndoT3JkUGFydHMJALUJAgkAkQMCCAUDYWNjA18xMAUBagIBQAQHd2hPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCndoT3JkUGFydHMAAAQHd2hPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCndoT3JkUGFydHMAAQMDCQECIT0CBQdicE9yZEFtAAAJAQIhPQIFB2JwT3JkUHIFB3doT3JkUHIHCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICClByaWNlcyBvZiAJAJEDAgUJcHJvZFR5cGVzBQFqAhcgZG9uJ3QgbWF0Y2ghIFdIIHByaWNlPQkApAMBBQd3aE9yZFByAg0sIHlvdXIgcHJpY2U9CQCkAwEFB2JwT3JkUHIECHdoT3JkVXNkCQBrAwUHd2hPcmRBbQUHd2hPcmRQcgUFTVVMVDgDCQAAAgUHYnBPcmRBbQAACQCcCgoJAM0IAggFA2FjYwJfMQkApAMBBQN3aHAJAM0IAggFA2FjYwJfMgkAkQMCCAUDYWNjA18xMAUBagkAzQgCCAUDYWNjAl8zCQCkAwEFA2JwcAgFA2FjYwJfNAgFA2FjYwJfNQgFA2FjYwJfNgkAZAIIBQNhY2MCXzcAAQgFA2FjYwJfOAgFA2FjYwJfOQgFA2FjYwNfMTADCQBmAgUHYnBPcmRBbQAAAwkAZgIAAAUHd2hPcmRBbQMJAGYCBQdicE9yZEFtCQEBLQEFB3doT3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCkAwEFB2JwT3JkQW0CBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQFqAhssIGJ1dCB3YXJlaG91c2Ugb25seSBzZWxscyAJAKQDAQkBAS0BBQd3aE9yZEFtCQCcCgoJAM0IAggFA2FjYwJfMQkApAMBBQN3aHAJAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQNicHAFB2JwT3JkQW0JAGQCCAUDYWNjAl80BQdicE9yZEFtCAUDYWNjAl81CQBkAggFA2FjYwJfNgUIYnBPcmRVc2QJAGQCCAUDYWNjAl83AAEIBQNhY2MCXzgIBQNhY2MCXzkIBQNhY2MDXzEwCQACAQkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkAkQMCBQlwcm9kVHlwZXMFAWoCICB3aGlsZSB3YXJlaG91c2UgZG9lc24ndCBzZWxsIGl0AwkAZgIFB3doT3JkQW0AAAMJAGYCCQEBLQEFB2JwT3JkQW0FB3doT3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkApAMBCQEBLQEFB2JwT3JkQW0CBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQFqAhosIGJ1dCB3YXJlaG91c2Ugb25seSBidXlzIAkApAMBBQd3aE9yZEFtAwkAZgIJAQEtAQUHYnBPcmRBbQUDYnBwCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAhQsIGJ1dCB5b3Ugb25seSBoYXZlIAkApAMBBQNicHACBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQFqCQCcCgoJAM0IAggFA2FjYwJfMQkApAMBCQBlAgUDd2hwBQdicE9yZEFtCQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwkApAMBCQBkAgUDYnBwBQdicE9yZEFtCQBlAggFA2FjYwJfNAUHYnBPcmRBbQkAZQIIBQNhY2MCXzUFCGJwT3JkVXNkCAUDYWNjAl82CQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAkAAgEJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCRAwIFCXByb2RUeXBlcwUBagIfIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IGJ1eSBpdAcBaQENY29uc3RydWN0b3JWMQEIcmVzdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgUDbmlsAWkBDXNlbGxSZXNvdXJjZXMCB2Ftb3VudHMJbWluUHJpY2VzBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAipzZWxsUmVzb3VyY2VzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB3Jlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8KAQVhZGRlcgIDYWNjAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVzTGlzdAUBagkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglZb3UgaGF2ZSAJAJEDAgUHcmVzTGlzdAUBagIEIG9mIAkAkQMCBQhyZXNUeXBlcwUBagIULCBidXQgdHJpZWQgdG8gc2VsbCAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIAAAkAkQMCBQdhbW91bnRzBQFqCQACAQkArAICCQCsAgIJAKwCAgIlWW91IHRyaWVkIHRvIHNlbGwgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhyZXNUeXBlcwUBagICOiAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagAABAFiCQEMc2VsbEludGVybmFsBAUFbG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltaW5QcmljZXMFAWoJAJUKAwkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVzTGlzdAUBagkAkQMCBQdhbW91bnRzBQFqCQBkAggFA2FjYwJfMwgFAWICXzIJAJUKAwgFA2FjYwJfMQkAzQgCCAUDYWNjAl8yCQCRAwIFB3Jlc0xpc3QFAWoIBQNhY2MCXzMEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsCQCUCgIJAM0IAggFBm1lcmdlZAJfMQkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCAUGbWVyZ2VkAl8zBQt1c2R0QXNzZXRJZAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGJ1eU1hdGVyaWFscwIHYW1vdW50cwltYXhQcmljZXMEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfCgEIbVVwZGF0ZXICA2FjYwFqAwkAZgIAAAkAkQMCBQdhbW91bnRzBQFqCQACAQkArAICCQCsAgIJAKwCAgIkWW91IHRyaWVkIHRvIGJ1eSBuZWdhdGl2ZSBhbW91bnQgb2YgCQCRAwIFCG1hdFR5cGVzBQFqAgI6IAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqAAAEAWIJAQtidXlJbnRlcm5hbAQFBWxvY0lkBQFqCQCRAwIFB2Ftb3VudHMFAWoJAJEDAgUJbWF4UHJpY2VzBQFqCQCVCgMJAM0IAggFA2FjYwJfMQgFAWICXzEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB21hdExpc3QFAWoIBQFiAl8zCQBkAggFA2FjYwJfMwgFAWICXzIJAJUKAwgFA2FjYwJfMQkAzQgCCAUDYWNjAl8yCQCRAwIFB21hdExpc3QFAWoIBQNhY2MCXzMEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCG1VcGRhdGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwkAZgIIBQZtZXJnZWQCXzMFA2FtdAkAAgEJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAKQDAQUDYW10AgssIHJlcXVpcmVkPQkApAMBCAUGbWVyZ2VkAl8zBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQIBQZtZXJnZWQCXzMAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQIBQZtZXJnZWQCXzMFC3VzZHRBc3NldElkBQNuaWwFA25pbAkAlAoCCQDOCAIIBQZtZXJnZWQCXzEFBHJlc3QFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFleGNoYW5nZVJlc291cmNlcwEHYW1vdW50cwQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB3Jlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8EB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8KAQlleGNoYW5nZXICA2FjYwFqBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQFqBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABANhbWoJAJEDAgUHYW1vdW50cwUBagMJAGYCBQNhbWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkAkQMCBQdyZXNMaXN0BQFqAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhgsIGJ1dCB0cmllZCB0byBleGNoYW5nZSAJAKQDAQUDYW1qAwkAZgIAAAUDYW1qCQACAQkArAICCQCsAgIJAKwCAgIpWW91IHRyaWVkIHRvIGV4Y2hhbmdlIG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCAjogCQCkAwEFA2FtagMJAGYCBQNhbWoAAAkAlgoECQDNCAIIBQNhY2MCXzEJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqBQNhbWoJAM0IAggFA2FjYwJfMgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB21hdExpc3QFAWoFA2FtagkAZAIIBQNhY2MCXzMJAGsDBQNhbWoFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4CQDNCAIIBQNhY2MCXzQJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQUCdzAJAJYKBAkAzQgCCAUDYWNjAl8xCQCRAwIFB3Jlc0xpc3QFAWoJAM0IAggFA2FjYwJfMgkAkQMCBQdtYXRMaXN0BQFqCAUDYWNjAl8zCAUDYWNjAl80BAZtZXJnZWQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWV4Y2hhbmdlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgMJAGYCCAUGbWVyZ2VkAl8zBQNhbXQJAAIBCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQCkAwEFA2FtdAILLCByZXF1aXJlZD0JAKQDAQgFBm1lcmdlZAJfMwQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCCAUGbWVyZ2VkAl8xAgFfCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFBm1lcmdlZAJfMwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAgFBm1lcmdlZAJfMwULdXNkdEFzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAgUEcmVzdAgFBm1lcmdlZAJfNAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmNyYWZ0R29vZHMCCnByb2R1Y3RJZHgIcXVhbnRpdHkEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUFTVVMVDYJAAIBAipleGFjdGx5IDEgVVNEVCBtdXN0IGJlIGF0dGFjaGVkIGFzIHBheW1lbnQDCQBnAgAABQhxdWFudGl0eQkAAgECG1F1YW50aXR5IHNob3VsZCBiZSBwb3NpdGl2ZQQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFNCQACAQkArAICAjFEdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIE1hbnVmYWN0dXJlLCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBARjb250CQCRAwIFC2N1ckxvY2F0aW9uBQ9sb2NJZHhDb250aW5lbnQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwMDCQBmAgAABQpwcm9kdWN0SWR4BgkAZwIFCnByb2R1Y3RJZHgJAJADAQUQcHJvZHVjdGlvbk1hdHJpeAkAAgEJAKwCAgIUVW5rbm93biBwcm9kdWN0IGlkeD0JAKQDAQUKcHJvZHVjdElkeAQOcHJvZHVjdENvbnRJZHgJAGoCBQpwcm9kdWN0SWR4CQCQAwEFCmNvbnRpbmVudHMDCQECIT0CCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RDb250SWR4BQRjb250CQACAQkArAICCQCsAgIJAKwCAgIdVGhpcyBwcm9kdWN0IGlzIGF2YWlsYWJsZSBpbiAJAJEDAgUKY29udGluZW50cwUOcHJvZHVjdENvbnRJZHgCESwgYnV0IHlvdSBhcmUgaW4g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CgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQC5CQIFBm1lcmdlZAIBXwkAzAgCCQC5CQIFBmJwUHJvZAIBXwUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAkAlAoCBQNuaWwFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFzZXRXYXJlaG91c2VPcmRlcgIMY2FyZ29MaXN0U3RyC2xhbmRBc3NldElkBAR1c2VyCAUBaQxvcmlnaW5DYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQGcmVzdWx0AwkBAiE9AgUEdXNlcgUMcmVzdENvbnRyYWN0CQEMY2hlY2tCbG9ja2VkAAcEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwMJAQIhPQIFBHVzZXIFDHJlc3RDb250cmFjdAkBAiE9AgUFb3duZXIFBGFkZHIHCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBApjYXJnb1BhcnRzCQC8CQIFDGNhcmdvTGlzdFN0cgIBOgMJAQIhPQIJAJADAQUKY2FyZ29QYXJ0cwADCQACAQI0Y2FyZ29MaXN0U3RyIHNob3VsZCBjb250YWluIGV4YWN0bHkgMiAnOicgc2VwYXJhdG9ycwQIcmVzUGFydHMJALUJAgkAkQMCBQpjYXJnb1BhcnRzAAACAV8ECG1hdFBhcnRzCQC1CQIJAJEDAgUKY2FyZ29QYXJ0cwABAgFfBAlwcm9kUGFydHMDCQAAAgkAkQMCBQpjYXJnb1BhcnRzAAICAAUDbmlsCQC1CQIJAJEDAgUKY2FyZ29QYXJ0cwACAgFfAwkBAiE9AgkAkAMBBQhyZXNQYXJ0cwUGTlVNUkVTCQACAQIgQWxsIDYgcmVzb3VyY2VzIHNob3VsZCBiZSBwYXNzZWQDCQECIT0CCQCQAwEFCG1hdFBhcnRzBQZOVU1SRVMJAAIBAiBBbGwgNiBtYXRlcmlhbHMgc2hvdWxkIGJlIHBhc3NlZAQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQJY3VycldoUmVzCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQJY3VycldoTWF0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQKY3VycldoUHJvZAMJAAACCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgFfBAV3aFZvbAkBEmdldFdhcmVob3VzZVZvbHVtZQEJAJEDAgUJY3VycmVudFdoBQh3aElkeFZvbAQGb3JkS2V5CQEOa2V5T3JkZXJCeUxhbmQBBQtsYW5kQXNzZXRJZAQKY3VycmVudE9yZAkBCGdldE9yZGVyAQUGb3JkS2V5BA1jdXJyZW50T3JkUmVzCQC1CQIJAJEDAgUKY3VycmVu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AMwIAgkApAMBBQh2b2xTYWxkbwUDbmlsAgE6BAZ3aFNhdmUJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag1zYXZlV2FyZWhvdXNlCQDMCAIFBXdoU3RyCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAMJAAACBQZ3aFNhdmUFBndoU2F2ZQQIdXNkU2FsZG8IBQFwAl80BAdhY3Rpb25zAwkAZgIFCHVzZFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUIdXNkU2FsZG8JAAIBCQCsAgICElBheW1lbnQgbmVlZGVkIGlzIAkApAMBBQh1c2RTYWxkbwkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFDGNhcmdvTGlzdFN0cgUDbmlsAwkAAAIFCHVzZFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQxjYXJnb0xpc3RTdHIFA25pbAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQVvd25lcgkBAS0BBQh1c2RTYWxkbwULdXNkdEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQxjYXJnb0xpc3RTdHIFA25pbAkAlAoCBQdhY3Rpb25zBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUYWNjZXB0V2FyZWhvdXNlT3JkZXIDCmJwT3JkZXJTdHILbGFuZEFzc2V0SWQLZHVja0Fzc2V0SWQEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQEBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBApjYWxsZXJBZGRyCQClCAEFBmNhbGxlcgQRc3Rha2VkRHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFCmNhbGxlckFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFEXN0YWtlZER1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04EA2xvYwkAtQkCCQEFdmFsdWUBBQtjdXJMb2NhdGlvbgIBXwMJAQIhPQIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFMCQACAQkArAICCQCsAgICFkR1Y2sgbG9jYXRpb24gdHlwZSBpcyAJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAhEsIGJ1dCBzaG91bGQgYmUgTAMJAQIhPQIFEXN0YWtlZER1Y2tBc3NldElkBQtkdWNrQXNzZXRJZAkAAgEJAKwCAgkArAICCQCsAgICFFlvdXIgc3Rha2VkIGR1Y2sgaXMgBRFzdGFrZWREdWNrQXNzZXRJZAINLCBidXQgcGFzc2VkIAULZHVja0Fzc2V0SWQECWxhbmRBc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFCWxhbmRBc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQJbGFuZE93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUJbGFuZEFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAAACBQlsYW5kT3duZXIFCmNhbGxlckFkZHIJAAIBAh5Zb3UgY2Fubm90IHRyYWRlIHdpdGggeW91cnNlbGYEDGJwT3JkZXJQYXJ0cwkAvAkCBQpicE9yZGVyU3RyAgE6AwkBAiE9AgkAkAMBBQxicE9yZGVyUGFydHMAAwkAAgECMmJwT3JkZXJTdHIgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSAyICc6JyBzZXBhcmF0b3JzBAhicE9yZFJlcwkAtQkCCQCRAwIFDGJwT3JkZXJQYXJ0cwAAAgFfBAhicE9yZE1hdAkAtQkCCQCRAwIFDGJwT3JkZXJQYXJ0cwABAgFfBAlicE9yZFByb2QDCQAAAgkAkQMCBQxicE9yZGVyUGFydHMAAgIABQNuaWwJALUJAgkAkQMCBQxicE9yZGVyUGFydHMAAgIBXwMJAQIhPQIJAJADAQUIYnBPcmRSZXMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkAwkBAiE9AgkAkAMBBQhicE9yZE1hdAUGTlVNUkVTCQACAQIgQWxsIDYgbWF0ZXJpYWxzIHNob3VsZCBiZSBwYXNzZWQEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQMY3VycldoUmVzVm9sCQEZZ2V0V2FyZWhvdXNlQ3VyclJlc1ZvbHVtZQEFCWN1cnJlbnRXaAQMY3VycldoTWF0Vm9sCQEZZ2V0V2FyZWhvdXNlQ3Vyck1hdFZvbHVtZQEFCWN1cnJlbnRXaAQOY3VycldoR29vZHNWb2wJARtnZXRXYXJlaG91c2VDdXJyR29vZHNWb2x1bWUBBQljdXJyZW50V2gED2N1cnJXaExvY2tlZFZvbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWN1cnJlbnRXaAUOd2hJZHhMb2NrZWRWb2wEC3doU3BhY2VMZWZ0CQBlAgkAZQIJAGUCCQBlAgkBEmdldFdhcmVob3VzZVZvbHVtZQEJAJEDAgUJY3VycmVudFdoBQh3aElkeFZvbAUMY3VycldoUmVzVm9sBQxjdXJyV2hNYXRWb2wFDmN1cnJXaEdvb2RzVm9sBQ9jdXJyV2hMb2NrZWRWb2wEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAlicFJlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8ECWJwTWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQKYnBQcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQGb3JkS2V5CQEOa2V5T3JkZXJCeUxhbmQBBQtsYW5kQXNzZXRJZAQFd2hPcmQJAQhnZXRPcmRlcgEFBm9yZEtleQQId2hPcmRSZXMJALUJAgkAkQMCBQV3aE9yZAUJb3JkSWR4UmVzAgFfBAh3aE9yZE1hdAkAtQkCCQCRAwIFBXdoT3JkBQlvcmRJZHhNYXQCAV8ECXdoT3JkUHJvZAMJAAACCQCRAwIFBXdoT3JkBQpvcmRJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFBXdoT3JkBQpvcmRJZHhQcm9kAgFfBA11c2R0TmVlZDJMb2NrAAAEAXIKAAIkbAUIYnBPcmRSZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCcCgoFA25pbAUDbmlsBQNuaWwAAAAAAAAAAAUJYnBSZXNMaXN0BQljdXJyV2hSZXMFCHdo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dGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFBndoU2F2ZQUGd2hTYXZlBAZicFNhdmUJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQhuZXdCcFN0cgUDbmlsBQNuaWwDCQAAAgUGYnBTYXZlBQZicFNhdmUEB2FjdGlvbnMJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdXaE9yZFN0cgUDbmlsBA11c2RXaDJCcFNhbGRvCAUBcAJfNQQIYWN0aW9uczEDCQBmAgUNdXNkV2gyQnBTYWxkbwAABAt1c2RXaDJCcEZlZQkAawMIBQFwAl81BQpBVUNUSU9ORkVFBQVNVUxUNgQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQpjYWxsZXJBZGRyBAVyZWZCeQkAnQgCBQ9zdGFraW5nQ29udHJhY3QFCHJlZkJ5S2V5AwkBCWlzRGVmaW5lZAEFBXJlZkJ5CQDNCAIJAM0IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIJAGUCCAUBcAJfNQkAaAIAAwULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFcmVmQnkFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAkAzQgCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAZQIIBQFwAl81CQBoAgADBQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkBQdhY3Rpb25zBA11c2RCcDJXaFNhbGRvCAUBcAJfNgMJAGYCBQ11c2RCcDJXaFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUNdXNkQnAyV2hTYWxkbwkAAgEJAKwCAgISUGF5bWVudCBuZWVkZWQgaXMgCQCkAwEFDXVzZEJwMldoU2FsZG8DCQBmAgUOTUlOU0hPUFBBWU1FTlQFA2FtdAkAAgEJAKwCAgIbUGF5bWVudCBzaG91bGQgYmUgYXQgbGVhc3QgCQCkAwEFDk1JTlNIT1BQQVlNRU5UBAt1c2RCcDJXaEZlZQkAawMIBQFwAl82BQpBVUNUSU9ORkVFBQVNVUxUNgQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQlsYW5kT3duZXIEBXJlZkJ5CQCdCAIFD3N0YWtpbmdDb250cmFjdAUIcmVmQnlLZXkDCQEJaXNEZWZpbmVkAQUFcmVmQnkJAM0IAgkAzQgCCQDNCAIFCGFjdGlvbnMxCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlsYW5kT3duZXIJAGUCCAUBcAJfNgkAaAIAAwULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFcmVmQnkFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAkAzQgCCQDNCAIFCGFjdGlvbnMxCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlsYW5kT3duZXIJAGUCCAUBcAJfNgkAaAIAAwULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAUIYWN0aW9uczEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ApP+4xg==", "height": 2579282, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: F9a7c6gBWgkKcDBgE2tAU12YrrjBqTAmiGRs9t56hxb Next: BJPRD6wRf1ZgCPRZCUsLGxMnFigEgHpzf9AUHhCtjtoU Diff:
OldNewDifferences
9393
9494 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
9595
96-let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "2_2_1_2_2_2_1_10"]
96+let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "2_2_1_2_2_2_1_10", "2_2_2_4_4_10_1_10", "4_10_10_4_14_10_2_100", "2_2_2_4_4_10_1_10", "18_18_2_10_10_2_5_100", "4_4_2_4_4_4_1_10", "3_3_3_6_6_15_1_10", "6_15_15_6_21_15_2_100", "3_3_3_6_6_15_1_10", "27_27_3_15_15_3_5_100", "6_6_3_6_6_6_1_10"]
9797
9898 let contIdxAmericas = 0
9999
588588
589589
590590 @Callable(i)
591-func craftGoods (productIdx,level,quantity) = {
591+func craftGoods (productIdx,quantity) = {
592592 let blocked = checkBlocked()
593593 if ((blocked == blocked))
594594 then if ((size(i.payments) != 1))
630630 else split(currentPack[bpIdxProd], "_")
631631 func filler (acc,ignoredItem) = {
632632 let n = acc._2
633- let x = if ((size(prodList) > n))
634- then split(prodList[n], ",")
635- else ["0", "0", "0"]
636- let x1s = x[0]
637- let x1 = parseIntValue(x1s)
638- let x2s = x[1]
639- let x2 = parseIntValue(x2s)
640- let x3s = x[2]
641- let x3 = parseIntValue(x3s)
633+ let xs = if ((size(prodList) > n))
634+ then prodList[n]
635+ else "0"
636+ let x = parseIntValue(xs)
642637 let amount = (quantity * parseIntValue(recipe[recipeIdxPacksize]))
643638 let y = if ((n == productIdx))
644- then match level {
645- case _ =>
646- if ((1 == $match0))
647- then ((((toString((x1 + amount)) + ",") + x2s) + ",") + x3s)
648- else if ((2 == $match0))
649- then ((((x1s + ",") + toString((x2 + amount))) + ",") + x3s)
650- else if ((3 == $match0))
651- then ((((x1s + ",") + x2s) + ",") + toString((x3 + amount)))
652- else throw(("Product level should be 1..3, not " + toString(level)))
653- }
654- else ((((x1s + ",") + x2s) + ",") + x3s)
639+ then toString((x + amount))
640+ else xs
655641 $Tuple2((acc._1 :+ y), (n + 1))
656642 }
657643
668654
669655 $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
670656 func producer (acc,j) = {
671- let needMat = (((parseIntValue(recipe[j]) * MULT7) * quantity) * level)
657+ let needMat = ((parseIntValue(recipe[j]) * MULT7) * quantity)
672658 let haveMat = parseIntValue(matList[j])
673659 if ((needMat > haveMat))
674660 then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity)))
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
96-let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "2_2_1_2_2_2_1_10"]
96+let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "2_2_1_2_2_2_1_10", "2_2_2_4_4_10_1_10", "4_10_10_4_14_10_2_100", "2_2_2_4_4_10_1_10", "18_18_2_10_10_2_5_100", "4_4_2_4_4_4_1_10", "3_3_3_6_6_15_1_10", "6_15_15_6_21_15_2_100", "3_3_3_6_6_15_1_10", "27_27_3_15_15_3_5_100", "6_6_3_6_6_6_1_10"]
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 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
125125
126126
127127 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
128128
129129
130130 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
131131
132132
133133 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
134134
135135
136136 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
137137
138138
139139 func keyBlocked () = "contractsBlocked"
140140
141141
142142 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
143143
144144
145145 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
146146
147147
148148 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
149149
150150
151151 let locIdxContinent = 0
152152
153153 let locIdxType = 1
154154
155155 let locIdxId = 2
156156
157157 let bpIdxLevel = 0
158158
159159 let bpIdxRes = 1
160160
161161 let bpIdxMat = 2
162162
163163 let bpIdxProd = 3
164164
165165 let whIdxVol = 0
166166
167167 let whIdxRes = 1
168168
169169 let whIdxMat = 2
170170
171171 let whIdxProd = 3
172172
173173 let whIdxLockedVol = 4
174174
175175 let ordIdxRes = 0
176176
177177 let ordIdxMat = 1
178178
179179 let ordIdxProd = 2
180180
181181 func asString (v) = match v {
182182 case s: String =>
183183 s
184184 case _ =>
185185 throw("fail to cast into String")
186186 }
187187
188188
189189 func getOrder (ordKey) = {
190190 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:"), ":")
191191 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
192192 then p[ordIdxRes]
193193 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
194194 then p[ordIdxMat]
195195 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
196196 }
197197
198198
199199 func getWarehouseVolume (volPrefix) = {
200200 let parts = split(volPrefix, "_")
201201 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
202202 }
203203
204204
205205 func getWarehouseCurrResVolume (currentWh) = {
206206 func sum (acc,item) = (acc + parseIntValue(item))
207207
208208 let $l = split(currentWh[whIdxRes], "_")
209209 let $s = size($l)
210210 let $acc0 = 0
211211 func $f0_1 ($a,$i) = if (($i >= $s))
212212 then $a
213213 else sum($a, $l[$i])
214214
215215 func $f0_2 ($a,$i) = if (($i >= $s))
216216 then $a
217217 else throw("List size exceeds 6")
218218
219219 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
220220 }
221221
222222
223223 func getWarehouseCurrMatVolume (currentWh) = {
224224 func sum (acc,item) = (acc + parseIntValue(item))
225225
226226 let $l = split(currentWh[whIdxMat], "_")
227227 let $s = size($l)
228228 let $acc0 = 0
229229 func $f0_1 ($a,$i) = if (($i >= $s))
230230 then $a
231231 else sum($a, $l[$i])
232232
233233 func $f0_2 ($a,$i) = if (($i >= $s))
234234 then $a
235235 else throw("List size exceeds 6")
236236
237237 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
238238 }
239239
240240
241241 func getWarehouseCurrGoodsVolume (currentWh) = {
242242 let goods = currentWh[whIdxProd]
243243 if ((goods == ""))
244244 then 0
245245 else {
246246 func sum (acc,item) = (acc + parseIntValue(item))
247247
248248 let $l = split_4C(goods, "_")
249249 let $s = size($l)
250250 let $acc0 = 0
251251 func $f0_1 ($a,$i) = if (($i >= $s))
252252 then $a
253253 else sum($a, $l[$i])
254254
255255 func $f0_2 ($a,$i) = if (($i >= $s))
256256 then $a
257257 else throw("List size exceeds 50")
258258
259259 $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)
260260 }
261261 }
262262
263263
264264 func sellInternal (locId,resType,amount,minPrice) = {
265265 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
266266 let w0 = valueOrElse(getInteger(whKey), 0)
267267 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
268268 then 0
269269 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
270270 then (FACTORYMAXWAREHOUSE - w0)
271271 else amount
272272 let usdtReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
273273 let min99 = (minPrice - (minPrice / 100))
274274 if (((min99 * amount) > (usdtReceived * MULT8)))
275275 then throw((((((((((("Actual price = " + toString(usdtReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
276276 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdtReceived)
277277 }
278278
279279
280280 func buyInternal (locId,matType,amount,maxPrice) = {
281281 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
282282 let w0 = valueOrElse(getInteger(whKey), 0)
283283 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
284284 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
285285 else 0
286286 let m0 = min([w0, (amount - m1)])
287287 let m = (m0 + m1)
288288 let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
289289 let max101 = (maxPrice + (maxPrice / 100))
290290 if (((usdtSpent * MULT8) > (max101 * m)))
291291 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
292292 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdtSpent, m)
293293 }
294294
295295
296296 func getBackpack (bpKey) = {
297297 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
298298 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
299299 then p[bpIdxRes]
300300 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
301301 then p[bpIdxMat]
302302 else "0_0_0_0_0_0", p[bpIdxProd]]
303303 }
304304
305305
306306 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
307307 then throw("Contracts are under maintenance")
308308 else unit
309309
310310
311311 func setCommon (acc,item) = {
312312 let j = acc._1
313313 let itemParts = split(item, "@")
314314 if ((size(itemParts) != 2))
315315 then throw("Incorrect order format, should be amount@price")
316316 else {
317317 let newOrdAm = parseIntValue(itemParts[0])
318318 let newOrdPr = parseIntValue(itemParts[1])
319319 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
320320 let whp = parseIntValue(acc._5[j])
321321 let curOrdParts = split(acc._6[j], "@")
322322 let curOrdAm = parseIntValue(curOrdParts[0])
323323 let curOrdPr = parseIntValue(curOrdParts[1])
324324 if ((0 > curOrdPr))
325325 then throw("Price can't be negative")
326326 else {
327327 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
328328 if ((newOrdAm == 0))
329329 then if ((curOrdAm > 0))
330330 then $Tuple6((j + 1), (acc._2 :+ toString(whp)), (acc._3 - curOrdAm), (acc._4 - curOrdUsd), acc._5, acc._6)
331331 else $Tuple6((j + 1), (acc._2 :+ toString((whp - curOrdAm))), (acc._3 + curOrdAm), acc._4, acc._5, acc._6)
332332 else if ((newOrdAm > 0))
333333 then if ((0 > curOrdAm))
334334 then {
335335 let amDiff = (newOrdAm + curOrdAm)
336336 $Tuple6((j + 1), (acc._2 :+ toString((whp - curOrdAm))), (acc._3 + amDiff), (acc._4 + newOrdUsd), acc._5, acc._6)
337337 }
338338 else $Tuple6((j + 1), (acc._2 :+ toString(whp)), ((acc._3 + newOrdAm) - curOrdAm), ((acc._4 + newOrdUsd) - curOrdUsd), acc._5, acc._6)
339339 else if ((0 > curOrdAm))
340340 then {
341341 let amDiff = (curOrdAm - newOrdAm)
342342 if ((0 > (whp - amDiff)))
343343 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whp)) + " available"))
344344 else $Tuple6((j + 1), (acc._2 :+ toString((whp - amDiff))), (acc._3 + amDiff), acc._4, acc._5, acc._6)
345345 }
346346 else if ((0 > (whp + newOrdAm)))
347347 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whp)) + " available"))
348348 else $Tuple6((j + 1), (acc._2 :+ toString((whp + newOrdAm))), ((acc._3 - newOrdAm) - curOrdAm), (acc._4 - curOrdUsd), acc._5, acc._6)
349349 }
350350 }
351351 }
352352
353353
354354 func acceptCommon (acc,bpOrdProdItem) = {
355355 let j = acc._7
356356 let bpOrdProdParts = split(bpOrdProdItem, "@")
357357 if ((size(bpOrdProdParts) != 2))
358358 then throw("Incorrect order format, should be amount@price")
359359 else {
360360 let bpOrdAm = parseIntValue(bpOrdProdParts[0])
361361 let bpOrdPr = parseIntValue(bpOrdProdParts[1])
362362 if ((0 > bpOrdPr))
363363 then throw("Price can't be negative")
364364 else {
365365 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
366366 let bpp = parseIntValue(acc._8[j])
367367 let whp = parseIntValue(acc._9[j])
368368 let whOrdParts = split(acc._10[j], "@")
369369 let whOrdAm = parseIntValue(whOrdParts[0])
370370 let whOrdPr = parseIntValue(whOrdParts[1])
371371 if (if ((bpOrdAm != 0))
372372 then (bpOrdPr != whOrdPr)
373373 else false)
374374 then throw(((((("Prices of " + prodTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
375375 else {
376376 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
377377 if ((bpOrdAm == 0))
378378 then $Tuple10((acc._1 :+ toString(whp)), (acc._2 :+ acc._10[j]), (acc._3 :+ toString(bpp)), acc._4, acc._5, acc._6, (acc._7 + 1), acc._8, acc._9, acc._10)
379379 else if ((bpOrdAm > 0))
380380 then if ((0 > whOrdAm))
381381 then if ((bpOrdAm > -(whOrdAm)))
382382 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + prodTypes[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
383383 else $Tuple10((acc._1 :+ toString(whp)), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpp + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd), (acc._7 + 1), acc._8, acc._9, acc._10)
384384 else throw((("Attempt to buy " + prodTypes[j]) + " while warehouse doesn't sell it"))
385385 else if ((whOrdAm > 0))
386386 then if ((-(bpOrdAm) > whOrdAm))
387387 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + prodTypes[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
388388 else if ((-(bpOrdAm) > bpp))
389389 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + toString(bpp)) + " of ") + prodTypes[j]))
390390 else $Tuple10((acc._1 :+ toString((whp - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpp + bpOrdAm))), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6, (acc._7 + 1), acc._8, acc._9, acc._10)
391391 else throw((("Attempt to sell " + prodTypes[j]) + " while warehouse doesn't buy it"))
392392 }
393393 }
394394 }
395395 }
396396
397397
398398 @Callable(i)
399399 func constructorV1 (restAddr) = if ((i.caller != this))
400400 then throw("Permission denied")
401401 else [StringEntry(keyRestAddress(), restAddr)]
402402
403403
404404
405405 @Callable(i)
406406 func sellResources (amounts,minPrices) = {
407407 let blocked = checkBlocked()
408408 if ((blocked == blocked))
409409 then {
410410 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
411411 if ((size(i.payments) != 0))
412412 then throw("sellResources doesn't require any payments")
413413 else {
414414 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
415415 if ((curLocation[locIdxType] != "F"))
416416 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
417417 else {
418418 let locId = curLocation[locIdxId]
419419 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
420420 let resList = split(currentPack[bpIdxRes], "_")
421421 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
422422 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
423423 else if ((0 > amounts[j]))
424424 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
425425 else if ((amounts[j] > 0))
426426 then {
427427 let b = sellInternal(locId, j, amounts[j], minPrices[j])
428428 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
429429 }
430430 else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
431431
432432 let merged = {
433433 let $l = [0, 1, 2, 3, 4, 5]
434434 let $s = size($l)
435435 let $acc0 = $Tuple3(nil, nil, 0)
436436 func $f0_1 ($a,$i) = if (($i >= $s))
437437 then $a
438438 else adder($a, $l[$i])
439439
440440 func $f0_2 ($a,$i) = if (($i >= $s))
441441 then $a
442442 else throw("List size exceeds 6")
443443
444444 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
445445 }
446446 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
447447 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
448448 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdtAssetId)), result)
449449 }
450450 }
451451 }
452452 else throw("Strict value is not equal to itself.")
453453 }
454454
455455
456456
457457 @Callable(i)
458458 func buyMaterials (amounts,maxPrices) = {
459459 let blocked = checkBlocked()
460460 if ((blocked == blocked))
461461 then {
462462 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
463463 if ((size(i.payments) != 1))
464464 then throw("exactly 1 payment must be attached")
465465 else {
466466 let pmt = i.payments[0]
467467 let amt = pmt.amount
468468 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
469469 if ((pmtAssetId != usdtAssetId))
470470 then throw("USDT payments only!")
471471 else {
472472 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
473473 if ((curLocation[locIdxType] != "F"))
474474 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
475475 else {
476476 let locId = curLocation[locIdxId]
477477 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
478478 let matList = split(currentPack[bpIdxMat], "_")
479479 func mUpdater (acc,j) = if ((0 > amounts[j]))
480480 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
481481 else if ((amounts[j] > 0))
482482 then {
483483 let b = buyInternal(locId, j, amounts[j], maxPrices[j])
484484 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
485485 }
486486 else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
487487
488488 let merged = {
489489 let $l = [0, 1, 2, 3, 4, 5]
490490 let $s = size($l)
491491 let $acc0 = $Tuple3(nil, nil, 0)
492492 func $f0_1 ($a,$i) = if (($i >= $s))
493493 then $a
494494 else mUpdater($a, $l[$i])
495495
496496 func $f0_2 ($a,$i) = if (($i >= $s))
497497 then $a
498498 else throw("List size exceeds 6")
499499
500500 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
501501 }
502502 if ((merged._3 > amt))
503503 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
504504 else {
505505 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
506506 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
507507 let rest = if (((amt - merged._3) > 0))
508508 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
509509 else nil
510510 $Tuple2((merged._1 ++ rest), result)
511511 }
512512 }
513513 }
514514 }
515515 }
516516 else throw("Strict value is not equal to itself.")
517517 }
518518
519519
520520
521521 @Callable(i)
522522 func exchangeResources (amounts) = {
523523 let blocked = checkBlocked()
524524 if ((blocked == blocked))
525525 then {
526526 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
527527 if ((size(i.payments) != 1))
528528 then throw("exactly 1 payment must be attached")
529529 else {
530530 let pmt = i.payments[0]
531531 let amt = pmt.amount
532532 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
533533 if ((pmtAssetId != usdtAssetId))
534534 then throw("USDT payments only!")
535535 else {
536536 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
537537 if ((curLocation[locIdxType] != "F"))
538538 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
539539 else {
540540 let locId = curLocation[locIdxId]
541541 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
542542 let resList = split(currentPack[bpIdxRes], "_")
543543 let matList = split(currentPack[bpIdxMat], "_")
544544 func exchanger (acc,j) = {
545545 let whKey = keyFactoryWarehouseByIdAndType(locId, j)
546546 let w0 = valueOrElse(getInteger(whKey), 0)
547547 let amj = amounts[j]
548548 if ((amj > parseIntValue(resList[j])))
549549 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
550550 else if ((0 > amj))
551551 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
552552 else if ((amj > 0))
553553 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)))
554554 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
555555 }
556556
557557 let merged = {
558558 let $l = [0, 1, 2, 3, 4, 5]
559559 let $s = size($l)
560560 let $acc0 = $Tuple4(nil, nil, 0, nil)
561561 func $f0_1 ($a,$i) = if (($i >= $s))
562562 then $a
563563 else exchanger($a, $l[$i])
564564
565565 func $f0_2 ($a,$i) = if (($i >= $s))
566566 then $a
567567 else throw("List size exceeds 6")
568568
569569 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
570570 }
571571 if ((merged._3 > amt))
572572 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
573573 else {
574574 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._1, "_"), makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
575575 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
576576 let rest = if (((amt - merged._3) > 0))
577577 then [ScriptTransfer(i.caller, (amt - merged._3), usdtAssetId)]
578578 else nil
579579 $Tuple2((rest ++ merged._4), result)
580580 }
581581 }
582582 }
583583 }
584584 }
585585 else throw("Strict value is not equal to itself.")
586586 }
587587
588588
589589
590590 @Callable(i)
591-func craftGoods (productIdx,level,quantity) = {
591+func craftGoods (productIdx,quantity) = {
592592 let blocked = checkBlocked()
593593 if ((blocked == blocked))
594594 then if ((size(i.payments) != 1))
595595 then throw("exactly 1 payment must be attached")
596596 else {
597597 let pmt = i.payments[0]
598598 let amt = pmt.amount
599599 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
600600 if ((pmtAssetId != usdtAssetId))
601601 then throw("USDT payments only!")
602602 else if ((amt != MULT6))
603603 then throw("exactly 1 USDT must be attached as payment")
604604 else if ((0 >= quantity))
605605 then throw("Quantity should be positive")
606606 else {
607607 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
608608 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
609609 if ((curLocation[locIdxType] != "M"))
610610 then throw(("Duck location type should be Manufacture, but is " + curLocation[locIdxType]))
611611 else {
612612 let cont = curLocation[locIdxContinent]
613613 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
614614 let matList = split(currentPack[bpIdxMat], "_")
615615 if (if ((0 > productIdx))
616616 then true
617617 else (productIdx >= size(productionMatrix)))
618618 then throw(("Unknown product idx=" + toString(productIdx)))
619619 else {
620620 let productContIdx = (productIdx % size(continents))
621621 if ((continents[productContIdx] != cont))
622622 then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
623623 else {
624624 let recipe = split(productionMatrix[productIdx], "_")
625625 if ((size(recipe) != (NUMRES + 2)))
626626 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
627627 else {
628628 let prodList = if ((currentPack[bpIdxProd] == ""))
629629 then nil
630630 else split(currentPack[bpIdxProd], "_")
631631 func filler (acc,ignoredItem) = {
632632 let n = acc._2
633- let x = if ((size(prodList) > n))
634- then split(prodList[n], ",")
635- else ["0", "0", "0"]
636- let x1s = x[0]
637- let x1 = parseIntValue(x1s)
638- let x2s = x[1]
639- let x2 = parseIntValue(x2s)
640- let x3s = x[2]
641- let x3 = parseIntValue(x3s)
633+ let xs = if ((size(prodList) > n))
634+ then prodList[n]
635+ else "0"
636+ let x = parseIntValue(xs)
642637 let amount = (quantity * parseIntValue(recipe[recipeIdxPacksize]))
643638 let y = if ((n == productIdx))
644- then match level {
645- case _ =>
646- if ((1 == $match0))
647- then ((((toString((x1 + amount)) + ",") + x2s) + ",") + x3s)
648- else if ((2 == $match0))
649- then ((((x1s + ",") + toString((x2 + amount))) + ",") + x3s)
650- else if ((3 == $match0))
651- then ((((x1s + ",") + x2s) + ",") + toString((x3 + amount)))
652- else throw(("Product level should be 1..3, not " + toString(level)))
653- }
654- else ((((x1s + ",") + x2s) + ",") + x3s)
639+ then toString((x + amount))
640+ else xs
655641 $Tuple2((acc._1 :+ y), (n + 1))
656642 }
657643
658644 let bpProd = ( let $l = productionMatrix
659645 let $s = size($l)
660646 let $acc0 = $Tuple2(nil, 0)
661647 func $f0_1 ($a,$i) = if (($i >= $s))
662648 then $a
663649 else filler($a, $l[$i])
664650
665651 func $f0_2 ($a,$i) = if (($i >= $s))
666652 then $a
667653 else throw("List size exceeds 50")
668654
669655 $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
670656 func producer (acc,j) = {
671- let needMat = (((parseIntValue(recipe[j]) * MULT7) * quantity) * level)
657+ let needMat = ((parseIntValue(recipe[j]) * MULT7) * quantity)
672658 let haveMat = parseIntValue(matList[j])
673659 if ((needMat > haveMat))
674660 then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity)))
675661 else if ((needMat > 0))
676662 then (acc :+ toString((haveMat - needMat)))
677663 else (acc :+ matList[j])
678664 }
679665
680666 let merged = {
681667 let $l = [0, 1, 2, 3, 4, 5]
682668 let $s = size($l)
683669 let $acc0 = nil
684670 func $f1_1 ($a,$i) = if (($i >= $s))
685671 then $a
686672 else producer($a, $l[$i])
687673
688674 func $f1_2 ($a,$i) = if (($i >= $s))
689675 then $a
690676 else throw("List size exceeds 6")
691677
692678 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
693679 }
694680 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged, "_"), makeString(bpProd, "_")], ":")
695681 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
696682 $Tuple2(nil, result)
697683 }
698684 }
699685 }
700686 }
701687 }
702688 }
703689 else throw("Strict value is not equal to itself.")
704690 }
705691
706692
707693
708694 @Callable(i)
709695 func setWarehouseOrder (cargoListStr,landAssetId) = {
710696 let user = i.originCaller
711697 let addr = toString(user)
712698 let result = if ((user != restContract))
713699 then checkBlocked()
714700 else false
715701 let asset = value(assetInfo(fromBase58String(landAssetId)))
716702 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
717703 then throw((("NFT " + asset.name) + " is not staked"))
718704 else {
719705 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
720706 if (if ((user != restContract))
721707 then (owner != addr)
722708 else false)
723709 then throw((LANDPREFIX + " is not yours"))
724710 else {
725711 let cargoParts = split_4C(cargoListStr, ":")
726712 if ((size(cargoParts) != 3))
727713 then throw("cargoListStr should contain exactly 2 ':' separators")
728714 else {
729715 let resParts = split(cargoParts[0], "_")
730716 let matParts = split(cargoParts[1], "_")
731717 let prodParts = if ((cargoParts[2] == ""))
732718 then nil
733719 else split(cargoParts[2], "_")
734720 if ((size(resParts) != NUMRES))
735721 then throw("All 6 resources should be passed")
736722 else if ((size(matParts) != NUMRES))
737723 then throw("All 6 materials should be passed")
738724 else {
739725 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
740726 let currentWh = split_4C(wh, ":")
741727 let currWhRes = split(currentWh[whIdxRes], "_")
742728 let currWhMat = split(currentWh[whIdxMat], "_")
743729 let currWhProd = if ((currentWh[whIdxProd] == ""))
744730 then nil
745731 else split(currentWh[whIdxProd], "_")
746732 let whVol = getWarehouseVolume(currentWh[whIdxVol])
747733 let ordKey = keyOrderByLand(landAssetId)
748734 let currentOrd = getOrder(ordKey)
749735 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
750736 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
751737 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
752738 then nil
753739 else split(currentOrd[ordIdxProd], "_")
754740 let usdtNeed2Lock = 0
755741 let r = {
756742 let $l = resParts
757743 let $s = size($l)
758744 let $acc0 = $Tuple6(0, nil, 0, 0, currWhRes, currentOrdRes)
759745 func $f0_1 ($a,$i) = if (($i >= $s))
760746 then $a
761747 else setCommon($a, $l[$i])
762748
763749 func $f0_2 ($a,$i) = if (($i >= $s))
764750 then $a
765751 else throw("List size exceeds 6")
766752
767753 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
768754 }
769755 let m = {
770756 let $l = matParts
771757 let $s = size($l)
772758 let $acc0 = $Tuple6(0, nil, r._3, r._4, currWhMat, currentOrdMat)
773759 func $f1_1 ($a,$i) = if (($i >= $s))
774760 then $a
775761 else setCommon($a, $l[$i])
776762
777763 func $f1_2 ($a,$i) = if (($i >= $s))
778764 then $a
779765 else throw("List size exceeds 6")
780766
781767 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
782768 }
783769 let p = {
784770 let $l = prodParts
785771 let $s = size($l)
786772 let $acc0 = $Tuple6(0, nil, m._3, m._4, currWhProd, currentOrdProd)
787773 func $f2_1 ($a,$i) = if (($i >= $s))
788774 then $a
789775 else setCommon($a, $l[$i])
790776
791777 func $f2_2 ($a,$i) = if (($i >= $s))
792778 then $a
793779 else throw("List size exceeds 50")
794780
795781 $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)
796782 }
797783 let volSaldo = p._3
798784 if ((volSaldo > whVol))
799785 then throw((((("Attempt to reserve " + toString(volSaldo)) + " space, but only ") + toString(whVol)) + " warehouse space left"))
800786 else {
801787 let whStr = makeString_2C([currentWh[whIdxVol], makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_"), toString(volSaldo)], ":")
802788 let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
803789 if ((whSave == whSave))
804790 then {
805791 let usdSaldo = p._4
806792 let actions = if ((usdSaldo > 0))
807793 then if ((size(i.payments) != 1))
808794 then throw("exactly 1 payment must be attached")
809795 else {
810796 let pmt = i.payments[0]
811797 let amt = pmt.amount
812798 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
813799 if ((pmtAssetId != usdtAssetId))
814800 then throw("USDT payments only!")
815801 else if ((amt != usdSaldo))
816802 then throw(("Payment needed is " + toString(usdSaldo)))
817803 else [StringEntry(ordKey, cargoListStr)]
818804 }
819805 else if ((usdSaldo == 0))
820806 then if ((size(i.payments) != 0))
821807 then throw("No payments needed")
822808 else [StringEntry(ordKey, cargoListStr)]
823809 else if ((size(i.payments) != 0))
824810 then throw("No payments needed")
825811 else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, cargoListStr)]
826812 $Tuple2(actions, result)
827813 }
828814 else throw("Strict value is not equal to itself.")
829815 }
830816 }
831817 }
832818 }
833819 }
834820 }
835821
836822
837823
838824 @Callable(i)
839825 func acceptWarehouseOrder (bpOrderStr,landAssetId,duckAssetId) = {
840826 let blocked = checkBlocked()
841827 if ((blocked == blocked))
842828 then {
843829 let caller = i.originCaller
844830 let callerAddr = toString(caller)
845831 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
846832 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
847833 let loc = split(value(curLocation), "_")
848834 if ((loc[locIdxType] != "L"))
849835 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
850836 else if ((stakedDuckAssetId != duckAssetId))
851837 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
852838 else {
853839 let landAsset = value(assetInfo(fromBase58String(landAssetId)))
854840 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
855841 then throw((("NFT " + landAsset.name) + " is not staked"))
856842 else {
857843 let landOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
858844 if ((landOwner == callerAddr))
859845 then throw("You cannot trade with yourself")
860846 else {
861847 let bpOrderParts = split_4C(bpOrderStr, ":")
862848 if ((size(bpOrderParts) != 3))
863849 then throw("bpOrderStr should contain exactly 2 ':' separators")
864850 else {
865851 let bpOrdRes = split(bpOrderParts[0], "_")
866852 let bpOrdMat = split(bpOrderParts[1], "_")
867853 let bpOrdProd = if ((bpOrderParts[2] == ""))
868854 then nil
869855 else split(bpOrderParts[2], "_")
870856 if ((size(bpOrdRes) != NUMRES))
871857 then throw("All 6 resources should be passed")
872858 else if ((size(bpOrdMat) != NUMRES))
873859 then throw("All 6 materials should be passed")
874860 else {
875861 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
876862 let currentWh = split_4C(wh, ":")
877863 let currWhRes = split(currentWh[whIdxRes], "_")
878864 let currWhMat = split(currentWh[whIdxMat], "_")
879865 let currWhProd = if ((currentWh[whIdxProd] == ""))
880866 then nil
881867 else split(currentWh[whIdxProd], "_")
882868 let currWhResVol = getWarehouseCurrResVolume(currentWh)
883869 let currWhMatVol = getWarehouseCurrMatVolume(currentWh)
884870 let currWhGoodsVol = getWarehouseCurrGoodsVolume(currentWh)
885871 let currWhLockedVol = parseIntValue(currentWh[whIdxLockedVol])
886872 let whSpaceLeft = ((((getWarehouseVolume(currentWh[whIdxVol]) - currWhResVol) - currWhMatVol) - currWhGoodsVol) - currWhLockedVol)
887873 let bpKey = keyBackpackByDuck(duckAssetId)
888874 let currentPack = getBackpack(bpKey)
889875 let bpResList = split(currentPack[bpIdxRes], "_")
890876 let bpMatList = split(currentPack[bpIdxMat], "_")
891877 let bpProdList = if ((currentPack[bpIdxProd] == ""))
892878 then nil
893879 else split(currentPack[bpIdxProd], "_")
894880 let ordKey = keyOrderByLand(landAssetId)
895881 let whOrd = getOrder(ordKey)
896882 let whOrdRes = split(whOrd[ordIdxRes], "_")
897883 let whOrdMat = split(whOrd[ordIdxMat], "_")
898884 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
899885 then nil
900886 else split(whOrd[ordIdxProd], "_")
901887 let usdtNeed2Lock = 0
902888 let r = {
903889 let $l = bpOrdRes
904890 let $s = size($l)
905891 let $acc0 = $Tuple10(nil, nil, nil, 0, 0, 0, 0, bpResList, currWhRes, whOrdRes)
906892 func $f0_1 ($a,$i) = if (($i >= $s))
907893 then $a
908894 else acceptCommon($a, $l[$i])
909895
910896 func $f0_2 ($a,$i) = if (($i >= $s))
911897 then $a
912898 else throw("List size exceeds 6")
913899
914900 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
915901 }
916902 let m = {
917903 let $l = bpOrdMat
918904 let $s = size($l)
919905 let $acc0 = $Tuple10(nil, nil, nil, r._4, r._5, r._6, 0, bpMatList, currWhMat, whOrdMat)
920906 func $f1_1 ($a,$i) = if (($i >= $s))
921907 then $a
922908 else acceptCommon($a, $l[$i])
923909
924910 func $f1_2 ($a,$i) = if (($i >= $s))
925911 then $a
926912 else throw("List size exceeds 6")
927913
928914 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
929915 }
930916 let p = {
931917 let $l = bpOrdProd
932918 let $s = size($l)
933919 let $acc0 = $Tuple10(nil, nil, nil, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd)
934920 func $f2_1 ($a,$i) = if (($i >= $s))
935921 then $a
936922 else acceptCommon($a, $l[$i])
937923
938924 func $f2_2 ($a,$i) = if (($i >= $s))
939925 then $a
940926 else throw("List size exceeds 50")
941927
942928 $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)
943929 }
944930 let volSaldo = p._4
945931 let newLockedVol = if ((0 > (currWhLockedVol - volSaldo)))
946932 then 0
947933 else (currWhLockedVol - volSaldo)
948934 let whStr = makeString_2C([currentWh[whIdxVol], makeString(r._1, "_"), makeString(m._1, "_"), makeString(p._1, "_"), toString(newLockedVol)], ":")
949935 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_")], ":")
950936 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(r._3, "_"), makeString(m._3, "_"), makeString(p._3, "_")], ":")
951937 let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
952938 if ((whSave == whSave))
953939 then {
954940 let bpSave = invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil)
955941 if ((bpSave == bpSave))
956942 then {
957943 let actions = [StringEntry(ordKey, newWhOrdStr)]
958944 let usdWh2BpSaldo = p._5
959945 let actions1 = if ((usdWh2BpSaldo > 0))
960946 then {
961947 let usdWh2BpFee = fraction(p._5, AUCTIONFEE, MULT6)
962948 let refByKey = keyAddressRefBy(callerAddr)
963949 let refBy = getString(stakingContract, refByKey)
964950 if (isDefined(refBy))
965951 then (((actions :+ ScriptTransfer(caller, (p._5 - (3 * usdWh2BpFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId)) :+ ScriptTransfer(addressFromStringValue(value(refBy)), usdWh2BpFee, usdtAssetId))
966952 else ((actions :+ ScriptTransfer(caller, (p._5 - (3 * usdWh2BpFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId))
967953 }
968954 else actions
969955 let usdBp2WhSaldo = p._6
970956 if ((usdBp2WhSaldo > 0))
971957 then if ((size(i.payments) != 1))
972958 then throw("exactly 1 payment must be attached")
973959 else {
974960 let pmt = i.payments[0]
975961 let amt = pmt.amount
976962 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
977963 if ((pmtAssetId != usdtAssetId))
978964 then throw("USDT payments only!")
979965 else if ((amt != usdBp2WhSaldo))
980966 then throw(("Payment needed is " + toString(usdBp2WhSaldo)))
981967 else if ((MINSHOPPAYMENT > amt))
982968 then throw(("Payment should be at least " + toString(MINSHOPPAYMENT)))
983969 else {
984970 let usdBp2WhFee = fraction(p._6, AUCTIONFEE, MULT6)
985971 let refByKey = keyAddressRefBy(landOwner)
986972 let refBy = getString(stakingContract, refByKey)
987973 if (isDefined(refBy))
988974 then (((actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId)) :+ ScriptTransfer(addressFromStringValue(value(refBy)), usdBp2WhFee, usdtAssetId))
989975 else ((actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId))
990976 }
991977 }
992978 else if ((size(i.payments) != 0))
993979 then throw("No payments needed")
994980 else actions1
995981 }
996982 else throw("Strict value is not equal to itself.")
997983 }
998984 else throw("Strict value is not equal to itself.")
999985 }
1000986 }
1001987 }
1002988 }
1003989 }
1004990 }
1005991 else throw("Strict value is not equal to itself.")
1006992 }
1007993
1008994

github/deemru/w8io/3ef1775 
200.11 ms