tx · 69NH1WWfLS8FraSQvZgE4RXskz6H7ZVhHnKfkqofYkCb

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.05700000 Waves

2023.09.24 19:59 [2769751] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "69NH1WWfLS8FraSQvZgE4RXskz6H7ZVhHnKfkqofYkCb", "fee": 5700000, "feeAssetId": null, "timestamp": 1695574796030, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "2n3ZY7E7qBwzfJawZ8Lt5wgC6537NjyK6g2Eu9kmCsP1wcSwkUJY9Ur9iVTNAveBixgPMvx12uzUM55CdTiT37H7" ], "script": "base64:BgKGAQgCEgQKAggYEgMKAQgSBAoCERESBAoCCAESAwoBARIFCgMREQgSBgoEEREICBIECgIRERIFCgMREQgSBgoEEREICBIDCgEREgMKARESBAoCEQgSBAoCAQESBAoCCAgSBQoDCAgIEgQKAggIEgUKAwgICBIDCgEREgMKAQgSAwoBARIDCgEIZgAHeHBUcmFkZQCQTgAHeHBDcmFmdACQTgAKeHBTZWxsVG9FcwCQTgAGeHBTaG9wAJBOAApMQU5EUFJFRklYAgRMQU5EAAZOVU1SRVMABgAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EAEFJFU09VUkNFUFJJQ0VNSU4A1bUCAA1FU01BWFBBQ0tBR0VTAAoACUVTQlVZQ09FRgAEABVNSU5fVVNEVF9GRUVfREVMSVZFUlkA0IYDABdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQD4yQQACHJlc1R5cGVzCQDMCAICA09pbAkAzAgCAgNPcmUJAMwIAgIEV29vZAkAzAgCAgRTYW5kCQDMCAICBENsYXkJAMwIAgIHT3JnYW5pYwUDbmlsAAhtYXRUeXBlcwkAzAgCAgRGdWVsCQDMCAICBU1ldGFsCQDMCAICBVBsYW5rCQDMCAICBUdsYXNzCQDMCAICB1BsYXN0aWMJAMwIAgIHUHJvdGVpbgUDbmlsAAlwcm9kVHlwZXMJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMQkAzAgCAhBGaXJzdCBBaWQgS2l0IEwyCQDMCAICEEZpcnN0IEFpZCBLaXQgTDMJAMwIAgILQmFja3BhY2sgTDEJAMwIAgILQmFja3BhY2sgTDIJAMwIAgILQmFja3BhY2sgTDMJAMwIAgIORm9vZCBSYXRpb24gTDEJAMwIAgIORm9vZCBSYXRpb24gTDIJAMwIAgIORm9vZCBSYXRpb24gTDMJAMwIAgILSmV0IFBhY2sgTDEJAMwIAgILSmV0IFBhY2sgTDIJAMwIAgILSmV0IFBhY2sgTDMJAMwIAgIJU2hpZWxkIEwxCQDMCAICCVNoaWVsZCBMMgkAzAgCAglTaGllbGQgTDMJAMwIAgIHTWluZSBMMQkAzAgCAgdNaW5lIEwyCQDMCAICB01pbmUgTDMJAMwIAgIHVHJhcCBMMQkAzAgCAgdUcmFwIEwyCQDMCAICB1RyYXAgTDMFA25pbAAKY29udGluZW50cwkAzAgCAghBbWVyaWNhcwkAzAgCAgZFdXJvcGUJAMwIAgIEQXNpYQkAzAgCAgZBZnJpY2EJAMwIAgIHT2NlYW5pYQUDbmlsAAlDT0VGRjJNQVQAgK3iBAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAiU4XzhfOF8xN18xN180Ml8xMl8wXzMwXzAsMCwwLDAsMCwwLDBfCQDMCAICJThfOF84XzE3XzE3XzQyXzI0XzBfNjBfMCwwLDUsMiwwLDAsMF8JAMwIAgInOF84XzhfMTdfMTdfNDJfMzZfMF8xMjBfMCwwLDEwLDQsMCwwLDBfCQDMCAICKThfMTlfMTlfOF8yN18xOV8yNl8xXzIwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV81Ml8xXzQwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV83OF8xXzgwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICJThfOF84XzhfOF82MF8xM18yXzJfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzI2XzJfNF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAiU4XzhfOF84XzhfNjBfMzlfMl84XzAsMCwwLDAsMCwwLDBfMDExCQDMCAICKTMwXzMwXzNfMTdfMTdfM18zMF8zXzMwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM182MF8zXzUwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM185MF8zXzcwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzExXzRfMTBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMjJfNF8yMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8zM180XzMwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKjRfMTNfMjJfNF8zNV8yMl8yM18wXzUwLDEsMF8wLDAsMCwwLDAsMCwwXwkAzAgCAio0XzEzXzIyXzRfMzVfMjJfNDZfMF81MCwxLDFfMCwyLDUsMCwwLDAsMF8JAMwIAgIrNF8xM18yMl80XzM1XzIyXzY5XzBfNTAsMiwxXzAsNSwxMCwwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfMjBfMV8zMCwxLDFfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzQwXzFfMzAsMSwyXzIsMSwzLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV82MF8xXzMwLDEsM181LDIsOCwwLDAsMCwwXwUDbmlsAAlySWR4Q29lZmYABgANcklkeENvbnRpbmVudAAHAApSRUNJUEVTSVpFAAsADlBST0RVQ1RQS0dTSVpFAAoAC3doSWR4TGV2ZWxzAAAACHdoSWR4UmVzAAEACHdoSWR4TWF0AAIACXdoSWR4UHJvZAADAAl3aElkeExPRlQABAAJdm9sTG9ja2VkAAAACHZvbFRvdGFsAAMACmJwSWR4TGV2ZWwAAAAIYnBJZHhSZXMAAQAIYnBJZHhNYXQAAgAJYnBJZHhQcm9kAAMAD2xvY0lkeENvbnRpbmVudAAAAApsb2NJZHhUeXBlAAEACGxvY0lkeElkAAIBFWtleUxhbmRBc3NldElkVG9Pd25lcgEHYXNzZXRJZAkArAICAgNub18FB2Fzc2V0SWQBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBB2Fzc2V0SWQJAKwCAgIDc3RfBQdhc3NldElkAQ9rZXlBZGRyZXNzUmVmQnkBBGFkZHIJAKwCAgIJYWNjUmVmQnlfBQRhZGRyARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyARFrZXlCYWNrcGFja0J5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIJYmFja1BhY2tfBQtkdWNrQXNzZXRJZAEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAEOa2V5T3JkZXJCeUxhbmQBC2xhbmRBc3NldElkCQCsAgICCmxhbmRPcmRlcl8FC2xhbmRBc3NldElkAQ5rZXlFc1dhcmVob3VzZQACGmVtZXJnZW5jeVdhcmVob3VzZVByb2R1Y3RzAA9kZWxpdmVyeUZ1bmRLZXkCDGRlbGl2ZXJ5RnVuZAARZGVsaXZlcnlMb2NrZWRLZXkCDmRlbGl2ZXJ5TG9ja2VkARJnZXRSZWNpcGVNYXRlcmlhbHMBBnJlY2lwZQkAaAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZyZWNpcGUFCXJJZHhDb2VmZgUJQ09FRkYyTUFUABFLU19BTExPV19ERUxJVkVSWQYABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDUAoI0GAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8ABk1VTFQxMACAyK+gJQAOTUlOU0hPUFBBWU1FTlQAoI0GAAVJVEVSNgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQAUSWR4Q2ZnSW52ZXN0RnVuZERhcHAABgAPSWR4Q2ZnQWNyZXNEYXBwAAgBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwAA1hY3Jlc0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUPSWR4Q2ZnQWNyZXNEYXBwAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQHbG93UGFydAkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cEBnplcm9lcwkAsAICCQCkAwEFBnRlblBvdwkAZAIAAQkAsQIBBQdsb3dQYXJ0CQCsAgIJAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgUGemVyb2VzBQdsb3dQYXJ0ABNGQUNUT1JZTUFYV0FSRUhPVVNFAIDIr6AlAA5TRUxMTVVMVElQTElFUgDIAQANQlVZTVVMVElQTElFUgCsAgAKQVVDVElPTkZFRQCQTgAMREVMSVZFUllfRkVFAJBOAA5ERUxJVkVSWV9GRUUxNQCYdQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAglmYWN0b3J5SWQHcmVzVHlwZQkArAICCQCsAgIJAKwCAgIbZmFjdG9yeVdoQnlDb250aW5lbnRBbmRSZXNfBQlmYWN0b3J5SWQCAV8JAKQDAQUHcmVzVHlwZQAJb3JkSWR4UmVzAAAACW9yZElkeE1hdAABAApvcmRJZHhQcm9kAAIBCGdldE9yZGVyAQZvcmRLZXkEAXAJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQZvcmRLZXkCMDBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOjBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOgIBOgkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCW9yZElkeFJlcwIBXwUGTlVNUkVTCQCRAwIFAXAFCW9yZElkeFJlcwIXMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQlvcmRJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQlvcmRJZHhNYXQCFzBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwCQDMCAIJAJEDAgUBcAUKb3JkSWR4UHJvZAUDbmlsAQh0b1ZvbHVtZQMGYW1vdW50B3BrZ1NpemUJaXNQcm9kdWN0AwUJaXNQcm9kdWN0BARwa2dzAwkAZwIFBmFtb3VudAAACQBpAgkAZQIJAGQCBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkBAS0BCQBpAgkAZQIJAGQCCQEBLQEFBmFtb3VudAUHcGtnU2l6ZQABBQdwa2dTaXplCQBoAgUEcGtncwUFTVVMVDgFBmFtb3VudAEMc2VsbEludGVybmFsBAVsb2NJZAdyZXNUeXBlBmFtb3VudAhtaW5QcmljZQQFd2hLZXkJAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCBQVsb2NJZAUHcmVzVHlwZQQCdzAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUFd2hLZXkAAAQCcjADCQBmAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UAAAMJAGYCCQBkAgUCdzAFBmFtb3VudAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAZQIFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFAncwBQZhbW91bnQEDHVzZHRSZWNlaXZlZAkAZAIJAGsDBQJyMAkAZQIJAGgCBQ5TRUxMTVVMVElQTElFUgUQUkVTT1VSQ0VQUklDRU1JTgkAawMJAGQCCQBoAgBkBQJ3MAkAaAIAMgUCcjAFEFJFU09VUkNFUFJJQ0VNSU4FE0ZBQ1RPUllNQVhXQVJFSE9VU0UFBk1VTFQxMAkAawMJAGUCBQZhbW91bnQFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAQFbWluOTkJAGUCBQhtaW5QcmljZQkAaQIFCG1pblByaWNlAGQDCQBmAgkAaAIFBW1pbjk5BQZhbW91bnQJAGgCBQx1c2R0UmVjZWl2ZWQFBU1VTFQ4CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BY3R1YWwgcHJpY2UgPSAJAKQDAQUMdXNkdFJlY2VpdmVkAgMgLyAJAKQDAQUGYW1vdW50Ag4gPCBtaW5QcmljZSA9IAkApAMBBQhtaW5QcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIcmVzVHlwZXMFB3Jlc1R5cGUCASkJAJQKAgkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBkAgUCdzAFBmFtb3VudAUMdXNkdFJlY2VpdmVkAQtidXlJbnRlcm5hbAQFbG9jSWQHbWF0VHlwZQZhbW91bnQIbWF4UHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB21hdFR5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAm0xAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFCQCXAwEJAMwIAgUGYW1vdW50CQDMCAIJAGUCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQUDbmlsAAAEAm0wCQCXAwEJAMwIAgUCdzAJAMwIAgkAZQIFBmFtb3VudAUCbTEFA25pbAQBbQkAZAIFAm0wBQJtMQQJdXNkdFNwZW50CQBkAgkAawMFAm0wCQBlAgkAaAIFDUJVWU1VTFRJUExJRVIFEFJFU09VUkNFUFJJQ0VNSU4JAGsDCQBlAgkAaAIAZAUCdzAJAGgCADIFAm0wBRBSRVNPVVJDRVBSSUNFTUlOBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQZNVUxUMTAJAGsDBQJtMQkAaAIAAgUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgEBm1heDEwMQkAZAIFCG1heFByaWNlCQBpAgUIbWF4UHJpY2UAZAMJAGYCCQBoAgUJdXNkdFNwZW50BQVNVUxUOAkAaAIFBm1heDEwMQUBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQWN0dWFsIHByaWNlID0gCQCkAwEFCXVzZHRTcGVudAIDIC8gCQCkAwEFAW0CDiA+IG1heFByaWNlID0gCQCkAwEFCG1heFByaWNlAgMsICgFBWxvY0lkAgIsIAkAkQMCBQhtYXRUeXBlcwUHbWF0VHlwZQIBKQkAlQoDCQEMSW50ZWdlckVudHJ5AgUFd2hLZXkJAGUCBQJ3MAUBbQUJdXNkdFNwZW50BQFtAQtnZXRCYWNrcGFjawEFYnBLZXkEAXAJALwJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QFBWJwS2V5AhowOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOgIBOgkAzAgCCQCkAwEJAQt2YWx1ZU9yRWxzZQIJALYJAQkAkQMCBQFwBQpicElkeExldmVsAAAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeFJlcwIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4UmVzAgswXzBfMF8wXzBfMAkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCGJwSWR4TWF0AgFfBQZOVU1SRVMJAJEDAgUBcAUIYnBJZHhNYXQCCzBfMF8wXzBfMF8wCQDMCAIJAJEDAgUBcAUJYnBJZHhQcm9kBQNuaWwBDGNoZWNrQmxvY2tlZAADCQELdmFsdWVPckVsc2UCCQCbCAIFD3N0YWtpbmdDb250cmFjdAkBCmtleUJsb2NrZWQABwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UFBHVuaXQBBnByb2xvZwAJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AgpzYXZlTGFzdFR4BQNuaWwFA25pbAEJc2V0Q29tbW9uAgNhY2MPaWdub3JlZEl0ZXJhdG9yBAFqCAUDYWNjAl8xBARpdGVtAwkAZgIJAJADAQgFA2FjYwNfMTAFAWoJAJEDAggFA2FjYwNfMTAFAWoCAzBAMAQGaXNQcm9kCAUDYWNjAl84BAlpdGVtUGFydHMJALUJAgUEaXRlbQIBQAMJAQIhPQIJAJADAQUJaXRlbVBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAhuZXdPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwAABAhuZXdPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwABBAluZXdPcmRVc2QDBQZpc1Byb2QJAGgCBQhuZXdPcmRBbQUIbmV3T3JkUHIJAGsDBQhuZXdPcmRBbQUIbmV3T3JkUHIFBU1VTFQ4BAluZXdPcmRWb2wJAQh0b1ZvbHVtZQMFCG5ld09yZEFtBQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kBAZ3aEluaXQDCQBmAgkAkAMBCAUDYWNjAl82BQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAggFA2FjYwJfNgUBagAABAtjdXJPcmRQYXJ0cwkAtQkCAwkAZgIJAJADAQgFA2FjYwJfNwUBagkAkQMCCAUDYWNjAl83BQFqAgMwQDACAUAECGN1ck9yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULY3VyT3JkUGFydHMAAAQIY3VyT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwABAwMJAGYCAAAFCGN1ck9yZFByBgkAZgIAAAUIbmV3T3JkUHIJAAIBAhdQcmljZSBjYW4ndCBiZSBuZWdhdGl2ZQQJY3VyT3JkVXNkAwUGaXNQcm9kCQBoAgUIY3VyT3JkQW0FCGN1ck9yZFByCQBrAwUIY3VyT3JkQW0FCGN1ck9yZFByBQVNVUxUOAMJAAACBQhuZXdPcmRBbQAAAwkAZgIFCGN1ck9yZEFtAAAJAJwKCgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEFBndoSW5pdAgFA2FjYwJfMwgFA2FjYwJfNAkAZQIIBQNhY2MCXzUFCWN1ck9yZFVzZAgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQBkAggFA2FjYwJfOQkBCHRvVm9sdW1lAwUGd2hJbml0BQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kCAUDYWNjA18xMAkAnAoKCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFBndoSW5pdAUIY3VyT3JkQW0IBQNhY2MCXzMIBQNhY2MCXzQIBQNhY2MCXzUIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkAZAIIBQNhY2MCXzkJAQh0b1ZvbHVtZQMJAGUCBQZ3aEluaXQFCGN1ck9yZEFtBQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kCAUDYWNjA18xMAMJAGYCBQhuZXdPcmRBbQAAAwkAZgIAAAUIY3VyT3JkQW0JAJwKCgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUJbmV3T3JkVm9sCAUDYWNjAl80CQBkAggFA2FjYwJfNQUJbmV3T3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAQh0b1ZvbHVtZQMJAGUCBQZ3aEluaXQFCGN1ck9yZEFtBQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kCAUDYWNjA18xMAkAnAoKCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUGd2hJbml0CQBkAggFA2FjYwJfMwUJbmV3T3JkVm9sCAUDYWNjAl80CQBlAgkAZAIIBQNhY2MCXzUFCW5ld09yZFVzZAUJY3VyT3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAQh0b1ZvbHVtZQMFBndoSW5pdAUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAgFA2FjYwNfMTADCQBmAgAABQhjdXJPcmRBbQQGYW1EaWZmCQBlAgUIY3VyT3JkQW0FCG5ld09yZEFtAwkAZgIAAAkAZQIFBndoSW5pdAUGYW1EaWZmCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHRha2UgCQCkAwEFBmFtRGlmZgIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUGd2hJbml0AgogYXZhaWxhYmxlCQCcCgoJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgUGd2hJbml0BQZhbURpZmYIBQNhY2MCXzMJAGUCCAUDYWNjAl80BQluZXdPcmRWb2wIBQNhY2MCXzUIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwkAZQIFBndoSW5pdAUGYW1EaWZmBQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kCAUDYWNjA18xMAMJAGYCAAAJAGQCBQZ3aEluaXQFCG5ld09yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHRha2UgCQCkAwEJAQEtAQUIbmV3T3JkQW0CGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFBndoSW5pdAIKIGF2YWlsYWJsZQkAnAoKCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIFBndoSW5pdAUIbmV3T3JkQW0IBQNhY2MCXzMJAGUCCAUDYWNjAl80BQluZXdPcmRWb2wJAGUCCAUDYWNjAl81BQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkBCHRvVm9sdW1lAwkAZAIFBndoSW5pdAUIbmV3T3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwAQtzZXRJbnRlcm5hbAMJY3VycmVudFdoCmN1cnJlbnRPcmQGbmV3T3JkBAljdXJyV2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAljdXJyV2hNYXQJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBApjdXJyV2hQcm9kAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8EDWN1cnJlbnRPcmRSZXMJALUJAgkAkQMCBQpjdXJyZW50T3JkBQlvcmRJZHhSZXMCAV8EDWN1cnJlbnRPcmRNYXQJALUJAgkAkQMCBQpjdXJyZW50T3JkBQlvcmRJZHhNYXQCAV8EDmN1cnJlbnRPcmRQcm9kAwkAAAIJAJEDAgUKY3VycmVudE9yZAUKb3JkSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQpjdXJyZW50T3JkBQpvcmRJZHhQcm9kAgFfAwkBAiE9AgkAkAMBBQZuZXdPcmQAAwkAAgECM25ld09yZGVyU3RyIHNob3VsZCBjb250YWluIGV4YWN0bHkgMiAnOicgc2VwYXJhdG9ycwQIcmVzUGFydHMJALUJAgkAkQMCBQZuZXdPcmQAAAIBXwQIbWF0UGFydHMJALUJAgkAkQMCBQZuZXdPcmQAAQIBXwQJcHJvZFBhcnRzAwkAAAIJAJEDAgUGbmV3T3JkAAICAAUDbmlsCQC8CQIJAJEDAgUGbmV3T3JkAAICAV8DCQECIT0CCQCQAwEFCHJlc1BhcnRzBQZOVU1SRVMJAAIBAiBBbGwgNiByZXNvdXJjZXMgc2hvdWxkIGJlIHBhc3NlZAMJAQIhPQIJAJADAQUIbWF0UGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IG1hdGVyaWFscyBzaG91bGQgYmUgcGFzc2VkBAFyCgACJGwFCHJlc1R5cGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAnAoKAAAFA25pbAAAAAAAAAUJY3VycldoUmVzBQ1jdXJyZW50T3JkUmVzBwAABQhyZXNQYXJ0cwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJc2V0Q29tbW9uAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIB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SW5pdAMJAGYCCQCQAwEIBQNhY2MDXzEwBQFqCQCRAwIIBQNhY2MDXzEwBQFqAgMwQDAECndoT3JkUGFydHMJALUJAgUJd2hPcmRJbml0AgFABAd3aE9yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKd2hPcmRQYXJ0cwAABAd3aE9yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKd2hPcmRQYXJ0cwABAwMJAQIhPQIFB2JwT3JkQW0AAAkBAiE9AgUHYnBPcmRQcgUHd2hPcmRQcgcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIKUHJpY2VzIG9mIAkAkQMCCAUDYWNjA18xMQUBagIXIGRvbid0IG1hdGNoISBXSCBwcmljZT0JAKQDAQUHd2hPcmRQcgINLCB5b3VyIHByaWNlPQkApAMBBQdicE9yZFByBAh3aE9yZFVzZAMFBmlzUHJvZAkAaAIFB3doT3JkQW0FB3doT3JkUHIJAGsDBQd3aE9yZEFtBQd3aE9yZFByBQVNVUxUOAQIZGVsdGFWb2wJAQh0b1ZvbHVtZQMFB2JwT3JkQW0FDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QDCQAAAgUHYnBPcmRBbQAACQCfCg0JAM0IAggFA2FjYwJfMQkApAMBBQZ3aEluaXQJAM0IAggFA2FjYwJfMgUJd2hPcmRJbml0CQDNCAIIBQNhY2MCXzMJAKQDAQUGYnBJbml0CAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82CQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAgFA2FjYwNfMTMDCQBmAgUHYnBPcmRBbQAAAwkAZgIAAAUHd2hPcmRBbQMJAGYCBQdicE9yZEFtCQEBLQEFB3doT3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCkAwEFB2JwT3JkQW0CBCBvZiAJAJEDAggFA2FjYwNfMTEFAWoCGywgYnV0IHdhcmVob3VzZSBvbmx5IHNlbGxzIAkApAMBCQEBLQEFB3doT3JkQW0JAJ8KDQkAzQgCCAUDYWNjAl8xCQCkAwEFBndoSW5pdAkAzQgCCAUDYWNjAl8yCQCsAgIJAKwCAgkApAMBCQBkAgUHd2hPcmRBbQUHYnBPcmRBbQIBQAkApAMBBQd3aE9yZFByCQDNCAIIBQNhY2MCXzMJAKQDAQkAZAIFBmJwSW5pdAUHYnBPcmRBbQkAZAIIBQNhY2MCXzQFCGRlbHRhVm9sCAUDYWNjAl81CQBkAggFA2FjYwJfNgUIYnBPcmRVc2QJAGQCCAUDYWNjAl83AAEIBQNhY2MCXzgIBQNhY2MCXzkIBQNhY2MDXzEwCAUDYWNjA18xMQUGaXNQcm9kCQBkAggFA2FjYwNfMTMDBQZpc1Byb2QJAGgCBQdicE9yZEFtBQVNVUxUOAUHYnBPcmRBbQkAAgEJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAJEDAggFA2FjYwNfMTEFAWoCICB3aGlsZSB3YXJlaG91c2UgZG9lc24ndCBzZWxsIGl0AwkAZgIFB3doT3JkQW0AAAMJAGYCCQEBLQEFB2JwT3JkQW0FB3doT3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkApAMBCQEBLQEFB2JwT3JkQW0CBCBvZiAJAJEDAggFA2FjYwNfMTEFAWoCGiwgYnV0IHdhcmVob3VzZSBvbmx5IGJ1eXMgCQCkAwEFB3doT3JkQW0DCQBmAgkBAS0BBQdicE9yZEFtBQZicEluaXQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkApAMBCQEBLQEFB2JwT3JkQW0CFCwgYnV0IHlvdSBvbmx5IGhhdmUgCQCkAwEFBmJwSW5pdAIEIG9mIAkAkQMCCAUDYWNjA18xMQUBagkAnwoNCQDNCAIIBQNhY2MCXzEJAKQDAQkAZQIFBndoSW5pdAUHYnBPcmRBbQkAzQgCCAUDYWNjAl8yCQCsAgIJAKwCAgkApAMBCQBkAgUHd2hPcmRBbQUHYnBPcmRBbQIBQAkApAMBBQd3aE9yZFByCQDNCAIIBQNhY2MCXzMJAKQDAQkAZAIFBmJwSW5pdAUHYnBPcmRBbQkAZQIIBQNhY2MCXzQFCGRlbHRhVm9sCQBlAggFA2FjYwJfNQUIYnBPcmRVc2QIBQNhY2MCXzYJAGQCCAUDYWNjAl83AAEIBQNhY2MCXzgIBQNhY2MCXzkIBQNhY2MDXzEwCAUDYWNjA18xMQUGaXNQcm9kCQBlAggFA2FjYwNfMTMDBQZpc1Byb2QJAGgCBQdicE9yZEFtBQVNVUxUOAUHYnBPcmRBbQkAAgEJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCRAwIIBQNhY2MDXzExBQFqAh8gd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3QgYnV5IGl0ARNzZWxsUmVzb3VyY2VzQ29tbW9uBAdyZXNMaXN0DGZhY3RvcnlMb2NJZAdhbW91bnRzCW1pblByaWNlcwoBBWFkZGVyAgNhY2MBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkAkQMCBQdyZXNMaXN0BQFqAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhQsIGJ1dCB0cmllZCB0byBzZWxsIAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiVZb3UgdHJpZWQgdG8gc2VsbCBuZWdhdGl2ZSBhbW91bnQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAgI6IAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqAAAEAWIJAQxzZWxsSW50ZXJuYWwEBQxmYWN0b3J5TG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltaW5QcmljZXMFAWoJAJYKBAkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVzTGlzdAUBagkAkQMCBQdhbW91bnRzBQFqCQBkAggFA2FjYwJfMwgFAWICXzIJAGQCCAUDYWNjAl80CQCRAwIFB2Ftb3VudHMFAWoJAJYKBAgFA2FjYwJfMQkAzQgCCAUDYWNjAl8yCQCRAwIFB3Jlc0xpc3QFAWoIBQNhY2MCXzMIBQNhY2MCXzQKAAIkbAUFSVRFUjYKAAIkcwkAkAMBBQIkbAoA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NgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgEQc2hvcDJ1c2VyQWN0aW9ucwMNdXNkV2gyQnBTYWxkbwpjYWxsZXJBZGRyC3JlY2VpdmVkRmVlAwkAZgIFDXVzZFdoMkJwU2FsZG8AAAQLdXNkV2gyQnBGZWUJAGsDBQ11c2RXaDJCcFNhbGRvBQpBVUNUSU9ORkVFBQVNVUxUNgMJAGcCBQtyZWNlaXZlZEZlZQkAZQIFDXVzZFdoMkJwU2FsZG8JAGgCAAMFC3VzZFdoMkJwRmVlCQACAQkArAICAitUaGlzIHRyYWRlIGRvZXMgbm90IGNvdmVyIGRlbGl2ZXJ5IGNvc3Qgb2YgCQEKZml4ZWRQb2ludAIFC3JlY2VpdmVkRmVlAAYECHJlZkJ5S2V5CQEPa2V5QWRkcmVzc1JlZkJ5AQUKY2FsbGVyQWRkcgQFcmVmQnkJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQhyZWZCeUtleQQGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA2MikBBQpjYWxsZXJBZGRyCQDNCAIJAM0IAgMJAQlpc0RlZmluZWQBBQVyZWZCeQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVyZWZCeQULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBlAgkAZQIFDXVzZFdoMkJwU2FsZG8JAGgCAAMFC3VzZFdoMkJwRmVlBQtyZWNlaXZlZEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAULdXNkV2gyQnBGZWUFC3VzZHRBc3NldElkBQNuaWwBEHVzZXIyc2hvcEFjdGlvbnMEDXVzZEJwMldoU2FsZG8EcG10cw1zaG9wTGFuZE93bmVyCHNwZW50RmVlAwkAZgIFDXVzZEJwMldoU2FsZG8AAAMJAQIhPQIJAJADAQUEcG10cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIFBHBtdHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQQdXNkdFNwZW50V2l0aEZlZQkAZAIFDXVzZEJwMldoU2FsZG8FCHNwZW50RmVlAwkBAiE9AgUDYW10BRB1c2R0U3BlbnRXaXRoRmVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUNdXNkQnAyV2hTYWxkbwAGAgErCQEKZml4ZWRQb2ludAIFCHNwZW50RmVlAAYCDihkZWxpdmVyeSBmZWUpAwkAZgIFDk1JTlNIT1BQQVlNRU5UBQ11c2RCcDJXaFNhbGRvCQACAQkArAICAhJNaW4gc2hvcCB0cmFkZSBpcyAJAQpmaXhlZFBvaW50AgUOTUlOU0hPUFBBWU1FTlQABgQLdXNkQnAyV2hGZWUJAGsDBQ11c2RCcDJXaFNhbGRvBQpBVUNUSU9ORkVFBQVNVUxUNgQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQ1zaG9wTGFuZE93bmVyBAVyZWZCeQkAnQgCBQ9zdGFraW5nQ29udHJhY3QFCHJlZkJ5S2V5CQDNCAIJAM0IAgMJAQlpc0RlZmluZWQBBQVyZWZCeQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVyZWZCeQULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUNc2hvcExhbmRPd25lcgkAZQIFDXVzZEJwMldoU2FsZG8JAGgCAAMFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQDCQECIT0CCQCQAwEFBHBtdHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAUDbmlsARVhY2NlcHRTaG9wT3JkZXJDb21tb24GD3Nob3BMYW5kQXNzZXRJZApjYWxsZXJBZGRyCmJwT3JkZXJTdHIJYnBSZXNMaXN0CWJwTWF0TGlzdApicFByb2RMaXN0BAlsYW5kQXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQ9zaG9wTGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQ9zaG9wTGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFCWxhbmRBc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQNc2hvcExhbmRPd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFD3Nob3BMYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQlsYW5kQXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkAAAIFDXNob3BMYW5kT3duZXIFCmNhbGxlckFkZHIJAAIBAh5Zb3UgY2Fubm90IHRyYWRlIHdpdGggeW91cnNlbGYEDGJwT3JkZXJQYXJ0cwkAvAkCBQpicE9yZGVyU3RyAgE6AwkBAiE9AgkAkAMBBQxicE9yZGVyUGFydHMAAwkAAgECMmJwT3JkZXJTdHIgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSAyICc6JyBzZXBhcmF0b3JzBAhicE9yZFJlcwkAtQkCCQCRAwIFDGJwT3JkZXJQYXJ0cwAAAgFfBAhicE9yZE1hdAkAtQkCCQCRAwIFDGJwT3JkZXJQYXJ0cwABAgFfBAlicE9yZFByb2QDCQAAAgkAkQMCBQxicE9yZGVyUGFydHMAAgIABQNuaWwJALwJAgkAkQMCBQxicE9yZGVyUGFydHMAAgIBXwMJAQIhPQIJAJADAQUIYnBPcmRSZXMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkAwkBAiE9AgkAkAMBBQhicE9yZE1hdAUGTlVNUkVTCQACAQIgQWxsIDYgbWF0ZXJpYWxzIHNob3VsZCBiZSBwYXNzZWQEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgUPc2hvcExhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAljdXJyV2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAljdXJyV2hNYXQJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBApjdXJyV2hQcm9kAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8ED2N1cnJXaExvY2tlZFZvbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwUJdm9sTG9ja2VkBAZvcmRLZXkJAQ5rZXlPcmRlckJ5TGFuZAEFD3Nob3BMYW5kQXNzZXRJZAQFd2hPcmQJAQhnZXRPcmRlcgEFBm9yZEtleQQId2hPcmRSZXMJALUJAgkAkQMCBQV3aE9yZAUJb3JkSWR4UmVzAgFfBAh3aE9yZE1hdAkAtQkCCQCRAwIFBXdoT3JkBQlvcmRJZHhNYXQCAV8ECXdoT3JkUHJvZAMJAAACCQCRAwIFBXdoT3JkBQpvcmRJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFBXdoT3JkBQpvcmRJZHhQcm9kAgFfBAFyCgACJGwFCGJwT3JkUmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAnwoNBQNuaWwFA25pbAUDbmlsAAAAAAAAAAAFCWJwUmVzTGlzdAUJY3VycldoUmVzBQh3aE9yZFJlcwUIcmVzVHlwZXMHAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGFjY2VwdENvbW1vbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2Vl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AgUPc2hvcExhbmRBc3NldElkBQNuaWwFA25pbAQOYWNjU3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVBY2NTdGF0cwkAzAgCBQ1zaG9wTGFuZE93bmVyCQDMCAIJAGsDBQZ4cFNob3AIBQFwA18xMwUFTVVMVDgFA25pbAUDbmlsCQCcCgoJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3V2hPcmRTdHIIBQFyAl8zCAUBbQJfMwgFAXACXzMIBQFwAl81CAUBcAJfNggFAXADXzEzBQ1zaG9wTGFuZE93bmVyBQZ3aFNhdmUFDmFjY1N0YXRzUmVzdWx0ARpzZWxsUmVzb3VyY2VzV29ybGRJbnRlcm5hbAEGYW1vdW50BAZvbmVSZXMJAGkCBQZhbW91bnQAHgQRb25lRmFjdG9yeUFtb3VudHMJAMwIAgUGb25lUmVzCQDMCAIFBm9uZVJlcwkAzAgCBQZvbmVSZXMJAMwIAgUGb25lUmVzCQDMCAIFBm9uZVJlcwkAzAgCBQZvbmVSZXMFA25pbAQBcwkApAMBBQZvbmVSZXMEB3Jlc0xpc3QJAMwIAgUBcwkAzAgCBQFzCQDMCAIFAXMJAMwIAgUBcwkAzAgCBQFzCQDMCAIFAXMFA25pbAQJbWluUHJpY2VzCQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAABQNuaWwKAQpvbmVGYWN0b3J5AgNhY2MJY29udGluZW50BAF4CQETc2VsbFJlc291cmNlc0NvbW1vbgQFB3Jlc0xpc3QFCWNvbnRpbmVudAURb25lRmFjdG9yeUFtb3VudHMFCW1pblByaWNlcwkAlQoDCQDOCAIIBQNhY2MCXzEIBQF4Al8xCQBkAggFA2FjYwJfMggFAXgCXzMJAGQCCAUDYWNjAl8zCAUBeAJfNAQNJHQwMjUyMTMyNTMwMwoAAiRsBQpjb250aW5lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpvbmVGYWN0b3J5AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQOZmFjdG9yeUFjdGlvbnMIBQ0kdDAyNTIxMzI1MzAzAl8xBAx1c2R0UmVjZWl2ZWQIBQ0kdDAyNTIxMzI1MzAzAl8yBAh0b3RhbFJlcwgFDSR0MDI1MjEzMjUzMDMCXzMEA2ZlZQkAawMFDHVzZHRSZWNlaXZlZAUMREVMSVZFUllfRkVFBQVNVUxUNgQQYWN0aXZpdGllc0Ftb3VudAkAaQIFDHVzZHRSZWNlaXZlZABkBAh1c2R0TGVmdAkAZQIJAGUCBQx1c2R0UmVjZWl2ZWQFEGFjdGl2aXRpZXNBbW91bnQFA2ZlZQkAlwoFBQ5mYWN0b3J5QWN0aW9ucwUIdXNkdExlZnQFA2ZlZQUQYWN0aXZpdGllc0Ftb3VudAUIdG90YWxSZXMWAWkBGnJlY2FsY0xvY2tlZFZvbHVtZVJFQURPTkxZAgtsYW5kQXNzZXRJZAJ3aAQKY3VycmVudE9yZAkBCGdldE9yZGVyAQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQEAXoJAQtzZXRJbnRlcm5hbAMFAndoBQpjdXJyZW50T3JkBQpjdXJyZW50T3JkCQCUCgIFA25pbAkAZAIIBQF6Al80CAUBegJfNQFpAQ1jb25zdHJ1Y3RvclYxAQhyZXN0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyBQNuaWwBaQENc2VsbFJlc291cmNlcwIHYW1vdW50cwltaW5QcmljZXMEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwAEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECKnNlbGxSZXNvdXJjZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB3Jlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8EDSR0MDI2NzU1MjY4ODEJARNzZWxsUmVzb3VyY2VzQ29tbW9uBAUHcmVzTGlzdAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQFB2Ftb3VudHMFCW1pblByaWNlcwQOZmFjdG9yeUFjdGlvbnMIBQ0kdDAyNjc1NTI2ODgxAl8xBAZuZXdSZXMIBQ0kdDAyNjc1NTI2ODgxAl8yBAx1c2R0UmVjZWl2ZWQIBQ0kdDAyNjc1NTI2ODgxAl8zBAh0b3RhbFJlcwgFDSR0MDI2NzU1MjY4ODECXzQEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQx1c2R0UmVjZWl2ZWQAZAQHbmV3UGFjawkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCBQZuZXdSZXMCAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEDmJhY2twYWNrUmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbFJlcwUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM0IAgkAzQgCBQ5mYWN0b3J5QWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUMdXNkdFJlY2VpdmVkBRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpARJzZWxsUmVzb3VyY2VzV29ybGQCBGFkZHIGYW1vdW50AwkBAiE9AggFAWkGY2FsbGVyBQ1hY3Jlc0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDI3NjczMjc4MzAJARpzZWxsUmVzb3VyY2VzV29ybGRJbnRlcm5hbAEFBmFtb3VudAQOZmFjdG9yeUFjdGlvbnMIBQ0kdDAyNzY3MzI3ODMwAl8xBAh1c2R0TGVmdAgFDSR0MDI3NjczMjc4MzACXzIEA2ZlZQgFDSR0MDI3NjczMjc4MzACXzMEEGFjdGl2aXRpZXNBbW91bnQIBQ0kdDAyNzY3MzI3ODMwAl80BAh0b3RhbFJlcwgFDSR0MDI3NjczMjc4MzACXzUDCQBnAgAABQh1c2R0TGVmdAkAAgEJAKwCAgIrVGhpcyB0cmFkZSBkb2VzIG5vdCBjb3ZlciBkZWxpdmVyeSBjb3N0IG9mIAkBCmZpeGVkUG9pbnQCBQNmZWUABgQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVBY2NTdGF0cwkAzAgCBQRhZGRyCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbFJlcwUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM0IAgkAzQgCCQDNCAIFDmZhY3RvcnlBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAUDZmVlCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBRJpbnZlc3RGdW5kQ29udHJhY3QFCHVzZHRMZWZ0BQt1c2R0QXNzZXRJZAkAlAoCBQh1c2R0TGVmdAULc3RhdHNSZXN1bHQBaQEac2VsbFJlc291cmNlc1dvcmxkUkVBRE9OTFkBBmFtb3VudAQIdXNkdExlZnQICQEac2VsbFJlc291cmNlc1dvcmxkSW50ZXJuYWwBBQZhbW91bnQCXzIJAJQKAgUDbmlsBQh1c2R0TGVmdAFpARlzZWxsUmVzb3VyY2VzRHVja0RlbGl2ZXJ5AwdhbW91bnRzCW1pblByaWNlcxBmYWN0b3J5Q29udGluZW50AwkBASEBBRFLU19BTExPV19ERUxJVkVSWQkAAgECH0RlbGl2ZXJ5IGZlYXR1cmUgaXMgdHVybmVkIG9mZiEEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwAEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECKnNlbGxSZXNvdXJjZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBA0kdDAyOTA2MzI5MTg0CQETc2VsbFJlc291cmNlc0NvbW1vbgQFB3Jlc0xpc3QFEGZhY3RvcnlDb250aW5lbnQFB2Ftb3VudHMFCW1pblByaWNlcwQOZmFjdG9yeUFjdGlvbnMIBQ0kdDAyOTA2MzI5MTg0Al8xBAZuZXdSZXMIBQ0kdDAyOTA2MzI5MTg0Al8yBAx1c2R0UmVjZWl2ZWQIBQ0kdDAyOTA2MzI5MTg0Al8zBAh0b3RhbFJlcwgFDSR0MDI5MDYzMjkxODQCXzQEB25ld1BhY2sJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAgUGbmV3UmVzAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxSZXMFBU1VTFQ4BQNuaWwFA25pbAQHZmVlUGFydAkAawMFDHVzZHRSZWNlaXZlZAUMREVMSVZFUllfRkVFBQVNVUxUNgQDZmVlAwkAZgIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUHZmVlUGFydAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQdmZWVQYXJ0BBBhY3Rpdml0aWVzQW1vdW50CQBpAgUMdXNkdFJlY2VpdmVkAGQDCQBnAgUDZmVlCQBlAgUMdXNkdFJlY2VpdmVkBRBhY3Rpdml0aWVzQW1vdW50CQACAQkArAICAitUaGlzIHRyYWRlIGRvZXMgbm90IGNvdmVyIGRlbGl2ZXJ5IGNvc3Qgb2YgCQEKZml4ZWRQb2ludAIFA2ZlZQAGBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM0IAgUOZmFjdG9yeUFjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIJAGUCBQx1c2R0UmVjZWl2ZWQFEGFjdGl2aXRpZXNBbW91bnQFA2ZlZQULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpARlzZWxsUmVzb3VyY2VzTGFuZERlbGl2ZXJ5BAdhbW91bnRzCW1pblByaWNlcwtsYW5kQXNzZXRJZBBmYWN0b3J5Q29udGluZW50AwkBASEBBRFLU19BTExPV19ERUxJVkVSWQkAAgECH0RlbGl2ZXJ5IGZlYXR1cmUgaXMgdHVybmVkIG9mZiEEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAipzZWxsUmVzb3VyY2VzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEBHVzZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQR1c2VyBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAdyZXNMaXN0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQNJHQwMzEyMTEzMTMzMgkBE3NlbGxSZXNvdXJjZXNDb21tb24EBQdyZXNMaXN0BRBmYWN0b3J5Q29udGluZW50BQdhbW91bnRzBQltaW5QcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMzEyMTEzMTMzMgJfMQQGbmV3UmVzCAUNJHQwMzEyMTEzMTMzMgJfMgQMdXNkdFJlY2VpdmVkCAUNJHQwMzEyMTEzMTMzMgJfMwQIdG90YWxSZXMIBQ0kdDAzMTIxMTMxMzMyAl80BAV3aFN0cgkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCQC5CQIFBm5ld1JlcwIBXwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQJAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFBGFkZHIJAMwIAgkAawMFB3hwVHJhZGUFCHRvdGFsUmVzBQVNVUxUOAUDbmlsBQNuaWwEB2ZlZVBhcnQJAGsDBQx1c2R0UmVjZWl2ZWQFDERFTElWRVJZX0ZFRQUFTVVMVDYEA2ZlZQMJAGYCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFB2ZlZVBhcnQFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUHZmVlUGFydAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFDHVzZHRSZWNlaXZlZABkAwkAZwIFA2ZlZQkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAkAAgEJAKwCAgIrVGhpcyB0cmFkZSBkb2VzIG5vdCBjb3ZlciBkZWxpdmVyeSBjb3N0IG9mIAkBCmZpeGVkUG9pbnQCBQNmZWUABgQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAACQCUCgIJAM0IAgkAzQgCCQDNCAIFDmZhY3RvcnlBY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCCQBlAgUMdXNkdFJlY2VpdmVkBRBhY3Rpdml0aWVzQW1vdW50BQNmZWUFC3VzZHRBc3NldElkCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBkAgUJZnVuZFRvdGFsBQNmZWUJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAJUKAwUGd2hTYXZlBQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBDGJ1eU1hdGVyaWFscwIHYW1vdW50cwltYXhQcmljZXMEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwAEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQNJHQwMzMxOTIzMzMxNAkBEmJ1eU1hdGVyaWFsc0NvbW1vbgQFB21hdExpc3QJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBQdhbW91bnRzBQltYXhQcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMzMxOTIzMzMxNAJfMQQGbmV3TWF0CAUNJHQwMzMxOTIzMzMxNAJfMgQJdXNkdFNwZW50CAUNJHQwMzMxOTIzMzMxNAJfMwQIdG90YWxNYXQIBQ0kdDAzMzE5MjMzMzE0Al80AwkAZgIFCXVzZHRTcGVudAUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQFCXVzZHRTcGVudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAUJdXNkdFNwZW50BQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQl1c2R0U3BlbnQAZAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwVHJhZGUFCHRvdGFsTWF0BQVNVUxUOAUDbmlsBQNuaWwJAJQKAgkAzQgCCQDOCAIFDmZhY3RvcnlBY3Rpb25zBQRyZXN0CQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQCVCgMFDmJhY2twYWNrUmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBGGJ1eU1hdGVyaWFsc0R1Y2tEZWxpdmVyeQMHYW1vdW50cwltYXhQcmljZXMQZmFjdG9yeUNvbnRpbmVudAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBA0kdDAzNDgzMjM0OTQ5CQESYnV5TWF0ZXJpYWxzQ29tbW9uBAUHbWF0TGlzdAUQZmFjdG9yeUNvbnRpbmVudAUHYW1vdW50cwUJbWF4UHJpY2VzBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDM0ODMyMzQ5NDkCXzEEBm5ld01hdAgFDSR0MDM0ODMyMzQ5NDkCXzIECXVzZHRTcGVudAgFDSR0MDM0ODMyMzQ5NDkCXzMECHRvdGFsTWF0CAUNJHQwMzQ4MzIzNDk0OQJfNAQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEDmJhY2twYWNrUmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbE1hdAUFTVVMVDgFA25pbAUDbmlsBAdmZWVQYXJ0CQBrAwUJdXNkdFNwZW50BQxERUxJVkVSWV9GRUUFBU1VTFQ2BANmZWUDCQBmAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQdmZWVQYXJ0BRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFB2ZlZVBhcnQEEHVzZHRTcGVudFdpdGhGZWUJAGQCBQl1c2R0U3BlbnQFA2ZlZQMJAGYCBRB1c2R0U3BlbnRXaXRoRmVlBQNhbXQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQEKZml4ZWRQb2ludAIFA2FtdAAGAgssIHJlcXVpcmVkPQkBCmZpeGVkUG9pbnQCBQl1c2R0U3BlbnQABgIBKwkBCmZpeGVkUG9pbnQCBQNmZWUABgIOKGRlbGl2ZXJ5IGZlZSkEBHJlc3QDCQBmAgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQULdXNkdEFzc2V0SWQFA25pbAUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAgUJdXNkdFNwZW50AGQECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAkAlAoCCQDNCAIJAM0IAgkAzggCBQ5mYWN0b3J5QWN0aW9ucwUEcmVzdAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAUDZmVlCQCVCgMFDmJhY2twYWNrUmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBGGJ1eU1hdGVyaWFsc0xhbmREZWxpdmVyeQQHYW1vdW50cwltYXhQcmljZXMLbGFuZEFzc2V0SWQQZmFjdG9yeUNvbnRpbmVudAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEBHVzZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQR1c2VyBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQJY3VycmVudFdoCQC8CQIFAndoAgE6BAdtYXRMaXN0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQNJHQwMzcyMjczNzM0NAkBEmJ1eU1hdGVyaWFsc0NvbW1vbgQFB21hdExpc3QFEGZhY3RvcnlDb250aW5lbnQFB2Ftb3VudHMFCW1heFByaWNlcwQOZmFjdG9yeUFjdGlvbnMIBQ0kdDAzNzIyNzM3MzQ0Al8xBAZuZXdNYXQIBQ0kdDAzNzIyNzM3MzQ0Al8yBAl1c2R0U3BlbnQIBQ0kdDAzNzIyNzM3MzQ0Al8zBAh0b3RhbE1hdAgFDSR0MDM3MjI3MzczNDQCXzQEBXdoU3RyCQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwkAzAgCCQC5CQIFBm5ld01hdAIBXwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kCQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQFA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUEYWRkcgkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxNYXQFBU1VTFQ4BQNuaWwFA25pbAQHZmVlUGFydAkAawMFCXVzZHRTcGVudAUMREVMSVZFUllfRkVFBQVNVUxUNgQDZmVlAwkAZgIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUHZmVlUGFydAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQdmZWVQYXJ0BBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUJdXNkdFNwZW50BQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM4IAgUOZmFjdG9yeUFjdGlvbnMFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQZ3aFNhdmUFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQERZXhjaGFuZ2VSZXNvdXJjZXMBB2Ftb3VudHMEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwAEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQNJHQwMzk0NTgzOTU2NAkBF2V4Y2hhbmdlUmVzb3VyY2VzQ29tbW9uAwUHcmVzTGlzdAUHbWF0TGlzdAUHYW1vdW50cwQGbmV3UmVzCAUNJHQwMzk0NTgzOTU2NAJfMQQGbmV3TWF0CAUNJHQwMzk0NTgzOTU2NAJfMgQJdXNkdFNwZW50CAUNJHQwMzk0NTgzOTU2NAJfMwQUdG90YWxBbW91bnRDb252ZXJ0ZWQIBQ0kdDAzOTQ1ODM5NTY0Al80AwkAZgIFCXVzZHRTcGVudAUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAgUGbmV3UmVzAgFfCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQFCXVzZHRTcGVudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAUJdXNkdFNwZW50BQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQl1c2R0U3BlbnQAZAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwVHJhZGUFFHRvdGFsQW1vdW50Q29udmVydGVkBQVNVUxUOAUDbmlsBQNuaWwJAJQKAgkAzQgCBQRyZXN0CQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQCVCgMFDmJhY2twYWNrUmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBHWV4Y2hhbmdlUmVzb3VyY2VzRHVja0RlbGl2ZXJ5AQdhbW91bnRzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBA0kdDA0MDk5OTQxMTA1CQEXZXhjaGFuZ2VSZXNvdXJjZXNDb21tb24DBQdyZXNMaXN0BQdtYXRMaXN0BQdhbW91bnRzBAZuZXdSZXMIBQ0kdDA0MDk5OTQxMTA1Al8xBAZuZXdNYXQIBQ0kdDA0MDk5OTQxMTA1Al8yBAl1c2R0U3BlbnQIBQ0kdDA0MDk5OTQxMTA1Al8zBBR0b3RhbEFtb3VudENvbnZlcnRlZAgFDSR0MDQwOTk5NDExMDUCXzQEB2ZlZVBhcnQJAGsDBQl1c2R0U3BlbnQFDkRFTElWRVJZX0ZFRTE1BQVNVUxUNgQDZmVlAwkAZgIFF01JTl9VU0RUX0ZFRV9ERUxJVkVSWTE1BQdmZWVQYXJ0BRdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQUHZmVlUGFydAQQdXNkdFNwZW50V2l0aEZlZQkAZAIFCXVzZHRTcGVudAUDZmVlAwkAZgIFEHVzZHRTcGVudFdpdGhGZWUFA2FtdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAQpmaXhlZFBvaW50AgUDYW10AAYCCywgcmVxdWlyZWQ9CQEKZml4ZWRQb2ludAIFCXVzZHRTcGVudAAGAgErCQEKZml4ZWRQb2ludAIFA2ZlZQAGAg4oZGVsaXZlcnkgZmVlKQQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCBQZuZXdSZXMCAV8JAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEDmJhY2twYWNrUmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQULdXNkdEFzc2V0SWQFA25pbAUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAgUJdXNkdFNwZW50AGQEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlBRR0b3RhbEFtb3VudENvbnZlcnRlZAUFTVVMVDgFA25pbAUDbmlsBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpAR1leGNoYW5nZVJlc291cmNlc0xhbmREZWxpdmVyeQIHYW1vdW50cwtsYW5kQXNzZXRJZAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAR1c2VyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQHcmVzTGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8EB21hdExpc3QJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBA0kdDA0MzMyODQzNDM0CQEXZXhjaGFuZ2VSZXNvdXJjZXNDb21tb24DBQdyZXNMaXN0BQdtYXRMaXN0BQdhbW91bnRzBAZuZXdSZXMIBQ0kdDA0MzMyODQzNDM0Al8xBAZuZXdNYXQIBQ0kdDA0MzMyODQzNDM0Al8yBAl1c2R0U3BlbnQIBQ0kdDA0MzMyODQzNDM0Al8zBBR0b3RhbEFtb3VudENvbnZlcnRlZAgFDSR0MDQzMzI4NDM0MzQCXzQEBXdoU3RyCQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJALkJAgUGbmV3UmVzAgFfCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QJAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAUDbmlsAgE6BAZ3aFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag1zYXZlV2FyZWhvdXNlCQDMCAIFBXdoU3RyCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVBY2NTdGF0cwkAzAgCBQRhZGRyCQDMCAIJAGsDBQd4cFRyYWRlBRR0b3RhbEFtb3VudENvbnZlcnRlZAUFTVVMVDgFA25pbAUDbmlsBAdmZWVQYXJ0CQBrAwUJdXNkdFNwZW50BQ5ERUxJVkVSWV9GRUUxNQUFTVVMVDYEA2ZlZQMJAGYCBRdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQUHZmVlUGFydAUXTUlOX1VTRFRfRkVFX0RFTElWRVJZMTUFB2ZlZVBhcnQEEHVzZHRTcGVudFdpdGhGZWUJAGQCBQl1c2R0U3BlbnQFA2ZlZQMJAGYCBRB1c2R0U3BlbnRXaXRoRmVlBQNhbXQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQEKZml4ZWRQb2ludAIFA2FtdAAGAgssIHJlcXVpcmVkPQkBCmZpeGVkUG9pbnQCBQl1c2R0U3BlbnQABgIBKwkBCmZpeGVkUG9pbnQCBQNmZWUABgIOKGRlbGl2ZXJ5IGZlZSkEBHJlc3QDCQBmAgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQULdXNkdEFzc2V0SWQFA25pbAUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAgUJdXNkdFNwZW50AGQECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAkAlAoCCQDNCAIJAM0IAgUEcmVzdAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAUDZmVlCQCVCgMFBndoU2F2ZQUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpAQpjcmFmdEdvb2RzAgpwcm9kdWN0SWR4CHF1YW50aXR5BAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEDCQECIT0CBQNhbXQFBU1VTFQ2CQACAQIqZXhhY3RseSAxIFVTRFQgbXVzdCBiZSBhdHRhY2hlZCBhcyBwYXltZW50AwkAZwIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBzaG91bGQgYmUgcG9zaXRpdmUEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBTQkAAgEJAKwCAgIxRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBNYW51ZmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQEY29udAkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8DAwkAZgIAAAUKcHJvZHVjdElkeAYJAGcCBQpwcm9kdWN0SWR4CQCQAwEFEHByb2R1Y3Rpb25NYXRyaXgJAAIBCQCsAgICFFVua25vd24gcHJvZHVjdCBpZHg9CQCkAwEFCnByb2R1Y3RJZHgEBnJlY2lwZQkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgCAV8DCQECIT0CCQCQAwEFBnJlY2lwZQUKUkVDSVBFU0laRQkAAgEJAKwCAgIXRmF0YWw6IHVua25vd24gcmVjaXBlOiAJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUKcHJvZHVjdElkeAQOcHJvZHVjdENvbnRJZHgJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZyZWNpcGUFDXJJZHhDb250aW5lbnQDCQECIT0CCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RD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AiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAuQkCCAUGbWVyZ2VkAl8xAgFfCQDMCAIJALoJAgUGYnBQcm9kAgFfBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBDcmFmdAgFBm1lcmdlZAJfMgUFTVVMVDgFA25pbAUDbmlsCQCUCgIFA25pbAkAlQoDBQZyZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQERc2V0V2FyZWhvdXNlT3JkZXICC25ld09yZGVyU3RyC2xhbmRBc3NldElkBAR1c2VyCAUBaQxvcmlnaW5DYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQGcmVzdWx0AwkBAiE9AgUEdXNlcgUMcmVzdENvbnRyYWN0CQEMY2hlY2tCbG9ja2VkAAcEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwMJAQIhPQIFBHVzZXIFDHJlc3RDb250cmFjdAkBAiE9AgUFb3duZXIFBGFkZHIHCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAhuZXdPcmRlcgkAvAkCBQtuZXdPcmRlclN0cgIBOgQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQEbG9mdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUAgFfBAd3aFRvdGFsCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUIdm9sVG90YWwEBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQECmN1cnJlbnRPcmQJAQhnZXRPcmRlcgEFBm9yZEtleQQBegkBC3NldEludGVybmFsAwUJY3VycmVudFdoBQpjdXJyZW50T3JkBQhuZXdPcmRlcgQLYnV5Vm9sU2FsZG8IBQF6Al80BAxzZWxsVm9sU2FsZG8IBQF6Al81BAp3aE9jY3VwaWVkCAUBegJfNwQId2hMb2NrZWQJAGQCBQtidXlWb2xTYWxkbwUMc2VsbFZvbFNhbGRvBAZ3aEZyZWUJAGUCCQBlAgUHd2hUb3RhbAUKd2hPY2N1cGllZAUId2hMb2NrZWQDCQBmAgAABQZ3aEZyZWUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhNBdHRlbXB0IHRvIHJlc2VydmUgCQCkAwEFC2J1eVZvbFNhbGRvAhsgc3BhY2UgZm9yIGJ1eSBvcmRlcnMsIGFuZCAJAKQDAQUMc2VsbFZvbFNhbGRvAiUgc3BhY2UgZm9yIHNlbGwgb3JkZXJzIChhbmQgb2NjdXBpZWQ9CQCkAwEFCndoT2NjdXBpZWQCHyksIGxlYWRzIHRvIG5lZ2F0aXZlIGZyZWUgc3BhY2UEBXdoU3RyCQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJALkJAggFAXoCXzECAV8JAMwIAgkAuQkCCAUBegJfMgIBXwkAzAgCCQC6CQIIBQF6Al8zAgFfCQDMCAIJAKQDAQUId2hMb2NrZWQFA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECHVzZFNhbGRvCAUBegJfNgQHYWN0aW9ucwMJAGYCBQh1c2RTYWxkbwAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEDCQECIT0CBQNhbXQFCHVzZFNhbGRvCQACAQkArAICAhJQYXltZW50IG5lZWRlZCBpcyAJAKQDAQUIdXNkU2FsZG8JAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdPcmRlclN0cgUDbmlsAwkAAAIFCHVzZFNhbGRvAAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdPcmRlclN0cgUDbmlsAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBW93bmVyCQEBLQEFCHVzZFNhbGRvBQt1c2R0QXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFC25ld09yZGVyU3RyBQNuaWwJAJQKAgUHYWN0aW9ucwkAlAoCBQZyZXN1bHQFBndoU2F2ZQFpARRhY2NlcHRXYXJlaG91c2VPcmRlcgMKYnBPcmRlclN0cg9zaG9wTGFuZEFzc2V0SWQLZHVja0Fzc2V0SWQEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwAEBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBApjYWxsZXJBZGRyCQClCAEFBmNhbGxlcgQRc3Rha2VkRHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFCmNhbGxlckFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFEXN0YWtlZER1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04EA2xvYwkAtQkCCQEFdmFsdWUBBQtjdXJMb2NhdGlvbgIBXwMJAQIhPQIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFMCQACAQkArAICCQCsAgICFkR1Y2sgbG9jYXRpb24gdHlwZSBpcyAJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAhEsIGJ1dCBzaG91bGQgYmUgTAMJAQIhPQIFEXN0YWtlZER1Y2tBc3NldElkBQtkdWNrQXNzZXRJZAkAAgEJAKwCAgkArAICCQCsAgICFFlvdXIgc3Rha2VkIGR1Y2sgaXMgBRFzdGFrZWREdWNrQXNzZXRJZAINLCBidXQgcGFzc2VkIAULZHVja0Fzc2V0SWQEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAlicFJlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8ECWJwTWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQKYnBQcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQNJHQwNTI5NDY1MzE4NgkBFWFjY2VwdFNob3BPcmRlckNvbW1vbgYFD3Nob3BMYW5kQXNzZXRJZAUKY2FsbGVyQWRkcgUKYnBPcmRlclN0cgUJYnBSZXNMaXN0BQlicE1hdExpc3QFCmJwUHJvZExpc3QECnNob3BBY3Rpb24IBQ0kdDA1Mjk0NjUzMTg2Al8xBApuZXdVc2VyUmVzCAUNJHQwNTI5NDY1MzE4NgJfMgQKbmV3VXNlck1hdAgFDSR0MDUyOTQ2NTMxODYCXzMEC25ld1VzZXJQcm9kCAUNJHQwNTI5NDY1MzE4NgJfNAQNdXNkV2gyQnBTYWxkbwgFDSR0MDUyOTQ2NTMxODYCXzUEDXVzZEJwMldoU2FsZG8IBQ0kdDA1Mjk0NjUzMTg2Al82BAh4cEFtb3VudAgFDSR0MDUyOTQ2NTMxODYCXzcEDXNob3BMYW5kT3duZXIIBQ0kdDA1Mjk0NjUzMTg2Al84BApzaG9wV2hTYXZlCAUNJHQwNTI5NDY1MzE4NgJfOQQOYWNjU3RhdHNSZXN1bHQIBQ0kdDA1Mjk0NjUzMTg2A18xMAQIYWN0aW9uczEJAMwIAgUKc2hvcEFjdGlvbgkBEHNob3AydXNlckFjdGlvbnMDBQ11c2RXaDJCcFNhbGRvBQpjYWxsZXJBZGRyAAAECGFjdGlvbnMyCQEQdXNlcjJzaG9wQWN0aW9ucwQFDXVzZEJwMldoU2FsZG8IBQFpCHBheW1lbnRzBQ1zaG9wTGFuZE93bmVyAAAECG5ld0JwU3RyCQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIFCm5ld1VzZXJSZXMCAV8JAMwIAgkAuQkCBQpuZXdVc2VyTWF0AgFfCQDMCAIJALoJAgULbmV3VXNlclByb2QCAV8FA25pbAIBOgQGYnBTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUIbmV3QnBTdHIFA25pbAUDbmlsBA9kdWNrU3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFBnhwU2hvcAUIeHBBbW91bnQFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDOCAIFCGFjdGlvbnMxBQhhY3Rpb25zMgkAlwoFBQxwcm9sb2dSZXN1bHQFCnNob3BXaFNhdmUFBmJwU2F2ZQUPZHVja1N0YXRzUmVzdWx0BQ5hY2NTdGF0c1Jlc3VsdAFpARthY2NlcHRTaG9wT3JkZXJEdWNrRGVsaXZlcnkCCG9yZGVyU3RyD3Nob3BMYW5kQXNzZXRJZAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQpjYWxsZXJBZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQJYnBSZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAlicE1hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECmJwUHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EDSR0MDU0NjI1NTQ4NjMJARVhY2NlcHRTaG9wT3JkZXJDb21tb24GBQ9zaG9wTGFuZEFzc2V0SWQFCmNhbGxlckFkZHIFCG9yZGVyU3RyBQlicFJlc0xpc3QFCWJwTWF0TGlzdAUKYnBQcm9kTGlzdAQKc2hvcEFjdGlvbggFDSR0MDU0NjI1NTQ4NjMCXzEECm5ld1VzZXJSZXMIBQ0kdDA1NDYyNTU0ODYzAl8yBApuZXdVc2VyTWF0CAUNJHQwNTQ2MjU1NDg2MwJfMwQLbmV3VXNlclByb2QIBQ0kdDA1NDYyNTU0ODYzAl80BA11c2RXaDJCcFNhbGRvCAUNJHQwNTQ2MjU1NDg2MwJfNQQNdXNkQnAyV2hTYWxkbwgFDSR0MDU0NjI1NTQ4NjMCXzYECHhwQW1vdW50CAUNJHQwNTQ2MjU1NDg2MwJfNwQNc2hvcExhbmRPd25lcggFDSR0MDU0NjI1NTQ4NjMCXzgECnNob3BXaFNhdmUIBQ0kdDA1NDYyNTU0ODYzAl85BA5hY2NTdGF0c1Jlc3VsdAgFDSR0MDU0NjI1NTQ4NjMDXzEwBA9kZWxpdmVyeUZlZVBhcnQJAGsDCQBkAgUNdXNkQnAyV2hTYWxkbwUNdXNkV2gyQnBTYWxkbwUMREVMSVZFUllfRkVFBQVNVUxUNgQLZGVsaXZlcnlGZWUDCQBmAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQ9kZWxpdmVyeUZlZVBhcnQFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUPZGVsaXZlcnlGZWVQYXJ0BAhzcGVudEZlZQkAawMFC2RlbGl2ZXJ5RmVlBQ11c2RCcDJXaFNhbGRvCQBkAgUNdXNkQnAyV2hTYWxkbwUNdXNkV2gyQnBTYWxkbwQLcmVjZWl2ZWRGZWUJAGUCBQtkZWxpdmVyeUZlZQUIc3BlbnRGZWUECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAQIYWN0aW9uczEJAMwIAgUKc2hvcEFjdGlvbgkBEHNob3AydXNlckFjdGlvbnMDBQ11c2RXaDJCcFNhbGRvBQpjYWxsZXJBZGRyBQtyZWNlaXZlZEZlZQQIYWN0aW9uczIJARB1c2VyMnNob3BBY3Rpb25zBAUNdXNkQnAyV2hTYWxkbwgFAWkIcGF5bWVudHMFDXNob3BMYW5kT3duZXIFCHNwZW50RmVlBAhuZXdCcFN0cgkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCBQpuZXdVc2VyUmVzAgFfCQDMCAIJALkJAgUKbmV3VXNlck1hdAIBXwkAzAgCCQC6CQIFC25ld1VzZXJQcm9kAgFfBQNuaWwCAToEBmJwU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFCG5ld0JwU3RyBQNuaWwFA25pbAQPZHVja1N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQZ4cFNob3AFCHhwQW1vdW50BQVNVUxUOAUDbmlsBQNuaWwJAJQKAgkAzQgCCQDOCAIFCGFjdGlvbnMxBQhhY3Rpb25zMgkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAULZGVsaXZlcnlGZWUJAJcKBQUMcHJvbG9nUmVzdWx0BQpzaG9wV2hTYXZlBQZicFNhdmUFD2R1Y2tTdGF0c1Jlc3VsdAUOYWNjU3RhdHNSZXN1bHQBaQEbYWNjZXB0U2hvcE9yZGVyTGFuZERlbGl2ZXJ5AwhvcmRlclN0cg9zaG9wTGFuZEFzc2V0SWQNbXlMYW5kQXNzZXRJZAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUNbXlMYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFDW15TGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFDW15TGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFCmNhbGxlckFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgUNbXlMYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQHcmVzTGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8EB21hdExpc3QJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBAhwcm9kTGlzdAMJAAACCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgFfBA0kdDA1NzEwMjU3MzM0CQEVYWNjZXB0U2hvcE9yZGVyQ29tbW9uBgUPc2hvcExhbmRBc3NldElkBQpjYWxsZXJBZGRyBQhvcmRlclN0cgUHcmVzTGlzdAUHbWF0TGlzdAUIcHJvZExpc3QECnNob3BBY3Rpb24IBQ0kdDA1NzEwMjU3MzM0Al8xBApuZXdVc2VyUmVzCAUNJHQwNTcxMDI1NzMzNAJfMgQKbmV3VXNlck1hdAgFDSR0MDU3MTAyNTczMzQCXzMEC25ld1VzZXJQcm9kCAUNJHQwNTcxMDI1NzMzNAJfNAQNdXNkV2gyQnBTYWxkbwgFDSR0MDU3MTAyNTczMzQCXzUEDXVzZEJwMldoU2FsZG8IBQ0kdDA1NzEwMjU3MzM0Al82BAh4cEFtb3VudAgFDSR0MDU3MTAyNTczMzQCXzcEDXNob3BMYW5kT3duZXIIBQ0kdDA1NzEwMjU3MzM0Al84BApzaG9wV2hTYXZlCAUNJHQwNTcxMDI1NzMzNAJfOQQOYWNjU3RhdHNSZXN1bHQIBQ0kdDA1NzEwMjU3MzM0A18xMAQPZGVsaXZlcnlGZWVQYXJ0CQBrAwkAZAIFDXVzZEJwMldoU2FsZG8FDXVzZFdoMkJwU2FsZG8FDERFTElWRVJZX0ZFRQUFTVVMVDYEC2RlbGl2ZXJ5RmVlAwkAZgIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUPZGVsaXZlcnlGZWVQYXJ0BRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFD2RlbGl2ZXJ5RmVlUGFydAQIc3BlbnRGZWUJAGsDBQtkZWxpdmVyeUZlZQUNdXNkQnAyV2hTYWxkbwkAZAIFDXVzZEJwMldoU2FsZG8FDXVzZFdoMkJwU2FsZG8EC3JlY2VpdmVkRmVlCQBlAgULZGVsaXZlcnlGZWUFCHNwZW50RmVlBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAECGFjdGlvbnMxCQDMCAIFCnNob3BBY3Rpb24JARBzaG9wMnVzZXJBY3Rpb25zAwUNdXNkV2gyQnBTYWxkbwUKY2FsbGVyQWRkcgULcmVjZWl2ZWRGZWUECGFjdGlvbnMyCQEQdXNlcjJzaG9wQWN0aW9ucwQFDXVzZEJwMldoU2FsZG8IBQFpCHBheW1lbnRzBQ1zaG9wTGFuZE93bmVyBQhzcGVudEZlZQQFd2hTdHIJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAuQkCBQpuZXdVc2VyUmVzAgFfCQDMCAIJALkJAgUKbmV3VXNlck1hdAIBXwkAzAgCCQC5CQIFC25ld1VzZXJQcm9kAgFfCQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQFA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQ1teUxhbmRBc3NldElkBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVBY2NTdGF0cwkAzAgCBQpjYWxsZXJBZGRyCQDMCAIJAGsDBQZ4cFNob3AFCHhwQW1vdW50BQVNVUxUOAUDbmlsBQNuaWwJAJQKAgkAzQgCCQDOCAIFCGFjdGlvbnMxBQhhY3Rpb25zMgkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAULZGVsaXZlcnlGZWUJAJcKBQUMcHJvbG9nUmVzdWx0BQpzaG9wV2hTYXZlBQZ3aFNhdmUFC3N0YXRzUmVzdWx0BQ5hY2NTdGF0c1Jlc3VsdAFpARBzZWxsUHJvZHVjdHNUb0VTAQdhbW91bnRzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUEJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgQWlycG9ydCwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAhwcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQFZXNLZXkJAQ5rZXlFc1dhcmVob3VzZQAECGV4aXN0U3RyCQCiCAEFBWVzS2V5BAxleGlzdEFtb3VudHMDCQEJaXNEZWZpbmVkAQUIZXhpc3RTdHIJALwJAgkBBXZhbHVlAQUIZXhpc3RTdHICAV8FA25pbAoBCG1vdmVQcm9kAgNhY2MJcmVjaXBlU3RyBAFqCAUDYWNjAl8xBAhxdWFudGl0eQMJAGYCCQCQAwEFB2Ftb3VudHMFAWoJAJEDAgUHYW1vdW50cwUBagAAAwkAZgIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBjYW5ub3QgYmUgbmVnYXRpdmUEBnJlY2lwZQkAtQkCBQlyZWNpcGVTdHICAV8DCQECIT0CCQCQAwEFBnJlY2lwZQUKUkVDSVBFU0laRQkAAgEJAKwCAgIXRmF0YWw6IHVua25vd24gcmVjaXBlOiAFCXJlY2lwZVN0cgQJbWF4QW1vdW50CQBoAgUNRVNNQVhQQUNLQUdFUwUOUFJPRFVDVFBLR1NJWkUEC2V4aXN0QW1vdW50AwkAZgIJAJADAQUMZXhpc3RBbW91bnRzBQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMZXhpc3RBbW91bnRzBQFqAAAEBmNhbkJ1eQkAZQIFCW1heEFtb3VudAULZXhpc3RBbW91bnQDCQBmAgUIcXVhbnRpdHkFBmNhbkJ1eQkAAgEJAKwCAgkArAICCQCsAgICF1dhcmVob3VzZSBjYW4gYnV5IG9ubHkgCQCkAwEFBmNhbkJ1eQIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoECHRvdGFsTWF0CQESZ2V0UmVjaXBlTWF0ZXJpYWxzAQUGcmVjaXBlBAl1bml0UHJpY2UJAGsDCQBoAgUIdG90YWxNYXQFCUVTQlVZQ09FRgUQUkVTT1VSQ0VQUklDRU1JTgkAaAIFBU1VTFQ4BQ5QUk9EVUNUUEtHU0laRQQMYnBQcm9kQW1vdW50AwkAZgIJAJADAQUIcHJvZExpc3QFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhwcm9kTGlzdAUBagAAAwkAZgIFCHF1YW50aXR5BQxicFByb2RBbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAg5Zb3UgaGF2ZSBvbmx5IAkApAMBBQxicFByb2RBbW91bnQCBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQFqCQCXCgUJAGQCBQFqAAEJAGQCCAUDYWNjAl8yCQBoAgUJdW5pdFByaWNlBQhxdWFudGl0eQkAzQgCCAUDYWNjAl8zCQCkAwEJAGUCBQxicFByb2RBbW91bnQFCHF1YW50aXR5CQDNCAIIBQNhY2MCXzQJAKQDAQkAZAIFC2V4aXN0QW1vdW50BQhxdWFudGl0eQkAZAIIBQNhY2MCXzUJAGgCBQh0b3RhbE1hdAUIcXVhbnRpdHkEBm1lcmdlZAoAAiRsBRBwcm9kdWN0aW9uTWF0cml4CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlwoFAAAAAAUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIbW92ZVByb2QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgQIbmV3QnBTdHIJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJALoJAggFBm1lcmdlZAJfMwIBXwUDbmlsAgE6BAZicFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQhuZXdCcFN0cgUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQp4cFNlbGxUb0VzCAUGbWVyZ2VkAl81CQBoAgUFTVVMVDgACgUDbmlsBQNuaWwJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQVlc0tleQkAugkCCAUGbWVyZ2VkAl80AgFfCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcggFBm1lcmdlZAJfMgULdXNkdEFzc2V0SWQFA25pbAkAlQoDBQZicFNhdmUFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQEPdXBkYXRlRXNTdG9yYWdlAQpuZXdTdG9yYWdlAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlFc1dhcmVob3VzZQAFCm5ld1N0b3JhZ2UFA25pbAUKbmV3U3RvcmFnZQFpARR1cGRhdGVEZWxpdmVyeUxvY2tlZAEJbmV3QW1vdW50AwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFkZWxpdmVyeUxvY2tlZEtleQUJbmV3QW1vdW50BQNuaWwFCW5ld0Ftb3VudAFpARJzZW5kRGVsaXZlcnlSZXdhcmQBBGFkZHIDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAEC2xvY2tlZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEWRlbGl2ZXJ5TG9ja2VkS2V5AAAJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFC3VzZHRBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGUCBQlmdW5kVG90YWwFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQkAzAgCCQEMSW50ZWdlckVudHJ5AgURZGVsaXZlcnlMb2NrZWRLZXkJAGUCBQtsb2NrZWRUb3RhbAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQCQpMla", "height": 2769751, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3iCeXZ1zcNk6ToaRLGAxynSPpCE9t8pLiMT2sZ3KBo5K Next: DvVvyG9sqjPTU9da2MW29vLvDsT3PB8anjZd2Xqp6TnB Diff:
OldNewDifferences
710710 let minPrices = [0, 0, 0, 0, 0, 0]
711711 func oneFactory (acc,continent) = {
712712 let x = sellResourcesCommon(resList, continent, oneFactoryAmounts, minPrices)
713- $Tuple3((acc._1 :+ x._1), (acc._2 + x._3), (acc._3 + x._4))
713+ $Tuple3((acc._1 ++ x._1), (acc._2 + x._3), (acc._3 + x._4))
714714 }
715715
716- let $t02520825298 = {
716+ let $t02521325303 = {
717717 let $l = continents
718718 let $s = size($l)
719719 let $acc0 = $Tuple3(nil, 0, 0)
727727
728728 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
729729 }
730- let factoryActions = $t02520825298._1
731- let usdtReceived = $t02520825298._2
732- let totalRes = $t02520825298._3
730+ let factoryActions = $t02521325303._1
731+ let usdtReceived = $t02521325303._2
732+ let totalRes = $t02521325303._3
733733 let fee = fraction(usdtReceived, DELIVERY_FEE, MULT6)
734734 let activitiesAmount = (usdtReceived / 100)
735735 let usdtLeft = ((usdtReceived - activitiesAmount) - fee)
766766 else {
767767 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
768768 let resList = split(currentPack[bpIdxRes], "_")
769- let $t02675026876 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
770- let factoryActions = $t02675026876._1
771- let newRes = $t02675026876._2
772- let usdtReceived = $t02675026876._3
773- let totalRes = $t02675026876._4
769+ let $t02675526881 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
770+ let factoryActions = $t02675526881._1
771+ let newRes = $t02675526881._2
772+ let usdtReceived = $t02675526881._3
773+ let totalRes = $t02675526881._4
774774 let activitiesAmount = (usdtReceived / 100)
775775 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
776776 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
786786 func sellResourcesWorld (addr,amount) = if ((i.caller != acresContract))
787787 then throw("Permission denied")
788788 else {
789- let $t02766827825 = sellResourcesWorldInternal(amount)
790- let factoryActions = $t02766827825._1
791- let usdtLeft = $t02766827825._2
792- let fee = $t02766827825._3
793- let activitiesAmount = $t02766827825._4
794- let totalRes = $t02766827825._5
789+ let $t02767327830 = sellResourcesWorldInternal(amount)
790+ let factoryActions = $t02767327830._1
791+ let usdtLeft = $t02767327830._2
792+ let fee = $t02767327830._3
793+ let activitiesAmount = $t02767327830._4
794+ let totalRes = $t02767327830._5
795795 if ((0 >= usdtLeft))
796796 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
797797 else {
821821 else {
822822 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
823823 let resList = split(currentPack[bpIdxRes], "_")
824- let $t02905829179 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
825- let factoryActions = $t02905829179._1
826- let newRes = $t02905829179._2
827- let usdtReceived = $t02905829179._3
828- let totalRes = $t02905829179._4
824+ let $t02906329184 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
825+ let factoryActions = $t02906329184._1
826+ let newRes = $t02906329184._2
827+ let usdtReceived = $t02906329184._3
828+ let totalRes = $t02906329184._4
829829 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
830830 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
831831 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
866866 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
867867 let currentWh = split_4C(wh, ":")
868868 let resList = split(currentWh[whIdxRes], "_")
869- let $t03120631327 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
870- let factoryActions = $t03120631327._1
871- let newRes = $t03120631327._2
872- let usdtReceived = $t03120631327._3
873- let totalRes = $t03120631327._4
869+ let $t03121131332 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
870+ let factoryActions = $t03121131332._1
871+ let newRes = $t03121131332._2
872+ let usdtReceived = $t03121131332._3
873+ let totalRes = $t03121131332._4
874874 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), currentWh[whIdxMat], currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
875875 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
876876 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
912912 else {
913913 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
914914 let matList = split(currentPack[bpIdxMat], "_")
915- let $t03318733309 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
916- let factoryActions = $t03318733309._1
917- let newMat = $t03318733309._2
918- let usdtSpent = $t03318733309._3
919- let totalMat = $t03318733309._4
915+ let $t03319233314 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
916+ let factoryActions = $t03319233314._1
917+ let newMat = $t03319233314._2
918+ let usdtSpent = $t03319233314._3
919+ let totalMat = $t03319233314._4
920920 if ((usdtSpent > amt))
921921 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
922922 else {
954954 else {
955955 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
956956 let matList = split(currentPack[bpIdxMat], "_")
957- let $t03482734944 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
958- let factoryActions = $t03482734944._1
959- let newMat = $t03482734944._2
960- let usdtSpent = $t03482734944._3
961- let totalMat = $t03482734944._4
957+ let $t03483234949 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
958+ let factoryActions = $t03483234949._1
959+ let newMat = $t03483234949._2
960+ let usdtSpent = $t03483234949._3
961+ let totalMat = $t03483234949._4
962962 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
963963 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
964964 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
10111011 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
10121012 let currentWh = split_4C(wh, ":")
10131013 let matList = split(currentWh[whIdxMat], "_")
1014- let $t03722237339 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1015- let factoryActions = $t03722237339._1
1016- let newMat = $t03722237339._2
1017- let usdtSpent = $t03722237339._3
1018- let totalMat = $t03722237339._4
1014+ let $t03722737344 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1015+ let factoryActions = $t03722737344._1
1016+ let newMat = $t03722737344._2
1017+ let usdtSpent = $t03722737344._3
1018+ let totalMat = $t03722737344._4
10191019 let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
10201020 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
10211021 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalMat, MULT8)], nil))
10631063 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
10641064 let resList = split(currentPack[bpIdxRes], "_")
10651065 let matList = split(currentPack[bpIdxMat], "_")
1066- let $t03945339559 = exchangeResourcesCommon(resList, matList, amounts)
1067- let newRes = $t03945339559._1
1068- let newMat = $t03945339559._2
1069- let usdtSpent = $t03945339559._3
1070- let totalAmountConverted = $t03945339559._4
1066+ let $t03945839564 = exchangeResourcesCommon(resList, matList, amounts)
1067+ let newRes = $t03945839564._1
1068+ let newMat = $t03945839564._2
1069+ let usdtSpent = $t03945839564._3
1070+ let totalAmountConverted = $t03945839564._4
10711071 if ((usdtSpent > amt))
10721072 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
10731073 else {
11041104 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
11051105 let resList = split(currentPack[bpIdxRes], "_")
11061106 let matList = split(currentPack[bpIdxMat], "_")
1107- let $t04099441100 = exchangeResourcesCommon(resList, matList, amounts)
1108- let newRes = $t04099441100._1
1109- let newMat = $t04099441100._2
1110- let usdtSpent = $t04099441100._3
1111- let totalAmountConverted = $t04099441100._4
1107+ let $t04099941105 = exchangeResourcesCommon(resList, matList, amounts)
1108+ let newRes = $t04099941105._1
1109+ let newMat = $t04099941105._2
1110+ let usdtSpent = $t04099941105._3
1111+ let totalAmountConverted = $t04099941105._4
11121112 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
11131113 let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
11141114 then MIN_USDT_FEE_DELIVERY15
11601160 let currentWh = split_4C(wh, ":")
11611161 let resList = split(currentWh[whIdxRes], "_")
11621162 let matList = split(currentWh[whIdxMat], "_")
1163- let $t04332343429 = exchangeResourcesCommon(resList, matList, amounts)
1164- let newRes = $t04332343429._1
1165- let newMat = $t04332343429._2
1166- let usdtSpent = $t04332343429._3
1167- let totalAmountConverted = $t04332343429._4
1163+ let $t04332843434 = exchangeResourcesCommon(resList, matList, amounts)
1164+ let newRes = $t04332843434._1
1165+ let newMat = $t04332843434._2
1166+ let usdtSpent = $t04332843434._3
1167+ let totalAmountConverted = $t04332843434._4
11681168 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
11691169 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
11701170 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
13781378 let bpProdList = if ((currentPack[bpIdxProd] == ""))
13791379 then nil
13801380 else split_4C(currentPack[bpIdxProd], "_")
1381- let $t05294153181 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1382- let shopAction = $t05294153181._1
1383- let newUserRes = $t05294153181._2
1384- let newUserMat = $t05294153181._3
1385- let newUserProd = $t05294153181._4
1386- let usdWh2BpSaldo = $t05294153181._5
1387- let usdBp2WhSaldo = $t05294153181._6
1388- let xpAmount = $t05294153181._7
1389- let shopLandOwner = $t05294153181._8
1390- let shopWhSave = $t05294153181._9
1391- let accStatsResult = $t05294153181._10
1381+ let $t05294653186 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1382+ let shopAction = $t05294653186._1
1383+ let newUserRes = $t05294653186._2
1384+ let newUserMat = $t05294653186._3
1385+ let newUserProd = $t05294653186._4
1386+ let usdWh2BpSaldo = $t05294653186._5
1387+ let usdBp2WhSaldo = $t05294653186._6
1388+ let xpAmount = $t05294653186._7
1389+ let shopLandOwner = $t05294653186._8
1390+ let shopWhSave = $t05294653186._9
1391+ let accStatsResult = $t05294653186._10
13921392 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, 0)]
13931393 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, 0)
13941394 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
14151415 let bpProdList = if ((currentPack[bpIdxProd] == ""))
14161416 then nil
14171417 else split_4C(currentPack[bpIdxProd], "_")
1418- let $t05462054858 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1419- let shopAction = $t05462054858._1
1420- let newUserRes = $t05462054858._2
1421- let newUserMat = $t05462054858._3
1422- let newUserProd = $t05462054858._4
1423- let usdWh2BpSaldo = $t05462054858._5
1424- let usdBp2WhSaldo = $t05462054858._6
1425- let xpAmount = $t05462054858._7
1426- let shopLandOwner = $t05462054858._8
1427- let shopWhSave = $t05462054858._9
1428- let accStatsResult = $t05462054858._10
1418+ let $t05462554863 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1419+ let shopAction = $t05462554863._1
1420+ let newUserRes = $t05462554863._2
1421+ let newUserMat = $t05462554863._3
1422+ let newUserProd = $t05462554863._4
1423+ let usdWh2BpSaldo = $t05462554863._5
1424+ let usdBp2WhSaldo = $t05462554863._6
1425+ let xpAmount = $t05462554863._7
1426+ let shopLandOwner = $t05462554863._8
1427+ let shopWhSave = $t05462554863._9
1428+ let accStatsResult = $t05462554863._10
14291429 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
14301430 let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
14311431 then MIN_USDT_FEE_DELIVERY
14651465 let prodList = if ((currentWh[whIdxProd] == ""))
14661466 then nil
14671467 else split(currentWh[whIdxProd], "_")
1468- let $t05709757329 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1469- let shopAction = $t05709757329._1
1470- let newUserRes = $t05709757329._2
1471- let newUserMat = $t05709757329._3
1472- let newUserProd = $t05709757329._4
1473- let usdWh2BpSaldo = $t05709757329._5
1474- let usdBp2WhSaldo = $t05709757329._6
1475- let xpAmount = $t05709757329._7
1476- let shopLandOwner = $t05709757329._8
1477- let shopWhSave = $t05709757329._9
1478- let accStatsResult = $t05709757329._10
1468+ let $t05710257334 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1469+ let shopAction = $t05710257334._1
1470+ let newUserRes = $t05710257334._2
1471+ let newUserMat = $t05710257334._3
1472+ let newUserProd = $t05710257334._4
1473+ let usdWh2BpSaldo = $t05710257334._5
1474+ let usdBp2WhSaldo = $t05710257334._6
1475+ let xpAmount = $t05710257334._7
1476+ let shopLandOwner = $t05710257334._8
1477+ let shopWhSave = $t05710257334._9
1478+ let accStatsResult = $t05710257334._10
14791479 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
14801480 let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
14811481 then MIN_USDT_FEE_DELIVERY
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
2727
2828 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
2929
3030 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
3131
3232 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"]
3333
3434 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
3535
3636 let COEFF2MAT = 10000000
3737
3838 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_"]
3939
4040 let rIdxCoeff = 6
4141
4242 let rIdxContinent = 7
4343
4444 let RECIPESIZE = 11
4545
4646 let PRODUCTPKGSIZE = 10
4747
4848 let whIdxLevels = 0
4949
5050 let whIdxRes = 1
5151
5252 let whIdxMat = 2
5353
5454 let whIdxProd = 3
5555
5656 let whIdxLOFT = 4
5757
5858 let volLocked = 0
5959
6060 let volTotal = 3
6161
6262 let bpIdxLevel = 0
6363
6464 let bpIdxRes = 1
6565
6666 let bpIdxMat = 2
6767
6868 let bpIdxProd = 3
6969
7070 let locIdxContinent = 0
7171
7272 let locIdxType = 1
7373
7474 let locIdxId = 2
7575
7676 func keyLandAssetIdToOwner (assetId) = ("no_" + assetId)
7777
7878
7979 func keyStakedTimeByAssetId (assetId) = ("st_" + assetId)
8080
8181
8282 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
8383
8484
8585 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
8686
8787
8888 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
8989
9090
9191 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
9292
9393
9494 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
9595
9696
9797 func keyEsWarehouse () = "emergencyWarehouseProducts"
9898
9999
100100 let deliveryFundKey = "deliveryFund"
101101
102102 let deliveryLockedKey = "deliveryLocked"
103103
104104 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
105105
106106
107107 let KS_ALLOW_DELIVERY = true
108108
109109 let chain = take(drop(this.bytes, 1), 1)
110110
111111 let usdtAssetId = match chain {
112112 case _ =>
113113 if ((base58'2W' == $match0))
114114 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
115115 else if ((base58'2T' == $match0))
116116 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
117117 else throw("Unknown chain")
118118 }
119119
120120 let defaultRestAddressStr = match chain {
121121 case _ =>
122122 if ((base58'2W' == $match0))
123123 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
124124 else if ((base58'2T' == $match0))
125125 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
126126 else throw("Unknown chain")
127127 }
128128
129129 let SEP = "__"
130130
131131 let MULT5 = 100000
132132
133133 let MULT6 = 1000000
134134
135135 let MULT8 = 100000000
136136
137137 let MULT10 = 10000000000
138138
139139 let MINSHOPPAYMENT = 100000
140140
141141 let ITER6 = [0, 1, 2, 3, 4, 5]
142142
143143 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
144144
145145
146146 let IdxCfgStakingDapp = 1
147147
148148 let IdxCfgInvestFundDapp = 6
149149
150150 let IdxCfgAcresDapp = 8
151151
152152 func keyRestCfg () = "%s__restConfig"
153153
154154
155155 func keyRestAddress () = "%s__restAddr"
156156
157157
158158 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
159159
160160
161161 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
162162
163163
164164 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
165165
166166 let restCfg = readRestCfgOrFail(restContract)
167167
168168 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
169169
170170 let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
171171
172172 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
173173
174174 func asString (v) = match v {
175175 case s: String =>
176176 s
177177 case _ =>
178178 throw("fail to cast into String")
179179 }
180180
181181
182182 func asInt (v) = match v {
183183 case n: Int =>
184184 n
185185 case _ =>
186186 throw("fail to cast into Int")
187187 }
188188
189189
190190 func keyBlocked () = "contractsBlocked"
191191
192192
193193 func fixedPoint (val,decimals) = {
194194 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
195195 let lowPart = toString((val % tenPow))
196196 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
197197 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
198198 }
199199
200200
201201 let FACTORYMAXWAREHOUSE = 10000000000
202202
203203 let SELLMULTIPLIER = 200
204204
205205 let BUYMULTIPLIER = 300
206206
207207 let AUCTIONFEE = 10000
208208
209209 let DELIVERY_FEE = 10000
210210
211211 let DELIVERY_FEE15 = 15000
212212
213213 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
214214
215215
216216 let ordIdxRes = 0
217217
218218 let ordIdxMat = 1
219219
220220 let ordIdxProd = 2
221221
222222 func getOrder (ordKey) = {
223223 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:"), ":")
224224 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
225225 then p[ordIdxRes]
226226 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
227227 then p[ordIdxMat]
228228 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
229229 }
230230
231231
232232 func toVolume (amount,pkgSize,isProduct) = if (isProduct)
233233 then {
234234 let pkgs = if ((amount >= 0))
235235 then (((amount + pkgSize) - 1) / pkgSize)
236236 else -((((-(amount) + pkgSize) - 1) / pkgSize))
237237 (pkgs * MULT8)
238238 }
239239 else amount
240240
241241
242242 func sellInternal (locId,resType,amount,minPrice) = {
243243 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
244244 let w0 = valueOrElse(getInteger(whKey), 0)
245245 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
246246 then 0
247247 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
248248 then (FACTORYMAXWAREHOUSE - w0)
249249 else amount
250250 let usdtReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
251251 let min99 = (minPrice - (minPrice / 100))
252252 if (((min99 * amount) > (usdtReceived * MULT8)))
253253 then throw((((((((((("Actual price = " + toString(usdtReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
254254 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdtReceived)
255255 }
256256
257257
258258 func buyInternal (locId,matType,amount,maxPrice) = {
259259 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
260260 let w0 = valueOrElse(getInteger(whKey), 0)
261261 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
262262 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
263263 else 0
264264 let m0 = min([w0, (amount - m1)])
265265 let m = (m0 + m1)
266266 let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
267267 let max101 = (maxPrice + (maxPrice / 100))
268268 if (((usdtSpent * MULT8) > (max101 * m)))
269269 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
270270 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdtSpent, m)
271271 }
272272
273273
274274 func getBackpack (bpKey) = {
275275 let p = split_4C(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
276276 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
277277 then p[bpIdxRes]
278278 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
279279 then p[bpIdxMat]
280280 else "0_0_0_0_0_0", p[bpIdxProd]]
281281 }
282282
283283
284284 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
285285 then throw("Contracts are under maintenance")
286286 else unit
287287
288288
289289 func prolog () = asInt(invoke(stakingContract, "saveLastTx", nil, nil))
290290
291291
292292 func setCommon (acc,ignoredIterator) = {
293293 let j = acc._1
294294 let item = if ((size(acc._10) > j))
295295 then acc._10[j]
296296 else "0@0"
297297 let isProd = acc._8
298298 let itemParts = split(item, "@")
299299 if ((size(itemParts) != 2))
300300 then throw("Incorrect order format, should be amount@price")
301301 else {
302302 let newOrdAm = parseIntValue(itemParts[0])
303303 let newOrdPr = parseIntValue(itemParts[1])
304304 let newOrdUsd = if (isProd)
305305 then (newOrdAm * newOrdPr)
306306 else fraction(newOrdAm, newOrdPr, MULT8)
307307 let newOrdVol = toVolume(newOrdAm, PRODUCTPKGSIZE, isProd)
308308 let whInit = if ((size(acc._6) > j))
309309 then parseIntValue(acc._6[j])
310310 else 0
311311 let curOrdParts = split(if ((size(acc._7) > j))
312312 then acc._7[j]
313313 else "0@0", "@")
314314 let curOrdAm = parseIntValue(curOrdParts[0])
315315 let curOrdPr = parseIntValue(curOrdParts[1])
316316 if (if ((0 > curOrdPr))
317317 then true
318318 else (0 > newOrdPr))
319319 then throw("Price can't be negative")
320320 else {
321321 let curOrdUsd = if (isProd)
322322 then (curOrdAm * curOrdPr)
323323 else fraction(curOrdAm, curOrdPr, MULT8)
324324 if ((newOrdAm == 0))
325325 then if ((curOrdAm > 0))
326326 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)
327327 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)
328328 else if ((newOrdAm > 0))
329329 then if ((0 > curOrdAm))
330330 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)
331331 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)
332332 else if ((0 > curOrdAm))
333333 then {
334334 let amDiff = (curOrdAm - newOrdAm)
335335 if ((0 > (whInit - amDiff)))
336336 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whInit)) + " available"))
337337 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)
338338 }
339339 else if ((0 > (whInit + newOrdAm)))
340340 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whInit)) + " available"))
341341 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)
342342 }
343343 }
344344 }
345345
346346
347347 func setInternal (currentWh,currentOrd,newOrd) = {
348348 let currWhRes = split(currentWh[whIdxRes], "_")
349349 let currWhMat = split(currentWh[whIdxMat], "_")
350350 let currWhProd = if ((currentWh[whIdxProd] == ""))
351351 then nil
352352 else split_4C(currentWh[whIdxProd], "_")
353353 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
354354 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
355355 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
356356 then nil
357357 else split_4C(currentOrd[ordIdxProd], "_")
358358 if ((size(newOrd) != 3))
359359 then throw("newOrderStr should contain exactly 2 ':' separators")
360360 else {
361361 let resParts = split(newOrd[0], "_")
362362 let matParts = split(newOrd[1], "_")
363363 let prodParts = if ((newOrd[2] == ""))
364364 then nil
365365 else split_4C(newOrd[2], "_")
366366 if ((size(resParts) != NUMRES))
367367 then throw("All 6 resources should be passed")
368368 else if ((size(matParts) != NUMRES))
369369 then throw("All 6 materials should be passed")
370370 else {
371371 let r = {
372372 let $l = resTypes
373373 let $s = size($l)
374374 let $acc0 = $Tuple10(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false, 0, resParts)
375375 func $f0_1 ($a,$i) = if (($i >= $s))
376376 then $a
377377 else setCommon($a, $l[$i])
378378
379379 func $f0_2 ($a,$i) = if (($i >= $s))
380380 then $a
381381 else throw("List size exceeds 6")
382382
383383 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
384384 }
385385 let m = {
386386 let $l = matTypes
387387 let $s = size($l)
388388 let $acc0 = $Tuple10(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false, r._9, matParts)
389389 func $f1_1 ($a,$i) = if (($i >= $s))
390390 then $a
391391 else setCommon($a, $l[$i])
392392
393393 func $f1_2 ($a,$i) = if (($i >= $s))
394394 then $a
395395 else throw("List size exceeds 6")
396396
397397 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
398398 }
399399 let p = {
400400 let $l = prodTypes
401401 let $s = size($l)
402402 let $acc0 = $Tuple10(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true, m._9, prodParts)
403403 func $f2_1 ($a,$i) = if (($i >= $s))
404404 then $a
405405 else setCommon($a, $l[$i])
406406
407407 func $f2_2 ($a,$i) = if (($i >= $s))
408408 then $a
409409 else throw("List size exceeds 50")
410410
411411 $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)
412412 }
413413 $Tuple7(r._2, m._2, p._2, p._3, p._4, p._5, p._9)
414414 }
415415 }
416416 }
417417
418418
419419 func acceptCommon (acc,bpOrdItem) = {
420420 let j = acc._7
421421 let isProd = acc._12
422422 let bpOrdParts = split(bpOrdItem, "@")
423423 if ((size(bpOrdParts) != 2))
424424 then throw("Incorrect order format, should be amount@price")
425425 else {
426426 let bpOrdAm = parseIntValue(bpOrdParts[0])
427427 let bpOrdPr = parseIntValue(bpOrdParts[1])
428428 if ((0 > bpOrdPr))
429429 then throw("Price can't be negative")
430430 else {
431431 let bpOrdUsd = if (isProd)
432432 then (bpOrdAm * bpOrdPr)
433433 else fraction(bpOrdAm, bpOrdPr, MULT8)
434434 let bpInit = if ((size(acc._8) > j))
435435 then parseIntValue(acc._8[j])
436436 else 0
437437 let whInit = if ((size(acc._9) > j))
438438 then parseIntValue(acc._9[j])
439439 else 0
440440 let whOrdInit = if ((size(acc._10) > j))
441441 then acc._10[j]
442442 else "0@0"
443443 let whOrdParts = split(whOrdInit, "@")
444444 let whOrdAm = parseIntValue(whOrdParts[0])
445445 let whOrdPr = parseIntValue(whOrdParts[1])
446446 if (if ((bpOrdAm != 0))
447447 then (bpOrdPr != whOrdPr)
448448 else false)
449449 then throw(((((("Prices of " + acc._11[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
450450 else {
451451 let whOrdUsd = if (isProd)
452452 then (whOrdAm * whOrdPr)
453453 else fraction(whOrdAm, whOrdPr, MULT8)
454454 let deltaVol = toVolume(bpOrdAm, PRODUCTPKGSIZE, isProd)
455455 if ((bpOrdAm == 0))
456456 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)
457457 else if ((bpOrdAm > 0))
458458 then if ((0 > whOrdAm))
459459 then if ((bpOrdAm > -(whOrdAm)))
460460 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + acc._11[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
461461 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)
462462 then (bpOrdAm * MULT8)
463463 else bpOrdAm)))
464464 else throw((("Attempt to buy " + acc._11[j]) + " while warehouse doesn't sell it"))
465465 else if ((whOrdAm > 0))
466466 then if ((-(bpOrdAm) > whOrdAm))
467467 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + acc._11[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
468468 else if ((-(bpOrdAm) > bpInit))
469469 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + toString(bpInit)) + " of ") + acc._11[j]))
470470 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)
471471 then (bpOrdAm * MULT8)
472472 else bpOrdAm)))
473473 else throw((("Attempt to sell " + acc._11[j]) + " while warehouse doesn't buy it"))
474474 }
475475 }
476476 }
477477 }
478478
479479
480480 func sellResourcesCommon (resList,factoryLocId,amounts,minPrices) = {
481481 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
482482 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
483483 else if ((0 > amounts[j]))
484484 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
485485 else if ((amounts[j] > 0))
486486 then {
487487 let b = sellInternal(factoryLocId, j, amounts[j], minPrices[j])
488488 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2), (acc._4 + amounts[j]))
489489 }
490490 else $Tuple4(acc._1, (acc._2 :+ resList[j]), acc._3, acc._4)
491491
492492 let $l = ITER6
493493 let $s = size($l)
494494 let $acc0 = $Tuple4(nil, nil, 0, 0)
495495 func $f0_1 ($a,$i) = if (($i >= $s))
496496 then $a
497497 else adder($a, $l[$i])
498498
499499 func $f0_2 ($a,$i) = if (($i >= $s))
500500 then $a
501501 else throw("List size exceeds 6")
502502
503503 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
504504 }
505505
506506
507507 func buyMaterialsCommon (matList,factoryLocId,amounts,maxPrices) = {
508508 func mUpdater (acc,j) = if ((0 > amounts[j]))
509509 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
510510 else if ((amounts[j] > 0))
511511 then {
512512 let b = buyInternal(factoryLocId, j, amounts[j], maxPrices[j])
513513 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2), (acc._4 + amounts[j]))
514514 }
515515 else $Tuple4(acc._1, (acc._2 :+ matList[j]), acc._3, acc._4)
516516
517517 let $l = ITER6
518518 let $s = size($l)
519519 let $acc0 = $Tuple4(nil, nil, 0, 0)
520520 func $f0_1 ($a,$i) = if (($i >= $s))
521521 then $a
522522 else mUpdater($a, $l[$i])
523523
524524 func $f0_2 ($a,$i) = if (($i >= $s))
525525 then $a
526526 else throw("List size exceeds 6")
527527
528528 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
529529 }
530530
531531
532532 func exchangeResourcesCommon (resList,matList,amounts) = {
533533 func exchanger (acc,j) = {
534534 let amj = amounts[j]
535535 if ((amj > parseIntValue(resList[j])))
536536 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
537537 else if ((0 > amj))
538538 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
539539 else if ((amj > 0))
540540 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))
541541 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
542542 }
543543
544544 let $l = ITER6
545545 let $s = size($l)
546546 let $acc0 = $Tuple4(nil, nil, 0, 0)
547547 func $f0_1 ($a,$i) = if (($i >= $s))
548548 then $a
549549 else exchanger($a, $l[$i])
550550
551551 func $f0_2 ($a,$i) = if (($i >= $s))
552552 then $a
553553 else throw("List size exceeds 6")
554554
555555 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
556556 }
557557
558558
559559 func shop2userActions (usdWh2BpSaldo,callerAddr,receivedFee) = if ((usdWh2BpSaldo > 0))
560560 then {
561561 let usdWh2BpFee = fraction(usdWh2BpSaldo, AUCTIONFEE, MULT6)
562562 if ((receivedFee >= (usdWh2BpSaldo - (3 * usdWh2BpFee))))
563563 then throw(("This trade does not cover delivery cost of " + fixedPoint(receivedFee, 6)))
564564 else {
565565 let refByKey = keyAddressRefBy(callerAddr)
566566 let refBy = getString(stakingContract, refByKey)
567567 let caller = addressFromStringValue(callerAddr)
568568 (((if (isDefined(refBy))
569569 then [ScriptTransfer(addressFromStringValue(value(refBy)), usdWh2BpFee, usdtAssetId)]
570570 else nil) :+ ScriptTransfer(caller, ((usdWh2BpSaldo - (3 * usdWh2BpFee)) - receivedFee), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId))
571571 }
572572 }
573573 else nil
574574
575575
576576 func user2shopActions (usdBp2WhSaldo,pmts,shopLandOwner,spentFee) = if ((usdBp2WhSaldo > 0))
577577 then if ((size(pmts) != 1))
578578 then throw("exactly 1 payment must be attached")
579579 else {
580580 let pmt = pmts[0]
581581 let amt = pmt.amount
582582 if (if (!(isDefined(pmt.assetId)))
583583 then true
584584 else (value(pmt.assetId) != usdtAssetId))
585585 then throw("USDT payments only!")
586586 else {
587587 let usdtSpentWithFee = (usdBp2WhSaldo + spentFee)
588588 if ((amt != usdtSpentWithFee))
589589 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdBp2WhSaldo, 6)) + "+") + fixedPoint(spentFee, 6)) + "(delivery fee)"))
590590 else if ((MINSHOPPAYMENT > usdBp2WhSaldo))
591591 then throw(("Min shop trade is " + fixedPoint(MINSHOPPAYMENT, 6)))
592592 else {
593593 let usdBp2WhFee = fraction(usdBp2WhSaldo, AUCTIONFEE, MULT6)
594594 let refByKey = keyAddressRefBy(shopLandOwner)
595595 let refBy = getString(stakingContract, refByKey)
596596 (((if (isDefined(refBy))
597597 then [ScriptTransfer(addressFromStringValue(value(refBy)), usdBp2WhFee, usdtAssetId)]
598598 else nil) :+ ScriptTransfer(addressFromStringValue(shopLandOwner), (usdBp2WhSaldo - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId))
599599 }
600600 }
601601 }
602602 else if ((size(pmts) != 0))
603603 then throw("No payments needed")
604604 else nil
605605
606606
607607 func acceptShopOrderCommon (shopLandAssetId,callerAddr,bpOrderStr,bpResList,bpMatList,bpProdList) = {
608608 let landAsset = value(assetInfo(fromBase58String(shopLandAssetId)))
609609 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(shopLandAssetId)))))
610610 then throw((("NFT " + landAsset.name) + " is not staked"))
611611 else {
612612 let shopLandOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(shopLandAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
613613 if ((shopLandOwner == callerAddr))
614614 then throw("You cannot trade with yourself")
615615 else {
616616 let bpOrderParts = split_4C(bpOrderStr, ":")
617617 if ((size(bpOrderParts) != 3))
618618 then throw("bpOrderStr should contain exactly 2 ':' separators")
619619 else {
620620 let bpOrdRes = split(bpOrderParts[0], "_")
621621 let bpOrdMat = split(bpOrderParts[1], "_")
622622 let bpOrdProd = if ((bpOrderParts[2] == ""))
623623 then nil
624624 else split_4C(bpOrderParts[2], "_")
625625 if ((size(bpOrdRes) != NUMRES))
626626 then throw("All 6 resources should be passed")
627627 else if ((size(bpOrdMat) != NUMRES))
628628 then throw("All 6 materials should be passed")
629629 else {
630630 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [shopLandAssetId], nil))
631631 let currentWh = split_4C(wh, ":")
632632 let currWhRes = split(currentWh[whIdxRes], "_")
633633 let currWhMat = split(currentWh[whIdxMat], "_")
634634 let currWhProd = if ((currentWh[whIdxProd] == ""))
635635 then nil
636636 else split_4C(currentWh[whIdxProd], "_")
637637 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
638638 let ordKey = keyOrderByLand(shopLandAssetId)
639639 let whOrd = getOrder(ordKey)
640640 let whOrdRes = split(whOrd[ordIdxRes], "_")
641641 let whOrdMat = split(whOrd[ordIdxMat], "_")
642642 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
643643 then nil
644644 else split_4C(whOrd[ordIdxProd], "_")
645645 let r = {
646646 let $l = bpOrdRes
647647 let $s = size($l)
648648 let $acc0 = $Tuple13(nil, nil, nil, 0, 0, 0, 0, bpResList, currWhRes, whOrdRes, resTypes, false, 0)
649649 func $f0_1 ($a,$i) = if (($i >= $s))
650650 then $a
651651 else acceptCommon($a, $l[$i])
652652
653653 func $f0_2 ($a,$i) = if (($i >= $s))
654654 then $a
655655 else throw("List size exceeds 6")
656656
657657 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
658658 }
659659 let m = {
660660 let $l = bpOrdMat
661661 let $s = size($l)
662662 let $acc0 = $Tuple13(nil, nil, nil, r._4, r._5, r._6, 0, bpMatList, currWhMat, whOrdMat, matTypes, false, r._13)
663663 func $f1_1 ($a,$i) = if (($i >= $s))
664664 then $a
665665 else acceptCommon($a, $l[$i])
666666
667667 func $f1_2 ($a,$i) = if (($i >= $s))
668668 then $a
669669 else throw("List size exceeds 6")
670670
671671 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
672672 }
673673 let p = if ((size(bpOrdProd) != 0))
674674 then {
675675 let $l = bpOrdProd
676676 let $s = size($l)
677677 let $acc0 = $Tuple13(nil, nil, nil, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
678678 func $f2_1 ($a,$i) = if (($i >= $s))
679679 then $a
680680 else acceptCommon($a, $l[$i])
681681
682682 func $f2_2 ($a,$i) = if (($i >= $s))
683683 then $a
684684 else throw("List size exceeds 50")
685685
686686 $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)
687687 }
688688 else $Tuple13(currWhProd, whOrdProd, bpProdList, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
689689 let volSaldo = p._4
690690 let newLockedVol = if ((0 > (currWhLockedVol - volSaldo)))
691691 then 0
692692 else (currWhLockedVol - volSaldo)
693693 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(r._1, "_"), makeString(m._1, "_"), makeString_2C(p._1, "_"), toString(newLockedVol)], ":")
694694 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString_2C(p._2, "_")], ":")
695695 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, shopLandAssetId], nil))
696696 let accStatsResult = asInt(invoke(stakingContract, "updateAccStats", [shopLandOwner, fraction(xpShop, p._13, MULT8)], nil))
697697 $Tuple10(StringEntry(ordKey, newWhOrdStr), r._3, m._3, p._3, p._5, p._6, p._13, shopLandOwner, whSave, accStatsResult)
698698 }
699699 }
700700 }
701701 }
702702 }
703703
704704
705705 func sellResourcesWorldInternal (amount) = {
706706 let oneRes = (amount / 30)
707707 let oneFactoryAmounts = [oneRes, oneRes, oneRes, oneRes, oneRes, oneRes]
708708 let s = toString(oneRes)
709709 let resList = [s, s, s, s, s, s]
710710 let minPrices = [0, 0, 0, 0, 0, 0]
711711 func oneFactory (acc,continent) = {
712712 let x = sellResourcesCommon(resList, continent, oneFactoryAmounts, minPrices)
713- $Tuple3((acc._1 :+ x._1), (acc._2 + x._3), (acc._3 + x._4))
713+ $Tuple3((acc._1 ++ x._1), (acc._2 + x._3), (acc._3 + x._4))
714714 }
715715
716- let $t02520825298 = {
716+ let $t02521325303 = {
717717 let $l = continents
718718 let $s = size($l)
719719 let $acc0 = $Tuple3(nil, 0, 0)
720720 func $f0_1 ($a,$i) = if (($i >= $s))
721721 then $a
722722 else oneFactory($a, $l[$i])
723723
724724 func $f0_2 ($a,$i) = if (($i >= $s))
725725 then $a
726726 else throw("List size exceeds 5")
727727
728728 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
729729 }
730- let factoryActions = $t02520825298._1
731- let usdtReceived = $t02520825298._2
732- let totalRes = $t02520825298._3
730+ let factoryActions = $t02521325303._1
731+ let usdtReceived = $t02521325303._2
732+ let totalRes = $t02521325303._3
733733 let fee = fraction(usdtReceived, DELIVERY_FEE, MULT6)
734734 let activitiesAmount = (usdtReceived / 100)
735735 let usdtLeft = ((usdtReceived - activitiesAmount) - fee)
736736 $Tuple5(factoryActions, usdtLeft, fee, activitiesAmount, totalRes)
737737 }
738738
739739
740740 @Callable(i)
741741 func recalcLockedVolumeREADONLY (landAssetId,wh) = {
742742 let currentOrd = getOrder(keyOrderByLand(landAssetId))
743743 let z = setInternal(wh, currentOrd, currentOrd)
744744 $Tuple2(nil, (z._4 + z._5))
745745 }
746746
747747
748748
749749 @Callable(i)
750750 func constructorV1 (restAddr) = if ((i.caller != this))
751751 then throw("Permission denied")
752752 else [StringEntry(keyRestAddress(), restAddr)]
753753
754754
755755
756756 @Callable(i)
757757 func sellResources (amounts,minPrices) = {
758758 let prologResult = prolog()
759759 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
760760 if ((size(i.payments) != 0))
761761 then throw("sellResources doesn't require any payments")
762762 else {
763763 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
764764 if ((curLocation[locIdxType] != "F"))
765765 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
766766 else {
767767 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
768768 let resList = split(currentPack[bpIdxRes], "_")
769- let $t02675026876 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
770- let factoryActions = $t02675026876._1
771- let newRes = $t02675026876._2
772- let usdtReceived = $t02675026876._3
773- let totalRes = $t02675026876._4
769+ let $t02675526881 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
770+ let factoryActions = $t02675526881._1
771+ let newRes = $t02675526881._2
772+ let usdtReceived = $t02675526881._3
773+ let totalRes = $t02675526881._4
774774 let activitiesAmount = (usdtReceived / 100)
775775 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
776776 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
777777 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
778778 $Tuple2(((factoryActions :+ ScriptTransfer(i.caller, (usdtReceived - activitiesAmount), usdtAssetId)) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
779779 }
780780 }
781781 }
782782
783783
784784
785785 @Callable(i)
786786 func sellResourcesWorld (addr,amount) = if ((i.caller != acresContract))
787787 then throw("Permission denied")
788788 else {
789- let $t02766827825 = sellResourcesWorldInternal(amount)
790- let factoryActions = $t02766827825._1
791- let usdtLeft = $t02766827825._2
792- let fee = $t02766827825._3
793- let activitiesAmount = $t02766827825._4
794- let totalRes = $t02766827825._5
789+ let $t02767327830 = sellResourcesWorldInternal(amount)
790+ let factoryActions = $t02767327830._1
791+ let usdtLeft = $t02767327830._2
792+ let fee = $t02767327830._3
793+ let activitiesAmount = $t02767327830._4
794+ let totalRes = $t02767327830._5
795795 if ((0 >= usdtLeft))
796796 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
797797 else {
798798 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
799799 $Tuple2((((factoryActions :+ IntegerEntry(deliveryFundKey, (valueOrElse(getInteger(deliveryFundKey), 0) + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ ScriptTransfer(investFundContract, usdtLeft, usdtAssetId)), $Tuple2(usdtLeft, statsResult))
800800 }
801801 }
802802
803803
804804
805805 @Callable(i)
806806 func sellResourcesWorldREADONLY (amount) = {
807807 let usdtLeft = sellResourcesWorldInternal(amount)._2
808808 $Tuple2(nil, usdtLeft)
809809 }
810810
811811
812812
813813 @Callable(i)
814814 func sellResourcesDuckDelivery (amounts,minPrices,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
815815 then throw("Delivery feature is turned off!")
816816 else {
817817 let prologResult = prolog()
818818 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
819819 if ((size(i.payments) != 0))
820820 then throw("sellResources doesn't require any payments")
821821 else {
822822 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
823823 let resList = split(currentPack[bpIdxRes], "_")
824- let $t02905829179 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
825- let factoryActions = $t02905829179._1
826- let newRes = $t02905829179._2
827- let usdtReceived = $t02905829179._3
828- let totalRes = $t02905829179._4
824+ let $t02906329184 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
825+ let factoryActions = $t02906329184._1
826+ let newRes = $t02906329184._2
827+ let usdtReceived = $t02906329184._3
828+ let totalRes = $t02906329184._4
829829 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
830830 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
831831 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
832832 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
833833 let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
834834 then MIN_USDT_FEE_DELIVERY
835835 else feePart
836836 let activitiesAmount = (usdtReceived / 100)
837837 if ((fee >= (usdtReceived - activitiesAmount)))
838838 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
839839 else {
840840 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
841841 $Tuple2((((factoryActions :+ ScriptTransfer(i.caller, ((usdtReceived - activitiesAmount) - fee), usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
842842 }
843843 }
844844 }
845845
846846
847847
848848 @Callable(i)
849849 func sellResourcesLandDelivery (amounts,minPrices,landAssetId,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
850850 then throw("Delivery feature is turned off!")
851851 else {
852852 let prologResult = prolog()
853853 if ((size(i.payments) != 0))
854854 then throw("sellResources doesn't require any payments")
855855 else {
856856 let user = i.caller
857857 let addr = toString(user)
858858 let asset = value(assetInfo(fromBase58String(landAssetId)))
859859 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
860860 then throw((("NFT " + asset.name) + " is not staked"))
861861 else {
862862 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
863863 if ((owner != addr))
864864 then throw((LANDPREFIX + " is not yours"))
865865 else {
866866 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
867867 let currentWh = split_4C(wh, ":")
868868 let resList = split(currentWh[whIdxRes], "_")
869- let $t03120631327 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
870- let factoryActions = $t03120631327._1
871- let newRes = $t03120631327._2
872- let usdtReceived = $t03120631327._3
873- let totalRes = $t03120631327._4
869+ let $t03121131332 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
870+ let factoryActions = $t03121131332._1
871+ let newRes = $t03121131332._2
872+ let usdtReceived = $t03121131332._3
873+ let totalRes = $t03121131332._4
874874 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), currentWh[whIdxMat], currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
875875 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
876876 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
877877 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
878878 let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
879879 then MIN_USDT_FEE_DELIVERY
880880 else feePart
881881 let activitiesAmount = (usdtReceived / 100)
882882 if ((fee >= (usdtReceived - activitiesAmount)))
883883 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
884884 else {
885885 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
886886 $Tuple2((((factoryActions :+ ScriptTransfer(i.caller, ((usdtReceived - activitiesAmount) - fee), usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(whSave, prologResult, statsResult))
887887 }
888888 }
889889 }
890890 }
891891 }
892892
893893
894894
895895 @Callable(i)
896896 func buyMaterials (amounts,maxPrices) = {
897897 let prologResult = prolog()
898898 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
899899 if ((size(i.payments) != 1))
900900 then throw("exactly 1 payment must be attached")
901901 else {
902902 let pmt = i.payments[0]
903903 let amt = pmt.amount
904904 if (if (!(isDefined(pmt.assetId)))
905905 then true
906906 else (value(pmt.assetId) != usdtAssetId))
907907 then throw("USDT payments only!")
908908 else {
909909 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
910910 if ((curLocation[locIdxType] != "F"))
911911 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
912912 else {
913913 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
914914 let matList = split(currentPack[bpIdxMat], "_")
915- let $t03318733309 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
916- let factoryActions = $t03318733309._1
917- let newMat = $t03318733309._2
918- let usdtSpent = $t03318733309._3
919- let totalMat = $t03318733309._4
915+ let $t03319233314 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
916+ let factoryActions = $t03319233314._1
917+ let newMat = $t03319233314._2
918+ let usdtSpent = $t03319233314._3
919+ let totalMat = $t03319233314._4
920920 if ((usdtSpent > amt))
921921 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
922922 else {
923923 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
924924 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
925925 let rest = if (((amt - usdtSpent) > 0))
926926 then [ScriptTransfer(i.caller, (amt - usdtSpent), usdtAssetId)]
927927 else nil
928928 let activitiesAmount = (usdtSpent / 100)
929929 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
930930 $Tuple2(((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
931931 }
932932 }
933933 }
934934 }
935935 }
936936
937937
938938
939939 @Callable(i)
940940 func buyMaterialsDuckDelivery (amounts,maxPrices,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
941941 then throw("Delivery feature is turned off!")
942942 else {
943943 let prologResult = prolog()
944944 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
945945 if ((size(i.payments) != 1))
946946 then throw("exactly 1 payment must be attached")
947947 else {
948948 let pmt = i.payments[0]
949949 let amt = pmt.amount
950950 if (if (!(isDefined(pmt.assetId)))
951951 then true
952952 else (value(pmt.assetId) != usdtAssetId))
953953 then throw("USDT payments only!")
954954 else {
955955 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
956956 let matList = split(currentPack[bpIdxMat], "_")
957- let $t03482734944 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
958- let factoryActions = $t03482734944._1
959- let newMat = $t03482734944._2
960- let usdtSpent = $t03482734944._3
961- let totalMat = $t03482734944._4
957+ let $t03483234949 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
958+ let factoryActions = $t03483234949._1
959+ let newMat = $t03483234949._2
960+ let usdtSpent = $t03483234949._3
961+ let totalMat = $t03483234949._4
962962 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
963963 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
964964 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
965965 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
966966 let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
967967 then MIN_USDT_FEE_DELIVERY
968968 else feePart
969969 let usdtSpentWithFee = (usdtSpent + fee)
970970 if ((usdtSpentWithFee > amt))
971971 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
972972 else {
973973 let rest = if (((amt - usdtSpentWithFee) > 0))
974974 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
975975 else nil
976976 let activitiesAmount = (usdtSpent / 100)
977977 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
978978 $Tuple2((((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
979979 }
980980 }
981981 }
982982 }
983983
984984
985985
986986 @Callable(i)
987987 func buyMaterialsLandDelivery (amounts,maxPrices,landAssetId,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
988988 then throw("Delivery feature is turned off!")
989989 else {
990990 let prologResult = prolog()
991991 if ((size(i.payments) != 1))
992992 then throw("exactly 1 payment must be attached")
993993 else {
994994 let pmt = i.payments[0]
995995 let amt = pmt.amount
996996 if (if (!(isDefined(pmt.assetId)))
997997 then true
998998 else (value(pmt.assetId) != usdtAssetId))
999999 then throw("USDT payments only!")
10001000 else {
10011001 let user = i.caller
10021002 let addr = toString(user)
10031003 let asset = value(assetInfo(fromBase58String(landAssetId)))
10041004 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
10051005 then throw((("NFT " + asset.name) + " is not staked"))
10061006 else {
10071007 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
10081008 if ((owner != addr))
10091009 then throw((LANDPREFIX + " is not yours"))
10101010 else {
10111011 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
10121012 let currentWh = split_4C(wh, ":")
10131013 let matList = split(currentWh[whIdxMat], "_")
1014- let $t03722237339 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1015- let factoryActions = $t03722237339._1
1016- let newMat = $t03722237339._2
1017- let usdtSpent = $t03722237339._3
1018- let totalMat = $t03722237339._4
1014+ let $t03722737344 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1015+ let factoryActions = $t03722737344._1
1016+ let newMat = $t03722737344._2
1017+ let usdtSpent = $t03722737344._3
1018+ let totalMat = $t03722737344._4
10191019 let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
10201020 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
10211021 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalMat, MULT8)], nil))
10221022 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
10231023 let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
10241024 then MIN_USDT_FEE_DELIVERY
10251025 else feePart
10261026 let usdtSpentWithFee = (usdtSpent + fee)
10271027 if ((usdtSpentWithFee > amt))
10281028 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
10291029 else {
10301030 let rest = if (((amt - usdtSpentWithFee) > 0))
10311031 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
10321032 else nil
10331033 let activitiesAmount = (usdtSpent / 100)
10341034 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
10351035 $Tuple2((((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
10361036 }
10371037 }
10381038 }
10391039 }
10401040 }
10411041 }
10421042
10431043
10441044
10451045 @Callable(i)
10461046 func exchangeResources (amounts) = {
10471047 let prologResult = prolog()
10481048 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
10491049 if ((size(i.payments) != 1))
10501050 then throw("exactly 1 payment must be attached")
10511051 else {
10521052 let pmt = i.payments[0]
10531053 let amt = pmt.amount
10541054 if (if (!(isDefined(pmt.assetId)))
10551055 then true
10561056 else (value(pmt.assetId) != usdtAssetId))
10571057 then throw("USDT payments only!")
10581058 else {
10591059 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
10601060 if ((curLocation[locIdxType] != "F"))
10611061 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
10621062 else {
10631063 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
10641064 let resList = split(currentPack[bpIdxRes], "_")
10651065 let matList = split(currentPack[bpIdxMat], "_")
1066- let $t03945339559 = exchangeResourcesCommon(resList, matList, amounts)
1067- let newRes = $t03945339559._1
1068- let newMat = $t03945339559._2
1069- let usdtSpent = $t03945339559._3
1070- let totalAmountConverted = $t03945339559._4
1066+ let $t03945839564 = exchangeResourcesCommon(resList, matList, amounts)
1067+ let newRes = $t03945839564._1
1068+ let newMat = $t03945839564._2
1069+ let usdtSpent = $t03945839564._3
1070+ let totalAmountConverted = $t03945839564._4
10711071 if ((usdtSpent > amt))
10721072 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
10731073 else {
10741074 let newPack = makeString([currentPack[bpIdxLevel], makeString(newRes, "_"), makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
10751075 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
10761076 let rest = if (((amt - usdtSpent) > 0))
10771077 then [ScriptTransfer(i.caller, (amt - usdtSpent), usdtAssetId)]
10781078 else nil
10791079 let activitiesAmount = (usdtSpent / 100)
10801080 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
10811081 $Tuple2((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
10821082 }
10831083 }
10841084 }
10851085 }
10861086 }
10871087
10881088
10891089
10901090 @Callable(i)
10911091 func exchangeResourcesDuckDelivery (amounts) = {
10921092 let prologResult = prolog()
10931093 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
10941094 if ((size(i.payments) != 1))
10951095 then throw("exactly 1 payment must be attached")
10961096 else {
10971097 let pmt = i.payments[0]
10981098 let amt = pmt.amount
10991099 if (if (!(isDefined(pmt.assetId)))
11001100 then true
11011101 else (value(pmt.assetId) != usdtAssetId))
11021102 then throw("USDT payments only!")
11031103 else {
11041104 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
11051105 let resList = split(currentPack[bpIdxRes], "_")
11061106 let matList = split(currentPack[bpIdxMat], "_")
1107- let $t04099441100 = exchangeResourcesCommon(resList, matList, amounts)
1108- let newRes = $t04099441100._1
1109- let newMat = $t04099441100._2
1110- let usdtSpent = $t04099441100._3
1111- let totalAmountConverted = $t04099441100._4
1107+ let $t04099941105 = exchangeResourcesCommon(resList, matList, amounts)
1108+ let newRes = $t04099941105._1
1109+ let newMat = $t04099941105._2
1110+ let usdtSpent = $t04099941105._3
1111+ let totalAmountConverted = $t04099941105._4
11121112 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
11131113 let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
11141114 then MIN_USDT_FEE_DELIVERY15
11151115 else feePart
11161116 let usdtSpentWithFee = (usdtSpent + fee)
11171117 if ((usdtSpentWithFee > amt))
11181118 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
11191119 else {
11201120 let newPack = makeString([currentPack[bpIdxLevel], makeString(newRes, "_"), makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
11211121 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
11221122 let rest = if (((amt - usdtSpentWithFee) > 0))
11231123 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
11241124 else nil
11251125 let activitiesAmount = (usdtSpent / 100)
11261126 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
11271127 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
11281128 $Tuple2(((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
11291129 }
11301130 }
11311131 }
11321132 }
11331133
11341134
11351135
11361136 @Callable(i)
11371137 func exchangeResourcesLandDelivery (amounts,landAssetId) = {
11381138 let prologResult = prolog()
11391139 if ((size(i.payments) != 1))
11401140 then throw("exactly 1 payment must be attached")
11411141 else {
11421142 let pmt = i.payments[0]
11431143 let amt = pmt.amount
11441144 if (if (!(isDefined(pmt.assetId)))
11451145 then true
11461146 else (value(pmt.assetId) != usdtAssetId))
11471147 then throw("USDT payments only!")
11481148 else {
11491149 let user = i.caller
11501150 let addr = toString(user)
11511151 let asset = value(assetInfo(fromBase58String(landAssetId)))
11521152 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
11531153 then throw((("NFT " + asset.name) + " is not staked"))
11541154 else {
11551155 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
11561156 if ((owner != addr))
11571157 then throw((LANDPREFIX + " is not yours"))
11581158 else {
11591159 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
11601160 let currentWh = split_4C(wh, ":")
11611161 let resList = split(currentWh[whIdxRes], "_")
11621162 let matList = split(currentWh[whIdxMat], "_")
1163- let $t04332343429 = exchangeResourcesCommon(resList, matList, amounts)
1164- let newRes = $t04332343429._1
1165- let newMat = $t04332343429._2
1166- let usdtSpent = $t04332343429._3
1167- let totalAmountConverted = $t04332343429._4
1163+ let $t04332843434 = exchangeResourcesCommon(resList, matList, amounts)
1164+ let newRes = $t04332843434._1
1165+ let newMat = $t04332843434._2
1166+ let usdtSpent = $t04332843434._3
1167+ let totalAmountConverted = $t04332843434._4
11681168 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
11691169 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
11701170 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
11711171 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
11721172 let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
11731173 then MIN_USDT_FEE_DELIVERY15
11741174 else feePart
11751175 let usdtSpentWithFee = (usdtSpent + fee)
11761176 if ((usdtSpentWithFee > amt))
11771177 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
11781178 else {
11791179 let rest = if (((amt - usdtSpentWithFee) > 0))
11801180 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
11811181 else nil
11821182 let activitiesAmount = (usdtSpent / 100)
11831183 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
11841184 $Tuple2(((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
11851185 }
11861186 }
11871187 }
11881188 }
11891189 }
11901190 }
11911191
11921192
11931193
11941194 @Callable(i)
11951195 func craftGoods (productIdx,quantity) = {
11961196 let prologResult = prolog()
11971197 if ((size(i.payments) != 1))
11981198 then throw("exactly 1 payment must be attached")
11991199 else {
12001200 let pmt = i.payments[0]
12011201 let amt = pmt.amount
12021202 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
12031203 if ((pmtAssetId != usdtAssetId))
12041204 then throw("USDT payments only!")
12051205 else if ((amt != MULT6))
12061206 then throw("exactly 1 USDT must be attached as payment")
12071207 else if ((0 >= quantity))
12081208 then throw("Quantity should be positive")
12091209 else {
12101210 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
12111211 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
12121212 if ((curLocation[locIdxType] != "M"))
12131213 then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
12141214 else {
12151215 let cont = curLocation[locIdxContinent]
12161216 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
12171217 let matList = split(currentPack[bpIdxMat], "_")
12181218 if (if ((0 > productIdx))
12191219 then true
12201220 else (productIdx >= size(productionMatrix)))
12211221 then throw(("Unknown product idx=" + toString(productIdx)))
12221222 else {
12231223 let recipe = split(productionMatrix[productIdx], "_")
12241224 if ((size(recipe) != RECIPESIZE))
12251225 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
12261226 else {
12271227 let productContIdx = parseIntValue(recipe[rIdxContinent])
12281228 if ((continents[productContIdx] != cont))
12291229 then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
12301230 else {
12311231 let prodList = if ((currentPack[bpIdxProd] == ""))
12321232 then nil
12331233 else split_4C(currentPack[bpIdxProd], "_")
12341234 func filler (acc,ignoredItem) = {
12351235 let n = acc._2
12361236 let xs = if ((size(prodList) > n))
12371237 then prodList[n]
12381238 else "0"
12391239 let x = parseIntValue(xs)
12401240 let amount = (quantity * PRODUCTPKGSIZE)
12411241 let y = if ((n == productIdx))
12421242 then toString((x + amount))
12431243 else xs
12441244 $Tuple2((acc._1 :+ y), (n + 1))
12451245 }
12461246
12471247 let bpProd = ( let $l = productionMatrix
12481248 let $s = size($l)
12491249 let $acc0 = $Tuple2(nil, 0)
12501250 func $f0_1 ($a,$i) = if (($i >= $s))
12511251 then $a
12521252 else filler($a, $l[$i])
12531253
12541254 func $f0_2 ($a,$i) = if (($i >= $s))
12551255 then $a
12561256 else throw("List size exceeds 50")
12571257
12581258 $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
12591259 func producer (acc,j) = {
12601260 let needMat = (((parseIntValue(recipe[j]) * MULT5) * quantity) * parseIntValue(recipe[rIdxCoeff]))
12611261 let haveMat = parseIntValue(matList[j])
12621262 if ((needMat > haveMat))
12631263 then throw(((((((("You have " + fixedPoint(haveMat, 8)) + " of ") + matTypes[j]) + ", but recipe requires ") + fixedPoint(needMat, 8)) + " for quantity ") + toString(quantity)))
12641264 else if ((needMat > 0))
12651265 then $Tuple2((acc._1 :+ toString((haveMat - needMat))), (acc._2 + needMat))
12661266 else $Tuple2((acc._1 :+ matList[j]), acc._2)
12671267 }
12681268
12691269 let merged = {
12701270 let $l = ITER6
12711271 let $s = size($l)
12721272 let $acc0 = $Tuple2(nil, 0)
12731273 func $f1_1 ($a,$i) = if (($i >= $s))
12741274 then $a
12751275 else producer($a, $l[$i])
12761276
12771277 func $f1_2 ($a,$i) = if (($i >= $s))
12781278 then $a
12791279 else throw("List size exceeds 6")
12801280
12811281 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12821282 }
12831283 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._1, "_"), makeString_2C(bpProd, "_")], ":")
12841284 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
12851285 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, merged._2, MULT8)], nil))
12861286 $Tuple2(nil, $Tuple3(result, prologResult, statsResult))
12871287 }
12881288 }
12891289 }
12901290 }
12911291 }
12921292 }
12931293 }
12941294
12951295
12961296
12971297 @Callable(i)
12981298 func setWarehouseOrder (newOrderStr,landAssetId) = {
12991299 let user = i.originCaller
13001300 let addr = toString(user)
13011301 let result = if ((user != restContract))
13021302 then checkBlocked()
13031303 else false
13041304 let asset = value(assetInfo(fromBase58String(landAssetId)))
13051305 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
13061306 then throw((("NFT " + asset.name) + " is not staked"))
13071307 else {
13081308 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
13091309 if (if ((user != restContract))
13101310 then (owner != addr)
13111311 else false)
13121312 then throw((LANDPREFIX + " is not yours"))
13131313 else {
13141314 let newOrder = split_4C(newOrderStr, ":")
13151315 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
13161316 let currentWh = split_4C(wh, ":")
13171317 let loft = split(currentWh[whIdxLOFT], "_")
13181318 let whTotal = parseIntValue(loft[volTotal])
13191319 let ordKey = keyOrderByLand(landAssetId)
13201320 let currentOrd = getOrder(ordKey)
13211321 let z = setInternal(currentWh, currentOrd, newOrder)
13221322 let buyVolSaldo = z._4
13231323 let sellVolSaldo = z._5
13241324 let whOccupied = z._7
13251325 let whLocked = (buyVolSaldo + sellVolSaldo)
13261326 let whFree = ((whTotal - whOccupied) - whLocked)
13271327 if ((0 > whFree))
13281328 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"))
13291329 else {
13301330 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(z._1, "_"), makeString(z._2, "_"), makeString_2C(z._3, "_"), toString(whLocked)], ":")
13311331 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
13321332 let usdSaldo = z._6
13331333 let actions = if ((usdSaldo > 0))
13341334 then if ((size(i.payments) != 1))
13351335 then throw("exactly 1 payment must be attached")
13361336 else {
13371337 let pmt = i.payments[0]
13381338 let amt = pmt.amount
13391339 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
13401340 if ((pmtAssetId != usdtAssetId))
13411341 then throw("USDT payments only!")
13421342 else if ((amt != usdSaldo))
13431343 then throw(("Payment needed is " + toString(usdSaldo)))
13441344 else [StringEntry(ordKey, newOrderStr)]
13451345 }
13461346 else if ((usdSaldo == 0))
13471347 then if ((size(i.payments) != 0))
13481348 then throw("No payments needed")
13491349 else [StringEntry(ordKey, newOrderStr)]
13501350 else if ((size(i.payments) != 0))
13511351 then throw("No payments needed")
13521352 else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, newOrderStr)]
13531353 $Tuple2(actions, $Tuple2(result, whSave))
13541354 }
13551355 }
13561356 }
13571357 }
13581358
13591359
13601360
13611361 @Callable(i)
13621362 func acceptWarehouseOrder (bpOrderStr,shopLandAssetId,duckAssetId) = {
13631363 let prologResult = prolog()
13641364 let caller = i.originCaller
13651365 let callerAddr = toString(caller)
13661366 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
13671367 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
13681368 let loc = split(value(curLocation), "_")
13691369 if ((loc[locIdxType] != "L"))
13701370 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
13711371 else if ((stakedDuckAssetId != duckAssetId))
13721372 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
13731373 else {
13741374 let bpKey = keyBackpackByDuck(duckAssetId)
13751375 let currentPack = getBackpack(bpKey)
13761376 let bpResList = split(currentPack[bpIdxRes], "_")
13771377 let bpMatList = split(currentPack[bpIdxMat], "_")
13781378 let bpProdList = if ((currentPack[bpIdxProd] == ""))
13791379 then nil
13801380 else split_4C(currentPack[bpIdxProd], "_")
1381- let $t05294153181 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1382- let shopAction = $t05294153181._1
1383- let newUserRes = $t05294153181._2
1384- let newUserMat = $t05294153181._3
1385- let newUserProd = $t05294153181._4
1386- let usdWh2BpSaldo = $t05294153181._5
1387- let usdBp2WhSaldo = $t05294153181._6
1388- let xpAmount = $t05294153181._7
1389- let shopLandOwner = $t05294153181._8
1390- let shopWhSave = $t05294153181._9
1391- let accStatsResult = $t05294153181._10
1381+ let $t05294653186 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1382+ let shopAction = $t05294653186._1
1383+ let newUserRes = $t05294653186._2
1384+ let newUserMat = $t05294653186._3
1385+ let newUserProd = $t05294653186._4
1386+ let usdWh2BpSaldo = $t05294653186._5
1387+ let usdBp2WhSaldo = $t05294653186._6
1388+ let xpAmount = $t05294653186._7
1389+ let shopLandOwner = $t05294653186._8
1390+ let shopWhSave = $t05294653186._9
1391+ let accStatsResult = $t05294653186._10
13921392 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, 0)]
13931393 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, 0)
13941394 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
13951395 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
13961396 let duckStatsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpShop, xpAmount, MULT8)], nil))
13971397 $Tuple2((actions1 ++ actions2), $Tuple5(prologResult, shopWhSave, bpSave, duckStatsResult, accStatsResult))
13981398 }
13991399 }
14001400
14011401
14021402
14031403 @Callable(i)
14041404 func acceptShopOrderDuckDelivery (orderStr,shopLandAssetId) = if (!(KS_ALLOW_DELIVERY))
14051405 then throw("Delivery feature is turned off!")
14061406 else {
14071407 let prologResult = prolog()
14081408 let caller = i.originCaller
14091409 let callerAddr = toString(caller)
14101410 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
14111411 let bpKey = keyBackpackByDuck(duckAssetId)
14121412 let currentPack = getBackpack(bpKey)
14131413 let bpResList = split(currentPack[bpIdxRes], "_")
14141414 let bpMatList = split(currentPack[bpIdxMat], "_")
14151415 let bpProdList = if ((currentPack[bpIdxProd] == ""))
14161416 then nil
14171417 else split_4C(currentPack[bpIdxProd], "_")
1418- let $t05462054858 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1419- let shopAction = $t05462054858._1
1420- let newUserRes = $t05462054858._2
1421- let newUserMat = $t05462054858._3
1422- let newUserProd = $t05462054858._4
1423- let usdWh2BpSaldo = $t05462054858._5
1424- let usdBp2WhSaldo = $t05462054858._6
1425- let xpAmount = $t05462054858._7
1426- let shopLandOwner = $t05462054858._8
1427- let shopWhSave = $t05462054858._9
1428- let accStatsResult = $t05462054858._10
1418+ let $t05462554863 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1419+ let shopAction = $t05462554863._1
1420+ let newUserRes = $t05462554863._2
1421+ let newUserMat = $t05462554863._3
1422+ let newUserProd = $t05462554863._4
1423+ let usdWh2BpSaldo = $t05462554863._5
1424+ let usdBp2WhSaldo = $t05462554863._6
1425+ let xpAmount = $t05462554863._7
1426+ let shopLandOwner = $t05462554863._8
1427+ let shopWhSave = $t05462554863._9
1428+ let accStatsResult = $t05462554863._10
14291429 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
14301430 let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
14311431 then MIN_USDT_FEE_DELIVERY
14321432 else deliveryFeePart
14331433 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
14341434 let receivedFee = (deliveryFee - spentFee)
14351435 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
14361436 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, receivedFee)]
14371437 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, spentFee)
14381438 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
14391439 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
14401440 let duckStatsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpShop, xpAmount, MULT8)], nil))
14411441 $Tuple2(((actions1 ++ actions2) :+ IntegerEntry(deliveryFundKey, (fundTotal + deliveryFee))), $Tuple5(prologResult, shopWhSave, bpSave, duckStatsResult, accStatsResult))
14421442 }
14431443
14441444
14451445
14461446 @Callable(i)
14471447 func acceptShopOrderLandDelivery (orderStr,shopLandAssetId,myLandAssetId) = if (!(KS_ALLOW_DELIVERY))
14481448 then throw("Delivery feature is turned off!")
14491449 else {
14501450 let prologResult = prolog()
14511451 let caller = i.originCaller
14521452 let callerAddr = toString(caller)
14531453 let asset = value(assetInfo(fromBase58String(myLandAssetId)))
14541454 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(myLandAssetId)))))
14551455 then throw((("NFT " + asset.name) + " is not staked"))
14561456 else {
14571457 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(myLandAssetId)), (("NFT " + asset.name) + " is orphaned"))
14581458 if ((owner != callerAddr))
14591459 then throw((LANDPREFIX + " is not yours"))
14601460 else {
14611461 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [myLandAssetId], nil))
14621462 let currentWh = split_4C(wh, ":")
14631463 let resList = split(currentWh[whIdxRes], "_")
14641464 let matList = split(currentWh[whIdxMat], "_")
14651465 let prodList = if ((currentWh[whIdxProd] == ""))
14661466 then nil
14671467 else split(currentWh[whIdxProd], "_")
1468- let $t05709757329 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1469- let shopAction = $t05709757329._1
1470- let newUserRes = $t05709757329._2
1471- let newUserMat = $t05709757329._3
1472- let newUserProd = $t05709757329._4
1473- let usdWh2BpSaldo = $t05709757329._5
1474- let usdBp2WhSaldo = $t05709757329._6
1475- let xpAmount = $t05709757329._7
1476- let shopLandOwner = $t05709757329._8
1477- let shopWhSave = $t05709757329._9
1478- let accStatsResult = $t05709757329._10
1468+ let $t05710257334 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1469+ let shopAction = $t05710257334._1
1470+ let newUserRes = $t05710257334._2
1471+ let newUserMat = $t05710257334._3
1472+ let newUserProd = $t05710257334._4
1473+ let usdWh2BpSaldo = $t05710257334._5
1474+ let usdBp2WhSaldo = $t05710257334._6
1475+ let xpAmount = $t05710257334._7
1476+ let shopLandOwner = $t05710257334._8
1477+ let shopWhSave = $t05710257334._9
1478+ let accStatsResult = $t05710257334._10
14791479 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
14801480 let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
14811481 then MIN_USDT_FEE_DELIVERY
14821482 else deliveryFeePart
14831483 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
14841484 let receivedFee = (deliveryFee - spentFee)
14851485 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
14861486 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, receivedFee)]
14871487 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, spentFee)
14881488 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString(newUserProd, "_"), currentWh[whIdxLOFT]], ":")
14891489 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, myLandAssetId], nil))
14901490 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [callerAddr, fraction(xpShop, xpAmount, MULT8)], nil))
14911491 $Tuple2(((actions1 ++ actions2) :+ IntegerEntry(deliveryFundKey, (fundTotal + deliveryFee))), $Tuple5(prologResult, shopWhSave, whSave, statsResult, accStatsResult))
14921492 }
14931493 }
14941494 }
14951495
14961496
14971497
14981498 @Callable(i)
14991499 func sellProductsToES (amounts) = {
15001500 let prologResult = prolog()
15011501 if ((size(i.payments) != 0))
15021502 then throw("No payments needed")
15031503 else {
15041504 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
15051505 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
15061506 if ((curLocation[locIdxType] != "A"))
15071507 then throw(("Duck location type should be Airport, but is " + curLocation[locIdxType]))
15081508 else {
15091509 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
15101510 let prodList = if ((currentPack[bpIdxProd] == ""))
15111511 then nil
15121512 else split_4C(currentPack[bpIdxProd], "_")
15131513 let esKey = keyEsWarehouse()
15141514 let existStr = getString(esKey)
15151515 let existAmounts = if (isDefined(existStr))
15161516 then split_4C(value(existStr), "_")
15171517 else nil
15181518 func moveProd (acc,recipeStr) = {
15191519 let j = acc._1
15201520 let quantity = if ((size(amounts) > j))
15211521 then amounts[j]
15221522 else 0
15231523 if ((0 > quantity))
15241524 then throw("Quantity cannot be negative")
15251525 else {
15261526 let recipe = split(recipeStr, "_")
15271527 if ((size(recipe) != RECIPESIZE))
15281528 then throw(("Fatal: unknown recipe: " + recipeStr))
15291529 else {
15301530 let maxAmount = (ESMAXPACKAGES * PRODUCTPKGSIZE)
15311531 let existAmount = if ((size(existAmounts) > j))
15321532 then parseIntValue(existAmounts[j])
15331533 else 0
15341534 let canBuy = (maxAmount - existAmount)
15351535 if ((quantity > canBuy))
15361536 then throw(((("Warehouse can buy only " + toString(canBuy)) + " of ") + prodTypes[j]))
15371537 else {
15381538 let totalMat = getRecipeMaterials(recipe)
15391539 let unitPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
15401540 let bpProdAmount = if ((size(prodList) > j))
15411541 then parseIntValue(prodList[j])
15421542 else 0
15431543 if ((quantity > bpProdAmount))
15441544 then throw(((("You have only " + toString(bpProdAmount)) + " of ") + prodTypes[j]))
15451545 else $Tuple5((j + 1), (acc._2 + (unitPrice * quantity)), (acc._3 :+ toString((bpProdAmount - quantity))), (acc._4 :+ toString((existAmount + quantity))), (acc._5 + (totalMat * quantity)))
15461546 }
15471547 }
15481548 }
15491549 }
15501550
15511551 let merged = {
15521552 let $l = productionMatrix
15531553 let $s = size($l)
15541554 let $acc0 = $Tuple5(0, 0, nil, nil, 0)
15551555 func $f0_1 ($a,$i) = if (($i >= $s))
15561556 then $a
15571557 else moveProd($a, $l[$i])
15581558
15591559 func $f0_2 ($a,$i) = if (($i >= $s))
15601560 then $a
15611561 else throw("List size exceeds 50")
15621562
15631563 $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)
15641564 }
15651565 let newBpStr = makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], makeString_2C(merged._3, "_")], ":")
15661566 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
15671567 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpSellToEs, merged._5, (MULT8 * 10))], nil))
15681568 $Tuple2([StringEntry(esKey, makeString_2C(merged._4, "_")), ScriptTransfer(i.caller, merged._2, usdtAssetId)], $Tuple3(bpSave, prologResult, statsResult))
15691569 }
15701570 }
15711571 }
15721572
15731573
15741574
15751575 @Callable(i)
15761576 func updateEsStorage (newStorage) = if ((i.caller != stakingContract))
15771577 then throw("Permission denied")
15781578 else $Tuple2([StringEntry(keyEsWarehouse(), newStorage)], newStorage)
15791579
15801580
15811581
15821582 @Callable(i)
15831583 func updateDeliveryLocked (newAmount) = if ((i.caller != stakingContract))
15841584 then throw("Permission denied")
15851585 else $Tuple2([IntegerEntry(deliveryLockedKey, newAmount)], newAmount)
15861586
15871587
15881588
15891589 @Callable(i)
15901590 func sendDeliveryReward (addr) = if ((i.caller != stakingContract))
15911591 then throw("Permission denied")
15921592 else {
15931593 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
15941594 let lockedTotal = valueOrElse(getInteger(deliveryLockedKey), 0)
15951595 $Tuple2([ScriptTransfer(addressFromStringValue(addr), MIN_USDT_FEE_DELIVERY, usdtAssetId), IntegerEntry(deliveryFundKey, (fundTotal - MIN_USDT_FEE_DELIVERY)), IntegerEntry(deliveryLockedKey, (lockedTotal - MIN_USDT_FEE_DELIVERY))], MIN_USDT_FEE_DELIVERY)
15961596 }
15971597
15981598

github/deemru/w8io/873ac7e 
242.75 ms