tx · 9rzB6GGAFMAuJ1jLX4VbRdJGtrGjhMRCLz1cKKGkETws

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.03900000 Waves

2024.12.15 02:28 [3414917] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "9rzB6GGAFMAuJ1jLX4VbRdJGtrGjhMRCLz1cKKGkETws", "fee": 3900000, "feeAssetId": null, "timestamp": 1734218937829, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "3UHfZTMWLDpyYKtiMrEkNyaAt2vrtwKzNjdCcCnBb37YVtjda8bsuC86VS6C6gcTKDZ8ABrwwCjtJruv546XdC5s" ], "script": "base64:BgJbCAISABIECgIICBIDCgEEEgMKAQESABIFCgMIAQQSABIDCgEBEgASBAoCCAESABIDCgEIEgMKAQgSBAoCCAESAwoBCBIECgIIBBIAEgMKAQgSABIAEgASAwoBAZABAANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ3AICt4gQABU1VTFQ4AIDC1y8ABk1VTFQxNACAgOmDsd4WAApEQVlfTUlMTElTAIC4mSkAFVVTRFQyQUNSRVNfTVVMVElQTElFUgAKABNPTkVfUEVSQ0VOVF9ESVZJU09SAGQADFJBTkRPTV9ERUxBWQACABRORlRfQ0hFU1RfUFJJQ0VfVVNEVADAlrECAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQAXREFJTFlfUFJPTU9fU1RBUlRfQkxPQ0sEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAgO+RAgMJAAACAQFUBQckbWF0Y2gwAMCm0AEJAAIBAg1Vbmtub3duIGNoYWluABVEQUlMWV9QUk9NT19FTkRfQkxPQ0sEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAoNuTAgMJAAACAQFUBQckbWF0Y2gwAOCS0gEJAAIBAg1Vbmtub3duIGNoYWluAApEQVlfQkxPQ0tTBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAKALAwkAAAIBAVQFByRtYXRjaDAAPAkAAgECDVVua25vd24gY2hhaW4AC1dFRUtfQkxPQ0tTBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAOBOAwkAAAIBAVQFByRtYXRjaDAAtAEJAAIBAg1Vbmtub3duIGNoYWluAApWUkZfT0ZGU0VUBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAAADCQAAAgEBVAUHJG1hdGNoMACQ+UUJAAIBAg1Vbmtub3duIGNoYWluAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUEZ3WXRhOGJpRXozMXpwZUZlNURKSzh3RTV0clNwUVZGOAMJAAACAQFUBQckbWF0Y2gwAiMzTjdVdVlhcjYyNjRQNThGQmhWV0tQUUFoNFl1YTJoZ25ndgkAAgECDVVua25vd24gY2hhaW4ADmFyYml0cmFnZURlbGF5BAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwBQpEQVlfTUlMTElTAwkAAAIBAVQFByRtYXRjaDAA4NQDCQACAQINVW5rbm93biBjaGFpbgAVb2xkU3Rha2luZ0NvbnRyYWN0U3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUExuY1h0UzFVODNENmNRYkZEM0g4ckJIUExnenhTRktaMQMJAAACAQFUBQckbWF0Y2gwAiMzTkRDeUJHNXE4NUp1YVJpaWdVZUV0YWlueWpDUVQzWHBabQkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABBJZHhDZmdBY3JlczJEYXBwAAEADUlkeENmZ1dsZ0RhcHAAAgAUSWR4Q2ZnSW52ZXN0RnVuZERhcHAABQAQSWR4Q2ZnTWFya2V0RGFwcAAGAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBD2tleVJlc3QyQWRkcmVzcwACDSVzX19yZXN0MkFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAghyZXN0MkNmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCHJlc3QyQ2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAAObWFya2V0Q29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUQSWR4Q2ZnTWFya2V0RGFwcAATb2xkQWNyZXNDb250cmFjdEtleQIQb2xkQWNyZXNDb250cmFjdAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEEYWRkcgkArAICAhNsYXN0V2Vla1R4SWRCeVVzZXJfBQRhZGRyARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEEYWRkcgkArAICAhJjdXJXZWVrVHhJZEJ5VXNlcl8FBGFkZHIBCWtleUNvbW1pdAEHYWRkcmVzcwkArAICAg9maW5pc2hCbG9ja0Zvcl8FB2FkZHJlc3MADXdsZ0Fzc2V0SWRLZXkCC3dsZ19hc3NldElkAAp3bGdBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgULd2xnQ29udHJhY3QFDXdsZ0Fzc2V0SWRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAAUYWNyZXNJc3N1ZWRBbW91bnRLZXkCEWFjcmVzSXNzdWVkQW1vdW50AA9hY3Jlc0Fzc2V0SWRLZXkCDGFjcmVzQXNzZXRJZAAMYWNyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgUOYWNyZXMyQ29udHJhY3QFD2FjcmVzQXNzZXRJZEtleQIXQUNSRVMgaXMgbm90IGlzc3VlZCB5ZXQBGGtleUFjcmVzU3Rha2VkVGltZUJ5VXNlcgEEYWRkcgkArAICAhZhY3Jlc1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBCW93bmVyQWRkcgkArAICAhNzdGFrZWRMYW5kc0J5T3duZXJfBQlvd25lckFkZHIBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBHmtleVN0YWtlZFRpbWVCeUFzc2V0SWRBbmRPd25lcgIHYXNzZXRJZARhZGRyCQCsAgIJAKwCAgkArAICAgNzdF8FB2Fzc2V0SWQCAV8FBGFkZHIBFGtleVN0YWtlZE5GVHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkTkZUc0J5T3duZXJfBQlvd25lckFkZHIBEWtleVVzZXJQcm9tb0FjcmVzAQdhZGRyZXNzCQCsAgICC3Byb21vQWNyZXNfBQdhZGRyZXNzARNrZXlVc2VyUHJvbW9UaWNrZXRzAQdhZGRyZXNzCQCsAgICDXByb21vVGlja2V0c18FB2FkZHJlc3MAFGtleVRvdGFsUHJvbW9UaWNrZXRzAhF0b3RhbFByb21vVGlja2V0cwALa2V5UHJvbW9NYXACCHByb21vTWFwARRrZXlQcm9tb1JvdW5kV2lubmVycwEDZGF5CQCsAgICDWRhaWx5V2lubmVyc18JAKQDAQUDZGF5ABJwcm9tb0F3YXJkUGVyUm91bmQJAMwIAgAACQDMCAIAgMq17gEJAMwIAgCAwtcvCQDMCAIAgMLXLwkAzAgCAIDC1y8JAMwIAgCAwtcvBQNuaWwBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEMYXNUdXBsZTVJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAhkoSW50LCBJbnQsIEludCwgSW50LCBJbnQpBAF0BQckbWF0Y2gwBQF0CQACAQIrZmFpbCB0byBjYXN0IGludG8gKEludCwgSW50LCBJbnQsIEludCwgSW50KQEMYXNUdXBsZTRJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAhQoSW50LCBJbnQsIEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECJmZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCwgSW50LCBJbnQpAQxhc1R1cGxlM0ludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACDyhJbnQsIEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECIWZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCwgSW50KQEMYXNUdXBsZTJJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBAF0BQckbWF0Y2gwBQF0CQACAQIcZmFpbCB0byBjYXN0IGludG8gKEludCwgSW50KQEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQBD2dldFJhbmRvbU51bWJlcgMIbWF4VmFsdWUEc2FsdAdlbnRyb3B5AwkAZwIAAAUIbWF4VmFsdWUJAAIBAhZtYXhWYWx1ZSBzaG91bGQgYmUgPiAwBApyYW5kb21IYXNoCQDUFgEJAMsBAgUEc2FsdAUHZW50cm9weQkAagIJALEJAQUKcmFuZG9tSGFzaAUIbWF4VmFsdWUBBHBhZEwCA3ZhbANsZW4EBHZhbFMJAKQDAQUDdmFsBAZ6ZXJvZXMJALACAgkApAMBCQBsBgAKAAAJAGUCBQNsZW4JALECAQUEdmFsUwAAAAAFBERPV04AAQkArAICBQZ6ZXJvZXMFBHZhbFMAA002XwDAhD0AA004XwCAwtcvAA93bGdJc3N1ZWRBbXRLZXkCEHdsZ19pc3N1ZWRBbW91bnQADnpiSXNzdWVkQW10S2V5AhJ6YmlsbF9pc3N1ZWRBbW91bnQBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQRhZGRyCQCsAgICE2Zhcm1pbmdQb3dlckJ5VXNlcl8FBGFkZHIAEmFjcmVzU3Rha2RUb3RhbEtleQIWYWNyZXNTdGFrZWRBbW91bnRUb3RhbAAUdG90YWxGYXJtaW5nUG93ZXJLZXkCEXRvdGFsRmFybWluZ1Bvd2VyAAtNQVhfV0xfTkZUUwADAAxNQVhfQVJLX05GVFMAAQANQVJLX05GVF9CT05VUwCIJwAXTUFYX05GVFNfU1RBS0VEX0JZX1VTRVIABAARa2V5TmZ0VG90YWxJc3N1ZWQCDm5mdFRvdGFsSXNzdWVkABFrZXlOZnRUb3RhbEJ1cm5lZAIObmZ0VG90YWxCdXJuZWQAE2tleVdsTmZ0VG90YWxTdGFrZWQCEFdsTmZ0VG90YWxTdGFrZWQAFGtleUFya05mdFRvdGFsU3Rha2VkAhFBcmtOZnRUb3RhbFN0YWtlZAEVa2V5TmZ0TnVtYmVyQnlBc3NldElkAQdhc3NldElkCQCsAgICE25mdE51bWJlckJ5QXNzZXRJZF8FB2Fzc2V0SWQBEmtleVVzZXJXbE5mdE51bWJlcgEEYWRkcgkArAICAhB1c2VyV2xOZnROdW1iZXJfBQRhZGRyARNrZXlVc2VyQXJrTmZ0TnVtYmVyAQRhZGRyCQCsAgICEXVzZXJBcmtOZnROdW1iZXJfBQRhZGRyARBrZXlVc2VyRnVsbEJvbnVzAQRhZGRyCQCsAgICDnVzZXJGdWxsQm9udXNfBQRhZGRyAApsZXZlbEFjcmVzCQDMCAIAAAkAzAgCAAoJAMwIAgAUCQDMCAIAKAkAzAgCAFAJAMwIAgCWAQkAzAgCAPoBCQDMCAIAkAMJAMwIAgC8BQkAzAgCAOgHBQNuaWwBD2dldExldmVsQnlBY3JlcwEFYWNyZXMEA2FjcgkAaQIJAGQCBQVhY3JlcwD/wdcvBQNNOF8KAQdjaGVja2VyAgNhY2MEaXRlbQMJAGcCBQRpdGVtBQNhY3IFA2FjYwkAZAIFA2FjYwABCgACJGwFCmxldmVsQWNyZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2NoZWNrZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgVhY3JlcwZib251czYECm5vdEJvbnVzZWQJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUFYWNyZXMJAJQKAgkAawMFCm5vdEJvbnVzZWQJAGQCBQNNNl8FBmJvbnVzNgUDTTZfBQpub3RCb251c2VkAAt0ZWFtQWRkcktleQIIdGVhbUFkZHIBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBGFkZHIJAKwCAgIQbGFzdEFyYlRpbWVVc2VyXwUEYWRkcgART0xEX1NUQUtJTkdfREVBREwAgPnjm7kyABRNQVhfTEFORFNfVE9fQ09OVkVSVAAOABRrZXlMYXN0QWNyZXNTZWxsVGltZQIRbGFzdEFjcmVzU2VsbFRpbWUAEGtleUxhc3RMaW1pdExlZnQCDWxhc3RMaW1pdExlZnQABW5hbWVzCQDMCAICC0dvbGQgc2hvdmVsCQDMCAICB1BpY2theGUJAMwIAgIOU2FudGEncyBtaXR0ZW4FA25pbAAMZGVzY3JpcHRpb25zCQDMCAICFlJld2FyZCBmb3IgZWFybHkgYmlyZHMJAMwIAgITSW5jcmVhc2VzIEZhcm1Qb3dlcgkAzAgCAhVOZXcgWWVhciBwcm9tbyByZXdhcmQFA25pbAAOaWR4RGVzY3JTaG92ZWwAAAAPaWR4RGVzY3JQaWNrYXhlAAEADmlkeERlc2NyTWl0dGVuAAIAEHJhcml0eVRocmVzaG9sZHMJAMwIAgAFCQDMCAIACgkAzAgCABQFA25pbAANaWR4VGhyZXNob2xkQwAAAA1pZHhUaHJlc2hvbGRVAAEADWlkeFRocmVzaG9sZEwAAgAFbmFtZXoJAMwIAgIGU0hPVkVMCQDMCAICB1BJQ0tBWEUJAMwIAgIGTUlUVEVOBQNuaWwADWlkeE5hbWVTaG92ZWwAAAAOaWR4TmFtZVBpY2theGUAAQANaWR4TmFtZU1pdHRlbgACAAtjb250ZW50S2V5egkAzAgCAg9jb250ZW50UGlja2F4ZUMJAMwIAgIPY29udGVudFBpY2theGVVCQDMCAICD2NvbnRlbnRQaWNrYXhlTAkAzAgCAg9jb250ZW50UGlja2F4ZUUJAMwIAgIOY29udGVudFNob3ZlbFAJAMwIAgIOY29udGVudE1pdHRlblAFA25pbAAHaWR4S2V5QwAAAAhpZHhLZXlTUAAEAAhpZHhLZXlNUAAFAAtyYXJpdHlOYW1lcwkAzAgCAgZDb21tb24JAMwIAgIIVW5jb21tb24JAMwIAgIJTGVnZW5kYXJ5CQDMCAICBEVwaWMJAMwIAgIFUHJvbW8FA25pbAAKaWR4UmFyaXR5QwAAAAppZHhSYXJpdHlVAAEACmlkeFJhcml0eUwAAgAKaWR4UmFyaXR5RQADAAppZHhSYXJpdHlQAAQAC2NvbGxlY3Rpb256CQDMCAICDURpZ2dpbmcgdG9vbHMJAMwIAgIOTmV3IFllYXIgZ2lmdHMFA25pbAAKaWR4Q29sbERpZwAAAA5pZHhDb2xsTmV3WWVhcgABAApib251c1R5cGV6CQDMCAICCUZhcm1Qb3dlcgUDbmlsAA5pZHhCb251c1R5cGVGcAAAAQZwcm9sb2cBAWkDAwkBAiE9AggFAWkMb3JpZ2luQ2FsbGVyBQ1yZXN0MkNvbnRyYWN0CQELdmFsdWVPckVsc2UCCQCgCAEJAQprZXlCbG9ja2VkAAcHCQACAQIfQ29udHJhY3RzIGFyZSB1bmRlciBtYWludGVuYW5jZQQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTBAtsYXN0V2Vla0tleQkBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEFBGFkZHIEEmxhc3RXZWVrVHhJZEJ5VXNlcgkAoggBBQtsYXN0V2Vla0tleQQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAN3dHgJAKwCAgkArAICCQCkAwEFBHdlZWsCAV8FBHR4SWQECmN1cldlZWtLZXkJARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEFBGFkZHIDCQEJaXNEZWZpbmVkAQUSbGFzdFdlZWtUeElkQnlVc2VyBApsYXN0V2Vla1R4CQC1CQIJAQV2YWx1ZQEFEmxhc3RXZWVrVHhJZEJ5VXNlcgIBXwMJAAACCQCRAwIFCmxhc3RXZWVrVHgAAAkApAMBBQR3ZWVrCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2xhc3RXZWVrS2V5BQN3dHgJAMwIAgkBC1N0cmluZ0VudHJ5AgUKY3VyV2Vla0tleQUDd3R4BQNuaWwDCQAAAgkAkQMCBQpsYXN0V2Vla1R4AAAJAKQDAQkAZQIFBHdlZWsAAQkAzAgCCQELU3RyaW5nRW50cnkCBQpjdXJXZWVrS2V5BQN3dHgFA25pbAQRY3VyV2Vla1R4SWRCeVVzZXIJARFAZXh0ck5hdGl2ZSgxMDU4KQEFCmN1cldlZWtLZXkECWN1cldlZWtUeAkAtQkCBRFjdXJXZWVrVHhJZEJ5VXNlcgIBXwMJAAACCQCRAwIFCWN1cldlZWtUeAAACQCkAwEFBHdlZWsJAMwIAgkBC1N0cmluZ0VudHJ5AgUKY3VyV2Vla0tleQUDd3R4BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgULbGFzdFdlZWtLZXkFEWN1cldlZWtUeElkQnlVc2VyCQDMCAIJAQtTdHJpbmdFbnRyeQIFCmN1cldlZWtLZXkFA3d0eAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2xhc3RXZWVrS2V5BQN3dHgJAMwIAgkBC1N0cmluZ0VudHJ5AgUKY3VyV2Vla0tleQUDd3R4BQNuaWwBFGNyZWF0ZU5mdERlc2NyQ3VzdG9tCAdjb250S2V5CW5mdFNlcmlhbApjb2xsZWN0aW9uBG5hbWUFZGVzY3IGcmFyaXR5BWJvbnVzCWJvbnVzVHlwZQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIieyJ1cmwiOiAiaHR0cHM6Ly93YXZlc2xhbmRzLmNvbSIsIAIPImNvbnRlbnRLZXkiOiAiBQdjb250S2V5AgMiLCACCiJudW1iZXIiOiAJAKQDAQUJbmZ0U2VyaWFsAgIsIAIPImNvbGxlY3Rpb24iOiAiBQpjb2xsZWN0aW9uAgMiLCACCSJuYW1lIjogIgUEbmFtZQIDIiwgAhAiZGVzY3JpcHRpb24iOiAiBQVkZXNjcgIDIiwgAgkicmFyZSI6ICIFBnJhcml0eQIDIiwgAgkiYm9udXMiOiAJAKQDAQUFYm9udXMCAiwgAg4iYm9udXNUeXBlIjogIgUJYm9udXNUeXBlAgIifQEOaXNzdWVOZnRDdXN0b20IB25hbWVJZHgKY29udEtleUlkeAdjb2xsSWR4CXJhcml0eUlkeAlib251c1BlcmMIZGVzY3JJZHgMYm9udXNUeXBlSWR4BGFkZHIECW5mdFNlcmlhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRFrZXlOZnRUb3RhbElzc3VlZAAABAZyYXJpdHkJAJEDAgULcmFyaXR5TmFtZXMFCXJhcml0eUlkeAQEbmFtZQkArAICCQCsAgIJAKwCAgkAkQMCBQVuYW1legUHbmFtZUlkeAIBLQkArwICBQZyYXJpdHkAAQkApAMBBQlib251c1BlcmMEBWlzc3VlCQDCCAUFBG5hbWUJARRjcmVhdGVOZnREZXNjckN1c3RvbQgJAJEDAgULY29udGVudEtleXoFCmNvbnRLZXlJZHgFCW5mdFNlcmlhbAkAkQMCBQtjb2xsZWN0aW9uegUHY29sbElkeAkAkQMCBQVuYW1lcwUHbmFtZUlkeAkAkQMCBQxkZXNjcmlwdGlvbnMFCGRlc2NySWR4CQCRAwIFC3Jhcml0eU5hbWVzBQlyYXJpdHlJZHgFCWJvbnVzUGVyYwkAkQMCBQpib251c1R5cGV6BQxib251c1R5cGVJZHgAAQAABwQKbmZ0QXNzZXRJZAkAuAgBBQVpc3N1ZQkAlAoCCQDMCAIFBWlzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrZXlOZnRUb3RhbElzc3VlZAkAZAIFCW5mdFNlcmlhbAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVa2V5TmZ0TnVtYmVyQnlBc3NldElkAQkA2AQBBQpuZnRBc3NldElkBQluZnRTZXJpYWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUEYWRkcgABBQpuZnRBc3NldElkBQNuaWwFCm5mdEFzc2V0SWQBEmJvbnVzQnlEZXNjcmlwdGlvbgEFZGVzY3IDCQEBIQEJAQhjb250YWlucwIFBWRlc2NyAhgiYm9udXNUeXBlIjogIkZhcm1Qb3dlciIJAAIBCQCsAgICFk5GVCBpcyBub3Qgc3VwcG9ydGVkOiAFBWRlc2NyBAhib251c1N0cgkAkQMCCQC8CQIJAJEDAgkAvAkCBQVkZXNjcgIIImJvbnVzIjoAAQIBLAAACQENcGFyc2VJbnRWYWx1ZQEJALACAgUIYm9udXNTdHIJAGQCCQELdmFsdWVPckVsc2UCCQC3CQIFCGJvbnVzU3RyAgEgAP///////////wEAAQEWcmFyaXR5SWR4QnlEZXNjcmlwcmlvbgEFZGVzY3IDCQEBIQEJAQhjb250YWlucwIFBWRlc2NyAgYicmFyZSIJAAIBCQCsAgICFk5GVCBpcyBub3Qgc3VwcG9ydGVkOiAFBWRlc2NyBAlyYXJpdHlTdHIJAJEDAgkAvAkCCQCRAwIJALwJAgkAkQMCCQC8CQIFBWRlc2NyAgYicmFyZSIAAQIBLAAAAgEiAAEJAQV2YWx1ZQEJAM8IAgULcmFyaXR5TmFtZXMFCXJhcml0eVN0cgEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMDYW10B2FkZHJlc3MKYm9udXNEZWx0YQMDCQAAAgUDYW10AAAJAAACBQpib251c0RlbHRhAAAHCQACAQINTm90aGluZyB0byBkbwQJd2xnUmVzdWx0CQD8BwQFC3dsZ0NvbnRyYWN0AhJvblN0YWtlVW5zdGFrZUxhbmQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUJd2xnUmVzdWx0BQl3bGdSZXN1bHQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3RpbWVLZXkJARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBQdhZGRyZXNzBAlhbW91bnRLZXkJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MEDm9sZEFjcmVzQW1vdW50CQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAAAwMJAGYCAAAFA2FtdAkAZgIAAAkAZAIFDm9sZEFjcmVzQW1vdW50BQNhbXQHCQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAQpmaXhlZFBvaW50AgUOb2xkQWNyZXNBbW91bnQACAIgIEFDUkVTIHN0YWtlZCwgdHJpZWQgdG8gdW5zdGFrZSAJAQpmaXhlZFBvaW50AgkBAS0BBQNhbXQACAQObmV3QWNyZXNBbW91bnQJAGQCBQ5vbGRBY3Jlc0Ftb3VudAUDYW10BAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJhY3Jlc1N0YWtkVG90YWxLZXkAAAQJdXNlckZwS2V5CQEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQUHYWRkcmVzcwQFb2xkRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJdXNlckZwS2V5AAAECGJvbnVzS2V5CQEQa2V5VXNlckZ1bGxCb251cwEFB2FkZHJlc3MECG9sZEJvbnVzCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0BQhib251c0tleQAAAwMJAGYCAAAFCmJvbnVzRGVsdGEJAGYCAAAJAGQCBQhvbGRCb251cwUKYm9udXNEZWx0YQcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICDllvdSBoYXZlIG9ubHkgCQEKZml4ZWRQb2ludAIFCG9sZEJvbnVzAAQCHiUgYm9udXMsIGFuZCB0cmllZCB0byB1bnN0YWtlIAkBCmZpeGVkUG9pbnQCCQEBLQEFCmJvbnVzRGVsdGEABAIBJQQLJHQwNjYzMTY3MzAJAR5nZXRGYXJtaW5nUG93ZXJCeUFjcmVzQW5kQm9udXMCBQ5uZXdBY3Jlc0Ftb3VudAkAZAIFCG9sZEJvbnVzBQpib251c0RlbHRhBAxuZXdCb251c2VkRnAIBQskdDA2NjMxNjczMAJfMQQHaWdub3JlZAgFCyR0MDY2MzE2NzMwAl8yBApvbGRUb3RhbEZwCQELdmFsdWVPckVsc2UCCQCfCAEFFHRvdGFsRmFybWluZ1Bvd2VyS2V5AAAEDGFjcmVzQWN0aW9ucwMJAAACBQNhbXQAAAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhbW91bnRLZXkFDm5ld0FjcmVzQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJhY3Jlc1N0YWtkVG90YWxLZXkJAGQCBQhvbGRUb3RhbAUDYW10BQNuaWwEDGJvbnVzQWN0aW9ucwMJAAACBQpib251c0RlbHRhAAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUIYm9udXNLZXkJAGQCBQhvbGRCb251cwUKYm9udXNEZWx0YQUDbmlsCQCUCgIJAM0IAgkAzQgCCQDNCAIJAM4IAgUMYWNyZXNBY3Rpb25zBQxib251c0FjdGlvbnMJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkBDEludGVnZXJFbnRyeQIFCXVzZXJGcEtleQUMbmV3Qm9udXNlZEZwCQEMSW50ZWdlckVudHJ5AgUUdG90YWxGYXJtaW5nUG93ZXJLZXkJAGUCCQBkAgUKb2xkVG90YWxGcAUMbmV3Qm9udXNlZEZwBQVvbGRGcAUJd2xnUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRXbGdQcmljZQEVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQt3bGdDb250cmFjdAUPd2xnSXNzdWVkQW10S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQEBndsZ1VzZAkA8AcCBQt3bGdDb250cmFjdAULdXNkdEFzc2V0SWQECWFjcmVzMlVzZAkAZQIJAPAHAgUOYWNyZXMyQ29udHJhY3QFC3VzZHRBc3NldElkBRV1c2R0QmFsYW5jZUNvcnJlY3Rpb24ED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQt1c2R0QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEDXRvdGFsRnVuZHNVc2QJAGQCCQBkAgUJYWNyZXMyVXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAkAawMFDXRvdGFsRnVuZHNVc2QFBU1VTFQ4BQxpc3N1ZWRBbW91bnQBEWdldFN3YXBMaW1pdEFjcmVzAAQGd2xnVXNkCQDwBwIFC3dsZ0NvbnRyYWN0BQt1c2R0QXNzZXRJZAQJYWNyZXMyVXNkCQDwBwIFBHRoaXMFC3VzZHRBc3NldElkBA9pbnZlc3RGdW5kVG90YWwJAGQCCQDwBwIFEmludmVzdEZ1bmRDb250cmFjdAULdXNkdEFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAABAxkZWZhdWx0TGltaXQJAGkCCQBkAgkAZAIFCWFjcmVzMlVzZAUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwFE09ORV9QRVJDRU5UX0RJVklTT1IEDWxhc3RMaW1pdExlZnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUQa2V5TGFzdExpbWl0TGVmdAUMZGVmYXVsdExpbWl0BAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRrZXlMYXN0QWNyZXNTZWxsVGltZQAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAxjdXJyZW50TGltaXQJAGQCBQ1sYXN0TGltaXRMZWZ0CQBrAwUMZGVmYXVsdExpbWl0CQBlAgUDbm93BQhsYXN0VGltZQUKREFZX01JTExJUwQNbGltaXRMZWZ0VXNkdAkAlwMBCQDMCAIFDGN1cnJlbnRMaW1pdAkAzAgCBQxkZWZhdWx0TGltaXQFA25pbAkAlAoCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGFzdEFjcmVzU2VsbFRpbWUFA25vdwUNbGltaXRMZWZ0VXNkdAAJYXJrT3JhY2xlCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUEpnWjZBSzFXVkNwZENtRVpwZXNIbWFLdnJRRGRYRzVvZwAJaW5jdWJhdG9yCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIXc3RhdGljX2luY3ViYXRvckFkZHJlc3MCAAAHYnJlZWRlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCFXN0YXRpY19icmVlZGVyQWRkcmVzcwIAAA90dXJ0bGVJbmN1YmF0b3IJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAh1zdGF0aWNfdHVydGxlSW5jdWJhdG9yQWRkcmVzcwIAAA10dXJ0bGVCcmVlZGVyCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIbc3RhdGljX3R1cnRsZUJyZWVkZXJBZGRyZXNzAgAAD2NhbmluZUluY3ViYXRvcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCHXN0YXRpY19jYW5pbmVJbmN1YmF0b3JBZGRyZXNzAgAADWNhbmluZUJyZWVkZXIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUJYXJrT3JhY2xlAhtzdGF0aWNfY2FuaW5lQnJlZWRlckFkZHJlc3MCAAAPZmVsaW5lSW5jdWJhdG9yCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIdc3RhdGljX2ZlbGluZUluY3ViYXRvckFkZHJlc3MCAAANZmVsaW5lQnJlZWRlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQlhcmtPcmFjbGUCG3N0YXRpY19mZWxpbmVCcmVlZGVyQWRkcmVzcwIAAA1tdXRhbnRCcmVlZGVyCQELdmFsdWVPckVsc2UCCQCdCAIFCWFya09yYWNsZQIdc3RhdGljX211dGFudEluY3ViYXRvckFkZHJlc3MCAAEPaXNBcmtpbWFsSXNzdWVkAQNuZm8EBmlzc3VlcgkApQgBCAUDbmZvBmlzc3VlcgMDAwMDAwMDAwMJAAACBQVjaGFpbgEBVAkAAAIFBmlzc3VlcgUVb2xkU3Rha2luZ0NvbnRyYWN0U3RyBwYJAAACBQZpc3N1ZXIFCWluY3ViYXRvcgYJAAACBQZpc3N1ZXIFB2JyZWVkZXIGCQAAAgUGaXNzdWVyBQ90dXJ0bGVJbmN1YmF0b3IGCQAAAgUGaXNzdWVyBQ10dXJ0bGVCcmVlZGVyBgkAAAIFBmlzc3VlcgUPY2FuaW5lSW5jdWJhdG9yBgkAAAIFBmlzc3VlcgUNY2FuaW5lQnJlZWRlcgYJAAACBQZpc3N1ZXIFD2ZlbGluZUluY3ViYXRvcgYJAAACBQZpc3N1ZXIFDWZlbGluZUJyZWVkZXIIBQNuZm8EbmFtZQMJAAACBQZpc3N1ZXIFDW11dGFudEJyZWVkZXIIBQNuZm8LZGVzY3JpcHRpb24CAAEQc3Rha2VOZnRJbnRlcm5hbAYEYWRkcgphc3NldElkU3RyBmJvbnVzNgp1c2VyTnVtS2V5C3RvdGFsTnVtS2V5BWxpbWl0BAluZnROdW1iZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdXNlck51bUtleQAAAwkAZwIFCW5mdE51bWJlcgUFbGltaXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiBzdGFrZSBtYXggCQCkAwEFBWxpbWl0Ag0gb2Ygc3VjaCBORlRzBA0kdDAxMTAwOTExMDg1CQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMAAAUEYWRkcgUGYm9udXM2BAdhY3Rpb25zCAUNJHQwMTEwMDkxMTA4NQJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDExMDA5MTEwODUCXzIJAJQKAgkAzQgCCQDNCAIJAM0IAgUHYWN0aW9ucwkBDEludGVnZXJFbnRyeQIFCnVzZXJOdW1LZXkJAGQCBQluZnROdW1iZXIAAQkBDEludGVnZXJFbnRyeQIFC3RvdGFsTnVtS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQt0b3RhbE51bUtleQAAAAEJAQxJbnRlZ2VyRW50cnkCCQEea2V5U3Rha2VkVGltZUJ5QXNzZXRJZEFuZE93bmVyAgUKYXNzZXRJZFN0cgUEYWRkcggFCWxhc3RCbG9jawl0aW1lc3RhbXAFEHdsZ0NsYWltZWRBbW91bnQBDHByb2Nlc3NQcm9tbwMHYWRkcmVzcwNhbXQQc2hvdWxkQ2xlYW5Qcm9tbwMDCQBnAgUGaGVpZ2h0BRdEQUlMWV9QUk9NT19TVEFSVF9CTE9DSwkAZgIFFURBSUxZX1BST01PX0VORF9CTE9DSwUGaGVpZ2h0BwQNcHJvbW9BY3Jlc0tleQkBEWtleVVzZXJQcm9tb0FjcmVzAQUHYWRkcmVzcwQKcHJvbW9BY3JlcwkAZAIDBRBzaG91bGRDbGVhblByb21vAAAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNcHJvbW9BY3Jlc0tleQAABQNhbXQEB3RpY2tldHMJAGkCBQpwcm9tb0FjcmVzBQVNVUxUOAQKdGlja2V0c0tleQkBE2tleVVzZXJQcm9tb1RpY2tldHMBBQdhZGRyZXNzBAxkZWx0YVRpY2tldHMJAGUCBQd0aWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEFCnRpY2tldHNLZXkAAAQMdG90YWxUaWNrZXRzCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRrZXlUb3RhbFByb21vVGlja2V0cwAABQxkZWx0YVRpY2tldHMDAwUQc2hvdWxkQ2xlYW5Qcm9tbwYJAGYCBQxkZWx0YVRpY2tldHMAAAQIcHJvbW9NYXAJAQt2YWx1ZU9yRWxzZQIJAKIIAQULa2V5UHJvbW9NYXACAAQKdXNlclJlY29yZAkArAICCQCsAgIFB2FkZHJlc3MCAToJAQRwYWRMAgUHdGlja2V0cwADBAZuZXdNYXADCQEIY29udGFpbnMCBQhwcm9tb01hcAUHYWRkcmVzcwQIbWFwUGFydHMJAL0JAgUIcHJvbW9NYXAFB2FkZHJlc3MDCQAAAgkAkQMCBQhtYXBQYXJ0cwAAAgAEAXIJALACAgkAkQMCBQhtYXBQYXJ0cwABAAQDCQAAAgUBcgIAAwkAAAIFB3RpY2tldHMAAAIABQp1c2VyUmVjb3JkAwkAAAIFB3RpY2tldHMAAAkAsAICBQFyAAEJAKwCAgUKdXNlclJlY29yZAUBcgQBcgkAsAICCQCRAwIFCG1hcFBhcnRzAAEABAMJAAACBQFyAgADCQAAAgUHdGlja2V0cwAACQCzAgIJAJEDAgUIbWFwUGFydHMAAAABCQCsAgIJAJEDAgUIbWFwUGFydHMAAAUKdXNlclJlY29yZAMJAAACBQd0aWNrZXRzAAAJAKwCAgkAkQMCBQhtYXBQYXJ0cwAACQCwAgIFAXIAAQkArAICCQCsAgIJAJEDAgUIbWFwUGFydHMAAAUKdXNlclJlY29yZAUBcgMJAAACBQd0aWNrZXRzAAAFCHByb21vTWFwAwkAAAIFCHByb21vTWFwAgAFCnVzZXJSZWNvcmQJAKwCAgkArAICBQhwcm9tb01hcAIBXwUKdXNlclJlY29yZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNcHJvbW9BY3Jlc0tleQUKcHJvbW9BY3JlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUKdGlja2V0c0tleQUHdGlja2V0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5VG90YWxQcm9tb1RpY2tldHMFDHRvdGFsVGlja2V0cwkAzAgCCQELU3RyaW5nRW50cnkCBQtrZXlQcm9tb01hcAUGbmV3TWFwBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFDXByb21vQWNyZXNLZXkFCnByb21vQWNyZXMFA25pbAUDbmlsARVzdGFrZUFjcmVzRm9ySW50ZXJuYWwDB2FkZHJlc3MDYW10EHNob3VsZENsZWFuUHJvbW8EDSR0MDEzOTU0MTQwMzAJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAwUDYW10BQdhZGRyZXNzAAAEB2FjdGlvbnMIBQ0kdDAxMzk1NDE0MDMwAl8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTM5NTQxNDAzMAJfMgQMcHJvbW9BY3Rpb25zCQEMcHJvY2Vzc1Byb21vAwUHYWRkcmVzcwUDYW10BRBzaG91bGRDbGVhblByb21vCQCUCgIJAM4IAgUHYWN0aW9ucwUMcHJvbW9BY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50FgFpAQpzYXZlTGFzdFR4AAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUObWFya2V0Q29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkAlAoCCQEGcHJvbG9nAQUBaQAqAWkBDWNvbnN0cnVjdG9yVjECCXJlc3QyQWRkcg5vbGRBY3JDb250cmFjdAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA5vbGRBY3JDb250QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUOb2xkQWNyQ29udHJhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFFGFjcmVzSXNzdWVkQW1vdW50S2V5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ5vbGRBY3JDb250QWRkcgUUYWNyZXNJc3N1ZWRBbW91bnRLZXkJAMwIAgkBC0JpbmFyeUVudHJ5AgUPYWNyZXNBc3NldElkS2V5CQERQGV4dHJOYXRpdmUoMTA1MikCBQ5vbGRBY3JDb250QWRkcgUPYWNyZXNBc3NldElkS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUTb2xkQWNyZXNDb250cmFjdEtleQUOb2xkQWNyQ29udHJhY3QFA25pbAFpAQpzZXRCbG9ja2VkAQlpc0Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCmtleUJsb2NrZWQABQlpc0Jsb2NrZWQFA25pbAFpAQx1bnN0YWtlQWNyZXMBBmFtb3VudAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDAwkAZwIFBmhlaWdodAUXREFJTFlfUFJPTU9fU1RBUlRfQkxPQ0sJAGYCBRVEQUlMWV9QUk9NT19FTkRfQkxPQ0sFBmhlaWdodAcJAAIBAipZb3UgY2FuJ3QgdW5zdGFrZSBkdXJpbmcgWG1hcyBwcm9tbyBwZXJpb2QDCQBnAgAABQZhbW91bnQJAAIBAhlBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA5hcmJSZWxlYXNlVGltZQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgULd2xnQ29udHJhY3QJARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQUHYWRkcmVzcwAABQ5hcmJpdHJhZ2VEZWxheQMJAGYCBQ5hcmJSZWxlYXNlVGltZQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAAIBCQCsAgICLVlvdSB0cmFkZWQgc29tZSBXTEdPTEQsIGNhbm5vdCB1bnN0YWtlIHVudGlsIAkApAMBBQ5hcmJSZWxlYXNlVGltZQQNJHQwMTU2MjUxNTcwNQkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwDCQEBLQEFBmFtb3VudAUHYWRkcmVzcwAABAdhY3Rpb25zCAUNJHQwMTU2MjUxNTcwNQJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDE1NjI1MTU3MDUCXzIJAJQKAgkAzggCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50BQxhY3Jlc0Fzc2V0SWQFDXByb2xvZ0FjdGlvbnMFEHdsZ0NsYWltZWRBbW91bnQBaQEKc3Rha2VBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEEDSR0MDE2MTU2MTYyMzcJARVzdGFrZUFjcmVzRm9ySW50ZXJuYWwDBQdhZGRyZXNzBQNhbXQHBAxzdGFrZUFjdGlvbnMIBQ0kdDAxNjE1NjE2MjM3Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTYxNTYxNjIzNwJfMgkAlAoCCQDOCAIFDHN0YWtlQWN0aW9ucwUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAFpAQ1zdGFrZUFjcmVzRm9yAwdhZGRyZXNzA2FtdBBzaG91bGRDbGVhblByb21vAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJARVzdGFrZUFjcmVzRm9ySW50ZXJuYWwDBQdhZGRyZXNzBQNhbXQFEHNob3VsZENsZWFuUHJvbW8BaQEIYnV5QWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAp1c2R0QW1vdW50CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAGYCBQVNVUxUNgUKdXNkdEFtb3VudAkAAgEJAKwCAgkArAICAhZNaW4gcGF5bWVudCBzaG91bGQgYmUgCQEKZml4ZWRQb2ludAIFBU1VTFQ2AAYCBSBVU0RUBAthY3Jlc0Ftb3VudAkAaAIFCnVzZHRBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgQJd2xnQW1vdW50CQBrAwUKdXNkdEFtb3VudAUFTVVMVDgJAQtnZXRXbGdQcmljZQEFCnVzZHRBbW91bnQED29sZEFjcmVzQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUTb2xkQWNyZXNDb250cmFjdEtleQQDcmVxCQD8BwQFD29sZEFjcmVzQWRkcmVzcwIUcmVxdWVzdEFjcmVzQ2FsbGJhY2sJAMwIAgULYWNyZXNBbW91bnQFA25pbAUDbmlsAwkAAAIFA3JlcQUDcmVxBAl3bGdSZW1haW4JAQVhc0ludAEJAPwHBAULd2xnQ29udHJhY3QCCmJ1cm5XbGdvbGQJAMwIAgUJd2xnQW1vdW50BQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQthY3Jlc0Ftb3VudAUMYWNyZXNBc3NldElkBQNuaWwFDXByb2xvZ0FjdGlvbnMFCXdsZ1JlbWFpbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBidXlBY3Jlc1JFQURPTkxZAQp1c2R0QW1vdW50BAthY3Jlc0Ftb3VudAkAaAIFCnVzZHRBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgQJd2xnVG9CdXJuCQBrAwUKdXNkdEFtb3VudAUFTVVMVDgJAQtnZXRXbGdQcmljZQEFCnVzZHRBbW91bnQJAJQKAgUDbmlsCQDMCAIFC2FjcmVzQW1vdW50CQDMCAIFBU1VTFQ2CQDMCAIFC2FjcmVzQW1vdW50CQDMCAIFCXdsZ1RvQnVybgUDbmlsAWkBCXNlbGxBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEC2FjcmVzQW1vdW50CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFDGFjcmVzQXNzZXRJZAkAAgECFEFDUkVTIHBheW1lbnRzIG9ubHkhAwkAZgIFBU1VTFQ3BQthY3Jlc0Ftb3VudAkAAgEJAKwCAgkArAICAhZNaW4gcGF5bWVudCBzaG91bGQgYmUgCQEKZml4ZWRQb2ludAIFBU1VTFQ3AAgCBiBBQ1JFUwQEYWRkcgkApQgBCAUBaQZjYWxsZXIEDSR0MDE4MzA5MTgzNTcJARFnZXRTd2FwTGltaXRBY3JlcwAEC2xpbWl0QWN0aW9uCAUNJHQwMTgzMDkxODM1NwJfMQQHbWF4VXNkdAgFDSR0MDE4MzA5MTgzNTcCXzIECG1heEFjcmVzCQBoAgUHbWF4VXNkdAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAwkAZgIFC2FjcmVzQW1vdW50BQhtYXhBY3JlcwkAAgEJAKwCAgkArAICAhFZb3UgY2FuIHNlbGwgbWF4IAkBCmZpeGVkUG9pbnQCBQhtYXhBY3JlcwAIAgYgQUNSRVMECnVzZHRBbW91bnQJAGkCCQBpAgULYWNyZXNBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgACCQCUCgIJAM4IAgkAzAgCBQtsaW1pdEFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa2V5TGFzdExpbWl0TGVmdAkAZQIFB21heFVzZHQFCnVzZHRBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQp1c2R0QW1vdW50BQt1c2R0QXNzZXRJZAUDbmlsBQ1wcm9sb2dBY3Rpb25zBQp1c2R0QW1vdW50AWkBEXNlbGxBY3Jlc1JFQURPTkxZAgdhZGRyZXNzC2FjcmVzQW1vdW50BA0kdDAxODg1MzE4OTAxCQERZ2V0U3dhcExpbWl0QWNyZXMABAtsaW1pdEFjdGlvbggFDSR0MDE4ODUzMTg5MDECXzEEB21heFVzZHQIBQ0kdDAxODg1MzE4OTAxAl8yBAp1c2R0QW1vdW50CQBpAgkAaQIFC2FjcmVzQW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIAAgkAlAoCBQNuaWwJAMwIAgUKdXNkdEFtb3VudAkAzAgCBQVNVUxUNwkAzAgCCQBoAgUHbWF4VXNkdAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSCQDMCAIAAAUDbmlsAWkBEGNvbnZlcnRPbGRTdGFrZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAGYCBRFPTERfU1RBS0lOR19ERUFETAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAAIBCQCsAgICD0Rpc2FibGVkIHVudGlsIAkApAMBCQBpAgURT0xEX1NUQUtJTkdfREVBREwA6AcEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQED29sZEFjcmVzQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUTb2xkQWNyZXNDb250cmFjdEtleQQGYW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFD29sZEFjcmVzQWRkcmVzcwkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUHYWRkcmVzcwAABAlnb3RBY3JlczADCQBmAgUGYW1vdW50AAAJAQxhc1R1cGxlMkludHMBCQD8BwQFD29sZEFjcmVzQWRkcmVzcwIUdW5zdGFrZUFjcmVzQ2FsbGJhY2sJAMwIAgUGYW1vdW50CQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsCQCUCgIAAAAABBFvbGRTdGFraW5nQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUVb2xkU3Rha2luZ0NvbnRyYWN0U3RyBAhsYW5kc1N0cgkAnQgCBRFvbGRTdGFraW5nQWRkcmVzcwkBFWtleVN0YWtlZExhbmRzQnlPd25lcgEFB2FkZHJlc3MEC2xhbmRzUmVzdWx0AwkBCWlzRGVmaW5lZAEFCGxhbmRzU3RyBAVsYW5kcwkAvQkCCQEFdmFsdWUBBQhsYW5kc1N0cgIBXwMJAGYCCQCQAwEFBWxhbmRzBRRNQVhfTEFORFNfVE9fQ09OVkVSVAkAAgEJAKwCAgkArAICAhNZb3UgaGF2ZSBtb3JlIHRoYW4gCQCkAwEFFE1BWF9MQU5EU19UT19DT05WRVJUAkcgbGFuZHMgc3Rha2VkLCBwbGVhc2UgY29udGFjdCBzdXBwb3J0LCB3ZSdsbCBwcm9jZXNzIHlvdXIgY2FzZSBtYW51YWxseQoBB29uZUxhbmQCA2FjYwtsYW5kQXNzZXRJZAMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQEAXIJAQxhc1R1cGxlNUludHMBCQD8BwQFEW9sZFN0YWtpbmdBZGRyZXNzAhN1bnN0YWtlTGFuZENhbGxiYWNrCQDMCAIFC2xhbmRBc3NldElkCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAwkAAAIFAXIFAXIJAJcKBQkAZAIIBQNhY2MCXzEIBQFyAl8xCQBkAggFA2FjYwJfMggFAXICXzIJAGQCCAUDYWNjAl8zCAUBcgJfMwkAZAIIBQNhY2MCXzQIBQFyAl80CQBkAggFA2FjYwJfNQgFAXICXzUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAnJyCgACJGwFBWxhbmRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlwoFAAAAAAAAAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHb25lTGFuZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTQJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAwkAAAIFAnJyBQJycgQIZmluYWxpemUJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCHHVuc3Rha2VMYW5kc0ZpbmFsaXplQ2FsbGJhY2sJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUIZmluYWxpemUFCGZpbmFsaXplBANyZXEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhRyZXF1ZXN0QWNyZXNDYWxsYmFjawkAzAgCCQBkAgkAZAIJAGQCCAUCcnICXzEIBQJycgJfMggFAnJyAl8zCAUCcnICXzQFA25pbAUDbmlsAwkAAAIFA3JlcQUDcmVxBA0kdDAyMTQxNTIxNTU0CQEOaXNzdWVOZnRDdXN0b20IBQ1pZHhOYW1lU2hvdmVsBQhpZHhLZXlTUAUKaWR4Q29sbERpZwUKaWR4UmFyaXR5UAADBQ5pZHhEZXNjclNob3ZlbAUOaWR4Qm9udXNUeXBlRnAIBQFpBmNhbGxlcgQKbmZ0QWN0aW9ucwgFDSR0MDIxNDE1MjE1NTQCXzEECm5mdEFzc2V0SWQIBQ0kdDAyMTQxNTIxNTU0Al8yCQCYCgYIBQJycgJfMQgFAnJyAl8yCAUCcnICXzMIBQJycgJfNAgFAnJyAl81BQpuZnRBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCYCgYAAAAAAAAAAAAABQNuaWwEC2R1Y2tBc3NldElkCQELdmFsdWVPckVsc2UCCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQdhZGRyZXNzAgAECmR1Y2tSZXN1bHQDCQECIT0CBQtkdWNrQXNzZXRJZAIACQEMYXNUdXBsZTNJbnRzAQkA/AcEBRFvbGRTdGFraW5nQWRkcmVzcwITdW5zdGFrZUR1Y2tDYWxsYmFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAkAlQoDAAAAAAAABAF4CQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMJAGQCCQBkAgkAZAIJAGQCCQBkAgkAZAIJAGQCCAUJZ290QWNyZXMwAl8xCAULbGFuZHNSZXN1bHQCXzEIBQtsYW5kc1Jlc3VsdAJfMggFC2xhbmRzUmVzdWx0Al8zCAULbGFuZHNSZXN1bHQCXzQIBQpkdWNrUmVzdWx0Al8xCAUKZHVja1Jlc3VsdAJfMggFCmR1Y2tSZXN1bHQCXzMFB2FkZHJlc3MAAAkAlAoCCQDOCAIJAM4IAggFC2xhbmRzUmVzdWx0Al82CAUBeAJfMQUNcHJvbG9nQWN0aW9ucwkAlQoDCAUJZ290QWNyZXMwAl8yCAULbGFuZHNSZXN1bHQCXzUIBQF4Al8yAWkBFHVuc3Rha2VMYW5kc1JFQURPTkxZAQdhZGRyZXNzBBFvbGRTdGFraW5nQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUVb2xkU3Rha2luZ0NvbnRyYWN0U3RyBAhsYW5kc1N0cgkAnQgCBRFvbGRTdGFraW5nQWRkcmVzcwkBFWtleVN0YWtlZExhbmRzQnlPd25lcgEFB2FkZHJlc3MEC2xhbmRzUmVzdWx0AwkBCWlzRGVmaW5lZAEFCGxhbmRzU3RyBAVsYW5kcwkAvQkCCQEFdmFsdWUBBQhsYW5kc1N0cgIBXwoBB29uZUxhbmQCA2FjYwtsYW5kQXNzZXRJZAMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQEAXIJAQxhc1R1cGxlNEludHMBCQD8BwQFEW9sZFN0YWtpbmdBZGRyZXNzAhN1bnN0YWtlTGFuZFJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsCQCWCgQJAGQCCAUDYWNjAl8xCAUBcgJfMQkAZAIIBQNhY2MCXzIIBQFyAl8yCQBkAggFA2FjYwJfMwgFAXICXzMJAGQCCAUDYWNjAl80CAUBcgJfNAoAAiRsBQVsYW5kcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdvbmVMYW5kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhVMaXN0IHNpemUgZXhjZWVkcyAxMDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAkAlgoEAAAAAAAAAAAJAJQKAgUDbmlsBQtsYW5kc1Jlc3VsdAFpARJzdGFrZUFjcmVzQ2FsbGJhY2sBBGFkZHIDCQECIT0CCAUBaQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFW9sZFN0YWtpbmdDb250cmFjdFN0cgkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQRhZGRyAAABaQEac2ltdWxhdGVTdGFrZUFjcmVzUkVBRE9OTFkCB2FkZHJlc3MLYWRkZWRBbW91bnQECWFtb3VudEtleQkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUHYWRkcmVzcwQObmV3QWNyZXNBbW91bnQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAABQthZGRlZEFtb3VudAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSYWNyZXNTdGFrZFRvdGFsS2V5AAAECXVzZXJGcEtleQkBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEFB2FkZHJlc3MEBW9sZEZwCQELdmFsdWVPckVsc2UCCQCfCAEFCXVzZXJGcEtleQAABAl1c2VyQm9udXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARBrZXlVc2VyRnVsbEJvbnVzAQUHYWRkcmVzcwAABA0kdDAyMzgyNTIzOTEyCQEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgUObmV3QWNyZXNBbW91bnQFCXVzZXJCb251cwQMbmV3Qm9udXNlZEZwCAUNJHQwMjM4MjUyMzkxMgJfMQQHaWdub3JlZAgFDSR0MDIzODI1MjM5MTICXzIECm9sZFRvdGFsRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUdG90YWxGYXJtaW5nUG93ZXJLZXkAAAQKbmV3VG90YWxGcAkAZQIJAGQCBQpvbGRUb3RhbEZwBQxuZXdCb251c2VkRnAFBW9sZEZwCQCUCgIFA25pbAkAzAgCBQVvbGRGcAkAzAgCBQxuZXdCb251c2VkRnAJAMwIAgUKb2xkVG90YWxGcAkAzAgCBQpuZXdUb3RhbEZwBQNuaWwBaQELaXNzdWVQaWNrQzEBCmZvckFkZHJlc3MDCQECIT0CCAUBaQZjYWxsZXIFC3dsZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAQ5pc3N1ZU5mdEN1c3RvbQgFDmlkeE5hbWVQaWNrYXhlBQdpZHhLZXlDBQppZHhDb2xsRGlnBQppZHhSYXJpdHlDAAEFD2lkeERlc2NyUGlja2F4ZQUOaWR4Qm9udXNUeXBlRnAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCmZvckFkZHJlc3MBaQEMaXNzdWVNaXR0ZW5QAgpmb3JBZGRyZXNzEHNob3VsZENsZWFuUHJvbW8DCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQNJHQwMjQ1MjgyNDY5OAkBDmlzc3VlTmZ0Q3VzdG9tCAUNaWR4TmFtZU1pdHRlbgUIaWR4S2V5TVAFDmlkeENvbGxOZXdZZWFyBQppZHhSYXJpdHlQAAMFDmlkeERlc2NyTWl0dGVuBQ5pZHhCb251c1R5cGVGcAkBEUBleHRyTmF0aXZlKDEwNjIpAQUKZm9yQWRkcmVzcwQKbmZ0QWN0aW9ucwgFDSR0MDI0NTI4MjQ2OTgCXzEECm5mdEFzc2V0SWQIBQ0kdDAyNDUyODI0Njk4Al8yBAxwcm9tb0FjdGlvbnMJAQxwcm9jZXNzUHJvbW8DBQpmb3JBZGRyZXNzAAAFEHNob3VsZENsZWFuUHJvbW8JAJQKAgkAzggCBQpuZnRBY3Rpb25zBQxwcm9tb0FjdGlvbnMFCm5mdEFzc2V0SWQBaQEIc3Rha2VORlQABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFA3BtdAZhbW91bnQAAQkAAgECJ05GVCB0b2tlbiBzaG91bGQgYmUgYXR0YWNoZWQgYXMgcGF5bWVudAQHYXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAduZnRzS2V5CQEUa2V5U3Rha2VkTkZUc0J5T3duZXIBBQRhZGRyBAduZnRzU3RyCQCiCAEFB25mdHNLZXkEBG5mdHMDCQEJaXNEZWZpbmVkAQUHbmZ0c1N0cgkAvAkCCQEFdmFsdWUBBQduZnRzU3RyAgFfBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUEbmZ0cwUKYXNzZXRJZFN0cgkAAgEJAKwCAgIhWW91ciBzdGFrZWQgTkZUcyBhbHJlYWR5IGNvbnRhaW4gBQphc3NldElkU3RyAwkAZwIJAJADAQUEbmZ0cwUXTUFYX05GVFNfU1RBS0VEX0JZX1VTRVIJAAIBCQCsAgIJAKwCAgIZWW91ciBhbHJlYWR5IHN0YWtlZCBtYXggKAkApAMBBRdNQVhfTkZUU19TVEFLRURfQllfVVNFUgIGKSBORlRzBApsaXN0QWN0aW9uCQELU3RyaW5nRW50cnkCBQduZnRzS2V5CQC6CQIJAM0IAgUEbmZ0cwUKYXNzZXRJZFN0cgIBXwMJAAACCAUFYXNzZXQGaXNzdWVyBQR0aGlzBA0kdDAyNTc1MDI1OTQwCQEQc3Rha2VOZnRJbnRlcm5hbAYFBGFkZHIFCmFzc2V0SWRTdHIJAGgCCQESYm9udXNCeURlc2NyaXB0aW9uAQkBBXZhbHVlAQgFBWFzc2V0C2Rlc2NyaXB0aW9uAJBOCQESa2V5VXNlcldsTmZ0TnVtYmVyAQUEYWRkcgUTa2V5V2xOZnRUb3RhbFN0YWtlZAULTUFYX1dMX05GVFMEB2FjdGlvbnMIBQ0kdDAyNTc1MDI1OTQwAl8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMjU3NTAyNTk0MAJfMgkAlAoCCQDNCAIJAM4IAgUNcHJvbG9nQWN0aW9ucwUHYWN0aW9ucwUKbGlzdEFjdGlvbgUQd2xnQ2xhaW1lZEFtb3VudAMJAAACCQEPaXNBcmtpbWFsSXNzdWVkAQUFYXNzZXQCAAkAAgECNE9ubHkgV2F2ZXNMYW5kcyBhbmQgQXJraW1hbHMgTkZUIHRva2VucyBhcmUgYWNjZXB0ZWQEDSR0MDI2MTIxMjYyNzIJARBzdGFrZU5mdEludGVybmFsBgUEYWRkcgUKYXNzZXRJZFN0cgUNQVJLX05GVF9CT05VUwkBE2tleVVzZXJBcmtOZnROdW1iZXIBBQRhZGRyBRRrZXlBcmtOZnRUb3RhbFN0YWtlZAUMTUFYX0FSS19ORlRTBAdhY3Rpb25zCAUNJHQwMjYxMjEyNjI3MgJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDI2MTIxMjYyNzICXzIJAJQKAgkAzQgCCQDOCAIFDXByb2xvZ0FjdGlvbnMFB2FjdGlvbnMFCmxpc3RBY3Rpb24FEHdsZ0NsYWltZWRBbW91bnQBaQEKdW5zdGFrZU5GVAEKYXNzZXRJZFN0cgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQHYXNzZXRJZAkA2QQBBQphc3NldElkU3RyBARhZGRyCQClCAEIBQFpBmNhbGxlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAQHdGltZUtleQkBHmtleVN0YWtlZFRpbWVCeUFzc2V0SWRBbmRPd25lcgIFCmFzc2V0SWRTdHIFBGFkZHIDCQEBIQEJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCFSBpcyBub3Qgc3Rha2VkIGJ5IHlvdQQHbmZ0c0tleQkBFGtleVN0YWtlZE5GVHNCeU93bmVyAQUEYWRkcgQEbmZ0cwkAvAkCCQELdmFsdWVPckVsc2UCCQCiCAEFB25mdHNLZXkCAAIBXwQDaWR4CQDPCAIFBG5mdHMFCmFzc2V0SWRTdHIDCQEBIQEJAQlpc0RlZmluZWQBBQNpZHgJAAIBCQCsAgICH1lvdXIgc3Rha2VkIE5GVHMgZG9uJ3QgY29udGFpbiAFCmFzc2V0SWRTdHIECmxpc3RBY3Rpb24DCQBmAgkAkAMBBQRuZnRzAAEJAQtTdHJpbmdFbnRyeQIFB25mdHNLZXkJALoJAgkA0QgCBQRuZnRzCQEFdmFsdWUBBQNpZHgCAV8JAQtEZWxldGVFbnRyeQEFB25mdHNLZXkEBGlzV0wJAAACCAUFYXNzZXQGaXNzdWVyBQR0aGlzAwUEaXNXTAQLd2xOZnROdW1iZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVVzZXJXbE5mdE51bWJlcgEFBGFkZHIAAAQIYm9udXNWYWwJAGgCCQESYm9udXNCeURlc2NyaXB0aW9uAQkBBXZhbHVlAQgFBWFzc2V0C2Rlc2NyaXB0aW9uAJBOBA0kdDAyNzQzNzI3NTE2CQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAMAAAUEYWRkcgkBAS0BBQhib251c1ZhbAQHYWN0aW9ucwgFDSR0MDI3NDM3Mjc1MTYCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAyNzQzNzI3NTE2Al8yCQCUCgIJAM4IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIFB2FjdGlvbnMFCmxpc3RBY3Rpb24JAQxJbnRlZ2VyRW50cnkCCQESa2V5VXNlcldsTmZ0TnVtYmVyAQUEYWRkcgkAZQIFC3dsTmZ0TnVtYmVyAAEJAQxJbnRlZ2VyRW50cnkCBRNrZXlXbE5mdFRvdGFsU3Rha2VkCQCWAwEJAMwIAgAACQDMCAIJAGUCCQELdmFsdWVPckVsc2UCCQCfCAEFE2tleVdsTmZ0VG90YWxTdGFrZWQAAAABBQNuaWwJAQtEZWxldGVFbnRyeQEJAR5rZXlTdGFrZWRUaW1lQnlBc3NldElkQW5kT3duZXICCQDYBAEFB2Fzc2V0SWQFBGFkZHIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50BAthcmtpbWFsTmFtZQkBD2lzQXJraW1hbElzc3VlZAEFBWFzc2V0AwkAAAIFC2Fya2ltYWxOYW1lAgAJAAIBAjRPbmx5IFdhdmVzTGFuZHMgYW5kIEFya2ltYWxzIE5GVCB0b2tlbnMgYXJlIGFjY2VwdGVkBAxhcmtOZnROdW1iZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVVzZXJBcmtOZnROdW1iZXIBBQRhZGRyAAAEDSR0MDI4MTc2MjgyNjAJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAwAABQRhZGRyCQEBLQEFDUFSS19ORlRfQk9OVVMEB2FjdGlvbnMIBQ0kdDAyODE3NjI4MjYwAl8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMjgxNzYyODI2MAJfMgkAlAoCCQDOCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgUHYWN0aW9ucwUKbGlzdEFjdGlvbgkBDEludGVnZXJFbnRyeQIJARNrZXlVc2VyQXJrTmZ0TnVtYmVyAQUEYWRkcgkAZQIFDGFya05mdE51bWJlcgABCQELRGVsZXRlRW50cnkBCQEea2V5U3Rha2VkVGltZUJ5QXNzZXRJZEFuZE93bmVyAgkA2AQBBQdhc3NldElkBQRhZGRyCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQUHYXNzZXRJZAUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAFpAQxleGNoYW5nZU5GVHMAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQISVGVtcG9yYXJ5IGRpc2FibGVkBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAGYCAAMJAJADAQgFAWkIcGF5bWVudHMJAAIBAilNaW4gb25lIFdMR09MRCBhbmQgMiBORlQgcGF5bWVudHMgYWxsb3dlZAMJAGYCCQCQAwEIBQFpCHBheW1lbnRzAAoJAAIBAilNYXggb25lIFdMR09MRCBhbmQgOSBORlQgcGF5bWVudHMgYWxsb3dlZAQEYWRkcgkApQgBCAUBaQZjYWxsZXIKAQVhZGRVcAIDYWNjA3BtdAQHYXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCGldBVkVTIHBheW1lbnRzIG5vdCBhbGxvd2VkAwkAAAIFB2Fzc2V0SWQFCndsZ0Fzc2V0SWQJAJYKBAkAZAIIBQNhY2MCXzEIBQNwbXQGYW1vdW50CAUDYWNjAl8yCAUDYWNjAl8zCAUDYWNjAl80BAVhc3NldAkBBXZhbHVlAQkA7AcBBQdhc3NldElkAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUEdGhpcwkAAgECG09ubHkgV0wtaXNzdWVkIE5GVHMgYWxsb3dlZAQIcmFyaXR5SXgJARZyYXJpdHlJZHhCeURlc2NyaXByaW9uAQkBBXZhbHVlAQgFBWFzc2V0C2Rlc2NyaXB0aW9uAwMJAGYCCAUDYWNjAl80AAAJAQIhPQIFCHJhcml0eUl4CAUDYWNjAl80BwkAAgECLVlvdSBjYW4gZXhjaGFuZ2Ugb25seSBORlRzIG9mIHRoZSBzYW1lIHJhcml0eQQJYm9udXNQZXJjCQESYm9udXNCeURlc2NyaXB0aW9uAQkBBXZhbHVlAQgFBWFzc2V0C2Rlc2NyaXB0aW9uCQCWCgQIBQNhY2MCXzEJAGQCCAUDYWNjAl8yBQlib251c1BlcmMJAM0IAggFA2FjYwJfMwkBBEJ1cm4CBQdhc3NldElkAAEFCHJhcml0eUl4BA0kdDAyOTcxMTI5OTI3CgACJGwIBQFpCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAUDbmlsAP///////////wEKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZFVwAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAZ3bGdGZWUIBQ0kdDAyOTcxMTI5OTI3Al8xBAp0b3RhbEJvbnVzCAUNJHQwMjk3MTEyOTkyNwJfMgQLYnVybkFjdGlvbnMIBQ0kdDAyOTcxMTI5OTI3Al8zBAlyYXJpdHlJZHgIBQ0kdDAyOTcxMTI5OTI3Al80BAxuZXdSYXJpdHlJZHgDCQAAAgUJcmFyaXR5SWR4BQppZHhSYXJpdHlDAwkAZgIJAJEDAgUQcmFyaXR5VGhyZXNob2xkcwUNaWR4VGhyZXNob2xkQwUKdG90YWxCb251cwUKaWR4UmFyaXR5QwMJAGYCCQCRAwIFEHJhcml0eVRocmVzaG9sZHMFDWlkeFRocmVzaG9sZFUFCnRvdGFsQm9udXMFCmlkeFJhcml0eVUJAAIBCQCsAgIJAKwCAgI6WW91IGNhbiBhZHZhbmNlIG9ubHkgb25lIGxldmVsIG9mIHJhcml0eSwgbWF4IHRvdGFsIGJvbnVzIAkApAMBCQCRAwIFEHJhcml0eVRocmVzaG9sZHMFDWlkeFRocmVzaG9sZFUCASUDCQAAAgUJcmFyaXR5SWR4BQppZHhSYXJpdHlVAwkAZgIJAJEDAgUQcmFyaXR5VGhyZXNob2xkcwUNaWR4VGhyZXNob2xkVQUKdG90YWxCb251cwUKaWR4UmFyaXR5VQMJAGYCCQCRAwIFEHJhcml0eVRocmVzaG9sZHMFDWlkeFRocmVzaG9sZEwFCnRvdGFsQm9udXMFCmlkeFJhcml0eUwJAAIBCQCsAgIJAKwCAgI6WW91IGNhbiBhZHZhbmNlIG9ubHkgb25lIGxldmVsIG9mIHJhcml0eSwgbWF4IHRvdGFsIGJvbnVzIAkApAMBCQCRAwIFEHJhcml0eVRocmVzaG9sZHMFDWlkeFRocmVzaG9sZEwCASUDCQAAAgUJcmFyaXR5SWR4BQppZHhSYXJpdHlMAwkAZgIJAJEDAgUQcmFyaXR5VGhyZXNob2xkcwUNaWR4VGhyZXNob2xkTAUKdG90YWxCb251cwUKaWR4UmFyaXR5TAUKaWR4UmFyaXR5RQMJAAACBQlyYXJpdHlJZHgFCmlkeFJhcml0eUUFCmlkeFJhcml0eUUDCQAAAgUJcmFyaXR5SWR4BQppZHhSYXJpdHlQCQACAQImWW91IGNhbid0IGV4Y2hhbmdlIE5GVHMgb2YgdGhpcyByYXJpdHkJAAIBAg5Vbmtub3duIHJhcml0eQQJbWluV2xnRmVlCQBrAwUKdG90YWxCb251cwUGTVVMVDE0CQELZ2V0V2xnUHJpY2UBAAAEBmNoYW5nZQkAZQIFBndsZ0ZlZQUJbWluV2xnRmVlBAdmb3JUZWFtCQBpAgUJbWluV2xnRmVlAAIECXdsZ1JlbWFpbgkBBWFzSW50AQkA/AcEBQt3bGdDb250cmFjdAIKYnVybldsZ29sZAkAzAgCCQBlAgUJbWluV2xnRmVlBQdmb3JUZWFtBQNuaWwFA25pbAMJAGYCAAAFBmNoYW5nZQkAAgEJAKwCAgkArAICAhNZb3UgbmVlZCB0byBhdHRhY2ggCQEKZml4ZWRQb2ludAIFCW1pbldsZ0ZlZQAIAg4gV0xHT0xEIGFzIGZlZQQNY2hhbmdlQWN0aW9ucwMJAGYCBQZjaGFuZ2UAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmNoYW5nZQUKd2xnQXNzZXRJZAUDbmlsBQNuaWwEDSR0MDMxNDY0MzE2MjUJAQ5pc3N1ZU5mdEN1c3RvbQgFDmlkeE5hbWVQaWNrYXhlBQxuZXdSYXJpdHlJZHgFCmlkeENvbGxEaWcFDG5ld1Jhcml0eUlkeAUKdG90YWxCb251cwUPaWR4RGVzY3JQaWNrYXhlBQ5pZHhCb251c1R5cGVGcAgFAWkGY2FsbGVyBA9pc3N1ZU5mdEFjdGlvbnMIBQ0kdDAzMTQ2NDMxNjI1Al8xBApuZnRBc3NldElkCAUNJHQwMzE0NjQzMTYyNQJfMgQGYnVybmVkCQCQAwEFC2J1cm5BY3Rpb25zBBJidXJuQ291bnRlckFjdGlvbnMDCQAAAgUGYnVybmVkAAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5TmZ0VG90YWxCdXJuZWQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFEWtleU5mdFRvdGFsQnVybmVkAAAFBmJ1cm5lZAUDbmlsCQCUCgIJAM0IAgkAzggCCQDOCAIJAM4IAgkAzggCBQ9pc3N1ZU5mdEFjdGlvbnMFC2J1cm5BY3Rpb25zBRJidXJuQ291bnRlckFjdGlvbnMFDXByb2xvZ0FjdGlvbnMFDWNoYW5nZUFjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFC3dsZ0NvbnRyYWN0BQt0ZWFtQWRkcktleQUHZm9yVGVhbQUKd2xnQXNzZXRJZAkAlAoCBQpuZnRBc3NldElkBQl3bGdSZW1haW4BaQEMb3Blbk5mdENoZXN0AAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECElRlbXBvcmFyeSBkaXNhYmxlZAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQJd2xnQW1vdW50CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFCndsZ0Fzc2V0SWQJAAIBAhVXTEdPTEQgcGF5bWVudHMgb25seSEECW1pbldsZ0ZlZQkAawMFFE5GVF9DSEVTVF9QUklDRV9VU0RUBQVNVUxUOAkBC2dldFdsZ1ByaWNlAQAABAZjaGFuZ2UJAGUCBQl3bGdBbW91bnQFCW1pbldsZ0ZlZQQHZm9yVGVhbQkAaQIFCW1pbldsZ0ZlZQACBAl3bGdSZW1haW4JAQVhc0ludAEJAPwHBAULd2xnQ29udHJhY3QCCmJ1cm5XbGdvbGQJAMwIAgkAZQIFCW1pbldsZ0ZlZQUHZm9yVGVhbQUDbmlsBQNuaWwDCQBmAgAABQZjaGFuZ2UJAAIBCQCsAgIJAKwCAgITWW91IG5lZWQgdG8gYXR0YWNoIAkBCmZpeGVkUG9pbnQCBQltaW5XbGdGZWUACAIOIFdMR09MRCBhcyBmZWUEDWNoYW5nZUFjdGlvbnMDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZjaGFuZ2UFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBARhZGRyCQClCAEIBQFpBmNhbGxlcgQJZmluaXNoS2V5CQEJa2V5Q29tbWl0AQUEYWRkcgQLZmluaXNoQmxvY2sJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQlmaW5pc2hLZXkCJFlvdSBoYXZlIHRvIGNvbW1pdEZvclJhbmRvbSgpIGZpcnN0IQMJAGYCBQtmaW5pc2hCbG9jawUGaGVpZ2h0CQACAQkArAICAjRSYW5kb20gbnVtYmVyIGlzIG5vdCByZWFkeSB5ZXQsIHdhaXQgdW50aWwgaGVpZ2h0ID0gCQCkAwEFC2ZpbmlzaEJsb2NrBAdlbnRyb3B5CQEFdmFsdWUBCAkBBXZhbHVlAQkA7QcBBQtmaW5pc2hCbG9jawN2cmYEBHNhbHQJANkEAQkAkQMCCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFGtleUN1cldlZWtUeElkQnlVc2VyAQUEYWRkcgIKNDJfREVGQVVMVAIBXwABBARyYW5kCQEPZ2V0UmFuZG9tTnVtYmVyAwBkBQRzYWx0BQdlbnRyb3B5BA0kdDAzMzcwNjMzOTc4AwkAZgIAVAUEcmFuZAkAlAoCAAEFCmlkeFJhcml0eUMDCQBmAgBiBQRyYW5kCQCUCgIABQUKaWR4UmFyaXR5VQkAlAoCAAoFCmlkeFJhcml0eUwEBWJvbnVzCAUNJHQwMzM3MDYzMzk3OAJfMQQJcmFyaXR5SWR4CAUNJHQwMzM3MDYzMzk3OAJfMgQNJHQwMzM5ODEzNDEzMQkBDmlzc3VlTmZ0Q3VzdG9tCAUOaWR4TmFtZVBpY2theGUFCXJhcml0eUlkeAUKaWR4Q29sbERpZwUJcmFyaXR5SWR4BQVib251cwUPaWR4RGVzY3JQaWNrYXhlBQ5pZHhCb251c1R5cGVGcAgFAWkGY2FsbGVyBA9pc3N1ZU5mdEFjdGlvbnMIBQ0kdDAzMzk4MTM0MTMxAl8xBApuZnRBc3NldElkCAUNJHQwMzM5ODEzNDEzMQJfMgkAlAoCCQDNCAIJAM0IAgkAzggCCQDOCAIFD2lzc3VlTmZ0QWN0aW9ucwUNcHJvbG9nQWN0aW9ucwUNY2hhbmdlQWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgULd2xnQ29udHJhY3QFC3RlYW1BZGRyS2V5BQdmb3JUZWFtBQp3bGdBc3NldElkCQELRGVsZXRlRW50cnkBBQlmaW5pc2hLZXkJAJQKAgUKbmZ0QXNzZXRJZAUJd2xnUmVtYWluAWkBD2NvbW1pdEZvclJhbmRvbQADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhJUZW1wb3JhcnkgZGlzYWJsZWQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBARhZGRyCQClCAEIBQFpBmNhbGxlcgQJZmluaXNoS2V5CQEJa2V5Q29tbWl0AQUEYWRkcgMJAQlpc0RlZmluZWQBCQCfCAEFCWZpbmlzaEtleQkAAgECLllvdSBhbHJlYWR5IGNvbW1pdGVkIGZvciByYW5kb20sIHBsZWFzZSB1c2UgaXQEC2ZpbmlzaEJsb2NrCQBkAgUGaGVpZ2h0BQxSQU5ET01fREVMQVkJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlmaW5pc2hLZXkFC2ZpbmlzaEJsb2NrBQNuaWwFDXByb2xvZ0FjdGlvbnMFC2ZpbmlzaEJsb2NrAWkBDmRyYXdQcm9tb1JvdW5kAQdyb3VuZElkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEBXRvZGF5CQBpAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTBAhtYXhWYWx1ZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRrZXlUb3RhbFByb21vVGlja2V0cwAAAwkAAAIFCG1heFZhbHVlAAAJAAIBAhJObyB0aWNrZXRzIHRvIGRyYXcEAWIJAGgCBQV0b2RheQUKREFZX0JMT0NLUwQBaAMJAGYCBQFiBQpWUkZfT0ZGU0VUBQFiCQBkAgUBYgUKVlJGX09GRlNFVAQHZW50cm9weQkBBXZhbHVlAQgJAQV2YWx1ZQEJAO0HAQUBaAN2cmYECHByb21vTWFwCQELdmFsdWVPckVsc2UCCQCiCAEFC2tleVByb21vTWFwAgADCQAAAgUIcHJvbW9NYXACAAkAAgECD05vIHBhcnRpY2lwYW50cwoBCnNpbmdsZURyYXcCAmFjAWoDCQAAAggFAmFjAl8zAgAFAmFjBAlwcm9tb0xpc3QJAL0JAggFAmFjAl8zAgFfBARyYW5kCQEPZ2V0UmFuZG9tTnVtYmVyAwgFAmFjAl8xCAUCYWMCXzIFB2VudHJvcHkKAQxjb3VudFRpY2tldHMCA2FjYwJlbAQFcGFydHMJALUJAgUCZWwCAToEBGFkZHIJAJEDAgUFcGFydHMAAAQHdGlja2V0cwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAEECG5ld1RvdGFsCQBkAggFA2FjYwJfMQUHdGlja2V0cwMDCQAAAggFA2FjYwJfMwIACQBmAgUIbmV3VG90YWwFBHJhbmQHCQCVCgMFCG5ld1RvdGFsBQd0aWNrZXRzBQRhZGRyCQCVCgMFCG5ld1RvdGFsCAUDYWNjAl8yCAUDYWNjAl8zBAFyCgACJGwFCXByb21vTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAAAAACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMY291bnRUaWNrZXRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhVMaXN0IHNpemUgZXhjZWVkcyAyMDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZABlAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAHIAcwB0AHUAdgB3AHgAeQB6AHsAfAB9AH4AfwCAAQCBAQCCAQCDAQCEAQCFAQCGAQCHAQCIAQCJAQCKAQCLAQCMAQCNAQCOAQCPAQCQAQCRAQCSAQCTAQCUAQCVAQCWAQCXAQCYAQCZAQCaAQCbAQCcAQCdAQCeAQCfAQCgAQChAQCiAQCjAQCkAQClAQCmAQCnAQCoAQCpAQCqAQCrAQCsAQCtAQCuAQCvAQCwAQCxAQCyAQCzAQC0AQC1AQC2AQC3AQC4AQC5AQC6AQC7AQC8AQC9AQC+AQC/AQDAAQDBAQDCAQDDAQDEAQDFAQDGAQDHAQDIAQQGd2lubmVyCAUBcgJfMwMJAAACBQZ3aW5uZXICAAUCYWMECG1hcFBhcnRzCQC9CQIIBQJhYwJfMwUGd2lubmVyBAZuZXdNYXADCQAAAgkAkQMCBQhtYXBQYXJ0cwAAAgAJALACAgkAkQMCBQhtYXBQYXJ0cwABAAUJAKwCAgkAswICCQCRAwIFCG1hcFBhcnRzAAAAAQkAsAICCQCRAwIFCG1hcFBhcnRzAAEABAQKd2luQWN0aW9ucwMJAAACBQFqAAAJAPwHBAUEdGhpcwIMaXNzdWVNaXR0ZW5QCQDMCAIFBndpbm5lcgkAzAgCBgUDbmlsBQNuaWwJAPwHBAUEdGhpcwINc3Rha2VBY3Jlc0ZvcgkAzAgCBQZ3aW5uZXIJAMwIAgkAkQMCBRJwcm9tb0F3YXJkUGVyUm91bmQFAWoJAMwIAgYFA25pbAUDbmlsAwkAAAIFCndpbkFjdGlvbnMFCndpbkFjdGlvbnMEB25ld1NhbHQJANkEAQkAkQMCCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFGtleUN1cldlZWtUeElkQnlVc2VyAQUGd2lubmVyAgkwX0RFRkFVTFQCAV8AAQkAlgoECQBlAggFAmFjAl8xCAUBcgJfMgUHbmV3U2FsdAUGbmV3TWFwCQDNCAIIBQJhYwJfNAUGd2lubmVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAVkcmF3cwoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFCG1heFZhbHVlCAUBaQ10cmFuc2FjdGlvbklkBQhwcm9tb01hcAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpzaW5nbGVEcmF3AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa2V5UHJvbW9NYXAIBQVkcmF3cwJfMwkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5VG90YWxQcm9tb1RpY2tldHMIBQVkcmF3cwJfMQkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5UHJvbW9Sb3VuZFdpbm5lcnMBBQdyb3VuZElkCQC5CQIIBQVkcmF3cwJfNAIBXwUDbmlsAAAA/H7Tag==", "height": 3414917, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EFMzGNnetgUYgG2FEKJa5NhikD2n4zd7CZcrJ3iVycu1 Next: AxubzhDBPDKtmBBiHUotwkJzTYUhXn28PbvoyDRoSCXF Diff:
OldNewDifferences
594594 }
595595
596596
597+func processPromo (address,amt,shouldCleanPromo) = if (if ((height >= DAILY_PROMO_START_BLOCK))
598+ then (DAILY_PROMO_END_BLOCK > height)
599+ else false)
600+ then {
601+ let promoAcresKey = keyUserPromoAcres(address)
602+ let promoAcres = ((if (shouldCleanPromo)
603+ then 0
604+ else valueOrElse(getInteger(promoAcresKey), 0)) + amt)
605+ let tickets = (promoAcres / MULT8)
606+ let ticketsKey = keyUserPromoTickets(address)
607+ let deltaTickets = (tickets - valueOrElse(getInteger(ticketsKey), 0))
608+ let totalTickets = (valueOrElse(getInteger(keyTotalPromoTickets), 0) + deltaTickets)
609+ if (if (shouldCleanPromo)
610+ then true
611+ else (deltaTickets > 0))
612+ then {
613+ let promoMap = valueOrElse(getString(keyPromoMap), "")
614+ let userRecord = ((address + ":") + padL(tickets, 3))
615+ let newMap = if (contains(promoMap, address))
616+ then {
617+ let mapParts = split_51C(promoMap, address)
618+ if ((mapParts[0] == ""))
619+ then {
620+ let r = drop(mapParts[1], 4)
621+ if ((r == ""))
622+ then if ((tickets == 0))
623+ then ""
624+ else userRecord
625+ else if ((tickets == 0))
626+ then drop(r, 1)
627+ else (userRecord + r)
628+ }
629+ else {
630+ let r = drop(mapParts[1], 4)
631+ if ((r == ""))
632+ then if ((tickets == 0))
633+ then dropRight(mapParts[0], 1)
634+ else (mapParts[0] + userRecord)
635+ else if ((tickets == 0))
636+ then (mapParts[0] + drop(r, 1))
637+ else ((mapParts[0] + userRecord) + r)
638+ }
639+ }
640+ else if ((tickets == 0))
641+ then promoMap
642+ else if ((promoMap == ""))
643+ then userRecord
644+ else ((promoMap + "_") + userRecord)
645+[IntegerEntry(promoAcresKey, promoAcres), IntegerEntry(ticketsKey, tickets), IntegerEntry(keyTotalPromoTickets, totalTickets), StringEntry(keyPromoMap, newMap)]
646+ }
647+ else [IntegerEntry(promoAcresKey, promoAcres)]
648+ }
649+ else nil
650+
651+
597652 func stakeAcresForInternal (address,amt,shouldCleanPromo) = {
598- let $t01142011496 = stakeUnstakeAcresInternal(amt, address, 0)
599- let actions = $t01142011496._1
600- let wlgClaimedAmount = $t01142011496._2
601- let promoActions = if (if ((height >= DAILY_PROMO_START_BLOCK))
602- then (DAILY_PROMO_END_BLOCK > height)
603- else false)
604- then {
605- let promoAcresKey = keyUserPromoAcres(address)
606- let promoAcres = ((if (shouldCleanPromo)
607- then 0
608- else valueOrElse(getInteger(promoAcresKey), 0)) + amt)
609- let tickets = (promoAcres / MULT8)
610- let ticketsKey = keyUserPromoTickets(address)
611- let deltaTickets = (tickets - valueOrElse(getInteger(ticketsKey), 0))
612- let totalTickets = (valueOrElse(getInteger(keyTotalPromoTickets), 0) + deltaTickets)
613- if (if (shouldCleanPromo)
614- then true
615- else (deltaTickets > 0))
616- then {
617- let promoMap = valueOrElse(getString(keyPromoMap), "")
618- let userRecord = ((address + ":") + padL(tickets, 3))
619- let newMap = if (contains(promoMap, address))
620- then {
621- let mapParts = split_51C(promoMap, address)
622- if ((mapParts[0] == ""))
623- then {
624- let r = drop(mapParts[1], 4)
625- if ((r == ""))
626- then if ((tickets == 0))
627- then ""
628- else userRecord
629- else if ((tickets == 0))
630- then drop(r, 1)
631- else (userRecord + r)
632- }
633- else {
634- let r = drop(mapParts[1], 4)
635- if ((r == ""))
636- then if ((tickets == 0))
637- then dropRight(mapParts[0], 1)
638- else (mapParts[0] + userRecord)
639- else if ((tickets == 0))
640- then (mapParts[0] + drop(r, 1))
641- else ((mapParts[0] + userRecord) + r)
642- }
643- }
644- else if ((tickets == 0))
645- then promoMap
646- else if ((promoMap == ""))
647- then userRecord
648- else ((promoMap + "_") + userRecord)
649-[IntegerEntry(promoAcresKey, promoAcres), IntegerEntry(ticketsKey, tickets), IntegerEntry(keyTotalPromoTickets, totalTickets), StringEntry(keyPromoMap, newMap)]
650- }
651- else [IntegerEntry(promoAcresKey, promoAcres)]
652- }
653- else nil
653+ let $t01395414030 = stakeUnstakeAcresInternal(amt, address, 0)
654+ let actions = $t01395414030._1
655+ let wlgClaimedAmount = $t01395414030._2
656+ let promoActions = processPromo(address, amt, shouldCleanPromo)
654657 $Tuple2((actions ++ promoActions), wlgClaimedAmount)
655658 }
656659
697700 if ((arbReleaseTime > lastBlock.timestamp))
698701 then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
699702 else {
700- let $t01549915579 = stakeUnstakeAcresInternal(-(amount), address, 0)
701- let actions = $t01549915579._1
702- let wlgClaimedAmount = $t01549915579._2
703+ let $t01562515705 = stakeUnstakeAcresInternal(-(amount), address, 0)
704+ let actions = $t01562515705._1
705+ let wlgClaimedAmount = $t01562515705._2
703706 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
704707 }
705708 }
722725 else (value(pmt.assetId) != acresAssetId))
723726 then throw("ACRES payments only!")
724727 else {
725- let $t01603016111 = stakeAcresForInternal(address, amt, false)
726- let stakeActions = $t01603016111._1
727- let wlgClaimedAmount = $t01603016111._2
728+ let $t01615616237 = stakeAcresForInternal(address, amt, false)
729+ let stakeActions = $t01615616237._1
730+ let wlgClaimedAmount = $t01615616237._2
728731 $Tuple2((stakeActions ++ prologActions), wlgClaimedAmount)
729732 }
730733 }
795798 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
796799 else {
797800 let addr = toString(i.caller)
798- let $t01818318231 = getSwapLimitAcres()
799- let limitAction = $t01818318231._1
800- let maxUsdt = $t01818318231._2
801+ let $t01830918357 = getSwapLimitAcres()
802+ let limitAction = $t01830918357._1
803+ let maxUsdt = $t01830918357._2
801804 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
802805 if ((acresAmount > maxAcres))
803806 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
813816
814817 @Callable(i)
815818 func sellAcresREADONLY (address,acresAmount) = {
816- let $t01872718775 = getSwapLimitAcres()
817- let limitAction = $t01872718775._1
818- let maxUsdt = $t01872718775._2
819+ let $t01885318901 = getSwapLimitAcres()
820+ let limitAction = $t01885318901._1
821+ let maxUsdt = $t01885318901._2
819822 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
820823 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
821824 }
876879 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
877880 if ((req == req))
878881 then {
879- let $t02128921428 = issueNftCustom(idxNameShovel, idxKeySP, idxCollDig, idxRarityP, 3, idxDescrShovel, idxBonusTypeFp, i.caller)
880- let nftActions = $t02128921428._1
881- let nftAssetId = $t02128921428._2
882+ let $t02141521554 = issueNftCustom(idxNameShovel, idxKeySP, idxCollDig, idxRarityP, 3, idxDescrShovel, idxBonusTypeFp, i.caller)
883+ let nftActions = $t02141521554._1
884+ let nftAssetId = $t02141521554._2
882885 $Tuple6(rr._1, rr._2, rr._3, rr._4, rr._5, nftActions)
883886 }
884887 else throw("Strict value is not equal to itself.")
949952 let userFpKey = keyFarmingPowerByUser(address)
950953 let oldFp = valueOrElse(getInteger(userFpKey), 0)
951954 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(address)), 0)
952- let $t02369923786 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
953- let newBonusedFp = $t02369923786._1
954- let ignored = $t02369923786._2
955+ let $t02382523912 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
956+ let newBonusedFp = $t02382523912._1
957+ let ignored = $t02382523912._2
955958 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
956959 let newTotalFp = ((oldTotalFp + newBonusedFp) - oldFp)
957960 $Tuple2(nil, [oldFp, newBonusedFp, oldTotalFp, newTotalFp])
967970
968971
969972 @Callable(i)
970-func issueMittenP (forAddress) = if ((i.caller != this))
973+func issueMittenP (forAddress,shouldCleanPromo) = if ((i.caller != this))
971974 then throw("Permission denied")
972- else issueNftCustom(idxNameMitten, idxKeyMP, idxCollNewYear, idxRarityP, 3, idxDescrMitten, idxBonusTypeFp, addressFromStringValue(forAddress))
975+ else {
976+ let $t02452824698 = issueNftCustom(idxNameMitten, idxKeyMP, idxCollNewYear, idxRarityP, 3, idxDescrMitten, idxBonusTypeFp, addressFromStringValue(forAddress))
977+ let nftActions = $t02452824698._1
978+ let nftAssetId = $t02452824698._2
979+ let promoActions = processPromo(forAddress, 0, shouldCleanPromo)
980+ $Tuple2((nftActions ++ promoActions), nftAssetId)
981+ }
973982
974983
975984
10001009 let listAction = StringEntry(nftsKey, makeString_2C((nfts :+ assetIdStr), "_"))
10011010 if ((asset.issuer == this))
10021011 then {
1003- let $t02548525675 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
1004- let actions = $t02548525675._1
1005- let wlgClaimedAmount = $t02548525675._2
1012+ let $t02575025940 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
1013+ let actions = $t02575025940._1
1014+ let wlgClaimedAmount = $t02575025940._2
10061015 $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
10071016 }
10081017 else if ((isArkimalIssued(asset) == ""))
10091018 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
10101019 else {
1011- let $t02585626007 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
1012- let actions = $t02585626007._1
1013- let wlgClaimedAmount = $t02585626007._2
1020+ let $t02612126272 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
1021+ let actions = $t02612126272._1
1022+ let wlgClaimedAmount = $t02612126272._2
10141023 $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
10151024 }
10161025 }
10471056 then {
10481057 let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
10491058 let bonusVal = (bonusByDescription(value(asset.description)) * 10000)
1050- let $t02717227251 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
1051- let actions = $t02717227251._1
1052- let wlgClaimedAmount = $t02717227251._2
1059+ let $t02743727516 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
1060+ let actions = $t02743727516._1
1061+ let wlgClaimedAmount = $t02743727516._2
10531062 $Tuple2(((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber - 1))) :+ IntegerEntry(keyWlNftTotalStaked, max([0, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) - 1)]))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
10541063 }
10551064 else {
10581067 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
10591068 else {
10601069 let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
1061- let $t02791127995 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
1062- let actions = $t02791127995._1
1063- let wlgClaimedAmount = $t02791127995._2
1070+ let $t02817628260 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
1071+ let actions = $t02817628260._1
1072+ let wlgClaimedAmount = $t02817628260._2
10641073 $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
10651074 }
10661075 }
11041113 }
11051114 }
11061115
1107- let $t02944629662 = {
1116+ let $t02971129927 = {
11081117 let $l = i.payments
11091118 let $s = size($l)
11101119 let $acc0 = $Tuple4(0, 0, nil, -1)
11181127
11191128 $f0_2($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)
11201129 }
1121- let wlgFee = $t02944629662._1
1122- let totalBonus = $t02944629662._2
1123- let burnActions = $t02944629662._3
1124- let rarityIdx = $t02944629662._4
1130+ let wlgFee = $t02971129927._1
1131+ let totalBonus = $t02971129927._2
1132+ let burnActions = $t02971129927._3
1133+ let rarityIdx = $t02971129927._4
11251134 let newRarityIdx = if ((rarityIdx == idxRarityC))
11261135 then if ((rarityThresholds[idxThresholdC] > totalBonus))
11271136 then idxRarityC
11531162 let changeActions = if ((change > 0))
11541163 then [ScriptTransfer(i.caller, change, wlgAssetId)]
11551164 else nil
1156- let $t03119931360 = issueNftCustom(idxNamePickaxe, newRarityIdx, idxCollDig, newRarityIdx, totalBonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
1157- let issueNftActions = $t03119931360._1
1158- let nftAssetId = $t03119931360._2
1165+ let $t03146431625 = issueNftCustom(idxNamePickaxe, newRarityIdx, idxCollDig, newRarityIdx, totalBonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
1166+ let issueNftActions = $t03146431625._1
1167+ let nftAssetId = $t03146431625._2
11591168 let burned = size(burnActions)
11601169 let burnCounterActions = if ((burned == 0))
11611170 then nil
12011210 let entropy = value(value(blockInfoByHeight(finishBlock)).vrf)
12021211 let salt = fromBase58String(split(valueOrElse(getString(keyCurWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
12031212 let rand = getRandomNumber(100, salt, entropy)
1204- let $t03344133713 = if ((84 > rand))
1213+ let $t03370633978 = if ((84 > rand))
12051214 then $Tuple2(1, idxRarityC)
12061215 else if ((98 > rand))
12071216 then $Tuple2(5, idxRarityU)
12081217 else $Tuple2(10, idxRarityL)
1209- let bonus = $t03344133713._1
1210- let rarityIdx = $t03344133713._2
1211- let $t03371633866 = issueNftCustom(idxNamePickaxe, rarityIdx, idxCollDig, rarityIdx, bonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
1212- let issueNftActions = $t03371633866._1
1213- let nftAssetId = $t03371633866._2
1218+ let bonus = $t03370633978._1
1219+ let rarityIdx = $t03370633978._2
1220+ let $t03398134131 = issueNftCustom(idxNamePickaxe, rarityIdx, idxCollDig, rarityIdx, bonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
1221+ let issueNftActions = $t03398134131._1
1222+ let nftAssetId = $t03398134131._2
12141223 $Tuple2(((((issueNftActions ++ prologActions) ++ changeActions) :+ ScriptTransfer(addressFromStringValue(getStringValue(wlgContract, teamAddrKey)), forTeam, wlgAssetId)) :+ DeleteEntry(finishKey)), $Tuple2(nftAssetId, wlgRemain))
12151224 }
12161225 }
12551264 if ((promoMap == ""))
12561265 then throw("No participants")
12571266 else {
1258- func singleDraw (ac,j) = {
1259- let promoList = if ((ac._3 == ""))
1260- then nil
1261- else split_51C(ac._3, "_")
1262- if ((j >= size(promoList)))
1263- then ac
1264- else {
1265- let rand = getRandomNumber(ac._1, ac._2, entropy)
1266- func countTickets (acc,el) = {
1267- let parts = split(el, ":")
1268- let addr = parts[0]
1269- let tickets = parseIntValue(parts[1])
1270- let newTotal = (acc._1 + tickets)
1271- if (if ((acc._3 == ""))
1272- then (newTotal > rand)
1273- else false)
1274- then $Tuple3(newTotal, tickets, addr)
1275- else $Tuple3(newTotal, acc._2, acc._3)
1267+ func singleDraw (ac,j) = if ((ac._3 == ""))
1268+ then ac
1269+ else {
1270+ let promoList = split_51C(ac._3, "_")
1271+ let rand = getRandomNumber(ac._1, ac._2, entropy)
1272+ func countTickets (acc,el) = {
1273+ let parts = split(el, ":")
1274+ let addr = parts[0]
1275+ let tickets = parseIntValue(parts[1])
1276+ let newTotal = (acc._1 + tickets)
1277+ if (if ((acc._3 == ""))
1278+ then (newTotal > rand)
1279+ else false)
1280+ then $Tuple3(newTotal, tickets, addr)
1281+ else $Tuple3(newTotal, acc._2, acc._3)
1282+ }
1283+
1284+ let r = {
1285+ let $l = promoList
1286+ let $s = size($l)
1287+ let $acc0 = $Tuple3(0, 0, "")
1288+ func $f0_1 ($a,$i) = if (($i >= $s))
1289+ then $a
1290+ else countTickets($a, $l[$i])
1291+
1292+ func $f0_2 ($a,$i) = if (($i >= $s))
1293+ then $a
1294+ else throw("List size exceeds 200")
1295+
1296+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100), 101), 102), 103), 104), 105), 106), 107), 108), 109), 110), 111), 112), 113), 114), 115), 116), 117), 118), 119), 120), 121), 122), 123), 124), 125), 126), 127), 128), 129), 130), 131), 132), 133), 134), 135), 136), 137), 138), 139), 140), 141), 142), 143), 144), 145), 146), 147), 148), 149), 150), 151), 152), 153), 154), 155), 156), 157), 158), 159), 160), 161), 162), 163), 164), 165), 166), 167), 168), 169), 170), 171), 172), 173), 174), 175), 176), 177), 178), 179), 180), 181), 182), 183), 184), 185), 186), 187), 188), 189), 190), 191), 192), 193), 194), 195), 196), 197), 198), 199), 200)
1297+ }
1298+ let winner = r._3
1299+ if ((winner == ""))
1300+ then ac
1301+ else {
1302+ let mapParts = split_51C(ac._3, winner)
1303+ let newMap = if ((mapParts[0] == ""))
1304+ then drop(mapParts[1], 5)
1305+ else (dropRight(mapParts[0], 1) + drop(mapParts[1], 4))
1306+ let winActions = if ((j == 0))
1307+ then invoke(this, "issueMittenP", [winner, true], nil)
1308+ else invoke(this, "stakeAcresFor", [winner, promoAwardPerRound[j], true], nil)
1309+ if ((winActions == winActions))
1310+ then {
1311+ let newSalt = fromBase58String(split(valueOrElse(getString(keyCurWeekTxIdByUser(winner)), "0_DEFAULT"), "_")[1])
1312+ $Tuple4((ac._1 - r._2), newSalt, newMap, (ac._4 :+ winner))
1313+ }
1314+ else throw("Strict value is not equal to itself.")
12761315 }
1277-
1278- let r = {
1279- let $l = promoList
1280- let $s = size($l)
1281- let $acc0 = $Tuple3(0, 0, "")
1282- func $f0_1 ($a,$i) = if (($i >= $s))
1283- then $a
1284- else countTickets($a, $l[$i])
1285-
1286- func $f0_2 ($a,$i) = if (($i >= $s))
1287- then $a
1288- else throw("List size exceeds 200")
1289-
1290- $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($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100), 101), 102), 103), 104), 105), 106), 107), 108), 109), 110), 111), 112), 113), 114), 115), 116), 117), 118), 119), 120), 121), 122), 123), 124), 125), 126), 127), 128), 129), 130), 131), 132), 133), 134), 135), 136), 137), 138), 139), 140), 141), 142), 143), 144), 145), 146), 147), 148), 149), 150), 151), 152), 153), 154), 155), 156), 157), 158), 159), 160), 161), 162), 163), 164), 165), 166), 167), 168), 169), 170), 171), 172), 173), 174), 175), 176), 177), 178), 179), 180), 181), 182), 183), 184), 185), 186), 187), 188), 189), 190), 191), 192), 193), 194), 195), 196), 197), 198), 199), 200)
1291- }
1292- let winner = r._3
1293- if ((winner == ""))
1294- then ac
1295- else {
1296- let mapParts = split_51C(ac._3, winner)
1297- let newMap = if ((mapParts[0] == ""))
1298- then drop(mapParts[1], 5)
1299- else (dropRight(mapParts[0], 1) + drop(mapParts[1], 4))
1300- let winActions = if ((j == 0))
1301- then invoke(this, "issueMittenP", [winner], nil)
1302- else invoke(this, "stakeAcresFor", [winner, promoAwardPerRound[j], true], nil)
1303- if ((winActions == winActions))
1304- then {
1305- let newSalt = fromBase58String(split(valueOrElse(getString(keyCurWeekTxIdByUser(winner)), "0_DEFAULT"), "_")[1])
1306- $Tuple4((ac._1 - r._2), newSalt, newMap, (ac._4 :+ winner))
1307- }
1308- else throw("Strict value is not equal to itself.")
1309- }
1310- }
1311- }
1316+ }
13121317
13131318 let draws = {
13141319 let $l = [0, 1, 2, 3, 4, 5]
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT7 = 10000000
99
1010 let MULT8 = 100000000
1111
1212 let MULT14 = 100000000000000
1313
1414 let DAY_MILLIS = 86400000
1515
1616 let USDT2ACRES_MULTIPLIER = 10
1717
1818 let ONE_PERCENT_DIVISOR = 100
1919
2020 let RANDOM_DELAY = 2
2121
2222 let NFT_CHEST_PRICE_USDT = 5000000
2323
2424 let chain = take(drop(this.bytes, 1), 1)
2525
2626 let DAILY_PROMO_START_BLOCK = match chain {
2727 case _ =>
2828 if ((base58'2W' == $match0))
2929 then 4487040
3030 else if ((base58'2T' == $match0))
3131 then 3412800
3232 else throw("Unknown chain")
3333 }
3434
3535 let DAILY_PROMO_END_BLOCK = match chain {
3636 case _ =>
3737 if ((base58'2W' == $match0))
3838 then 4517280
3939 else if ((base58'2T' == $match0))
4040 then 3443040
4141 else throw("Unknown chain")
4242 }
4343
4444 let DAY_BLOCKS = match chain {
4545 case _ =>
4646 if ((base58'2W' == $match0))
4747 then 1440
4848 else if ((base58'2T' == $match0))
4949 then 60
5050 else throw("Unknown chain")
5151 }
5252
5353 let WEEK_BLOCKS = match chain {
5454 case _ =>
5555 if ((base58'2W' == $match0))
5656 then 10080
5757 else if ((base58'2T' == $match0))
5858 then 180
5959 else throw("Unknown chain")
6060 }
6161
6262 let VRF_OFFSET = match chain {
6363 case _ =>
6464 if ((base58'2W' == $match0))
6565 then 0
6666 else if ((base58'2T' == $match0))
6767 then 1146000
6868 else throw("Unknown chain")
6969 }
7070
7171 let usdtAssetId = match chain {
7272 case _ =>
7373 if ((base58'2W' == $match0))
7474 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
7575 else if ((base58'2T' == $match0))
7676 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
7777 else throw("Unknown chain")
7878 }
7979
8080 let defaultRest2AddressStr = match chain {
8181 case _ =>
8282 if ((base58'2W' == $match0))
8383 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
8484 else if ((base58'2T' == $match0))
8585 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
8686 else throw("Unknown chain")
8787 }
8888
8989 let arbitrageDelay = match chain {
9090 case _ =>
9191 if ((base58'2W' == $match0))
9292 then DAY_MILLIS
9393 else if ((base58'2T' == $match0))
9494 then 60000
9595 else throw("Unknown chain")
9696 }
9797
9898 let oldStakingContractStr = match chain {
9999 case _ =>
100100 if ((base58'2W' == $match0))
101101 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
102102 else if ((base58'2T' == $match0))
103103 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
104104 else throw("Unknown chain")
105105 }
106106
107107 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
108108
109109
110110 let IdxCfgAcres2Dapp = 1
111111
112112 let IdxCfgWlgDapp = 2
113113
114114 let IdxCfgInvestFundDapp = 5
115115
116116 let IdxCfgMarketDapp = 6
117117
118118 func keyRestCfg () = "%s__restConfig"
119119
120120
121121 func keyRest2Address () = "%s__rest2Addr"
122122
123123
124124 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
125125
126126
127127 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
128128
129129
130130 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
131131
132132 let rest2Cfg = readRestCfgOrFail(rest2Contract)
133133
134134 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
135135
136136 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
137137
138138 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
139139
140140 let marketContract = getContractAddressOrFail(rest2Cfg, IdxCfgMarketDapp)
141141
142142 let oldAcresContractKey = "oldAcresContract"
143143
144144 func keyBlocked () = "contractsBlocked"
145145
146146
147147 func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
148148
149149
150150 func keyCurWeekTxIdByUser (addr) = ("curWeekTxIdByUser_" + addr)
151151
152152
153153 func keyCommit (address) = ("finishBlockFor_" + address)
154154
155155
156156 let wlgAssetIdKey = "wlg_assetId"
157157
158158 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
159159
160160 let acresIssuedAmountKey = "acresIssuedAmount"
161161
162162 let acresAssetIdKey = "acresAssetId"
163163
164164 let acresAssetId = valueOrErrorMessage(getBinary(acres2Contract, acresAssetIdKey), "ACRES is not issued yet")
165165
166166 func keyAcresStakedTimeByUser (addr) = ("acresStakedTimeByUser_" + addr)
167167
168168
169169 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
170170
171171
172172 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
173173
174174
175175 func keyStakedTimeByAssetIdAndOwner (assetId,addr) = ((("st_" + assetId) + "_") + addr)
176176
177177
178178 func keyStakedNFTsByOwner (ownerAddr) = ("stakedNFTsByOwner_" + ownerAddr)
179179
180180
181181 func keyUserPromoAcres (address) = ("promoAcres_" + address)
182182
183183
184184 func keyUserPromoTickets (address) = ("promoTickets_" + address)
185185
186186
187187 let keyTotalPromoTickets = "totalPromoTickets"
188188
189189 let keyPromoMap = "promoMap"
190190
191191 func keyPromoRoundWinners (day) = ("dailyWinners_" + toString(day))
192192
193193
194194 let promoAwardPerRound = [0, 500000000, 100000000, 100000000, 100000000, 100000000]
195195
196196 func asInt (v) = match v {
197197 case n: Int =>
198198 n
199199 case _ =>
200200 throw("fail to cast into Int")
201201 }
202202
203203
204204 func asTuple5Ints (val) = match val {
205205 case t: (Int, Int, Int, Int, Int) =>
206206 t
207207 case _ =>
208208 throw("fail to cast into (Int, Int, Int, Int, Int)")
209209 }
210210
211211
212212 func asTuple4Ints (val) = match val {
213213 case t: (Int, Int, Int, Int) =>
214214 t
215215 case _ =>
216216 throw("fail to cast into (Int, Int, Int, Int)")
217217 }
218218
219219
220220 func asTuple3Ints (val) = match val {
221221 case t: (Int, Int, Int) =>
222222 t
223223 case _ =>
224224 throw("fail to cast into (Int, Int, Int)")
225225 }
226226
227227
228228 func asTuple2Ints (val) = match val {
229229 case t: (Int, Int) =>
230230 t
231231 case _ =>
232232 throw("fail to cast into (Int, Int)")
233233 }
234234
235235
236236 func fixedPoint (val,decimals) = {
237237 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
238238 let lowPart = toString((val % tenPow))
239239 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
240240 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
241241 }
242242
243243
244244 func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
245245 then throw("maxValue should be > 0")
246246 else {
247247 let randomHash = sha256_16Kb((salt + entropy))
248248 (toInt(randomHash) % maxValue)
249249 }
250250
251251
252252 func padL (val,len) = {
253253 let valS = toString(val)
254254 let zeroes = drop(toString(pow(10, 0, (len - size(valS)), 0, 0, DOWN)), 1)
255255 (zeroes + valS)
256256 }
257257
258258
259259 let M6_ = 1000000
260260
261261 let M8_ = 100000000
262262
263263 let wlgIssuedAmtKey = "wlg_issuedAmount"
264264
265265 let zbIssuedAmtKey = "zbill_issuedAmount"
266266
267267 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
268268
269269
270270 func keyFarmingPowerByUser (addr) = ("farmingPowerByUser_" + addr)
271271
272272
273273 let acresStakdTotalKey = "acresStakedAmountTotal"
274274
275275 let totalFarmingPowerKey = "totalFarmingPower"
276276
277277 let MAX_WL_NFTS = 3
278278
279279 let MAX_ARK_NFTS = 1
280280
281281 let ARK_NFT_BONUS = 5000
282282
283283 let MAX_NFTS_STAKED_BY_USER = 4
284284
285285 let keyNftTotalIssued = "nftTotalIssued"
286286
287287 let keyNftTotalBurned = "nftTotalBurned"
288288
289289 let keyWlNftTotalStaked = "WlNftTotalStaked"
290290
291291 let keyArkNftTotalStaked = "ArkNftTotalStaked"
292292
293293 func keyNftNumberByAssetId (assetId) = ("nftNumberByAssetId_" + assetId)
294294
295295
296296 func keyUserWlNftNumber (addr) = ("userWlNftNumber_" + addr)
297297
298298
299299 func keyUserArkNftNumber (addr) = ("userArkNftNumber_" + addr)
300300
301301
302302 func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
303303
304304
305305 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
306306
307307 func getLevelByAcres (acres) = {
308308 let acr = ((acres + 99999999) / M8_)
309309 func checker (acc,item) = if ((item >= acr))
310310 then acc
311311 else (acc + 1)
312312
313313 let $l = levelAcres
314314 let $s = size($l)
315315 let $acc0 = 0
316316 func $f0_1 ($a,$i) = if (($i >= $s))
317317 then $a
318318 else checker($a, $l[$i])
319319
320320 func $f0_2 ($a,$i) = if (($i >= $s))
321321 then $a
322322 else throw("List size exceeds 10")
323323
324324 $f0_2($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)
325325 }
326326
327327
328328 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
329329
330330
331331 func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
332332 let notBonused = getFarmingPowerByAcres(acres)
333333 $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
334334 }
335335
336336
337337 let teamAddrKey = "teamAddr"
338338
339339 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
340340
341341
342342 let OLD_STAKING_DEADL = 1733346000000
343343
344344 let MAX_LANDS_TO_CONVERT = 14
345345
346346 let keyLastAcresSellTime = "lastAcresSellTime"
347347
348348 let keyLastLimitLeft = "lastLimitLeft"
349349
350350 let names = ["Gold shovel", "Pickaxe", "Santa's mitten"]
351351
352352 let descriptions = ["Reward for early birds", "Increases FarmPower", "New Year promo reward"]
353353
354354 let idxDescrShovel = 0
355355
356356 let idxDescrPickaxe = 1
357357
358358 let idxDescrMitten = 2
359359
360360 let rarityThresholds = [5, 10, 20]
361361
362362 let idxThresholdC = 0
363363
364364 let idxThresholdU = 1
365365
366366 let idxThresholdL = 2
367367
368368 let namez = ["SHOVEL", "PICKAXE", "MITTEN"]
369369
370370 let idxNameShovel = 0
371371
372372 let idxNamePickaxe = 1
373373
374374 let idxNameMitten = 2
375375
376376 let contentKeyz = ["contentPickaxeC", "contentPickaxeU", "contentPickaxeL", "contentPickaxeE", "contentShovelP", "contentMittenP"]
377377
378378 let idxKeyC = 0
379379
380380 let idxKeySP = 4
381381
382382 let idxKeyMP = 5
383383
384384 let rarityNames = ["Common", "Uncommon", "Legendary", "Epic", "Promo"]
385385
386386 let idxRarityC = 0
387387
388388 let idxRarityU = 1
389389
390390 let idxRarityL = 2
391391
392392 let idxRarityE = 3
393393
394394 let idxRarityP = 4
395395
396396 let collectionz = ["Digging tools", "New Year gifts"]
397397
398398 let idxCollDig = 0
399399
400400 let idxCollNewYear = 1
401401
402402 let bonusTypez = ["FarmPower"]
403403
404404 let idxBonusTypeFp = 0
405405
406406 func prolog (i) = if (if ((i.originCaller != rest2Contract))
407407 then valueOrElse(getBoolean(keyBlocked()), false)
408408 else false)
409409 then throw("Contracts are under maintenance")
410410 else {
411411 let addr = toString(i.originCaller)
412412 let week = (height / WEEK_BLOCKS)
413413 let lastWeekKey = keyLastWeekTxIdByUser(addr)
414414 let lastWeekTxIdByUser = getString(lastWeekKey)
415415 let txId = toBase58String(i.transactionId)
416416 let wtx = ((toString(week) + "_") + txId)
417417 let curWeekKey = keyCurWeekTxIdByUser(addr)
418418 if (isDefined(lastWeekTxIdByUser))
419419 then {
420420 let lastWeekTx = split(value(lastWeekTxIdByUser), "_")
421421 if ((lastWeekTx[0] == toString(week)))
422422 then [StringEntry(lastWeekKey, wtx), StringEntry(curWeekKey, wtx)]
423423 else if ((lastWeekTx[0] == toString((week - 1))))
424424 then [StringEntry(curWeekKey, wtx)]
425425 else {
426426 let curWeekTxIdByUser = getStringValue(curWeekKey)
427427 let curWeekTx = split(curWeekTxIdByUser, "_")
428428 if ((curWeekTx[0] == toString(week)))
429429 then [StringEntry(curWeekKey, wtx)]
430430 else [StringEntry(lastWeekKey, curWeekTxIdByUser), StringEntry(curWeekKey, wtx)]
431431 }
432432 }
433433 else [StringEntry(lastWeekKey, wtx), StringEntry(curWeekKey, wtx)]
434434 }
435435
436436
437437 func createNftDescrCustom (contKey,nftSerial,collection,name,descr,rarity,bonus,bonusType) = (((((((((((((((((((((((("{\"url\": \"https://waveslands.com\", " + "\"contentKey\": \"") + contKey) + "\", ") + "\"number\": ") + toString(nftSerial)) + ", ") + "\"collection\": \"") + collection) + "\", ") + "\"name\": \"") + name) + "\", ") + "\"description\": \"") + descr) + "\", ") + "\"rare\": \"") + rarity) + "\", ") + "\"bonus\": ") + toString(bonus)) + ", ") + "\"bonusType\": \"") + bonusType) + "\"}")
438438
439439
440440 func issueNftCustom (nameIdx,contKeyIdx,collIdx,rarityIdx,bonusPerc,descrIdx,bonusTypeIdx,addr) = {
441441 let nftSerial = valueOrElse(getInteger(keyNftTotalIssued), 0)
442442 let rarity = rarityNames[rarityIdx]
443443 let name = (((namez[nameIdx] + "-") + take(rarity, 1)) + toString(bonusPerc))
444444 let issue = Issue(name, createNftDescrCustom(contentKeyz[contKeyIdx], nftSerial, collectionz[collIdx], names[nameIdx], descriptions[descrIdx], rarityNames[rarityIdx], bonusPerc, bonusTypez[bonusTypeIdx]), 1, 0, false)
445445 let nftAssetId = calculateAssetId(issue)
446446 $Tuple2([issue, IntegerEntry(keyNftTotalIssued, (nftSerial + 1)), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
447447 }
448448
449449
450450 func bonusByDescription (descr) = if (!(contains(descr, "\"bonusType\": \"FarmPower\"")))
451451 then throw(("NFT is not supported: " + descr))
452452 else {
453453 let bonusStr = split_4C(split_4C(descr, "\"bonus\":")[1], ",")[0]
454454 parseIntValue(drop(bonusStr, (valueOrElse(lastIndexOf(bonusStr, " "), -1) + 1)))
455455 }
456456
457457
458458 func rarityIdxByDescriprion (descr) = if (!(contains(descr, "\"rare\"")))
459459 then throw(("NFT is not supported: " + descr))
460460 else {
461461 let rarityStr = split_4C(split_4C(split_4C(descr, "\"rare\"")[1], ",")[0], "\"")[1]
462462 value(indexOf(rarityNames, rarityStr))
463463 }
464464
465465
466466 func stakeUnstakeAcresInternal (amt,address,bonusDelta) = if (if ((amt == 0))
467467 then (bonusDelta == 0)
468468 else false)
469469 then throw("Nothing to do")
470470 else {
471471 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
472472 if ((wlgResult == wlgResult))
473473 then {
474474 let now = lastBlock.timestamp
475475 let timeKey = keyAcresStakedTimeByUser(address)
476476 let amountKey = keyAcresStakedAmtByUser(address)
477477 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
478478 if (if ((0 > amt))
479479 then (0 > (oldAcresAmount + amt))
480480 else false)
481481 then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(-(amt), 8)))
482482 else {
483483 let newAcresAmount = (oldAcresAmount + amt)
484484 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
485485 let userFpKey = keyFarmingPowerByUser(address)
486486 let oldFp = valueOrElse(getInteger(userFpKey), 0)
487487 let bonusKey = keyUserFullBonus(address)
488488 let oldBonus = valueOrElse(getInteger(acres2Contract, bonusKey), 0)
489489 if (if ((0 > bonusDelta))
490490 then (0 > (oldBonus + bonusDelta))
491491 else false)
492492 then throw((((("You have only " + fixedPoint(oldBonus, 4)) + "% bonus, and tried to unstake ") + fixedPoint(-(bonusDelta), 4)) + "%"))
493493 else {
494494 let $t066316730 = getFarmingPowerByAcresAndBonus(newAcresAmount, (oldBonus + bonusDelta))
495495 let newBonusedFp = $t066316730._1
496496 let ignored = $t066316730._2
497497 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
498498 let acresActions = if ((amt == 0))
499499 then nil
500500 else [IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt))]
501501 let bonusActions = if ((bonusDelta == 0))
502502 then nil
503503 else [IntegerEntry(bonusKey, (oldBonus + bonusDelta))]
504504 $Tuple2(((((acresActions ++ bonusActions) :+ IntegerEntry(timeKey, lastBlock.timestamp)) :+ IntegerEntry(userFpKey, newBonusedFp)) :+ IntegerEntry(totalFarmingPowerKey, ((oldTotalFp + newBonusedFp) - oldFp))), wlgResult)
505505 }
506506 }
507507 }
508508 else throw("Strict value is not equal to itself.")
509509 }
510510
511511
512512 func getWlgPrice (usdtBalanceCorrection) = {
513513 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmtKey), "WLGOLD is not issued yet")
514514 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
515515 let acres2Usd = (assetBalance(acres2Contract, usdtAssetId) - usdtBalanceCorrection)
516516 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
517517 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
518518 fraction(totalFundsUsd, MULT8, issuedAmount)
519519 }
520520
521521
522522 func getSwapLimitAcres () = {
523523 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
524524 let acres2Usd = assetBalance(this, usdtAssetId)
525525 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
526526 let defaultLimit = (((acres2Usd + wlgUsd) + investFundTotal) / ONE_PERCENT_DIVISOR)
527527 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
528528 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
529529 let now = lastBlock.timestamp
530530 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (now - lastTime), DAY_MILLIS))
531531 let limitLeftUsdt = min([currentLimit, defaultLimit])
532532 $Tuple2(IntegerEntry(keyLastAcresSellTime, now), limitLeftUsdt)
533533 }
534534
535535
536536 let arkOracle = addressFromStringValue("3PJgZ6AK1WVCpdCmEZpesHmaKvrQDdXG5og")
537537
538538 let incubator = valueOrElse(getString(arkOracle, "static_incubatorAddress"), "")
539539
540540 let breeder = valueOrElse(getString(arkOracle, "static_breederAddress"), "")
541541
542542 let turtleIncubator = valueOrElse(getString(arkOracle, "static_turtleIncubatorAddress"), "")
543543
544544 let turtleBreeder = valueOrElse(getString(arkOracle, "static_turtleBreederAddress"), "")
545545
546546 let canineIncubator = valueOrElse(getString(arkOracle, "static_canineIncubatorAddress"), "")
547547
548548 let canineBreeder = valueOrElse(getString(arkOracle, "static_canineBreederAddress"), "")
549549
550550 let felineIncubator = valueOrElse(getString(arkOracle, "static_felineIncubatorAddress"), "")
551551
552552 let felineBreeder = valueOrElse(getString(arkOracle, "static_felineBreederAddress"), "")
553553
554554 let mutantBreeder = valueOrElse(getString(arkOracle, "static_mutantIncubatorAddress"), "")
555555
556556 func isArkimalIssued (nfo) = {
557557 let issuer = toString(nfo.issuer)
558558 if (if (if (if (if (if (if (if (if (if ((chain == base58'2T'))
559559 then (issuer == oldStakingContractStr)
560560 else false)
561561 then true
562562 else (issuer == incubator))
563563 then true
564564 else (issuer == breeder))
565565 then true
566566 else (issuer == turtleIncubator))
567567 then true
568568 else (issuer == turtleBreeder))
569569 then true
570570 else (issuer == canineIncubator))
571571 then true
572572 else (issuer == canineBreeder))
573573 then true
574574 else (issuer == felineIncubator))
575575 then true
576576 else (issuer == felineBreeder))
577577 then nfo.name
578578 else if ((issuer == mutantBreeder))
579579 then nfo.description
580580 else ""
581581 }
582582
583583
584584 func stakeNftInternal (addr,assetIdStr,bonus6,userNumKey,totalNumKey,limit) = {
585585 let nftNumber = valueOrElse(getInteger(userNumKey), 0)
586586 if ((nftNumber >= limit))
587587 then throw((("You can stake max " + toString(limit)) + " of such NFTs"))
588588 else {
589589 let $t01100911085 = stakeUnstakeAcresInternal(0, addr, bonus6)
590590 let actions = $t01100911085._1
591591 let wlgClaimedAmount = $t01100911085._2
592592 $Tuple2((((actions :+ IntegerEntry(userNumKey, (nftNumber + 1))) :+ IntegerEntry(totalNumKey, (valueOrElse(getInteger(totalNumKey), 0) + 1))) :+ IntegerEntry(keyStakedTimeByAssetIdAndOwner(assetIdStr, addr), lastBlock.timestamp)), wlgClaimedAmount)
593593 }
594594 }
595595
596596
597+func processPromo (address,amt,shouldCleanPromo) = if (if ((height >= DAILY_PROMO_START_BLOCK))
598+ then (DAILY_PROMO_END_BLOCK > height)
599+ else false)
600+ then {
601+ let promoAcresKey = keyUserPromoAcres(address)
602+ let promoAcres = ((if (shouldCleanPromo)
603+ then 0
604+ else valueOrElse(getInteger(promoAcresKey), 0)) + amt)
605+ let tickets = (promoAcres / MULT8)
606+ let ticketsKey = keyUserPromoTickets(address)
607+ let deltaTickets = (tickets - valueOrElse(getInteger(ticketsKey), 0))
608+ let totalTickets = (valueOrElse(getInteger(keyTotalPromoTickets), 0) + deltaTickets)
609+ if (if (shouldCleanPromo)
610+ then true
611+ else (deltaTickets > 0))
612+ then {
613+ let promoMap = valueOrElse(getString(keyPromoMap), "")
614+ let userRecord = ((address + ":") + padL(tickets, 3))
615+ let newMap = if (contains(promoMap, address))
616+ then {
617+ let mapParts = split_51C(promoMap, address)
618+ if ((mapParts[0] == ""))
619+ then {
620+ let r = drop(mapParts[1], 4)
621+ if ((r == ""))
622+ then if ((tickets == 0))
623+ then ""
624+ else userRecord
625+ else if ((tickets == 0))
626+ then drop(r, 1)
627+ else (userRecord + r)
628+ }
629+ else {
630+ let r = drop(mapParts[1], 4)
631+ if ((r == ""))
632+ then if ((tickets == 0))
633+ then dropRight(mapParts[0], 1)
634+ else (mapParts[0] + userRecord)
635+ else if ((tickets == 0))
636+ then (mapParts[0] + drop(r, 1))
637+ else ((mapParts[0] + userRecord) + r)
638+ }
639+ }
640+ else if ((tickets == 0))
641+ then promoMap
642+ else if ((promoMap == ""))
643+ then userRecord
644+ else ((promoMap + "_") + userRecord)
645+[IntegerEntry(promoAcresKey, promoAcres), IntegerEntry(ticketsKey, tickets), IntegerEntry(keyTotalPromoTickets, totalTickets), StringEntry(keyPromoMap, newMap)]
646+ }
647+ else [IntegerEntry(promoAcresKey, promoAcres)]
648+ }
649+ else nil
650+
651+
597652 func stakeAcresForInternal (address,amt,shouldCleanPromo) = {
598- let $t01142011496 = stakeUnstakeAcresInternal(amt, address, 0)
599- let actions = $t01142011496._1
600- let wlgClaimedAmount = $t01142011496._2
601- let promoActions = if (if ((height >= DAILY_PROMO_START_BLOCK))
602- then (DAILY_PROMO_END_BLOCK > height)
603- else false)
604- then {
605- let promoAcresKey = keyUserPromoAcres(address)
606- let promoAcres = ((if (shouldCleanPromo)
607- then 0
608- else valueOrElse(getInteger(promoAcresKey), 0)) + amt)
609- let tickets = (promoAcres / MULT8)
610- let ticketsKey = keyUserPromoTickets(address)
611- let deltaTickets = (tickets - valueOrElse(getInteger(ticketsKey), 0))
612- let totalTickets = (valueOrElse(getInteger(keyTotalPromoTickets), 0) + deltaTickets)
613- if (if (shouldCleanPromo)
614- then true
615- else (deltaTickets > 0))
616- then {
617- let promoMap = valueOrElse(getString(keyPromoMap), "")
618- let userRecord = ((address + ":") + padL(tickets, 3))
619- let newMap = if (contains(promoMap, address))
620- then {
621- let mapParts = split_51C(promoMap, address)
622- if ((mapParts[0] == ""))
623- then {
624- let r = drop(mapParts[1], 4)
625- if ((r == ""))
626- then if ((tickets == 0))
627- then ""
628- else userRecord
629- else if ((tickets == 0))
630- then drop(r, 1)
631- else (userRecord + r)
632- }
633- else {
634- let r = drop(mapParts[1], 4)
635- if ((r == ""))
636- then if ((tickets == 0))
637- then dropRight(mapParts[0], 1)
638- else (mapParts[0] + userRecord)
639- else if ((tickets == 0))
640- then (mapParts[0] + drop(r, 1))
641- else ((mapParts[0] + userRecord) + r)
642- }
643- }
644- else if ((tickets == 0))
645- then promoMap
646- else if ((promoMap == ""))
647- then userRecord
648- else ((promoMap + "_") + userRecord)
649-[IntegerEntry(promoAcresKey, promoAcres), IntegerEntry(ticketsKey, tickets), IntegerEntry(keyTotalPromoTickets, totalTickets), StringEntry(keyPromoMap, newMap)]
650- }
651- else [IntegerEntry(promoAcresKey, promoAcres)]
652- }
653- else nil
653+ let $t01395414030 = stakeUnstakeAcresInternal(amt, address, 0)
654+ let actions = $t01395414030._1
655+ let wlgClaimedAmount = $t01395414030._2
656+ let promoActions = processPromo(address, amt, shouldCleanPromo)
654657 $Tuple2((actions ++ promoActions), wlgClaimedAmount)
655658 }
656659
657660
658661 @Callable(i)
659662 func saveLastTx () = if (!(containsElement([wlgContract, marketContract], i.caller)))
660663 then throw("Access denied")
661664 else $Tuple2(prolog(i), 42)
662665
663666
664667
665668 @Callable(i)
666669 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
667670 then throw("Permission denied")
668671 else {
669672 let oldAcrContAddr = addressFromStringValue(oldAcrContract)
670673 [IntegerEntry(acresIssuedAmountKey, getIntegerValue(oldAcrContAddr, acresIssuedAmountKey)), BinaryEntry(acresAssetIdKey, getBinaryValue(oldAcrContAddr, acresAssetIdKey)), StringEntry(keyRest2Address(), rest2Addr), StringEntry(oldAcresContractKey, oldAcrContract)]
671674 }
672675
673676
674677
675678 @Callable(i)
676679 func setBlocked (isBlocked) = if ((i.caller != this))
677680 then throw("permission denied")
678681 else [BooleanEntry(keyBlocked(), isBlocked)]
679682
680683
681684
682685 @Callable(i)
683686 func unstakeAcres (amount) = {
684687 let prologActions = prolog(i)
685688 if (if ((height >= DAILY_PROMO_START_BLOCK))
686689 then (DAILY_PROMO_END_BLOCK > height)
687690 else false)
688691 then throw("You can't unstake during Xmas promo period")
689692 else if ((0 >= amount))
690693 then throw("Amount should be positive")
691694 else {
692695 let address = toString(i.caller)
693696 if ((size(i.payments) != 0))
694697 then throw("No payments required")
695698 else {
696699 let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastWlgTradeTimeByUser(address)), 0) + arbitrageDelay)
697700 if ((arbReleaseTime > lastBlock.timestamp))
698701 then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
699702 else {
700- let $t01549915579 = stakeUnstakeAcresInternal(-(amount), address, 0)
701- let actions = $t01549915579._1
702- let wlgClaimedAmount = $t01549915579._2
703+ let $t01562515705 = stakeUnstakeAcresInternal(-(amount), address, 0)
704+ let actions = $t01562515705._1
705+ let wlgClaimedAmount = $t01562515705._2
703706 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
704707 }
705708 }
706709 }
707710 }
708711
709712
710713
711714 @Callable(i)
712715 func stakeAcres () = {
713716 let prologActions = prolog(i)
714717 let address = toString(i.caller)
715718 if ((size(i.payments) != 1))
716719 then throw("exactly 1 payment must be attached")
717720 else {
718721 let pmt = i.payments[0]
719722 let amt = pmt.amount
720723 if (if (!(isDefined(pmt.assetId)))
721724 then true
722725 else (value(pmt.assetId) != acresAssetId))
723726 then throw("ACRES payments only!")
724727 else {
725- let $t01603016111 = stakeAcresForInternal(address, amt, false)
726- let stakeActions = $t01603016111._1
727- let wlgClaimedAmount = $t01603016111._2
728+ let $t01615616237 = stakeAcresForInternal(address, amt, false)
729+ let stakeActions = $t01615616237._1
730+ let wlgClaimedAmount = $t01615616237._2
728731 $Tuple2((stakeActions ++ prologActions), wlgClaimedAmount)
729732 }
730733 }
731734 }
732735
733736
734737
735738 @Callable(i)
736739 func stakeAcresFor (address,amt,shouldCleanPromo) = if ((i.caller != this))
737740 then throw("Permission denied")
738741 else stakeAcresForInternal(address, amt, shouldCleanPromo)
739742
740743
741744
742745 @Callable(i)
743746 func buyAcres () = {
744747 let prologActions = prolog(i)
745748 if ((size(i.payments) != 1))
746749 then throw("exactly 1 payment must be attached")
747750 else {
748751 let pmt = i.payments[0]
749752 let usdtAmount = pmt.amount
750753 if (if (!(isDefined(pmt.assetId)))
751754 then true
752755 else (value(pmt.assetId) != usdtAssetId))
753756 then throw("USDT payments only!")
754757 else if ((MULT6 > usdtAmount))
755758 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
756759 else {
757760 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
758761 let wlgAmount = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
759762 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
760763 let req = invoke(oldAcresAddress, "requestAcresCallback", [acresAmount], nil)
761764 if ((req == req))
762765 then {
763766 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [wlgAmount], nil))
764767 $Tuple2(([ScriptTransfer(i.caller, acresAmount, acresAssetId)] ++ prologActions), wlgRemain)
765768 }
766769 else throw("Strict value is not equal to itself.")
767770 }
768771 }
769772 }
770773
771774
772775
773776 @Callable(i)
774777 func buyAcresREADONLY (usdtAmount) = {
775778 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
776779 let wlgToBurn = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
777780 $Tuple2(nil, [acresAmount, MULT6, acresAmount, wlgToBurn])
778781 }
779782
780783
781784
782785 @Callable(i)
783786 func sellAcres () = {
784787 let prologActions = prolog(i)
785788 if ((size(i.payments) != 1))
786789 then throw("exactly 1 payment must be attached")
787790 else {
788791 let pmt = i.payments[0]
789792 let acresAmount = pmt.amount
790793 if (if (!(isDefined(pmt.assetId)))
791794 then true
792795 else (value(pmt.assetId) != acresAssetId))
793796 then throw("ACRES payments only!")
794797 else if ((MULT7 > acresAmount))
795798 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
796799 else {
797800 let addr = toString(i.caller)
798- let $t01818318231 = getSwapLimitAcres()
799- let limitAction = $t01818318231._1
800- let maxUsdt = $t01818318231._2
801+ let $t01830918357 = getSwapLimitAcres()
802+ let limitAction = $t01830918357._1
803+ let maxUsdt = $t01830918357._2
801804 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
802805 if ((acresAmount > maxAcres))
803806 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
804807 else {
805808 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
806809 $Tuple2(([limitAction, IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount)), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
807810 }
808811 }
809812 }
810813 }
811814
812815
813816
814817 @Callable(i)
815818 func sellAcresREADONLY (address,acresAmount) = {
816- let $t01872718775 = getSwapLimitAcres()
817- let limitAction = $t01872718775._1
818- let maxUsdt = $t01872718775._2
819+ let $t01885318901 = getSwapLimitAcres()
820+ let limitAction = $t01885318901._1
821+ let maxUsdt = $t01885318901._2
819822 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
820823 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
821824 }
822825
823826
824827
825828 @Callable(i)
826829 func convertOldStakes () = {
827830 let prologActions = prolog(i)
828831 if ((OLD_STAKING_DEADL > lastBlock.timestamp))
829832 then throw(("Disabled until " + toString((OLD_STAKING_DEADL / 1000))))
830833 else {
831834 let address = toString(i.caller)
832835 if ((size(i.payments) != 0))
833836 then throw("No payments required")
834837 else {
835838 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
836839 let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
837840 let gotAcres0 = if ((amount > 0))
838841 then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
839842 else $Tuple2(0, 0)
840843 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
841844 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
842845 let landsResult = if (isDefined(landsStr))
843846 then {
844847 let lands = split_51C(value(landsStr), "_")
845848 if ((size(lands) > MAX_LANDS_TO_CONVERT))
846849 then throw((("You have more than " + toString(MAX_LANDS_TO_CONVERT)) + " lands staked, please contact support, we'll process your case manually"))
847850 else {
848851 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
849852 then throw("landAssetId is required")
850853 else {
851854 let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
852855 if ((r == r))
853856 then $Tuple5((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4), (acc._5 + r._5))
854857 else throw("Strict value is not equal to itself.")
855858 }
856859
857860 let rr = {
858861 let $l = lands
859862 let $s = size($l)
860863 let $acc0 = $Tuple5(0, 0, 0, 0, 0)
861864 func $f0_1 ($a,$i) = if (($i >= $s))
862865 then $a
863866 else oneLand($a, $l[$i])
864867
865868 func $f0_2 ($a,$i) = if (($i >= $s))
866869 then $a
867870 else throw("List size exceeds 14")
868871
869872 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14)
870873 }
871874 if ((rr == rr))
872875 then {
873876 let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
874877 if ((finalize == finalize))
875878 then {
876879 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
877880 if ((req == req))
878881 then {
879- let $t02128921428 = issueNftCustom(idxNameShovel, idxKeySP, idxCollDig, idxRarityP, 3, idxDescrShovel, idxBonusTypeFp, i.caller)
880- let nftActions = $t02128921428._1
881- let nftAssetId = $t02128921428._2
882+ let $t02141521554 = issueNftCustom(idxNameShovel, idxKeySP, idxCollDig, idxRarityP, 3, idxDescrShovel, idxBonusTypeFp, i.caller)
883+ let nftActions = $t02141521554._1
884+ let nftAssetId = $t02141521554._2
882885 $Tuple6(rr._1, rr._2, rr._3, rr._4, rr._5, nftActions)
883886 }
884887 else throw("Strict value is not equal to itself.")
885888 }
886889 else throw("Strict value is not equal to itself.")
887890 }
888891 else throw("Strict value is not equal to itself.")
889892 }
890893 }
891894 else $Tuple6(0, 0, 0, 0, 0, nil)
892895 let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
893896 let duckResult = if ((duckAssetId != ""))
894897 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
895898 else $Tuple3(0, 0, 0)
896899 let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address, 0)
897900 $Tuple2(((landsResult._6 ++ x._1) ++ prologActions), $Tuple3(gotAcres0._2, landsResult._5, x._2))
898901 }
899902 }
900903 }
901904
902905
903906
904907 @Callable(i)
905908 func unstakeLandsREADONLY (address) = {
906909 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
907910 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
908911 let landsResult = if (isDefined(landsStr))
909912 then {
910913 let lands = split_51C(value(landsStr), "_")
911914 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
912915 then throw("landAssetId is required")
913916 else {
914917 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
915918 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
916919 }
917920
918921 let $l = lands
919922 let $s = size($l)
920923 let $acc0 = $Tuple4(0, 0, 0, 0)
921924 func $f0_1 ($a,$i) = if (($i >= $s))
922925 then $a
923926 else oneLand($a, $l[$i])
924927
925928 func $f0_2 ($a,$i) = if (($i >= $s))
926929 then $a
927930 else throw("List size exceeds 100")
928931
929932 $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($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
930933 }
931934 else $Tuple4(0, 0, 0, 0)
932935 $Tuple2(nil, landsResult)
933936 }
934937
935938
936939
937940 @Callable(i)
938941 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
939942 then throw("Permission denied")
940943 else stakeUnstakeAcresInternal(i.payments[0].amount, addr, 0)
941944
942945
943946
944947 @Callable(i)
945948 func simulateStakeAcresREADONLY (address,addedAmount) = {
946949 let amountKey = keyAcresStakedAmtByUser(address)
947950 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
948951 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
949952 let userFpKey = keyFarmingPowerByUser(address)
950953 let oldFp = valueOrElse(getInteger(userFpKey), 0)
951954 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(address)), 0)
952- let $t02369923786 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
953- let newBonusedFp = $t02369923786._1
954- let ignored = $t02369923786._2
955+ let $t02382523912 = getFarmingPowerByAcresAndBonus(newAcresAmount, userBonus)
956+ let newBonusedFp = $t02382523912._1
957+ let ignored = $t02382523912._2
955958 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
956959 let newTotalFp = ((oldTotalFp + newBonusedFp) - oldFp)
957960 $Tuple2(nil, [oldFp, newBonusedFp, oldTotalFp, newTotalFp])
958961 }
959962
960963
961964
962965 @Callable(i)
963966 func issuePickC1 (forAddress) = if ((i.caller != wlgContract))
964967 then throw("Permission denied")
965968 else issueNftCustom(idxNamePickaxe, idxKeyC, idxCollDig, idxRarityC, 1, idxDescrPickaxe, idxBonusTypeFp, addressFromStringValue(forAddress))
966969
967970
968971
969972 @Callable(i)
970-func issueMittenP (forAddress) = if ((i.caller != this))
973+func issueMittenP (forAddress,shouldCleanPromo) = if ((i.caller != this))
971974 then throw("Permission denied")
972- else issueNftCustom(idxNameMitten, idxKeyMP, idxCollNewYear, idxRarityP, 3, idxDescrMitten, idxBonusTypeFp, addressFromStringValue(forAddress))
975+ else {
976+ let $t02452824698 = issueNftCustom(idxNameMitten, idxKeyMP, idxCollNewYear, idxRarityP, 3, idxDescrMitten, idxBonusTypeFp, addressFromStringValue(forAddress))
977+ let nftActions = $t02452824698._1
978+ let nftAssetId = $t02452824698._2
979+ let promoActions = processPromo(forAddress, 0, shouldCleanPromo)
980+ $Tuple2((nftActions ++ promoActions), nftAssetId)
981+ }
973982
974983
975984
976985 @Callable(i)
977986 func stakeNFT () = {
978987 let prologActions = prolog(i)
979988 if ((size(i.payments) != 1))
980989 then throw("Exactly one payment required")
981990 else {
982991 let pmt = value(i.payments[0])
983992 if ((pmt.amount != 1))
984993 then throw("NFT token should be attached as payment")
985994 else {
986995 let assetId = value(pmt.assetId)
987996 let asset = value(assetInfo(assetId))
988997 let assetIdStr = toBase58String(assetId)
989998 let addr = toString(i.caller)
990999 let nftsKey = keyStakedNFTsByOwner(addr)
9911000 let nftsStr = getString(nftsKey)
9921001 let nfts = if (isDefined(nftsStr))
9931002 then split_4C(value(nftsStr), "_")
9941003 else nil
9951004 if (containsElement(nfts, assetIdStr))
9961005 then throw(("Your staked NFTs already contain " + assetIdStr))
9971006 else if ((size(nfts) >= MAX_NFTS_STAKED_BY_USER))
9981007 then throw((("Your already staked max (" + toString(MAX_NFTS_STAKED_BY_USER)) + ") NFTs"))
9991008 else {
10001009 let listAction = StringEntry(nftsKey, makeString_2C((nfts :+ assetIdStr), "_"))
10011010 if ((asset.issuer == this))
10021011 then {
1003- let $t02548525675 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
1004- let actions = $t02548525675._1
1005- let wlgClaimedAmount = $t02548525675._2
1012+ let $t02575025940 = stakeNftInternal(addr, assetIdStr, (bonusByDescription(value(asset.description)) * 10000), keyUserWlNftNumber(addr), keyWlNftTotalStaked, MAX_WL_NFTS)
1013+ let actions = $t02575025940._1
1014+ let wlgClaimedAmount = $t02575025940._2
10061015 $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
10071016 }
10081017 else if ((isArkimalIssued(asset) == ""))
10091018 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
10101019 else {
1011- let $t02585626007 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
1012- let actions = $t02585626007._1
1013- let wlgClaimedAmount = $t02585626007._2
1020+ let $t02612126272 = stakeNftInternal(addr, assetIdStr, ARK_NFT_BONUS, keyUserArkNftNumber(addr), keyArkNftTotalStaked, MAX_ARK_NFTS)
1021+ let actions = $t02612126272._1
1022+ let wlgClaimedAmount = $t02612126272._2
10141023 $Tuple2(((prologActions ++ actions) :+ listAction), wlgClaimedAmount)
10151024 }
10161025 }
10171026 }
10181027 }
10191028 }
10201029
10211030
10221031
10231032 @Callable(i)
10241033 func unstakeNFT (assetIdStr) = {
10251034 let prologActions = prolog(i)
10261035 if ((size(i.payments) != 0))
10271036 then throw("No payments required")
10281037 else {
10291038 let assetId = fromBase58String(assetIdStr)
10301039 let addr = toString(i.caller)
10311040 let asset = value(assetInfo(assetId))
10321041 let timeKey = keyStakedTimeByAssetIdAndOwner(assetIdStr, addr)
10331042 if (!(isDefined(getInteger(timeKey))))
10341043 then throw((("NFT " + asset.name) + " is not staked by you"))
10351044 else {
10361045 let nftsKey = keyStakedNFTsByOwner(addr)
10371046 let nfts = split_4C(valueOrElse(getString(nftsKey), ""), "_")
10381047 let idx = indexOf(nfts, assetIdStr)
10391048 if (!(isDefined(idx)))
10401049 then throw(("Your staked NFTs don't contain " + assetIdStr))
10411050 else {
10421051 let listAction = if ((size(nfts) > 1))
10431052 then StringEntry(nftsKey, makeString_2C(removeByIndex(nfts, value(idx)), "_"))
10441053 else DeleteEntry(nftsKey)
10451054 let isWL = (asset.issuer == this)
10461055 if (isWL)
10471056 then {
10481057 let wlNftNumber = valueOrElse(getInteger(keyUserWlNftNumber(addr)), 0)
10491058 let bonusVal = (bonusByDescription(value(asset.description)) * 10000)
1050- let $t02717227251 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
1051- let actions = $t02717227251._1
1052- let wlgClaimedAmount = $t02717227251._2
1059+ let $t02743727516 = stakeUnstakeAcresInternal(0, addr, -(bonusVal))
1060+ let actions = $t02743727516._1
1061+ let wlgClaimedAmount = $t02743727516._2
10531062 $Tuple2(((((((actions :+ listAction) :+ IntegerEntry(keyUserWlNftNumber(addr), (wlNftNumber - 1))) :+ IntegerEntry(keyWlNftTotalStaked, max([0, (valueOrElse(getInteger(keyWlNftTotalStaked), 0) - 1)]))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
10541063 }
10551064 else {
10561065 let arkimalName = isArkimalIssued(asset)
10571066 if ((arkimalName == ""))
10581067 then throw("Only WavesLands and Arkimals NFT tokens are accepted")
10591068 else {
10601069 let arkNftNumber = valueOrElse(getInteger(keyUserArkNftNumber(addr)), 0)
1061- let $t02791127995 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
1062- let actions = $t02791127995._1
1063- let wlgClaimedAmount = $t02791127995._2
1070+ let $t02817628260 = stakeUnstakeAcresInternal(0, addr, -(ARK_NFT_BONUS))
1071+ let actions = $t02817628260._1
1072+ let wlgClaimedAmount = $t02817628260._2
10641073 $Tuple2((((((actions :+ listAction) :+ IntegerEntry(keyUserArkNftNumber(addr), (arkNftNumber - 1))) :+ DeleteEntry(keyStakedTimeByAssetIdAndOwner(toBase58String(assetId), addr))) :+ ScriptTransfer(i.caller, 1, assetId)) ++ prologActions), wlgClaimedAmount)
10651074 }
10661075 }
10671076 }
10681077 }
10691078 }
10701079 }
10711080
10721081
10731082
10741083 @Callable(i)
10751084 func exchangeNFTs () = if ((i.caller != this))
10761085 then throw("Temporary disabled")
10771086 else {
10781087 let prologActions = prolog(i)
10791088 if ((3 > size(i.payments)))
10801089 then throw("Min one WLGOLD and 2 NFT payments allowed")
10811090 else if ((size(i.payments) > 10))
10821091 then throw("Max one WLGOLD and 9 NFT payments allowed")
10831092 else {
10841093 let addr = toString(i.caller)
10851094 func addUp (acc,pmt) = {
10861095 let assetId = valueOrErrorMessage(pmt.assetId, "WAVES payments not allowed")
10871096 if ((assetId == wlgAssetId))
10881097 then $Tuple4((acc._1 + pmt.amount), acc._2, acc._3, acc._4)
10891098 else {
10901099 let asset = value(assetInfo(assetId))
10911100 if ((asset.issuer != this))
10921101 then throw("Only WL-issued NFTs allowed")
10931102 else {
10941103 let rarityIx = rarityIdxByDescriprion(value(asset.description))
10951104 if (if ((acc._4 > 0))
10961105 then (rarityIx != acc._4)
10971106 else false)
10981107 then throw("You can exchange only NFTs of the same rarity")
10991108 else {
11001109 let bonusPerc = bonusByDescription(value(asset.description))
11011110 $Tuple4(acc._1, (acc._2 + bonusPerc), (acc._3 :+ Burn(assetId, 1)), rarityIx)
11021111 }
11031112 }
11041113 }
11051114 }
11061115
1107- let $t02944629662 = {
1116+ let $t02971129927 = {
11081117 let $l = i.payments
11091118 let $s = size($l)
11101119 let $acc0 = $Tuple4(0, 0, nil, -1)
11111120 func $f0_1 ($a,$i) = if (($i >= $s))
11121121 then $a
11131122 else addUp($a, $l[$i])
11141123
11151124 func $f0_2 ($a,$i) = if (($i >= $s))
11161125 then $a
11171126 else throw("List size exceeds 10")
11181127
11191128 $f0_2($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)
11201129 }
1121- let wlgFee = $t02944629662._1
1122- let totalBonus = $t02944629662._2
1123- let burnActions = $t02944629662._3
1124- let rarityIdx = $t02944629662._4
1130+ let wlgFee = $t02971129927._1
1131+ let totalBonus = $t02971129927._2
1132+ let burnActions = $t02971129927._3
1133+ let rarityIdx = $t02971129927._4
11251134 let newRarityIdx = if ((rarityIdx == idxRarityC))
11261135 then if ((rarityThresholds[idxThresholdC] > totalBonus))
11271136 then idxRarityC
11281137 else if ((rarityThresholds[idxThresholdU] > totalBonus))
11291138 then idxRarityU
11301139 else throw((("You can advance only one level of rarity, max total bonus " + toString(rarityThresholds[idxThresholdU])) + "%"))
11311140 else if ((rarityIdx == idxRarityU))
11321141 then if ((rarityThresholds[idxThresholdU] > totalBonus))
11331142 then idxRarityU
11341143 else if ((rarityThresholds[idxThresholdL] > totalBonus))
11351144 then idxRarityL
11361145 else throw((("You can advance only one level of rarity, max total bonus " + toString(rarityThresholds[idxThresholdL])) + "%"))
11371146 else if ((rarityIdx == idxRarityL))
11381147 then if ((rarityThresholds[idxThresholdL] > totalBonus))
11391148 then idxRarityL
11401149 else idxRarityE
11411150 else if ((rarityIdx == idxRarityE))
11421151 then idxRarityE
11431152 else if ((rarityIdx == idxRarityP))
11441153 then throw("You can't exchange NFTs of this rarity")
11451154 else throw("Unknown rarity")
11461155 let minWlgFee = fraction(totalBonus, MULT14, getWlgPrice(0))
11471156 let change = (wlgFee - minWlgFee)
11481157 let forTeam = (minWlgFee / 2)
11491158 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [(minWlgFee - forTeam)], nil))
11501159 if ((0 > change))
11511160 then throw((("You need to attach " + fixedPoint(minWlgFee, 8)) + " WLGOLD as fee"))
11521161 else {
11531162 let changeActions = if ((change > 0))
11541163 then [ScriptTransfer(i.caller, change, wlgAssetId)]
11551164 else nil
1156- let $t03119931360 = issueNftCustom(idxNamePickaxe, newRarityIdx, idxCollDig, newRarityIdx, totalBonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
1157- let issueNftActions = $t03119931360._1
1158- let nftAssetId = $t03119931360._2
1165+ let $t03146431625 = issueNftCustom(idxNamePickaxe, newRarityIdx, idxCollDig, newRarityIdx, totalBonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
1166+ let issueNftActions = $t03146431625._1
1167+ let nftAssetId = $t03146431625._2
11591168 let burned = size(burnActions)
11601169 let burnCounterActions = if ((burned == 0))
11611170 then nil
11621171 else [IntegerEntry(keyNftTotalBurned, (valueOrElse(getInteger(keyNftTotalBurned), 0) + burned))]
11631172 $Tuple2((((((issueNftActions ++ burnActions) ++ burnCounterActions) ++ prologActions) ++ changeActions) :+ ScriptTransfer(addressFromStringValue(getStringValue(wlgContract, teamAddrKey)), forTeam, wlgAssetId)), $Tuple2(nftAssetId, wlgRemain))
11641173 }
11651174 }
11661175 }
11671176
11681177
11691178
11701179 @Callable(i)
11711180 func openNftChest () = if ((i.caller != this))
11721181 then throw("Temporary disabled")
11731182 else {
11741183 let prologActions = prolog(i)
11751184 if ((size(i.payments) != 1))
11761185 then throw("exactly 1 payment must be attached")
11771186 else {
11781187 let pmt = i.payments[0]
11791188 let wlgAmount = pmt.amount
11801189 if (if (!(isDefined(pmt.assetId)))
11811190 then true
11821191 else (value(pmt.assetId) != wlgAssetId))
11831192 then throw("WLGOLD payments only!")
11841193 else {
11851194 let minWlgFee = fraction(NFT_CHEST_PRICE_USDT, MULT8, getWlgPrice(0))
11861195 let change = (wlgAmount - minWlgFee)
11871196 let forTeam = (minWlgFee / 2)
11881197 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [(minWlgFee - forTeam)], nil))
11891198 if ((0 > change))
11901199 then throw((("You need to attach " + fixedPoint(minWlgFee, 8)) + " WLGOLD as fee"))
11911200 else {
11921201 let changeActions = if ((change > 0))
11931202 then [ScriptTransfer(i.caller, change, wlgAssetId)]
11941203 else nil
11951204 let addr = toString(i.caller)
11961205 let finishKey = keyCommit(addr)
11971206 let finishBlock = valueOrErrorMessage(getInteger(finishKey), "You have to commitForRandom() first!")
11981207 if ((finishBlock > height))
11991208 then throw(("Random number is not ready yet, wait until height = " + toString(finishBlock)))
12001209 else {
12011210 let entropy = value(value(blockInfoByHeight(finishBlock)).vrf)
12021211 let salt = fromBase58String(split(valueOrElse(getString(keyCurWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
12031212 let rand = getRandomNumber(100, salt, entropy)
1204- let $t03344133713 = if ((84 > rand))
1213+ let $t03370633978 = if ((84 > rand))
12051214 then $Tuple2(1, idxRarityC)
12061215 else if ((98 > rand))
12071216 then $Tuple2(5, idxRarityU)
12081217 else $Tuple2(10, idxRarityL)
1209- let bonus = $t03344133713._1
1210- let rarityIdx = $t03344133713._2
1211- let $t03371633866 = issueNftCustom(idxNamePickaxe, rarityIdx, idxCollDig, rarityIdx, bonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
1212- let issueNftActions = $t03371633866._1
1213- let nftAssetId = $t03371633866._2
1218+ let bonus = $t03370633978._1
1219+ let rarityIdx = $t03370633978._2
1220+ let $t03398134131 = issueNftCustom(idxNamePickaxe, rarityIdx, idxCollDig, rarityIdx, bonus, idxDescrPickaxe, idxBonusTypeFp, i.caller)
1221+ let issueNftActions = $t03398134131._1
1222+ let nftAssetId = $t03398134131._2
12141223 $Tuple2(((((issueNftActions ++ prologActions) ++ changeActions) :+ ScriptTransfer(addressFromStringValue(getStringValue(wlgContract, teamAddrKey)), forTeam, wlgAssetId)) :+ DeleteEntry(finishKey)), $Tuple2(nftAssetId, wlgRemain))
12151224 }
12161225 }
12171226 }
12181227 }
12191228 }
12201229
12211230
12221231
12231232 @Callable(i)
12241233 func commitForRandom () = if ((i.caller != this))
12251234 then throw("Temporary disabled")
12261235 else {
12271236 let prologActions = prolog(i)
12281237 let addr = toString(i.caller)
12291238 let finishKey = keyCommit(addr)
12301239 if (isDefined(getInteger(finishKey)))
12311240 then throw("You already commited for random, please use it")
12321241 else {
12331242 let finishBlock = (height + RANDOM_DELAY)
12341243 $Tuple2(([IntegerEntry(finishKey, finishBlock)] ++ prologActions), finishBlock)
12351244 }
12361245 }
12371246
12381247
12391248
12401249 @Callable(i)
12411250 func drawPromoRound (roundId) = if ((i.caller != this))
12421251 then throw("Permission denied")
12431252 else {
12441253 let today = (height / DAY_BLOCKS)
12451254 let maxValue = valueOrElse(getInteger(keyTotalPromoTickets), 0)
12461255 if ((maxValue == 0))
12471256 then throw("No tickets to draw")
12481257 else {
12491258 let b = (today * DAY_BLOCKS)
12501259 let h = if ((b > VRF_OFFSET))
12511260 then b
12521261 else (b + VRF_OFFSET)
12531262 let entropy = value(value(blockInfoByHeight(h)).vrf)
12541263 let promoMap = valueOrElse(getString(keyPromoMap), "")
12551264 if ((promoMap == ""))
12561265 then throw("No participants")
12571266 else {
1258- func singleDraw (ac,j) = {
1259- let promoList = if ((ac._3 == ""))
1260- then nil
1261- else split_51C(ac._3, "_")
1262- if ((j >= size(promoList)))
1263- then ac
1264- else {
1265- let rand = getRandomNumber(ac._1, ac._2, entropy)
1266- func countTickets (acc,el) = {
1267- let parts = split(el, ":")
1268- let addr = parts[0]
1269- let tickets = parseIntValue(parts[1])
1270- let newTotal = (acc._1 + tickets)
1271- if (if ((acc._3 == ""))
1272- then (newTotal > rand)
1273- else false)
1274- then $Tuple3(newTotal, tickets, addr)
1275- else $Tuple3(newTotal, acc._2, acc._3)
1267+ func singleDraw (ac,j) = if ((ac._3 == ""))
1268+ then ac
1269+ else {
1270+ let promoList = split_51C(ac._3, "_")
1271+ let rand = getRandomNumber(ac._1, ac._2, entropy)
1272+ func countTickets (acc,el) = {
1273+ let parts = split(el, ":")
1274+ let addr = parts[0]
1275+ let tickets = parseIntValue(parts[1])
1276+ let newTotal = (acc._1 + tickets)
1277+ if (if ((acc._3 == ""))
1278+ then (newTotal > rand)
1279+ else false)
1280+ then $Tuple3(newTotal, tickets, addr)
1281+ else $Tuple3(newTotal, acc._2, acc._3)
1282+ }
1283+
1284+ let r = {
1285+ let $l = promoList
1286+ let $s = size($l)
1287+ let $acc0 = $Tuple3(0, 0, "")
1288+ func $f0_1 ($a,$i) = if (($i >= $s))
1289+ then $a
1290+ else countTickets($a, $l[$i])
1291+
1292+ func $f0_2 ($a,$i) = if (($i >= $s))
1293+ then $a
1294+ else throw("List size exceeds 200")
1295+
1296+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100), 101), 102), 103), 104), 105), 106), 107), 108), 109), 110), 111), 112), 113), 114), 115), 116), 117), 118), 119), 120), 121), 122), 123), 124), 125), 126), 127), 128), 129), 130), 131), 132), 133), 134), 135), 136), 137), 138), 139), 140), 141), 142), 143), 144), 145), 146), 147), 148), 149), 150), 151), 152), 153), 154), 155), 156), 157), 158), 159), 160), 161), 162), 163), 164), 165), 166), 167), 168), 169), 170), 171), 172), 173), 174), 175), 176), 177), 178), 179), 180), 181), 182), 183), 184), 185), 186), 187), 188), 189), 190), 191), 192), 193), 194), 195), 196), 197), 198), 199), 200)
1297+ }
1298+ let winner = r._3
1299+ if ((winner == ""))
1300+ then ac
1301+ else {
1302+ let mapParts = split_51C(ac._3, winner)
1303+ let newMap = if ((mapParts[0] == ""))
1304+ then drop(mapParts[1], 5)
1305+ else (dropRight(mapParts[0], 1) + drop(mapParts[1], 4))
1306+ let winActions = if ((j == 0))
1307+ then invoke(this, "issueMittenP", [winner, true], nil)
1308+ else invoke(this, "stakeAcresFor", [winner, promoAwardPerRound[j], true], nil)
1309+ if ((winActions == winActions))
1310+ then {
1311+ let newSalt = fromBase58String(split(valueOrElse(getString(keyCurWeekTxIdByUser(winner)), "0_DEFAULT"), "_")[1])
1312+ $Tuple4((ac._1 - r._2), newSalt, newMap, (ac._4 :+ winner))
1313+ }
1314+ else throw("Strict value is not equal to itself.")
12761315 }
1277-
1278- let r = {
1279- let $l = promoList
1280- let $s = size($l)
1281- let $acc0 = $Tuple3(0, 0, "")
1282- func $f0_1 ($a,$i) = if (($i >= $s))
1283- then $a
1284- else countTickets($a, $l[$i])
1285-
1286- func $f0_2 ($a,$i) = if (($i >= $s))
1287- then $a
1288- else throw("List size exceeds 200")
1289-
1290- $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($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100), 101), 102), 103), 104), 105), 106), 107), 108), 109), 110), 111), 112), 113), 114), 115), 116), 117), 118), 119), 120), 121), 122), 123), 124), 125), 126), 127), 128), 129), 130), 131), 132), 133), 134), 135), 136), 137), 138), 139), 140), 141), 142), 143), 144), 145), 146), 147), 148), 149), 150), 151), 152), 153), 154), 155), 156), 157), 158), 159), 160), 161), 162), 163), 164), 165), 166), 167), 168), 169), 170), 171), 172), 173), 174), 175), 176), 177), 178), 179), 180), 181), 182), 183), 184), 185), 186), 187), 188), 189), 190), 191), 192), 193), 194), 195), 196), 197), 198), 199), 200)
1291- }
1292- let winner = r._3
1293- if ((winner == ""))
1294- then ac
1295- else {
1296- let mapParts = split_51C(ac._3, winner)
1297- let newMap = if ((mapParts[0] == ""))
1298- then drop(mapParts[1], 5)
1299- else (dropRight(mapParts[0], 1) + drop(mapParts[1], 4))
1300- let winActions = if ((j == 0))
1301- then invoke(this, "issueMittenP", [winner], nil)
1302- else invoke(this, "stakeAcresFor", [winner, promoAwardPerRound[j], true], nil)
1303- if ((winActions == winActions))
1304- then {
1305- let newSalt = fromBase58String(split(valueOrElse(getString(keyCurWeekTxIdByUser(winner)), "0_DEFAULT"), "_")[1])
1306- $Tuple4((ac._1 - r._2), newSalt, newMap, (ac._4 :+ winner))
1307- }
1308- else throw("Strict value is not equal to itself.")
1309- }
1310- }
1311- }
1316+ }
13121317
13131318 let draws = {
13141319 let $l = [0, 1, 2, 3, 4, 5]
13151320 let $s = size($l)
13161321 let $acc0 = $Tuple4(maxValue, i.transactionId, promoMap, nil)
13171322 func $f0_1 ($a,$i) = if (($i >= $s))
13181323 then $a
13191324 else singleDraw($a, $l[$i])
13201325
13211326 func $f0_2 ($a,$i) = if (($i >= $s))
13221327 then $a
13231328 else throw("List size exceeds 6")
13241329
13251330 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13261331 }
13271332 $Tuple2([StringEntry(keyPromoMap, draws._3), IntegerEntry(keyTotalPromoTickets, draws._1), StringEntry(keyPromoRoundWinners(roundId), makeString(draws._4, "_"))], 0)
13281333 }
13291334 }
13301335 }
13311336
13321337

github/deemru/w8io/169f3d6 
149.97 ms