tx · 7ALzi2wC8GDNAAek1dKHzwo6FJH5MbWWw29m4W4GqJKg

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.06300000 Waves

2023.10.18 15:03 [2804014] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "7ALzi2wC8GDNAAek1dKHzwo6FJH5MbWWw29m4W4GqJKg", "fee": 6300000, "feeAssetId": null, "timestamp": 1697630599159, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "3nxZMiwPaRF3JWxdD45VufmNVd1d3yJNxPc5iDs3KA6Kk5Eig78KLCLSWTZidmFfjnzs3F2U3TYSQQPYvYccCGV5" ], "script": "base64:BgKVAQgCEgQKAggYEgMKAQgSBAoCERESBAoCCAESAwoBARIFCgMREQgSBgoEEREICBIECgIRERIFCgMREQgSBgoEEREICBIDCgEREgMKARESBAoCEQgSBAoCAQESBQoDAQEIEgYKBAEBCAgSBAoCCAgSBQoDCAgIEgQKAggIEgUKAwgICBIDCgEREgMKAQgSAwoBARIDCgEIagAHeHBUcmFkZQCQTgAHeHBDcmFmdACQTgAKeHBTZWxsVG9FcwCQTgAGeHBTaG9wAJBOAApMQU5EUFJFRklYAgRMQU5EAAZOVU1SRVMABgAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EAEFJFU09VUkNFUFJJQ0VNSU4A1bUCAA1FU01BWFBBQ0tBR0VTAAoACUVTQlVZQ09FRgAEABVNSU5fVVNEVF9GRUVfREVMSVZFUlkA0IYDABdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQD4yQQAD0NSQUZUX1VTRFRfQ09TVADAhD0AFENSQUZUX0RFTElWRVJZX0NPRUZGAAoAFVVTRFQyQUNSRVNfTVVMVElQTElFUgAKAAhyZXNUeXBlcwkAzAgCAgNPaWwJAMwIAgIDT3JlCQDMCAICBFdvb2QJAMwIAgIEU2FuZAkAzAgCAgRDbGF5CQDMCAICB09yZ2FuaWMFA25pbAAIbWF0VHlwZXMJAMwIAgIERnVlbAkAzAgCAgVNZXRhbAkAzAgCAgVQbGFuawkAzAgCAgVHbGFzcwkAzAgCAgdQbGFzdGljCQDMCAICB1Byb3RlaW4FA25pbAAJcHJvZFR5cGVzCQDMCAICEEZpcnN0IEFpZCBLaXQgTDEJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMgkAzAgCAhBGaXJzdCBBaWQgS2l0IEwzCQDMCAICC0JhY2twYWNrIEwxCQDMCAICC0JhY2twYWNrIEwyCQDMCAICC0JhY2twYWNrIEwzCQDMCAICDkZvb2QgUmF0aW9uIEwxCQDMCAICDkZvb2QgUmF0aW9uIEwyCQDMCAICDkZvb2QgUmF0aW9uIEwzCQDMCAICC0pldCBQYWNrIEwxCQDMCAICC0pldCBQYWNrIEwyCQDMCAICC0pldCBQYWNrIEwzCQDMCAICCVNoaWVsZCBMMQkAzAgCAglTaGllbGQgTDIJAMwIAgIJU2hpZWxkIEwzCQDMCAICB01pbmUgTDEJAMwIAgIHTWluZSBMMgkAzAgCAgdNaW5lIEwzCQDMCAICB1RyYXAgTDEJAMwIAgIHVHJhcCBMMgkAzAgCAgdUcmFwIEwzBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAAJQ09FRkYyTUFUAICt4gQAEHByb2R1Y3Rpb25NYXRyaXgJAMwIAgIlOF84XzhfMTdfMTdfNDJfMTJfMF8zMF8wLDAsMCwwLDAsMCwwXwkAzAgCAiU4XzhfOF8xN18xN180Ml8yNF8wXzYwXzAsMCw1LDIsMCwwLDBfCQDMCAICJzhfOF84XzE3XzE3XzQyXzM2XzBfMTIwXzAsMCwxMCw0LDAsMCwwXwkAzAgCAik4XzE5XzE5XzhfMjdfMTlfMjZfMV8yMF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNTJfMV80MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNzhfMV84MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAiU4XzhfOF84XzhfNjBfMTNfMl8yXzAsMCwwLDAsMCwwLDBfMDExCQDMCAICJThfOF84XzhfOF82MF8yNl8yXzRfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzM5XzJfOF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfMzBfM18zMF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfNjBfM181MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfOTBfM183MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8xMV80XzEwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzIyXzRfMjBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMzNfNF8zMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAio0XzEzXzIyXzRfMzVfMjJfMjNfMF81MCwxLDBfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNF8xM18yMl80XzM1XzIyXzQ2XzBfNTAsMSwxXzAsMiw1LDAsMCwwLDBfCQDMCAICKzRfMTNfMjJfNF8zNV8yMl82OV8wXzUwLDIsMV8wLDUsMTAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzIwXzFfMzAsMSwxXzAsMCwwLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV80MF8xXzMwLDEsMl8yLDEsMywwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfNjBfMV8zMCwxLDNfNSwyLDgsMCwwLDAsMF8FA25pbAAJcklkeENvZWZmAAYADXJJZHhDb250aW5lbnQABwAKUkVDSVBFU0laRQALAA5QUk9EVUNUUEtHU0laRQAKAAt3aElkeExldmVscwAAAAh3aElkeFJlcwABAAh3aElkeE1hdAACAAl3aElkeFByb2QAAwAJd2hJZHhMT0ZUAAQACXZvbExvY2tlZAAAAAh2b2xUb3RhbAADAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIDbm9fBQdhc3NldElkARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQdhc3NldElkCQCsAgICA3N0XwUHYXNzZXRJZAEPa2V5QWRkcmVzc1JlZkJ5AQRhZGRyCQCsAgICCWFjY1JlZkJ5XwUEYWRkcgEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBDmtleU9yZGVyQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAgpsYW5kT3JkZXJfBQtsYW5kQXNzZXRJZAEOa2V5RXNXYXJlaG91c2UAAhplbWVyZ2VuY3lXYXJlaG91c2VQcm9kdWN0cwAPZGVsaXZlcnlGdW5kS2V5AgxkZWxpdmVyeUZ1bmQAEWRlbGl2ZXJ5TG9ja2VkS2V5Ag5kZWxpdmVyeUxvY2tlZAESZ2V0UmVjaXBlTWF0ZXJpYWxzAQZyZWNpcGUJAGgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBQlySWR4Q29lZmYFCUNPRUZGMk1BVAARS1NfQUxMT1dfREVMSVZFUlkGAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ1AKCNBgAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAZNVUxUMTAAgMivoCUADk1JTlNIT1BQQVlNRU5UAKCNBgAFSVRFUjYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEAFElkeENmZ0ludmVzdEZ1bmREYXBwAAYAD0lkeENmZ0FjcmVzRGFwcAAIAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIHcmVzdENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFB3Jlc3RDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwABJpbnZlc3RGdW5kQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkAQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAATRkFDVE9SWU1BWFdBUkVIT1VTRQCAyK+gJQAOU0VMTE1VTFRJUExJRVIAyAEADUJVWU1VTFRJUExJRVIArAIACkFVQ1RJT05GRUUAkE4ADERFTElWRVJZX0ZFRQCQTgAOREVMSVZFUllfRkVFMTUAmHUBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIJZmFjdG9yeUlkB3Jlc1R5cGUJAKwCAgkArAICCQCsAgICG2ZhY3RvcnlXaEJ5Q29udGluZW50QW5kUmVzXwUJZmFjdG9yeUlkAgFfCQCkAwEFB3Jlc1R5cGUACW9yZElkeFJlcwAAAAlvcmRJZHhNYXQAAQAKb3JkSWR4UHJvZAACAQhnZXRPcmRlcgEGb3JkS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUGb3JkS2V5AjAwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDowQDBfMEAwXzBAMF8wQDBfMEAwXzBAMDoCAToJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQlvcmRJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQlvcmRJZHhSZXMCFzBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUJb3JkSWR4TWF0AgFfBQZOVU1SRVMJAJEDAgUBcAUJb3JkSWR4TWF0AhcwQDBfMEAwXzBAMF8wQDBfMEAwXzBAMAkAzAgCCQCRAwIFAXAFCm9yZElkeFByb2QFA25pbAEIdG9Wb2x1bWUDBmFtb3VudAdwa2dTaXplCWlzUHJvZHVjdAMFCWlzUHJvZHVjdAQEcGtncwMJAGcCBQZhbW91bnQAAAkAaQIJAGUCCQBkAgUGYW1vdW50BQdwa2dTaXplAAEFB3BrZ1NpemUJAQEtAQkAaQIJAGUCCQBkAgkBAS0BBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkAaAIFBHBrZ3MFBU1VTFQ4BQZhbW91bnQBDHNlbGxJbnRlcm5hbAQFbG9jSWQHcmVzVHlwZQZhbW91bnQIbWluUHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB3Jlc1R5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAnIwAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFAAADCQBmAgkAZAIFAncwBQZhbW91bnQFE0ZBQ1RPUllNQVhXQVJFSE9VU0UJAGUCBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQJ3MAUGYW1vdW50BAx1c2R0UmVjZWl2ZWQJAGQCCQBrAwUCcjAJAGUCCQBoAgUOU0VMTE1VTFRJUExJRVIFEFJFU09VUkNFUFJJQ0VNSU4JAGsDCQBkAgkAaAIAZAUCdzAJAGgCADIFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQZNVUxUMTAJAGsDCQBlAgUGYW1vdW50BQJyMAUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgEBW1pbjk5CQBlAgUIbWluUHJpY2UJAGkCBQhtaW5QcmljZQBkAwkAZgIJAGgCBQVtaW45OQUGYW1vdW50CQBoAgUMdXNkdFJlY2VpdmVkBQVNVUxUOAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQWN0dWFsIHByaWNlID0gCQCkAwEFDHVzZHRSZWNlaXZlZAIDIC8gCQCkAwEFBmFtb3VudAIOIDwgbWluUHJpY2UgPSAJAKQDAQUIbWluUHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCHJlc1R5cGVzBQdyZXNUeXBlAgEpCQCUCgIJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZAIFAncwBQZhbW91bnQFDHVzZHRSZWNlaXZlZAELYnV5SW50ZXJuYWwEBWxvY0lkB21hdFR5cGUGYW1vdW50CG1heFByaWNlBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQdtYXRUeXBlBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABAJtMQMJAGYCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAlwMBCQDMCAIFBmFtb3VudAkAzAgCCQBlAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFA25pbAAABAJtMAkAlwMBCQDMCAIFAncwCQDMCAIJAGUCBQZhbW91bnQFAm0xBQNuaWwEAW0JAGQCBQJtMAUCbTEEBXcwbWluCQCXAwEJAMwIAgUCdzAJAMwIAgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUDbmlsBAl1c2R0U3BlbnQJAGQCCQBrAwUCbTAJAGUCCQBoAgUNQlVZTVVMVElQTElFUgUQUkVTT1VSQ0VQUklDRU1JTgkAawMJAGUCCQBoAgBkBQV3MG1pbgkAaAIAMgUCbTAFEFJFU09VUkNFUFJJQ0VNSU4FE0ZBQ1RPUllNQVhXQVJFSE9VU0UFBk1VTFQxMAkAawMFAm0xCQBoAgACBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAQGbWF4MTAxCQBkAgUIbWF4UHJpY2UJAGkCBQhtYXhQcmljZQBkAwkAZgIJAGgCBQl1c2R0U3BlbnQFBU1VTFQ4CQBoAgUGbWF4MTAxBQFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BY3R1YWwgcHJpY2UgPSAJAKQDAQUJdXNkdFNwZW50AgMgLyAJAKQDAQUBbQIOID4gbWF4UHJpY2UgPSAJAKQDAQUIbWF4UHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCG1hdFR5cGVzBQdtYXRUeXBlAgEpCQCVCgMJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZQIFAncwBQFtBQl1c2R0U3BlbnQFAW0BC2dldEJhY2twYWNrAQVicEtleQQBcAkAvAkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAUFYnBLZXkCGjA6MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6AgE6CQDMCAIJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIFAXAFCmJwSWR4TGV2ZWwAAAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCGJwSWR4UmVzAgFfBQZOVU1SRVMJAJEDAgUBcAUIYnBJZHhSZXMCCzBfMF8wXzBfMF8wCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeE1hdAILMF8wXzBfMF8wXzAJAMwIAgkAkQMCBQFwBQlicElkeFByb2QFA25pbAEMY2hlY2tCbG9ja2VkAAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPc3Rha2luZ0NvbnRyYWN0CQEKa2V5QmxvY2tlZAAHCQACAQIfQ29udHJhY3RzIGFyZSB1bmRlciBtYWludGVuYW5jZQUEdW5pdAEGcHJvbG9nAAkBBWFzSW50AQkA/QcEBQ9zdGFraW5nQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsAQlzZXRDb21tb24CA2FjYw9pZ25vcmVkSXRlcmF0b3IEAWoIBQNhY2MCXzEEBGl0ZW0DCQBmAgkAkAMBCAUDYWNjA18xMAUBagkAkQMCCAUDYWNjA18xMAUBagIDMEAwBAZpc1Byb2QIBQNhY2MCXzgECWl0ZW1QYXJ0cwkAtQkCBQRpdGVtAgFAAwkBAiE9AgkAkAMBBQlpdGVtUGFydHMAAgkAAgECLkluY29ycmVjdCBvcmRlciBmb3JtYXQsIHNob3VsZCBiZSBhbW91bnRAcHJpY2UECG5ld09yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAAECG5ld09yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJaXRlbVBhcnRzAAEECW5ld09yZFVzZAMFBmlzUHJvZAkAaAIFCG5ld09yZEFtBQhuZXdPcmRQcgkAawMFCG5ld09yZEFtBQhuZXdPcmRQcgUFTVVMVDgECW5ld09yZFZvbAkBCHRvVm9sdW1lAwUIbmV3T3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QEBndoSW5pdAMJAGYCCQCQAwEIBQNhY2MCXzYFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCCAUDYWNjAl82BQFqAAAEC2N1ck9yZFBhcnRzCQC1CQIDCQBmAgkAkAMBCAUDYWNjAl83BQFqCQCRAwIIBQNhY2MCXzcFAWoCAzBAMAIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDAwkAZgIAAAUIY3VyT3JkUHIGCQBmAgAABQhuZXdPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QDBQZpc1Byb2QJAGgCBQhjdXJPcmRBbQUIY3VyT3JkUHIJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAnAoKCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUGd2hJbml0CAUDYWNjAl8zCAUDYWNjAl80CQBlAggFA2FjYwJfNQUJY3VyT3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAGQCCAUDYWNjAl85CQEIdG9Wb2x1bWUDBQZ3aEluaXQFDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwCQCcCgoJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgUGd2hJbml0BQhjdXJPcmRBbQgFA2FjYwJfMwgFA2FjYwJfNAgFA2FjYwJfNQgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQBkAggFA2FjYwJfOQkBCHRvVm9sdW1lAwkAZQIFBndoSW5pdAUIY3VyT3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwAwkAZgIFCG5ld09yZEFtAAADCQBmAgAABQhjdXJPcmRBbQkAnAoKCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFBndoSW5pdAUIY3VyT3JkQW0JAGQCCAUDYWNjAl8zBQluZXdPcmRWb2wIBQNhY2MCXzQJAGQCCAUDYWNjAl81BQluZXdPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwkAZQIFBndoSW5pdAUIY3VyT3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwCQCcCgoJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQZ3aEluaXQJAGQCCAUDYWNjAl8zBQluZXdPcmRWb2wIBQNhY2MCXzQJAGUCCQBkAggFA2FjYwJfNQUJbmV3T3JkVXNkBQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwUGd2hJbml0BQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kCAUDYWNjA18xMAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGUCBQhjdXJPcmRBbQUIbmV3T3JkQW0DCQBmAgAACQBlAgUGd2hJbml0BQZhbURpZmYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQUGYW1EaWZmAhogZnJvbSB3YXJlaG91c2UsIGJ1dCBvbmx5IAkApAMBBQZ3aEluaXQCCiBhdmFpbGFibGUJAJwKCgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFBmFtRGlmZggFA2FjYwJfMwkAZQIIBQNhY2MCXzQFCW5ld09yZFZvbAgFA2FjYwJfNQgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQEIdG9Wb2x1bWUDCQBlAgUGd2hJbml0BQZhbURpZmYFDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwAwkAZgIAAAkAZAIFBndoSW5pdAUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQkBAS0BBQhuZXdPcmRBbQIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUGd2hJbml0AgogYXZhaWxhYmxlCQCcCgoJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUGd2hJbml0BQhuZXdPcmRBbQgFA2FjYwJfMwkAZQIIBQNhY2MCXzQFCW5ld09yZFZvbAkAZQIIBQNhY2MCXzUFCWN1ck9yZFVzZAgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQEIdG9Wb2x1bWUDCQBkAgUGd2hJbml0BQhuZXdPcmRBbQUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAgFA2FjYwNfMTABC3NldEludGVybmFsAwljdXJyZW50V2gKY3VycmVudE9yZAZuZXdPcmQECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQNY3VycmVudE9yZFJlcwkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeFJlcwIBXwQNY3VycmVudE9yZE1hdAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeE1hdAIBXwQOY3VycmVudE9yZFByb2QDCQAAAgkAkQMCBQpjdXJyZW50T3JkBQpvcmRJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFCmN1cnJlbnRPcmQFCm9yZElkeFByb2QCAV8DCQECIT0CCQCQAwEFBm5ld09yZAADCQACAQIzbmV3T3JkZXJTdHIgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSAyICc6JyBzZXBhcmF0b3JzBAhyZXNQYXJ0cwkAtQkCCQCRAwIFBm5ld09yZAAAAgFfBAhtYXRQYXJ0cwkAtQkCCQCRAwIFBm5ld09yZAABAgFfBAlwcm9kUGFydHMDCQAAAgkAkQMCBQZuZXdPcmQAAgIABQNuaWwJALwJAgkAkQMCBQZuZXdPcmQAAgIBXwMJAQIhPQIJAJADAQUIcmVzUGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkAwkBAiE9AgkAkAMBBQhtYXRQYXJ0cwUGTlVNUkVTCQACAQIgQWxsIDYgbWF0ZXJpYWxzIHNob3VsZCBiZSBwYXNzZWQEAXIKAAIkbAUIcmVzVHlwZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCcCgoAAAUDbmlsAAAAAAAABQljdXJyV2hSZXMFDWN1cnJlbnRPcmRSZXMHAAAFCHJlc1BhcnRzCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlzZXRDb21tb24CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYEAW0KAAIkbAUIbWF0VHlwZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCcCgoAAAUDbmlsCAUBcgJfMwgFAXICXzQIBQFyAl81BQljdXJyV2hNYXQFDWN1cnJlbnRPcmRNYXQHCAUBcgJfOQUIbWF0UGFydHMKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCXNldENvbW1vbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQBcAoAAiRsBQlwcm9kVHlwZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCcCgoAAAUDbmlsCAUBbQJfMwgFAW0CXzQIBQFtAl81BQpjdXJyV2hQcm9kBQ5jdXJyZW50T3JkUHJvZAYIBQFtAl85BQlwcm9kUGFydHMKAQUkZjJfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCXNldENvbW1vbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMl8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjJfMgIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyCQCZCgcIBQFyAl8yCAUBbQJfMggFAXACXzIIBQFwAl8zCAUBcAJfNAgFAXACXzUIBQFwAl85AQxhY2NlcHRDb21tb24CA2FjYwlicE9yZEl0ZW0EAWoIBQNhY2MCXzcEBmlzUHJvZAgFA2FjYwNfMTIECmJwT3JkUGFydHMJALUJAgUJYnBPcmRJdGVtAgFAAwkBAiE9AgkAkAMBBQpicE9yZFBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAdicE9yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYnBPcmRQYXJ0cwAABAdicE9yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYnBPcmRQYXJ0cwABAwkAZgIAAAUHYnBPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAhicE9yZFVzZAMFBmlzUHJvZAkAaAIFB2JwT3JkQW0FB2JwT3JkUHIJAGsDBQdicE9yZEFtBQdicE9yZFByBQVNVUxUOAQGYnBJbml0AwkAZgIJAJADAQgFA2FjYwJfOAUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzgFAWoAAAQGd2hJbml0AwkAZgIJAJADAQgFA2FjYwJfOQUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzkFAWoAAAQJd2hPcmRJbml0AwkAZgIJAJADAQgFA2FjYwNfMTAFAWoJAJEDAggFA2FjYwNfMTAFAWoCAzBAMAQKd2hPcmRQYXJ0cwkAtQkCBQl3aE9yZEluaXQCAUAEB3doT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAAEB3doT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAEDAwkBAiE9AgUHYnBPcmRBbQAACQECIT0CBQdicE9yZFByBQd3aE9yZFByBwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgpQcmljZXMgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhcgZG9uJ3QgbWF0Y2ghIFdIIHByaWNlPQkApAMBBQd3aE9yZFByAg0sIHlvdXIgcHJpY2U9CQCkAwEFB2JwT3JkUHIECHdoT3JkVXNkAwUGaXNQcm9kCQBoAgUHd2hPcmRBbQUHd2hPcmRQcgkAawMFB3doT3JkQW0FB3doT3JkUHIFBU1VTFQ4BAhkZWx0YVZvbAkBCHRvVm9sdW1lAwUHYnBPcmRBbQUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAMJAAACBQdicE9yZEFtAAAJAJ8KDQkAzQgCCAUDYWNjAl8xCQCkAwEFBndoSW5pdAkAzQgCCAUDYWNjAl8yBQl3aE9yZEluaXQJAM0IAggFA2FjYwJfMwkApAMBBQZicEluaXQIBQNhY2MCXzQIBQNhY2MCXzUIBQNhY2MCXzYJAGQCCAUDYWNjAl83AAEIBQNhY2MCXzgIBQNhY2MCXzkIBQNhY2MDXzEwCAUDYWNjA18xMQUGaXNQcm9kCAUDYWNjA18xMwMJAGYCBQdicE9yZEFtAAADCQBmAgAABQd3aE9yZEFtAwkAZgIFB2JwT3JkQW0JAQEtAQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAKQDAQUHYnBPcmRBbQIEIG9mIAkAkQMCCAUDYWNjA18xMQUBagIbLCBidXQgd2FyZWhvdXNlIG9ubHkgc2VsbHMgCQCkAwEJAQEtAQUHd2hPcmRBbQkAnwoNCQDNCAIIBQNhY2MCXzEJAKQDAQUGd2hJbml0CQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwkApAMBCQBkAgUGYnBJbml0BQdicE9yZEFtCQBkAggFA2FjYwJfNAUIZGVsdGFWb2wIBQNhY2MCXzUJAGQCCAUDYWNjAl82BQhicE9yZFVzZAkAZAIIBQNhY2MCXzcAAQgFA2FjYwJfOAgFA2FjYwJfOQgFA2FjYwNfMTAIBQNhY2MDXzExBQZpc1Byb2QJAGQCCAUDYWNjA18xMwMFBmlzUHJvZAkAaAIFB2JwT3JkQW0FBU1VTFQ4BQdicE9yZEFtCQACAQkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkAkQMCCAUDYWNjA18xMQUBagIgIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IHNlbGwgaXQDCQBmAgUHd2hPcmRBbQAAAwkAZgIJAQEtAQUHYnBPcmRBbQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIEIG9mIAkAkQMCCAUDYWNjA18xMQUBagIaLCBidXQgd2FyZWhvdXNlIG9ubHkgYnV5cyAJAKQDAQUHd2hPcmRBbQMJAGYCCQEBLQEFB2JwT3JkQW0FBmJwSW5pdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIULCBidXQgeW91IG9ubHkgaGF2ZSAJAKQDAQUGYnBJbml0AgQgb2YgCQCRAwIIBQNhY2MDXzExBQFqCQCfCg0JAM0IAggFA2FjYwJfMQkApAMBCQBlAgUGd2hJbml0BQdicE9yZEFtCQDNCAIIBQNhY2MCXzIJAKwCAgkArAICCQCkAwEJAGQCBQd3aE9yZEFtBQdicE9yZEFtAgFACQCkAwEFB3doT3JkUHIJAM0IAggFA2FjYwJfMwkApAMBCQBkAgUGYnBJbml0BQdicE9yZEFtCQBlAggFA2FjYwJfNAUIZGVsdGFWb2wJAGUCCAUDYWNjAl81BQhicE9yZFVzZAgFA2FjYwJfNgkAZAIIBQNhY2MCXzcAAQgFA2FjYwJfOAgFA2FjYwJfOQgFA2FjYwNfMTAIBQNhY2MDXzExBQZpc1Byb2QJAGUCCAUDYWNjA18xMwMFBmlzUHJvZAkAaAIFB2JwT3JkQW0FBU1VTFQ4BQdicE9yZEFtCQACAQkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAJEDAggFA2FjYwNfMTEFAWoCHyB3aGlsZSB3YXJlaG91c2UgZG9lc24ndCBidXkgaXQBE3NlbGxSZXNvdXJjZXNDb21tb24EB3Jlc0xpc3QMZmFjdG9yeUxvY0lkB2Ftb3VudHMJbWluUHJpY2VzCgEFYWRkZXICA2FjYwFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCFCwgYnV0IHRyaWVkIHRvIHNlbGwgCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJVlvdSB0cmllZCB0byBzZWxsIG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBDHNlbGxJbnRlcm5hbAQFDGZhY3RvcnlMb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1pblByaWNlcwUBagkAlgoECQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQCRAwIFB2Ftb3VudHMFAWoJ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Y2MwCQCWCgQFA25pbAUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZXhjaGFuZ2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGARBzaG9wMnVzZXJBY3Rpb25zAw11c2RXaDJCcFNhbGRvCmNhbGxlckFkZHILcmVjZWl2ZWRGZWUDCQBmAgUNdXNkV2gyQnBTYWxkbwAABAt1c2RXaDJCcEZlZQkAawMFDXVzZFdoMkJwU2FsZG8FCkFVQ1RJT05GRUUFBU1VTFQ2AwkAZwIFC3JlY2VpdmVkRmVlCQBlAgUNdXNkV2gyQnBTYWxkbwkAaAIAAwULdXNkV2gyQnBGZWUJAAIBCQCsAgICK1RoaXMgdHJhZGUgZG9lcyBub3QgY292ZXIgZGVsaXZlcnkgY29zdCBvZiAJAQpmaXhlZFBvaW50AgULcmVjZWl2ZWRGZWUABgQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQpjYWxsZXJBZGRyBAVyZWZCeQkAnQgCBQ9zdGFraW5nQ29udHJhY3QFCHJlZkJ5S2V5BAZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCmNhbGxlckFkZHIJAM0IAgkAzQgCAwkBCWlzRGVmaW5lZAEFBXJlZkJ5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFBXJlZkJ5BQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQFA25pbAUDbmlsCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIJAGUCCQBlAgUNdXNkV2gyQnBTYWxkbwkAaAIAAwULdXNkV2gyQnBGZWUFC3JlY2VpdmVkRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQt1c2RXaDJCcEZlZQULdXNkdEFzc2V0SWQFA25pbAEQdXNlcjJzaG9wQWN0aW9ucwQNdXNkQnAyV2hTYWxkbwRwbXRzDXNob3BMYW5kT3duZXIIc3BlbnRGZWUDCQBmAgUNdXNkQnAyV2hTYWxkbwAAAwkBAiE9AgkAkAMBBQRwbXRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAgUEcG10cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUNdXNkQnAyV2hTYWxkbwUIc3BlbnRGZWUDCQECIT0CBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQEKZml4ZWRQb2ludAIFA2FtdAAGAgssIHJlcXVpcmVkPQkBCmZpeGVkUG9pbnQCBQ11c2RCcDJXaFNhbGRvAAYCASsJAQpmaXhlZFBvaW50AgUIc3BlbnRGZWUABgIOKGRlbGl2ZXJ5IGZlZSkDCQBmAgUOTUlOU0hPUFBBWU1FTlQFDXVzZEJwMldoU2FsZG8JAAIBCQCsAgICEk1pbiBzaG9wIHRyYWRlIGlzIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGBAt1c2RCcDJXaEZlZQkAawMFDXVzZEJwMldoU2FsZG8FCkFVQ1RJT05GRUUFBU1VTFQ2BAhyZWZCeUtleQkBD2tleUFkZHJlc3NSZWZCeQEFDXNob3BMYW5kT3duZXIEBXJlZkJ5CQCdCAIFD3N0YWtpbmdDb250cmFjdAUIcmVmQnlLZXkJAM0IAgkAzQgCAwkBCWlzRGVmaW5lZAEFBXJlZkJ5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFBXJlZkJ5BQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQFA25pbAUDbmlsCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ1zaG9wTGFuZE93bmVyCQBlAgUNdXNkQnAyV2hTYWxkbwkAaAIAAwULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAMJAQIhPQIJAJADAQUEcG10cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkBQNuaWwBFWFjY2VwdFNob3BPcmRlckNvbW1vbgYPc2hvcExhbmRBc3NldElkCmNhbGxlckFkZHIKYnBPcmRlclN0cglicFJlc0xpc3QJYnBNYXRMaXN0CmJwUHJvZExpc3QECWxhbmRBc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFD3Nob3BMYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFD3Nob3BMYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUJbGFuZEFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBA1zaG9wTGFuZE93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQUPc2hvcExhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFCWxhbmRBc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQAAAgUNc2hvcExhbmRPd25lcgUKY2FsbGVyQWRkcgkAAgECHllvdSBjYW5ub3QgdHJhZGUgd2l0aCB5b3Vyc2VsZgQMYnBPcmRlclBhcnRzCQC8CQIFCmJwT3JkZXJTdHICAToDCQECIT0CCQCQAwEFDGJwT3JkZXJQYXJ0cwADCQACAQIyYnBPcmRlclN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECGJwT3JkUmVzCQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAACAV8ECGJwT3JkTWF0CQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAECAV8ECWJwT3JkUHJvZAMJAAACCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgAFA25pbAkAvAkCCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgFfAwkBAiE9AgkAkAMBBQhicE9yZFJlcwUGTlVNUkVTCQACAQIgQWxsIDYgcmVzb3VyY2VzIHNob3VsZCBiZSBwYXNzZWQDCQECIT0CCQCQAwEFCGJwT3JkTWF0BQZOVU1SRVMJAAIBAiBBbGwgNiBtYXRlcmlhbHMgc2hvdWxkIGJlIHBhc3NlZAQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQ9zaG9wTGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQPY3VycldoTG9ja2VkVm9sCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUAgFfBQl2b2xMb2NrZWQEBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQUPc2hvcExhbmRBc3NldElkBAV3aE9yZAkBCGdldE9yZGVyAQUGb3JkS2V5BAh3aE9yZFJlcwkAtQkCCQCRAwIFBXdoT3JkBQlvcmRJZHhSZXMCAV8ECHdoT3JkTWF0CQC1CQIJAJEDAgUFd2hPcmQFCW9yZElkeE1hdAIBXwQJd2hPcmRQcm9kAwkAAAIJAJEDAgUFd2hPcmQFCm9yZElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgUFd2hPcmQFCm9yZElkeFByb2QCAV8EAXIKAAIkbAUIYnBPcmRSZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCfCg0FA25pbAUDbmlsBQNuaWwAAAAAAAAAAAUJYnBSZXNMaXN0BQljdXJyV2hSZXMF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AMwIAgkAuQkCCAUBcgJfMgIBXwkAzAgCCQC5CQIIBQFtAl8yAgFfCQDMCAIJALoJAggFAXACXzICAV8FA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQ9zaG9wTGFuZEFzc2V0SWQFA25pbAUDbmlsBA5hY2NTdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFDXNob3BMYW5kT3duZXIJAMwIAgkAawMFBnhwU2hvcAgFAXADXzEzBQVNVUxUOAUDbmlsBQNuaWwJAJwKCgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdXaE9yZFN0cggFAXICXzMIBQFtAl8zCAUBcAJfMwgFAXACXzUIBQFwAl82CAUBcANfMTMFDXNob3BMYW5kT3duZXIFBndoU2F2ZQUOYWNjU3RhdHNSZXN1bHQBGnNlbGxSZXNvdXJjZXNXb3JsZEludGVybmFsAQZhbW91bnQEBm9uZVJlcwkAaQIFBmFtb3VudAAeBBFvbmVGYWN0b3J5QW1vdW50cwkAzAgCBQZvbmVSZXMJAMwIAgUGb25lUmVzCQDMCAIFBm9uZVJlcwkAzAgCBQZvbmVSZXMJAMwIAgUGb25lUmVzCQDMCAIFBm9uZVJlcwUDbmlsBAFzCQCkAwEFBm9uZVJlcwQHcmVzTGlzdAkAzAgCBQFzCQDMCAIFAXMJAMwIAgUBcwkAzAgCBQFzCQDMCAIFAXMJAMwIAgUBcwUDbmlsBAltaW5QcmljZXMJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAoBCm9uZUZhY3RvcnkCA2FjYwljb250aW5lbnQEAXgJARNzZWxsUmVzb3VyY2VzQ29tbW9uBAUHcmVzTGlzdAUJY29udGluZW50BRFvbmVGYWN0b3J5QW1vdW50cwUJbWluUHJpY2VzCQCVCgMJAM4IAggFA2FjYwJfMQgFAXgCXzEJAGQCCAUDYWNjAl8yCAUBeAJfMwkAZAIIBQNhY2MCXzMIBQF4Al80BA0kdDAyNTI3MDI1MzYwCgACJGwFCmNvbnRpbmVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCm9uZUZhY3RvcnkCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDI1MjcwMjUzNjACXzEEDHVzZHRSZWNlaXZlZAgFDSR0MDI1MjcwMjUzNjACXzIECHRvdGFsUmVzCAUNJHQwMjUyNzAyNTM2MAJfMwQDZmVlCQBrAwUMdXNkdFJlY2VpdmVkBQxERUxJVkVSWV9GRUUFBU1VTFQ2BBBhY3Rpdml0aWVzQW1vdW50CQBpAgUMdXNkdFJlY2VpdmVkAGQECHVzZHRMZWZ0CQBlAgkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAUDZmVlCQCXCgUFDmZhY3RvcnlBY3Rpb25zBQh1c2R0TGVmdAUDZmVlBRBhY3Rpdml0aWVzQW1vdW50BQh0b3RhbFJlcwEQY3JhZnRHb29kc0NvbW1vbgUHbWF0TGlzdAhwcm9kTGlzdBRtYW51ZmFjdG9yeUNvbnRpbmVudApwcm9kdWN0SWR4CHF1YW50aXR5AwkAZwIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBzaG91bGQgYmUgcG9zaXRpdmUDAwkAZgIAAAUKcHJvZHVjdElkeAYJAGcCBQpwcm9kdWN0SWR4CQCQAwEFEHByb2R1Y3Rpb25NYXRyaXgJAAIBCQCsAgICFFVua25vd24gcHJvZHVjdCBpZHg9CQCkAwEFCnByb2R1Y3RJZHgEBnJlY2lwZQkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgCAV8DCQECIT0CCQCQAwEFBnJlY2lwZQUKUkVDSVBFU0laRQkAAgEJAKwCAgIXRmF0YWw6IHVua25vd24gcmVjaXBlOiAJAJEDAgUQ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A25pbAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhwcm9kdWNlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAlQoDCAUGbWVyZ2VkAl8xBQduZXdQcm9kCAUGbWVyZ2VkAl8yGAFpARpyZWNhbGNMb2NrZWRWb2x1bWVSRUFET05MWQILbGFuZEFzc2V0SWQCd2gECmN1cnJlbnRPcmQJAQhnZXRPcmRlcgEJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBAF6CQELc2V0SW50ZXJuYWwDBQJ3aAUKY3VycmVudE9yZAUKY3VycmVudE9yZAkAlAoCBQNuaWwJAGQCCAUBegJfNAgFAXoCXzUBaQENY29uc3RydWN0b3JWMQEIcmVzdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgUDbmlsAWkBDXNlbGxSZXNvdXJjZXMCB2Ftb3VudHMJbWluUHJpY2VzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAipzZWxsUmVzb3VyY2VzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBA0kdDAyODg5MzI5MDE5CQETc2VsbFJlc291cmNlc0NvbW1vbgQFB3Jlc0xpc3QJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBQdhbW91bnRzBQltaW5QcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMjg4OTMyOTAxOQJfMQQGbmV3UmVzCAUNJHQwMjg4OTMyOTAxOQJfMgQMdXNkdFJlY2VpdmVkCAUNJHQwMjg4OTMyOTAxOQJfMwQIdG90YWxSZXMIBQ0kdDAyODg5MzI5MDE5Al80BBBhY3Rpdml0aWVzQW1vdW50CQBpAgUMdXNkdFJlY2VpdmVkAGQEB25ld1BhY2sJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAgUGbmV3UmVzAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxSZXMFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM0IAgUOZmFjdG9yeUFjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAJUKAwUOYmFja3BhY2tSZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESc2VsbFJlc291cmNlc1dvcmxkAgRhZGRyBmFtb3VudAMJAQIhPQIIBQFpBmNhbGxlcgUNYWNyZXNDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA0kdDAyOTgxMTI5OTY4CQEac2VsbFJlc291cmNlc1dvcmxkSW50ZXJuYWwBBQZhbW91bnQEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMjk4MTEyOTk2OAJfMQQIdXNkdExlZnQIBQ0kdDAyOTgxMTI5OTY4Al8yBANmZWUIBQ0kdDAyOTgxMTI5OTY4Al8zBBBhY3Rpdml0aWVzQW1vdW50CAUNJHQwMjk4MTEyOTk2OAJfNAQIdG90YWxSZXMIBQ0kdDAyOTgxMTI5OTY4Al81AwkAZwIAAAUIdXNkdExlZnQJAAIBCQCsAgICK1RoaXMgdHJhZGUgZG9lcyBub3QgY292ZXIgZGVsaXZlcnkgY29zdCBvZiAJAQpmaXhlZFBvaW50AgUDZmVlAAYEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUEYWRkcgkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxSZXMFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM0IAgkAzQgCBQ5mYWN0b3J5QWN0aW9ucwkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAFA2ZlZQkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUSaW52ZXN0RnVuZENvbnRyYWN0BQh1c2R0TGVmdAULdXNkdEFzc2V0SWQJAJQKAgUIdXNkdExlZnQFC3N0YXRzUmVzdWx0AWkBGnNlbGxSZXNvdXJjZXNXb3JsZFJFQURPTkxZAQZhbW91bnQECHVzZHRMZWZ0CAkBGnNlbGxSZXNvdXJjZXNXb3JsZEludGVybmFsAQUGYW1vdW50Al8yCQCUCgIFA25pbAUIdXNkdExlZnQBaQEZc2VsbFJlc291cmNlc0R1Y2tEZWxpdmVyeQMHYW1vdW50cwltaW5QcmljZXMQZmFjdG9yeUNvbnRpbmVudAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAipzZWxsUmVzb3VyY2VzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQNJHQwMzEyMDQzMTMyNQkBE3NlbGxSZXNvdXJjZXNDb21tb24EBQdyZXNMaXN0BRBmYWN0b3J5Q29udGluZW50BQdhbW91bnRzBQltaW5QcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMzEyMDQzMTMyNQJfMQQGbmV3UmVzCAUNJHQwMzEyMDQzMTMyNQJfMgQMdXNkdFJlY2VpdmVkCAUNJHQwMzEyMDQzMTMyNQJfMwQIdG90YWxSZXMIBQ0kdDAzMTIwNDMxMzI1Al80BAduZXdQYWNrCQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIFBm5ld1JlcwIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQOYmFja3BhY2tSZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwVHJhZGUFCHRvdGFsUmVzBQVNVUxUOAUDbmlsBQNuaWwEB2ZlZVBhcnQJAGsDBQx1c2R0UmVjZWl2ZWQFDERFTElWRVJZX0ZFRQUFTVVMVDYEA2ZlZQkAlgMBCQDMCAIFB2ZlZVBhcnQJAMwIAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQx1c2R0UmVjZWl2ZWQAZAMJAGcCBQNmZWUJAGUCBQx1c2R0UmVjZWl2ZWQFEGFjdGl2aXRpZXNBbW91bnQJAAIBCQCsAgICK1RoaXMgdHJhZGUgZG9lcyBub3QgY292ZXIgZGVsaXZlcnkgY29zdCBvZiAJAQpmaXhlZFBvaW50AgUDZmVlAAYECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAkAlAoCCQDNCAIJAM0IAgkAzQgCBQ5mYWN0b3J5QWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAUDZmVlBQt1c2R0QXNzZXRJZAkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAUDZmVlCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQCVCgMFDmJhY2twYWNrUmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGXNlbGxSZXNvdXJjZXNMYW5kRGVsaXZlcnkEB2Ftb3VudHMJbWluUHJpY2VzC2xhbmRBc3NldElkEGZhY3RvcnlDb250aW5lbnQDCQEBIQEFEUtTX0FMTE9XX0RFTElWRVJZCQACAQIfRGVsaXZlcnkgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECKnNlbGxSZXNvdXJjZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQEdXNlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBHVzZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToEB3Jlc0xpc3QJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBA0kdDAzMzMxNjMzNDM3CQETc2VsbFJlc291cmNlc0NvbW1vbgQFB3Jlc0xpc3QFEGZhY3RvcnlDb250aW5lbnQFB2Ftb3VudHMFCW1pblByaWNlcwQOZmFjdG9yeUFjdGlvbnMIBQ0kdDAzMzMxNjMzNDM3Al8xBAZuZXdSZXMIBQ0kdDAzMzMxNjMzNDM3Al8yBAx1c2R0UmVjZWl2ZWQIBQ0kdDAzMzMxNjMzNDM3Al8zBAh0b3RhbFJlcwgFDSR0MDMzMzE2MzM0MzcCXzQEBXdoU3RyCQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJALkJAgUGbmV3UmVzAgFfCQDMCAIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kCQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQFA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUEYWRkcgkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxSZXMFBU1VTFQ4BQNuaWwFA25pbAQHZmVlUGFydAkAawMFDHVzZHRSZWNlaXZlZAUMREVMSVZFUllfRkVFBQVNVUxUNgQDZmVlCQCWAwEJAMwIAgUHZmVlUGFydAkAzAgCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFDHVzZHRSZWNlaXZlZABkAwkAZwIFA2ZlZQkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAkAAgEJAKwCAgIrVGhpcyB0cmFkZSBkb2VzIG5vdCBjb3ZlciBkZWxpdmVyeSBjb3N0IG9mIAkBCmZpeGVkUG9pbnQCBQNmZWUABgQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAACQCUCgIJAM0IAgkAzQgCCQDNCAIFDmZhY3RvcnlBY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCCQBlAgUMdXNkdFJlY2VpdmVkBRBhY3Rpdml0aWVzQW1vdW50BQNmZWUFC3VzZHRBc3NldElkCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBkAgUJZnVuZFRvdGFsBQNmZWUJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAJUKAwUGd2hTYXZlBQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGJ1eU1hdGVyaWFscwIHYW1vdW50cwltYXhQcmljZXMEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQNJHQwMzUyNjEzNTM4MwkBEmJ1eU1hdGVyaWFsc0NvbW1vbgQFB21hdExpc3QJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBQdhbW91bnRzBQltYXhQcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMzUyNjEzNTM4MwJfMQQGbmV3TWF0CAUNJHQwMzUyNjEzNTM4MwJfMgQJdXNkdFNwZW50CAUNJHQwMzUyNjEzNTM4MwJfMwQIdG90YWxNYXQIBQ0kdDAzNTI2MTM1MzgzAl80AwkAZgIFCXVzZHRTcGVudAUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQFCXVzZHRTcGVudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAUJdXNkdFNwZW50BQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQl1c2R0U3BlbnQAZAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwVHJhZGUFCHRvdGFsTWF0BQVNVUxUOAUDbmlsBQNuaWwJAJQKAgkAzQgCCQDOCAIFDmZhY3RvcnlBY3Rpb25zBQRyZXN0CQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQCVCgMFDmJhY2twYWNrUmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGGJ1eU1hdGVyaWFsc0R1Y2tEZWxpdmVyeQMHYW1vdW50cwltYXhQcmljZXMQZmFjdG9yeUNvbnRpbmVudAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBA0kdDAzNjkwNDM3MDIxCQESYnV5TWF0ZXJpYWxzQ29tbW9uBAUHbWF0TGlzdAUQZmFjdG9yeUNvbnRpbmVudAUHYW1vdW50cwUJbWF4UHJpY2VzBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDM2OTA0MzcwMjECXzEEBm5ld01hdAgFDSR0MDM2OTA0MzcwMjECXzIECXVzZHRTcGVudAgFDSR0MDM2OTA0MzcwMjECXzMECHRvdGFsTWF0CAUNJHQwMzY5MDQzNzAyMQJfNAQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEDmJhY2twYWNrUmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbE1hdAUFTVVMVDgFA25pbAUDbmlsBAdmZWVQYXJ0CQBrAwUJdXNkdFNwZW50BQxERUxJVkVSWV9GRUUFBU1VTFQ2BANmZWUJAJYDAQkAzAgCBQdmZWVQYXJ0CQDMCAIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUJdXNkdFNwZW50BQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM4IAgUOZmFjdG9yeUFjdGlvbnMFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARhidXlNYXRlcmlhbHNMYW5kRGVsaXZlcnkEB2Ftb3VudHMJbWF4UHJpY2VzC2xhbmRBc3NldElkEGZhY3RvcnlDb250aW5lbnQDCQEBIQEFEUtTX0FMTE9XX0RFTElWRVJZCQACAQIfRGVsaXZlcnkgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAR1c2VyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQHbWF0TGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8EDSR0MDM5MjYzMzkzODAJARJidXlNYXRlcmlhbHNDb21tb24EBQdtYXRMaXN0BRBmYWN0b3J5Q29udGluZW50BQdhbW91bnRzBQltYXhQcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMzkyNjMzOTM4MAJfMQQGbmV3TWF0CAUNJHQwMzkyNjMzOTM4MAJfMgQJdXNkdFNwZW50CAUNJHQwMzkyNjMzOTM4MAJfMwQIdG90YWxNYXQIBQ0kdDAzOTI2MzM5MzgwAl80BAV3aFN0cgkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMJAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFBGFkZHIJAMwIAgkAawMFB3hwVHJhZGUFCHRvdGFsTWF0BQVNVUxUOAUDbmlsBQNuaWwEB2ZlZVBhcnQJAGsDBQl1c2R0U3BlbnQFDERFTElWRVJZX0ZFRQUFTVVMVDYEA2ZlZQkAlgMBCQDMCAIFB2ZlZVBhcnQJAMwIAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwEEHVzZHRTcGVudFdpdGhGZWUJAGQCBQl1c2R0U3BlbnQFA2ZlZQMJAGYCBRB1c2R0U3BlbnRXaXRoRmVlBQNhbXQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQEKZml4ZWRQb2ludAIFA2FtdAAGAgssIHJlcXVpcmVkPQkBCmZpeGVkUG9pbnQCBQl1c2R0U3BlbnQABgIBKwkBCmZpeGVkUG9pbnQCBQNmZWUABgIOKGRlbGl2ZXJ5IGZlZSkEBHJlc3QDCQBmAgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQULdXNkdEFzc2V0SWQFA25pbAUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAgUJdXNkdFNwZW50AGQECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAkAlAoCCQDNCAIJAM0IAgkAzggCBQ5mYWN0b3J5QWN0aW9ucwUEcmVzdAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAUDZmVlCQCVCgMFBndoU2F2ZQUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFleGNoYW5nZVJlc291cmNlcwEHYW1vdW50cwQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBA0kdDA0MTQ1ODQxNTY0CQEXZXhjaGFuZ2VSZXNvdXJjZXNDb21tb24DBQdyZXNMaXN0BQdtYXRMaXN0BQdhbW91bnRzBAZuZXdSZXMIBQ0kdDA0MTQ1ODQxNTY0Al8xBAZuZXdNYXQIBQ0kdDA0MTQ1ODQxNTY0Al8yBAl1c2R0U3BlbnQIBQ0kdDA0MTQ1ODQxNTY0Al8zBBR0b3RhbEFtb3VudENvbnZlcnRlZAgFDSR0MDQxNDU4NDE1NjQCXzQDCQBmAgUJdXNkdFNwZW50BQNhbXQJAAIBCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQEKZml4ZWRQb2ludAIFA2FtdAAGAgssIHJlcXVpcmVkPQkBCmZpeGVkUG9pbnQCBQl1c2R0U3BlbnQABgQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCBQZuZXdSZXMCAV8JAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEDmJhY2twYWNrUmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAUJdXNkdFNwZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10BQl1c2R0U3BlbnQFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQUUdG90YWxBbW91bnRDb252ZXJ0ZWQFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAJUKAwUOYmFja3BhY2tSZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEdZXhjaGFuZ2VSZXNvdXJjZXNEdWNrRGVsaXZlcnkBB2Ftb3VudHMDCQEBIQEFEUtTX0FMTE9XX0RFTElWRVJZCQACAQIfRGVsaXZlcnkgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQNJHQwNDMwNzk0MzE4NQkBF2V4Y2hhbmdlUmVzb3VyY2VzQ29tbW9uAwUHcmVzTGlzdAUHbWF0TGlzdAUHYW1vdW50cwQGbmV3UmVzCAUNJHQwNDMwNzk0MzE4NQJfMQQGbmV3TWF0CAUNJHQwNDMwNzk0MzE4NQJfMgQJdXNkdFNwZW50CAUNJHQwNDMwNzk0MzE4NQJfMwQUdG90YWxBbW91bnRDb252ZXJ0ZWQIBQ0kdDA0MzA3OTQzMTg1Al80BAdmZWVQYXJ0CQBrAwUJdXNkdFNwZW50BQ5ERUxJVkVSWV9GRUUxNQUFTVVMVDYEA2ZlZQkAlgMBCQDMCAIFB2ZlZVBhcnQJAMwIAgUXTUlOX1VTRFRfRkVFX0RFTElWRVJZMTUFA25pbAQQdXNkdFNwZW50V2l0aEZlZQkAZAIFCXVzZHRTcGVudAUDZmVlAwkAZgIFEHVzZHRTcGVudFdpdGhGZWUFA2FtdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAQpmaXhlZFBvaW50AgUDYW10AAYCCywgcmVxdWlyZWQ9CQEKZml4ZWRQb2ludAIFCXVzZHRTcGVudAAGAgErCQEKZml4ZWRQb2ludAIFA2ZlZQAGAg4oZGVsaXZlcnkgZmVlKQQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCBQZuZXdSZXMCAV8JAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEDmJhY2twYWNrUmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQULdXNkdEFzc2V0SWQFA25pbAUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAgUJdXNkdFNwZW50AGQEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlBRR0b3RhbEFtb3VudENvbnZlcnRlZAUFTVVMVDgFA25pbAUDbmlsBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAR1leGNoYW5nZVJlc291cmNlc0xhbmREZWxpdmVyeQIHYW1vdW50cwtsYW5kQXNzZXRJZAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEBHVzZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQR1c2VyBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAdyZXNMaXN0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8EDSR0MDQ1NDQ3NDU1NTMJARdleGNoYW5nZVJlc291cmNlc0NvbW1vbgMFB3Jlc0xpc3QFB21hdExpc3QFB2Ftb3VudHMEBm5ld1JlcwgFDSR0MDQ1NDQ3NDU1NTMCXzEEBm5ld01hdAgFDSR0MDQ1NDQ3NDU1NTMCXzIECXVzZHRTcGVudAgFDSR0MDQ1NDQ3NDU1NTMCXzMEFHRvdGFsQW1vdW50Q29udmVydGVkCAUNJHQwNDU0NDc0NTU1MwJfNAQFd2hTdHIJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAuQkCBQZuZXdSZXMCAV8JAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFBGFkZHIJAMwIAgkAawMFB3hwVHJhZGUFFHRvdGFsQW1vdW50Q29udmVydGVkBQVNVUxUOAUDbmlsBQNuaWwEB2ZlZVBhcnQJAGsDBQl1c2R0U3BlbnQFDkRFTElWRVJZX0ZFRTE1BQVNVUxUNgQDZmVlCQCWAwEJAMwIAgUHZmVlUGFydAkAzAgCBRdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQUDbmlsBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUJdXNkdFNwZW50BQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQZ3aFNhdmUFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY3JhZnRHb29kcwIKcHJvZHVjdElkeAhxdWFudGl0eQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQVNVUxUNgkAAgEJAKwCAgkArAICAghleGFjdGx5IAkBCmZpeGVkUG9pbnQCBQ9DUkFGVF9VU0RUX0NPU1QABgIhIFVTRFQgbXVzdCBiZSBhdHRhY2hlZCBhcyBwYXltZW50BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAU0JAAIBCQCsAgICMUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgTWFudWZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBGNvbnQJAJEDAgULY3VyTG9jYXRpb24FD2xvY0lkeENvbnRpbmVudAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBAhwcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQNJHQwNDc4Nzg0Nzk3NQkBEGNyYWZ0R29vZHNDb21tb24FBQdtYXRMaXN0BQhwcm9kTGlzdAUEY29udAUKcHJvZHVjdElkeAUIcXVhbnRpdHkEBm5ld01hdAgFDSR0MDQ3ODc4NDc5NzUCXzEEB25ld1Byb2QIBQ0kdDA0Nzg3ODQ3OTc1Al8yBAhtYXRTcGVudAgFDSR0MDQ3ODc4NDc5NzUCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJALoJAgUHbmV3UHJvZAIBXwUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwQ3JhZnQFCG1hdFNwZW50BQVNVUxUOAUDbmlsBQNuaWwJAJQKAgUDbmlsCQCVCgMFBnJlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZjcmFmdEdvb2RzRHVja0RlbGl2ZXJ5Awpwcm9kdWN0SWR4CHF1YW50aXR5FG1hbnVmYWN0b3J5Q29udGluZW50AwkBASEBBRFLU19BTExPV19ERUxJVkVSWQkAAgECH0RlbGl2ZXJ5IGZlYXR1cmUgaXMgdHVybmVkIG9mZiEEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECHByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfBA0kdDA0OTIwMDQ5MzEzCQEQY3JhZnRHb29kc0NvbW1vbgUFB21hdExpc3QFCHByb2RMaXN0BRRtYW51ZmFjdG9yeUNvbnRpbmVudAUKcHJvZHVjdElkeAUIcXVhbnRpdHkEBm5ld01hdAgFDSR0MDQ5MjAwNDkzMTMCXzEEB25ld1Byb2QIBQ0kdDA0OTIwMDQ5MzEzAl8yBAhtYXRTcGVudAgFDSR0MDQ5MjAwNDkzMTMCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJALoJAgUHbmV3UHJvZAIBXwUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBDcmFmdAUIbWF0U3BlbnQFBU1VTFQ4BQNuaWwFA25pbAQHZmVlUGFydAkAawMFCHF1YW50aXR5BRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFFENSQUZUX0RFTElWRVJZX0NPRUZGBANmZWUJAJYDAQkAzAgCBQdmZWVQYXJ0CQDMCAIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUPQ1JBRlRfVVNEVF9DT1NUBQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUPQ1JBRlRfVVNEVF9DT1NUAAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAACQCUCgIJAM0IAgUEcmVzdAkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAUDZmVlCQCVCgMFDmJhY2twYWNrUmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFmNyYWZ0R29vZHNMYW5kRGVsaXZlcnkECnByb2R1Y3RJZHgIcXVhbnRpdHkLbGFuZEFzc2V0SWQUbWFudWZhY3RvcnlDb250aW5lbnQDCQEBIQEFEUtTX0FMTE9XX0RFTElWRVJZCQACAQIfRGVsaXZlcnkgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAR1c2VyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQHbWF0TGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECHByb2RMaXN0AwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8EDSR0MDUxNTU2NTE2NjkJARBjcmFmdEdvb2RzQ29tbW9uBQUHbWF0TGlzdAUIcHJvZExpc3QFFG1hbnVmYWN0b3J5Q29udGluZW50BQpwcm9kdWN0SWR4BQhxdWFudGl0eQQGbmV3TWF0CAUNJHQwNTE1NTY1MTY2OQJfMQQHbmV3UHJvZAgFDSR0MDUxNTU2NTE2NjkCXzIECG1hdFNwZW50CAUNJHQwNTE1NTY1MTY2OQJfMwQFd2hTdHIJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJALoJAgUHbmV3UHJvZAIBXwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFBGFkZHIJAMwIAgkAawMFB3hwQ3JhZnQFCG1hdFNwZW50BQVNVUxUOAUDbmlsBQNuaWwEB2ZlZVBhcnQJAGsDBQhxdWFudGl0eQUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBRRDUkFGVF9ERUxJVkVSWV9DT0VGRgQDZmVlCQCWAwEJAMwIAgUHZmVlUGFydAkAzAgCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFA25pbAQQdXNkdFNwZW50V2l0aEZlZQkAZAIFD0NSQUZUX1VTRFRfQ09TVAUDZmVlAwkAZgIFEHVzZHRTcGVudFdpdGhGZWUFA2FtdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAQpmaXhlZFBvaW50AgUDYW10AAYCCywgcmVxdWlyZWQ9CQEKZml4ZWRQb2ludAIFD0NSQUZUX1VTRFRfQ09TVAAGAgErCQEKZml4ZWRQb2ludAIFA2ZlZQAGAg4oZGVsaXZlcnkgZmVlKQQEcmVzdAMJAGYCCQBlAgUDYW10BRB1c2R0U3BlbnRXaXRoRmVlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10BRB1c2R0U3BlbnRXaXRoRmVlBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAkAlAoCCQDNCAIFBHJlc3QJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQZ3aFNhdmUFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERc2V0V2FyZWhvdXNlT3JkZXICC25ld09yZGVyU3RyC2xhbmRBc3NldElkBAR1c2VyCAUBaQxvcmlnaW5DYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQGcmVzdWx0AwkBAiE9AgUEdXNlcgUMcmVzdENvbnRyYWN0CQEMY2hlY2tCbG9ja2VkAAcEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwMJAQIhPQIFBHVzZXIFDHJlc3RDb250cmFjdAkBAiE9AgUFb3duZXIFBGFkZHIHCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAhuZXdPcmRlcgkAvAkCBQtuZXdPcmRlclN0cgIBOgQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQEbG9mdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUAgFfBAd3aFRvdGFsCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUIdm9sVG90YWwEBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQECmN1cnJlbnRPcmQJAQhnZXRPcmRlcgEFBm9yZEtleQQBegkBC3NldEludGVybmFsAwUJY3VycmVudFdoBQpjdXJyZW50T3JkBQhuZXdPcmRlcgQLYnV5Vm9sU2FsZG8IBQF6Al80BAxzZWxsVm9sU2FsZG8IBQF6Al81BAp3aE9jY3VwaWVkCAUBegJfNwQId2hMb2NrZWQJAGQCBQtidXlWb2xTYWxkbwUMc2VsbFZvbFNhbGRvBAZ3aEZyZWUJAGUCCQBlAgUHd2hUb3RhbAUKd2hPY2N1cGllZAUId2hMb2NrZWQDCQBmAgAABQZ3aEZyZWUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhNBdHRlbXB0IHRvIHJlc2VydmUgCQCkAwEFC2J1eVZvbFNhbGRvAhsgc3BhY2UgZm9yIGJ1eSBvcmRlcnMsIGFuZCAJAKQDAQUMc2VsbFZvbFNhbGRvAiUgc3BhY2UgZm9yIHNlbGwgb3JkZXJzIChhbmQgb2NjdXBpZWQ9CQCkAwEFCndoT2NjdXBpZWQCHyksIGxlYWRzIHRvIG5lZ2F0aXZlIGZyZWUgc3BhY2UEBXdoU3RyCQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJALkJAggFAXoCXzECAV8JAMwIAgkAuQkCCAUBegJfMgIBXwkAzAgCCQC6CQIIBQF6Al8zAgFfCQDMCAIJAKQDAQUId2hMb2NrZWQFA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECHVzZFNhbGRvCAUBegJfNgQHYWN0aW9ucwMJAGYCBQh1c2RTYWxkbwAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEDCQECIT0CBQNhbXQFCHVzZFNhbGRvCQACAQkArAICAhJQYXltZW50IG5lZWRlZCBpcyAJAKQDAQUIdXNkU2FsZG8JAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdPcmRlclN0cgUDbmlsAwkAAAIFCHVzZFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdPcmRlclN0cgUDbmlsAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBW93bmVyCQEBLQEFCHVzZFNhbGRvBQt1c2R0QXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFC25ld09yZGVyU3RyBQNuaWwJAJQKAgUHYWN0aW9ucwkAlAoCBQZyZXN1bHQFBndoU2F2ZQFpARRhY2NlcHRXYXJlaG91c2VPcmRlcgMKYnBPcmRlclN0cg9zaG9wTGFuZEFzc2V0SWQLZHVja0Fzc2V0SWQEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQEBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBApjYWxsZXJBZGRyCQClCAEFBmNhbGxlcgQRc3Rha2VkRHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFCmNhbGxlckFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFEXN0YWtlZER1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04EA2xvYwkAtQkCCQEFdmFsdWUBBQtjdXJMb2NhdGlvbgIBXwMJAQIhPQIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFMCQACAQkArAICCQCsAgICFkR1Y2sgbG9jYXRpb24gdHlwZSBpcyAJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAhEsIGJ1dCBzaG91bGQgYmUgTAMJAQIhPQIFEXN0YWtlZER1Y2tBc3NldElkBQtkdWNrQXNzZXRJZAkAAgEJAKwCAgkArAICCQCsAgICFFlvdXIgc3Rha2VkIGR1Y2sgaXMgBRFzdGFrZWREdWNrQXNzZXRJZAINLCBidXQgcGFzc2VkIAULZHVja0Fzc2V0SWQEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAlicFJlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8ECWJwTWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQKYnBQcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQNJHQwNTc1ODI1NzgyMgkBFWFjY2VwdFNob3BPcmRlckNvbW1vbgYFD3Nob3BMYW5kQXNzZXRJZAUKY2FsbGVyQWRkcgUKYnBPcmRlclN0cgUJYnBSZXNMaXN0BQlicE1hdExpc3QFCmJwUHJvZExpc3QECnNob3BBY3Rpb24IBQ0kdDA1NzU4MjU3ODIyAl8xBApuZXdVc2VyUmVzCAUNJHQwNTc1ODI1NzgyMgJfMgQKbmV3VXNlck1hdAgFDSR0MDU3NTgyNTc4MjICXzMEC25ld1VzZXJQcm9kCAUNJHQwNTc1ODI1NzgyMgJfNAQNdXNkV2gyQnBTYWxkbwgFDSR0MDU3NTgyNTc4MjICXzUEDXVzZEJwMldoU2FsZG8IBQ0kdDA1NzU4MjU3ODIyAl82BAh4cEFtb3VudAgFDSR0MDU3NTgyNTc4MjICXzcEDXNob3BMYW5kT3duZXIIBQ0kdDA1NzU4MjU3ODIyAl84BApzaG9wV2hTYXZlCAUNJHQwNTc1ODI1NzgyMgJfOQQOYWNjU3RhdHNSZXN1bHQIBQ0kdDA1NzU4MjU3ODIyA18xMAQIYWN0aW9uczEJAMwIAgUKc2hvcEFjdGlvbgkBEHNob3AydXNlckFjdGlvbnMDBQ11c2RXaDJCcFNhbGRvBQpjYWxsZXJBZGRyAAAECGFjdGlvbnMyCQEQdXNlcjJzaG9wQWN0aW9ucwQFDXVzZEJwMldoU2FsZG8IBQFpCHBheW1lbnRzBQ1zaG9wTGFuZE93bmVyAAAECG5ld0JwU3RyCQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIFCm5ld1VzZXJSZXMCAV8JAMwIAgkAuQkCBQpuZXdVc2VyTWF0AgFfCQDMCAIJALoJAgULbmV3VXNlclByb2QCAV8FA25pbAIBOgQGYnBTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUIbmV3QnBTdHIFA25pbAUDbmlsBA9kdWNrU3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFBnhwU2hvcAUIeHBBbW91bnQFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDOCAIFCGFjdGlvbnMxBQhhY3Rpb25zMgkAlwoFBQxwcm9sb2dSZXN1bHQFCnNob3BXaFNhdmUFBmJwU2F2ZQUPZHVja1N0YXRzUmVzdWx0BQ5hY2NTdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARthY2NlcHRTaG9wT3JkZXJEdWNrRGVsaXZlcnkCCG9yZGVyU3RyD3Nob3BMYW5kQXNzZXRJZAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQpjYWxsZXJBZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQJYnBSZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAlicE1hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECmJwUHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EDSR0MDU5MjY0NTk1MDIJARVhY2NlcHRTaG9wT3JkZXJDb21tb24GBQ9zaG9wTGFuZEFzc2V0SWQFCmNhbGxlckFkZHIFCG9yZGVyU3RyBQlicFJlc0xpc3QFCWJwTWF0TGlzdAUKYnBQcm9kTGlzdAQKc2hvcEFjdGlvbggFDSR0MDU5MjY0NTk1MDICXzEECm5ld1VzZXJSZXMIBQ0kdDA1OTI2NDU5NTAyAl8yBApuZXdVc2VyTWF0CAUNJHQwNTkyNjQ1OTUwMgJfMwQLbmV3VXNlclByb2QIBQ0kdDA1OTI2NDU5NTAyAl80BA11c2RXaDJCcFNhbGRvCAUNJHQwNTkyNjQ1OTUwMgJfNQQNdXNkQnAyV2hTYWxkbwgFDSR0MDU5MjY0NTk1MDICXzYECHhwQW1vdW50CAUNJHQwNTkyNjQ1OTUwMgJfNwQNc2hvcExhbmRPd25lcggFDSR0MDU5MjY0NTk1MDICXzgECnNob3BXaFNhdmUIBQ0kdDA1OTI2NDU5NTAyAl85BA5hY2NTdGF0c1Jlc3VsdAgFDSR0MDU5MjY0NTk1MDIDXzEwBA9kZWxpdmVyeUZlZVBhcnQJAGsDCQBkAgUNdXNkQnAyV2hTYWxkbwUNdXNkV2gyQnBTYWxkbwUMREVMSVZFUllfRkVFBQVNVUxUNgQLZGVsaXZlcnlGZWUJAJYDAQkAzAgCBQ9kZWxpdmVyeUZlZVBhcnQJAMwIAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwECHNwZW50RmVlCQBrAwULZGVsaXZlcnlGZWUFDXVzZEJwMldoU2FsZG8JAGQCBQ11c2RCcDJXaFNhbGRvBQ11c2RXaDJCcFNhbGRvBAtyZWNlaXZlZEZlZQkAZQIFC2RlbGl2ZXJ5RmVlBQhzcGVudEZlZQQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAABAhhY3Rpb25zMQkAzAgCBQpzaG9wQWN0aW9uCQEQc2hvcDJ1c2VyQWN0aW9ucwMFDXVzZFdoMkJwU2FsZG8FCmNhbGxlckFkZHIFC3JlY2VpdmVkRmVlBAhhY3Rpb25zMgkBEHVzZXIyc2hvcEFjdGlvbnMEBQ11c2RCcDJXaFNhbGRvCAUBaQhwYXltZW50cwUNc2hvcExhbmRPd25lcgUIc3BlbnRGZWUECG5ld0JwU3RyCQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIFCm5ld1VzZXJSZXMCAV8JAMwIAgkAuQkCBQpuZXdVc2VyTWF0AgFfCQDMCAIJALoJAgULbmV3VXNlclByb2QCAV8FA25pbAIBOgQGYnBTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUIbmV3QnBTdHIFA25pbAUDbmlsBA9kdWNrU3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFBnhwU2hvcAUIeHBBbW91bnQFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM4IAgUIYWN0aW9uczEFCGFjdGlvbnMyCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBkAgUJZnVuZFRvdGFsBQtkZWxpdmVyeUZlZQkAlwoFBQxwcm9sb2dSZXN1bHQFCnNob3BXaFNhdmUFBmJwU2F2ZQUPZHVja1N0YXRzUmVzdWx0BQ5hY2NTdGF0c1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARthY2NlcHRTaG9wT3JkZXJMYW5kRGVsaXZlcnkDCG9yZGVyU3RyD3Nob3BMYW5kQXNzZXRJZA1teUxhbmRBc3NldElkAwkBASEBBRFLU19BTExPV19ERUxJVkVSWQkAAgECH0RlbGl2ZXJ5IGZlYXR1cmUgaXMgdHVybmVkIG9mZiEEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQEBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBApjYWxsZXJBZGRyCQClCAEFBmNhbGxlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQ1teUxhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUNbXlMYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQUNbXlMYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUKY2FsbGVyQWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQ1teUxhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAdyZXNMaXN0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECHByb2RMaXN0AwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8EDSR0MDYxNzAwNjE5MzIJARVhY2NlcHRTaG9wT3JkZXJDb21tb24GBQ9zaG9wTGFuZEFzc2V0SWQFCmNhbGxlckFkZHIFCG9yZGVyU3RyBQdyZXNMaXN0BQdtYXRMaXN0BQhwcm9kTGlzdAQKc2hvcEFjdGlvbggFDSR0MDYxNzAwNjE5MzICXzEECm5ld1VzZXJSZXMIBQ0kdDA2MTcwMDYxOTMyAl8yBApuZXdVc2VyTWF0CAUNJHQwNjE3MDA2MTkzMgJfMwQLbmV3VXNlclByb2QIBQ0kdDA2MTcwMDYxOTMyAl80BA11c2RXaDJCcFNhbGRvCAUNJHQwNjE3MDA2MTkzMgJfNQQNdXNkQnAyV2hTYWxkbwgFDSR0MDYxNzAwNjE5MzICXzYECHhwQW1vdW50CAUNJHQwNjE3MDA2MTkzMgJfNwQNc2hvcExhbmRPd25lcggFDSR0MDYxNzAwNjE5MzICXzgECnNob3BXaFNhdmUIBQ0kdDA2MTcwMDYxOTMyAl85BA5hY2NTdGF0c1Jlc3VsdAgFDSR0MDYxNzAwNjE5MzIDXzEwBA9kZWxpdmVyeUZlZVBhcnQJAGsDCQBkAgUNdXNkQnAyV2hTYWxkbwUNdXNkV2gyQnBTYWxkbwUMREVMSVZFUllfRkVFBQVNVUxUNgQLZGVsaXZlcnlGZWUJAJYDAQkAzAgCBQ9kZWxpdmVyeUZlZVBhcnQJAMwIAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwECHNwZW50RmVlCQBrAwULZGVsaXZlcnlGZWUFDXVzZEJwMldoU2FsZG8JAGQCBQ11c2RCcDJXaFNhbGRvBQ11c2RXaDJCcFNhbGRvBAtyZWNlaXZlZEZlZQkAZQIFC2RlbGl2ZXJ5RmVlBQhzcGVudEZlZQQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAABAhhY3Rpb25zMQkAzAgCBQpzaG9wQWN0aW9uCQEQc2hvcDJ1c2VyQWN0aW9ucwMFDXVzZFdoMkJwU2FsZG8FCmNhbGxlckFkZHIFC3JlY2VpdmVkRmVlBAhhY3Rpb25zMgkBEHVzZXIyc2hvcEFjdGlvbnMEBQ11c2RCcDJXaFNhbGRvCAUBaQhwYXltZW50cwUNc2hvcExhbmRPd25lcgUIc3BlbnRGZWUEBXdoU3RyCQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJALkJAgUKbmV3VXNlclJlcwIBXwkAzAgCCQC5CQIFCm5ld1VzZXJNYXQCAV8JAMwIAgkAuQkCBQtuZXdVc2VyUHJvZAIBXwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgUNbXlMYW5kQXNzZXRJZAUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUKY2FsbGVyQWRkcgkAzAgCCQBrAwUGeHBTaG9wBQh4cEFtb3VudAUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM0IAgkAzggCBQhhY3Rpb25zMQUIYWN0aW9uczIJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFC2RlbGl2ZXJ5RmVlCQCXCgUFDHByb2xvZ1Jlc3VsdAUKc2hvcFdoU2F2ZQUGd2hTYXZlBQtzdGF0c1Jlc3VsdAUOYWNjU3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQc2VsbFByb2R1Y3RzVG9FUwEHYW1vdW50cwQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFBCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEFpcnBvcnQsIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQIcHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EBWVzS2V5CQEOa2V5RXNXYXJlaG91c2UABAhleGlzdFN0cgkAoggBBQVlc0tleQQMZXhpc3RBbW91bnRzAwkBCWlzRGVmaW5lZAEFCGV4aXN0U3RyCQC8CQIJAQV2YWx1ZQEFCGV4aXN0U3RyAgFfBQNuaWwKAQhtb3ZlUHJvZAIDYWNjCXJlY2lwZVN0cgQBaggFA2FjYwJfMQQIcXVhbnRpdHkDCQBmAgkAkAMBBQdhbW91bnRzBQFqCQCRAwIFB2Ftb3VudHMFAWoAAAMJAGYCAAAFCHF1YW50aXR5CQACAQIbUXVhbnRpdHkgY2Fubm90IGJlIG5lZ2F0aXZlBAZyZWNpcGUJALUJAgUJcmVjaXBlU3RyAgFfAwkBAiE9AgkAkAMBBQZyZWNpcGUFClJFQ0lQRVNJWkUJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogBQlyZWNpcGVTdHIECW1heEFtb3VudAkAaAIFDUVTTUFYUEFDS0FHRVMFDlBST0RVQ1RQS0dTSVpFBAtleGlzdEFtb3VudAMJAGYCCQCQAwEFDGV4aXN0QW1vdW50cwUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGV4aXN0QW1vdW50cwUBagAABAZjYW5CdXkJAGUCBQltYXhBbW91bnQFC2V4aXN0QW1vdW50AwkAZgIFCHF1YW50aXR5BQZjYW5CdXkJAAIBCQCsAgIJAKwCAgkArAICAhdXYXJlaG91c2UgY2FuIGJ1eSBvbmx5IAkApAMBBQZjYW5CdXkCBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQFqBAh0b3RhbE1hdAkBEmdldFJlY2lwZU1hdGVyaWFscwEFBnJlY2lwZQQJdW5pdFByaWNlCQBrAwkAaAIFCHRvdGFsTWF0BQlFU0JVWUNPRUYFEFJFU09VUkNFUFJJQ0VNSU4JAGgCBQVNVUxUOAUOUFJPRFVDVFBLR1NJWkUEDGJwUHJvZEFtb3VudAMJAGYCCQCQAwEFCHByb2RMaXN0BQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvZExpc3QFAWoAAAMJAGYCBQhxdWFudGl0eQUMYnBQcm9kQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAKQDAQUMYnBQcm9kQW1vdW50AgQgb2YgCQCRAwIFCXByb2RUeXBlcwUBagkAlwoFCQBkAgUBagABCQBkAggFA2FjYwJfMgkAaAIFCXVuaXRQcmljZQUIcXVhbnRpdHkJAM0IAggFA2FjYwJfMwkApAMBCQBlAgUMYnBQcm9kQW1vdW50BQhxdWFudGl0eQkAzQgCCAUDYWNjAl80CQCkAwEJAGQCBQtleGlzdEFtb3VudAUIcXVhbnRpdHkJAGQCCAUDYWNjAl81CQBoAgUIdG90YWxNYXQFCHF1YW50aXR5BAZtZXJnZWQKAAIkbAUQcHJvZHVjdGlvbk1hdHJpeAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJcKBQAAAAAFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCG1vdmVQcm9kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIECG5ld0JwU3RyCQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQC6CQIIBQZtZXJnZWQCXzMCAV8FA25pbAIBOgQGYnBTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUIbmV3QnBTdHIFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUKeHBTZWxsVG9FcwgFBm1lcmdlZAJfNQkAaAIFBU1VTFQ4AAoFA25pbAUDbmlsCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUFZXNLZXkJALoJAggFBm1lcmdlZAJfNAIBXwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQZtZXJnZWQCXzIFC3VzZHRBc3NldElkBQNuaWwJAJUKAwUGYnBTYXZlBQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD3VwZGF0ZUVzU3RvcmFnZQEKbmV3U3RvcmFnZQMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5RXNXYXJlaG91c2UABQpuZXdTdG9yYWdlBQNuaWwFCm5ld1N0b3JhZ2UBaQEUdXBkYXRlRGVsaXZlcnlMb2NrZWQBCW5ld0Ftb3VudAMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgURZGVsaXZlcnlMb2NrZWRLZXkFCW5ld0Ftb3VudAUDbmlsBQluZXdBbW91bnQBaQESc2VuZERlbGl2ZXJ5UmV3YXJkAQRhZGRyAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAABAtsb2NrZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRFkZWxpdmVyeUxvY2tlZEtleQAABAthY3Jlc0Ftb3VudAkAaAIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAthY3Jlc1Jlc3VsdAkA/AcEBQ1hY3Jlc0NvbnRyYWN0AglzZW5kQWNyZXMJAMwIAgUEYWRkcgkAzAgCBQthY3Jlc0Ftb3VudAUDbmlsBQNuaWwJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBlAgUJZnVuZFRvdGFsBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkJAMwIAgkBDEludGVnZXJFbnRyeQIFEWRlbGl2ZXJ5TG9ja2VkS2V5CQBlAgULbG9ja2VkVG90YWwFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBQthY3Jlc1Jlc3VsdADccras", "height": 2804014, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7ULUxtdwr4y9e2TFrzHWyK3ibTrU538Y1pBkwpGNRwpy Next: 3kdaZ5sHGDHH1LJEs8F2ULn5UyAp38iW61jJoZBE9ybX Diff:
OldNewDifferences
2424 let MIN_USDT_FEE_DELIVERY = 50000
2525
2626 let MIN_USDT_FEE_DELIVERY15 = 75000
27+
28+let CRAFT_USDT_COST = 1000000
29+
30+let CRAFT_DELIVERY_COEFF = 10
2731
2832 let USDT2ACRES_MULTIPLIER = 10
2933
740744 }
741745
742746
747+func craftGoodsCommon (matList,prodList,manufactoryContinent,productIdx,quantity) = if ((0 >= quantity))
748+ then throw("Quantity should be positive")
749+ else if (if ((0 > productIdx))
750+ then true
751+ else (productIdx >= size(productionMatrix)))
752+ then throw(("Unknown product idx=" + toString(productIdx)))
753+ else {
754+ let recipe = split(productionMatrix[productIdx], "_")
755+ if ((size(recipe) != RECIPESIZE))
756+ then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
757+ else {
758+ let productContIdx = parseIntValue(recipe[rIdxContinent])
759+ if ((continents[productContIdx] != manufactoryContinent))
760+ then throw(((("This product is available in " + continents[productContIdx]) + ", not in ") + manufactoryContinent))
761+ else {
762+ func filler (acc,ignoredItem) = {
763+ let n = acc._2
764+ let xs = if ((size(prodList) > n))
765+ then prodList[n]
766+ else "0"
767+ let x = parseIntValue(xs)
768+ let amount = (quantity * PRODUCTPKGSIZE)
769+ let y = if ((n == productIdx))
770+ then toString((x + amount))
771+ else xs
772+ $Tuple2((acc._1 :+ y), (n + 1))
773+ }
774+
775+ let newProd = ( let $l = productionMatrix
776+ let $s = size($l)
777+ let $acc0 = $Tuple2(nil, 0)
778+ func $f0_1 ($a,$i) = if (($i >= $s))
779+ then $a
780+ else filler($a, $l[$i])
781+
782+ func $f0_2 ($a,$i) = if (($i >= $s))
783+ then $a
784+ else throw("List size exceeds 50")
785+
786+ $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
787+ func producer (acc,j) = {
788+ let needMat = (((parseIntValue(recipe[j]) * MULT5) * quantity) * parseIntValue(recipe[rIdxCoeff]))
789+ let haveMat = parseIntValue(matList[j])
790+ if ((needMat > haveMat))
791+ then throw(((((((("You have " + fixedPoint(haveMat, 8)) + " of ") + matTypes[j]) + ", but recipe requires ") + fixedPoint(needMat, 8)) + " for quantity ") + toString(quantity)))
792+ else if ((needMat > 0))
793+ then $Tuple2((acc._1 :+ toString((haveMat - needMat))), (acc._2 + needMat))
794+ else $Tuple2((acc._1 :+ matList[j]), acc._2)
795+ }
796+
797+ let merged = {
798+ let $l = ITER6
799+ let $s = size($l)
800+ let $acc0 = $Tuple2(nil, 0)
801+ func $f1_1 ($a,$i) = if (($i >= $s))
802+ then $a
803+ else producer($a, $l[$i])
804+
805+ func $f1_2 ($a,$i) = if (($i >= $s))
806+ then $a
807+ else throw("List size exceeds 6")
808+
809+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
810+ }
811+ $Tuple3(merged._1, newProd, merged._2)
812+ }
813+ }
814+ }
815+
816+
743817 @Callable(i)
744818 func recalcLockedVolumeREADONLY (landAssetId,wh) = {
745819 let currentOrd = getOrder(keyOrderByLand(landAssetId))
771845 else {
772846 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
773847 let resList = split(currentPack[bpIdxRes], "_")
774- let $t02681526941 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
775- let factoryActions = $t02681526941._1
776- let newRes = $t02681526941._2
777- let usdtReceived = $t02681526941._3
778- let totalRes = $t02681526941._4
848+ let $t02889329019 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
849+ let factoryActions = $t02889329019._1
850+ let newRes = $t02889329019._2
851+ let usdtReceived = $t02889329019._3
852+ let totalRes = $t02889329019._4
779853 let activitiesAmount = (usdtReceived / 100)
780854 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
781855 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
793867 func sellResourcesWorld (addr,amount) = if ((i.caller != acresContract))
794868 then throw("Permission denied")
795869 else {
796- let $t02773327890 = sellResourcesWorldInternal(amount)
797- let factoryActions = $t02773327890._1
798- let usdtLeft = $t02773327890._2
799- let fee = $t02773327890._3
800- let activitiesAmount = $t02773327890._4
801- let totalRes = $t02773327890._5
870+ let $t02981129968 = sellResourcesWorldInternal(amount)
871+ let factoryActions = $t02981129968._1
872+ let usdtLeft = $t02981129968._2
873+ let fee = $t02981129968._3
874+ let activitiesAmount = $t02981129968._4
875+ let totalRes = $t02981129968._5
802876 if ((0 >= usdtLeft))
803877 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
804878 else {
830904 else {
831905 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
832906 let resList = split(currentPack[bpIdxRes], "_")
833- let $t02912629247 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
834- let factoryActions = $t02912629247._1
835- let newRes = $t02912629247._2
836- let usdtReceived = $t02912629247._3
837- let totalRes = $t02912629247._4
907+ let $t03120431325 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
908+ let factoryActions = $t03120431325._1
909+ let newRes = $t03120431325._2
910+ let usdtReceived = $t03120431325._3
911+ let totalRes = $t03120431325._4
838912 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
839913 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
840914 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
841915 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
842- let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
843- then MIN_USDT_FEE_DELIVERY
844- else feePart
916+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
845917 let activitiesAmount = (usdtReceived / 100)
846918 if ((fee >= (usdtReceived - activitiesAmount)))
847919 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
878950 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
879951 let currentWh = split_4C(wh, ":")
880952 let resList = split(currentWh[whIdxRes], "_")
881- let $t03127731398 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
882- let factoryActions = $t03127731398._1
883- let newRes = $t03127731398._2
884- let usdtReceived = $t03127731398._3
885- let totalRes = $t03127731398._4
953+ let $t03331633437 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
954+ let factoryActions = $t03331633437._1
955+ let newRes = $t03331633437._2
956+ let usdtReceived = $t03331633437._3
957+ let totalRes = $t03331633437._4
886958 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), currentWh[whIdxMat], currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
887959 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
888960 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
889961 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
890- let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
891- then MIN_USDT_FEE_DELIVERY
892- else feePart
962+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
893963 let activitiesAmount = (usdtReceived / 100)
894964 if ((fee >= (usdtReceived - activitiesAmount)))
895965 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
927997 else {
928998 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
929999 let matList = split(currentPack[bpIdxMat], "_")
930- let $t03326133383 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
931- let factoryActions = $t03326133383._1
932- let newMat = $t03326133383._2
933- let usdtSpent = $t03326133383._3
934- let totalMat = $t03326133383._4
1000+ let $t03526135383 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
1001+ let factoryActions = $t03526135383._1
1002+ let newMat = $t03526135383._2
1003+ let usdtSpent = $t03526135383._3
1004+ let totalMat = $t03526135383._4
9351005 if ((usdtSpent > amt))
9361006 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
9371007 else {
9731043 else {
9741044 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
9751045 let matList = split(currentPack[bpIdxMat], "_")
976- let $t03490435021 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
977- let factoryActions = $t03490435021._1
978- let newMat = $t03490435021._2
979- let usdtSpent = $t03490435021._3
980- let totalMat = $t03490435021._4
1046+ let $t03690437021 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1047+ let factoryActions = $t03690437021._1
1048+ let newMat = $t03690437021._2
1049+ let usdtSpent = $t03690437021._3
1050+ let totalMat = $t03690437021._4
9811051 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
9821052 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
9831053 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
9841054 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
985- let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
986- then MIN_USDT_FEE_DELIVERY
987- else feePart
1055+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
9881056 let usdtSpentWithFee = (usdtSpent + fee)
9891057 if ((usdtSpentWithFee > amt))
9901058 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
10331101 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
10341102 let currentWh = split_4C(wh, ":")
10351103 let matList = split(currentWh[whIdxMat], "_")
1036- let $t03730237419 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1037- let factoryActions = $t03730237419._1
1038- let newMat = $t03730237419._2
1039- let usdtSpent = $t03730237419._3
1040- let totalMat = $t03730237419._4
1104+ let $t03926339380 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1105+ let factoryActions = $t03926339380._1
1106+ let newMat = $t03926339380._2
1107+ let usdtSpent = $t03926339380._3
1108+ let totalMat = $t03926339380._4
10411109 let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
10421110 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
10431111 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalMat, MULT8)], nil))
10441112 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
1045- let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
1046- then MIN_USDT_FEE_DELIVERY
1047- else feePart
1113+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
10481114 let usdtSpentWithFee = (usdtSpent + fee)
10491115 if ((usdtSpentWithFee > amt))
10501116 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
10881154 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
10891155 let resList = split(currentPack[bpIdxRes], "_")
10901156 let matList = split(currentPack[bpIdxMat], "_")
1091- let $t03953639642 = exchangeResourcesCommon(resList, matList, amounts)
1092- let newRes = $t03953639642._1
1093- let newMat = $t03953639642._2
1094- let usdtSpent = $t03953639642._3
1095- let totalAmountConverted = $t03953639642._4
1157+ let $t04145841564 = exchangeResourcesCommon(resList, matList, amounts)
1158+ let newRes = $t04145841564._1
1159+ let newMat = $t04145841564._2
1160+ let usdtSpent = $t04145841564._3
1161+ let totalAmountConverted = $t04145841564._4
10961162 if ((usdtSpent > amt))
10971163 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
10981164 else {
11351201 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
11361202 let resList = split(currentPack[bpIdxRes], "_")
11371203 let matList = split(currentPack[bpIdxMat], "_")
1138- let $t04115741263 = exchangeResourcesCommon(resList, matList, amounts)
1139- let newRes = $t04115741263._1
1140- let newMat = $t04115741263._2
1141- let usdtSpent = $t04115741263._3
1142- let totalAmountConverted = $t04115741263._4
1204+ let $t04307943185 = exchangeResourcesCommon(resList, matList, amounts)
1205+ let newRes = $t04307943185._1
1206+ let newMat = $t04307943185._2
1207+ let usdtSpent = $t04307943185._3
1208+ let totalAmountConverted = $t04307943185._4
11431209 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
1144- let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
1145- then MIN_USDT_FEE_DELIVERY15
1146- else feePart
1210+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY15])
11471211 let usdtSpentWithFee = (usdtSpent + fee)
11481212 if ((usdtSpentWithFee > amt))
11491213 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
11961260 let currentWh = split_4C(wh, ":")
11971261 let resList = split(currentWh[whIdxRes], "_")
11981262 let matList = split(currentWh[whIdxMat], "_")
1199- let $t04356643672 = exchangeResourcesCommon(resList, matList, amounts)
1200- let newRes = $t04356643672._1
1201- let newMat = $t04356643672._2
1202- let usdtSpent = $t04356643672._3
1203- let totalAmountConverted = $t04356643672._4
1263+ let $t04544745553 = exchangeResourcesCommon(resList, matList, amounts)
1264+ let newRes = $t04544745553._1
1265+ let newMat = $t04544745553._2
1266+ let usdtSpent = $t04544745553._3
1267+ let totalAmountConverted = $t04544745553._4
12041268 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
12051269 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
12061270 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
12071271 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
1208- let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
1209- then MIN_USDT_FEE_DELIVERY15
1210- else feePart
1272+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY15])
12111273 let usdtSpentWithFee = (usdtSpent + fee)
12121274 if ((usdtSpentWithFee > amt))
12131275 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
12371299 else {
12381300 let pmt = i.payments[0]
12391301 let amt = pmt.amount
1240- let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
1241- if ((pmtAssetId != usdtAssetId))
1302+ if (if (!(isDefined(pmt.assetId)))
1303+ then true
1304+ else (value(pmt.assetId) != usdtAssetId))
12421305 then throw("USDT payments only!")
12431306 else if ((amt != MULT6))
1244- then throw("exactly 1 USDT must be attached as payment")
1245- else if ((0 >= quantity))
1246- then throw("Quantity should be positive")
1247- else {
1248- let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
1249- let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
1250- if ((curLocation[locIdxType] != "M"))
1251- then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
1252- else {
1253- let cont = curLocation[locIdxContinent]
1254- let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
1255- let matList = split(currentPack[bpIdxMat], "_")
1256- if (if ((0 > productIdx))
1257- then true
1258- else (productIdx >= size(productionMatrix)))
1259- then throw(("Unknown product idx=" + toString(productIdx)))
1260- else {
1261- let recipe = split(productionMatrix[productIdx], "_")
1262- if ((size(recipe) != RECIPESIZE))
1263- then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
1264- else {
1265- let productContIdx = parseIntValue(recipe[rIdxContinent])
1266- if ((continents[productContIdx] != cont))
1267- then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
1268- else {
1269- let prodList = if ((currentPack[bpIdxProd] == ""))
1270- then nil
1271- else split_4C(currentPack[bpIdxProd], "_")
1272- func filler (acc,ignoredItem) = {
1273- let n = acc._2
1274- let xs = if ((size(prodList) > n))
1275- then prodList[n]
1276- else "0"
1277- let x = parseIntValue(xs)
1278- let amount = (quantity * PRODUCTPKGSIZE)
1279- let y = if ((n == productIdx))
1280- then toString((x + amount))
1281- else xs
1282- $Tuple2((acc._1 :+ y), (n + 1))
1283- }
1284-
1285- let bpProd = ( let $l = productionMatrix
1286- let $s = size($l)
1287- let $acc0 = $Tuple2(nil, 0)
1288- func $f0_1 ($a,$i) = if (($i >= $s))
1289- then $a
1290- else filler($a, $l[$i])
1291-
1292- func $f0_2 ($a,$i) = if (($i >= $s))
1293- then $a
1294- else throw("List size exceeds 50")
1295-
1296- $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
1297- func producer (acc,j) = {
1298- let needMat = (((parseIntValue(recipe[j]) * MULT5) * quantity) * parseIntValue(recipe[rIdxCoeff]))
1299- let haveMat = parseIntValue(matList[j])
1300- if ((needMat > haveMat))
1301- then throw(((((((("You have " + fixedPoint(haveMat, 8)) + " of ") + matTypes[j]) + ", but recipe requires ") + fixedPoint(needMat, 8)) + " for quantity ") + toString(quantity)))
1302- else if ((needMat > 0))
1303- then $Tuple2((acc._1 :+ toString((haveMat - needMat))), (acc._2 + needMat))
1304- else $Tuple2((acc._1 :+ matList[j]), acc._2)
1305- }
1306-
1307- let merged = {
1308- let $l = ITER6
1309- let $s = size($l)
1310- let $acc0 = $Tuple2(nil, 0)
1311- func $f1_1 ($a,$i) = if (($i >= $s))
1312- then $a
1313- else producer($a, $l[$i])
1314-
1315- func $f1_2 ($a,$i) = if (($i >= $s))
1316- then $a
1317- else throw("List size exceeds 6")
1318-
1319- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1320- }
1321- let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._1, "_"), makeString_2C(bpProd, "_")], ":")
1322- let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
1323- let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, merged._2, MULT8)], nil))
1324- $Tuple2(nil, $Tuple3(result, prologResult, statsResult))
1325- }
1326- }
1327- }
1328- }
1329- }
1307+ then throw((("exactly " + fixedPoint(CRAFT_USDT_COST, 6)) + " USDT must be attached as payment"))
1308+ else {
1309+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
1310+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
1311+ if ((curLocation[locIdxType] != "M"))
1312+ then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
1313+ else {
1314+ let cont = curLocation[locIdxContinent]
1315+ let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
1316+ let matList = split(currentPack[bpIdxMat], "_")
1317+ let prodList = if ((currentPack[bpIdxProd] == ""))
1318+ then nil
1319+ else split_4C(currentPack[bpIdxProd], "_")
1320+ let $t04787847975 = craftGoodsCommon(matList, prodList, cont, productIdx, quantity)
1321+ let newMat = $t04787847975._1
1322+ let newProd = $t04787847975._2
1323+ let matSpent = $t04787847975._3
1324+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), makeString_2C(newProd, "_")], ":")
1325+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
1326+ let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, matSpent, MULT8)], nil))
1327+ $Tuple2(nil, $Tuple3(result, prologResult, statsResult))
1328+ }
1329+ }
13301330 }
13311331 else throw("Strict value is not equal to itself.")
13321332 }
1333+
1334+
1335+
1336+@Callable(i)
1337+func craftGoodsDuckDelivery (productIdx,quantity,manufactoryContinent) = if (!(KS_ALLOW_DELIVERY))
1338+ then throw("Delivery feature is turned off!")
1339+ else {
1340+ let prologResult = prolog()
1341+ if ((prologResult == prologResult))
1342+ then {
1343+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
1344+ if ((size(i.payments) != 1))
1345+ then throw("exactly 1 payment must be attached")
1346+ else {
1347+ let pmt = i.payments[0]
1348+ let amt = pmt.amount
1349+ if (if (!(isDefined(pmt.assetId)))
1350+ then true
1351+ else (value(pmt.assetId) != usdtAssetId))
1352+ then throw("USDT payments only!")
1353+ else {
1354+ let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
1355+ let matList = split(currentPack[bpIdxMat], "_")
1356+ let prodList = if ((currentPack[bpIdxProd] == ""))
1357+ then nil
1358+ else split_4C(currentPack[bpIdxProd], "_")
1359+ let $t04920049313 = craftGoodsCommon(matList, prodList, manufactoryContinent, productIdx, quantity)
1360+ let newMat = $t04920049313._1
1361+ let newProd = $t04920049313._2
1362+ let matSpent = $t04920049313._3
1363+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), makeString_2C(newProd, "_")], ":")
1364+ let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
1365+ let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, matSpent, MULT8)], nil))
1366+ let feePart = fraction(quantity, MIN_USDT_FEE_DELIVERY, CRAFT_DELIVERY_COEFF)
1367+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
1368+ let usdtSpentWithFee = (CRAFT_USDT_COST + fee)
1369+ if ((usdtSpentWithFee > amt))
1370+ then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(CRAFT_USDT_COST, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
1371+ else {
1372+ let rest = if (((amt - usdtSpentWithFee) > 0))
1373+ then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
1374+ else nil
1375+ let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
1376+ $Tuple2((rest :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
1377+ }
1378+ }
1379+ }
1380+ }
1381+ else throw("Strict value is not equal to itself.")
1382+ }
1383+
1384+
1385+
1386+@Callable(i)
1387+func craftGoodsLandDelivery (productIdx,quantity,landAssetId,manufactoryContinent) = if (!(KS_ALLOW_DELIVERY))
1388+ then throw("Delivery feature is turned off!")
1389+ else {
1390+ let prologResult = prolog()
1391+ if ((prologResult == prologResult))
1392+ then if ((size(i.payments) != 1))
1393+ then throw("exactly 1 payment must be attached")
1394+ else {
1395+ let pmt = i.payments[0]
1396+ let amt = pmt.amount
1397+ if (if (!(isDefined(pmt.assetId)))
1398+ then true
1399+ else (value(pmt.assetId) != usdtAssetId))
1400+ then throw("USDT payments only!")
1401+ else {
1402+ let user = i.caller
1403+ let addr = toString(user)
1404+ let asset = value(assetInfo(fromBase58String(landAssetId)))
1405+ if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
1406+ then throw((("NFT " + asset.name) + " is not staked"))
1407+ else {
1408+ let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
1409+ if ((owner != addr))
1410+ then throw((LANDPREFIX + " is not yours"))
1411+ else {
1412+ let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
1413+ let currentWh = split_4C(wh, ":")
1414+ let matList = split(currentWh[whIdxMat], "_")
1415+ let prodList = if ((currentWh[whIdxProd] == ""))
1416+ then nil
1417+ else split_4C(currentWh[whIdxProd], "_")
1418+ let $t05155651669 = craftGoodsCommon(matList, prodList, manufactoryContinent, productIdx, quantity)
1419+ let newMat = $t05155651669._1
1420+ let newProd = $t05155651669._2
1421+ let matSpent = $t05155651669._3
1422+ let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), makeString_2C(newProd, "_"), currentWh[whIdxLOFT]], ":")
1423+ let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
1424+ let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpCraft, matSpent, MULT8)], nil))
1425+ let feePart = fraction(quantity, MIN_USDT_FEE_DELIVERY, CRAFT_DELIVERY_COEFF)
1426+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
1427+ let usdtSpentWithFee = (CRAFT_USDT_COST + fee)
1428+ if ((usdtSpentWithFee > amt))
1429+ then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(CRAFT_USDT_COST, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
1430+ else {
1431+ let rest = if (((amt - usdtSpentWithFee) > 0))
1432+ then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
1433+ else nil
1434+ let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
1435+ $Tuple2((rest :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
1436+ }
1437+ }
1438+ }
1439+ }
1440+ }
1441+ else throw("Strict value is not equal to itself.")
1442+ }
13331443
13341444
13351445
14191529 let bpProdList = if ((currentPack[bpIdxProd] == ""))
14201530 then nil
14211531 else split_4C(currentPack[bpIdxProd], "_")
1422- let $t05319053430 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1423- let shopAction = $t05319053430._1
1424- let newUserRes = $t05319053430._2
1425- let newUserMat = $t05319053430._3
1426- let newUserProd = $t05319053430._4
1427- let usdWh2BpSaldo = $t05319053430._5
1428- let usdBp2WhSaldo = $t05319053430._6
1429- let xpAmount = $t05319053430._7
1430- let shopLandOwner = $t05319053430._8
1431- let shopWhSave = $t05319053430._9
1432- let accStatsResult = $t05319053430._10
1532+ let $t05758257822 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1533+ let shopAction = $t05758257822._1
1534+ let newUserRes = $t05758257822._2
1535+ let newUserMat = $t05758257822._3
1536+ let newUserProd = $t05758257822._4
1537+ let usdWh2BpSaldo = $t05758257822._5
1538+ let usdBp2WhSaldo = $t05758257822._6
1539+ let xpAmount = $t05758257822._7
1540+ let shopLandOwner = $t05758257822._8
1541+ let shopWhSave = $t05758257822._9
1542+ let accStatsResult = $t05758257822._10
14331543 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, 0)]
14341544 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, 0)
14351545 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
14601570 let bpProdList = if ((currentPack[bpIdxProd] == ""))
14611571 then nil
14621572 else split_4C(currentPack[bpIdxProd], "_")
1463- let $t05487255110 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1464- let shopAction = $t05487255110._1
1465- let newUserRes = $t05487255110._2
1466- let newUserMat = $t05487255110._3
1467- let newUserProd = $t05487255110._4
1468- let usdWh2BpSaldo = $t05487255110._5
1469- let usdBp2WhSaldo = $t05487255110._6
1470- let xpAmount = $t05487255110._7
1471- let shopLandOwner = $t05487255110._8
1472- let shopWhSave = $t05487255110._9
1473- let accStatsResult = $t05487255110._10
1573+ let $t05926459502 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1574+ let shopAction = $t05926459502._1
1575+ let newUserRes = $t05926459502._2
1576+ let newUserMat = $t05926459502._3
1577+ let newUserProd = $t05926459502._4
1578+ let usdWh2BpSaldo = $t05926459502._5
1579+ let usdBp2WhSaldo = $t05926459502._6
1580+ let xpAmount = $t05926459502._7
1581+ let shopLandOwner = $t05926459502._8
1582+ let shopWhSave = $t05926459502._9
1583+ let accStatsResult = $t05926459502._10
14741584 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
1475- let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
1476- then MIN_USDT_FEE_DELIVERY
1477- else deliveryFeePart
1585+ let deliveryFee = max([deliveryFeePart, MIN_USDT_FEE_DELIVERY])
14781586 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
14791587 let receivedFee = (deliveryFee - spentFee)
14801588 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
15131621 let matList = split(currentWh[whIdxMat], "_")
15141622 let prodList = if ((currentWh[whIdxProd] == ""))
15151623 then nil
1516- else split(currentWh[whIdxProd], "_")
1517- let $t05735257584 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1518- let shopAction = $t05735257584._1
1519- let newUserRes = $t05735257584._2
1520- let newUserMat = $t05735257584._3
1521- let newUserProd = $t05735257584._4
1522- let usdWh2BpSaldo = $t05735257584._5
1523- let usdBp2WhSaldo = $t05735257584._6
1524- let xpAmount = $t05735257584._7
1525- let shopLandOwner = $t05735257584._8
1526- let shopWhSave = $t05735257584._9
1527- let accStatsResult = $t05735257584._10
1624+ else split_4C(currentWh[whIdxProd], "_")
1625+ let $t06170061932 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1626+ let shopAction = $t06170061932._1
1627+ let newUserRes = $t06170061932._2
1628+ let newUserMat = $t06170061932._3
1629+ let newUserProd = $t06170061932._4
1630+ let usdWh2BpSaldo = $t06170061932._5
1631+ let usdBp2WhSaldo = $t06170061932._6
1632+ let xpAmount = $t06170061932._7
1633+ let shopLandOwner = $t06170061932._8
1634+ let shopWhSave = $t06170061932._9
1635+ let accStatsResult = $t06170061932._10
15281636 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
1529- let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
1530- then MIN_USDT_FEE_DELIVERY
1531- else deliveryFeePart
1637+ let deliveryFee = max([deliveryFeePart, MIN_USDT_FEE_DELIVERY])
15321638 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
15331639 let receivedFee = (deliveryFee - spentFee)
15341640 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let xpTrade = 10000
55
66 let xpCraft = 10000
77
88 let xpSellToEs = 10000
99
1010 let xpShop = 10000
1111
1212 let LANDPREFIX = "LAND"
1313
1414 let NUMRES = 6
1515
1616 let DEFAULTLOCATION = "Africa_F_Africa"
1717
1818 let RESOURCEPRICEMIN = 39637
1919
2020 let ESMAXPACKAGES = 10
2121
2222 let ESBUYCOEF = 4
2323
2424 let MIN_USDT_FEE_DELIVERY = 50000
2525
2626 let MIN_USDT_FEE_DELIVERY15 = 75000
27+
28+let CRAFT_USDT_COST = 1000000
29+
30+let CRAFT_DELIVERY_COEFF = 10
2731
2832 let USDT2ACRES_MULTIPLIER = 10
2933
3034 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
3135
3236 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
3337
3438 let prodTypes = ["First Aid Kit L1", "First Aid Kit L2", "First Aid Kit L3", "Backpack L1", "Backpack L2", "Backpack L3", "Food Ration L1", "Food Ration L2", "Food Ration L3", "Jet Pack L1", "Jet Pack L2", "Jet Pack L3", "Shield L1", "Shield L2", "Shield L3", "Mine L1", "Mine L2", "Mine L3", "Trap L1", "Trap L2", "Trap L3"]
3539
3640 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
3741
3842 let COEFF2MAT = 10000000
3943
4044 let productionMatrix = ["8_8_8_17_17_42_12_0_30_0,0,0,0,0,0,0_", "8_8_8_17_17_42_24_0_60_0,0,5,2,0,0,0_", "8_8_8_17_17_42_36_0_120_0,0,10,4,0,0,0_", "8_19_19_8_27_19_26_1_20_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_52_1_40_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_78_1_80_0,0,0,0,0,0,0_001", "8_8_8_8_8_60_13_2_2_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_26_2_4_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_39_2_8_0,0,0,0,0,0,0_011", "30_30_3_17_17_3_30_3_30_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_60_3_50_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_90_3_70_0,0,0,0,0,0,0_111", "18_18_10_18_18_18_11_4_10_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_22_4_20_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_33_4_30_0,0,0,0,0,0,0_201", "4_13_22_4_35_22_23_0_50,1,0_0,0,0,0,0,0,0_", "4_13_22_4_35_22_46_0_50,1,1_0,2,5,0,0,0,0_", "4_13_22_4_35_22_69_0_50,2,1_0,5,10,0,0,0,0_", "5_25_40_5_10_15_20_1_30,1,1_0,0,0,0,0,0,0_", "5_25_40_5_10_15_40_1_30,1,2_2,1,3,0,0,0,0_", "5_25_40_5_10_15_60_1_30,1,3_5,2,8,0,0,0,0_"]
4145
4246 let rIdxCoeff = 6
4347
4448 let rIdxContinent = 7
4549
4650 let RECIPESIZE = 11
4751
4852 let PRODUCTPKGSIZE = 10
4953
5054 let whIdxLevels = 0
5155
5256 let whIdxRes = 1
5357
5458 let whIdxMat = 2
5559
5660 let whIdxProd = 3
5761
5862 let whIdxLOFT = 4
5963
6064 let volLocked = 0
6165
6266 let volTotal = 3
6367
6468 let bpIdxLevel = 0
6569
6670 let bpIdxRes = 1
6771
6872 let bpIdxMat = 2
6973
7074 let bpIdxProd = 3
7175
7276 let locIdxContinent = 0
7377
7478 let locIdxType = 1
7579
7680 let locIdxId = 2
7781
7882 func keyLandAssetIdToOwner (assetId) = ("no_" + assetId)
7983
8084
8185 func keyStakedTimeByAssetId (assetId) = ("st_" + assetId)
8286
8387
8488 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
8589
8690
8791 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
8892
8993
9094 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
9195
9296
9397 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
9498
9599
96100 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
97101
98102
99103 func keyEsWarehouse () = "emergencyWarehouseProducts"
100104
101105
102106 let deliveryFundKey = "deliveryFund"
103107
104108 let deliveryLockedKey = "deliveryLocked"
105109
106110 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
107111
108112
109113 let KS_ALLOW_DELIVERY = true
110114
111115 let chain = take(drop(this.bytes, 1), 1)
112116
113117 let usdtAssetId = match chain {
114118 case _ =>
115119 if ((base58'2W' == $match0))
116120 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
117121 else if ((base58'2T' == $match0))
118122 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
119123 else throw("Unknown chain")
120124 }
121125
122126 let defaultRestAddressStr = match chain {
123127 case _ =>
124128 if ((base58'2W' == $match0))
125129 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
126130 else if ((base58'2T' == $match0))
127131 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
128132 else throw("Unknown chain")
129133 }
130134
131135 let SEP = "__"
132136
133137 let MULT5 = 100000
134138
135139 let MULT6 = 1000000
136140
137141 let MULT8 = 100000000
138142
139143 let MULT10 = 10000000000
140144
141145 let MINSHOPPAYMENT = 100000
142146
143147 let ITER6 = [0, 1, 2, 3, 4, 5]
144148
145149 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
146150
147151
148152 let IdxCfgStakingDapp = 1
149153
150154 let IdxCfgInvestFundDapp = 6
151155
152156 let IdxCfgAcresDapp = 8
153157
154158 func keyRestCfg () = "%s__restConfig"
155159
156160
157161 func keyRestAddress () = "%s__restAddr"
158162
159163
160164 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
161165
162166
163167 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
164168
165169
166170 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
167171
168172 let restCfg = readRestCfgOrFail(restContract)
169173
170174 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
171175
172176 let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
173177
174178 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
175179
176180 func asString (v) = match v {
177181 case s: String =>
178182 s
179183 case _ =>
180184 throw("fail to cast into String")
181185 }
182186
183187
184188 func asInt (v) = match v {
185189 case n: Int =>
186190 n
187191 case _ =>
188192 throw("fail to cast into Int")
189193 }
190194
191195
192196 func keyBlocked () = "contractsBlocked"
193197
194198
195199 func fixedPoint (val,decimals) = {
196200 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
197201 let lowPart = toString((val % tenPow))
198202 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
199203 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
200204 }
201205
202206
203207 let FACTORYMAXWAREHOUSE = 10000000000
204208
205209 let SELLMULTIPLIER = 200
206210
207211 let BUYMULTIPLIER = 300
208212
209213 let AUCTIONFEE = 10000
210214
211215 let DELIVERY_FEE = 10000
212216
213217 let DELIVERY_FEE15 = 15000
214218
215219 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
216220
217221
218222 let ordIdxRes = 0
219223
220224 let ordIdxMat = 1
221225
222226 let ordIdxProd = 2
223227
224228 func getOrder (ordKey) = {
225229 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:"), ":")
226230 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
227231 then p[ordIdxRes]
228232 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
229233 then p[ordIdxMat]
230234 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
231235 }
232236
233237
234238 func toVolume (amount,pkgSize,isProduct) = if (isProduct)
235239 then {
236240 let pkgs = if ((amount >= 0))
237241 then (((amount + pkgSize) - 1) / pkgSize)
238242 else -((((-(amount) + pkgSize) - 1) / pkgSize))
239243 (pkgs * MULT8)
240244 }
241245 else amount
242246
243247
244248 func sellInternal (locId,resType,amount,minPrice) = {
245249 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
246250 let w0 = valueOrElse(getInteger(whKey), 0)
247251 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
248252 then 0
249253 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
250254 then (FACTORYMAXWAREHOUSE - w0)
251255 else amount
252256 let usdtReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
253257 let min99 = (minPrice - (minPrice / 100))
254258 if (((min99 * amount) > (usdtReceived * MULT8)))
255259 then throw((((((((((("Actual price = " + toString(usdtReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
256260 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdtReceived)
257261 }
258262
259263
260264 func buyInternal (locId,matType,amount,maxPrice) = {
261265 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
262266 let w0 = valueOrElse(getInteger(whKey), 0)
263267 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
264268 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
265269 else 0
266270 let m0 = min([w0, (amount - m1)])
267271 let m = (m0 + m1)
268272 let w0min = min([w0, FACTORYMAXWAREHOUSE])
269273 let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0min) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
270274 let max101 = (maxPrice + (maxPrice / 100))
271275 if (((usdtSpent * MULT8) > (max101 * m)))
272276 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
273277 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdtSpent, m)
274278 }
275279
276280
277281 func getBackpack (bpKey) = {
278282 let p = split_4C(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
279283 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
280284 then p[bpIdxRes]
281285 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
282286 then p[bpIdxMat]
283287 else "0_0_0_0_0_0", p[bpIdxProd]]
284288 }
285289
286290
287291 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
288292 then throw("Contracts are under maintenance")
289293 else unit
290294
291295
292296 func prolog () = asInt(reentrantInvoke(stakingContract, "saveLastTx", nil, nil))
293297
294298
295299 func setCommon (acc,ignoredIterator) = {
296300 let j = acc._1
297301 let item = if ((size(acc._10) > j))
298302 then acc._10[j]
299303 else "0@0"
300304 let isProd = acc._8
301305 let itemParts = split(item, "@")
302306 if ((size(itemParts) != 2))
303307 then throw("Incorrect order format, should be amount@price")
304308 else {
305309 let newOrdAm = parseIntValue(itemParts[0])
306310 let newOrdPr = parseIntValue(itemParts[1])
307311 let newOrdUsd = if (isProd)
308312 then (newOrdAm * newOrdPr)
309313 else fraction(newOrdAm, newOrdPr, MULT8)
310314 let newOrdVol = toVolume(newOrdAm, PRODUCTPKGSIZE, isProd)
311315 let whInit = if ((size(acc._6) > j))
312316 then parseIntValue(acc._6[j])
313317 else 0
314318 let curOrdParts = split(if ((size(acc._7) > j))
315319 then acc._7[j]
316320 else "0@0", "@")
317321 let curOrdAm = parseIntValue(curOrdParts[0])
318322 let curOrdPr = parseIntValue(curOrdParts[1])
319323 if (if ((0 > curOrdPr))
320324 then true
321325 else (0 > newOrdPr))
322326 then throw("Price can't be negative")
323327 else {
324328 let curOrdUsd = if (isProd)
325329 then (curOrdAm * curOrdPr)
326330 else fraction(curOrdAm, curOrdPr, MULT8)
327331 if ((newOrdAm == 0))
328332 then if ((curOrdAm > 0))
329333 then $Tuple10((j + 1), (acc._2 :+ toString(whInit)), acc._3, acc._4, (acc._5 - curOrdUsd), acc._6, acc._7, isProd, (acc._9 + toVolume(whInit, PRODUCTPKGSIZE, isProd)), acc._10)
330334 else $Tuple10((j + 1), (acc._2 :+ toString((whInit - curOrdAm))), acc._3, acc._4, acc._5, acc._6, acc._7, isProd, (acc._9 + toVolume((whInit - curOrdAm), PRODUCTPKGSIZE, isProd)), acc._10)
331335 else if ((newOrdAm > 0))
332336 then if ((0 > curOrdAm))
333337 then $Tuple10((j + 1), (acc._2 :+ toString((whInit - curOrdAm))), (acc._3 + newOrdVol), acc._4, (acc._5 + newOrdUsd), acc._6, acc._7, isProd, toVolume((whInit - curOrdAm), PRODUCTPKGSIZE, isProd), acc._10)
334338 else $Tuple10((j + 1), (acc._2 :+ toString(whInit)), (acc._3 + newOrdVol), acc._4, ((acc._5 + newOrdUsd) - curOrdUsd), acc._6, acc._7, isProd, toVolume(whInit, PRODUCTPKGSIZE, isProd), acc._10)
335339 else if ((0 > curOrdAm))
336340 then {
337341 let amDiff = (curOrdAm - newOrdAm)
338342 if ((0 > (whInit - amDiff)))
339343 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whInit)) + " available"))
340344 else $Tuple10((j + 1), (acc._2 :+ toString((whInit - amDiff))), acc._3, (acc._4 - newOrdVol), acc._5, acc._6, acc._7, isProd, toVolume((whInit - amDiff), PRODUCTPKGSIZE, isProd), acc._10)
341345 }
342346 else if ((0 > (whInit + newOrdAm)))
343347 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whInit)) + " available"))
344348 else $Tuple10((j + 1), (acc._2 :+ toString((whInit + newOrdAm))), acc._3, (acc._4 - newOrdVol), (acc._5 - curOrdUsd), acc._6, acc._7, isProd, toVolume((whInit + newOrdAm), PRODUCTPKGSIZE, isProd), acc._10)
345349 }
346350 }
347351 }
348352
349353
350354 func setInternal (currentWh,currentOrd,newOrd) = {
351355 let currWhRes = split(currentWh[whIdxRes], "_")
352356 let currWhMat = split(currentWh[whIdxMat], "_")
353357 let currWhProd = if ((currentWh[whIdxProd] == ""))
354358 then nil
355359 else split_4C(currentWh[whIdxProd], "_")
356360 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
357361 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
358362 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
359363 then nil
360364 else split_4C(currentOrd[ordIdxProd], "_")
361365 if ((size(newOrd) != 3))
362366 then throw("newOrderStr should contain exactly 2 ':' separators")
363367 else {
364368 let resParts = split(newOrd[0], "_")
365369 let matParts = split(newOrd[1], "_")
366370 let prodParts = if ((newOrd[2] == ""))
367371 then nil
368372 else split_4C(newOrd[2], "_")
369373 if ((size(resParts) != NUMRES))
370374 then throw("All 6 resources should be passed")
371375 else if ((size(matParts) != NUMRES))
372376 then throw("All 6 materials should be passed")
373377 else {
374378 let r = {
375379 let $l = resTypes
376380 let $s = size($l)
377381 let $acc0 = $Tuple10(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false, 0, resParts)
378382 func $f0_1 ($a,$i) = if (($i >= $s))
379383 then $a
380384 else setCommon($a, $l[$i])
381385
382386 func $f0_2 ($a,$i) = if (($i >= $s))
383387 then $a
384388 else throw("List size exceeds 6")
385389
386390 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
387391 }
388392 let m = {
389393 let $l = matTypes
390394 let $s = size($l)
391395 let $acc0 = $Tuple10(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false, r._9, matParts)
392396 func $f1_1 ($a,$i) = if (($i >= $s))
393397 then $a
394398 else setCommon($a, $l[$i])
395399
396400 func $f1_2 ($a,$i) = if (($i >= $s))
397401 then $a
398402 else throw("List size exceeds 6")
399403
400404 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
401405 }
402406 let p = {
403407 let $l = prodTypes
404408 let $s = size($l)
405409 let $acc0 = $Tuple10(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true, m._9, prodParts)
406410 func $f2_1 ($a,$i) = if (($i >= $s))
407411 then $a
408412 else setCommon($a, $l[$i])
409413
410414 func $f2_2 ($a,$i) = if (($i >= $s))
411415 then $a
412416 else throw("List size exceeds 50")
413417
414418 $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)
415419 }
416420 $Tuple7(r._2, m._2, p._2, p._3, p._4, p._5, p._9)
417421 }
418422 }
419423 }
420424
421425
422426 func acceptCommon (acc,bpOrdItem) = {
423427 let j = acc._7
424428 let isProd = acc._12
425429 let bpOrdParts = split(bpOrdItem, "@")
426430 if ((size(bpOrdParts) != 2))
427431 then throw("Incorrect order format, should be amount@price")
428432 else {
429433 let bpOrdAm = parseIntValue(bpOrdParts[0])
430434 let bpOrdPr = parseIntValue(bpOrdParts[1])
431435 if ((0 > bpOrdPr))
432436 then throw("Price can't be negative")
433437 else {
434438 let bpOrdUsd = if (isProd)
435439 then (bpOrdAm * bpOrdPr)
436440 else fraction(bpOrdAm, bpOrdPr, MULT8)
437441 let bpInit = if ((size(acc._8) > j))
438442 then parseIntValue(acc._8[j])
439443 else 0
440444 let whInit = if ((size(acc._9) > j))
441445 then parseIntValue(acc._9[j])
442446 else 0
443447 let whOrdInit = if ((size(acc._10) > j))
444448 then acc._10[j]
445449 else "0@0"
446450 let whOrdParts = split(whOrdInit, "@")
447451 let whOrdAm = parseIntValue(whOrdParts[0])
448452 let whOrdPr = parseIntValue(whOrdParts[1])
449453 if (if ((bpOrdAm != 0))
450454 then (bpOrdPr != whOrdPr)
451455 else false)
452456 then throw(((((("Prices of " + acc._11[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
453457 else {
454458 let whOrdUsd = if (isProd)
455459 then (whOrdAm * whOrdPr)
456460 else fraction(whOrdAm, whOrdPr, MULT8)
457461 let deltaVol = toVolume(bpOrdAm, PRODUCTPKGSIZE, isProd)
458462 if ((bpOrdAm == 0))
459463 then $Tuple13((acc._1 :+ toString(whInit)), (acc._2 :+ whOrdInit), (acc._3 :+ toString(bpInit)), acc._4, acc._5, acc._6, (acc._7 + 1), acc._8, acc._9, acc._10, acc._11, isProd, acc._13)
460464 else if ((bpOrdAm > 0))
461465 then if ((0 > whOrdAm))
462466 then if ((bpOrdAm > -(whOrdAm)))
463467 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + acc._11[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
464468 else $Tuple13((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, (acc._13 + (if (isProd)
465469 then (bpOrdAm * MULT8)
466470 else bpOrdAm)))
467471 else throw((("Attempt to buy " + acc._11[j]) + " while warehouse doesn't sell it"))
468472 else if ((whOrdAm > 0))
469473 then if ((-(bpOrdAm) > whOrdAm))
470474 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + acc._11[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
471475 else if ((-(bpOrdAm) > bpInit))
472476 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + toString(bpInit)) + " of ") + acc._11[j]))
473477 else $Tuple13((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, (acc._13 - (if (isProd)
474478 then (bpOrdAm * MULT8)
475479 else bpOrdAm)))
476480 else throw((("Attempt to sell " + acc._11[j]) + " while warehouse doesn't buy it"))
477481 }
478482 }
479483 }
480484 }
481485
482486
483487 func sellResourcesCommon (resList,factoryLocId,amounts,minPrices) = {
484488 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
485489 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
486490 else if ((0 > amounts[j]))
487491 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
488492 else if ((amounts[j] > 0))
489493 then {
490494 let b = sellInternal(factoryLocId, j, amounts[j], minPrices[j])
491495 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2), (acc._4 + amounts[j]))
492496 }
493497 else $Tuple4(acc._1, (acc._2 :+ resList[j]), acc._3, acc._4)
494498
495499 let $l = ITER6
496500 let $s = size($l)
497501 let $acc0 = $Tuple4(nil, nil, 0, 0)
498502 func $f0_1 ($a,$i) = if (($i >= $s))
499503 then $a
500504 else adder($a, $l[$i])
501505
502506 func $f0_2 ($a,$i) = if (($i >= $s))
503507 then $a
504508 else throw("List size exceeds 6")
505509
506510 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
507511 }
508512
509513
510514 func buyMaterialsCommon (matList,factoryLocId,amounts,maxPrices) = {
511515 func mUpdater (acc,j) = if ((0 > amounts[j]))
512516 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
513517 else if ((amounts[j] > 0))
514518 then {
515519 let b = buyInternal(factoryLocId, j, amounts[j], maxPrices[j])
516520 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2), (acc._4 + amounts[j]))
517521 }
518522 else $Tuple4(acc._1, (acc._2 :+ matList[j]), acc._3, acc._4)
519523
520524 let $l = ITER6
521525 let $s = size($l)
522526 let $acc0 = $Tuple4(nil, nil, 0, 0)
523527 func $f0_1 ($a,$i) = if (($i >= $s))
524528 then $a
525529 else mUpdater($a, $l[$i])
526530
527531 func $f0_2 ($a,$i) = if (($i >= $s))
528532 then $a
529533 else throw("List size exceeds 6")
530534
531535 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
532536 }
533537
534538
535539 func exchangeResourcesCommon (resList,matList,amounts) = {
536540 func exchanger (acc,j) = {
537541 let amj = amounts[j]
538542 if ((amj > parseIntValue(resList[j])))
539543 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
540544 else if ((0 > amj))
541545 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
542546 else if ((amj > 0))
543547 then $Tuple4((acc._1 :+ toString((parseIntValue(resList[j]) - amj))), (acc._2 :+ toString((parseIntValue(matList[j]) + amj))), (acc._3 + fraction(amj, RESOURCEPRICEMIN, MULT8)), (acc._4 + amj))
544548 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
545549 }
546550
547551 let $l = ITER6
548552 let $s = size($l)
549553 let $acc0 = $Tuple4(nil, nil, 0, 0)
550554 func $f0_1 ($a,$i) = if (($i >= $s))
551555 then $a
552556 else exchanger($a, $l[$i])
553557
554558 func $f0_2 ($a,$i) = if (($i >= $s))
555559 then $a
556560 else throw("List size exceeds 6")
557561
558562 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
559563 }
560564
561565
562566 func shop2userActions (usdWh2BpSaldo,callerAddr,receivedFee) = if ((usdWh2BpSaldo > 0))
563567 then {
564568 let usdWh2BpFee = fraction(usdWh2BpSaldo, AUCTIONFEE, MULT6)
565569 if ((receivedFee >= (usdWh2BpSaldo - (3 * usdWh2BpFee))))
566570 then throw(("This trade does not cover delivery cost of " + fixedPoint(receivedFee, 6)))
567571 else {
568572 let refByKey = keyAddressRefBy(callerAddr)
569573 let refBy = getString(stakingContract, refByKey)
570574 let caller = addressFromStringValue(callerAddr)
571575 (((if (isDefined(refBy))
572576 then [ScriptTransfer(addressFromStringValue(value(refBy)), usdWh2BpFee, usdtAssetId)]
573577 else nil) :+ ScriptTransfer(caller, ((usdWh2BpSaldo - (3 * usdWh2BpFee)) - receivedFee), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId))
574578 }
575579 }
576580 else nil
577581
578582
579583 func user2shopActions (usdBp2WhSaldo,pmts,shopLandOwner,spentFee) = if ((usdBp2WhSaldo > 0))
580584 then if ((size(pmts) != 1))
581585 then throw("exactly 1 payment must be attached")
582586 else {
583587 let pmt = pmts[0]
584588 let amt = pmt.amount
585589 if (if (!(isDefined(pmt.assetId)))
586590 then true
587591 else (value(pmt.assetId) != usdtAssetId))
588592 then throw("USDT payments only!")
589593 else {
590594 let usdtSpentWithFee = (usdBp2WhSaldo + spentFee)
591595 if ((amt != usdtSpentWithFee))
592596 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdBp2WhSaldo, 6)) + "+") + fixedPoint(spentFee, 6)) + "(delivery fee)"))
593597 else if ((MINSHOPPAYMENT > usdBp2WhSaldo))
594598 then throw(("Min shop trade is " + fixedPoint(MINSHOPPAYMENT, 6)))
595599 else {
596600 let usdBp2WhFee = fraction(usdBp2WhSaldo, AUCTIONFEE, MULT6)
597601 let refByKey = keyAddressRefBy(shopLandOwner)
598602 let refBy = getString(stakingContract, refByKey)
599603 (((if (isDefined(refBy))
600604 then [ScriptTransfer(addressFromStringValue(value(refBy)), usdBp2WhFee, usdtAssetId)]
601605 else nil) :+ ScriptTransfer(addressFromStringValue(shopLandOwner), (usdBp2WhSaldo - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId))
602606 }
603607 }
604608 }
605609 else if ((size(pmts) != 0))
606610 then throw("No payments needed")
607611 else nil
608612
609613
610614 func acceptShopOrderCommon (shopLandAssetId,callerAddr,bpOrderStr,bpResList,bpMatList,bpProdList) = {
611615 let landAsset = value(assetInfo(fromBase58String(shopLandAssetId)))
612616 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(shopLandAssetId)))))
613617 then throw((("NFT " + landAsset.name) + " is not staked"))
614618 else {
615619 let shopLandOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(shopLandAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
616620 if ((shopLandOwner == callerAddr))
617621 then throw("You cannot trade with yourself")
618622 else {
619623 let bpOrderParts = split_4C(bpOrderStr, ":")
620624 if ((size(bpOrderParts) != 3))
621625 then throw("bpOrderStr should contain exactly 2 ':' separators")
622626 else {
623627 let bpOrdRes = split(bpOrderParts[0], "_")
624628 let bpOrdMat = split(bpOrderParts[1], "_")
625629 let bpOrdProd = if ((bpOrderParts[2] == ""))
626630 then nil
627631 else split_4C(bpOrderParts[2], "_")
628632 if ((size(bpOrdRes) != NUMRES))
629633 then throw("All 6 resources should be passed")
630634 else if ((size(bpOrdMat) != NUMRES))
631635 then throw("All 6 materials should be passed")
632636 else {
633637 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [shopLandAssetId], nil))
634638 let currentWh = split_4C(wh, ":")
635639 let currWhRes = split(currentWh[whIdxRes], "_")
636640 let currWhMat = split(currentWh[whIdxMat], "_")
637641 let currWhProd = if ((currentWh[whIdxProd] == ""))
638642 then nil
639643 else split_4C(currentWh[whIdxProd], "_")
640644 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
641645 let ordKey = keyOrderByLand(shopLandAssetId)
642646 let whOrd = getOrder(ordKey)
643647 let whOrdRes = split(whOrd[ordIdxRes], "_")
644648 let whOrdMat = split(whOrd[ordIdxMat], "_")
645649 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
646650 then nil
647651 else split_4C(whOrd[ordIdxProd], "_")
648652 let r = {
649653 let $l = bpOrdRes
650654 let $s = size($l)
651655 let $acc0 = $Tuple13(nil, nil, nil, 0, 0, 0, 0, bpResList, currWhRes, whOrdRes, resTypes, false, 0)
652656 func $f0_1 ($a,$i) = if (($i >= $s))
653657 then $a
654658 else acceptCommon($a, $l[$i])
655659
656660 func $f0_2 ($a,$i) = if (($i >= $s))
657661 then $a
658662 else throw("List size exceeds 6")
659663
660664 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
661665 }
662666 let m = {
663667 let $l = bpOrdMat
664668 let $s = size($l)
665669 let $acc0 = $Tuple13(nil, nil, nil, r._4, r._5, r._6, 0, bpMatList, currWhMat, whOrdMat, matTypes, false, r._13)
666670 func $f1_1 ($a,$i) = if (($i >= $s))
667671 then $a
668672 else acceptCommon($a, $l[$i])
669673
670674 func $f1_2 ($a,$i) = if (($i >= $s))
671675 then $a
672676 else throw("List size exceeds 6")
673677
674678 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
675679 }
676680 let p = if ((size(bpOrdProd) != 0))
677681 then {
678682 let $l = bpOrdProd
679683 let $s = size($l)
680684 let $acc0 = $Tuple13(nil, nil, nil, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
681685 func $f2_1 ($a,$i) = if (($i >= $s))
682686 then $a
683687 else acceptCommon($a, $l[$i])
684688
685689 func $f2_2 ($a,$i) = if (($i >= $s))
686690 then $a
687691 else throw("List size exceeds 50")
688692
689693 $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)
690694 }
691695 else $Tuple13(currWhProd, whOrdProd, bpProdList, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
692696 let volSaldo = p._4
693697 let newLockedVol = if ((0 > (currWhLockedVol - volSaldo)))
694698 then 0
695699 else (currWhLockedVol - volSaldo)
696700 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(r._1, "_"), makeString(m._1, "_"), makeString_2C(p._1, "_"), toString(newLockedVol)], ":")
697701 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString_2C(p._2, "_")], ":")
698702 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, shopLandAssetId], nil))
699703 let accStatsResult = asInt(invoke(stakingContract, "updateAccStats", [shopLandOwner, fraction(xpShop, p._13, MULT8)], nil))
700704 $Tuple10(StringEntry(ordKey, newWhOrdStr), r._3, m._3, p._3, p._5, p._6, p._13, shopLandOwner, whSave, accStatsResult)
701705 }
702706 }
703707 }
704708 }
705709 }
706710
707711
708712 func sellResourcesWorldInternal (amount) = {
709713 let oneRes = (amount / 30)
710714 let oneFactoryAmounts = [oneRes, oneRes, oneRes, oneRes, oneRes, oneRes]
711715 let s = toString(oneRes)
712716 let resList = [s, s, s, s, s, s]
713717 let minPrices = [0, 0, 0, 0, 0, 0]
714718 func oneFactory (acc,continent) = {
715719 let x = sellResourcesCommon(resList, continent, oneFactoryAmounts, minPrices)
716720 $Tuple3((acc._1 ++ x._1), (acc._2 + x._3), (acc._3 + x._4))
717721 }
718722
719723 let $t02527025360 = {
720724 let $l = continents
721725 let $s = size($l)
722726 let $acc0 = $Tuple3(nil, 0, 0)
723727 func $f0_1 ($a,$i) = if (($i >= $s))
724728 then $a
725729 else oneFactory($a, $l[$i])
726730
727731 func $f0_2 ($a,$i) = if (($i >= $s))
728732 then $a
729733 else throw("List size exceeds 5")
730734
731735 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
732736 }
733737 let factoryActions = $t02527025360._1
734738 let usdtReceived = $t02527025360._2
735739 let totalRes = $t02527025360._3
736740 let fee = fraction(usdtReceived, DELIVERY_FEE, MULT6)
737741 let activitiesAmount = (usdtReceived / 100)
738742 let usdtLeft = ((usdtReceived - activitiesAmount) - fee)
739743 $Tuple5(factoryActions, usdtLeft, fee, activitiesAmount, totalRes)
740744 }
741745
742746
747+func craftGoodsCommon (matList,prodList,manufactoryContinent,productIdx,quantity) = if ((0 >= quantity))
748+ then throw("Quantity should be positive")
749+ else if (if ((0 > productIdx))
750+ then true
751+ else (productIdx >= size(productionMatrix)))
752+ then throw(("Unknown product idx=" + toString(productIdx)))
753+ else {
754+ let recipe = split(productionMatrix[productIdx], "_")
755+ if ((size(recipe) != RECIPESIZE))
756+ then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
757+ else {
758+ let productContIdx = parseIntValue(recipe[rIdxContinent])
759+ if ((continents[productContIdx] != manufactoryContinent))
760+ then throw(((("This product is available in " + continents[productContIdx]) + ", not in ") + manufactoryContinent))
761+ else {
762+ func filler (acc,ignoredItem) = {
763+ let n = acc._2
764+ let xs = if ((size(prodList) > n))
765+ then prodList[n]
766+ else "0"
767+ let x = parseIntValue(xs)
768+ let amount = (quantity * PRODUCTPKGSIZE)
769+ let y = if ((n == productIdx))
770+ then toString((x + amount))
771+ else xs
772+ $Tuple2((acc._1 :+ y), (n + 1))
773+ }
774+
775+ let newProd = ( let $l = productionMatrix
776+ let $s = size($l)
777+ let $acc0 = $Tuple2(nil, 0)
778+ func $f0_1 ($a,$i) = if (($i >= $s))
779+ then $a
780+ else filler($a, $l[$i])
781+
782+ func $f0_2 ($a,$i) = if (($i >= $s))
783+ then $a
784+ else throw("List size exceeds 50")
785+
786+ $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
787+ func producer (acc,j) = {
788+ let needMat = (((parseIntValue(recipe[j]) * MULT5) * quantity) * parseIntValue(recipe[rIdxCoeff]))
789+ let haveMat = parseIntValue(matList[j])
790+ if ((needMat > haveMat))
791+ then throw(((((((("You have " + fixedPoint(haveMat, 8)) + " of ") + matTypes[j]) + ", but recipe requires ") + fixedPoint(needMat, 8)) + " for quantity ") + toString(quantity)))
792+ else if ((needMat > 0))
793+ then $Tuple2((acc._1 :+ toString((haveMat - needMat))), (acc._2 + needMat))
794+ else $Tuple2((acc._1 :+ matList[j]), acc._2)
795+ }
796+
797+ let merged = {
798+ let $l = ITER6
799+ let $s = size($l)
800+ let $acc0 = $Tuple2(nil, 0)
801+ func $f1_1 ($a,$i) = if (($i >= $s))
802+ then $a
803+ else producer($a, $l[$i])
804+
805+ func $f1_2 ($a,$i) = if (($i >= $s))
806+ then $a
807+ else throw("List size exceeds 6")
808+
809+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
810+ }
811+ $Tuple3(merged._1, newProd, merged._2)
812+ }
813+ }
814+ }
815+
816+
743817 @Callable(i)
744818 func recalcLockedVolumeREADONLY (landAssetId,wh) = {
745819 let currentOrd = getOrder(keyOrderByLand(landAssetId))
746820 let z = setInternal(wh, currentOrd, currentOrd)
747821 $Tuple2(nil, (z._4 + z._5))
748822 }
749823
750824
751825
752826 @Callable(i)
753827 func constructorV1 (restAddr) = if ((i.caller != this))
754828 then throw("Permission denied")
755829 else [StringEntry(keyRestAddress(), restAddr)]
756830
757831
758832
759833 @Callable(i)
760834 func sellResources (amounts,minPrices) = {
761835 let prologResult = prolog()
762836 if ((prologResult == prologResult))
763837 then {
764838 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
765839 if ((size(i.payments) != 0))
766840 then throw("sellResources doesn't require any payments")
767841 else {
768842 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
769843 if ((curLocation[locIdxType] != "F"))
770844 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
771845 else {
772846 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
773847 let resList = split(currentPack[bpIdxRes], "_")
774- let $t02681526941 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
775- let factoryActions = $t02681526941._1
776- let newRes = $t02681526941._2
777- let usdtReceived = $t02681526941._3
778- let totalRes = $t02681526941._4
848+ let $t02889329019 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
849+ let factoryActions = $t02889329019._1
850+ let newRes = $t02889329019._2
851+ let usdtReceived = $t02889329019._3
852+ let totalRes = $t02889329019._4
779853 let activitiesAmount = (usdtReceived / 100)
780854 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
781855 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
782856 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
783857 $Tuple2(((factoryActions :+ ScriptTransfer(i.caller, (usdtReceived - activitiesAmount), usdtAssetId)) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
784858 }
785859 }
786860 }
787861 else throw("Strict value is not equal to itself.")
788862 }
789863
790864
791865
792866 @Callable(i)
793867 func sellResourcesWorld (addr,amount) = if ((i.caller != acresContract))
794868 then throw("Permission denied")
795869 else {
796- let $t02773327890 = sellResourcesWorldInternal(amount)
797- let factoryActions = $t02773327890._1
798- let usdtLeft = $t02773327890._2
799- let fee = $t02773327890._3
800- let activitiesAmount = $t02773327890._4
801- let totalRes = $t02773327890._5
870+ let $t02981129968 = sellResourcesWorldInternal(amount)
871+ let factoryActions = $t02981129968._1
872+ let usdtLeft = $t02981129968._2
873+ let fee = $t02981129968._3
874+ let activitiesAmount = $t02981129968._4
875+ let totalRes = $t02981129968._5
802876 if ((0 >= usdtLeft))
803877 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
804878 else {
805879 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
806880 $Tuple2((((factoryActions :+ IntegerEntry(deliveryFundKey, (valueOrElse(getInteger(deliveryFundKey), 0) + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ ScriptTransfer(investFundContract, usdtLeft, usdtAssetId)), $Tuple2(usdtLeft, statsResult))
807881 }
808882 }
809883
810884
811885
812886 @Callable(i)
813887 func sellResourcesWorldREADONLY (amount) = {
814888 let usdtLeft = sellResourcesWorldInternal(amount)._2
815889 $Tuple2(nil, usdtLeft)
816890 }
817891
818892
819893
820894 @Callable(i)
821895 func sellResourcesDuckDelivery (amounts,minPrices,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
822896 then throw("Delivery feature is turned off!")
823897 else {
824898 let prologResult = prolog()
825899 if ((prologResult == prologResult))
826900 then {
827901 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
828902 if ((size(i.payments) != 0))
829903 then throw("sellResources doesn't require any payments")
830904 else {
831905 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
832906 let resList = split(currentPack[bpIdxRes], "_")
833- let $t02912629247 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
834- let factoryActions = $t02912629247._1
835- let newRes = $t02912629247._2
836- let usdtReceived = $t02912629247._3
837- let totalRes = $t02912629247._4
907+ let $t03120431325 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
908+ let factoryActions = $t03120431325._1
909+ let newRes = $t03120431325._2
910+ let usdtReceived = $t03120431325._3
911+ let totalRes = $t03120431325._4
838912 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
839913 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
840914 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
841915 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
842- let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
843- then MIN_USDT_FEE_DELIVERY
844- else feePart
916+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
845917 let activitiesAmount = (usdtReceived / 100)
846918 if ((fee >= (usdtReceived - activitiesAmount)))
847919 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
848920 else {
849921 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
850922 $Tuple2((((factoryActions :+ ScriptTransfer(i.caller, ((usdtReceived - activitiesAmount) - fee), usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
851923 }
852924 }
853925 }
854926 else throw("Strict value is not equal to itself.")
855927 }
856928
857929
858930
859931 @Callable(i)
860932 func sellResourcesLandDelivery (amounts,minPrices,landAssetId,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
861933 then throw("Delivery feature is turned off!")
862934 else {
863935 let prologResult = prolog()
864936 if ((prologResult == prologResult))
865937 then if ((size(i.payments) != 0))
866938 then throw("sellResources doesn't require any payments")
867939 else {
868940 let user = i.caller
869941 let addr = toString(user)
870942 let asset = value(assetInfo(fromBase58String(landAssetId)))
871943 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
872944 then throw((("NFT " + asset.name) + " is not staked"))
873945 else {
874946 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
875947 if ((owner != addr))
876948 then throw((LANDPREFIX + " is not yours"))
877949 else {
878950 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
879951 let currentWh = split_4C(wh, ":")
880952 let resList = split(currentWh[whIdxRes], "_")
881- let $t03127731398 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
882- let factoryActions = $t03127731398._1
883- let newRes = $t03127731398._2
884- let usdtReceived = $t03127731398._3
885- let totalRes = $t03127731398._4
953+ let $t03331633437 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
954+ let factoryActions = $t03331633437._1
955+ let newRes = $t03331633437._2
956+ let usdtReceived = $t03331633437._3
957+ let totalRes = $t03331633437._4
886958 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), currentWh[whIdxMat], currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
887959 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
888960 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
889961 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
890- let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
891- then MIN_USDT_FEE_DELIVERY
892- else feePart
962+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
893963 let activitiesAmount = (usdtReceived / 100)
894964 if ((fee >= (usdtReceived - activitiesAmount)))
895965 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
896966 else {
897967 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
898968 $Tuple2((((factoryActions :+ ScriptTransfer(i.caller, ((usdtReceived - activitiesAmount) - fee), usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(whSave, prologResult, statsResult))
899969 }
900970 }
901971 }
902972 }
903973 else throw("Strict value is not equal to itself.")
904974 }
905975
906976
907977
908978 @Callable(i)
909979 func buyMaterials (amounts,maxPrices) = {
910980 let prologResult = prolog()
911981 if ((prologResult == prologResult))
912982 then {
913983 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
914984 if ((size(i.payments) != 1))
915985 then throw("exactly 1 payment must be attached")
916986 else {
917987 let pmt = i.payments[0]
918988 let amt = pmt.amount
919989 if (if (!(isDefined(pmt.assetId)))
920990 then true
921991 else (value(pmt.assetId) != usdtAssetId))
922992 then throw("USDT payments only!")
923993 else {
924994 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
925995 if ((curLocation[locIdxType] != "F"))
926996 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
927997 else {
928998 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
929999 let matList = split(currentPack[bpIdxMat], "_")
930- let $t03326133383 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
931- let factoryActions = $t03326133383._1
932- let newMat = $t03326133383._2
933- let usdtSpent = $t03326133383._3
934- let totalMat = $t03326133383._4
1000+ let $t03526135383 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
1001+ let factoryActions = $t03526135383._1
1002+ let newMat = $t03526135383._2
1003+ let usdtSpent = $t03526135383._3
1004+ let totalMat = $t03526135383._4
9351005 if ((usdtSpent > amt))
9361006 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
9371007 else {
9381008 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
9391009 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
9401010 let rest = if (((amt - usdtSpent) > 0))
9411011 then [ScriptTransfer(i.caller, (amt - usdtSpent), usdtAssetId)]
9421012 else nil
9431013 let activitiesAmount = (usdtSpent / 100)
9441014 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
9451015 $Tuple2(((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
9461016 }
9471017 }
9481018 }
9491019 }
9501020 }
9511021 else throw("Strict value is not equal to itself.")
9521022 }
9531023
9541024
9551025
9561026 @Callable(i)
9571027 func buyMaterialsDuckDelivery (amounts,maxPrices,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
9581028 then throw("Delivery feature is turned off!")
9591029 else {
9601030 let prologResult = prolog()
9611031 if ((prologResult == prologResult))
9621032 then {
9631033 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
9641034 if ((size(i.payments) != 1))
9651035 then throw("exactly 1 payment must be attached")
9661036 else {
9671037 let pmt = i.payments[0]
9681038 let amt = pmt.amount
9691039 if (if (!(isDefined(pmt.assetId)))
9701040 then true
9711041 else (value(pmt.assetId) != usdtAssetId))
9721042 then throw("USDT payments only!")
9731043 else {
9741044 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
9751045 let matList = split(currentPack[bpIdxMat], "_")
976- let $t03490435021 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
977- let factoryActions = $t03490435021._1
978- let newMat = $t03490435021._2
979- let usdtSpent = $t03490435021._3
980- let totalMat = $t03490435021._4
1046+ let $t03690437021 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1047+ let factoryActions = $t03690437021._1
1048+ let newMat = $t03690437021._2
1049+ let usdtSpent = $t03690437021._3
1050+ let totalMat = $t03690437021._4
9811051 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
9821052 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
9831053 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
9841054 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
985- let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
986- then MIN_USDT_FEE_DELIVERY
987- else feePart
1055+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
9881056 let usdtSpentWithFee = (usdtSpent + fee)
9891057 if ((usdtSpentWithFee > amt))
9901058 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
9911059 else {
9921060 let rest = if (((amt - usdtSpentWithFee) > 0))
9931061 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
9941062 else nil
9951063 let activitiesAmount = (usdtSpent / 100)
9961064 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
9971065 $Tuple2((((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
9981066 }
9991067 }
10001068 }
10011069 }
10021070 else throw("Strict value is not equal to itself.")
10031071 }
10041072
10051073
10061074
10071075 @Callable(i)
10081076 func buyMaterialsLandDelivery (amounts,maxPrices,landAssetId,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
10091077 then throw("Delivery feature is turned off!")
10101078 else {
10111079 let prologResult = prolog()
10121080 if ((prologResult == prologResult))
10131081 then if ((size(i.payments) != 1))
10141082 then throw("exactly 1 payment must be attached")
10151083 else {
10161084 let pmt = i.payments[0]
10171085 let amt = pmt.amount
10181086 if (if (!(isDefined(pmt.assetId)))
10191087 then true
10201088 else (value(pmt.assetId) != usdtAssetId))
10211089 then throw("USDT payments only!")
10221090 else {
10231091 let user = i.caller
10241092 let addr = toString(user)
10251093 let asset = value(assetInfo(fromBase58String(landAssetId)))
10261094 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
10271095 then throw((("NFT " + asset.name) + " is not staked"))
10281096 else {
10291097 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
10301098 if ((owner != addr))
10311099 then throw((LANDPREFIX + " is not yours"))
10321100 else {
10331101 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
10341102 let currentWh = split_4C(wh, ":")
10351103 let matList = split(currentWh[whIdxMat], "_")
1036- let $t03730237419 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1037- let factoryActions = $t03730237419._1
1038- let newMat = $t03730237419._2
1039- let usdtSpent = $t03730237419._3
1040- let totalMat = $t03730237419._4
1104+ let $t03926339380 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1105+ let factoryActions = $t03926339380._1
1106+ let newMat = $t03926339380._2
1107+ let usdtSpent = $t03926339380._3
1108+ let totalMat = $t03926339380._4
10411109 let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
10421110 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
10431111 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalMat, MULT8)], nil))
10441112 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
1045- let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
1046- then MIN_USDT_FEE_DELIVERY
1047- else feePart
1113+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
10481114 let usdtSpentWithFee = (usdtSpent + fee)
10491115 if ((usdtSpentWithFee > amt))
10501116 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
10511117 else {
10521118 let rest = if (((amt - usdtSpentWithFee) > 0))
10531119 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
10541120 else nil
10551121 let activitiesAmount = (usdtSpent / 100)
10561122 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
10571123 $Tuple2((((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
10581124 }
10591125 }
10601126 }
10611127 }
10621128 }
10631129 else throw("Strict value is not equal to itself.")
10641130 }
10651131
10661132
10671133
10681134 @Callable(i)
10691135 func exchangeResources (amounts) = {
10701136 let prologResult = prolog()
10711137 if ((prologResult == prologResult))
10721138 then {
10731139 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
10741140 if ((size(i.payments) != 1))
10751141 then throw("exactly 1 payment must be attached")
10761142 else {
10771143 let pmt = i.payments[0]
10781144 let amt = pmt.amount
10791145 if (if (!(isDefined(pmt.assetId)))
10801146 then true
10811147 else (value(pmt.assetId) != usdtAssetId))
10821148 then throw("USDT payments only!")
10831149 else {
10841150 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
10851151 if ((curLocation[locIdxType] != "F"))
10861152 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
10871153 else {
10881154 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
10891155 let resList = split(currentPack[bpIdxRes], "_")
10901156 let matList = split(currentPack[bpIdxMat], "_")
1091- let $t03953639642 = exchangeResourcesCommon(resList, matList, amounts)
1092- let newRes = $t03953639642._1
1093- let newMat = $t03953639642._2
1094- let usdtSpent = $t03953639642._3
1095- let totalAmountConverted = $t03953639642._4
1157+ let $t04145841564 = exchangeResourcesCommon(resList, matList, amounts)
1158+ let newRes = $t04145841564._1
1159+ let newMat = $t04145841564._2
1160+ let usdtSpent = $t04145841564._3
1161+ let totalAmountConverted = $t04145841564._4
10961162 if ((usdtSpent > amt))
10971163 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
10981164 else {
10991165 let newPack = makeString([currentPack[bpIdxLevel], makeString(newRes, "_"), makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
11001166 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
11011167 let rest = if (((amt - usdtSpent) > 0))
11021168 then [ScriptTransfer(i.caller, (amt - usdtSpent), usdtAssetId)]
11031169 else nil
11041170 let activitiesAmount = (usdtSpent / 100)
11051171 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
11061172 $Tuple2((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
11071173 }
11081174 }
11091175 }
11101176 }
11111177 }
11121178 else throw("Strict value is not equal to itself.")
11131179 }
11141180
11151181
11161182
11171183 @Callable(i)
11181184 func exchangeResourcesDuckDelivery (amounts) = if (!(KS_ALLOW_DELIVERY))
11191185 then throw("Delivery feature is turned off!")
11201186 else {
11211187 let prologResult = prolog()
11221188 if ((prologResult == prologResult))
11231189 then {
11241190 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
11251191 if ((size(i.payments) != 1))
11261192 then throw("exactly 1 payment must be attached")
11271193 else {
11281194 let pmt = i.payments[0]
11291195 let amt = pmt.amount
11301196 if (if (!(isDefined(pmt.assetId)))
11311197 then true
11321198 else (value(pmt.assetId) != usdtAssetId))
11331199 then throw("USDT payments only!")
11341200 else {
11351201 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
11361202 let resList = split(currentPack[bpIdxRes], "_")
11371203 let matList = split(currentPack[bpIdxMat], "_")
1138- let $t04115741263 = exchangeResourcesCommon(resList, matList, amounts)
1139- let newRes = $t04115741263._1
1140- let newMat = $t04115741263._2
1141- let usdtSpent = $t04115741263._3
1142- let totalAmountConverted = $t04115741263._4
1204+ let $t04307943185 = exchangeResourcesCommon(resList, matList, amounts)
1205+ let newRes = $t04307943185._1
1206+ let newMat = $t04307943185._2
1207+ let usdtSpent = $t04307943185._3
1208+ let totalAmountConverted = $t04307943185._4
11431209 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
1144- let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
1145- then MIN_USDT_FEE_DELIVERY15
1146- else feePart
1210+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY15])
11471211 let usdtSpentWithFee = (usdtSpent + fee)
11481212 if ((usdtSpentWithFee > amt))
11491213 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
11501214 else {
11511215 let newPack = makeString([currentPack[bpIdxLevel], makeString(newRes, "_"), makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
11521216 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
11531217 let rest = if (((amt - usdtSpentWithFee) > 0))
11541218 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
11551219 else nil
11561220 let activitiesAmount = (usdtSpent / 100)
11571221 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
11581222 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
11591223 $Tuple2(((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
11601224 }
11611225 }
11621226 }
11631227 }
11641228 else throw("Strict value is not equal to itself.")
11651229 }
11661230
11671231
11681232
11691233 @Callable(i)
11701234 func exchangeResourcesLandDelivery (amounts,landAssetId) = if (!(KS_ALLOW_DELIVERY))
11711235 then throw("Delivery feature is turned off!")
11721236 else {
11731237 let prologResult = prolog()
11741238 if ((prologResult == prologResult))
11751239 then if ((size(i.payments) != 1))
11761240 then throw("exactly 1 payment must be attached")
11771241 else {
11781242 let pmt = i.payments[0]
11791243 let amt = pmt.amount
11801244 if (if (!(isDefined(pmt.assetId)))
11811245 then true
11821246 else (value(pmt.assetId) != usdtAssetId))
11831247 then throw("USDT payments only!")
11841248 else {
11851249 let user = i.caller
11861250 let addr = toString(user)
11871251 let asset = value(assetInfo(fromBase58String(landAssetId)))
11881252 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
11891253 then throw((("NFT " + asset.name) + " is not staked"))
11901254 else {
11911255 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
11921256 if ((owner != addr))
11931257 then throw((LANDPREFIX + " is not yours"))
11941258 else {
11951259 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
11961260 let currentWh = split_4C(wh, ":")
11971261 let resList = split(currentWh[whIdxRes], "_")
11981262 let matList = split(currentWh[whIdxMat], "_")
1199- let $t04356643672 = exchangeResourcesCommon(resList, matList, amounts)
1200- let newRes = $t04356643672._1
1201- let newMat = $t04356643672._2
1202- let usdtSpent = $t04356643672._3
1203- let totalAmountConverted = $t04356643672._4
1263+ let $t04544745553 = exchangeResourcesCommon(resList, matList, amounts)
1264+ let newRes = $t04544745553._1
1265+ let newMat = $t04544745553._2
1266+ let usdtSpent = $t04544745553._3
1267+ let totalAmountConverted = $t04544745553._4
12041268 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
12051269 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
12061270 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
12071271 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
1208- let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
1209- then MIN_USDT_FEE_DELIVERY15
1210- else feePart
1272+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY15])
12111273 let usdtSpentWithFee = (usdtSpent + fee)
12121274 if ((usdtSpentWithFee > amt))
12131275 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
12141276 else {
12151277 let rest = if (((amt - usdtSpentWithFee) > 0))
12161278 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
12171279 else nil
12181280 let activitiesAmount = (usdtSpent / 100)
12191281 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
12201282 $Tuple2(((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
12211283 }
12221284 }
12231285 }
12241286 }
12251287 }
12261288 else throw("Strict value is not equal to itself.")
12271289 }
12281290
12291291
12301292
12311293 @Callable(i)
12321294 func craftGoods (productIdx,quantity) = {
12331295 let prologResult = prolog()
12341296 if ((prologResult == prologResult))
12351297 then if ((size(i.payments) != 1))
12361298 then throw("exactly 1 payment must be attached")
12371299 else {
12381300 let pmt = i.payments[0]
12391301 let amt = pmt.amount
1240- let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
1241- if ((pmtAssetId != usdtAssetId))
1302+ if (if (!(isDefined(pmt.assetId)))
1303+ then true
1304+ else (value(pmt.assetId) != usdtAssetId))
12421305 then throw("USDT payments only!")
12431306 else if ((amt != MULT6))
1244- then throw("exactly 1 USDT must be attached as payment")
1245- else if ((0 >= quantity))
1246- then throw("Quantity should be positive")
1247- else {
1248- let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
1249- let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
1250- if ((curLocation[locIdxType] != "M"))
1251- then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
1252- else {
1253- let cont = curLocation[locIdxContinent]
1254- let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
1255- let matList = split(currentPack[bpIdxMat], "_")
1256- if (if ((0 > productIdx))
1257- then true
1258- else (productIdx >= size(productionMatrix)))
1259- then throw(("Unknown product idx=" + toString(productIdx)))
1260- else {
1261- let recipe = split(productionMatrix[productIdx], "_")
1262- if ((size(recipe) != RECIPESIZE))
1263- then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
1264- else {
1265- let productContIdx = parseIntValue(recipe[rIdxContinent])
1266- if ((continents[productContIdx] != cont))
1267- then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
1268- else {
1269- let prodList = if ((currentPack[bpIdxProd] == ""))
1270- then nil
1271- else split_4C(currentPack[bpIdxProd], "_")
1272- func filler (acc,ignoredItem) = {
1273- let n = acc._2
1274- let xs = if ((size(prodList) > n))
1275- then prodList[n]
1276- else "0"
1277- let x = parseIntValue(xs)
1278- let amount = (quantity * PRODUCTPKGSIZE)
1279- let y = if ((n == productIdx))
1280- then toString((x + amount))
1281- else xs
1282- $Tuple2((acc._1 :+ y), (n + 1))
1283- }
1284-
1285- let bpProd = ( let $l = productionMatrix
1286- let $s = size($l)
1287- let $acc0 = $Tuple2(nil, 0)
1288- func $f0_1 ($a,$i) = if (($i >= $s))
1289- then $a
1290- else filler($a, $l[$i])
1291-
1292- func $f0_2 ($a,$i) = if (($i >= $s))
1293- then $a
1294- else throw("List size exceeds 50")
1295-
1296- $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
1297- func producer (acc,j) = {
1298- let needMat = (((parseIntValue(recipe[j]) * MULT5) * quantity) * parseIntValue(recipe[rIdxCoeff]))
1299- let haveMat = parseIntValue(matList[j])
1300- if ((needMat > haveMat))
1301- then throw(((((((("You have " + fixedPoint(haveMat, 8)) + " of ") + matTypes[j]) + ", but recipe requires ") + fixedPoint(needMat, 8)) + " for quantity ") + toString(quantity)))
1302- else if ((needMat > 0))
1303- then $Tuple2((acc._1 :+ toString((haveMat - needMat))), (acc._2 + needMat))
1304- else $Tuple2((acc._1 :+ matList[j]), acc._2)
1305- }
1306-
1307- let merged = {
1308- let $l = ITER6
1309- let $s = size($l)
1310- let $acc0 = $Tuple2(nil, 0)
1311- func $f1_1 ($a,$i) = if (($i >= $s))
1312- then $a
1313- else producer($a, $l[$i])
1314-
1315- func $f1_2 ($a,$i) = if (($i >= $s))
1316- then $a
1317- else throw("List size exceeds 6")
1318-
1319- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1320- }
1321- let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._1, "_"), makeString_2C(bpProd, "_")], ":")
1322- let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
1323- let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, merged._2, MULT8)], nil))
1324- $Tuple2(nil, $Tuple3(result, prologResult, statsResult))
1325- }
1326- }
1327- }
1328- }
1329- }
1307+ then throw((("exactly " + fixedPoint(CRAFT_USDT_COST, 6)) + " USDT must be attached as payment"))
1308+ else {
1309+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
1310+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
1311+ if ((curLocation[locIdxType] != "M"))
1312+ then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
1313+ else {
1314+ let cont = curLocation[locIdxContinent]
1315+ let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
1316+ let matList = split(currentPack[bpIdxMat], "_")
1317+ let prodList = if ((currentPack[bpIdxProd] == ""))
1318+ then nil
1319+ else split_4C(currentPack[bpIdxProd], "_")
1320+ let $t04787847975 = craftGoodsCommon(matList, prodList, cont, productIdx, quantity)
1321+ let newMat = $t04787847975._1
1322+ let newProd = $t04787847975._2
1323+ let matSpent = $t04787847975._3
1324+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), makeString_2C(newProd, "_")], ":")
1325+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
1326+ let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, matSpent, MULT8)], nil))
1327+ $Tuple2(nil, $Tuple3(result, prologResult, statsResult))
1328+ }
1329+ }
13301330 }
13311331 else throw("Strict value is not equal to itself.")
13321332 }
1333+
1334+
1335+
1336+@Callable(i)
1337+func craftGoodsDuckDelivery (productIdx,quantity,manufactoryContinent) = if (!(KS_ALLOW_DELIVERY))
1338+ then throw("Delivery feature is turned off!")
1339+ else {
1340+ let prologResult = prolog()
1341+ if ((prologResult == prologResult))
1342+ then {
1343+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
1344+ if ((size(i.payments) != 1))
1345+ then throw("exactly 1 payment must be attached")
1346+ else {
1347+ let pmt = i.payments[0]
1348+ let amt = pmt.amount
1349+ if (if (!(isDefined(pmt.assetId)))
1350+ then true
1351+ else (value(pmt.assetId) != usdtAssetId))
1352+ then throw("USDT payments only!")
1353+ else {
1354+ let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
1355+ let matList = split(currentPack[bpIdxMat], "_")
1356+ let prodList = if ((currentPack[bpIdxProd] == ""))
1357+ then nil
1358+ else split_4C(currentPack[bpIdxProd], "_")
1359+ let $t04920049313 = craftGoodsCommon(matList, prodList, manufactoryContinent, productIdx, quantity)
1360+ let newMat = $t04920049313._1
1361+ let newProd = $t04920049313._2
1362+ let matSpent = $t04920049313._3
1363+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), makeString_2C(newProd, "_")], ":")
1364+ let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
1365+ let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, matSpent, MULT8)], nil))
1366+ let feePart = fraction(quantity, MIN_USDT_FEE_DELIVERY, CRAFT_DELIVERY_COEFF)
1367+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
1368+ let usdtSpentWithFee = (CRAFT_USDT_COST + fee)
1369+ if ((usdtSpentWithFee > amt))
1370+ then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(CRAFT_USDT_COST, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
1371+ else {
1372+ let rest = if (((amt - usdtSpentWithFee) > 0))
1373+ then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
1374+ else nil
1375+ let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
1376+ $Tuple2((rest :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
1377+ }
1378+ }
1379+ }
1380+ }
1381+ else throw("Strict value is not equal to itself.")
1382+ }
1383+
1384+
1385+
1386+@Callable(i)
1387+func craftGoodsLandDelivery (productIdx,quantity,landAssetId,manufactoryContinent) = if (!(KS_ALLOW_DELIVERY))
1388+ then throw("Delivery feature is turned off!")
1389+ else {
1390+ let prologResult = prolog()
1391+ if ((prologResult == prologResult))
1392+ then if ((size(i.payments) != 1))
1393+ then throw("exactly 1 payment must be attached")
1394+ else {
1395+ let pmt = i.payments[0]
1396+ let amt = pmt.amount
1397+ if (if (!(isDefined(pmt.assetId)))
1398+ then true
1399+ else (value(pmt.assetId) != usdtAssetId))
1400+ then throw("USDT payments only!")
1401+ else {
1402+ let user = i.caller
1403+ let addr = toString(user)
1404+ let asset = value(assetInfo(fromBase58String(landAssetId)))
1405+ if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
1406+ then throw((("NFT " + asset.name) + " is not staked"))
1407+ else {
1408+ let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
1409+ if ((owner != addr))
1410+ then throw((LANDPREFIX + " is not yours"))
1411+ else {
1412+ let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
1413+ let currentWh = split_4C(wh, ":")
1414+ let matList = split(currentWh[whIdxMat], "_")
1415+ let prodList = if ((currentWh[whIdxProd] == ""))
1416+ then nil
1417+ else split_4C(currentWh[whIdxProd], "_")
1418+ let $t05155651669 = craftGoodsCommon(matList, prodList, manufactoryContinent, productIdx, quantity)
1419+ let newMat = $t05155651669._1
1420+ let newProd = $t05155651669._2
1421+ let matSpent = $t05155651669._3
1422+ let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), makeString_2C(newProd, "_"), currentWh[whIdxLOFT]], ":")
1423+ let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
1424+ let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpCraft, matSpent, MULT8)], nil))
1425+ let feePart = fraction(quantity, MIN_USDT_FEE_DELIVERY, CRAFT_DELIVERY_COEFF)
1426+ let fee = max([feePart, MIN_USDT_FEE_DELIVERY])
1427+ let usdtSpentWithFee = (CRAFT_USDT_COST + fee)
1428+ if ((usdtSpentWithFee > amt))
1429+ then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(CRAFT_USDT_COST, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
1430+ else {
1431+ let rest = if (((amt - usdtSpentWithFee) > 0))
1432+ then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
1433+ else nil
1434+ let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
1435+ $Tuple2((rest :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
1436+ }
1437+ }
1438+ }
1439+ }
1440+ }
1441+ else throw("Strict value is not equal to itself.")
1442+ }
13331443
13341444
13351445
13361446 @Callable(i)
13371447 func setWarehouseOrder (newOrderStr,landAssetId) = {
13381448 let user = i.originCaller
13391449 let addr = toString(user)
13401450 let result = if ((user != restContract))
13411451 then checkBlocked()
13421452 else false
13431453 let asset = value(assetInfo(fromBase58String(landAssetId)))
13441454 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
13451455 then throw((("NFT " + asset.name) + " is not staked"))
13461456 else {
13471457 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
13481458 if (if ((user != restContract))
13491459 then (owner != addr)
13501460 else false)
13511461 then throw((LANDPREFIX + " is not yours"))
13521462 else {
13531463 let newOrder = split_4C(newOrderStr, ":")
13541464 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
13551465 let currentWh = split_4C(wh, ":")
13561466 let loft = split(currentWh[whIdxLOFT], "_")
13571467 let whTotal = parseIntValue(loft[volTotal])
13581468 let ordKey = keyOrderByLand(landAssetId)
13591469 let currentOrd = getOrder(ordKey)
13601470 let z = setInternal(currentWh, currentOrd, newOrder)
13611471 let buyVolSaldo = z._4
13621472 let sellVolSaldo = z._5
13631473 let whOccupied = z._7
13641474 let whLocked = (buyVolSaldo + sellVolSaldo)
13651475 let whFree = ((whTotal - whOccupied) - whLocked)
13661476 if ((0 > whFree))
13671477 then throw((((((("Attempt to reserve " + toString(buyVolSaldo)) + " space for buy orders, and ") + toString(sellVolSaldo)) + " space for sell orders (and occupied=") + toString(whOccupied)) + "), leads to negative free space"))
13681478 else {
13691479 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(z._1, "_"), makeString(z._2, "_"), makeString_2C(z._3, "_"), toString(whLocked)], ":")
13701480 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
13711481 let usdSaldo = z._6
13721482 let actions = if ((usdSaldo > 0))
13731483 then if ((size(i.payments) != 1))
13741484 then throw("exactly 1 payment must be attached")
13751485 else {
13761486 let pmt = i.payments[0]
13771487 let amt = pmt.amount
13781488 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
13791489 if ((pmtAssetId != usdtAssetId))
13801490 then throw("USDT payments only!")
13811491 else if ((amt != usdSaldo))
13821492 then throw(("Payment needed is " + toString(usdSaldo)))
13831493 else [StringEntry(ordKey, newOrderStr)]
13841494 }
13851495 else if ((usdSaldo == 0))
13861496 then if ((size(i.payments) != 0))
13871497 then throw("No payments needed")
13881498 else [StringEntry(ordKey, newOrderStr)]
13891499 else if ((size(i.payments) != 0))
13901500 then throw("No payments needed")
13911501 else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, newOrderStr)]
13921502 $Tuple2(actions, $Tuple2(result, whSave))
13931503 }
13941504 }
13951505 }
13961506 }
13971507
13981508
13991509
14001510 @Callable(i)
14011511 func acceptWarehouseOrder (bpOrderStr,shopLandAssetId,duckAssetId) = {
14021512 let prologResult = prolog()
14031513 if ((prologResult == prologResult))
14041514 then {
14051515 let caller = i.originCaller
14061516 let callerAddr = toString(caller)
14071517 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
14081518 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
14091519 let loc = split(value(curLocation), "_")
14101520 if ((loc[locIdxType] != "L"))
14111521 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
14121522 else if ((stakedDuckAssetId != duckAssetId))
14131523 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
14141524 else {
14151525 let bpKey = keyBackpackByDuck(duckAssetId)
14161526 let currentPack = getBackpack(bpKey)
14171527 let bpResList = split(currentPack[bpIdxRes], "_")
14181528 let bpMatList = split(currentPack[bpIdxMat], "_")
14191529 let bpProdList = if ((currentPack[bpIdxProd] == ""))
14201530 then nil
14211531 else split_4C(currentPack[bpIdxProd], "_")
1422- let $t05319053430 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1423- let shopAction = $t05319053430._1
1424- let newUserRes = $t05319053430._2
1425- let newUserMat = $t05319053430._3
1426- let newUserProd = $t05319053430._4
1427- let usdWh2BpSaldo = $t05319053430._5
1428- let usdBp2WhSaldo = $t05319053430._6
1429- let xpAmount = $t05319053430._7
1430- let shopLandOwner = $t05319053430._8
1431- let shopWhSave = $t05319053430._9
1432- let accStatsResult = $t05319053430._10
1532+ let $t05758257822 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1533+ let shopAction = $t05758257822._1
1534+ let newUserRes = $t05758257822._2
1535+ let newUserMat = $t05758257822._3
1536+ let newUserProd = $t05758257822._4
1537+ let usdWh2BpSaldo = $t05758257822._5
1538+ let usdBp2WhSaldo = $t05758257822._6
1539+ let xpAmount = $t05758257822._7
1540+ let shopLandOwner = $t05758257822._8
1541+ let shopWhSave = $t05758257822._9
1542+ let accStatsResult = $t05758257822._10
14331543 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, 0)]
14341544 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, 0)
14351545 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
14361546 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
14371547 let duckStatsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpShop, xpAmount, MULT8)], nil))
14381548 $Tuple2((actions1 ++ actions2), $Tuple5(prologResult, shopWhSave, bpSave, duckStatsResult, accStatsResult))
14391549 }
14401550 }
14411551 else throw("Strict value is not equal to itself.")
14421552 }
14431553
14441554
14451555
14461556 @Callable(i)
14471557 func acceptShopOrderDuckDelivery (orderStr,shopLandAssetId) = if (!(KS_ALLOW_DELIVERY))
14481558 then throw("Delivery feature is turned off!")
14491559 else {
14501560 let prologResult = prolog()
14511561 if ((prologResult == prologResult))
14521562 then {
14531563 let caller = i.originCaller
14541564 let callerAddr = toString(caller)
14551565 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
14561566 let bpKey = keyBackpackByDuck(duckAssetId)
14571567 let currentPack = getBackpack(bpKey)
14581568 let bpResList = split(currentPack[bpIdxRes], "_")
14591569 let bpMatList = split(currentPack[bpIdxMat], "_")
14601570 let bpProdList = if ((currentPack[bpIdxProd] == ""))
14611571 then nil
14621572 else split_4C(currentPack[bpIdxProd], "_")
1463- let $t05487255110 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1464- let shopAction = $t05487255110._1
1465- let newUserRes = $t05487255110._2
1466- let newUserMat = $t05487255110._3
1467- let newUserProd = $t05487255110._4
1468- let usdWh2BpSaldo = $t05487255110._5
1469- let usdBp2WhSaldo = $t05487255110._6
1470- let xpAmount = $t05487255110._7
1471- let shopLandOwner = $t05487255110._8
1472- let shopWhSave = $t05487255110._9
1473- let accStatsResult = $t05487255110._10
1573+ let $t05926459502 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1574+ let shopAction = $t05926459502._1
1575+ let newUserRes = $t05926459502._2
1576+ let newUserMat = $t05926459502._3
1577+ let newUserProd = $t05926459502._4
1578+ let usdWh2BpSaldo = $t05926459502._5
1579+ let usdBp2WhSaldo = $t05926459502._6
1580+ let xpAmount = $t05926459502._7
1581+ let shopLandOwner = $t05926459502._8
1582+ let shopWhSave = $t05926459502._9
1583+ let accStatsResult = $t05926459502._10
14741584 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
1475- let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
1476- then MIN_USDT_FEE_DELIVERY
1477- else deliveryFeePart
1585+ let deliveryFee = max([deliveryFeePart, MIN_USDT_FEE_DELIVERY])
14781586 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
14791587 let receivedFee = (deliveryFee - spentFee)
14801588 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
14811589 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, receivedFee)]
14821590 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, spentFee)
14831591 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
14841592 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
14851593 let duckStatsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpShop, xpAmount, MULT8)], nil))
14861594 $Tuple2(((actions1 ++ actions2) :+ IntegerEntry(deliveryFundKey, (fundTotal + deliveryFee))), $Tuple5(prologResult, shopWhSave, bpSave, duckStatsResult, accStatsResult))
14871595 }
14881596 else throw("Strict value is not equal to itself.")
14891597 }
14901598
14911599
14921600
14931601 @Callable(i)
14941602 func acceptShopOrderLandDelivery (orderStr,shopLandAssetId,myLandAssetId) = if (!(KS_ALLOW_DELIVERY))
14951603 then throw("Delivery feature is turned off!")
14961604 else {
14971605 let prologResult = prolog()
14981606 if ((prologResult == prologResult))
14991607 then {
15001608 let caller = i.originCaller
15011609 let callerAddr = toString(caller)
15021610 let asset = value(assetInfo(fromBase58String(myLandAssetId)))
15031611 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(myLandAssetId)))))
15041612 then throw((("NFT " + asset.name) + " is not staked"))
15051613 else {
15061614 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(myLandAssetId)), (("NFT " + asset.name) + " is orphaned"))
15071615 if ((owner != callerAddr))
15081616 then throw((LANDPREFIX + " is not yours"))
15091617 else {
15101618 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [myLandAssetId], nil))
15111619 let currentWh = split_4C(wh, ":")
15121620 let resList = split(currentWh[whIdxRes], "_")
15131621 let matList = split(currentWh[whIdxMat], "_")
15141622 let prodList = if ((currentWh[whIdxProd] == ""))
15151623 then nil
1516- else split(currentWh[whIdxProd], "_")
1517- let $t05735257584 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1518- let shopAction = $t05735257584._1
1519- let newUserRes = $t05735257584._2
1520- let newUserMat = $t05735257584._3
1521- let newUserProd = $t05735257584._4
1522- let usdWh2BpSaldo = $t05735257584._5
1523- let usdBp2WhSaldo = $t05735257584._6
1524- let xpAmount = $t05735257584._7
1525- let shopLandOwner = $t05735257584._8
1526- let shopWhSave = $t05735257584._9
1527- let accStatsResult = $t05735257584._10
1624+ else split_4C(currentWh[whIdxProd], "_")
1625+ let $t06170061932 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1626+ let shopAction = $t06170061932._1
1627+ let newUserRes = $t06170061932._2
1628+ let newUserMat = $t06170061932._3
1629+ let newUserProd = $t06170061932._4
1630+ let usdWh2BpSaldo = $t06170061932._5
1631+ let usdBp2WhSaldo = $t06170061932._6
1632+ let xpAmount = $t06170061932._7
1633+ let shopLandOwner = $t06170061932._8
1634+ let shopWhSave = $t06170061932._9
1635+ let accStatsResult = $t06170061932._10
15281636 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
1529- let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
1530- then MIN_USDT_FEE_DELIVERY
1531- else deliveryFeePart
1637+ let deliveryFee = max([deliveryFeePart, MIN_USDT_FEE_DELIVERY])
15321638 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
15331639 let receivedFee = (deliveryFee - spentFee)
15341640 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
15351641 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, receivedFee)]
15361642 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, spentFee)
15371643 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString(newUserProd, "_"), currentWh[whIdxLOFT]], ":")
15381644 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, myLandAssetId], nil))
15391645 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [callerAddr, fraction(xpShop, xpAmount, MULT8)], nil))
15401646 $Tuple2(((actions1 ++ actions2) :+ IntegerEntry(deliveryFundKey, (fundTotal + deliveryFee))), $Tuple5(prologResult, shopWhSave, whSave, statsResult, accStatsResult))
15411647 }
15421648 }
15431649 }
15441650 else throw("Strict value is not equal to itself.")
15451651 }
15461652
15471653
15481654
15491655 @Callable(i)
15501656 func sellProductsToES (amounts) = {
15511657 let prologResult = prolog()
15521658 if ((prologResult == prologResult))
15531659 then if ((size(i.payments) != 0))
15541660 then throw("No payments needed")
15551661 else {
15561662 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
15571663 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
15581664 if ((curLocation[locIdxType] != "A"))
15591665 then throw(("Duck location type should be Airport, but is " + curLocation[locIdxType]))
15601666 else {
15611667 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
15621668 let prodList = if ((currentPack[bpIdxProd] == ""))
15631669 then nil
15641670 else split_4C(currentPack[bpIdxProd], "_")
15651671 let esKey = keyEsWarehouse()
15661672 let existStr = getString(esKey)
15671673 let existAmounts = if (isDefined(existStr))
15681674 then split_4C(value(existStr), "_")
15691675 else nil
15701676 func moveProd (acc,recipeStr) = {
15711677 let j = acc._1
15721678 let quantity = if ((size(amounts) > j))
15731679 then amounts[j]
15741680 else 0
15751681 if ((0 > quantity))
15761682 then throw("Quantity cannot be negative")
15771683 else {
15781684 let recipe = split(recipeStr, "_")
15791685 if ((size(recipe) != RECIPESIZE))
15801686 then throw(("Fatal: unknown recipe: " + recipeStr))
15811687 else {
15821688 let maxAmount = (ESMAXPACKAGES * PRODUCTPKGSIZE)
15831689 let existAmount = if ((size(existAmounts) > j))
15841690 then parseIntValue(existAmounts[j])
15851691 else 0
15861692 let canBuy = (maxAmount - existAmount)
15871693 if ((quantity > canBuy))
15881694 then throw(((("Warehouse can buy only " + toString(canBuy)) + " of ") + prodTypes[j]))
15891695 else {
15901696 let totalMat = getRecipeMaterials(recipe)
15911697 let unitPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
15921698 let bpProdAmount = if ((size(prodList) > j))
15931699 then parseIntValue(prodList[j])
15941700 else 0
15951701 if ((quantity > bpProdAmount))
15961702 then throw(((("You have only " + toString(bpProdAmount)) + " of ") + prodTypes[j]))
15971703 else $Tuple5((j + 1), (acc._2 + (unitPrice * quantity)), (acc._3 :+ toString((bpProdAmount - quantity))), (acc._4 :+ toString((existAmount + quantity))), (acc._5 + (totalMat * quantity)))
15981704 }
15991705 }
16001706 }
16011707 }
16021708
16031709 let merged = {
16041710 let $l = productionMatrix
16051711 let $s = size($l)
16061712 let $acc0 = $Tuple5(0, 0, nil, nil, 0)
16071713 func $f0_1 ($a,$i) = if (($i >= $s))
16081714 then $a
16091715 else moveProd($a, $l[$i])
16101716
16111717 func $f0_2 ($a,$i) = if (($i >= $s))
16121718 then $a
16131719 else throw("List size exceeds 50")
16141720
16151721 $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)
16161722 }
16171723 let newBpStr = makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], makeString_2C(merged._3, "_")], ":")
16181724 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
16191725 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpSellToEs, merged._5, (MULT8 * 10))], nil))
16201726 $Tuple2([StringEntry(esKey, makeString_2C(merged._4, "_")), ScriptTransfer(i.caller, merged._2, usdtAssetId)], $Tuple3(bpSave, prologResult, statsResult))
16211727 }
16221728 }
16231729 else throw("Strict value is not equal to itself.")
16241730 }
16251731
16261732
16271733
16281734 @Callable(i)
16291735 func updateEsStorage (newStorage) = if ((i.caller != stakingContract))
16301736 then throw("Permission denied")
16311737 else $Tuple2([StringEntry(keyEsWarehouse(), newStorage)], newStorage)
16321738
16331739
16341740
16351741 @Callable(i)
16361742 func updateDeliveryLocked (newAmount) = if ((i.caller != stakingContract))
16371743 then throw("Permission denied")
16381744 else $Tuple2([IntegerEntry(deliveryLockedKey, newAmount)], newAmount)
16391745
16401746
16411747
16421748 @Callable(i)
16431749 func sendDeliveryReward (addr) = if ((i.caller != stakingContract))
16441750 then throw("Permission denied")
16451751 else {
16461752 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
16471753 let lockedTotal = valueOrElse(getInteger(deliveryLockedKey), 0)
16481754 let acresAmount = (MIN_USDT_FEE_DELIVERY * USDT2ACRES_MULTIPLIER)
16491755 let acresResult = invoke(acresContract, "sendAcres", [addr, acresAmount], nil)
16501756 $Tuple2([IntegerEntry(deliveryFundKey, (fundTotal - MIN_USDT_FEE_DELIVERY)), IntegerEntry(deliveryLockedKey, (lockedTotal - MIN_USDT_FEE_DELIVERY))], acresResult)
16511757 }
16521758
16531759

github/deemru/w8io/873ac7e 
251.51 ms