tx · DvVvyG9sqjPTU9da2MW29vLvDsT3PB8anjZd2Xqp6TnB

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.05700000 Waves

2023.09.30 16:12 [2778197] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "DvVvyG9sqjPTU9da2MW29vLvDsT3PB8anjZd2Xqp6TnB", "fee": 5700000, "feeAssetId": null, "timestamp": 1696079573949, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "3ujjDauWg18T277tswwJwgGtmvoCvvbZkuVo59n3TYwQyP7RTt6FqAZcyutTUVxE4K2Fbvy6aGbUb2hUeuSpPBtH" ], "script": "base64:BgKGAQgCEgQKAggYEgMKAQgSBAoCERESBAoCCAESAwoBARIFCgMREQgSBgoEEREICBIECgIRERIFCgMREQgSBgoEEREICBIDCgEREgMKARESBAoCEQgSBAoCAQESBAoCCAgSBQoDCAgIEgQKAggIEgUKAwgICBIDCgEREgMKAQgSAwoBARIDCgEIZgAHeHBUcmFkZQCQTgAHeHBDcmFmdACQTgAKeHBTZWxsVG9FcwCQTgAGeHBTaG9wAJBOAApMQU5EUFJFRklYAgRMQU5EAAZOVU1SRVMABgAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EAEFJFU09VUkNFUFJJQ0VNSU4A1bUCAA1FU01BWFBBQ0tBR0VTAAoACUVTQlVZQ09FRgAEABVNSU5fVVNEVF9GRUVfREVMSVZFUlkA0IYDABdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQD4yQQACHJlc1R5cGVzCQDMCAICA09pbAkAzAgCAgNPcmUJAMwIAgIEV29vZAkAzAgCAgRTYW5kCQDMCAICBENsYXkJAMwIAgIHT3JnYW5pYwUDbmlsAAhtYXRUeXBlcwkAzAgCAgRGdWVsCQDMCAICBU1ldGFsCQDMCAICBVBsYW5rCQDMCAICBUdsYXNzCQDMCAICB1BsYXN0aWMJAMwIAgIHUHJvdGVpbgUDbmlsAAlwcm9kVHlwZXMJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMQkAzAgCAhBGaXJzdCBBaWQgS2l0IEwyCQDMCAICEEZpcnN0IEFpZCBLaXQgTDMJAMwIAgILQmFja3BhY2sgTDEJAMwIAgILQmFja3BhY2sgTDIJAMwIAgILQmFja3BhY2sgTDMJAMwIAgIORm9vZCBSYXRpb24gTDEJAMwIAgIORm9vZCBSYXRpb24gTDIJAMwIAgIORm9vZCBSYXRpb24gTDMJAMwIAgILSmV0IFBhY2sgTDEJAMwIAgILSmV0IFBhY2sgTDIJAMwIAgILSmV0IFBhY2sgTDMJAMwIAgIJU2hpZWxkIEwxCQDMCAICCVNoaWVsZCBMMgkAzAgCAglTaGllbGQgTDMJAMwIAgIHTWluZSBMMQkAzAgCAgdNaW5lIEwyCQDMCAICB01pbmUgTDMJAMwIAgIHVHJhcCBMMQkAzAgCAgdUcmFwIEwyCQDMCAICB1RyYXAgTDMFA25pbAAKY29udGluZW50cwkAzAgCAghBbWVyaWNhcwkAzAgCAgZFdXJvcGUJAMwIAgIEQXNpYQkAzAgCAgZBZnJpY2EJAMwIAgIHT2NlYW5pYQUDbmlsAAlDT0VGRjJNQVQAgK3iBAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAiU4XzhfOF8xN18xN180Ml8xMl8wXzMwXzAsMCwwLDAsMCwwLDBfCQDMCAICJThfOF84XzE3XzE3XzQyXzI0XzBfNjBfMCwwLDUsMiwwLDAsMF8JAMwIAgInOF84XzhfMTdfMTdfNDJfMzZfMF8xMjBfMCwwLDEwLDQsMCwwLDBfCQDMCAICKThfMTlfMTlfOF8yN18xOV8yNl8xXzIwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV81Ml8xXzQwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV83OF8xXzgwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICJThfOF84XzhfOF82MF8xM18yXzJfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzI2XzJfNF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAiU4XzhfOF84XzhfNjBfMzlfMl84XzAsMCwwLDAsMCwwLDBfMDExCQDMCAICKTMwXzMwXzNfMTdfMTdfM18zMF8zXzMwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM182MF8zXzUwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM185MF8zXzcwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzExXzRfMTBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMjJfNF8yMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8zM180XzMwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKjRfMTNfMjJfNF8zNV8yMl8yM18wXzUwLDEsMF8wLDAsMCwwLDAsMCwwXwkAzAgCAio0XzEzXzIyXzRfMzVfMjJfNDZfMF81MCwxLDFfMCwyLDUsMCwwLDAsMF8JAMwIAgIrNF8xM18yMl80XzM1XzIyXzY5XzBfNTAsMiwxXzAsNSwxMCwwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfMjBfMV8zMCwxLDFfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzQwXzFfMzAsMSwyXzIsMSwzLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV82MF8xXzMwLDEsM181LDIsOCwwLDAsMCwwXwUDbmlsAAlySWR4Q29lZmYABgANcklkeENvbnRpbmVudAAHAApSRUNJUEVTSVpFAAsADlBST0RVQ1RQS0dTSVpFAAoAC3doSWR4TGV2ZWxzAAAACHdoSWR4UmVzAAEACHdoSWR4TWF0AAIACXdoSWR4UHJvZAADAAl3aElkeExPRlQABAAJdm9sTG9ja2VkAAAACHZvbFRvdGFsAAMACmJwSWR4TGV2ZWwAAAAIYnBJZHhSZXMAAQAIYnBJZHhNYXQAAgAJYnBJZHhQcm9kAAMAD2xvY0lkeENvbnRpbmVudAAAAApsb2NJZHhUeXBlAAEACGxvY0lkeElkAAIBFWtleUxhbmRBc3NldElkVG9Pd25lcgEHYXNzZXRJZAkArAICAgNub18FB2Fzc2V0SWQBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBB2Fzc2V0SWQJAKwCAgIDc3RfBQdhc3NldElkAQ9rZXlBZGRyZXNzUmVmQnkBBGFkZHIJAKwCAgIJYWNjUmVmQnlfBQRhZGRyARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyARFrZXlCYWNrcGFja0J5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIJYmFja1BhY2tfBQtkdWNrQXNzZXRJZAEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAEOa2V5T3JkZXJCeUxhbmQBC2xhbmRBc3NldElkCQCsAgICCmxhbmRPcmRlcl8FC2xhbmRBc3NldElkAQ5rZXlFc1dhcmVob3VzZQACGmVtZXJnZW5jeVdhcmVob3VzZVByb2R1Y3RzAA9kZWxpdmVyeUZ1bmRLZXkCDGRlbGl2ZXJ5RnVuZAARZGVsaXZlcnlMb2NrZWRLZXkCDmRlbGl2ZXJ5TG9ja2VkARJnZXRSZWNpcGVNYXRlcmlhbHMBBnJlY2lwZQkAaAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZyZWNpcGUFCXJJZHhDb2VmZgUJQ09FRkYyTUFUABFLU19BTExPV19ERUxJVkVSWQYABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDUAoI0GAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8ABk1VTFQxMACAyK+gJQAOTUlOU0hPUFBBWU1FTlQAoI0GAAVJVEVSNgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQAUSWR4Q2ZnSW52ZXN0RnVuZERhcHAABgAPSWR4Q2ZnQWNyZXNEYXBwAAgBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwAA1hY3Jlc0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUPSWR4Q2ZnQWNyZXNEYXBwAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQHbG93UGFydAkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cEBnplcm9lcwkAsAICCQCkAwEFBnRlblBvdwkAZAIAAQkAsQIBBQdsb3dQYXJ0CQCsAgIJAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgUGemVyb2VzBQdsb3dQYXJ0ABNGQUNUT1JZTUFYV0FSRUhPVVNFAIDIr6AlAA5TRUxMTVVMVElQTElFUgDIAQANQlVZTVVMVElQTElFUgCsAgAKQVVDVElPTkZFRQCQTgAMREVMSVZFUllfRkVFAJBOAA5ERUxJVkVSWV9GRUUxNQCYdQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAglmYWN0b3J5SWQHcmVzVHlwZQkArAICCQCsAgIJAKwCAgIbZmFjdG9yeVdoQnlDb250aW5lbnRBbmRSZXNfBQlmYWN0b3J5SWQCAV8JAKQDAQUHcmVzVHlwZQAJb3JkSWR4UmVzAAAACW9yZElkeE1hdAABAApvcmRJZHhQcm9kAAIBCGdldE9yZGVyAQZvcmRLZXkEAXAJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQZvcmRLZXkCMDBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOjBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOgIBOgkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCW9yZElkeFJlcwIBXwUGTlVNUkVTCQCRAwIFAXAFCW9yZElkeFJlcwIXMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQlvcmRJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQlvcmRJZHhNYXQCFzBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwCQDMCAIJAJEDAgUBcAUKb3JkSWR4UHJvZAUDbmlsAQh0b1ZvbHVtZQMGYW1vdW50B3BrZ1NpemUJaXNQcm9kdWN0AwUJaXNQcm9kdWN0BARwa2dzAwkAZwIFBmFtb3VudAAACQBpAgkAZQIJAGQCBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkBAS0BCQBpAgkAZQIJAGQCCQEBLQEFBmFtb3VudAUHcGtnU2l6ZQABBQdwa2dTaXplCQBoAgUEcGtncwUFTVVMVDgFBmFtb3VudAEMc2VsbEludGVybmFsBAVsb2NJZAdyZXNUeXBlBmFtb3VudAhtaW5QcmljZQQFd2hLZXkJAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCBQVsb2NJZAUHcmVzVHlwZQQCdzAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUFd2hLZXkAAAQCcjADCQBmAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UAAAMJAGYCCQBkAgUCdzAFBmFtb3VudAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAZQIFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFAncwBQZhbW91bnQEDHVzZHRSZWNlaXZlZAkAZAIJAGsDBQJyMAkAZQIJAGgCBQ5TRUxMTVVMVElQTElFUgUQUkVTT1VSQ0VQUklDRU1JTgkAawMJAGQCCQBoAgBkBQJ3MAkAaAIAMgUCcjAFEFJFU09VUkNFUFJJQ0VNSU4FE0ZBQ1RPUllNQVhXQVJFSE9VU0UFBk1VTFQxMAkAawMJAGUCBQZhbW91bnQFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAQFbWluOTkJAGUCBQhtaW5QcmljZQkAaQIFCG1pblByaWNlAGQDCQBmAgkAaAIFBW1pbjk5BQZhbW91bnQJAGgCBQx1c2R0UmVjZWl2ZWQFBU1VTFQ4CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BY3R1YWwgcHJpY2UgPSAJAKQDAQUMdXNkdFJlY2VpdmVkAgMgLyAJAKQDAQUGYW1vdW50Ag4gPCBtaW5QcmljZSA9IAkApAMBBQhtaW5QcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIcmVzVHlwZXMFB3Jlc1R5cGUCASkJAJQKAgkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBkAgUCdzAFBmFtb3VudAUMdXNkdFJlY2VpdmVkAQtidXlJbnRlcm5hbAQFbG9jSWQHbWF0VHlwZQZhbW91bnQIbWF4UHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB21hdFR5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAm0xAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFCQCXAwEJAMwIAgUGYW1vdW50CQDMCAIJAGUCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQUDbmlsAAAEAm0wCQCXAwEJAMwIAgUCdzAJAMwIAgkAZQIFBmFtb3VudAUCbTEFA25pbAQBbQkAZAIFAm0wBQJtMQQFdzBtaW4JAJcDAQkAzAgCBQJ3MAkAzAgCBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQNuaWwECXVzZHRTcGVudAkAZAIJAGsDBQJtMAkAZQIJAGgCBQ1CVVlNVUxUSVBMSUVSBRBSRVNPVVJDRVBSSUNFTUlOCQBrAwkAZQIJAGgCAGQFBXcwbWluCQBoAgAyBQJtMAUQUkVTT1VSQ0VQUklDRU1JTgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUGTVVMVDEwCQBrAwUCbTEJAGgCAAIFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4BAZtYXgxMDEJAGQCBQhtYXhQcmljZQkAaQIFCG1heFByaWNlAGQDCQBmAgkAaAIFCXVzZHRTcGVudAUFTVVMVDgJAGgCBQZtYXgxMDEFAW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0FjdHVhbCBwcmljZSA9IAkApAMBBQl1c2R0U3BlbnQCAyAvIAkApAMBBQFtAg4gPiBtYXhQcmljZSA9IAkApAMBBQhtYXhQcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIbWF0VHlwZXMFB21hdFR5cGUCASkJAJUKAwkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBlAgUCdzAFAW0FCXVzZHRTcGVudAUBbQELZ2V0QmFja3BhY2sBBWJwS2V5BAFwCQC8CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQVicEtleQIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToJAMwIAgkApAMBCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUBcAUKYnBJZHhMZXZlbAAACQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAXAFCWJwSWR4UHJvZAUDbmlsAQxjaGVja0Jsb2NrZWQAAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9zdGFraW5nQ29udHJhY3QJAQprZXlCbG9ja2VkAAcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlBQR1bml0AQZwcm9sb2cACQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIKc2F2ZUxhc3RUeAUDbmlsBQNuaWwBCXNldENvbW1vbgIDYWNjD2lnbm9yZWRJdGVyYXRvcgQBaggFA2FjYwJfMQQEaXRlbQMJAGYCCQCQAwEIBQNhY2MDXzEwBQFqCQCRAwIIBQNhY2MDXzEwBQFqAgMwQDAEBmlzUHJvZAgFA2FjYwJfOAQJaXRlbVBhcnRzCQC1CQIFBGl0ZW0CAUADCQECIT0CCQCQAwEFCWl0ZW1QYXJ0cwACCQACAQIuSW5jb3JyZWN0IG9yZGVyIGZvcm1hdCwgc2hvdWxkIGJlIGFtb3VudEBwcmljZQQIbmV3T3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAAQIbmV3T3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAQQJbmV3T3JkVXNkAwUGaXNQcm9kCQBoAgUIbmV3T3JkQW0FCG5ld09yZFByCQBrAwUIbmV3T3JkQW0FCG5ld09yZFByBQVNVUxUOAQJbmV3T3JkVm9sCQEIdG9Wb2x1bWUDBQhuZXdPcmRBbQUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAQGd2hJbml0AwkAZgIJAJADAQgFA2FjYwJfNgUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQNhY2MCXzYFAWoAAAQLY3VyT3JkUGFydHMJALUJAgMJAGYCCQCQAwEIBQNhY2MCXzcFAWoJAJEDAggFA2FjYwJfNwUBagIDMEAwAgFABAhjdXJPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAAECGN1ck9yZFByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULY3VyT3JkUGFydHMAAQMDCQBmAgAABQhjdXJPcmRQcgYJAGYCAAAFCG5ld09yZFByCQACAQIXUHJpY2UgY2FuJ3QgYmUgbmVnYXRpdmUECWN1ck9yZFVzZAMFBmlzUHJvZAkAaAIFCGN1ck9yZEFtBQhjdXJPcmRQcgkAawMFCGN1ck9yZEFtBQhjdXJPcmRQcgUFTVVMVDgDCQAAAgUIbmV3T3JkQW0AAAMJAGYCBQhjdXJPcmRBbQAACQCcCgoJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQZ3aEluaXQIBQNhY2MCXzMIBQNhY2MCXzQJAGUCCAUDYWNjAl81BQljdXJPcmRVc2QIBQNhY2MCXzYIBQNhY2MCXzcFBmlzUHJvZAkAZAIIBQNhY2MCXzkJAQh0b1ZvbHVtZQMFBndoSW5pdAUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAgFA2FjYwNfMTAJAJwKCgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQZ3aEluaXQFCGN1ck9yZEFtCAUDYWNjAl8zCAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAGQCCAUDYWNjAl85CQEIdG9Wb2x1bWUDCQBlAgUGd2hJbml0BQhjdXJPcmRBbQUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAgFA2FjYwNfMTADCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtCQCcCgoJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgUGd2hJbml0BQhjdXJPcmRBbQkAZAIIBQNhY2MCXzMFCW5ld09yZFZvbAgFA2FjYwJfNAkAZAIIBQNhY2MCXzUFCW5ld09yZFVzZAgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQEIdG9Wb2x1bWUDCQBlAgUGd2hJbml0BQhjdXJPcmRBbQUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAgFA2FjYwNfMTAJAJwKCgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEFBndoSW5pdAkAZAIIBQNhY2MCXzMFCW5ld09yZFZvbAgFA2FjYwJfNAkAZQIJAGQCCAUDYWNjAl81BQluZXdPcmRVc2QFCWN1ck9yZFVzZAgFA2FjYwJfNggFA2FjYwJfNwUGaXNQcm9kCQEIdG9Wb2x1bWUDBQZ3aEluaXQFDlBST0RVQ1RQS0dTSVpFBQZpc1Byb2QIBQNhY2MDXzEwAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQZ3aEluaXQFBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFBndoSW5pdAIKIGF2YWlsYWJsZQkAnAoKCQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFBndoSW5pdAUGYW1EaWZmCAUDYWNjAl8zCQBlAggFA2FjYwJfNAUJbmV3T3JkVm9sCAUDYWNjAl81CAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAQh0b1ZvbHVtZQMJAGUCBQZ3aEluaXQFBmFtRGlmZgUOUFJPRFVDVFBLR1NJWkUFBmlzUHJvZAgFA2FjYwNfMTADCQBmAgAACQBkAgUGd2hJbml0BQhuZXdPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBCQEBLQEFCG5ld09yZEFtAhogZnJvbSB3YXJlaG91c2UsIGJ1dCBvbmx5IAkApAMBBQZ3aEluaXQCCiBhdmFpbGFibGUJAJwKCgkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCBQZ3aEluaXQFCG5ld09yZEFtCAUDYWNjAl8zCQBlAggFA2FjYwJfNAUJbmV3T3JkVm9sCQBlAggFA2FjYwJfNQUJY3VyT3JkVXNkCAUDYWNjAl82CAUDYWNjAl83BQZpc1Byb2QJAQh0b1ZvbHVtZQMJAGQCBQZ3aEluaXQFCG5ld09yZEFtBQ5QUk9EVUNUUEtHU0laRQUGaXNQcm9kCAUDYWNjA18xMAELc2V0SW50ZXJuYWwDCWN1cnJlbnRXaApjdXJyZW50T3JkBm5ld09yZAQJY3VycldoUmVzCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQJY3VycldoTWF0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQKY3VycldoUHJvZAMJAAACCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgFfBA1jdXJyZW50T3JkUmVzCQC1CQIJAJEDAgUKY3VycmVudE9yZAUJb3JkSWR4UmVzAgFfBA1jdXJyZW50T3JkTWF0CQC1CQIJAJEDAgUKY3VycmVudE9yZAUJb3JkSWR4TWF0AgFfBA5jdXJyZW50T3JkUHJvZAMJAAACCQCRAwIFCmN1cnJlbnRPcmQFCm9yZElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgUKY3VycmVudE9yZAUKb3JkSWR4UHJvZAIBXwMJAQIhPQIJAJADAQUGbmV3T3JkAAMJAAIBAjNuZXdPcmRlclN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECHJlc1BhcnRzCQC1CQIJAJEDAgUGbmV3T3JkAAACAV8ECG1hdFBhcnRzCQC1CQIJAJEDAgUGbmV3T3JkAAECAV8ECXByb2RQYXJ0cwMJAAACCQCRAwIFBm5ld09yZAACAgAFA25pbAkAvAkCCQCRAwIFBm5ld09yZAACAgFfAwkBAiE9AgkAkAMBBQhyZXNQYXJ0cwUGTlVNUkVTCQACAQIgQWxsIDYgcmVzb3VyY2VzIHNob3VsZCBiZSBwYXNzZWQDCQECIT0CCQCQAwEFCG1hdFBhcnRzBQZOVU1SRVMJAAIBAiBBbGwgNiBtYXRlcmlhbHMgc2hvdWxkIGJlIHBhc3NlZAQBcgoAAiRsBQhyZXNUeXBlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJwKCgAABQNuaWwAAAAAAAAFCWN1cnJXaFJlcwUNY3VycmVudE9yZFJlcwcAAAUIcmVzUGFydHMKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCXNldENvbW1v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AS0BBQd3aE9yZEFtCQCfCg0JAM0IAggFA2FjYwJfMQkApAMBBQZ3aEluaXQJAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQZicEluaXQFB2JwT3JkQW0JAGQCCAUDYWNjAl80BQhkZWx0YVZvbAgFA2FjYwJfNQkAZAIIBQNhY2MCXzYFCGJwT3JkVXNkCQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAkAZAIIBQNhY2MDXzEzAwUGaXNQcm9kCQBoAgUHYnBPcmRBbQUFTVVMVDgFB2JwT3JkQW0JAAIBCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCRAwIIBQNhY2MDXzExBQFqAiAgd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3Qgc2VsbCBpdAMJAGYCBQd3aE9yZEFtAAADCQBmAgkBAS0BBQdicE9yZEFtBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAgQgb2YgCQCRAwIIBQNhY2MDXzExBQFqAhosIGJ1dCB3YXJlaG91c2Ugb25seSBidXlzIAkApAMBBQd3aE9yZEFtAwkAZgIJAQEtAQUHYnBPcmRBbQUGYnBJbml0CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAhQsIGJ1dCB5b3Ugb25seSBoYXZlIAkApAMBBQZicEluaXQCBCBvZiAJAJEDAggFA2FjYwNfMTEFAWoJAJ8KDQkAzQgCCAUDYWNjAl8xCQCkAwEJAGUCBQZ3aEluaXQFB2JwT3JkQW0JAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQZicEluaXQFB2JwT3JkQW0JAGUCCAUDYWNjAl80BQhkZWx0YVZvbAkAZQIIBQNhY2MCXzUFCGJwT3JkVXNkCAUDYWNjAl82CQBkAggFA2FjYwJfNwABCAUDYWNjAl84CAUDYWNjAl85CAUDYWNjA18xMAgFA2FjYwNfMTEFBmlzUHJvZAkAZQIIBQNhY2MDXzEzAwUGaXNQcm9kCQBoAgUHYnBPcmRBbQUFTVVMVDgFB2JwT3JkQW0JAAIBCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkAkQMCCAUDYWNjA18xMQUBagIfIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IGJ1eSBpdAETc2VsbFJlc291cmNlc0NvbW1vbgQHcmVzTGlzdAxmYWN0b3J5TG9jSWQHYW1vdW50cwltaW5QcmljZXMKAQVhZGRlcgIDYWNjAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVzTGlzdAUBagkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglZb3UgaGF2ZSAJAJEDAgUHcmVzTGlzdAUBagIEIG9mIAkAkQMCBQhyZXNUeXBlcwUBagIULCBidXQgdHJpZWQgdG8gc2VsbCAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIAAAkAkQMCBQdhbW91bnRzBQFqCQACAQkArAICCQCsAgIJAKwCAgIlWW91IHRyaWVkIHRvIHNlbGwgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhyZXNUeXBlcwUBagICOiAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagAABAFiCQEMc2VsbEludGVybmFsBAUMZmFjdG9yeUxvY0lkBQFqCQCRAwIFB2Ftb3VudHMFAWoJAJEDAgUJbWluUHJpY2VzBQFqCQCWCgQJAM0IAggFA2FjYwJfMQgFAWICXzEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAJEDAgUHYW1vdW50cwUBagkAZAIIBQNhY2MCXzMIBQFiAl8yCQBkAggFA2FjYwJfNAkAkQMCBQdhbW91bnRzBQFqCQCWCgQIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdy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AQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYBEHNob3AydXNlckFjdGlvbnMDDXVzZFdoMkJwU2FsZG8KY2FsbGVyQWRkcgtyZWNlaXZlZEZlZQMJAGYCBQ11c2RXaDJCcFNhbGRvAAAEC3VzZFdoMkJwRmVlCQBrAwUNdXNkV2gyQnBTYWxkbwUKQVVDVElPTkZFRQUFTVVMVDYDCQBnAgULcmVjZWl2ZWRGZWUJAGUCBQ11c2RXaDJCcFNhbGRvCQBoAgADBQt1c2RXaDJCcEZlZQkAAgEJAKwCAgIrVGhpcyB0cmFkZSBkb2VzIG5vdCBjb3ZlciBkZWxpdmVyeSBjb3N0IG9mIAkBCmZpeGVkUG9pbnQCBQtyZWNlaXZlZEZlZQAGBAhyZWZCeUtleQkBD2tleUFkZHJlc3NSZWZCeQEFCmNhbGxlckFkZHIEBXJlZkJ5CQCdCAIFD3N0YWtpbmdDb250cmFjdAUIcmVmQnlLZXkEBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUKY2FsbGVyQWRkcgkAzQgCCQDNCAIDCQEJaXNEZWZpbmVkAQUFcmVmQnkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFcmVmQnkFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAZQIJAGUCBQ11c2RXaDJCcFNhbGRvCQBoAgADBQt1c2RXaDJCcEZlZQULcmVjZWl2ZWRGZWUFC3VzZHRBc3NldElkCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFC3VzZFdoMkJwRmVlBQt1c2R0QXNzZXRJZAUDbmlsARB1c2VyMnNob3BBY3Rpb25zBA11c2RCcDJXaFNhbGRvBHBtdHMNc2hvcExhbmRPd25lcghzcGVudEZlZQMJAGYCBQ11c2RCcDJXaFNhbGRvAAADCQECIT0CCQCQAwEFBHBtdHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCBQRwbXRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEEHVzZHRTcGVudFdpdGhGZWUJAGQCBQ11c2RCcDJXaFNhbGRvBQhzcGVudEZlZQMJAQIhPQIFA2FtdAUQdXNkdFNwZW50V2l0aEZlZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAQpmaXhlZFBvaW50AgUDYW10AAYCCywgcmVxdWlyZWQ9CQEKZml4ZWRQb2ludAIFDXVzZEJwMldoU2FsZG8ABgIBKwkBCmZpeGVkUG9pbnQCBQhzcGVudEZlZQAGAg4oZGVsaXZlcnkgZmVlKQMJAGYCBQ5NSU5TSE9QUEFZTUVOVAUNdXNkQnAyV2hTYWxkbwkAAgEJAKwCAgISTWluIHNob3AgdHJhZGUgaXMgCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYEC3VzZEJwMldoRmVlCQBrAwUNdXNkQnAyV2hTYWxkbwUKQVVDVElPTkZFRQUFTVVMVDYECHJlZkJ5S2V5CQEPa2V5QWRkcmVzc1JlZkJ5AQUNc2hvcExhbmRPd25lcgQFcmVmQnkJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQhyZWZCeUtleQkAzQgCCQDNCAIDCQEJaXNEZWZpbmVkAQUFcmVmQnkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFcmVmQnkFC3VzZEJwMldoRmVlBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDXNob3BMYW5kT3duZXIJAGUCBQ11c2RCcDJXaFNhbGRvCQBoAgADBQt1c2RCcDJXaEZlZQULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAULdXNkQnAyV2hGZWUFC3VzZHRBc3NldElkAwkBAiE9AgkAkAMBBQRwbXRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQFA25pbAEVYWNjZXB0U2hvcE9yZGVyQ29tbW9uBg9zaG9wTGFuZEFzc2V0SWQKY2FsbGVyQWRkcgpicE9yZGVyU3RyCWJwUmVzTGlzdAlicE1hdExpc3QKYnBQcm9kTGlzdAQJbGFuZEFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUPc2hvcExhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUPc2hvcExhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQlsYW5kQXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEDXNob3BMYW5kT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQ9zaG9wTGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUJbGFuZEFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAAACBQ1zaG9wTGFuZE93bmVyBQpjYWxsZXJBZGRyCQACAQIeWW91IGNhbm5vdCB0cmFkZSB3aXRoIHlvdXJzZWxmBAxicE9yZGVyUGFydHMJALwJAgUKYnBPcmRlclN0cgIBOgMJAQIhPQIJAJADAQUMYnBPcmRlclBhcnRzAAMJAAIBAjJicE9yZGVyU3RyIHNob3VsZCBjb250YWluIGV4YWN0bHkgMiAnOicgc2VwYXJhdG9ycwQIYnBPcmRSZXMJALUJAgkAkQMCBQxicE9yZGVyUGFydHMAAAIBXwQIYnBPcmRNYXQJALUJAgkAkQMCBQxicE9yZGVyUGFydHMAAQIBXwQJYnBPcmRQcm9kAwkAAAIJAJEDAgUMYnBPcmRlclBhcnRzAAICAAUDbmlsCQC8CQIJAJEDAgUMYnBPcmRlclBhcnRzAAICAV8DCQECIT0CCQCQAwEFCGJwT3JkUmVzBQZOVU1SRVMJAAIBAiBBbGwgNiByZXNvdXJjZXMgc2hvdWxkIGJlIHBhc3NlZAMJAQIhPQIJAJADAQUIYnBPcmRNYXQFBk5VTVJFUwkAAgECIEFsbCA2IG1hdGVyaWFscyBzaG91bGQgYmUgcGFzc2VkBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFD3Nob3BMYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQJY3VycldoUmVzCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQJY3VycldoTWF0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQKY3VycldoUHJvZAMJAAACCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgFfBA9jdXJyV2hMb2NrZWRWb2wJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQCAV8FCXZvbExvY2tlZAQGb3JkS2V5CQEOa2V5T3JkZXJCeUxhbmQBBQ9zaG9wTGFuZEFzc2V0SWQEBXdoT3JkCQEIZ2V0T3JkZXIBBQZvcmRLZXkECHdoT3JkUmVzCQC1CQIJAJEDAgUFd2hPcmQFCW9yZElkeFJlcwIBXwQId2hPcmRNYXQJALUJAgkAkQMCBQV3aE9yZAUJb3JkSWR4TWF0AgFfBAl3aE9yZFByb2QDCQAAAgkAkQMCBQV3aE9yZAUKb3JkSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQV3aE9yZAUKb3JkSWR4UHJvZAIBXwQBcgoAAiRsBQhicE9yZFJlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJ8KDQUDbmlsBQNuaWwFA25pbAAAAAAAAAAABQlicFJlc0xpc3QFCWN1cnJXaFJlcwUId2hPcmRSZXMFCHJlc1R5cGVzBwAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxhY2NlcHRDb21tb24CBQIkYQkAkQMCBQIkbAUC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ZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag1zYXZlV2FyZWhvdXNlCQDMCAIFBXdoU3RyCQDMCAIFD3Nob3BMYW5kQXNzZXRJZAUDbmlsBQNuaWwEDmFjY1N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUNc2hvcExhbmRPd25lcgkAzAgCCQBrAwUGeHBTaG9wCAUBcANfMTMFBU1VTFQ4BQNuaWwFA25pbAkAnAoKCQELU3RyaW5nRW50cnkCBQZvcmRLZXkFC25ld1doT3JkU3RyCAUBcgJfMwgFAW0CXzMIBQFwAl8zCAUBcAJfNQgFAXACXzYIBQFwA18xMwUNc2hvcExhbmRPd25lcgUGd2hTYXZlBQ5hY2NTdGF0c1Jlc3VsdAEac2VsbFJlc291cmNlc1dvcmxkSW50ZXJuYWwBBmFtb3VudAQGb25lUmVzCQBpAgUGYW1vdW50AB4EEW9uZUZhY3RvcnlBbW91bnRzCQDMCAIFBm9uZVJlcwkAzAgCBQZvbmVSZXMJAMwIAgUGb25lUmVzCQDMCAIFBm9uZVJlcwkAzAgCBQZvbmVSZXMJAMwIAgUGb25lUmVzBQNuaWwEAXMJAKQDAQUGb25lUmVzBAdyZXNMaXN0CQDMCAIFAXMJAMwIAgUBcwkAzAgCBQFzCQDMCAIFAXMJAMwIAgUBcwkAzAgCBQFzBQNuaWwECW1pblByaWNlcwkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAUDbmlsCgEKb25lRmFjdG9yeQIDYWNjCWNvbnRpbmVudAQBeAkBE3NlbGxSZXNvdXJjZXNDb21tb24EBQdyZXNMaXN0BQljb250aW5lbnQFEW9uZUZhY3RvcnlBbW91bnRzBQltaW5QcmljZXMJAJUKAwkAzggCCAUDYWNjAl8xCAUBeAJfMQkAZAIIBQNhY2MCXzIIBQF4Al8zCQBkAggFA2FjYwJfMwgFAXgCXzQEDSR0MDI1MjYxMjUzNTEKAAIkbAUKY29udGluZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKb25lRmFjdG9yeQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMjUyNjEyNTM1MQJfMQQMdXNkdFJlY2VpdmVkCAUNJHQwMjUyNjEyNTM1MQJfMgQIdG90YWxSZXMIBQ0kdDAyNTI2MTI1MzUxAl8zBANmZWUJAGsDBQx1c2R0UmVjZWl2ZWQFDERFTElWRVJZX0ZFRQUFTVVMVDYEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQx1c2R0UmVjZWl2ZWQAZAQIdXNkdExlZnQJAGUCCQBlAgUMdXNkdFJlY2VpdmVkBRBhY3Rpdml0aWVzQW1vdW50BQNmZWUJAJcKBQUOZmFjdG9yeUFjdGlvbnMFCHVzZHRMZWZ0BQNmZWUFEGFjdGl2aXRpZXNBbW91bnQFCHRvdGFsUmVzFgFpARpyZWNhbGNMb2NrZWRWb2x1bWVSRUFET05MWQILbGFuZEFzc2V0SWQCd2gECmN1cnJlbnRPcmQJAQhnZXRPcmRlcgEJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBAF6CQELc2V0SW50ZXJuYWwDBQJ3aAUKY3VycmVudE9yZAUKY3VycmVudE9yZAkAlAoCBQNuaWwJAGQCCAUBegJfNAgFAXoCXzUBaQENY29uc3RydWN0b3JWMQEIcmVzdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgUDbmlsAWkBDXNlbGxSZXNvdXJjZXMCB2Ftb3VudHMJbWluUHJpY2VzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAipzZWxsUmVzb3VyY2VzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBA0kdDAyNjgwMzI2OTI5CQETc2VsbFJlc291cmNlc0NvbW1vbgQFB3Jlc0xpc3QJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBQdhbW91bnRzBQltaW5QcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMjY4MDMyNjkyOQJfMQQGbmV3UmVzCAUNJHQwMjY4MDMyNjkyOQJfMgQMdXNkdFJlY2VpdmVkCAUNJHQwMjY4MDMyNjkyOQJfMwQIdG90YWxSZXMIBQ0kdDAyNjgwMzI2OTI5Al80BBBhY3Rpdml0aWVzQW1vdW50CQBpAgUMdXNkdFJlY2VpdmVkAGQEB25ld1BhY2sJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAgUGbmV3UmVzAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxSZXMFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM0IAgUOZmFjdG9yeUFjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAJUKAwUOYmFja3BhY2tSZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQESc2VsbFJlc291cmNlc1dvcmxkAgRhZGRyBmFtb3VudAMJAQIhPQIIBQFpBmNhbGxlcgUNYWNyZXNDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA0kdDAyNzcyMTI3ODc4CQEac2VsbFJlc291cmNlc1dvcmxkSW50ZXJuYWwBBQZhbW91bnQEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMjc3MjEyNzg3OAJfMQQIdXNkdExlZnQIBQ0kdDAyNzcyMTI3ODc4Al8yBANmZWUIBQ0kdDAyNzcyMTI3ODc4Al8zBBBhY3Rpdml0aWVzQW1vdW50CAUNJHQwMjc3MjEyNzg3OAJfNAQIdG90YWxSZXMIBQ0kdDAyNzcyMTI3ODc4Al81AwkAZwIAAAUIdXNkdExlZnQJAAIBCQCsAgICK1RoaXMgdHJhZGUgZG9lcyBub3QgY292ZXIgZGVsaXZlcnkgY29zdCBvZiAJAQpmaXhlZFBvaW50AgUDZmVlAAYEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUEYWRkcgkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxSZXMFBU1VTFQ4BQNuaWwFA25pbAkAlAoCCQDNCAIJAM0IAgkAzQgCBQ5mYWN0b3J5QWN0aW9ucwkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAFA2ZlZQkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkBDlNjcmlwdFRyYW5zZmVyAwUSaW52ZXN0RnVuZENvbnRyYWN0BQh1c2R0TGVmdAULdXNkdEFzc2V0SWQJAJQKAgUIdXNkdExlZnQFC3N0YXRzUmVzdWx0AWkBGnNlbGxSZXNvdXJjZXNXb3JsZFJFQURPTkxZAQZhbW91bnQECHVzZHRMZWZ0CAkBGnNlbGxSZXNvdXJjZXNXb3JsZEludGVybmFsAQUGYW1vdW50Al8yCQCUCgIFA25pbAUIdXNkdExlZnQBaQEZc2VsbFJlc291cmNlc0R1Y2tEZWxpdmVyeQMHYW1vdW50cwltaW5QcmljZXMQZmFjdG9yeUNvbnRpbmVudAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAipzZWxsUmVzb3VyY2VzIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQNJHQwMjkxMTEyOTIzMgkBE3NlbGxSZXNvdXJjZXNDb21tb24EBQdyZXNMaXN0BRBmYWN0b3J5Q29udGluZW50BQdhbW91bnRzBQltaW5QcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMjkxMTEyOTIzMgJfMQQGbmV3UmVzCAUNJHQwMjkxMTEyOTIzMgJfMgQMdXNkdFJlY2VpdmVkCAUNJHQwMjkxMTEyOTIzMgJfMwQIdG90YWxSZXMIBQ0kdDAyOTExMTI5MjMyAl80BAduZXdQYWNrCQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIFBm5ld1JlcwIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQOYmFja3BhY2tSZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwVHJhZGUFCHRvdGFsUmVzBQVNVUxUOAUDbmlsBQNuaWwEB2ZlZVBhcnQJAGsDBQx1c2R0UmVjZWl2ZWQFDERFTElWRVJZX0ZFRQUFTVVMVDYEA2ZlZQMJAGYCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFB2ZlZVBhcnQFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUHZmVlUGFydAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFDHVzZHRSZWNlaXZlZABkAwkAZwIFA2ZlZQkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAkAAgEJAKwCAgIrVGhpcyB0cmFkZSBkb2VzIG5vdCBjb3ZlciBkZWxpdmVyeSBjb3N0IG9mIAkBCmZpeGVkUG9pbnQCBQNmZWUABgQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAACQCUCgIJAM0IAgkAzQgCCQDNCAIFDmZhY3RvcnlBY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCCQBlAgUMdXNkdFJlY2VpdmVkBRBhY3Rpdml0aWVzQW1vdW50BQNmZWUFC3VzZHRBc3NldElkCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBkAgUJZnVuZFRvdGFsBQNmZWUJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAJUKAwUOYmFja3BhY2tSZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQEZc2VsbFJlc291cmNlc0xhbmREZWxpdmVyeQQHYW1vdW50cwltaW5QcmljZXMLbGFuZEFzc2V0SWQQZmFjdG9yeUNvbnRpbmVudAMJAQEhAQURS1NfQUxMT1dfREVMSVZFUlkJAAIBAh9EZWxpdmVyeSBmZWF0dXJlIGlzIHR1cm5lZCBvZmYhBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAR1c2VyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQHcmVzTGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8EDSR0MDMxMjU5MzEzODAJARNzZWxsUmVzb3VyY2VzQ29tbW9uBAUHcmVzTGlzdAUQZmFjdG9yeUNvbnRpbmVudAUHYW1vdW50cwUJbWluUHJpY2VzBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDMxMjU5MzEzODACXzEEBm5ld1JlcwgFDSR0MDMxMjU5MzEzODACXzIEDHVzZHRSZWNlaXZlZAgFDSR0MDMxMjU5MzEzODACXzMECHRvdGFsUmVzCAUNJHQwMzEyNTkzMTM4MAJfNAQFd2hTdHIJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgkAuQkCBQZuZXdSZXMCAV8JAMwIAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0CQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QJAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAUDbmlsAgE6BAZ3aFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag1zYXZlV2FyZWhvdXNlCQDMCAIFBXdoU3RyCQDMCAIFC2xhbmRBc3NldElkBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVBY2NTdGF0cwkAzAgCBQRhZGRyCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbFJlcwUFTVVMVDgFA25pbAUDbmlsBAdmZWVQYXJ0CQBrAwUMdXNkdFJlY2VpdmVkBQxERUxJVkVSWV9GRUUFBU1VTFQ2BANmZWUDCQBmAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQdmZWVQYXJ0BRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFB2ZlZVBhcnQEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQx1c2R0UmVjZWl2ZWQAZAMJAGcCBQNmZWUJAGUCBQx1c2R0UmVjZWl2ZWQFEGFjdGl2aXRpZXNBbW91bnQJAAIBCQCsAgICK1RoaXMgdHJhZGUgZG9lcyBub3QgY292ZXIgZGVsaXZlcnkgY29zdCBvZiAJAQpmaXhlZFBvaW50AgUDZmVlAAYECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9kZWxpdmVyeUZ1bmRLZXkAAAkAlAoCCQDNCAIJAM0IAgkAzQgCBQ5mYWN0b3J5QWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgkAZQIFDHVzZHRSZWNlaXZlZAUQYWN0aXZpdGllc0Ftb3VudAUDZmVlBQt1c2R0QXNzZXRJZAkBDEludGVnZXJFbnRyeQIFD2RlbGl2ZXJ5RnVuZEtleQkAZAIFCWZ1bmRUb3RhbAUDZmVlCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQCVCgMFBndoU2F2ZQUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpAQxidXlNYXRlcmlhbHMCB2Ftb3VudHMJbWF4UHJpY2VzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8EDSR0MDMzMjQwMzMzNjIJARJidXlNYXRlcmlhbHNDb21tb24EBQdtYXRMaXN0CQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAUHYW1vdW50cwUJbWF4UHJpY2VzBA5mYWN0b3J5QWN0aW9ucwgFDSR0MDMzMjQwMzMzNjICXzEEBm5ld01hdAgFDSR0MDMzMjQwMzMzNjICXzIECXVzZHRTcGVudAgFDSR0MDMzMjQwMzMzNjICXzMECHRvdGFsTWF0CAUNJHQwMzMyNDAzMzM2MgJfNAMJAGYCBQl1c2R0U3BlbnQFA2FtdAkAAgEJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAQpmaXhlZFBvaW50AgUDYW10AAYCCywgcmVxdWlyZWQ9CQEKZml4ZWRQb2ludAIFCXVzZHRTcGVudAAGBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQC5CQIFBm5ld01hdAIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQOYmFja3BhY2tSZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10BQl1c2R0U3BlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFCXVzZHRTcGVudAULdXNkdEFzc2V0SWQFA25pbAUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAgUJdXNkdFNwZW50AGQEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlBQh0b3RhbE1hdAUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM0IAgkAzggCBQ5mYWN0b3J5QWN0aW9ucwUEcmVzdAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpARhidXlNYXRlcmlhbHNEdWNrRGVsaXZlcnkDB2Ftb3VudHMJbWF4UHJpY2VzEGZhY3RvcnlDb250aW5lbnQDCQEBIQEFEUtTX0FMTE9XX0RFTElWRVJZCQACAQIfRGVsaXZlcnkgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQNJHQwMzQ4ODAzNDk5NwkBEmJ1eU1hdGVyaWFsc0NvbW1vbgQFB21hdExpc3QFEGZhY3RvcnlDb250aW5lbnQFB2Ftb3VudHMFCW1heFByaWNlcwQOZmFjdG9yeUFjdGlvbnMIBQ0kdDAzNDg4MDM0OTk3Al8xBAZuZXdNYXQIBQ0kdDAzNDg4MDM0OTk3Al8yBAl1c2R0U3BlbnQIBQ0kdDAzNDg4MDM0OTk3Al8zBAh0b3RhbE1hdAgFDSR0MDM0ODgwMzQ5OTcCXzQEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQUIdG90YWxNYXQFBU1VTFQ4BQNuaWwFA25pbAQHZmVlUGFydAkAawMFCXVzZHRTcGVudAUMREVMSVZFUllfRkVFBQVNVUxUNgQDZmVlAwkAZgIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUHZmVlUGFydAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQdmZWVQYXJ0BBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUJdXNkdFNwZW50BQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM4IAgUOZmFjdG9yeUFjdGlvbnMFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpARhidXlNYXRlcmlhbHNMYW5kRGVsaXZlcnkEB2Ftb3VudHMJbWF4UHJpY2VzC2xhbmRBc3NldElkEGZhY3RvcnlDb250aW5lbnQDCQEBIQEFEUtTX0FMTE9XX0RFTElWRVJZCQACAQIfRGVsaXZlcnkgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAR1c2VyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQHbWF0TGlzdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8EDSR0MDM3Mjc1MzczOTIJARJidXlNYXRlcmlhbHNDb21tb24EBQdtYXRMaXN0BRBmYWN0b3J5Q29udGluZW50BQdhbW91bnRzBQltYXhQcmljZXMEDmZhY3RvcnlBY3Rpb25zCAUNJHQwMzcyNzUzNzM5MgJfMQQGbmV3TWF0CAUNJHQwMzcyNzUzNzM5MgJfMgQJdXNkdFNwZW50CAUNJHQwMzcyNzUzNzM5MgJfMwQIdG90YWxNYXQIBQ0kdDAzNzI3NTM3MzkyAl80BAV3aFN0cgkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMJAMwIAgkAuQkCBQZuZXdNYXQCAV8JAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUFjY1N0YXRzCQDMCAIFBGFkZHIJAMwIAgkAawMFB3hwVHJhZGUFCHRvdGFsTWF0BQVNVUxUOAUDbmlsBQNuaWwEB2ZlZVBhcnQJAGsDBQl1c2R0U3BlbnQFDERFTElWRVJZX0ZFRQUFTVVMVDYEA2ZlZQMJAGYCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFB2ZlZVBhcnQFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUHZmVlUGFydAQQdXNkdFNwZW50V2l0aEZlZQkAZAIFCXVzZHRTcGVudAUDZmVlAwkAZgIFEHVzZHRTcGVudFdpdGhGZWUFA2FtdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAQpmaXhlZFBvaW50AgUDYW10AAYCCywgcmVxdWlyZWQ9CQEKZml4ZWRQb2ludAIFCXVzZHRTcGVudAAGAgErCQEKZml4ZWRQb2ludAIFA2ZlZQAGAg4oZGVsaXZlcnkgZmVlKQQEcmVzdAMJAGYCCQBlAgUDYW10BRB1c2R0U3BlbnRXaXRoRmVlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10BRB1c2R0U3BlbnRXaXRoRmVlBQt1c2R0QXNzZXRJZAUDbmlsBQNuaWwEEGFjdGl2aXRpZXNBbW91bnQJAGkCBQl1c2R0U3BlbnQAZAQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAACQCUCgIJAM0IAgkAzQgCCQDOCAIFDmZhY3RvcnlBY3Rpb25zBQRyZXN0CQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBkAgUJZnVuZFRvdGFsBQNmZWUJAJUKAwUGd2hTYXZlBQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBEWV4Y2hhbmdlUmVzb3VyY2VzAQdhbW91bnRzBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB3Jlc0xpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8EB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8EDSR0MDM5NTA2Mzk2MTIJARdleGNoYW5nZVJlc291cmNlc0NvbW1vbgMFB3Jlc0xpc3QFB21hdExpc3QFB2Ftb3VudHMEBm5ld1JlcwgFDSR0MDM5NTA2Mzk2MTICXzEEBm5ld01hdAgFDSR0MDM5NTA2Mzk2MTICXzIECXVzZHRTcGVudAgFDSR0MDM5NTA2Mzk2MTICXzMEFHRvdGFsQW1vdW50Q29udmVydGVkCAUNJHQwMzk1MDYzOTYxMgJfNAMJAGYCBQl1c2R0U3BlbnQFA2FtdAkAAgEJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAQpmaXhlZFBvaW50AgUDYW10AAYCCywgcmVxdWlyZWQ9CQEKZml4ZWRQb2ludAIFCXVzZHRTcGVudAAGBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIFBm5ld1JlcwIBXwkAzAgCCQC5CQIFBm5ld01hdAIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQOYmFja3BhY2tSZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10BQl1c2R0U3BlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFCXVzZHRTcGVudAULdXNkdEFzc2V0SWQFA25pbAUDbmlsBBBhY3Rpdml0aWVzQW1vdW50CQBpAgUJdXNkdFNwZW50AGQEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQd4cFRyYWRlBRR0b3RhbEFtb3VudENvbnZlcnRlZAUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM0IAgUEcmVzdAkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BRBhY3Rpdml0aWVzQW1vdW50BQt1c2R0QXNzZXRJZAkAlQoDBQ5iYWNrcGFja1Jlc3VsdAUMcHJvbG9nUmVzdWx0BQtzdGF0c1Jlc3VsdAFpAR1leGNoYW5nZVJlc291cmNlc0R1Y2tEZWxpdmVyeQEHYW1vdW50cwQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQNJHQwNDEwNDc0MTE1MwkBF2V4Y2hhbmdlUmVzb3VyY2VzQ29tbW9uAwUHcmVzTGlzdAUHbWF0TGlzdAUHYW1vdW50cwQGbmV3UmVzCAUNJHQwNDEwNDc0MTE1MwJfMQQGbmV3TWF0CAUNJHQwNDEwNDc0MTE1MwJfMgQJdXNkdFNwZW50CAUNJHQwNDEwNDc0MTE1MwJfMwQUdG90YWxBbW91bnRDb252ZXJ0ZWQIBQ0kdDA0MTA0NzQxMTUzAl80BAdmZWVQYXJ0CQBrAwUJdXNkdFNwZW50BQ5ERUxJVkVSWV9GRUUxNQUFTVVMVDYEA2ZlZQMJAGYCBRdNSU5fVVNEVF9GRUVfREVMSVZFUlkxNQUHZmVlUGFydAUXTUlOX1VTRFRfRkVFX0RFTElWRVJZMTUFB2ZlZVBhcnQEEHVzZHRTcGVudFdpdGhGZWUJAGQCBQl1c2R0U3BlbnQFA2ZlZQMJAGYCBRB1c2R0U3BlbnRXaXRoRmVlBQNhbXQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQEKZml4ZWRQb2ludAIFA2FtdAAGAgssIHJlcXVpcmVkPQkBCmZpeGVkUG9pbnQCBQl1c2R0U3BlbnQABgIBKwkBCmZpeGVkUG9pbnQCBQNmZWUABgIOKGRlbGl2ZXJ5IGZlZSkEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAgUGbmV3UmVzAgFfCQDMCAIJALkJAgUGbmV3TWF0AgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BA5iYWNrcGFja1Jlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUHeHBUcmFkZQUUdG90YWxBbW91bnRDb252ZXJ0ZWQFBU1VTFQ4BQNuaWwFA25pbAQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAACQCUCgIJAM0IAgkAzQgCBQRyZXN0CQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFEGFjdGl2aXRpZXNBbW91bnQFC3VzZHRBc3NldElkCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBkAgUJZnVuZFRvdGFsBQNmZWUJAJUKAwUOYmFja3BhY2tSZXN1bHQFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQEdZXhjaGFuZ2VSZXNvdXJjZXNMYW5kRGVsaXZlcnkCB2Ftb3VudHMLbGFuZEFzc2V0SWQEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQEdXNlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBHVzZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToEB3Jlc0xpc3QJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAdtYXRMaXN0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQNJHQwNDMzNzY0MzQ4MgkBF2V4Y2hhbmdlUmVzb3VyY2VzQ29tbW9uAwUHcmVzTGlzdAUHbWF0TGlzdAUHYW1vdW50cwQGbmV3UmVzCAUNJHQwNDMzNzY0MzQ4MgJfMQQGbmV3TWF0CAUNJHQwNDMzNzY0MzQ4MgJfMgQJdXNkdFNwZW50CAUNJHQwNDMzNzY0MzQ4MgJfMwQUdG90YWxBbW91bnRDb252ZXJ0ZWQIBQ0kdDA0MzM3NjQzNDgyAl80BAV3aFN0cgkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCQC5CQIFBm5ld1JlcwIBXwkAzAgCCQC5CQIFBm5ld01hdAIBXwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kCQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQFA25pbAIBOgQGd2hTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAINc2F2ZVdhcmVob3VzZQkAzAgCBQV3aFN0cgkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUEYWRkcgkAzAgCCQBrAwUHeHBUcmFkZQUUdG90YWxBbW91bnRDb252ZXJ0ZWQFBU1VTFQ4BQNuaWwFA25pbAQHZmVlUGFydAkAawMFCXVzZHRTcGVudAUOREVMSVZFUllfRkVFMTUFBU1VTFQ2BANmZWUDCQBmAgUXTUlOX1VTRFRfRkVFX0RFTElWRVJZMTUFB2ZlZVBhcnQFF01JTl9VU0RUX0ZFRV9ERUxJVkVSWTE1BQdmZWVQYXJ0BBB1c2R0U3BlbnRXaXRoRmVlCQBkAgUJdXNkdFNwZW50BQNmZWUDCQBmAgUQdXNkdFNwZW50V2l0aEZlZQUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkBCmZpeGVkUG9pbnQCBQNhbXQABgILLCByZXF1aXJlZD0JAQpmaXhlZFBvaW50AgUJdXNkdFNwZW50AAYCASsJAQpmaXhlZFBvaW50AgUDZmVlAAYCDihkZWxpdmVyeSBmZWUpBARyZXN0AwkAZgIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQFEHVzZHRTcGVudFdpdGhGZWUFC3VzZHRBc3NldElkBQNuaWwFA25pbAQQYWN0aXZpdGllc0Ftb3VudAkAaQIFCXVzZHRTcGVudABkBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAJAJQKAgkAzQgCCQDNCAIFBHJlc3QJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUQYWN0aXZpdGllc0Ftb3VudAULdXNkdEFzc2V0SWQJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFA2ZlZQkAlQoDBQZ3aFNhdmUFDHByb2xvZ1Jlc3VsdAULc3RhdHNSZXN1bHQBaQEKY3JhZnRHb29kcwIKcHJvZHVjdElkeAhxdWFudGl0eQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQVNVUxUNgkAAgECKmV4YWN0bHkgMSBVU0RUIG11c3QgYmUgYXR0YWNoZWQgYXMgcGF5bWVudAMJAGcCAAAFCHF1YW50aXR5CQACAQIbUXVhbnRpdHkgc2hvdWxkIGJlIHBvc2l0aXZlBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAU0JAAIBCQCsAgICMUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgTWFudWZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBGNvbnQJAJEDAgULY3VyTG9jYXRpb24FD2xvY0lkeENvbnRpbmVudAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfAwMJAGYCAAAFCnByb2R1Y3RJZHgGCQBnAgUKcHJvZHVjdElkeAkAkAMBBRBwcm9kdWN0aW9uTWF0cml4CQACAQkArAICAhRVbmtub3duIHByb2R1Y3QgaWR4PQkApAMBBQpwcm9kdWN0SWR4BAZyZWNpcGUJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4BQpwcm9kdWN0SWR4AgFfAwkBAiE9AgkAkAMBBQZyZWNpcGUFClJFQ0lQRVNJWkUJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgEDnByb2R1Y3RDb250SWR4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUG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AAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIcHJvZHVjZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAggFBm1lcmdlZAJfMQIBXwkAzAgCCQC6CQIFBmJwUHJvZAIBXwUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQLc3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag91cGRhdGVEdWNrU3RhdHMJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgkAawMFB3hwQ3JhZnQIBQZtZXJnZWQCXzIFBU1VTFQ4BQNuaWwFA25pbAkAlAoCBQNuaWwJAJUKAwUGcmVzdWx0BQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBEXNldFdhcmVob3VzZU9yZGVyAgtuZXdPcmRlclN0cgtsYW5kQXNzZXRJZAQEdXNlcggFAWkMb3JpZ2luQ2FsbGVyBARhZGRyCQClCAEFBHVzZXIEBnJlc3VsdAMJAQIhPQIFBHVzZXIFDHJlc3RDb250cmFjdAkBDGNoZWNrQmxvY2tlZAAHBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMDCQECIT0CBQR1c2VyBQxyZXN0Q29udHJhY3QJAQIhPQIFBW93bmVyBQRhZGRyBwkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQIbmV3T3JkZXIJALwJAgULbmV3T3JkZXJTdHICAToEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToEBGxvZnQJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwQHd2hUb3RhbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFCHZvbFRvdGFsBAZvcmRLZXkJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBApjdXJyZW50T3JkCQEIZ2V0T3JkZXIBBQZvcmRLZXkEAXoJAQtzZXRJbnRlcm5hbAMFCWN1cnJlbnRXaAUKY3VycmVudE9yZAUIbmV3T3JkZXIEC2J1eVZvbFNhbGRvCAUBegJfNAQMc2VsbFZvbFNhbGRvCAUBegJfNQQKd2hPY2N1cGllZAgFAXoCXzcECHdoTG9ja2VkCQBkAgULYnV5Vm9sU2FsZG8FDHNlbGxWb2xTYWxkbwQGd2hGcmVlCQBlAgkAZQIFB3doVG90YWwFCndoT2NjdXBpZWQFCHdoTG9ja2VkAwkAZgIAAAUGd2hGcmVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgITQXR0ZW1wdCB0byByZXNlcnZlIAkApAMBBQtidXlWb2xTYWxkbwIbIHNwYWNlIGZvciBidXkgb3JkZXJzLCBhbmQgCQCkAwEFDHNlbGxWb2xTYWxkbwIlIHNwYWNlIGZvciBzZWxsIG9yZGVycyAoYW5kIG9jY3VwaWVkPQkApAMBBQp3aE9jY3VwaWVkAh8pLCBsZWFkcyB0byBuZWdhdGl2ZSBmcmVlIHNwYWNlBAV3aFN0cgkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCQC5CQIIBQF6Al8xAgFfCQDMCAIJALkJAggFAXoCXzICAV8JAMwIAgkAugkCCAUBegJfMwIBXwkAzAgCCQCkAwEFCHdoTG9ja2VkBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAh1c2RTYWxkbwgFAXoCXzYEB2FjdGlvbnMDCQBmAgUIdXNkU2FsZG8AAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQh1c2RTYWxkbwkAAgEJAKwCAgISUGF5bWVudCBuZWVkZWQgaXMgCQCkAwEFCHVzZFNhbGRvCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3T3JkZXJTdHIFA25pbAMJAAACBQh1c2RTYWxkbwAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQULbmV3T3JkZXJTdHIFA25pbAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQVvd25lcgkBAS0BBQh1c2RTYWxkbwULdXNkdEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQtuZXdPcmRlclN0cgUDbmlsCQCUCgIFB2FjdGlvbnMJAJQKAgUGcmVzdWx0BQZ3aFNhdmUBaQEUYWNjZXB0V2FyZWhvdXNlT3JkZXIDCmJwT3JkZXJTdHIPc2hvcExhbmRBc3NldElkC2R1Y2tBc3NldElkBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEEXN0YWtlZER1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQpjYWxsZXJBZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBRFzdGFrZWREdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OBANsb2MJALUJAgkBBXZhbHVlAQULY3VyTG9jYXRpb24CAV8DCQECIT0CCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBTAkAAgEJAKwCAgkArAICAhZEdWNrIGxvY2F0aW9uIHR5cGUgaXMgCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIRLCBidXQgc2hvdWxkIGJlIEwDCQECIT0CBRFzdGFrZWREdWNrQXNzZXRJZAULZHVja0Fzc2V0SWQJAAIBCQCsAgIJAKwCAgkArAICAhRZb3VyIHN0YWtlZCBkdWNrIGlzIAURc3Rha2VkRHVja0Fzc2V0SWQCDSwgYnV0IHBhc3NlZCAFC2R1Y2tBc3NldElkBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQJYnBSZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAlicE1hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECmJwUHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EDSR0MDUyOTk0NTMyMzQJARVhY2NlcHRTaG9wT3JkZXJDb21tb24GBQ9zaG9wTGFuZEFzc2V0SWQFCmNhbGxlckFkZHIFCmJwT3JkZXJTdHIFCWJwUmVzTGlzdAUJYnBNYXRMaXN0BQpicFByb2RMaXN0BApzaG9wQWN0aW9uCAUNJHQwNTI5OTQ1MzIzNAJfMQQKbmV3VXNlclJlcwgFDSR0MDUyOTk0NTMyMzQCXzIECm5ld1VzZXJNYXQIBQ0kdDA1Mjk5NDUzMjM0Al8zBAtuZXdVc2VyUHJvZAgFDSR0MDUyOTk0NTMyMzQCXzQEDXVzZFdoMkJwU2FsZG8IBQ0kdDA1Mjk5NDUzMjM0Al81BA11c2RCcDJXaFNhbGRvCAUNJHQwNTI5OTQ1MzIzNAJfNgQIeHBBbW91bnQIBQ0kdDA1Mjk5NDUzMjM0Al83BA1zaG9wTGFuZE93bmVyCAUNJHQwNTI5OTQ1MzIzNAJfOAQKc2hvcFdoU2F2ZQgFDSR0MDUyOTk0NTMyMzQCXzkEDmFjY1N0YXRzUmVzdWx0CAUNJHQwNTI5OTQ1MzIzNANfMTAECGFjdGlvbnMxCQDMCAIFCnNob3BBY3Rpb24JARBzaG9wMnVzZXJBY3Rpb25zAwUNdXNkV2gyQnBTYWxkbwUKY2FsbGVyQWRkcgAABAhhY3Rpb25zMgkBEHVzZXIyc2hvcEFjdGlvbnMEBQ11c2RCcDJXaFNhbGRvCAUBaQhwYXltZW50cwUNc2hvcExhbmRPd25lcgAABAhuZXdCcFN0cgkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCBQpuZXdVc2VyUmVzAgFfCQDMCAIJALkJAgUKbmV3VXNlck1hdAIBXwkAzAgCCQC6CQIFC25ld1VzZXJQcm9kAgFfBQNuaWwCAToEBmJwU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFCG5ld0JwU3RyBQNuaWwFA25pbAQPZHVja1N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIPdXBkYXRlRHVja1N0YXRzCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIJAGsDBQZ4cFNob3AFCHhwQW1vdW50BQVNVUxUOAUDbmlsBQNuaWwJAJQKAgkAzggCBQhhY3Rpb25zMQUIYWN0aW9uczIJAJcKBQUMcHJvbG9nUmVzdWx0BQpzaG9wV2hTYXZlBQZicFNhdmUFD2R1Y2tTdGF0c1Jlc3VsdAUOYWNjU3RhdHNSZXN1bHQBaQEbYWNjZXB0U2hvcE9yZGVyRHVja0RlbGl2ZXJ5AghvcmRlclN0cg9zaG9wTGFuZEFzc2V0SWQDCQEBIQEFEUtTX0FMTE9XX0RFTElWRVJZCQACAQIfRGVsaXZlcnkgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAQGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIECmNhbGxlckFkZHIJAKUIAQUGY2FsbGVyBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUKY2FsbGVyQWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkECWJwUmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQJYnBNYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBApicFByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfBA0kdDA1NDY3MzU0OTExCQEVYWNjZXB0U2hvcE9yZGVyQ29tbW9uBgUPc2hvcExhbmRBc3NldElkBQpjYWxsZXJBZGRyBQhvcmRlclN0cgUJYnBSZXNMaXN0BQlicE1hdExpc3QFCmJwUHJvZExpc3QECnNob3BBY3Rpb24IBQ0kdDA1NDY3MzU0OTExAl8xBApuZXdVc2VyUmVzCAUNJHQwNTQ2NzM1NDkxMQJfMgQKbmV3VXNlck1hdAgFDSR0MDU0NjczNTQ5MTECXzMEC25ld1VzZXJQcm9kCAUNJHQwNTQ2NzM1NDkxMQJfNAQNdXNkV2gyQnBTYWxkbwgFDSR0MDU0NjczNTQ5MTECXzUEDXVzZEJwMldoU2FsZG8IBQ0kdDA1NDY3MzU0OTExAl82BAh4cEFtb3VudAgFDSR0MDU0NjczNTQ5MTECXzcEDXNob3BMYW5kT3duZXIIBQ0kdDA1NDY3MzU0OTExAl84BApzaG9wV2hTYXZlCAUNJHQwNTQ2NzM1NDkxMQJfOQQOYWNjU3RhdHNSZXN1bHQIBQ0kdDA1NDY3MzU0OTExA18xMAQPZGVsaXZlcnlGZWVQYXJ0CQBrAwkAZAIFDXVzZEJwMldoU2FsZG8FDXVzZFdoMkJwU2FsZG8FDERFTElWRVJZX0ZFRQUFTVVMVDYEC2RlbGl2ZXJ5RmVlAwkAZgIFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUPZGVsaXZlcnlGZWVQYXJ0BRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFD2RlbGl2ZXJ5RmVlUGFydAQIc3BlbnRGZWUJAGsDBQtkZWxpdmVyeUZlZQUNdXNkQnAyV2hTYWxkbwkAZAIFDXVzZEJwMldoU2FsZG8FDXVzZFdoMkJwU2FsZG8EC3JlY2VpdmVkRmVlCQBlAgULZGVsaXZlcnlGZWUFCHNwZW50RmVlBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPZGVsaXZlcnlGdW5kS2V5AAAECGFjdGlvbnMxCQDMCAIFCnNob3BBY3Rpb24JARBzaG9wMnVzZXJBY3Rpb25zAwUNdXNkV2gyQnBTYWxkbwUKY2FsbGVyQWRkcgULcmVjZWl2ZWRGZWUECGFjdGlvbnMyCQEQdXNlcjJzaG9wQWN0aW9ucwQFDXVzZEJwMldoU2FsZG8IBQFpCHBheW1lbnRzBQ1zaG9wTGFuZE93bmVyBQhzcGVudEZlZQQIbmV3QnBTdHIJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAgUKbmV3VXNlclJlcwIBXwkAzAgCCQC5CQIFCm5ld1VzZXJNYXQCAV8JAMwIAgkAugkCBQtuZXdVc2VyUHJvZAIBXwUDbmlsAgE6BAZicFNhdmUJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQhuZXdCcFN0cgUDbmlsBQNuaWwED2R1Y2tTdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUGeHBTaG9wBQh4cEFtb3VudAUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM0IAgkAzggCBQhhY3Rpb25zMQUIYWN0aW9uczIJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFC2RlbGl2ZXJ5RmVlCQCXCgUFDHByb2xvZ1Jlc3VsdAUKc2hvcFdoU2F2ZQUGYnBTYXZlBQ9kdWNrU3RhdHNSZXN1bHQFDmFjY1N0YXRzUmVzdWx0AWkBG2FjY2VwdFNob3BPcmRlckxhbmREZWxpdmVyeQMIb3JkZXJTdHIPc2hvcExhbmRBc3NldElkDW15TGFuZEFzc2V0SWQDCQEBIQEFEUtTX0FMTE9XX0RFTElWRVJZCQACAQIfRGVsaXZlcnkgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIQQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAQGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIECmNhbGxlckFkZHIJAKUIAQUGY2FsbGVyBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFDW15TGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQ1teUxhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQ1teUxhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQpjYWxsZXJBZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAJ3aAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCFGdldFdhcmVob3VzZVJFQURPTkxZCQDMCAIFDW15TGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToEB3Jlc0xpc3QJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAdtYXRMaXN0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQIcHJvZExpc3QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQNJHQwNTcxNTA1NzM4MgkBFWFjY2VwdFNob3BPcmRlckNvbW1vbgYFD3Nob3BMYW5kQXNzZXRJZAUKY2FsbGVyQWRkcgUIb3JkZXJTdHIFB3Jlc0xpc3QFB21hdExpc3QFCHByb2RMaXN0BApzaG9wQWN0aW9uCAUNJHQwNTcxNTA1NzM4MgJfMQQKbmV3VXNlclJlcwgFDSR0MDU3MTUwNTczODICXzIECm5ld1VzZXJNYXQIBQ0kdDA1NzE1MDU3MzgyAl8zBAtuZXdVc2VyUHJvZAgFDSR0MDU3MTUwNTczODICXzQEDXVzZFdoMkJwU2FsZG8IBQ0kdDA1NzE1MDU3MzgyAl81BA11c2RCcDJXaFNhbGRvCAUNJHQwNTcxNTA1NzM4MgJfNgQIeHBBbW91bnQIBQ0kdDA1NzE1MDU3MzgyAl83BA1zaG9wTGFuZE93bmVyCAUNJHQwNTcxNTA1NzM4MgJfOAQKc2hvcFdoU2F2ZQgFDSR0MDU3MTUwNTczODICXzkEDmFjY1N0YXRzUmVzdWx0CAUNJHQwNTcxNTA1NzM4MgNfMTAED2RlbGl2ZXJ5RmVlUGFydAkAawMJAGQCBQ11c2RCcDJXaFNhbGRvBQ11c2RXaDJCcFNhbGRvBQxERUxJVkVSWV9GRUUFBU1VTFQ2BAtkZWxpdmVyeUZlZQMJAGYCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFD2RlbGl2ZXJ5RmVlUGFydAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQ9kZWxpdmVyeUZlZVBhcnQECHNwZW50RmVlCQBrAwULZGVsaXZlcnlGZWUFDXVzZEJwMldoU2FsZG8JAGQCBQ11c2RCcDJXaFNhbGRvBQ11c2RXaDJCcFNhbGRvBAtyZWNlaXZlZEZlZQkAZQIFC2RlbGl2ZXJ5RmVlBQhzcGVudEZlZQQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAABAhhY3Rpb25zMQkAzAgCBQpzaG9wQWN0aW9uCQEQc2hvcDJ1c2VyQWN0aW9ucwMFDXVzZFdoMkJwU2FsZG8FCmNhbGxlckFkZHIFC3JlY2VpdmVkRmVlBAhhY3Rpb25zMgkBEHVzZXIyc2hvcEFjdGlvbnMEBQ11c2RCcDJXaFNhbGRvCAUBaQhwYXltZW50cwUNc2hvcExhbmRPd25lcgUIc3BlbnRGZWUEBXdoU3RyCQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIJALkJAgUKbmV3VXNlclJlcwIBXwkAzAgCCQC5CQIFCm5ld1VzZXJNYXQCAV8JAMwIAgkAuQkCBQtuZXdVc2VyUHJvZAIBXwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUBQNuaWwCAToEBndoU2F2ZQkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDXNhdmVXYXJlaG91c2UJAMwIAgUFd2hTdHIJAMwIAgUNbXlMYW5kQXNzZXRJZAUDbmlsBQNuaWwEC3N0YXRzUmVzdWx0CQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQWNjU3RhdHMJAMwIAgUKY2FsbGVyQWRkcgkAzAgCCQBrAwUGeHBTaG9wBQh4cEFtb3VudAUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAM0IAgkAzggCBQhhY3Rpb25zMQUIYWN0aW9uczIJAQxJbnRlZ2VyRW50cnkCBQ9kZWxpdmVyeUZ1bmRLZXkJAGQCBQlmdW5kVG90YWwFC2RlbGl2ZXJ5RmVlCQCXCgUFDHByb2xvZ1Jlc3VsdAUKc2hvcFdoU2F2ZQUGd2hTYXZlBQtzdGF0c1Jlc3VsdAUOYWNjU3RhdHNSZXN1bHQBaQEQc2VsbFByb2R1Y3RzVG9FUwEHYW1vdW50cwQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECEk5vIHBheW1lbnRzIG5lZWRlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFBCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEFpcnBvcnQsIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQIcHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EBWVzS2V5CQEOa2V5RXNXYXJlaG91c2UABAhleGlzdFN0cgkAoggBBQVlc0tleQQMZXhpc3RBbW91bnRzAwkBCWlzRGVmaW5lZAEFCGV4aXN0U3RyCQC8CQIJAQV2YWx1ZQEFCGV4aXN0U3RyAgFfBQNuaWwKAQhtb3ZlUHJvZAIDYWNjCXJlY2lwZVN0cgQBaggFA2FjYwJfMQQIcXVhbnRpdHkDCQBmAgkAkAMBBQdhbW91bnRzBQFqCQCRAwIFB2Ftb3VudHMFAWoAAAMJAGYCAAAFCHF1YW50aXR5CQACAQIbUXVhbnRpdHkgY2Fubm90IGJlIG5lZ2F0aXZlBAZyZWNpcGUJALUJAgUJcmVjaXBlU3RyAgFfAwkBAiE9AgkAkAMBBQZyZWNpcGUFClJFQ0lQRVNJWkUJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogBQlyZWNpcGVTdHIECW1heEFtb3VudAkAaAIFDUVTTUFYUEFDS0FHRVMFDlBST0RVQ1RQS0dTSVpFBAtleGlzdEFtb3VudAMJAGYCCQCQAwEFDGV4aXN0QW1vdW50cwUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGV4aXN0QW1vdW50cwUBagAABAZjYW5CdXkJAGUCBQltYXhBbW91bnQFC2V4aXN0QW1vdW50AwkAZgIFCHF1YW50aXR5BQZjYW5CdXkJAAIBCQCsAgIJAKwCAgkArAICAhdXYXJlaG91c2UgY2FuIGJ1eSBvbmx5IAkApAMBBQZjYW5CdXkCBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQFqBAh0b3RhbE1hdAkBEmdldFJlY2lwZU1hdGVyaWFscwEFBnJlY2lwZQQJdW5pdFByaWNlCQBrAwkAaAIFCHRvdGFsTWF0BQlFU0JVWUNPRUYFEFJFU09VUkNFUFJJQ0VNSU4JAGgCBQVNVUxUOAUOUFJPRFVDVFBLR1NJWkUEDGJwUHJvZEFtb3VudAMJAGYCCQCQAwEFCHByb2RMaXN0BQFqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvZExpc3QFAWoAAAMJAGYCBQhxdWFudGl0eQUMYnBQcm9kQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAKQDAQUMYnBQcm9kQW1vdW50AgQgb2YgCQCRAwIFCXByb2RUeXBlcwUBagkAlwoFCQBkAgUBagABCQBkAggFA2FjYwJfMgkAaAIFCXVuaXRQcmljZQUIcXVhbnRpdHkJAM0IAggFA2FjYwJfMwkApAMBCQBlAgUMYnBQcm9kQW1vdW50BQhxdWFudGl0eQkAzQgCCAUDYWNjAl80CQCkAwEJAGQCBQtleGlzdEFtb3VudAUIcXVhbnRpdHkJAGQCCAUDYWNjAl81CQBoAgUIdG90YWxNYXQFCHF1YW50aXR5BAZtZXJnZWQKAAIkbAUQcHJvZHVjdGlvbk1hdHJpeAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJcKBQAAAAAFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCG1vdmVQcm9kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIECG5ld0JwU3RyCQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQC6CQIIBQZtZXJnZWQCXzMCAV8FA25pbAIBOgQGYnBTYXZlCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUIbmV3QnBTdHIFA25pbAUDbmlsBAtzdGF0c1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCD3VwZGF0ZUR1Y2tTdGF0cwkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCCQBrAwUKeHBTZWxsVG9FcwgFBm1lcmdlZAJfNQkAaAIFBU1VTFQ4AAoFA25pbAUDbmlsCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUFZXNLZXkJALoJAggFBm1lcmdlZAJfNAIBXwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQZtZXJnZWQCXzIFC3VzZHRBc3NldElkBQNuaWwJAJUKAwUGYnBTYXZlBQxwcm9sb2dSZXN1bHQFC3N0YXRzUmVzdWx0AWkBD3VwZGF0ZUVzU3RvcmFnZQEKbmV3U3RvcmFnZQMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5RXNXYXJlaG91c2UABQpuZXdTdG9yYWdlBQNuaWwFCm5ld1N0b3JhZ2UBaQEUdXBkYXRlRGVsaXZlcnlMb2NrZWQBCW5ld0Ftb3VudAMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgURZGVsaXZlcnlMb2NrZWRLZXkFCW5ld0Ftb3VudAUDbmlsBQluZXdBbW91bnQBaQESc2VuZERlbGl2ZXJ5UmV3YXJkAQRhZGRyAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFD2RlbGl2ZXJ5RnVuZEtleQAABAtsb2NrZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRFkZWxpdmVyeUxvY2tlZEtleQAACQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQt1c2R0QXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPZGVsaXZlcnlGdW5kS2V5CQBlAgUJZnVuZFRvdGFsBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkJAMwIAgkBDEludGVnZXJFbnRyeQIFEWRlbGl2ZXJ5TG9ja2VkS2V5CQBlAgULbG9ja2VkVG90YWwFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkAg40YXg==", "height": 2778197, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 69NH1WWfLS8FraSQvZgE4RXskz6H7ZVhHnKfkqofYkCb Next: AreAx8kG7V8V5i5rwFUViSjZrBAJnypDtxCYXezDVzG1 Diff:
OldNewDifferences
263263 else 0
264264 let m0 = min([w0, (amount - m1)])
265265 let m = (m0 + m1)
266- let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
266+ let w0min = min([w0, FACTORYMAXWAREHOUSE])
267+ let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0min) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
267268 let max101 = (maxPrice + (maxPrice / 100))
268269 if (((usdtSpent * MULT8) > (max101 * m)))
269270 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
713714 $Tuple3((acc._1 ++ x._1), (acc._2 + x._3), (acc._3 + x._4))
714715 }
715716
716- let $t02521325303 = {
717+ let $t02526125351 = {
717718 let $l = continents
718719 let $s = size($l)
719720 let $acc0 = $Tuple3(nil, 0, 0)
727728
728729 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
729730 }
730- let factoryActions = $t02521325303._1
731- let usdtReceived = $t02521325303._2
732- let totalRes = $t02521325303._3
731+ let factoryActions = $t02526125351._1
732+ let usdtReceived = $t02526125351._2
733+ let totalRes = $t02526125351._3
733734 let fee = fraction(usdtReceived, DELIVERY_FEE, MULT6)
734735 let activitiesAmount = (usdtReceived / 100)
735736 let usdtLeft = ((usdtReceived - activitiesAmount) - fee)
766767 else {
767768 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
768769 let resList = split(currentPack[bpIdxRes], "_")
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
770+ let $t02680326929 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
771+ let factoryActions = $t02680326929._1
772+ let newRes = $t02680326929._2
773+ let usdtReceived = $t02680326929._3
774+ let totalRes = $t02680326929._4
774775 let activitiesAmount = (usdtReceived / 100)
775776 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
776777 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
786787 func sellResourcesWorld (addr,amount) = if ((i.caller != acresContract))
787788 then throw("Permission denied")
788789 else {
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
790+ let $t02772127878 = sellResourcesWorldInternal(amount)
791+ let factoryActions = $t02772127878._1
792+ let usdtLeft = $t02772127878._2
793+ let fee = $t02772127878._3
794+ let activitiesAmount = $t02772127878._4
795+ let totalRes = $t02772127878._5
795796 if ((0 >= usdtLeft))
796797 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
797798 else {
821822 else {
822823 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
823824 let resList = split(currentPack[bpIdxRes], "_")
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
825+ let $t02911129232 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
826+ let factoryActions = $t02911129232._1
827+ let newRes = $t02911129232._2
828+ let usdtReceived = $t02911129232._3
829+ let totalRes = $t02911129232._4
829830 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
830831 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
831832 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
866867 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
867868 let currentWh = split_4C(wh, ":")
868869 let resList = split(currentWh[whIdxRes], "_")
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
870+ let $t03125931380 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
871+ let factoryActions = $t03125931380._1
872+ let newRes = $t03125931380._2
873+ let usdtReceived = $t03125931380._3
874+ let totalRes = $t03125931380._4
874875 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), currentWh[whIdxMat], currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
875876 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
876877 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
912913 else {
913914 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
914915 let matList = split(currentPack[bpIdxMat], "_")
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
916+ let $t03324033362 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
917+ let factoryActions = $t03324033362._1
918+ let newMat = $t03324033362._2
919+ let usdtSpent = $t03324033362._3
920+ let totalMat = $t03324033362._4
920921 if ((usdtSpent > amt))
921922 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
922923 else {
954955 else {
955956 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
956957 let matList = split(currentPack[bpIdxMat], "_")
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
958+ let $t03488034997 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
959+ let factoryActions = $t03488034997._1
960+ let newMat = $t03488034997._2
961+ let usdtSpent = $t03488034997._3
962+ let totalMat = $t03488034997._4
962963 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
963964 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
964965 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
10111012 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
10121013 let currentWh = split_4C(wh, ":")
10131014 let matList = split(currentWh[whIdxMat], "_")
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
1015+ let $t03727537392 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1016+ let factoryActions = $t03727537392._1
1017+ let newMat = $t03727537392._2
1018+ let usdtSpent = $t03727537392._3
1019+ let totalMat = $t03727537392._4
10191020 let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
10201021 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
10211022 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalMat, MULT8)], nil))
10631064 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
10641065 let resList = split(currentPack[bpIdxRes], "_")
10651066 let matList = split(currentPack[bpIdxMat], "_")
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
1067+ let $t03950639612 = exchangeResourcesCommon(resList, matList, amounts)
1068+ let newRes = $t03950639612._1
1069+ let newMat = $t03950639612._2
1070+ let usdtSpent = $t03950639612._3
1071+ let totalAmountConverted = $t03950639612._4
10711072 if ((usdtSpent > amt))
10721073 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
10731074 else {
11041105 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
11051106 let resList = split(currentPack[bpIdxRes], "_")
11061107 let matList = split(currentPack[bpIdxMat], "_")
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
1108+ let $t04104741153 = exchangeResourcesCommon(resList, matList, amounts)
1109+ let newRes = $t04104741153._1
1110+ let newMat = $t04104741153._2
1111+ let usdtSpent = $t04104741153._3
1112+ let totalAmountConverted = $t04104741153._4
11121113 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
11131114 let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
11141115 then MIN_USDT_FEE_DELIVERY15
11601161 let currentWh = split_4C(wh, ":")
11611162 let resList = split(currentWh[whIdxRes], "_")
11621163 let matList = split(currentWh[whIdxMat], "_")
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
1164+ let $t04337643482 = exchangeResourcesCommon(resList, matList, amounts)
1165+ let newRes = $t04337643482._1
1166+ let newMat = $t04337643482._2
1167+ let usdtSpent = $t04337643482._3
1168+ let totalAmountConverted = $t04337643482._4
11681169 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
11691170 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
11701171 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
13781379 let bpProdList = if ((currentPack[bpIdxProd] == ""))
13791380 then nil
13801381 else split_4C(currentPack[bpIdxProd], "_")
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
1382+ let $t05299453234 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1383+ let shopAction = $t05299453234._1
1384+ let newUserRes = $t05299453234._2
1385+ let newUserMat = $t05299453234._3
1386+ let newUserProd = $t05299453234._4
1387+ let usdWh2BpSaldo = $t05299453234._5
1388+ let usdBp2WhSaldo = $t05299453234._6
1389+ let xpAmount = $t05299453234._7
1390+ let shopLandOwner = $t05299453234._8
1391+ let shopWhSave = $t05299453234._9
1392+ let accStatsResult = $t05299453234._10
13921393 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, 0)]
13931394 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, 0)
13941395 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
14151416 let bpProdList = if ((currentPack[bpIdxProd] == ""))
14161417 then nil
14171418 else split_4C(currentPack[bpIdxProd], "_")
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
1419+ let $t05467354911 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1420+ let shopAction = $t05467354911._1
1421+ let newUserRes = $t05467354911._2
1422+ let newUserMat = $t05467354911._3
1423+ let newUserProd = $t05467354911._4
1424+ let usdWh2BpSaldo = $t05467354911._5
1425+ let usdBp2WhSaldo = $t05467354911._6
1426+ let xpAmount = $t05467354911._7
1427+ let shopLandOwner = $t05467354911._8
1428+ let shopWhSave = $t05467354911._9
1429+ let accStatsResult = $t05467354911._10
14291430 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
14301431 let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
14311432 then MIN_USDT_FEE_DELIVERY
14651466 let prodList = if ((currentWh[whIdxProd] == ""))
14661467 then nil
14671468 else split(currentWh[whIdxProd], "_")
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
1469+ let $t05715057382 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1470+ let shopAction = $t05715057382._1
1471+ let newUserRes = $t05715057382._2
1472+ let newUserMat = $t05715057382._3
1473+ let newUserProd = $t05715057382._4
1474+ let usdWh2BpSaldo = $t05715057382._5
1475+ let usdBp2WhSaldo = $t05715057382._6
1476+ let xpAmount = $t05715057382._7
1477+ let shopLandOwner = $t05715057382._8
1478+ let shopWhSave = $t05715057382._9
1479+ let accStatsResult = $t05715057382._10
14791480 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
14801481 let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
14811482 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)
266- let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
266+ let w0min = min([w0, FACTORYMAXWAREHOUSE])
267+ let usdtSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0min) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
267268 let max101 = (maxPrice + (maxPrice / 100))
268269 if (((usdtSpent * MULT8) > (max101 * m)))
269270 then throw((((((((((("Actual price = " + toString(usdtSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
270271 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdtSpent, m)
271272 }
272273
273274
274275 func getBackpack (bpKey) = {
275276 let p = split_4C(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
276277 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
277278 then p[bpIdxRes]
278279 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
279280 then p[bpIdxMat]
280281 else "0_0_0_0_0_0", p[bpIdxProd]]
281282 }
282283
283284
284285 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
285286 then throw("Contracts are under maintenance")
286287 else unit
287288
288289
289290 func prolog () = asInt(invoke(stakingContract, "saveLastTx", nil, nil))
290291
291292
292293 func setCommon (acc,ignoredIterator) = {
293294 let j = acc._1
294295 let item = if ((size(acc._10) > j))
295296 then acc._10[j]
296297 else "0@0"
297298 let isProd = acc._8
298299 let itemParts = split(item, "@")
299300 if ((size(itemParts) != 2))
300301 then throw("Incorrect order format, should be amount@price")
301302 else {
302303 let newOrdAm = parseIntValue(itemParts[0])
303304 let newOrdPr = parseIntValue(itemParts[1])
304305 let newOrdUsd = if (isProd)
305306 then (newOrdAm * newOrdPr)
306307 else fraction(newOrdAm, newOrdPr, MULT8)
307308 let newOrdVol = toVolume(newOrdAm, PRODUCTPKGSIZE, isProd)
308309 let whInit = if ((size(acc._6) > j))
309310 then parseIntValue(acc._6[j])
310311 else 0
311312 let curOrdParts = split(if ((size(acc._7) > j))
312313 then acc._7[j]
313314 else "0@0", "@")
314315 let curOrdAm = parseIntValue(curOrdParts[0])
315316 let curOrdPr = parseIntValue(curOrdParts[1])
316317 if (if ((0 > curOrdPr))
317318 then true
318319 else (0 > newOrdPr))
319320 then throw("Price can't be negative")
320321 else {
321322 let curOrdUsd = if (isProd)
322323 then (curOrdAm * curOrdPr)
323324 else fraction(curOrdAm, curOrdPr, MULT8)
324325 if ((newOrdAm == 0))
325326 then if ((curOrdAm > 0))
326327 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)
327328 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)
328329 else if ((newOrdAm > 0))
329330 then if ((0 > curOrdAm))
330331 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)
331332 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)
332333 else if ((0 > curOrdAm))
333334 then {
334335 let amDiff = (curOrdAm - newOrdAm)
335336 if ((0 > (whInit - amDiff)))
336337 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whInit)) + " available"))
337338 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)
338339 }
339340 else if ((0 > (whInit + newOrdAm)))
340341 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whInit)) + " available"))
341342 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)
342343 }
343344 }
344345 }
345346
346347
347348 func setInternal (currentWh,currentOrd,newOrd) = {
348349 let currWhRes = split(currentWh[whIdxRes], "_")
349350 let currWhMat = split(currentWh[whIdxMat], "_")
350351 let currWhProd = if ((currentWh[whIdxProd] == ""))
351352 then nil
352353 else split_4C(currentWh[whIdxProd], "_")
353354 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
354355 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
355356 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
356357 then nil
357358 else split_4C(currentOrd[ordIdxProd], "_")
358359 if ((size(newOrd) != 3))
359360 then throw("newOrderStr should contain exactly 2 ':' separators")
360361 else {
361362 let resParts = split(newOrd[0], "_")
362363 let matParts = split(newOrd[1], "_")
363364 let prodParts = if ((newOrd[2] == ""))
364365 then nil
365366 else split_4C(newOrd[2], "_")
366367 if ((size(resParts) != NUMRES))
367368 then throw("All 6 resources should be passed")
368369 else if ((size(matParts) != NUMRES))
369370 then throw("All 6 materials should be passed")
370371 else {
371372 let r = {
372373 let $l = resTypes
373374 let $s = size($l)
374375 let $acc0 = $Tuple10(0, nil, 0, 0, 0, currWhRes, currentOrdRes, false, 0, resParts)
375376 func $f0_1 ($a,$i) = if (($i >= $s))
376377 then $a
377378 else setCommon($a, $l[$i])
378379
379380 func $f0_2 ($a,$i) = if (($i >= $s))
380381 then $a
381382 else throw("List size exceeds 6")
382383
383384 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
384385 }
385386 let m = {
386387 let $l = matTypes
387388 let $s = size($l)
388389 let $acc0 = $Tuple10(0, nil, r._3, r._4, r._5, currWhMat, currentOrdMat, false, r._9, matParts)
389390 func $f1_1 ($a,$i) = if (($i >= $s))
390391 then $a
391392 else setCommon($a, $l[$i])
392393
393394 func $f1_2 ($a,$i) = if (($i >= $s))
394395 then $a
395396 else throw("List size exceeds 6")
396397
397398 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
398399 }
399400 let p = {
400401 let $l = prodTypes
401402 let $s = size($l)
402403 let $acc0 = $Tuple10(0, nil, m._3, m._4, m._5, currWhProd, currentOrdProd, true, m._9, prodParts)
403404 func $f2_1 ($a,$i) = if (($i >= $s))
404405 then $a
405406 else setCommon($a, $l[$i])
406407
407408 func $f2_2 ($a,$i) = if (($i >= $s))
408409 then $a
409410 else throw("List size exceeds 50")
410411
411412 $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)
412413 }
413414 $Tuple7(r._2, m._2, p._2, p._3, p._4, p._5, p._9)
414415 }
415416 }
416417 }
417418
418419
419420 func acceptCommon (acc,bpOrdItem) = {
420421 let j = acc._7
421422 let isProd = acc._12
422423 let bpOrdParts = split(bpOrdItem, "@")
423424 if ((size(bpOrdParts) != 2))
424425 then throw("Incorrect order format, should be amount@price")
425426 else {
426427 let bpOrdAm = parseIntValue(bpOrdParts[0])
427428 let bpOrdPr = parseIntValue(bpOrdParts[1])
428429 if ((0 > bpOrdPr))
429430 then throw("Price can't be negative")
430431 else {
431432 let bpOrdUsd = if (isProd)
432433 then (bpOrdAm * bpOrdPr)
433434 else fraction(bpOrdAm, bpOrdPr, MULT8)
434435 let bpInit = if ((size(acc._8) > j))
435436 then parseIntValue(acc._8[j])
436437 else 0
437438 let whInit = if ((size(acc._9) > j))
438439 then parseIntValue(acc._9[j])
439440 else 0
440441 let whOrdInit = if ((size(acc._10) > j))
441442 then acc._10[j]
442443 else "0@0"
443444 let whOrdParts = split(whOrdInit, "@")
444445 let whOrdAm = parseIntValue(whOrdParts[0])
445446 let whOrdPr = parseIntValue(whOrdParts[1])
446447 if (if ((bpOrdAm != 0))
447448 then (bpOrdPr != whOrdPr)
448449 else false)
449450 then throw(((((("Prices of " + acc._11[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
450451 else {
451452 let whOrdUsd = if (isProd)
452453 then (whOrdAm * whOrdPr)
453454 else fraction(whOrdAm, whOrdPr, MULT8)
454455 let deltaVol = toVolume(bpOrdAm, PRODUCTPKGSIZE, isProd)
455456 if ((bpOrdAm == 0))
456457 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)
457458 else if ((bpOrdAm > 0))
458459 then if ((0 > whOrdAm))
459460 then if ((bpOrdAm > -(whOrdAm)))
460461 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + acc._11[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
461462 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)
462463 then (bpOrdAm * MULT8)
463464 else bpOrdAm)))
464465 else throw((("Attempt to buy " + acc._11[j]) + " while warehouse doesn't sell it"))
465466 else if ((whOrdAm > 0))
466467 then if ((-(bpOrdAm) > whOrdAm))
467468 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + acc._11[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
468469 else if ((-(bpOrdAm) > bpInit))
469470 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + toString(bpInit)) + " of ") + acc._11[j]))
470471 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)
471472 then (bpOrdAm * MULT8)
472473 else bpOrdAm)))
473474 else throw((("Attempt to sell " + acc._11[j]) + " while warehouse doesn't buy it"))
474475 }
475476 }
476477 }
477478 }
478479
479480
480481 func sellResourcesCommon (resList,factoryLocId,amounts,minPrices) = {
481482 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
482483 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
483484 else if ((0 > amounts[j]))
484485 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
485486 else if ((amounts[j] > 0))
486487 then {
487488 let b = sellInternal(factoryLocId, j, amounts[j], minPrices[j])
488489 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2), (acc._4 + amounts[j]))
489490 }
490491 else $Tuple4(acc._1, (acc._2 :+ resList[j]), acc._3, acc._4)
491492
492493 let $l = ITER6
493494 let $s = size($l)
494495 let $acc0 = $Tuple4(nil, nil, 0, 0)
495496 func $f0_1 ($a,$i) = if (($i >= $s))
496497 then $a
497498 else adder($a, $l[$i])
498499
499500 func $f0_2 ($a,$i) = if (($i >= $s))
500501 then $a
501502 else throw("List size exceeds 6")
502503
503504 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
504505 }
505506
506507
507508 func buyMaterialsCommon (matList,factoryLocId,amounts,maxPrices) = {
508509 func mUpdater (acc,j) = if ((0 > amounts[j]))
509510 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
510511 else if ((amounts[j] > 0))
511512 then {
512513 let b = buyInternal(factoryLocId, j, amounts[j], maxPrices[j])
513514 $Tuple4((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2), (acc._4 + amounts[j]))
514515 }
515516 else $Tuple4(acc._1, (acc._2 :+ matList[j]), acc._3, acc._4)
516517
517518 let $l = ITER6
518519 let $s = size($l)
519520 let $acc0 = $Tuple4(nil, nil, 0, 0)
520521 func $f0_1 ($a,$i) = if (($i >= $s))
521522 then $a
522523 else mUpdater($a, $l[$i])
523524
524525 func $f0_2 ($a,$i) = if (($i >= $s))
525526 then $a
526527 else throw("List size exceeds 6")
527528
528529 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
529530 }
530531
531532
532533 func exchangeResourcesCommon (resList,matList,amounts) = {
533534 func exchanger (acc,j) = {
534535 let amj = amounts[j]
535536 if ((amj > parseIntValue(resList[j])))
536537 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
537538 else if ((0 > amj))
538539 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
539540 else if ((amj > 0))
540541 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))
541542 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
542543 }
543544
544545 let $l = ITER6
545546 let $s = size($l)
546547 let $acc0 = $Tuple4(nil, nil, 0, 0)
547548 func $f0_1 ($a,$i) = if (($i >= $s))
548549 then $a
549550 else exchanger($a, $l[$i])
550551
551552 func $f0_2 ($a,$i) = if (($i >= $s))
552553 then $a
553554 else throw("List size exceeds 6")
554555
555556 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
556557 }
557558
558559
559560 func shop2userActions (usdWh2BpSaldo,callerAddr,receivedFee) = if ((usdWh2BpSaldo > 0))
560561 then {
561562 let usdWh2BpFee = fraction(usdWh2BpSaldo, AUCTIONFEE, MULT6)
562563 if ((receivedFee >= (usdWh2BpSaldo - (3 * usdWh2BpFee))))
563564 then throw(("This trade does not cover delivery cost of " + fixedPoint(receivedFee, 6)))
564565 else {
565566 let refByKey = keyAddressRefBy(callerAddr)
566567 let refBy = getString(stakingContract, refByKey)
567568 let caller = addressFromStringValue(callerAddr)
568569 (((if (isDefined(refBy))
569570 then [ScriptTransfer(addressFromStringValue(value(refBy)), usdWh2BpFee, usdtAssetId)]
570571 else nil) :+ ScriptTransfer(caller, ((usdWh2BpSaldo - (3 * usdWh2BpFee)) - receivedFee), usdtAssetId)) :+ ScriptTransfer(restContract, usdWh2BpFee, usdtAssetId))
571572 }
572573 }
573574 else nil
574575
575576
576577 func user2shopActions (usdBp2WhSaldo,pmts,shopLandOwner,spentFee) = if ((usdBp2WhSaldo > 0))
577578 then if ((size(pmts) != 1))
578579 then throw("exactly 1 payment must be attached")
579580 else {
580581 let pmt = pmts[0]
581582 let amt = pmt.amount
582583 if (if (!(isDefined(pmt.assetId)))
583584 then true
584585 else (value(pmt.assetId) != usdtAssetId))
585586 then throw("USDT payments only!")
586587 else {
587588 let usdtSpentWithFee = (usdBp2WhSaldo + spentFee)
588589 if ((amt != usdtSpentWithFee))
589590 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdBp2WhSaldo, 6)) + "+") + fixedPoint(spentFee, 6)) + "(delivery fee)"))
590591 else if ((MINSHOPPAYMENT > usdBp2WhSaldo))
591592 then throw(("Min shop trade is " + fixedPoint(MINSHOPPAYMENT, 6)))
592593 else {
593594 let usdBp2WhFee = fraction(usdBp2WhSaldo, AUCTIONFEE, MULT6)
594595 let refByKey = keyAddressRefBy(shopLandOwner)
595596 let refBy = getString(stakingContract, refByKey)
596597 (((if (isDefined(refBy))
597598 then [ScriptTransfer(addressFromStringValue(value(refBy)), usdBp2WhFee, usdtAssetId)]
598599 else nil) :+ ScriptTransfer(addressFromStringValue(shopLandOwner), (usdBp2WhSaldo - (3 * usdBp2WhFee)), usdtAssetId)) :+ ScriptTransfer(restContract, usdBp2WhFee, usdtAssetId))
599600 }
600601 }
601602 }
602603 else if ((size(pmts) != 0))
603604 then throw("No payments needed")
604605 else nil
605606
606607
607608 func acceptShopOrderCommon (shopLandAssetId,callerAddr,bpOrderStr,bpResList,bpMatList,bpProdList) = {
608609 let landAsset = value(assetInfo(fromBase58String(shopLandAssetId)))
609610 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(shopLandAssetId)))))
610611 then throw((("NFT " + landAsset.name) + " is not staked"))
611612 else {
612613 let shopLandOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(shopLandAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
613614 if ((shopLandOwner == callerAddr))
614615 then throw("You cannot trade with yourself")
615616 else {
616617 let bpOrderParts = split_4C(bpOrderStr, ":")
617618 if ((size(bpOrderParts) != 3))
618619 then throw("bpOrderStr should contain exactly 2 ':' separators")
619620 else {
620621 let bpOrdRes = split(bpOrderParts[0], "_")
621622 let bpOrdMat = split(bpOrderParts[1], "_")
622623 let bpOrdProd = if ((bpOrderParts[2] == ""))
623624 then nil
624625 else split_4C(bpOrderParts[2], "_")
625626 if ((size(bpOrdRes) != NUMRES))
626627 then throw("All 6 resources should be passed")
627628 else if ((size(bpOrdMat) != NUMRES))
628629 then throw("All 6 materials should be passed")
629630 else {
630631 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [shopLandAssetId], nil))
631632 let currentWh = split_4C(wh, ":")
632633 let currWhRes = split(currentWh[whIdxRes], "_")
633634 let currWhMat = split(currentWh[whIdxMat], "_")
634635 let currWhProd = if ((currentWh[whIdxProd] == ""))
635636 then nil
636637 else split_4C(currentWh[whIdxProd], "_")
637638 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
638639 let ordKey = keyOrderByLand(shopLandAssetId)
639640 let whOrd = getOrder(ordKey)
640641 let whOrdRes = split(whOrd[ordIdxRes], "_")
641642 let whOrdMat = split(whOrd[ordIdxMat], "_")
642643 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
643644 then nil
644645 else split_4C(whOrd[ordIdxProd], "_")
645646 let r = {
646647 let $l = bpOrdRes
647648 let $s = size($l)
648649 let $acc0 = $Tuple13(nil, nil, nil, 0, 0, 0, 0, bpResList, currWhRes, whOrdRes, resTypes, false, 0)
649650 func $f0_1 ($a,$i) = if (($i >= $s))
650651 then $a
651652 else acceptCommon($a, $l[$i])
652653
653654 func $f0_2 ($a,$i) = if (($i >= $s))
654655 then $a
655656 else throw("List size exceeds 6")
656657
657658 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
658659 }
659660 let m = {
660661 let $l = bpOrdMat
661662 let $s = size($l)
662663 let $acc0 = $Tuple13(nil, nil, nil, r._4, r._5, r._6, 0, bpMatList, currWhMat, whOrdMat, matTypes, false, r._13)
663664 func $f1_1 ($a,$i) = if (($i >= $s))
664665 then $a
665666 else acceptCommon($a, $l[$i])
666667
667668 func $f1_2 ($a,$i) = if (($i >= $s))
668669 then $a
669670 else throw("List size exceeds 6")
670671
671672 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
672673 }
673674 let p = if ((size(bpOrdProd) != 0))
674675 then {
675676 let $l = bpOrdProd
676677 let $s = size($l)
677678 let $acc0 = $Tuple13(nil, nil, nil, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
678679 func $f2_1 ($a,$i) = if (($i >= $s))
679680 then $a
680681 else acceptCommon($a, $l[$i])
681682
682683 func $f2_2 ($a,$i) = if (($i >= $s))
683684 then $a
684685 else throw("List size exceeds 50")
685686
686687 $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)
687688 }
688689 else $Tuple13(currWhProd, whOrdProd, bpProdList, m._4, m._5, m._6, 0, bpProdList, currWhProd, whOrdProd, prodTypes, true, m._13)
689690 let volSaldo = p._4
690691 let newLockedVol = if ((0 > (currWhLockedVol - volSaldo)))
691692 then 0
692693 else (currWhLockedVol - volSaldo)
693694 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(r._1, "_"), makeString(m._1, "_"), makeString_2C(p._1, "_"), toString(newLockedVol)], ":")
694695 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString_2C(p._2, "_")], ":")
695696 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, shopLandAssetId], nil))
696697 let accStatsResult = asInt(invoke(stakingContract, "updateAccStats", [shopLandOwner, fraction(xpShop, p._13, MULT8)], nil))
697698 $Tuple10(StringEntry(ordKey, newWhOrdStr), r._3, m._3, p._3, p._5, p._6, p._13, shopLandOwner, whSave, accStatsResult)
698699 }
699700 }
700701 }
701702 }
702703 }
703704
704705
705706 func sellResourcesWorldInternal (amount) = {
706707 let oneRes = (amount / 30)
707708 let oneFactoryAmounts = [oneRes, oneRes, oneRes, oneRes, oneRes, oneRes]
708709 let s = toString(oneRes)
709710 let resList = [s, s, s, s, s, s]
710711 let minPrices = [0, 0, 0, 0, 0, 0]
711712 func oneFactory (acc,continent) = {
712713 let x = sellResourcesCommon(resList, continent, oneFactoryAmounts, minPrices)
713714 $Tuple3((acc._1 ++ x._1), (acc._2 + x._3), (acc._3 + x._4))
714715 }
715716
716- let $t02521325303 = {
717+ let $t02526125351 = {
717718 let $l = continents
718719 let $s = size($l)
719720 let $acc0 = $Tuple3(nil, 0, 0)
720721 func $f0_1 ($a,$i) = if (($i >= $s))
721722 then $a
722723 else oneFactory($a, $l[$i])
723724
724725 func $f0_2 ($a,$i) = if (($i >= $s))
725726 then $a
726727 else throw("List size exceeds 5")
727728
728729 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
729730 }
730- let factoryActions = $t02521325303._1
731- let usdtReceived = $t02521325303._2
732- let totalRes = $t02521325303._3
731+ let factoryActions = $t02526125351._1
732+ let usdtReceived = $t02526125351._2
733+ let totalRes = $t02526125351._3
733734 let fee = fraction(usdtReceived, DELIVERY_FEE, MULT6)
734735 let activitiesAmount = (usdtReceived / 100)
735736 let usdtLeft = ((usdtReceived - activitiesAmount) - fee)
736737 $Tuple5(factoryActions, usdtLeft, fee, activitiesAmount, totalRes)
737738 }
738739
739740
740741 @Callable(i)
741742 func recalcLockedVolumeREADONLY (landAssetId,wh) = {
742743 let currentOrd = getOrder(keyOrderByLand(landAssetId))
743744 let z = setInternal(wh, currentOrd, currentOrd)
744745 $Tuple2(nil, (z._4 + z._5))
745746 }
746747
747748
748749
749750 @Callable(i)
750751 func constructorV1 (restAddr) = if ((i.caller != this))
751752 then throw("Permission denied")
752753 else [StringEntry(keyRestAddress(), restAddr)]
753754
754755
755756
756757 @Callable(i)
757758 func sellResources (amounts,minPrices) = {
758759 let prologResult = prolog()
759760 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
760761 if ((size(i.payments) != 0))
761762 then throw("sellResources doesn't require any payments")
762763 else {
763764 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
764765 if ((curLocation[locIdxType] != "F"))
765766 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
766767 else {
767768 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
768769 let resList = split(currentPack[bpIdxRes], "_")
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
770+ let $t02680326929 = sellResourcesCommon(resList, curLocation[locIdxId], amounts, minPrices)
771+ let factoryActions = $t02680326929._1
772+ let newRes = $t02680326929._2
773+ let usdtReceived = $t02680326929._3
774+ let totalRes = $t02680326929._4
774775 let activitiesAmount = (usdtReceived / 100)
775776 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
776777 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
777778 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
778779 $Tuple2(((factoryActions :+ ScriptTransfer(i.caller, (usdtReceived - activitiesAmount), usdtAssetId)) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
779780 }
780781 }
781782 }
782783
783784
784785
785786 @Callable(i)
786787 func sellResourcesWorld (addr,amount) = if ((i.caller != acresContract))
787788 then throw("Permission denied")
788789 else {
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
790+ let $t02772127878 = sellResourcesWorldInternal(amount)
791+ let factoryActions = $t02772127878._1
792+ let usdtLeft = $t02772127878._2
793+ let fee = $t02772127878._3
794+ let activitiesAmount = $t02772127878._4
795+ let totalRes = $t02772127878._5
795796 if ((0 >= usdtLeft))
796797 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
797798 else {
798799 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
799800 $Tuple2((((factoryActions :+ IntegerEntry(deliveryFundKey, (valueOrElse(getInteger(deliveryFundKey), 0) + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ ScriptTransfer(investFundContract, usdtLeft, usdtAssetId)), $Tuple2(usdtLeft, statsResult))
800801 }
801802 }
802803
803804
804805
805806 @Callable(i)
806807 func sellResourcesWorldREADONLY (amount) = {
807808 let usdtLeft = sellResourcesWorldInternal(amount)._2
808809 $Tuple2(nil, usdtLeft)
809810 }
810811
811812
812813
813814 @Callable(i)
814815 func sellResourcesDuckDelivery (amounts,minPrices,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
815816 then throw("Delivery feature is turned off!")
816817 else {
817818 let prologResult = prolog()
818819 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
819820 if ((size(i.payments) != 0))
820821 then throw("sellResources doesn't require any payments")
821822 else {
822823 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
823824 let resList = split(currentPack[bpIdxRes], "_")
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
825+ let $t02911129232 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
826+ let factoryActions = $t02911129232._1
827+ let newRes = $t02911129232._2
828+ let usdtReceived = $t02911129232._3
829+ let totalRes = $t02911129232._4
829830 let newPack = makeString_2C([currentPack[bpIdxLevel], makeString(newRes, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
830831 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
831832 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalRes, MULT8)], nil))
832833 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
833834 let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
834835 then MIN_USDT_FEE_DELIVERY
835836 else feePart
836837 let activitiesAmount = (usdtReceived / 100)
837838 if ((fee >= (usdtReceived - activitiesAmount)))
838839 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
839840 else {
840841 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
841842 $Tuple2((((factoryActions :+ ScriptTransfer(i.caller, ((usdtReceived - activitiesAmount) - fee), usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
842843 }
843844 }
844845 }
845846
846847
847848
848849 @Callable(i)
849850 func sellResourcesLandDelivery (amounts,minPrices,landAssetId,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
850851 then throw("Delivery feature is turned off!")
851852 else {
852853 let prologResult = prolog()
853854 if ((size(i.payments) != 0))
854855 then throw("sellResources doesn't require any payments")
855856 else {
856857 let user = i.caller
857858 let addr = toString(user)
858859 let asset = value(assetInfo(fromBase58String(landAssetId)))
859860 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
860861 then throw((("NFT " + asset.name) + " is not staked"))
861862 else {
862863 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
863864 if ((owner != addr))
864865 then throw((LANDPREFIX + " is not yours"))
865866 else {
866867 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
867868 let currentWh = split_4C(wh, ":")
868869 let resList = split(currentWh[whIdxRes], "_")
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
870+ let $t03125931380 = sellResourcesCommon(resList, factoryContinent, amounts, minPrices)
871+ let factoryActions = $t03125931380._1
872+ let newRes = $t03125931380._2
873+ let usdtReceived = $t03125931380._3
874+ let totalRes = $t03125931380._4
874875 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), currentWh[whIdxMat], currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
875876 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
876877 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalRes, MULT8)], nil))
877878 let feePart = fraction(usdtReceived, DELIVERY_FEE, MULT6)
878879 let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
879880 then MIN_USDT_FEE_DELIVERY
880881 else feePart
881882 let activitiesAmount = (usdtReceived / 100)
882883 if ((fee >= (usdtReceived - activitiesAmount)))
883884 then throw(("This trade does not cover delivery cost of " + fixedPoint(fee, 6)))
884885 else {
885886 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
886887 $Tuple2((((factoryActions :+ ScriptTransfer(i.caller, ((usdtReceived - activitiesAmount) - fee), usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(whSave, prologResult, statsResult))
887888 }
888889 }
889890 }
890891 }
891892 }
892893
893894
894895
895896 @Callable(i)
896897 func buyMaterials (amounts,maxPrices) = {
897898 let prologResult = prolog()
898899 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
899900 if ((size(i.payments) != 1))
900901 then throw("exactly 1 payment must be attached")
901902 else {
902903 let pmt = i.payments[0]
903904 let amt = pmt.amount
904905 if (if (!(isDefined(pmt.assetId)))
905906 then true
906907 else (value(pmt.assetId) != usdtAssetId))
907908 then throw("USDT payments only!")
908909 else {
909910 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
910911 if ((curLocation[locIdxType] != "F"))
911912 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
912913 else {
913914 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
914915 let matList = split(currentPack[bpIdxMat], "_")
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
916+ let $t03324033362 = buyMaterialsCommon(matList, curLocation[locIdxId], amounts, maxPrices)
917+ let factoryActions = $t03324033362._1
918+ let newMat = $t03324033362._2
919+ let usdtSpent = $t03324033362._3
920+ let totalMat = $t03324033362._4
920921 if ((usdtSpent > amt))
921922 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
922923 else {
923924 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
924925 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
925926 let rest = if (((amt - usdtSpent) > 0))
926927 then [ScriptTransfer(i.caller, (amt - usdtSpent), usdtAssetId)]
927928 else nil
928929 let activitiesAmount = (usdtSpent / 100)
929930 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
930931 $Tuple2(((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
931932 }
932933 }
933934 }
934935 }
935936 }
936937
937938
938939
939940 @Callable(i)
940941 func buyMaterialsDuckDelivery (amounts,maxPrices,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
941942 then throw("Delivery feature is turned off!")
942943 else {
943944 let prologResult = prolog()
944945 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
945946 if ((size(i.payments) != 1))
946947 then throw("exactly 1 payment must be attached")
947948 else {
948949 let pmt = i.payments[0]
949950 let amt = pmt.amount
950951 if (if (!(isDefined(pmt.assetId)))
951952 then true
952953 else (value(pmt.assetId) != usdtAssetId))
953954 then throw("USDT payments only!")
954955 else {
955956 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
956957 let matList = split(currentPack[bpIdxMat], "_")
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
958+ let $t03488034997 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
959+ let factoryActions = $t03488034997._1
960+ let newMat = $t03488034997._2
961+ let usdtSpent = $t03488034997._3
962+ let totalMat = $t03488034997._4
962963 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
963964 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
964965 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalMat, MULT8)], nil))
965966 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
966967 let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
967968 then MIN_USDT_FEE_DELIVERY
968969 else feePart
969970 let usdtSpentWithFee = (usdtSpent + fee)
970971 if ((usdtSpentWithFee > amt))
971972 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
972973 else {
973974 let rest = if (((amt - usdtSpentWithFee) > 0))
974975 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
975976 else nil
976977 let activitiesAmount = (usdtSpent / 100)
977978 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
978979 $Tuple2((((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
979980 }
980981 }
981982 }
982983 }
983984
984985
985986
986987 @Callable(i)
987988 func buyMaterialsLandDelivery (amounts,maxPrices,landAssetId,factoryContinent) = if (!(KS_ALLOW_DELIVERY))
988989 then throw("Delivery feature is turned off!")
989990 else {
990991 let prologResult = prolog()
991992 if ((size(i.payments) != 1))
992993 then throw("exactly 1 payment must be attached")
993994 else {
994995 let pmt = i.payments[0]
995996 let amt = pmt.amount
996997 if (if (!(isDefined(pmt.assetId)))
997998 then true
998999 else (value(pmt.assetId) != usdtAssetId))
9991000 then throw("USDT payments only!")
10001001 else {
10011002 let user = i.caller
10021003 let addr = toString(user)
10031004 let asset = value(assetInfo(fromBase58String(landAssetId)))
10041005 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
10051006 then throw((("NFT " + asset.name) + " is not staked"))
10061007 else {
10071008 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
10081009 if ((owner != addr))
10091010 then throw((LANDPREFIX + " is not yours"))
10101011 else {
10111012 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
10121013 let currentWh = split_4C(wh, ":")
10131014 let matList = split(currentWh[whIdxMat], "_")
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
1015+ let $t03727537392 = buyMaterialsCommon(matList, factoryContinent, amounts, maxPrices)
1016+ let factoryActions = $t03727537392._1
1017+ let newMat = $t03727537392._2
1018+ let usdtSpent = $t03727537392._3
1019+ let totalMat = $t03727537392._4
10191020 let whStr = makeString_2C([currentWh[whIdxLevels], currentWh[whIdxRes], makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
10201021 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
10211022 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalMat, MULT8)], nil))
10221023 let feePart = fraction(usdtSpent, DELIVERY_FEE, MULT6)
10231024 let fee = if ((MIN_USDT_FEE_DELIVERY > feePart))
10241025 then MIN_USDT_FEE_DELIVERY
10251026 else feePart
10261027 let usdtSpentWithFee = (usdtSpent + fee)
10271028 if ((usdtSpentWithFee > amt))
10281029 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
10291030 else {
10301031 let rest = if (((amt - usdtSpentWithFee) > 0))
10311032 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
10321033 else nil
10331034 let activitiesAmount = (usdtSpent / 100)
10341035 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
10351036 $Tuple2((((factoryActions ++ rest) :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
10361037 }
10371038 }
10381039 }
10391040 }
10401041 }
10411042 }
10421043
10431044
10441045
10451046 @Callable(i)
10461047 func exchangeResources (amounts) = {
10471048 let prologResult = prolog()
10481049 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
10491050 if ((size(i.payments) != 1))
10501051 then throw("exactly 1 payment must be attached")
10511052 else {
10521053 let pmt = i.payments[0]
10531054 let amt = pmt.amount
10541055 if (if (!(isDefined(pmt.assetId)))
10551056 then true
10561057 else (value(pmt.assetId) != usdtAssetId))
10571058 then throw("USDT payments only!")
10581059 else {
10591060 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
10601061 if ((curLocation[locIdxType] != "F"))
10611062 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
10621063 else {
10631064 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
10641065 let resList = split(currentPack[bpIdxRes], "_")
10651066 let matList = split(currentPack[bpIdxMat], "_")
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
1067+ let $t03950639612 = exchangeResourcesCommon(resList, matList, amounts)
1068+ let newRes = $t03950639612._1
1069+ let newMat = $t03950639612._2
1070+ let usdtSpent = $t03950639612._3
1071+ let totalAmountConverted = $t03950639612._4
10711072 if ((usdtSpent > amt))
10721073 then throw(((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)))
10731074 else {
10741075 let newPack = makeString([currentPack[bpIdxLevel], makeString(newRes, "_"), makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
10751076 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
10761077 let rest = if (((amt - usdtSpent) > 0))
10771078 then [ScriptTransfer(i.caller, (amt - usdtSpent), usdtAssetId)]
10781079 else nil
10791080 let activitiesAmount = (usdtSpent / 100)
10801081 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
10811082 $Tuple2((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)), $Tuple3(backpackResult, prologResult, statsResult))
10821083 }
10831084 }
10841085 }
10851086 }
10861087 }
10871088
10881089
10891090
10901091 @Callable(i)
10911092 func exchangeResourcesDuckDelivery (amounts) = {
10921093 let prologResult = prolog()
10931094 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
10941095 if ((size(i.payments) != 1))
10951096 then throw("exactly 1 payment must be attached")
10961097 else {
10971098 let pmt = i.payments[0]
10981099 let amt = pmt.amount
10991100 if (if (!(isDefined(pmt.assetId)))
11001101 then true
11011102 else (value(pmt.assetId) != usdtAssetId))
11021103 then throw("USDT payments only!")
11031104 else {
11041105 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
11051106 let resList = split(currentPack[bpIdxRes], "_")
11061107 let matList = split(currentPack[bpIdxMat], "_")
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
1108+ let $t04104741153 = exchangeResourcesCommon(resList, matList, amounts)
1109+ let newRes = $t04104741153._1
1110+ let newMat = $t04104741153._2
1111+ let usdtSpent = $t04104741153._3
1112+ let totalAmountConverted = $t04104741153._4
11121113 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
11131114 let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
11141115 then MIN_USDT_FEE_DELIVERY15
11151116 else feePart
11161117 let usdtSpentWithFee = (usdtSpent + fee)
11171118 if ((usdtSpentWithFee > amt))
11181119 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
11191120 else {
11201121 let newPack = makeString([currentPack[bpIdxLevel], makeString(newRes, "_"), makeString(newMat, "_"), currentPack[bpIdxProd]], ":")
11211122 let backpackResult = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
11221123 let rest = if (((amt - usdtSpentWithFee) > 0))
11231124 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
11241125 else nil
11251126 let activitiesAmount = (usdtSpent / 100)
11261127 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
11271128 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
11281129 $Tuple2(((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(backpackResult, prologResult, statsResult))
11291130 }
11301131 }
11311132 }
11321133 }
11331134
11341135
11351136
11361137 @Callable(i)
11371138 func exchangeResourcesLandDelivery (amounts,landAssetId) = {
11381139 let prologResult = prolog()
11391140 if ((size(i.payments) != 1))
11401141 then throw("exactly 1 payment must be attached")
11411142 else {
11421143 let pmt = i.payments[0]
11431144 let amt = pmt.amount
11441145 if (if (!(isDefined(pmt.assetId)))
11451146 then true
11461147 else (value(pmt.assetId) != usdtAssetId))
11471148 then throw("USDT payments only!")
11481149 else {
11491150 let user = i.caller
11501151 let addr = toString(user)
11511152 let asset = value(assetInfo(fromBase58String(landAssetId)))
11521153 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
11531154 then throw((("NFT " + asset.name) + " is not staked"))
11541155 else {
11551156 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
11561157 if ((owner != addr))
11571158 then throw((LANDPREFIX + " is not yours"))
11581159 else {
11591160 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
11601161 let currentWh = split_4C(wh, ":")
11611162 let resList = split(currentWh[whIdxRes], "_")
11621163 let matList = split(currentWh[whIdxMat], "_")
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
1164+ let $t04337643482 = exchangeResourcesCommon(resList, matList, amounts)
1165+ let newRes = $t04337643482._1
1166+ let newMat = $t04337643482._2
1167+ let usdtSpent = $t04337643482._3
1168+ let totalAmountConverted = $t04337643482._4
11681169 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newRes, "_"), makeString(newMat, "_"), currentWh[whIdxProd], currentWh[whIdxLOFT]], ":")
11691170 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
11701171 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [addr, fraction(xpTrade, totalAmountConverted, MULT8)], nil))
11711172 let feePart = fraction(usdtSpent, DELIVERY_FEE15, MULT6)
11721173 let fee = if ((MIN_USDT_FEE_DELIVERY15 > feePart))
11731174 then MIN_USDT_FEE_DELIVERY15
11741175 else feePart
11751176 let usdtSpentWithFee = (usdtSpent + fee)
11761177 if ((usdtSpentWithFee > amt))
11771178 then throw((((((("Insufficient payment! Attached=" + fixedPoint(amt, 6)) + ", required=") + fixedPoint(usdtSpent, 6)) + "+") + fixedPoint(fee, 6)) + "(delivery fee)"))
11781179 else {
11791180 let rest = if (((amt - usdtSpentWithFee) > 0))
11801181 then [ScriptTransfer(i.caller, (amt - usdtSpentWithFee), usdtAssetId)]
11811182 else nil
11821183 let activitiesAmount = (usdtSpent / 100)
11831184 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
11841185 $Tuple2(((rest :+ ScriptTransfer(restContract, activitiesAmount, usdtAssetId)) :+ IntegerEntry(deliveryFundKey, (fundTotal + fee))), $Tuple3(whSave, prologResult, statsResult))
11851186 }
11861187 }
11871188 }
11881189 }
11891190 }
11901191 }
11911192
11921193
11931194
11941195 @Callable(i)
11951196 func craftGoods (productIdx,quantity) = {
11961197 let prologResult = prolog()
11971198 if ((size(i.payments) != 1))
11981199 then throw("exactly 1 payment must be attached")
11991200 else {
12001201 let pmt = i.payments[0]
12011202 let amt = pmt.amount
12021203 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
12031204 if ((pmtAssetId != usdtAssetId))
12041205 then throw("USDT payments only!")
12051206 else if ((amt != MULT6))
12061207 then throw("exactly 1 USDT must be attached as payment")
12071208 else if ((0 >= quantity))
12081209 then throw("Quantity should be positive")
12091210 else {
12101211 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
12111212 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
12121213 if ((curLocation[locIdxType] != "M"))
12131214 then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
12141215 else {
12151216 let cont = curLocation[locIdxContinent]
12161217 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
12171218 let matList = split(currentPack[bpIdxMat], "_")
12181219 if (if ((0 > productIdx))
12191220 then true
12201221 else (productIdx >= size(productionMatrix)))
12211222 then throw(("Unknown product idx=" + toString(productIdx)))
12221223 else {
12231224 let recipe = split(productionMatrix[productIdx], "_")
12241225 if ((size(recipe) != RECIPESIZE))
12251226 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
12261227 else {
12271228 let productContIdx = parseIntValue(recipe[rIdxContinent])
12281229 if ((continents[productContIdx] != cont))
12291230 then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
12301231 else {
12311232 let prodList = if ((currentPack[bpIdxProd] == ""))
12321233 then nil
12331234 else split_4C(currentPack[bpIdxProd], "_")
12341235 func filler (acc,ignoredItem) = {
12351236 let n = acc._2
12361237 let xs = if ((size(prodList) > n))
12371238 then prodList[n]
12381239 else "0"
12391240 let x = parseIntValue(xs)
12401241 let amount = (quantity * PRODUCTPKGSIZE)
12411242 let y = if ((n == productIdx))
12421243 then toString((x + amount))
12431244 else xs
12441245 $Tuple2((acc._1 :+ y), (n + 1))
12451246 }
12461247
12471248 let bpProd = ( let $l = productionMatrix
12481249 let $s = size($l)
12491250 let $acc0 = $Tuple2(nil, 0)
12501251 func $f0_1 ($a,$i) = if (($i >= $s))
12511252 then $a
12521253 else filler($a, $l[$i])
12531254
12541255 func $f0_2 ($a,$i) = if (($i >= $s))
12551256 then $a
12561257 else throw("List size exceeds 50")
12571258
12581259 $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
12591260 func producer (acc,j) = {
12601261 let needMat = (((parseIntValue(recipe[j]) * MULT5) * quantity) * parseIntValue(recipe[rIdxCoeff]))
12611262 let haveMat = parseIntValue(matList[j])
12621263 if ((needMat > haveMat))
12631264 then throw(((((((("You have " + fixedPoint(haveMat, 8)) + " of ") + matTypes[j]) + ", but recipe requires ") + fixedPoint(needMat, 8)) + " for quantity ") + toString(quantity)))
12641265 else if ((needMat > 0))
12651266 then $Tuple2((acc._1 :+ toString((haveMat - needMat))), (acc._2 + needMat))
12661267 else $Tuple2((acc._1 :+ matList[j]), acc._2)
12671268 }
12681269
12691270 let merged = {
12701271 let $l = ITER6
12711272 let $s = size($l)
12721273 let $acc0 = $Tuple2(nil, 0)
12731274 func $f1_1 ($a,$i) = if (($i >= $s))
12741275 then $a
12751276 else producer($a, $l[$i])
12761277
12771278 func $f1_2 ($a,$i) = if (($i >= $s))
12781279 then $a
12791280 else throw("List size exceeds 6")
12801281
12811282 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12821283 }
12831284 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._1, "_"), makeString_2C(bpProd, "_")], ":")
12841285 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
12851286 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpCraft, merged._2, MULT8)], nil))
12861287 $Tuple2(nil, $Tuple3(result, prologResult, statsResult))
12871288 }
12881289 }
12891290 }
12901291 }
12911292 }
12921293 }
12931294 }
12941295
12951296
12961297
12971298 @Callable(i)
12981299 func setWarehouseOrder (newOrderStr,landAssetId) = {
12991300 let user = i.originCaller
13001301 let addr = toString(user)
13011302 let result = if ((user != restContract))
13021303 then checkBlocked()
13031304 else false
13041305 let asset = value(assetInfo(fromBase58String(landAssetId)))
13051306 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
13061307 then throw((("NFT " + asset.name) + " is not staked"))
13071308 else {
13081309 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
13091310 if (if ((user != restContract))
13101311 then (owner != addr)
13111312 else false)
13121313 then throw((LANDPREFIX + " is not yours"))
13131314 else {
13141315 let newOrder = split_4C(newOrderStr, ":")
13151316 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
13161317 let currentWh = split_4C(wh, ":")
13171318 let loft = split(currentWh[whIdxLOFT], "_")
13181319 let whTotal = parseIntValue(loft[volTotal])
13191320 let ordKey = keyOrderByLand(landAssetId)
13201321 let currentOrd = getOrder(ordKey)
13211322 let z = setInternal(currentWh, currentOrd, newOrder)
13221323 let buyVolSaldo = z._4
13231324 let sellVolSaldo = z._5
13241325 let whOccupied = z._7
13251326 let whLocked = (buyVolSaldo + sellVolSaldo)
13261327 let whFree = ((whTotal - whOccupied) - whLocked)
13271328 if ((0 > whFree))
13281329 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"))
13291330 else {
13301331 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(z._1, "_"), makeString(z._2, "_"), makeString_2C(z._3, "_"), toString(whLocked)], ":")
13311332 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil))
13321333 let usdSaldo = z._6
13331334 let actions = if ((usdSaldo > 0))
13341335 then if ((size(i.payments) != 1))
13351336 then throw("exactly 1 payment must be attached")
13361337 else {
13371338 let pmt = i.payments[0]
13381339 let amt = pmt.amount
13391340 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
13401341 if ((pmtAssetId != usdtAssetId))
13411342 then throw("USDT payments only!")
13421343 else if ((amt != usdSaldo))
13431344 then throw(("Payment needed is " + toString(usdSaldo)))
13441345 else [StringEntry(ordKey, newOrderStr)]
13451346 }
13461347 else if ((usdSaldo == 0))
13471348 then if ((size(i.payments) != 0))
13481349 then throw("No payments needed")
13491350 else [StringEntry(ordKey, newOrderStr)]
13501351 else if ((size(i.payments) != 0))
13511352 then throw("No payments needed")
13521353 else [ScriptTransfer(addressFromStringValue(owner), -(usdSaldo), usdtAssetId), StringEntry(ordKey, newOrderStr)]
13531354 $Tuple2(actions, $Tuple2(result, whSave))
13541355 }
13551356 }
13561357 }
13571358 }
13581359
13591360
13601361
13611362 @Callable(i)
13621363 func acceptWarehouseOrder (bpOrderStr,shopLandAssetId,duckAssetId) = {
13631364 let prologResult = prolog()
13641365 let caller = i.originCaller
13651366 let callerAddr = toString(caller)
13661367 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
13671368 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
13681369 let loc = split(value(curLocation), "_")
13691370 if ((loc[locIdxType] != "L"))
13701371 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
13711372 else if ((stakedDuckAssetId != duckAssetId))
13721373 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
13731374 else {
13741375 let bpKey = keyBackpackByDuck(duckAssetId)
13751376 let currentPack = getBackpack(bpKey)
13761377 let bpResList = split(currentPack[bpIdxRes], "_")
13771378 let bpMatList = split(currentPack[bpIdxMat], "_")
13781379 let bpProdList = if ((currentPack[bpIdxProd] == ""))
13791380 then nil
13801381 else split_4C(currentPack[bpIdxProd], "_")
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
1382+ let $t05299453234 = acceptShopOrderCommon(shopLandAssetId, callerAddr, bpOrderStr, bpResList, bpMatList, bpProdList)
1383+ let shopAction = $t05299453234._1
1384+ let newUserRes = $t05299453234._2
1385+ let newUserMat = $t05299453234._3
1386+ let newUserProd = $t05299453234._4
1387+ let usdWh2BpSaldo = $t05299453234._5
1388+ let usdBp2WhSaldo = $t05299453234._6
1389+ let xpAmount = $t05299453234._7
1390+ let shopLandOwner = $t05299453234._8
1391+ let shopWhSave = $t05299453234._9
1392+ let accStatsResult = $t05299453234._10
13921393 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, 0)]
13931394 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, 0)
13941395 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
13951396 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
13961397 let duckStatsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpShop, xpAmount, MULT8)], nil))
13971398 $Tuple2((actions1 ++ actions2), $Tuple5(prologResult, shopWhSave, bpSave, duckStatsResult, accStatsResult))
13981399 }
13991400 }
14001401
14011402
14021403
14031404 @Callable(i)
14041405 func acceptShopOrderDuckDelivery (orderStr,shopLandAssetId) = if (!(KS_ALLOW_DELIVERY))
14051406 then throw("Delivery feature is turned off!")
14061407 else {
14071408 let prologResult = prolog()
14081409 let caller = i.originCaller
14091410 let callerAddr = toString(caller)
14101411 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
14111412 let bpKey = keyBackpackByDuck(duckAssetId)
14121413 let currentPack = getBackpack(bpKey)
14131414 let bpResList = split(currentPack[bpIdxRes], "_")
14141415 let bpMatList = split(currentPack[bpIdxMat], "_")
14151416 let bpProdList = if ((currentPack[bpIdxProd] == ""))
14161417 then nil
14171418 else split_4C(currentPack[bpIdxProd], "_")
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
1419+ let $t05467354911 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, bpResList, bpMatList, bpProdList)
1420+ let shopAction = $t05467354911._1
1421+ let newUserRes = $t05467354911._2
1422+ let newUserMat = $t05467354911._3
1423+ let newUserProd = $t05467354911._4
1424+ let usdWh2BpSaldo = $t05467354911._5
1425+ let usdBp2WhSaldo = $t05467354911._6
1426+ let xpAmount = $t05467354911._7
1427+ let shopLandOwner = $t05467354911._8
1428+ let shopWhSave = $t05467354911._9
1429+ let accStatsResult = $t05467354911._10
14291430 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
14301431 let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
14311432 then MIN_USDT_FEE_DELIVERY
14321433 else deliveryFeePart
14331434 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
14341435 let receivedFee = (deliveryFee - spentFee)
14351436 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
14361437 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, receivedFee)]
14371438 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, spentFee)
14381439 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString_2C(newUserProd, "_")], ":")
14391440 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
14401441 let duckStatsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpShop, xpAmount, MULT8)], nil))
14411442 $Tuple2(((actions1 ++ actions2) :+ IntegerEntry(deliveryFundKey, (fundTotal + deliveryFee))), $Tuple5(prologResult, shopWhSave, bpSave, duckStatsResult, accStatsResult))
14421443 }
14431444
14441445
14451446
14461447 @Callable(i)
14471448 func acceptShopOrderLandDelivery (orderStr,shopLandAssetId,myLandAssetId) = if (!(KS_ALLOW_DELIVERY))
14481449 then throw("Delivery feature is turned off!")
14491450 else {
14501451 let prologResult = prolog()
14511452 let caller = i.originCaller
14521453 let callerAddr = toString(caller)
14531454 let asset = value(assetInfo(fromBase58String(myLandAssetId)))
14541455 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(myLandAssetId)))))
14551456 then throw((("NFT " + asset.name) + " is not staked"))
14561457 else {
14571458 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(myLandAssetId)), (("NFT " + asset.name) + " is orphaned"))
14581459 if ((owner != callerAddr))
14591460 then throw((LANDPREFIX + " is not yours"))
14601461 else {
14611462 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [myLandAssetId], nil))
14621463 let currentWh = split_4C(wh, ":")
14631464 let resList = split(currentWh[whIdxRes], "_")
14641465 let matList = split(currentWh[whIdxMat], "_")
14651466 let prodList = if ((currentWh[whIdxProd] == ""))
14661467 then nil
14671468 else split(currentWh[whIdxProd], "_")
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
1469+ let $t05715057382 = acceptShopOrderCommon(shopLandAssetId, callerAddr, orderStr, resList, matList, prodList)
1470+ let shopAction = $t05715057382._1
1471+ let newUserRes = $t05715057382._2
1472+ let newUserMat = $t05715057382._3
1473+ let newUserProd = $t05715057382._4
1474+ let usdWh2BpSaldo = $t05715057382._5
1475+ let usdBp2WhSaldo = $t05715057382._6
1476+ let xpAmount = $t05715057382._7
1477+ let shopLandOwner = $t05715057382._8
1478+ let shopWhSave = $t05715057382._9
1479+ let accStatsResult = $t05715057382._10
14791480 let deliveryFeePart = fraction((usdBp2WhSaldo + usdWh2BpSaldo), DELIVERY_FEE, MULT6)
14801481 let deliveryFee = if ((MIN_USDT_FEE_DELIVERY > deliveryFeePart))
14811482 then MIN_USDT_FEE_DELIVERY
14821483 else deliveryFeePart
14831484 let spentFee = fraction(deliveryFee, usdBp2WhSaldo, (usdBp2WhSaldo + usdWh2BpSaldo))
14841485 let receivedFee = (deliveryFee - spentFee)
14851486 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
14861487 let actions1 = [shopAction, shop2userActions(usdWh2BpSaldo, callerAddr, receivedFee)]
14871488 let actions2 = user2shopActions(usdBp2WhSaldo, i.payments, shopLandOwner, spentFee)
14881489 let whStr = makeString_2C([currentWh[whIdxLevels], makeString(newUserRes, "_"), makeString(newUserMat, "_"), makeString(newUserProd, "_"), currentWh[whIdxLOFT]], ":")
14891490 let whSave = asString(invoke(stakingContract, "saveWarehouse", [whStr, myLandAssetId], nil))
14901491 let statsResult = asInt(invoke(stakingContract, "updateAccStats", [callerAddr, fraction(xpShop, xpAmount, MULT8)], nil))
14911492 $Tuple2(((actions1 ++ actions2) :+ IntegerEntry(deliveryFundKey, (fundTotal + deliveryFee))), $Tuple5(prologResult, shopWhSave, whSave, statsResult, accStatsResult))
14921493 }
14931494 }
14941495 }
14951496
14961497
14971498
14981499 @Callable(i)
14991500 func sellProductsToES (amounts) = {
15001501 let prologResult = prolog()
15011502 if ((size(i.payments) != 0))
15021503 then throw("No payments needed")
15031504 else {
15041505 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
15051506 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
15061507 if ((curLocation[locIdxType] != "A"))
15071508 then throw(("Duck location type should be Airport, but is " + curLocation[locIdxType]))
15081509 else {
15091510 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
15101511 let prodList = if ((currentPack[bpIdxProd] == ""))
15111512 then nil
15121513 else split_4C(currentPack[bpIdxProd], "_")
15131514 let esKey = keyEsWarehouse()
15141515 let existStr = getString(esKey)
15151516 let existAmounts = if (isDefined(existStr))
15161517 then split_4C(value(existStr), "_")
15171518 else nil
15181519 func moveProd (acc,recipeStr) = {
15191520 let j = acc._1
15201521 let quantity = if ((size(amounts) > j))
15211522 then amounts[j]
15221523 else 0
15231524 if ((0 > quantity))
15241525 then throw("Quantity cannot be negative")
15251526 else {
15261527 let recipe = split(recipeStr, "_")
15271528 if ((size(recipe) != RECIPESIZE))
15281529 then throw(("Fatal: unknown recipe: " + recipeStr))
15291530 else {
15301531 let maxAmount = (ESMAXPACKAGES * PRODUCTPKGSIZE)
15311532 let existAmount = if ((size(existAmounts) > j))
15321533 then parseIntValue(existAmounts[j])
15331534 else 0
15341535 let canBuy = (maxAmount - existAmount)
15351536 if ((quantity > canBuy))
15361537 then throw(((("Warehouse can buy only " + toString(canBuy)) + " of ") + prodTypes[j]))
15371538 else {
15381539 let totalMat = getRecipeMaterials(recipe)
15391540 let unitPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
15401541 let bpProdAmount = if ((size(prodList) > j))
15411542 then parseIntValue(prodList[j])
15421543 else 0
15431544 if ((quantity > bpProdAmount))
15441545 then throw(((("You have only " + toString(bpProdAmount)) + " of ") + prodTypes[j]))
15451546 else $Tuple5((j + 1), (acc._2 + (unitPrice * quantity)), (acc._3 :+ toString((bpProdAmount - quantity))), (acc._4 :+ toString((existAmount + quantity))), (acc._5 + (totalMat * quantity)))
15461547 }
15471548 }
15481549 }
15491550 }
15501551
15511552 let merged = {
15521553 let $l = productionMatrix
15531554 let $s = size($l)
15541555 let $acc0 = $Tuple5(0, 0, nil, nil, 0)
15551556 func $f0_1 ($a,$i) = if (($i >= $s))
15561557 then $a
15571558 else moveProd($a, $l[$i])
15581559
15591560 func $f0_2 ($a,$i) = if (($i >= $s))
15601561 then $a
15611562 else throw("List size exceeds 50")
15621563
15631564 $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)
15641565 }
15651566 let newBpStr = makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], makeString_2C(merged._3, "_")], ":")
15661567 let bpSave = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil))
15671568 let statsResult = asInt(invoke(stakingContract, "updateDuckStats", [duckAssetId, fraction(xpSellToEs, merged._5, (MULT8 * 10))], nil))
15681569 $Tuple2([StringEntry(esKey, makeString_2C(merged._4, "_")), ScriptTransfer(i.caller, merged._2, usdtAssetId)], $Tuple3(bpSave, prologResult, statsResult))
15691570 }
15701571 }
15711572 }
15721573
15731574
15741575
15751576 @Callable(i)
15761577 func updateEsStorage (newStorage) = if ((i.caller != stakingContract))
15771578 then throw("Permission denied")
15781579 else $Tuple2([StringEntry(keyEsWarehouse(), newStorage)], newStorage)
15791580
15801581
15811582
15821583 @Callable(i)
15831584 func updateDeliveryLocked (newAmount) = if ((i.caller != stakingContract))
15841585 then throw("Permission denied")
15851586 else $Tuple2([IntegerEntry(deliveryLockedKey, newAmount)], newAmount)
15861587
15871588
15881589
15891590 @Callable(i)
15901591 func sendDeliveryReward (addr) = if ((i.caller != stakingContract))
15911592 then throw("Permission denied")
15921593 else {
15931594 let fundTotal = valueOrElse(getInteger(deliveryFundKey), 0)
15941595 let lockedTotal = valueOrElse(getInteger(deliveryLockedKey), 0)
15951596 $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)
15961597 }
15971598
15981599

github/deemru/w8io/873ac7e 
258.62 ms