tx · 7w7DCGoHSiAGtfZ642bWpA4qyHp38nVx7emus16mV5zg

3MuibHtY4WMNqE2AgpPjm9fuDar6TUNCThP:  -0.04000000 Waves

2023.05.04 14:24 [2562946] smart account 3MuibHtY4WMNqE2AgpPjm9fuDar6TUNCThP > SELF 0.00000000 Waves

{ "type": 13, "id": "7w7DCGoHSiAGtfZ642bWpA4qyHp38nVx7emus16mV5zg", "fee": 4000000, "feeAssetId": null, "timestamp": 1683199533361, "version": 2, "chainId": 84, "sender": "3MuibHtY4WMNqE2AgpPjm9fuDar6TUNCThP", "senderPublicKey": "5K6j2MTCQttt7Dt3hR4msP7sjtJ4LWVPHbUjbG485Lxw", "proofs": [ "3HsVAbGxqywNKxd2fC4qnS4zyG8jDTMm9g9hbtbjQw9WmzreTL8GLXx5GsPtsaWJRGWwqKJ1tGXZaR1UUBE3jY97" ], "script": "base64:BgKlKggCEgUKAwEEARIHCgUBBAEIARIDCgEIEgMKAQgSABIECgIBBBIECgIBBBIDCgEBEgASBAoCCAESABIECgIIARIECgIIARIECgIBARIDCgEBEgUKAwEBARIFCgMBCAESBAoCAQgSBAoCAQgSBAoCCAgSABIDCgEIEgUKAwEBARIECgIIARIECgIBARIECgIICBILCgkIAQECAQIIBAQSBgoECAgBCBIAIgZzY2FsZTgiDHNjYWxlOEJpZ0ludCIHc2NhbGUxOCIKemVyb0JpZ0ludCIEYmlnMCIEYmlnMSIEYmlnMiIEYmlnMyIEYmlnNCILd2F2ZXNTdHJpbmciCmFtcEluaXRpYWwiBUFtdWx0IgNTRVAiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIg9pZHhGYWN0U3Rha0NudHIiEmlkeEZhY3RvcnlSZXN0Q250ciIQaWR4RmFjdFNsaXBwQ250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiCHQxQmlnSW50IgJmMSIDdmFsIg9yZXN1bHRTY2FsZU11bHQiDGZyb21YMThSb3VuZCIFcm91bmQiA2FicyIJYWJzQmlnSW50IgJmYyIDbXBrIgRwbXBrIgJwbCICcGgiAWgiAXQiA3BhdSICdWEiBHR4SWQiA2dhdSICYWEiAnBhIgNhbXAiDWtleUFtcEhpc3RvcnkiDGhlaWdodEJsb2NrcyIUa2V5Q2hhbmdlQW1wTGFzdENhbGwiBmtleUZlZSIDZmVlIgZrZXlETHAiFWtleURMcFJlZnJlc2hlZEhlaWdodCISa2V5RExwUmVmcmVzaERlbGF5IhZkTHBSZWZyZXNoRGVsYXlEZWZhdWx0Ig9kTHBSZWZyZXNoRGVsYXkiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiFmtleVNraXBPcmRlclZhbGlkYXRpb24iC3Bvb2xBZGRyZXNzIg90aHJvd09yZGVyRXJyb3IiCm9yZGVyVmFsaWQiDm9yZGVyVmFsaWRJbmZvIgtzZW5kZXJWYWxpZCIMbWF0Y2hlclZhbGlkIgRzdHJmIgRhZGRyIgNrZXkiBGludGYiCHRocm93RXJyIgNtc2ciBmZtdEVyciIDZmNhIgVpbkZlZSIBQCIGb3V0RmVlIgFBIgNpZ3MiAm1wIhNmZWVDb2xsZWN0b3JBZGRyZXNzIgNncGMiBWFtdEFzIgdwcmljZUFzIghpUHJpY2VBcyIMcGFyc2VBc3NldElkIgVpbnB1dCIPYXNzZXRJZFRvU3RyaW5nIg9wYXJzZVBvb2xDb25maWciCnBvb2xDb25maWciEHBvb2xDb25maWdQYXJzZWQiCyR0MDgwODc4MjczIg1jZmdQb29sU3RhdHVzIgxjZmdMcEFzc2V0SWQiEGNmZ0Ftb3VudEFzc2V0SWQiD2NmZ1ByaWNlQXNzZXRJZCIWY2ZnQW1vdW50QXNzZXREZWNpbWFscyIVY2ZnUHJpY2VBc3NldERlY2ltYWxzIgNnZmMiDWZhY3RvcnlDb25maWciD3N0YWtpbmdDb250cmFjdCIMcmVzdENvbnRyYWN0IhFkYXRhUHV0QWN0aW9uSW5mbyINaW5BbXRBc3NldEFtdCIPaW5QcmljZUFzc2V0QW10IghvdXRMcEFtdCIFcHJpY2UiCnNsaXBCeVVzZXIiDHNsaXBwYWdlUmVhbCIIdHhIZWlnaHQiC3R4VGltZXN0YW1wIgxzbGlwYWdlQW1BbXQiDHNsaXBhZ2VQckFtdCIRZGF0YUdldEFjdGlvbkluZm8iDm91dEFtdEFzc2V0QW10IhBvdXRQcmljZUFzc2V0QW10IgdpbkxwQW10Ig1nZXRBY2NCYWxhbmNlIgdhc3NldElkIgRjcGJpIghwckFtdFgxOCIIYW1BbXRYMTgiBWNwYmlyIgNwY3AiCmFtQXNzZXREY20iCnByQXNzZXREY20iBWFtQW10IgVwckFtdCILYW10QXNBbXRYMTgiCnByQXNBbXRYMTgiCmNhbGNQcmljZXMiBWxwQW10IghhbXRBc0RjbSIHcHJBc0RjbSIIcHJpY2VYMTgiCGxwQW10WDE4Ig1scFBySW5BbUFzWDE4Ig1scFBySW5QckFzWDE4Igd0YWtlRmVlIgZhbW91bnQiCWZlZUFtb3VudCIEZ2V0RCICeHAiA3hwMCIDeHAxIgFzIgFhIgNhbm4iAXAiC3hwMF94cDFfbl9uIgVhbm5fcyIFYW5uXzEiCWNhbGNETmV4dCIBZCICZGQiA2RkZCICZHAiBGNhbGMiA2FjYyIBaSIFZE5leHQiCGREaWZmUmF3IgVkRGlmZiIDYXJyIg0kdDAxMjc3ODEyODI2IgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIFZm91bmQiA2VnbyIGdHhJZDU4IgpwbXRBc3NldElkIghwbXRMcEFtdCILdXNlckFkZHJlc3MiBGxwSWQiBGFtSWQiBHBySWQiBWFtRGNtIgVwckRjbSIDc3RzIgdscEVtaXNzIglhbUJhbGFuY2UiDGFtQmFsYW5jZVgxOCIJcHJCYWxhbmNlIgxwckJhbGFuY2VYMTgiC2N1clByaWNlWDE4IghjdXJQcmljZSILcG10THBBbXRYMTgiCmxwRW1pc3NYMTgiC291dEFtQW10WDE4IgtvdXRQckFtdFgxOCIIb3V0QW1BbXQiCG91dFByQW10IgVzdGF0ZSIDZXBvIghzbGlwcGFnZSIHaW5BbUFtdCIGaW5BbUlkIgdpblByQW10IgZpblBySWQiBmlzRXZhbCIGZW1pdExwIgppc09uZUFzc2V0IhB2YWxpZGF0ZVNsaXBwYWdlIgZwbXRBbXQiBXBtdElkIgdhbUlkU3RyIgdwcklkU3RyIgZhbXREY20iCHByaWNlRGNtIgRscEVtIg9pbkFtQXNzZXRBbXRYMTgiD2luUHJBc3NldEFtdFgxOCIMdXNlclByaWNlWDE4IgJEMCIBciICRDEiBmNoZWNrRCILc2xpcHBhZ2VYMTgiD3NsaXBwYWdlUmVhbFgxOCINbHBFbWlzc2lvblgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiINJHQwMjA1ODgyMDkzMyIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiBWdldFlEIgFEIgFuIgF4IgphUHJlY2lzaW9uIgFjIgFiIgNjdXIiDSR0MDIyMTI4MjIxNDgiAXkiBXlOZXh0IgV5RGlmZiINJHQwMjI0NTUyMjUwMiIHY2FsY0RMcCINYW1vdW50QmFsYW5jZSIMcHJpY2VCYWxhbmNlIgpscEVtaXNzaW9uIgp1cGRhdGVkRExwIg5jYWxjQ3VycmVudERMcCIQYW1vdW50QXNzZXREZWx0YSIPcHJpY2VBc3NldERlbHRhIhRscEFzc2V0RW1pc3Npb25EZWx0YSISYW1vdW50QXNzZXRCYWxhbmNlIhFwcmljZUFzc2V0QmFsYW5jZSIPbHBBc3NldEVtaXNzaW9uIgpjdXJyZW50RExwIhJyZWZyZXNoRExwSW50ZXJuYWwiF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhIhZwcmljZUFzc2V0QmFsYW5jZURlbHRhIgdhY3Rpb25zIhJ2YWxpZGF0ZVVwZGF0ZWRETHAiBm9sZERMcCIbdmFsaWRhdGVNYXRjaGVyT3JkZXJBbGxvd2VkIgVvcmRlciIRYW1vdW50QXNzZXRBbW91bnQiEHByaWNlQXNzZXRBbW91bnQiDSR0MDI0NzAwMjQ5MTIiA2RMcCINJHQwMjUyNTQyNTM1NCINdW51c2VkQWN0aW9ucyIGZExwTmV3Igxpc09yZGVyVmFsaWQiBGluZm8iAmNnIgNwbXQiAmNwIgZjYWxsZXIiB2FtQXNQbXQiB3ByQXNQbXQiDWNhbGNQdXRPbmVUa24iCXBtdEFtdFJhdyILd2l0aFRha2VGZWUiDWNoZWNoRW1pc3Npb24iDSR0MDI4MDEwMjg0NzIiDGFtQmFsYW5jZU9sZCIMcHJCYWxhbmNlT2xkIg0kdDAyODQ3ODI4NjU0IgthbUFtb3VudFJhdyILcHJBbW91bnRSYXciDSR0MDI4NjU4Mjg5MTIiCGFtQW1vdW50IghwckFtb3VudCIMYW1CYWxhbmNlTmV3IgxwckJhbGFuY2VOZXciCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAzMTAyNDMxMTM1Igh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDMxMzI1MzE2MzIiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiINJHQwMzI0MTczMjc2NyIQZmVlQW1vdW50Rm9yQ2FsYyIQb3V0SW5BbW91bnRBc3NldCINJHQwMzI3NzAzMjg3OCIRcmVmcmVzaERMcEFjdGlvbnMiEWlzVXBkYXRlZERMcFZhbGlkIgFtIgckbWF0Y2gwIgJwbSICcGQiCWlzTWFuYWdlciICcGsiAm1tIgRnZXRZIglpc1JldmVyc2UiE3Bvb2xBbW91bnRJbkJhbGFuY2UiDSR0MDM0MzI1MzQzNDUiDSR0MDM0Njc2MzQ3MjMiE3NraXBPcmRlclZhbGlkYXRpb24iDWNsZWFuQW1vdW50SW4iDWZlZVBvb2xBbW91bnQiDSR0MDM1MDc1MzU0OTkiCGFzc2V0T3V0IgJkeSILdG90YWxHZXRSYXciBW5ld1hwIgRuZXdEIgxhbW91bnRPdXRNaW4iCWFkZHJlc3NUbyILc3dhcENvbnRhY3QiBmNoZWNrcyIHYXNzZXRJbiINJHQwMzY5MzUzNzMyOSIIY2hlY2tNaW4iF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IgJjbSIDaHBtIgNjcG0iBHNsaXAiCWF1dG9TdGFrZSIHZmFjdENmZyILc3Rha2luZ0NudHIiCHNsaXBDbnRyIgphbUFzc2V0UG10IgpwckFzc2V0UG10IgFlIglscEFzc2V0SWQiAmVsIgZsZWdhY3kiAnNhIgJzcCIIbHBUcm5zZnIiAnNzIg0kdDA0MTk0ODQyMDkwIgVjaGVjayIUbHBBc3NldEVtaXNzaW9uQWZ0ZXIiIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIg1pc1B1dERpc2FibGVkIg0kdDA0MzczMTQzODg5Igdlc3RpbUxQIg0kdDA0NDc3NDQ1MTIzIhRwYXltZW50SW5BbW91bnRBc3NldCINJHQwNDUxMjY0NTIzNCIHbWF4U2xwZyIGZXN0UHV0Ig0kdDA0NjI2NDQ2MzI5IglvdXRBbXRBbXQiDSR0MDQ3NTAyNDc1ODQiDWlzR2V0RGlzYWJsZWQiDSR0MDQ4MjAyNDgzNTciGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCIdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQiDSR0MDQ4ODgxNDg5NDUiEGRMcFVwZGF0ZUFjdGlvbnMiDWxwQXNzZXRBbW91bnQiBWluZGV4IgRuZXdZIg0kdDA0OTk1NTUwMDEwIg0kdDA1MDM4NTUwNTAwIg5zdW1PZkdldEFzc2V0cyISbm9MZXNzVGhlbkFtdEFzc2V0IhRub0xlc3NUaGVuUHJpY2VBc3NldCIUYnVybkxQQXNzZXRPbkZhY3RvcnkiDSR0MDUxNjY2NTE3NDciDWNoZWNrUGF5bWVudHMiCmZhY3RvcnlDZmciB3N0YWtpbmciCnVuc3Rha2VJbnYiAXYiBWJ1cm5BIg0kdDA1Mjc3NDUyODU1Ig11bnN0YWtlQW1vdW50IhVub0xlc3NUaGVuQW1vdW50QXNzZXQiA3JlcyIMY2hlY2tBbW91bnRzIg0kdDA1NDEwNjU0MTg3IhdscEFzc2V0UmVjaXBpZW50QWRkcmVzcyINJHQwNTUyMDk1NTM5NyIQcGF5bWVudEFtb3VudFJhdyIOcGF5bWVudEFzc2V0SWQiDSR0MDU1NTI1NTU2MjgiDSR0MDU1Nzc2NTU4ODAiCGFtdEFzU3RyIgdwckFzU3RyIgJwciIMcmVzU2NhbGVNdWx0Igd1c3JBZGRyIgdwbXRBc0lkIgNjZmciDSR0MDU4Mjg5NTg0ODgiBGxpc3QiBWRlbGF5IgVkZWx0YSIGdGFyZ2V0IgZjdXJBbXAiCW5ld0FtcFJhdyIGbmV3QW1wIghsYXN0Q2FsbCIEd2FpdCICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IgptYXRjaGVyUHViIg0kdDA1OTQwMDU5NTE3IgduZXdIYXNoIgthbGxvd2VkSGFzaCILY3VycmVudEhhc2h0AAFhAIDC1y8AAWIJALYCAQCAwtcvAAFjCQC2AgEAgICQu7rWrfANAAFkCQC2AgEAAAABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEAAgABaAkAtgIBAAMAAWkJALYCAQAEAAFqAgVXQVZFUwABawAyAAFsAgMxMDAAAW0CAl9fAAFuAAIAAW8AAwABcAAEAAFxAAEAAXIAAgABcwADAAF0AAQAAXUABQABdgAGAAF3AAcAAXgAAQABeQAGAAF6AAcAAUEJAGsDAAoFAWEAkE4BAUICAUMBRAkAvAIDCQC2AgEFAUMFAWMJALYCAQUBRAEBRQIBQwFECQC8AgMFAUMFAWMFAUQBAUYCAUcBSAkAoAMBCQC8AgMFAUcJALYCAQUBSAUBYwEBSQMBRwFIAUoJAKADAQkAvQIEBQFHCQC2AgEFAUgFAWMFAUoBAUsBAUcDCQC/AgIFAWQFAUcJAL4CAQUBRwUBRwEBTAEBRwMJAL8CAgUBZAUBRwkAvgIBBQFHBQFHAQFNAAITJXNfX2ZhY3RvcnlDb250cmFjdAEBTgACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFPAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFQAAIRJXMlc19fcHJpY2VfX2xhc3QBAVECAVIBUwkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAVIJAMwIAgkApAMBBQFTBQNuaWwFAW0BAVQCAVUBVgkArAICCQCsAgIJAKwCAgILJXMlcyVzX19QX18FAVUCAl9fBQFWAQFXAgFVAVYJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQFVAgJfXwUBVgEBWAACDyVzX19hbW91bnRBc3NldAEBWQACDiVzX19wcmljZUFzc2V0AQFaAAIHJXNfX2FtcAECYWEBAmFiCQCsAgICCyVzJWRfX2FtcF9fCQCkAwEFAmFiAQJhYwACFSVzX19jaGFuZ2VBbXBMYXN0Q2FsbAACYWQCByVzX19mZWUAAmFlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFkBQFBAAJhZgkAuQkCCQDMCAICAiVzCQDMCAICA2RMcAUDbmlsBQFtAAJhZwkAuQkCCQDMCAICAiVzCQDMCAICEmRMcFJlZnJlc2hlZEhlaWdodAUDbmlsBQFtAAJhaAkAuQkCCQDMCAICAiVzCQDMCAICD3JlZnJlc2hETHBEZWxheQUDbmlsBQFtAAJhaQAeAAJhagkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhaAUCYWkBAmFrAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFsAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhbQICYW4CYW8JAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFuAgJfXwUCYW8CCF9fY29uZmlnAQJhcAECYXEJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYXEBAmFyAAIMJXNfX3NodXRkb3duAQJhcwACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQJhdAACFyVzX19mZWVDb2xsZWN0b3JBZGRyZXNzAQJhdQECYXYJAKwCAgIbJXMlc19fc2tpcE9yZGVyVmFsaWRhdGlvbl9fBQJhdgECYXcEAmF4AmF5AmF6AmFBCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICJG9yZGVyIHZhbGlkYXRpb24gZmFpbGVkOiBvcmRlclZhbGlkPQkApQMBBQJheAICICgFAmF5AgEpAg0gc2VuZGVyVmFsaWQ9CQClAwEFAmF6Ag4gbWF0Y2hlclZhbGlkPQkApQMBBQJhQQECYUICAmFDAmFECQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYUMFAmFECQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFDCQDMCAICAS4JAMwIAgUCYUQJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUUCAmFDAmFECQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYUMFAmFECQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFDCQDMCAICAS4JAMwIAgUCYUQJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUYBAmFHCQACAQkAuQkCCQDMCAICD2xwX3N0YWJsZS5yaWRlOgkAzAgCBQJhRwUDbmlsAgEgAQJhSAECYUcJALkJAgkAzAgCAg9scF9zdGFibGUucmlkZToJAMwIAgUCYUcFA25pbAIBIAACYUkJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhQgIFBHRoaXMJAQFNAAACYUoKAAJhSwkA/AcEBQJhSQIQZ2V0SW5GZWVSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmFLAgNJbnQFAmFLCQACAQkArAICCQADAQUCYUsCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAACYUwKAAJhSwkA/AcEBQJhSQIRZ2V0T3V0RmVlUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhSwIDSW50BQJhSwkAAgEJAKwCAgkAAwEFAmFLAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQAAmFNCQECYUICBQR0aGlzCQEBWgABAmFOAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhSQkBAmFyAAcBAmFPAAkA2QQBCQECYUICBQJhSQkBAmFsAAACYVAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhQgIFAmFJCQECYXQAAQJhUQAEAmFSCQECYUICBQR0aGlzCQEBWAAEAmFTCQECYUICBQR0aGlzCQEBWQAEAmFUCQECYUUCBQJhSQkBAmFwAQUCYVMEAmFuCQECYUUCBQJhSQkBAmFwAQUCYVIJALUJAgkBAmFCAgUCYUkJAQJhbQIJAKQDAQUCYW4JAKQDAQUCYVQFAW0BAmFVAQJhVgMJAAACBQJhVgUBagUEdW5pdAkA2QQBBQJhVgECYVcBAmFWAwkAAAIFAmFWBQR1bml0BQFqCQDYBAEJAQV2YWx1ZQEFAmFWAQJhWAECYVkJAJkKBwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhWQUBcQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQFyCQDZBAEJAJEDAgUCYVkFAXMJAQJhVQEJAJEDAgUCYVkFAXQJAQJhVQEJAJEDAgUCYVkFAXUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBdgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQF3AAJhWgkBAmFYAQkBAmFRAAACYmEFAmFaAAJiYggFAmJhAl8yAAJiYwgFAmJhAl8zAAJiZAgFAmJhAl80AAJiZQgFAmJhAl81AAJiZggFAmJhAl82AAJiZwgFAmJhAl83AQJiaAAJALUJAgkBAmFCAgUCYUkJAQJhawAFAW0AAmJpCQECYmgAAAJiagkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmkFAXgCIEludmFsaWQgc3Rha2luZyBjb250cmFjdCBhZGRyZXNzAAJiawkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmkFAXkCHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBAmJsCgJibQJibgJibwJicAJicQJicgJicwJidAJidQJidgkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYm0JAMwIAgkApAMBBQJibgkAzAgCCQCkAwEFAmJvCQDMCAIJAKQDAQUCYnAJAMwIAgkApAMBBQJicQkAzAgCCQCkAwEFAmJyCQDMCAIJAKQDAQUCYnMJAMwIAgkApAMBBQJidAkAzAgCCQCkAwEFAmJ1CQDMCAIJAKQDAQUCYnYFA25pbAUBbQECYncGAmJ4AmJ5AmJ6AmJwAmJzAmJ0CQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYngJAMwIAgkApAMBBQJieQkAzAgCCQCkAwEFAmJ6CQDMCAIJAKQDAQUCYnAJAMwIAgkApAMBBQJicwkAzAgCCQCkAwEFAmJ0BQNuaWwFAW0BAmJBAQJiQgMJAAACBQJiQgIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYkIBAmJDAgJiRAJiRQkAvAIDBQJiRAUBYwUCYkUBAmJGAwJiRAJiRQFKCQC9AgQFAmJEBQFjBQJiRQUBSgECYkcEAmJIAmJJAmJKAmJLBAJiTAkBAUICBQJiSgUCYkgEAmJNCQEBQgIFAmJLBQJiSQkBAmJDAgUCYk0FAmJMAQJiTgMCYkoCYksCYk8EAmJQBQJiZgQCYlEFAmJnBAJiUgkBAmJHBAUCYlAFAmJRBQJiSgUCYksEAmJFCQEBQgIFAmJKBQJiUAQCYkQJAQFCAgUCYksFAmJRBAJiUwkBAUICBQJiTwUBYQQCYlQJAQJiQwIFAmJFBQJiUwQCYlUJAQJiQwIFAmJEBQJiUwkAzAgCBQJiUgkAzAgCBQJiVAkAzAgCBQJiVQUDbmlsAQJiVgICYlcCYWUEAmJYAwkAAAIFAmFlAAAAAAkAawMFAmJXBQJhZQUBYQkAlAoCCQBlAgUCYlcFAmJYBQJiWAECYlkBAmJaBAJjYQkAkQMCBQJiWgAABAJjYgkAkQMCBQJiWgABBAJjYwkAtwICBQJjYQUCY2IDCQAAAgUCY2MFAWUFAWUEAmNkCQENcGFyc2VJbnRWYWx1ZQEFAmFNBAJjZQkAaAIFAmNkAAIEAmNmCQC8AgMFAmNhBQJjYgUBZgQCY2cJALwCAwUCY2YFAWkFAWYEAmNoCQC8AgMJALYCAQUCY2UFAmNjBQFmBAJjaQkAtgIBCQBlAgUCY2UAAQoBAmNqAQJjawQCY2wJALwCAwUCY2sFAmNrBQFmBAJjbQkAvAIDBQJjbAUCY2sFAWYEAmNuCQC8AgMFAmNtBQFmBQJjZwkAvAIDCQC3AgIFAmNoCQC8AgMFAmNuBQFnBQFmBQJjawkAtwICCQC8AgMFAmNpBQJjawUBZgkAvAIDBQFoBQJjbgUBZgoBAmNvAgJjcAJjcQMIBQJjcAJfMgUCY3AEAmNrCAUCY3ACXzEEAmNyCQECY2oBBQJjawQCY3MJALgCAgUCY3IJAQV2YWx1ZQEFAmNrBAJjdAMJAL8CAgUBZQUCY3MJAL4CAQUCY3MFAmNzAwkAwAICBQFmBQJjdAkAlAoCBQJjcgYJAJQKAgUCY3IHBAJjdQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgkAzAgCAA8JAMwIAgAQBQNuaWwEAmN2CgACY3cFAmN1CgACY3gJAJADAQUCY3cKAAJjeQkAlAoCBQJjYwcKAQJjegICY0ECY0IDCQBnAgUCY0IFAmN4BQJjQQkBAmNvAgUCY0EJAJEDAgUCY3cFAmNCCgECY0MCAmNBAmNCAwkAZwIFAmNCBQJjeAUCY0EJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNwkBAmNDAgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgUCY3kAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEEAmNrCAUCY3YCXzEEAmNECAUCY3YCXzIDBQJjRAUCY2sJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCY2sBAmNFBAJjRgJjRwJjSAJjSQQCY0oFAmJjBAJjSwkA2AQBCQEFdmFsdWUBBQJiZAQCY0wJANgEAQkBBXZhbHVlAQUCYmUEAmNNBQJiZgQCY04FAmJnBAJjTwkApAMBBQJiYgQCY1AICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY0oCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgkA2AQBBQJjSgUCY0cJAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmNRCQECYkEBBQJjSwQCY1IJAQFCAgUCY1EFAmNNBAJjUwkBAmJBAQUCY0wEAmNUCQEBQgIFAmNTBQJjTgQCY1UJAQJiQwIFAmNUBQJjUgQCY1YJAQFGAgUCY1UFAWEEAmNXCQEBQgIFAmNIBQFhBAJjWAkBAUICBQJjUAUBYQQCY1kJALwCAwUCY1IFAmNXBQJjWAQCY1oJALwCAwUCY1QFAmNXBQJjWAQCZGEJAQFJAwUCY1kFAmNNBQVGTE9PUgQCZGIJAQFJAwUCY1oFAmNOBQVGTE9PUgQCZGMDCQAAAgUCY0YCAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNJBQJkYQMJAAACBQJjSwIFV0FWRVMFBHVuaXQJANkEAQUCY0sJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY0kFAmRiAwkAAAIFAmNMAgVXQVZFUwUEdW5pdAkA2QQBBQJjTAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVwIJAKUIAQUCY0kFAmNGCQECYncGBQJkYQUCZGIFAmNIBQJjVgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVAABQJjVgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVECBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjVgUDbmlsCQCcCgoFAmRhBQJkYgUCY0sFAmNMBQJjUQUCY1MFAmNQBQJjVQUCY08FAmRjAQJkZA0CY0YCZGUCZGYCZGcCZGgCZGkCY0kCZGoCZGsCZGwCZG0CZG4CZG8EAmNKBQJiYwQCZHAJANgEAQkBBXZhbHVlAQUCYmQEAmRxCQDYBAEJAQV2YWx1ZQEFAmJlBAJkcgUCYmYEAmRzBQJiZwQCY08JAKQDAQUCYmIEAmR0CAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmNKAghXciBscCBhcwhxdWFudGl0eQQCY1EDBQJkagkBAmJBAQUCZHADAwUCZGwJAAACBQJkbwUCZHAHCQBlAgkBAmJBAQUCZHAFAmRuAwUCZGwJAQJiQQEFAmRwCQBlAgkBAmJBAQUCZHAFAmRmBAJjUwMFAmRqCQECYkEBBQJkcQMDBQJkbAkAAAIFAmRvBQJkcQcJAGUCCQECYkEBBQJkcQUCZG4DBQJkbAkBAmJBAQUCZHEJAGUCCQECYkEBBQJkcQUCZGgEAmR1CQEBQgIFAmRmBQJkcgQCZHYJAQFCAgUCZGgFAmRzBAJkdwkBAmJDAgUCZHYFAmR1BAJjUgkBAUICBQJjUQUCZHIEAmNUCQEBQgIFAmNTBQJkcwQCZHgJAQJiWQEJAMwIAgUCY1IJAMwIAgUCY1QFA25pbAQCZHkDCQAAAgUCZHQAAAQCZHoJAQJiWQEJAMwIAgkAtwICBQJjUgUCZHUJAMwIAgkAtwICBQJjVAUCZHYFA25pbAQCZEEDCQC/AgIFAmR6BQJkeAYJAAIBAhxEMSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIEQwAwkAAAIFAmRBBQJkQQQCY1UFAWQEAmRCBQFkBAJiUwUCZHoJAJcKBQkBAUYCBQJiUwUBYQkBAUYCBQJkdQUCZHIJAQFGAgUCZHYFAmRzCQECYkMCCQC3AgIFAmNUBQJkdgkAtwICBQJjUgUCZHUFAmRCCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJjVQkBAmJDAgUCY1QFAmNSBAJkQwkAvAIDCQEBSwEJALgCAgUCY1UFAmR3BQFjBQJjVQQCZEIJAQFCAgUCZGUFAWEDAwMFAmRtCQECIT0CBQJjVQUBZAcJAL8CAgUCZEMFAmRCBwkAAgEJAKwCAgkArAICCQCsAgICD1ByaWNlIHNsaXBwYWdlIAkApgMBBQJkQwIDID4gCQCmAwEFAmRCBAJkRAkBAUICBQJkdAUBYQQCZEUJAL0CBAUCZHUJAQJiRgMFAmNUBQJjUgUHQ0VJTElORwUBYwUHQ0VJTElORwQCZEYJAL0CBAUCZHYFAWMJAQJiRgMFAmNUBQJjUgUFRkxPT1IFB0NFSUxJTkcEAmRHAwkAvwICBQJkRQUCZHYJAJQKAgUCZEYFAmR2CQCUCgIFAmR1BQJkRQQCZEgIBQJkRwJfMQQCZEkIBQJkRwJfMgQCZHoJAQJiWQEJAMwIAgkAtwICBQJjUgUCZEgJAMwIAgkAtwICBQJjVAUCZEkFA25pbAQCZEEDCQC/AgIFAmR6BQJkeAYJAAIBAhxEMSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIEQwAwkAAAIFAmRBBQJkQQQCYlMJALwCAwUCZEQJALgCAgUCZHoFAmR4BQJkeAkAlwoFCQEBSQMFAmJTBQFhBQVGTE9PUgkBAUkDBQJkSAUCZHIFB0NFSUxJTkcJAQFJAwUCZEkFAmRzBQdDRUlMSU5HBQJjVQUCZEIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAmRKCAUCZHkCXzEEAmRLCAUCZHkCXzIEAmRMCAUCZHkCXzMEAmNWCQEBRgIIBQJkeQJfNAUBYQQCZE0JAQFGAggFAmR5Al81BQFhAwkAZwIAAAUCZEoJAAIBAgdMUCA8PSAwBAJkTgMJAQEhAQUCZGsAAAUCZEoEAmRPCQBlAgUCZGYFAmRLBAJkUAkAZQIFAmRoBQJkTAQCZFEDAwUCZGwJAAACBQJkbwUCZHAHCQCUCgIFAmRuAAADAwUCZGwJAAACBQJkbwUCZHEHCQCUCgIAAAUCZG4JAJQKAgUCZEsFAmRMBAJkUggFAmRRAl8xBAJkUwgFAmRRAl8yBAJkVAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVAABQJjVgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVECBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjVgkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAIFAmNJBQJjRgkBAmJsCgUCZFIFAmRTBQJkTgUCY1YFAmRlBQJkTQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZE8FAmRQBQNuaWwJAJ8KDQUCZEoFAmROBQJjVgUCY1EFAmNTBQJkdAUCY0oFAmNPBQJkVAUCZE8FAmRQBQJkZwUCZGkBAmRVAwJiWgJjcQJkVgQCZFcFAWcEAmRYCQCRAwIFAmJaAwkAAAIFAmNxAAAAAQAABAJkWQkApwMBBQFsBAJjZAkAuQICCQCnAwEFAmFNBQJkWQQCY2MFAmRYBAJjZQkAuQICBQJjZAUCZFcEAmRaCQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZFYFAmRWCQC5AgIFAmRYBQJkVwUCZFYFAmRZCQC5AgIFAmNlBQJkVwQCZWEJALgCAgkAtwICBQJjYwkAugICCQC5AgIFAmRWBQJkWQUCY2UFAmRWCgECY28CAmNwAmViBAJlYwUCY3AEAmVkCAUCZWMCXzEEAmNECAUCZWMCXzIDCQECIT0CBQJjRAUEdW5pdAUCY3AEAmVlCQC6AgIJALcCAgkAuQICBQJlZAUCZWQFAmRaCQC3AgIJALkCAgUBZwUCZWQFAmVhBAJlZgkBAUwBCQC4AgIFAmVlCQEFdmFsdWUBBQJlZAMJAMACAgUBZgUCZWYJAJQKAgUCZWUFAmViCQCUCgIFAmVlBQR1bml0BAJjdQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlZwoAAmN3BQJjdQoAAmN4CQCQAwEFAmN3CgACY3kJAJQKAgUCZFYFBHVuaXQKAQJjegICY0ECY0IDCQBnAgUCY0IFAmN4BQJjQQkBAmNvAgUCY0EJAJEDAgUCY3cFAmNCCgECY0MCAmNBAmNCAwkAZwIFAmNCBQJjeAUCY0EJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmNDAgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgUCY3kAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZWQIBQJlZwJfMQQCY0QIBQJlZwJfMgMJAQIhPQIFAmNEBQR1bml0BQJlZAkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlZAECZWgDAmVpAmVqAmVrBAJlbAkAvAIDCQECYlkBCQDMCAIJAQFFAgUCZWkJALYCAQUCYmYJAMwIAgkBAUUCBQJlagkAtgIBBQJiZwUDbmlsBQFjBQJlawMJAAACBQJlawUBZQUBZQUCZWwBAmVtAwJlbgJlbwJlcAQCZXEJALgCAgkAtgIBCQECYkEBCQECYVcBBQJiZAUCZW4EAmVyCQC4AgIJALYCAQkBAmJBAQkBAmFXAQUCYmUFAmVvBAJlcwkAuAICCQC2AgEICQEFdmFsdWUBCQDsBwEFAmJjCHF1YW50aXR5BQJlcAQCZXQJAQJlaAMFAmVxBQJlcgUCZXMFAmV0AQJldQMCZXYCZXcCZXAEAmVxCQBkAgkBAmJBAQkBAmFXAQUCYmQFAmV2BAJlcgkAZAIJAQJiQQEJAQJhVwEFAmJlBQJldwQCZXMJAGQCCAkBBXZhbHVlAQkA7AcBBQJiYwhxdWFudGl0eQUCZXAEAmVsCQECZWgDCQC2AgEFAmVxCQC2AgEFAmVyCQC2AgEFAmVzBAJleAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYWcFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCBQJhZgkApgMBBQJlbAUDbmlsCQCUCgIFAmV4BQJlbAECZXkCAmV6AmVsAwkAwAICBQJlbAUCZXoGCQECYUYBAiJ1cGRhdGVkIERMcCBsb3dlciB0aGFuIGN1cnJlbnQgRExwAQJlQQECZUIEAmVxCQECYkEBCQECYVcBBQJiZAQCZXIJAQJiQQEJAQJhVwEFAmJlBAJlQwgFAmVCBmFtb3VudAQCZUQJAG4ECAUCZUIGYW1vdW50CAUCZUIFcHJpY2UFAWEFBUZMT09SBAJlRQMJAAACCAUCZUIJb3JkZXJUeXBlBQNCdXkJAJQKAgUCZUMJAQEtAQUCZUQJAJQKAgkBAS0BBQJlQwUCZUQEAmV2CAUCZUUCXzEEAmV3CAUCZUUCXzIDAwMJAQJhTgAGCQAAAgUCYmIFAW8GCQAAAgUCYmIFAXAJAAIBAg1BZG1pbiBibG9ja2VkAwMJAQIhPQIICAUCZUIJYXNzZXRQYWlyC2Ftb3VudEFzc2V0BQJiZAYJAQIhPQIICAUCZUIJYXNzZXRQYWlyCnByaWNlQXNzZXQFAmJlCQACAQIJV3IgYXNzZXRzBAJlRgkApwMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAmFmAgEwBAJlRwkBAmV1AwUCZXYFAmV3AAAEAmVICAUCZUcCXzEEAmVJCAUCZUcCXzIEAmVKCQDAAgIFAmVJBQJlRgQCZUsJALkJAgkAzAgCAgRkTHA9CQDMCAIJAKYDAQUCZUYJAMwIAgIIIGRMcE5ldz0JAMwIAgkApgMBBQJlSQkAzAgCAhQgYW1vdW50QXNzZXRCYWxhbmNlPQkAzAgCCQCkAwEFAmVxCQDMCAICEyBwcmljZUFzc2V0QmFsYW5jZT0JAMwIAgkApAMBBQJlcgkAzAgCAhkgYW1vdW50QXNzZXRCYWxhbmNlRGVsdGE9CQDMCAIJAKQDAQUCZXYJAMwIAgIYIHByaWNlQXNzZXRCYWxhbmNlRGVsdGE9CQDMCAIJAKQDAQUCZXcJAMwIAgIIIGhlaWdodD0JAMwIAgkApAMBBQZoZWlnaHQFA25pbAIACQCUCgIFAmVKBQJlSwECZUwBAmNxAwkBAiE9AgkAkAMBCAUCY3EIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmVNCQEFdmFsdWUBCQCRAwIIBQJjcQhwYXltZW50cwAABAJjRwkBBXZhbHVlAQgFAmVNB2Fzc2V0SWQEAmRuCAUCZU0GYW1vdW50BAJkeQkBAmNFBAkA2AQBCAUCY3ENdHJhbnNhY3Rpb25JZAkA2AQBBQJjRwUCZG4IBQJjcQZjYWxsZXIEAmRhCAUCZHkCXzEEAmRiCAUCZHkCXzIEAmNPCQENcGFyc2VJbnRWYWx1ZQEIBQJkeQJfOQQCZGMIBQJkeQNfMTADAwkBAmFOAAYJAAACBQJjTwUBcAkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmNPCQCXCgUFAmRhBQJkYgUCZG4FAmNHBQJkYwECZU4KAmVPAVYCZVACZVECZGUCZGsCZGwCZG0CZG4CZG8EAmR5CQECZGQNBQFWBQJkZQgJAQV2YWx1ZQEFAmVQBmFtb3VudAgJAQV2YWx1ZQEFAmVQB2Fzc2V0SWQICQEFdmFsdWUBBQJlUQZhbW91bnQICQEFdmFsdWUBBQJlUQdhc3NldElkBQJlTwkAAAIFAVYCAAUCZGsFAmRsBQJkbQUCZG4FAmRvBAJjTwkBDXBhcnNlSW50VmFsdWUBCAUCZHkCXzgDAwMJAQJhTgAGCQAAAgUCY08FAW4GCQAAAgUCY08FAXAJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmNPBQJkeQECZVIFAmVTAmNHAmNJAVYCZVQEAmNLCQDYBAEJAQV2YWx1ZQEFAmJkBAJjTAkA2AQBCQEFdmFsdWUBBQJiZQQCY0oFAmJjBAJkcgUCYmYEAmRzBQJiZwQCZXMJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJjSgIQaW52YWxpZCBscCBhc3NldAhxdWFudGl0eQQCZVUDCQC/AgIFAmVzBQFlBgkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMDCQAAAgUCZVUFAmVVBAJjUQkBAmJBAQUCY0sEAmNTCQECYkEBBQJjTAQCZVYDCQAAAgUBVgIACQCUCgIFAmNRBQJjUwMJAAACBQJjRwUCY0sDCQBmAgUCZVMFAmNRCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCCQBlAgUCY1EFAmVTBQJjUwMJAAACBQJjRwUCY0wDCQBmAgUCZVMFAmNTCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCBQJjUQkAZQIFAmNTBQJlUwkAAgECEHdyb25nIHBtdEFzc2V0SWQEAmVXCAUCZVYCXzEEAmVYCAUCZVYCXzIEAmVZAwkAAAIFAmNHBQJjSwkAlAoCBQJlUwAAAwkAAAIFAmNHBQJjTAkAlAoCAAAFAmVTCQACAQIPaW52YWxpZCBwYXltZW50BAJlWggFAmVZAl8xBAJmYQgFAmVZAl8yBAJmYgMFAmVUCQCVCgMICQECYlYCBQJlWgUCYUoCXzEICQECYlYCBQJmYQUCYUoCXzEICQECYlYCBQJlUwUCYUoCXzIJAJUKAwUCZVoFAmZhAAAEAmZjCAUCZmICXzEEAmZkCAUCZmICXzIEAmJYCAUCZmICXzMEAmZlCQBkAgUCZVcFAmZjBAJmZgkAZAIFAmVYBQJmZAQCZHgJAQJiWQEJAMwIAgkBAUICBQJlVwUCYmYJAMwIAgkBAUICBQJlWAUCYmcFA25pbAQCZHoJAQJiWQEJAMwIAgkBAUICBQJmZQUCYmYJAMwIAgkBAUICBQJmZgUCYmcFA25pbAQCZEEDCQC/AgIFAmR6BQJkeAYJAQV0aHJvdwADCQAAAgUCZEEFAmRBBAJmZwkAvQIEBQJlcwkAuAICBQJkegUCZHgFAmR4BQVGTE9PUgQCY1YJAQFGAgkBAmJDAgkBAUICBQJmZgUCZHMJAQFCAgUCZmUFAmRyBQFhBAJkVAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVAABQJjVgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVECBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjVgkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAIFAmNJBQFWCQECYmwKBQJlWgUCZmEJAKADAQUCZmcFAmNWAAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZmgJAGsDBQJlWAUBYQUCZVcEAmZpCQBrAwUCZVMFAWEJAGQCBQJmaAUBYQQCZmoJAGUCBQJlUwUCZmkEAmZrCQC8AgMFAmVzCQC2AgEFAmZqCQC2AgEFAmVYBAJmbAkAoAMBCQC8AgMJALgCAgUCZmcFAmZrBQFiBQJmawkAlgoECQCgAwEFAmZnBQJkVAUCYlgFAmZsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmbQYCZm4CZm8CZnACZU8CZnECZnIEAmNKCQDYBAEJAQV2YWx1ZQEFAmJjBAJjSwkA2AQBCQEFdmFsdWUBBQJiZAQCY0wJANgEAQkBBXZhbHVlAQUCYmUEAmZzBQJiZgQCZnQFAmJnBAJmdQUCYmIEAmNJAwkAAAIFAmVPBQJiawUCZnEFAmVPBAJlTQkBBXZhbHVlAQkAkQMCBQJmcAAABAJjRwkBBXZhbHVlAQgFAmVNB2Fzc2V0SWQEAmRuCAUCZU0GYW1vdW50BAJldAkBAmVtAwUBZQUBZQUBZQMJAAACBQJldAUCZXQEAmNGCQDYBAEFAmZyAwkBAiE9AgUCY0oJANgEAQUCY0cJAAIBAghXcm9uZyBMUAQCY1EJAQJiQQEFAmNLBAJjUwkBAmJBAQUCY0wEAmZ2CgACYUsJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJmbgkAzAgCBQJkbgUDbmlsBQNuaWwDCQABAgUCYUsCCihJbnQsIEludCkFAmFLCQACAQkArAICCQADAQUCYUsCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkDCQAAAgUCZnYFAmZ2BAJiWAgFAmZ2Al8yBAJmdwgFAmZ2Al8xBAJmeAMDCQBmAgUCZm8AAAkAZgIFAmZvBQJmdwcJAQJhRgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZm8FA25pbAIABQJmdwQCZnkDCQAAAgUCZm4FAmNLCQCWCgQFAmZ4AAAJAGUCCQBlAgUCY1EFAmZ4BQJiWAUCY1MDCQAAAgUCZm4FAmNMCQCWCgQAAAUCZngFAmNRCQBlAgkAZQIFAmNTBQJmeAUCYlgJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCZnoIBQJmeQJfMQQCZkEIBQJmeQJfMgQCZmUIBQJmeQJfMwQCZmYIBQJmeQJfNAQCZkIJAQJiQwIJAQFCAgUCZmYFAmZ0CQEBQgIFAmZlBQJmcwQCZkMJAQFGAgUCZkIFAWEEAmZEAwkAAAIFAmZuAgVXQVZFUwUEdW5pdAkA2QQBBQJmbgQCZkUDCQBmAgUCYlgAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhUAUCYlgFAmZEBQNuaWwFA25pbAQCZGMJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjSQUCZngFAmZECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFXAgkApQgBBQJjSQUCY0YJAQJidwYFAmZ6BQJmQQUCZG4FAmZDBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUAAFAmZDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmZDBQNuaWwFAmZFAwkAAAIFAmRjBQJkYwQCZkYJAPwHBAUCYUkCBGJ1cm4JAMwIAgUCZG4FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY0cFAmRuBQNuaWwDCQAAAgUCZkYFAmZGBAJmRwQCZkgDCQAAAgUEdGhpcwUCYVAAAAUCYlgEAmZJAwkAAAIJAQJhVQEFAmZuBQJiZAYHAwUCZkkJAJQKAgkBAS0BCQBkAgUCZncFAmZIAAAJAJQKAgAACQEBLQEJAGQCBQJmdwUCZkgEAmV2CAUCZkcCXzEEAmV3CAUCZkcCXzIEAmZKCQECZXUDBQJldgUCZXcAAAQCZksIBQJmSgJfMQQCZWwIBQJmSgJfMgQCZkwJAQJleQIFAmV0BQJlbAMJAAACBQJmTAUCZkwJAJQKAgkAzggCBQJkYwUCZksFAmZ4CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmTQAEAmZOCQCiCAEJAQFOAAMJAAECBQJmTgIGU3RyaW5nBAJjYwUCZk4JANkEAQUCY2MDCQABAgUCZk4CBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECZk8ABAJmTgkAoggBCQEBTwADCQABAgUCZk4CBlN0cmluZwQCY2MFAmZOCQDZBAEFAmNjAwkAAQIFAmZOAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAmZQCQACAQIRUGVybWlzc2lvbiBkZW5pZWQBAmZRAQJjcQQCZk4JAQJmTQADCQABAgUCZk4CCkJ5dGVWZWN0b3IEAmZSBQJmTgkAAAIIBQJjcQ9jYWxsZXJQdWJsaWNLZXkFAmZSAwkAAQIFAmZOAgRVbml0CQAAAggFAmNxBmNhbGxlcgUEdGhpcwkAAgECC01hdGNoIGVycm9yAQJmUwECY3EEAmZOCQECZk0AAwkAAQIFAmZOAgpCeXRlVmVjdG9yBAJmUgUCZk4DCQAAAggFAmNxD2NhbGxlclB1YmxpY0tleQUCZlIGBQJmUAMJAAECBQJmTgIEVW5pdAMJAAACCAUCY3EGY2FsbGVyBQR0aGlzBgUCZlAJAAIBAgtNYXRjaCBlcnJvcgECZlQDAmZVAmRWAmZWBAJhWQkBAmFRAAQCY0sJAJEDAgUCYVkFAXQEAmNMCQCRAwIFAmFZBQF1BAJkVwUBZwQCZFkJAKcDAQUBbAQCY2QJALkCAgkApwMBBQJhTQUCZFkEAmJaAwkAAAIFAmZVBwkAzAgCCQC3AgIJALYCAQkBAmJBAQUCY0sFAmZWCQDMCAIJALYCAQkBAmJBAQUCY0wFA25pbAkAzAgCCQC3AgIJALYCAQkBAmJBAQUCY0wFAmZWCQDMCAIJALYCAQkBAmJBAQUCY0sFA25pbAQCZFgJAJEDAgUCYloAAAQCY2MFAmRYBAJjZQkAuQICBQJjZAUCZFcEAmRaCQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZFYFAmRWCQC5AgIFAmRYBQJkVwUCZFYFAmRZCQC5AgIFAmNlBQJkVwQCZWEJALgCAgkAtwICBQJjYwkAugICCQC5AgIFAmRWBQJkWQUCY2UFAmRWCgECY28CAmNwAmViBAJmVwUCY3AEAmVkCAUCZlcCXzEEAmNECAUCZlcCXzIDCQECIT0CBQJjRAUEdW5pdAUCY3AEAmVlCQC6AgIJALcCAgkAuQICBQJlZAUCZWQFAmRaCQC3AgIJALkCAgUBZwUCZWQFAmVhBAJlZgkBAUwBCQC4AgIFAmVlCQEFdmFsdWUBBQJlZAMJAMACAgUBZgUCZWYJAJQKAgUCZWUFAmViCQCUCgIFAmVlBQR1bml0BAJjdQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJmWAoAAmN3BQJjdQoAAmN4CQCQAwEFAmN3CgACY3kJAJQKAgUCZFYFBHVuaXQKAQJjegICY0ECY0IDCQBnAgUCY0IFAmN4BQJjQQkBAmNvAgUCY0EJAJEDAgUCY3cFAmNCCgECY0MCAmNBAmNCAwkAZwIFAmNCBQJjeAUCY0EJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmNDAgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgkBAmN6AgUCY3kAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZWQIBQJmWAJfMQQCY0QIBQJmWAJfMgMJAQIhPQIFAmNEBQR1bml0BQJlZAkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlZAECZlkACQELdmFsdWVPckVsc2UCCQCbCAIFAmFJCQECYXUBCQClCAEFBHRoaXMHHQJjcQEhY2FsY3VsYXRlQW1vdW50T3V0Rm9yU3dhcFJFQURPTkxZAwJmWgJmVQJnYQQCZ2IDCQAAAgUCZlUHBAJnYwkBAmFCAgUEdGhpcwkBAVkABAJmVgkAtwICCQC2AgEJAQJiQQEJAQJhQgIFBHRoaXMJAQFYAAkAtgIBBQJmWgkAlAoCBQJnYwUCZlYEAmdjCQECYUICBQR0aGlzCQEBWAAEAmZWCQC3AgIJALYCAQkBAmJBAQkBAmFCAgUEdGhpcwkBAVkACQC2AgEFAmZaCQCUCgIFAmdjBQJmVgQCZ2MIBQJnYgJfMQQCZlYIBQJnYgJfMgQCYVkJAQJhUQAEAmNLCQCRAwIFAmFZBQF0BAJjTAkAkQMCBQJhWQUBdQQCYloJAMwIAgkAtgIBCQECYkEBBQJjSwkAzAgCCQC2AgEJAQJiQQEFAmNMBQNuaWwEAmRWCQECYlkBBQJiWgQCZWQJAQJmVAMFAmZVBQJkVgkAtgIBBQJmWgQCZ2QJALgCAgkAuAICCQC2AgEJAQJiQQEFAmdjBQJlZAkAtgIBAAEEAmdlCQCWAwEJAMwIAgAACQDMCAIJAKADAQUCZ2QFA25pbAQCZ2YDCQAAAgUCZlUHCQDMCAIJALcCAgkAtwICCQC2AgEJAQJiQQEFAmNLCQC2AgEFAmZaCQC2AgEFAmdhCQDMCAIJALgCAgkAtgIBCQECYkEBBQJjTAUCZ2QFA25pbAkAzAgCCQC4AgIJALYCAQkBAmJBAQUCY0sFAmdkCQDMCAIJALcCAgkAtwICCQC2AgEJAQJiQQEFAmNMCQC2AgEFAmZaCQC2AgEFAmdhBQNuaWwEAmdnCQECYlkBBQJnZgQCZEEDCQDAAgIFAmdnBQJkVgYJAAIBCQC5CQIJAMwIAgIUbmV3IEQgaXMgZmV3ZXIgZXJyb3IJAMwIAgkApgMBBQJkVgkAzAgCCQCmAwEFAmdnBQNuaWwCAl9fAwkAAAIFAmRBBQJkQQkAlAoCBQNuaWwFAmdlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNxASZjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwQW5kU2VuZFRva2VucwUCZloCZlUCZ2gCZ2kCZ2EEAmdqCgACYUsJAPwHBAUCYUkCF2dldFN3YXBDb250cmFjdFJFQURPTkxZBQNuaWwFA25pbAMJAAECBQJhSwIGU3RyaW5nBQJhSwkAAgEJAKwCAgkAAwEFAmFLAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcEAmdrCQDMCAIDCQBnAggJAQV2YWx1ZQEJAJEDAggFAmNxCHBheW1lbnRzAAAGYW1vdW50BQJmWgYJAQJhRgECDFdyb25nIGFtb3VudAkAzAgCAwkAAAIIBQJjcQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmdqBgkBAmFGAQIRUGVybWlzc2lvbiBkZW5pZWQFA25pbAMJAAACBQJnawUCZ2sEAmVNCQEFdmFsdWUBCQCRAwIIBQJjcQhwYXltZW50cwAABAJnbAkBAmFXAQgFAmVNB2Fzc2V0SWQEAmdtAwkAAAIFAmZVBwQCZ2MJAQJhQgIFBHRoaXMJAQFZAAQCZlYJAGUCCQECYkEBBQJnbAgJAQV2YWx1ZQEJAJEDAggFAmNxCHBheW1lbnRzAAAGYW1vdW50CQCUCgIFAmdjBQJmVgQCZ2MJAQJhQgIFBHRoaXMJAQFYAAQCZlYJAGUCCQECYkEBBQJnbAgJAQV2YWx1ZQEJAJEDAggFAmNxCHBheW1lbnRzAAAGYW1vdW50CQCUCgIFAmdjBQJmVgQCZ2MIBQJnbQJfMQQCZlYIBQJnbQJfMgQCYVkJAQJhUQAEAmNLCQCRAwIFAmFZBQF0BAJjTAkAkQMCBQJhWQUBdQQCYloDCQAAAgUCZlUHCQDMCAIJALgCAgkAtgIBCQECYkEBBQJjSwkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCY3EIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkAtgIBCQECYkEBBQJjTAUDbmlsCQDMCAIJALYCAQkBAmJBAQUCY0sJAMwIAgkAuAICCQC2AgEJAQJiQQEFAmNMCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJjcQhwYXltZW50cwAABmFtb3VudAUDbmlsBAJkVgkBAmJZAQUCYloEAmVkCQECZlQDBQJmVQUCZFYJALYCAQAABAJnZAkAuAICCQC4AgIJALYCAQkBAmJBAQUCZ2MFAmVkCQC2AgEAAQQCZ2UJAJYDAQkAzAgCAAAJAMwIAgkAoAMBBQJnZAUDbmlsBAJnbgMJAGcCBQJnZQUCZ2gGCQACAQIsRXhjaGFuZ2UgcmVzdWx0IGlzIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQDCQAAAgUCZ24FAmduBAJnZgMJAAACBQJmVQcJAMwIAgkAtwICCQC2AgEJAQJiQQEFAmNLCQC2AgEFAmdhCQDMCAIJALgCAgkAtgIBCQECYkEBBQJjTAUCZ2QFA25pbAkAzAgCCQC4AgIJALYCAQkBAmJBAQUCY0sFAmdkCQDMCAIJALcCAgkAtgIBCQECYkEBBQJjTAkAtgIBBQJnYQUDbmlsBAJnZwkBAmJZAQUCZ2YEAmRBAwkAwAICBQJnZwUCZFYGCQACAQIUbmV3IEQgaXMgZmV3ZXIgZXJyb3IDCQAAAgUCZEEFAmRBCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCZ2kFAmdlCQECYVUBBQJnYwUDbmlsBQJnZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcQELY29uc3RydWN0b3IBAU0EAmRaCQECZlMBBQJjcQMJAAACBQJkWgUCZFoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU0ABQFNBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY3EBCnNldE1hbmFnZXIBAmdvBAJkWgkBAmZTAQUCY3EDCQAAAgUCZFoFAmRaBAJncAkA2QQBBQJnbwMJAAACBQJncAUCZ3AJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU8ABQJnbwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNxAQ5jb25maXJtTWFuYWdlcgAEAmNmCQECZk8ABAJncQMJAQlpc0RlZmluZWQBBQJjZgYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZ3EFAmdxBAJncgMJAAACCAUCY3EPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJjZgYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZ3IFAmdyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFOAAkA2AQBCQEFdmFsdWUBBQJjZgkAzAgCCQELRGVsZXRlRW50cnkBCQEBTwAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcQEDcHV0AgJncwJndAQCZ3UJAQJiaAAEAmd2CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJndQUBeAIKV3Igc3QgYWRkcgQCZ3cJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmd1BQF6AgpXciBzbCBhZGRyAwkAZgIAAAUCZ3MJAAIBAg5Xcm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAmNxCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmd4CQC2AgEICQEFdmFsdWUBCQCRAwIIBQJjcQhwYXltZW50cwAABmFtb3VudAQCZ3kJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmNxCHBheW1lbnRzAAEGYW1vdW50BAJlcQkAuAICCQC2AgEJAQJiQQEJAQJhVwEFAmJkBQJneAMJAAACBQJlcQUCZXEEAmVyCQC4AgIJALYCAQkBAmJBAQkBAmFXAQUCYmUFAmd5AwkAAAIFAmVyBQJlcgQCZXMJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYmMIcXVhbnRpdHkDCQAAAgUCZXMFAmVzBAJldAkBAmVtAwUCZ3gFAmd5CQC2AgEAAAMJAAACBQJldAUCZXQEAmd6CQECZU4KCQClCAEIBQJjcQZjYWxsZXIJANgEAQgFAmNxDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCY3EIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCY3EIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmNxCHBheW1lbnRzAAEFAmdzBgcGAAACAAQCZE4IBQJnegJfMgQCZ0EIBQJnegJfNwQCZGMIBQJnegJfOQQCZE8IBQJnegNfMTAEAmRQCAUCZ3oDXzExBAJjSwgFAmd6A18xMgQCY0wIBQJnegNfMTMEAmR5CQD8BwQFAmFJAgRlbWl0CQDMCAIFAmROBQNuaWwFA25pbAMJAAACBQJkeQUCZHkEAmdCBAJmTgUCZHkDCQABAgUCZk4CB0FkZHJlc3MEAmdDBQJmTgkA/AcEBQJnQwIEZW1pdAkAzAgCBQJkTgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCZ0IFAmdCBAJnRAMJAGYCBQJkTwAACQD8BwQFAmd3AgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY0sFAmRPBQNuaWwFA25pbAMJAAACBQJnRAUCZ0QEAmdFAwkAZgIFAmRQAAAJAPwHBAUCZ3cCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjTAUCZFAFA25pbAUDbmlsAwkAAAIFAmdFBQJnRQQCZ0YDBQJndAQCZ0cJAPwHBAUCZ3YCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdBBQJkTgUDbmlsAwkAAAIFAmdHBQJnRwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJjcQZjYWxsZXIFAmROBQJnQQUDbmlsBAJnSAkBAmV1AwAAAAAAAAQCZksIBQJnSAJfMQQCZWwIBQJnSAJfMgQCZ0kDCQDAAgIFAmVsBQJldAYJAQJhRgEJALkJAgkAzAgCAiJ1cGRhdGVkIERMcCBsb3dlciB0aGFuIGN1cnJlbnQgRExwCQDMCAIJAKYDAQUCZXEJAMwIAgkApgMBBQJlcgkAzAgCCQCmAwEFAmVzCQDMCAIJAKYDAQUCZXQJAMwIAgkApgMBBQJlbAkAzAgCCQCkAwEFAmRPCQDMCAIJAKQDAQUCZFAFA25pbAIBIAMJAAACBQJnSQUCZ0kEAmdKCAkBBXZhbHVlAQkA7AcBBQJiYwhxdWFudGl0eQMJAAACBQJnSgUCZ0oJAM4IAgkAzggCBQJkYwUCZ0YFAmZLCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNxAQtwdXRPbmVUa25WMgICZm8CZ3QEAmdLCgACYUsJAPwHBAUCYUkCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhSwIHQm9vbGVhbgUCYUsJAAIBCQCsAgIJAAMBBQJhSwIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZ0wDAwMJAQJhTgAGCQAAAgUCYmIFAW4GCQAAAgUCYmIFAXAGBQJnSwQCZ2sJAMwIAgMDCQEBIQEFAmdMBgkBAmZRAQUCY3EGCQECYUYBAiFwdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJjcQhwYXltZW50cwABBgkBAmFGAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ2sFAmdrBAJjSwkA2AQBCQEFdmFsdWUBBQJiZAQCY0wJANgEAQkBBXZhbHVlAQUCYmUEAmNKBQJiYwQCZnMFAmJmBAJmdAUCYmcEAmNJAwkAAAIIBQJjcQZjYWxsZXIFBHRoaXMIBQJjcQxvcmlnaW5DYWxsZXIIBQJjcQZjYWxsZXIEAmVNCQEFdmFsdWUBCQCRAwIIBQJjcQhwYXltZW50cwAABAJjRwkA2AQBCQEFdmFsdWUBCAUCZU0HYXNzZXRJZAQCZG4IBQJlTQZhbW91bnQEAmV0AwkAAAIIBQJlTQdhc3NldElkBQJiZAkBAmVtAwkAtgIBBQJkbgkAtgIBAAAJALYCAQAACQECZW0DCQC2AgEAAAkAtgIBBQJkbgkAtgIBAAADCQAAAgUCZXQFAmV0BAJnTQkBAmVSBQUCZG4FAmNHCQClCAEFAmNJCQDYBAEIBQJjcQ10cmFuc2FjdGlvbklkBgMJAAACBQJnTQUCZ00EAmJYCAUCZ00CXzMEAmRjCAUCZ00CXzIEAmdOCAUCZ00CXzEEAmROAwMJAGYCBQJmbwAACQBmAgUCZm8FAmdOBwkBAmFGAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmbwUDbmlsAgAFAmdOBAJnegkA/AcEBQJhSQIEZW1pdAkAzAgCBQJkTgUDbmlsBQNuaWwDCQAAAgUCZ3oFAmd6BAJnQgQCZk4FAmd6AwkAAQIFAmZOAgdBZGRyZXNzBAJnQwUCZk4JAPwHBAUCZ0MCBGVtaXQJAMwIAgUCZE4FA25pbAUDbmlsBQR1bml0AwkAAAIFAmdCBQJnQgQCZ0YDBQJndAQCZ0cJAPwHBAUCYmoCCHN0YWtlRm9yCQDMCAIJAKUIAQgFAmNxBmNhbGxlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjSgUCZE4FA25pbAMJAAACBQJnRwUCZ0cFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCY3EGY2FsbGVyBQJkTgUCY0oFA25pbAQCZkUDCQBmAgUCYlgAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhUAUCYlgJANkEAQUCY0cFA25pbAUDbmlsBAJnTwMJAAACBQR0aGlzBQJhUAkAlAoCAAAAAAQCZ1ADCQAAAggFAmVNB2Fzc2V0SWQFAmJkBgcDBQJnUAkAlAoCCQEBLQEFAmJYAAAJAJQKAgAACQEBLQEFAmJYBAJldggFAmdPAl8xBAJldwgFAmdPAl8yBAJnUQkBAmV1AwUCZXYFAmV3AAAEAmZLCAUCZ1ECXzEEAmVsCAUCZ1ECXzIEAmZMCQECZXkCBQJldAUCZWwDCQAAAgUCZkwFAmZMCQCUCgIJAM4IAgkAzggCCQDOCAIFAmRjBQJnRgUCZkUFAmZLBQJkTgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcQEKcHV0Rm9yRnJlZQECZ1IDCQBmAgAABQJnUgkAAgECCldyb25nIHNscGcDCQECIT0CCQCQAwEIBQJjcQhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJnUwkBAmVOCgkApQgBCAUCY3EGY2FsbGVyCQDYBAEIBQJjcQ10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmNxCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmNxCHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJjcQhwYXltZW50cwABBQJnUgcHBgAAAgAEAmRjCAUCZ1MCXzkEAmd4CQC2AgEICQEFdmFsdWUBCQCRAwIIBQJjcQhwYXltZW50cwAABmFtb3VudAQCZ3kJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmNxCHBheW1lbnRzAAEGYW1vdW50BAJldAkBAmVtAwUCZ3gFAmd5CQC2AgEAAAMJAAACBQJldAUCZXQEAmdUCQECZXUDAAAAAAAABAJmSwgFAmdUAl8xBAJlbAgFAmdUAl8yBAJmTAkBAmV5AgUCZXQFAmVsAwkAAAIFAmZMBQJmTAkAzggCBQJkYwUCZksJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY3EBA2dldAAEAmV0CQECZW0DCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmV0BQJldAQCZHkJAQJlTAEFAmNxBAJnVQgFAmR5Al8xBAJkYggFAmR5Al8yBAJkbggFAmR5Al8zBAJjRwgFAmR5Al80BAJkYwgFAmR5Al81BAJlYQkA/AcEBQJhSQIEYnVybgkAzAgCBQJkbgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjRwUCZG4FA25pbAMJAAACBQJlYQUCZWEEAmdWCQECZXUDCQEBLQEFAmdVCQEBLQEFAmRiAAAEAmZLCAUCZ1YCXzEEAmVsCAUCZ1YCXzIEAmZMCQECZXkCBQJldAUCZWwDCQAAAgUCZkwFAmZMCQDOCAIFAmRjBQJmSwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcQELZ2V0T25lVGtuVjICAmZuAmZvBAJnSwoAAmFLCQD8BwQFAmFJAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYUsCB0Jvb2xlYW4FAmFLCQACAQkArAICCQADAQUCYUsCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdXAwMJAQJhTgAGCQAAAgUCYmIFAXAGBQJnSwQCZ2sJAMwIAgMDCQEBIQEFAmdXBgkBAmZRAQUCY3EGCQECYUYBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJjcQhwYXltZW50cwABBgkBAmFGAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ2sFAmdrBAJnWAkBAmZtBgUCZm4FAmZvCAUCY3EIcGF5bWVudHMIBQJjcQZjYWxsZXIIBQJjcQxvcmlnaW5DYWxsZXIIBQJjcQ10cmFuc2FjdGlvbklkBAJkYwgFAmdYAl8xBAJmeAgFAmdYAl8yCQCUCgIFAmRjBQJmeAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcQEKcmVmcmVzaERMcAAEAmdZCQELdmFsdWVPckVsc2UCCQCfCAEFAmFnAAAEAmdaAwkAZwIJAGUCBQZoZWlnaHQFAmdZBQJhagUEdW5pdAkBAmFGAQkAuQkCCQDMCAIJAKQDAQUCYWoJAMwIAgIvIGJsb2NrcyBoYXZlIG5vdCBwYXNzZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwFA25pbAIAAwkAAAIFAmdaBQJnWgQCZUYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAmFmAgEwCQECYUgBAgtpbnZhbGlkIGRMcAQCaGEJAQJldQMAAAAAAAAEAmhiCAUCaGECXzEEAmVsCAUCaGECXzIEAmV4AwkBAiE9AgUCZUYFAmVsBQJoYgkBAmFGAQISbm90aGluZyB0byByZWZyZXNoCQCUCgIFAmV4CQCmAwEFAmVsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNxARNnZXRPbmVUa25WMlJFQURPTkxZAgJmbgJoYwQCY0sJANgEAQkBBXZhbHVlAQUCYmQEAmNMCQDYBAEJAQV2YWx1ZQEFAmJlBAJjSgkA2AQBCQEFdmFsdWUBBQJiYwQCYloJAMwIAgkAtgIBCQECYkEBBQJjSwkAzAgCCQC2AgEJAQJiQQEFAmNMBQNuaWwEAmVrCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJjSgIQaW52YWxpZCBscCBhc3NldAhxdWFudGl0eQQCZHgJAQJiWQEFAmJaBAJkegkAuAICBQJkeAkAvAIDCQC2AgEFAmhjBQJkeAUCZWsEAmhkAwkAAAIFAmZuBQJjSwAAAwkAAAIFAmZuBQJjTAABCQACAQIUaW52YWxpZCBvdXQgYXNzZXQgaWQEAmhlCQECZFUDBQJiWgUCaGQFAmR6BAJnZAkAuAICCQCRAwIFAmJaBQJoZAUCaGUEAmdlCQCWAwEJAMwIAgAACQDMCAIJAKADAQkAuAICBQJnZAUBZgUDbmlsBAJoZgkBAmJWAgUCZ2UFAmFMBAJmdwgFAmhmAl8xBAJiWAgFAmhmAl8yCQCUCgIFA25pbAkAlAoCBQJmdwUCYlgCY3EBHGdldE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmZuAmhjBAJjSwkA2AQBCQEFdmFsdWUBBQJiZAQCY0wJANgEAQkBBXZhbHVlAQUCYmUEAmNKCQDYBAEJAQV2YWx1ZQEFAmJjBAJjUQkBAmJBAQUCY0sEAmNTCQECYkEBBQJjTAQCaGcKAAJhSwkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmZuCQDMCAIFAmhjBQNuaWwFA25pbAMJAAECBQJhSwIKKEludCwgSW50KQUCYUsJAAIBCQCsAgIJAAMBBQJhSwIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZncIBQJoZwJfMQQCYlgIBQJoZwJfMgQCZHkJAQJjRQQCAAUCY0oFAmhjBQR0aGlzBAJkYQgFAmR5Al8xBAJkYggFAmR5Al8yBAJoaAkAZAIFAmRhBQJkYgQCZmwDCQAAAgUCaGgAAAMJAAACBQJmdwAAAAAJAAIBAhdib251cyBjYWxjdWxhdGlvbiBlcnJvcgkAawMJAGUCBQJmdwUCaGgFAWEFAmhoCQCUCgIFA25pbAkAlQoDBQJmdwUCYlgFAmZsAmNxAQlnZXROb0xlc3MCAmhpAmhqBAJkeQkBAmVMAQUCY3EEAmRhCAUCZHkCXzEEAmRiCAUCZHkCXzIEAmRuCAUCZHkCXzMEAmNHCAUCZHkCXzQEAmRjCAUCZHkCXzUDCQBmAgUCaGkFAmRhCQACAQkArAICCQCsAgIJAKwCAgIJRmFpbGVkOiAgCQCkAwEFAmRhAgMgPCAJAKQDAQUCaGkDCQBmAgUCaGoFAmRiCQACAQkArAICCQCsAgIJAKwCAgIIRmFpbGVkOiAJAKQDAQUCZGICAyA8IAkApAMBBQJoagQCZXQJAQJlbQMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZXQFAmV0BAJoawkA/AcEBQJhSQIEYnVybgkAzAgCBQJkbgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjRwUCZG4FA25pbAMJAAACBQJoawUCaGsEAmhsCQECZXUDCQEBLQEFAmRhCQEBLQEFAmRiAAAEAmZLCAUCaGwCXzEEAmVsCAUCaGwCXzIEAmZMCQECZXkCBQJldAUCZWwDCQAAAgUCZkwFAmZMCQDOCAIFAmRjBQJmSwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcQENdW5zdGFrZUFuZEdldAECYlcEAmhtAwkBAiE9AgkAkAMBCAUCY3EIcGF5bWVudHMAAAkAAgECDU5vIHBtbnRzIGV4cGQGAwkAAAIFAmhtBQJobQQCaG4JAQJiaAAEAmdBBQJiYwQCaG8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmhuBQF4AgpXciBzdCBhZGRyBAJldAkBAmVtAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJldAUCZXQEAmhwCQD8BwQFAmhvAgd1bnN0YWtlCQDMCAIJANgEAQUCZ0EJAMwIAgUCYlcFA25pbAUDbmlsAwkAAAIFAmhwBQJocAQCZHkJAQJjRQQJANgEAQgFAmNxDXRyYW5zYWN0aW9uSWQJANgEAQUCZ0EFAmJXCAUCY3EGY2FsbGVyBAJkYQgFAmR5Al8xBAJkYggFAmR5Al8yBAJjTwkBDXBhcnNlSW50VmFsdWUBCAUCZHkCXzkEAmRjCAUCZHkDXzEwBAJocQMDCQECYU4ABgkAAAIFAmNPBQFwCQACAQkArAICAglCbG9ja2VkOiAJAKQDAQUCY08GAwkAAAIFAmhxBQJocQQCaHIJAPwHBAUCYUkCBGJ1cm4JAMwIAgUCYlcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ0EFAmJXBQNuaWwDCQAAAgUCaHIFAmhyBAJocwkBAmV1AwkBAS0BBQJkYQkBAS0BBQJkYgAABAJmSwgFAmhzAl8xBAJlbAgFAmhzAl8yBAJmTAkBAmV5AgUCZXQFAmVsAwkAAAIFAmZMBQJmTAkAzggCBQJkYwUCZksJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY3EBE3Vuc3Rha2VBbmRHZXROb0xlc3MDAmh0Amh1AmhqBAJnVwMJAQJhTgAGCQAAAgUCYmIFAXAEAmdrCQDMCAIDCQEBIQEFAmdXBgkAAgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmNxCHBheW1lbnRzAAAGCQACAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ2sFAmdrBAJldAkBAmVtAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJldAUCZXQEAmhwCQD8BwQFAmJqAgd1bnN0YWtlCQDMCAIJANgEAQUCYmMJAMwIAgUCaHQFA25pbAUDbmlsAwkAAAIFAmhwBQJocAQCaHYJAQJjRQQJANgEAQgFAmNxDXRyYW5zYWN0aW9uSWQJANgEAQUCYmMFAmh0CAUCY3EGY2FsbGVyBAJkYQgFAmh2Al8xBAJkYggFAmh2Al8yBAJkYwgFAmh2A18xMAQCaHcJAMwIAgMJAGcCBQJkYQUCaHUGCQACAQkAuQkCCQDMCAICLGFtb3VudCBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCaHUFA25pbAIACQDMCAIDCQBnAgUCZGIFAmhqBgkAAgEJALkJAgkAzAgCAitwcmljZSBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCaGoFA25pbAIABQNuaWwDCQAAAgUCaHcFAmh3BAJoawkA/AcEBQJhSQIEYnVybgkAzAgCBQJodAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiYwUCaHQFA25pbAMJAAACBQJoawUCaGsEAmh4CQECZXUDCQEBLQEFAmRhCQEBLQEFAmRiAAAEAmZLCAUCaHgCXzEEAmVsCAUCaHgCXzIEAmZMCQECZXkCBQJldAUCZWwDCQAAAgUCZkwFAmZMCQDOCAIFAmRjBQJmSwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcQEVdW5zdGFrZUFuZEdldE9uZVRrblYyAwJodAJmbgJmbwQCZ0sKAAJhSwkA/AcEBQJhSQIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmFLAgdCb29sZWFuBQJhSwkAAgEJAKwCAgkAAwEFAmFLAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJnVwMDCQECYU4ABgkAAAIFAmJiBQFwBgUCZ0sEAmdrCQDMCAIDAwkBASEBBQJnVwYJAQJmUQEFAmNxBgkBAmFGAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCY3EIcGF5bWVudHMAAAYJAQJhRgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdrBQJnawQCaG4JAQJiaAAEAmdBBQJiYwQCaG8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmhuBQF4AgpXciBzdCBhZGRyBAJjSQgFAmNxBmNhbGxlcgQCaHkFBHRoaXMEAmhwCQD8BwQFAmhvAg91bnN0YWtlSU5URVJOQUwJAMwIAgUCZ0EJAMwIAgUCaHQJAMwIAggFAmNJBWJ5dGVzCQDMCAIIBQJoeQVieXRlcwUDbmlsBQNuaWwDCQAAAgUCaHAFAmhwBAJoegkBAmZtBgUCZm4FAmZvCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJnQQUCaHQFA25pbAgFAmNxBmNhbGxlcggFAmNxDG9yaWdpbkNhbGxlcggFAmNxDXRyYW5zYWN0aW9uSWQEAmRjCAUCaHoCXzEEAmZ4CAUCaHoCXzIJAJQKAgUCZGMFAmZ4CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNxARxwdXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJoQQJoQgQCaEMJAQJlUgUFAmhBBQJoQgIAAgAGBAJmZwgFAmhDAl8xBAJkYwgFAmhDAl8yBAJiWAgFAmhDAl8zBAJmbAgFAmhDAl80CQCUCgIFA25pbAkAlQoDBQJmZwUCYlgFAmZsAmNxASFwdXRPbmVUa25WMldpdGhvdXRUYWtlRmVlUkVBRE9OTFkCAmhBAmhCBAJoRAkBAmVSBQUCaEEFAmhCAgACAAcEAmZnCAUCaEQCXzEEAmRjCAUCaEQCXzIEAmJYCAUCaEQCXzMEAmZsCAUCaEQCXzQJAJQKAgUDbmlsCQCVCgMFAmZnBQJiWAUCZmwCY3EBCGFjdGl2YXRlAgJoRQJoRgMJAQIhPQIJAKUIAQgFAmNxBmNhbGxlcgkApQgBBQJhSQkAAgECBmRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFYAAUCaEUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVkABQJoRgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgAJAKQDAQUBawUDbmlsAgdzdWNjZXNzAmNxARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQJhUQACY3EBHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBAmJCCQCUCgIFA25pbAkBAmJBAQUCYkICY3EBGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDAmJKAmJLAmJPBAJoRwkBAmJOAwUCYkoFAmJLBQJiTwkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAmhHAAAJAMwIAgkApgMBCQCRAwIFAmhHAAEJAMwIAgkApgMBCQCRAwIFAmhHAAIFA25pbAJjcQEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBRwJoSAkAlAoCBQNuaWwJAQFGAgkApwMBBQFHBQJoSAJjcQEUdG9YMThXcmFwcGVyUkVBRE9OTFkCAUMBRAkAlAoCBQNuaWwJAKYDAQkBAUICBQFDBQFEAmNxAR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCAmJEAmJFCQCUCgIFA25pbAkApgMBCQECYkMCCQCnAwEFAmJECQCnAwEFAmJFAmNxASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkCY0YCZGUCZGYCZGcCZGgCZGkCaEkCZGoCZGsJAJQKAgUDbmlsCQECZGQNBQJjRgUCZGUFAmRmBQJkZwUCZGgFAmRpBQJoSQUCZGoFAmRrBgcAAAIAAmNxASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQCY0YCaEoCY0gCaEkEAmR5CQECY0UEBQJjRgUCaEoFAmNICQERQGV4dHJOYXRpdmUoMTA2MikBBQJoSQkAlAoCBQNuaWwJAJwKCggFAmR5Al8xCAUCZHkCXzIIBQJkeQJfMwgFAmR5Al80CAUCZHkCXzUIBQJkeQJfNggFAmR5Al83CQCmAwEIBQJkeQJfOAgFAmR5Al85CAUCZHkDXzEwAmNxAQljaGFuZ2VBbXAABAJoSwkA/AcEBQJhSQIaZ2V0Q2hhbmdlQW1wQ29uZmlnUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAQCaEwEAmZOBQJoSwMJAAECBQJmTgIJTGlzdFtBbnldBAJoTQUCZk4JAJUKAwoAAmFLCQCRAwIFAmhNAAADCQABAgUCYUsCA0ludAUCYUsJAAIBCQCsAgIJAAMBBQJhSwIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgACYUsJAJEDAgUCaE0AAQMJAAECBQJhSwIDSW50BQJhSwkAAgEJAKwCAgkAAwEFAmFLAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAJhSwkAkQMCBQJoTQACAwkAAQIFAmFLAgNJbnQFAmFLCQACAQkArAICCQADAQUCYUsCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkBAmFGAQISaW52YWxpZCBlbnRyeSB0eXBlBAJoTggFAmhMAl8xBAJoTwgFAmhMAl8yBAJoUAgFAmhMAl8zBAJoUQkBDXBhcnNlSW50VmFsdWUBCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEBWgAEAmhSCQBkAgUCaFEFAmhPBAJoUwMJAGYCAAAFAmhPAwkAZgIFAmhQBQJoUgUCaFAFAmhSAwkAZgIFAmhSBQJoUAUCaFAFAmhSBAJoVAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQECYWMAAAAEAmhVCQBkAgUCaFQFAmhOBAJnawkAzAgCAwkAZgIFBmhlaWdodAUCaFUGCQECYUYBAhd0cnkgYWdhaW4gaW4gZmV3IGJsb2NrcwkAzAgCAwkBAiE9AgUCaFEFAmhTBgkBAmFGAQIWYWxyZWFkeSByZWFjaGVkIHRhcmdldAUDbmlsAwkAAAIFAmdrBQJnawkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFjAAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAAkApAMBBQJoUwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWEBBQZoZWlnaHQJAKQDAQUCaFMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECaFYBAmhXAAQCaFgEAmZOCQECZk0AAwkAAQIFAmZOAgpCeXRlVmVjdG9yBAJmUgUCZk4FAmZSAwkAAQIFAmZOAgRVbml0CAUCaFYPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEAmZOBQJoVgMJAAECBQJmTgIFT3JkZXIEAmVCBQJmTgQCaFkJAQJhTwAEAmhaAwkBAmZZAAkAlAoCBgIACQECZUEBBQJlQgQCYXgIBQJoWgJfMQQCYXkIBQJoWgJfMgQCYXoJAPQDAwgFAmVCCWJvZHlCeXRlcwkAkQMCCAUCZUIGcHJvb2ZzAAAIBQJlQg9zZW5kZXJQdWJsaWNLZXkEAmFBCQD0AwMIBQJlQglib2R5Qnl0ZXMJAJEDAggFAmVCBnByb29mcwABBQJoWQMDAwUCYXgFAmF6BwUCYUEHBgkBAmF3BAUCYXgFAmF5BQJhegUCYUEDCQABAgUCZk4CFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJjYwUCZk4DCQD0AwMIBQJoVglib2R5Qnl0ZXMJAJEDAggFAmhWBnByb29mcwAABQJoWAYEAmlhCQD2AwEJAQV2YWx1ZQEIBQJjYwZzY3JpcHQEAmliCQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYUkJAQJhcwAEAmljCQDxBwEFBHRoaXMDCQAAAgUCaWIFAmlhCQECIT0CBQJpYwUCaWEHCQD0AwMIBQJoVglib2R5Qnl0ZXMJAJEDAggFAmhWBnByb29mcwAABQJoWKTIBrQ=", "height": 2562946, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8grKf57nX8XULXZeLhTpppPpJGYeJTisJsr9BN27jfqb Next: 5uQwzpnfzzVeAj3sR4JWNdDQw4zCjXk4o36DX4pPzYFk Diff:
OldNewDifferences
1919
2020 let big4 = toBigInt(4)
2121
22-let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
23-
2422 let wavesString = "WAVES"
2523
2624 let ampInitial = 50
2725
2826 let Amult = "100"
2927
30-let Dconv = "1"
31-
3228 let SEP = "__"
33-
34-let EMPTY = ""
35-
36-let PoolActive = 1
3729
3830 let PoolPutDis = 2
3931
5547
5648 let idxPriceAsDcm = 7
5749
58-let idxIAmtAsId = 8
59-
60-let idxIPriceAsId = 9
61-
6250 let idxFactStakCntr = 1
6351
6452 let idxFactoryRestCntr = 6
6553
6654 let idxFactSlippCntr = 7
67-
68-let idxFactGwxRewCntr = 10
6955
7056 let feeDefault = fraction(10, scale8, 10000)
7157
7965
8066
8167 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
82-
83-
84-func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
85-
86-
87-func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
88-
89-
90-func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
9168
9269
9370 func abs (val) = if ((zeroBigInt > val))
234211 else toBase58String(value(input))
235212
236213
237-func parsePoolConfig (poolConfig) = $Tuple9(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]), fromBase58String(poolConfig[idxIAmtAsId]), fromBase58String(poolConfig[idxIPriceAsId]))
214+func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
238215
239216
240217 let poolConfigParsed = parsePoolConfig(gpc())
241218
242-let $t081858414 = poolConfigParsed
219+let $t080878273 = poolConfigParsed
243220
244-let cfgPoolAddress = $t081858414._1
221+let cfgPoolStatus = $t080878273._2
245222
246-let cfgPoolStatus = $t081858414._2
223+let cfgLpAssetId = $t080878273._3
247224
248-let cfgLpAssetId = $t081858414._3
225+let cfgAmountAssetId = $t080878273._4
249226
250-let cfgAmountAssetId = $t081858414._4
227+let cfgPriceAssetId = $t080878273._5
251228
252-let cfgPriceAssetId = $t081858414._5
229+let cfgAmountAssetDecimals = $t080878273._6
253230
254-let cfgAmountAssetDecimals = $t081858414._6
255-
256-let cfgPriceAssetDecimals = $t081858414._7
257-
258-let cfgInAmountAssedId = $t081858414._8
259-
260-let cfgInPriceAssetId = $t081858414._9
231+let cfgPriceAssetDecimals = $t080878273._7
261232
262233 func gfc () = split(strf(fca, fcfg()), SEP)
263234
265236 let factoryConfig = gfc()
266237
267238 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
268-
269-let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
270-
271-let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
272239
273240 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
274241
289256 func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
290257
291258
292-func vad (A1,A2,slippage) = {
293- let diff = fraction((A1 - A2), scale8BigInt, A2)
294- let pass = ((slippage - abs(diff)) > zeroBigInt)
295- if (!(pass))
296- then throw(("Big slpg: " + toString(diff)))
297- else $Tuple2(pass, min([A1, A2]))
298- }
299-
300-
301-func vd (D1,D0,slpg) = {
302- let diff = fraction(D0, scale8BigInt, D1)
303- let fail = (slpg > diff)
304- if (if (fail)
305- then true
306- else (D0 > D1))
307- then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
308- else fail
309- }
310-
311-
312259 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
313260 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
314261 let prAsAmtX18 = t1(prAmt, prAssetDcm)
326273 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
327274 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
328275 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
329- }
330-
331-
332-func calculatePrices (amAmt,prAmt,lpAmt) = {
333- let p = calcPrices(amAmt, prAmt, lpAmt)
334-[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
335276 }
336277
337278
378319 }
379320
380321 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
381- let $t01291912967 = {
322+ let $t01277812826 = {
382323 let $l = arr
383324 let $s = size($l)
384325 let $acc0 = $Tuple2(s, false)
392333
393334 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17)
394335 }
395- let d = $t01291912967._1
396- let found = $t01291912967._2
336+ let d = $t01277812826._1
337+ let found = $t01277812826._2
397338 if (found)
398339 then d
399340 else throw(("D calculation error, D = " + toString(d)))
440381 let lpId = cfgLpAssetId
441382 let amIdStr = toBase58String(value(cfgAmountAssetId))
442383 let prIdStr = toBase58String(value(cfgPriceAssetId))
443- let inAmIdStr = cfgInAmountAssedId
444- let inPrIdStr = cfgInPriceAssetId
445384 let amtDcm = cfgAmountAssetDecimals
446385 let priceDcm = cfgPriceAssetDecimals
447386 let sts = toString(cfgPoolStatus)
529468 else calcLpAmt
530469 let amDiff = (inAmAmt - calcAmAssetPmt)
531470 let prDiff = (inPrAmt - calcPrAssetPmt)
532- let $t02080621151 = if (if (isOneAsset)
471+ let $t02058820933 = if (if (isOneAsset)
533472 then (pmtId == amIdStr)
534473 else false)
535474 then $Tuple2(pmtAmt, 0)
538477 else false)
539478 then $Tuple2(0, pmtAmt)
540479 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
541- let writeAmAmt = $t02080621151._1
542- let writePrAmt = $t02080621151._2
480+ let writeAmAmt = $t02058820933._1
481+ let writePrAmt = $t02058820933._2
543482 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
544483 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
545484 }
558497 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
559498 let b = ((s + ((D * aPrecision) / ann)) - D)
560499 func calc (acc,cur) = {
561- let $t02234622366 = acc
562- let y = $t02234622366._1
563- let found = $t02234622366._2
500+ let $t02212822148 = acc
501+ let y = $t02212822148._1
502+ let found = $t02212822148._2
564503 if ((found != unit))
565504 then acc
566505 else {
573512 }
574513
575514 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
576- let $t02267322720 = {
515+ let $t02245522502 = {
577516 let $l = arr
578517 let $s = size($l)
579518 let $acc0 = $Tuple2(D, unit)
587526
588527 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
589528 }
590- let y = $t02267322720._1
591- let found = $t02267322720._2
529+ let y = $t02245522502._1
530+ let found = $t02245522502._2
592531 if ((found != unit))
593532 then y
594533 else throw(("Y calculation error, Y = " + toString(y)))
632571 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
633572 let amountAssetAmount = order.amount
634573 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
635- let $t02491825130 = if ((order.orderType == Buy))
574+ let $t02470024912 = if ((order.orderType == Buy))
636575 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
637576 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
638- let amountAssetBalanceDelta = $t02491825130._1
639- let priceAssetBalanceDelta = $t02491825130._2
577+ let amountAssetBalanceDelta = $t02470024912._1
578+ let priceAssetBalanceDelta = $t02470024912._2
640579 if (if (if (igs())
641580 then true
642581 else (cfgPoolStatus == PoolMatcherDis))
649588 then throw("Wr assets")
650589 else {
651590 let dLp = parseBigIntValue(valueOrElse(getString(this, keyDLp), "0"))
652- let $t02547225572 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
653- let unusedActions = $t02547225572._1
654- let dLpNew = $t02547225572._2
591+ let $t02525425354 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
592+ let unusedActions = $t02525425354._1
593+ let dLpNew = $t02525425354._2
655594 let isOrderValid = (dLpNew >= dLp)
656595 let info = makeString(["dLp=", toString(dLp), " dLpNew=", toString(dLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
657596 $Tuple2(isOrderValid, info)
705644 then {
706645 let amBalance = getAccBalance(amId)
707646 let prBalance = getAccBalance(prId)
708- let $t02822828690 = if ((txId == ""))
647+ let $t02801028472 = if ((txId == ""))
709648 then $Tuple2(amBalance, prBalance)
710649 else if ((pmtAssetId == amId))
711650 then if ((pmtAmtRaw > amBalance))
716655 then throw("invalid payment amount")
717656 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
718657 else throw("wrong pmtAssetId")
719- let amBalanceOld = $t02822828690._1
720- let prBalanceOld = $t02822828690._2
721- let $t02869628872 = if ((pmtAssetId == amId))
658+ let amBalanceOld = $t02801028472._1
659+ let prBalanceOld = $t02801028472._2
660+ let $t02847828654 = if ((pmtAssetId == amId))
722661 then $Tuple2(pmtAmtRaw, 0)
723662 else if ((pmtAssetId == prId))
724663 then $Tuple2(0, pmtAmtRaw)
725664 else throw("invalid payment")
726- let amAmountRaw = $t02869628872._1
727- let prAmountRaw = $t02869628872._2
728- let $t02887629130 = if (withTakeFee)
665+ let amAmountRaw = $t02847828654._1
666+ let prAmountRaw = $t02847828654._2
667+ let $t02865828912 = if (withTakeFee)
729668 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
730669 else $Tuple3(amAmountRaw, prAmountRaw, 0)
731- let amAmount = $t02887629130._1
732- let prAmount = $t02887629130._2
733- let feeAmount = $t02887629130._3
670+ let amAmount = $t02865828912._1
671+ let prAmount = $t02865828912._2
672+ let feeAmount = $t02865828912._3
734673 let amBalanceNew = (amBalanceOld + amAmount)
735674 let prBalanceNew = (prBalanceOld + prAmount)
736675 let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
778717 else {
779718 let amBalance = getAccBalance(amId)
780719 let prBalance = getAccBalance(prId)
781- let $t03124231353 = {
720+ let $t03102431135 = {
782721 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
783722 if ($isInstanceOf(@, "(Int, Int)"))
784723 then @
785724 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
786725 }
787- if (($t03124231353 == $t03124231353))
726+ if (($t03102431135 == $t03102431135))
788727 then {
789- let feeAmount = $t03124231353._2
790- let totalGet = $t03124231353._1
728+ let feeAmount = $t03102431135._2
729+ let totalGet = $t03102431135._1
791730 let totalAmount = if (if ((minOutAmount > 0))
792731 then (minOutAmount > totalGet)
793732 else false)
794733 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
795734 else totalGet
796- let $t03154331850 = if ((outAssetId == amId))
735+ let $t03132531632 = if ((outAssetId == amId))
797736 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
798737 else if ((outAssetId == prId))
799738 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
800739 else throw("invalid out asset id")
801- let outAm = $t03154331850._1
802- let outPr = $t03154331850._2
803- let amBalanceNew = $t03154331850._3
804- let prBalanceNew = $t03154331850._4
740+ let outAm = $t03132531632._1
741+ let outPr = $t03132531632._2
742+ let amBalanceNew = $t03132531632._3
743+ let prBalanceNew = $t03132531632._4
805744 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
806745 let curPr = f1(curPrX18, scale8)
807746 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
816755 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
817756 if ((burn == burn))
818757 then {
819- let $t03263532985 = {
758+ let $t03241732767 = {
820759 let feeAmountForCalc = if ((this == feeCollectorAddress))
821760 then 0
822761 else feeAmount
827766 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
828767 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
829768 }
830- let amountAssetBalanceDelta = $t03263532985._1
831- let priceAssetBalanceDelta = $t03263532985._2
832- let $t03298833096 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
833- let refreshDLpActions = $t03298833096._1
834- let updatedDLp = $t03298833096._2
769+ let amountAssetBalanceDelta = $t03241732767._1
770+ let priceAssetBalanceDelta = $t03241732767._2
771+ let $t03277032878 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
772+ let refreshDLpActions = $t03277032878._1
773+ let updatedDLp = $t03277032878._2
835774 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
836775 if ((isUpdatedDLpValid == isUpdatedDLpValid))
837776 then $Tuple2((state ++ refreshDLpActions), totalAmount)
910849 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
911850 let b = ((s + ((D * aPrecision) / ann)) - D)
912851 func calc (acc,cur) = {
913- let $t03454334563 = acc
914- let y = $t03454334563._1
915- let found = $t03454334563._2
852+ let $t03432534345 = acc
853+ let y = $t03432534345._1
854+ let found = $t03432534345._2
916855 if ((found != unit))
917856 then acc
918857 else {
925864 }
926865
927866 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
928- let $t03489434941 = {
867+ let $t03467634723 = {
929868 let $l = arr
930869 let $s = size($l)
931870 let $acc0 = $Tuple2(D, unit)
939878
940879 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
941880 }
942- let y = $t03489434941._1
943- let found = $t03489434941._2
881+ let y = $t03467634723._1
882+ let found = $t03467634723._2
944883 if ((found != unit))
945884 then y
946885 else throw(("Y calculation error, Y = " + toString(y)))
952891
953892 @Callable(i)
954893 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
955- let $t03529335717 = if ((isReverse == false))
894+ let $t03507535499 = if ((isReverse == false))
956895 then {
957896 let assetOut = strf(this, pa())
958897 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, aa()))) + toBigInt(cleanAmountIn))
963902 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, pa()))) + toBigInt(cleanAmountIn))
964903 $Tuple2(assetOut, poolAmountInBalance)
965904 }
966- let assetOut = $t03529335717._1
967- let poolAmountInBalance = $t03529335717._2
905+ let assetOut = $t03507535499._1
906+ let poolAmountInBalance = $t03507535499._2
968907 let poolConfig = gpc()
969908 let amId = poolConfig[idxAmAsId]
970909 let prId = poolConfig[idxPrAsId]
1004943 then {
1005944 let pmt = value(i.payments[0])
1006945 let assetIn = assetIdToString(pmt.assetId)
1007- let $t03715337547 = if ((isReverse == false))
946+ let $t03693537329 = if ((isReverse == false))
1008947 then {
1009948 let assetOut = strf(this, pa())
1010949 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
1015954 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
1016955 $Tuple2(assetOut, poolAmountInBalance)
1017956 }
1018- let assetOut = $t03715337547._1
1019- let poolAmountInBalance = $t03715337547._2
957+ let assetOut = $t03693537329._1
958+ let poolAmountInBalance = $t03693537329._2
1020959 let poolConfig = gpc()
1021960 let amId = poolConfig[idxAmAsId]
1022961 let prId = poolConfig[idxPrAsId]
11561095 else throw("Strict value is not equal to itself.")
11571096 }
11581097 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1159- let $t04216642308 = refreshDLpInternal(0, 0, 0)
1160- let refreshDLpActions = $t04216642308._1
1161- let updatedDLp = $t04216642308._2
1098+ let $t04194842090 = refreshDLpInternal(0, 0, 0)
1099+ let refreshDLpActions = $t04194842090._1
1100+ let updatedDLp = $t04194842090._2
11621101 let check = if ((updatedDLp >= currentDLp))
11631102 then true
11641103 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
12311170 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
12321171 if ((currentDLp == currentDLp))
12331172 then {
1234- let $t04394944107 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1235- if (($t04394944107 == $t04394944107))
1173+ let $t04373143889 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1174+ if (($t04373143889 == $t04373143889))
12361175 then {
1237- let feeAmount = $t04394944107._3
1238- let state = $t04394944107._2
1239- let estimLP = $t04394944107._1
1176+ let feeAmount = $t04373143889._3
1177+ let state = $t04373143889._2
1178+ let estimLP = $t04373143889._1
12401179 let emitLpAmt = if (if ((minOutAmount > 0))
12411180 then (minOutAmount > estimLP)
12421181 else false)
12641203 let sendFeeToMatcher = if ((feeAmount > 0))
12651204 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
12661205 else nil
1267- let $t04499245341 = if ((this == feeCollectorAddress))
1206+ let $t04477445123 = if ((this == feeCollectorAddress))
12681207 then $Tuple2(0, 0)
12691208 else {
12701209 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
12741213 then $Tuple2(-(feeAmount), 0)
12751214 else $Tuple2(0, -(feeAmount))
12761215 }
1277- let amountAssetBalanceDelta = $t04499245341._1
1278- let priceAssetBalanceDelta = $t04499245341._2
1279- let $t04534445452 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1280- let refreshDLpActions = $t04534445452._1
1281- let updatedDLp = $t04534445452._2
1216+ let amountAssetBalanceDelta = $t04477445123._1
1217+ let priceAssetBalanceDelta = $t04477445123._2
1218+ let $t04512645234 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1219+ let refreshDLpActions = $t04512645234._1
1220+ let updatedDLp = $t04512645234._2
12821221 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
12831222 if ((isUpdatedDLpValid == isUpdatedDLpValid))
12841223 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
13101249 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
13111250 if ((currentDLp == currentDLp))
13121251 then {
1313- let $t04648246547 = refreshDLpInternal(0, 0, 0)
1314- let refreshDLpActions = $t04648246547._1
1315- let updatedDLp = $t04648246547._2
1252+ let $t04626446329 = refreshDLpInternal(0, 0, 0)
1253+ let refreshDLpActions = $t04626446329._1
1254+ let updatedDLp = $t04626446329._2
13161255 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13171256 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13181257 then (state ++ refreshDLpActions)
13371276 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13381277 if ((b == b))
13391278 then {
1340- let $t04772047802 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1341- let refreshDLpActions = $t04772047802._1
1342- let updatedDLp = $t04772047802._2
1279+ let $t04750247584 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1280+ let refreshDLpActions = $t04750247584._1
1281+ let updatedDLp = $t04750247584._2
13431282 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13441283 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13451284 then (state ++ refreshDLpActions)
13741313 else throwErr("exactly 1 payment are expected")]
13751314 if ((checks == checks))
13761315 then {
1377- let $t04842048575 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1378- let state = $t04842048575._1
1379- let totalAmount = $t04842048575._2
1316+ let $t04820248357 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1317+ let state = $t04820248357._1
1318+ let totalAmount = $t04820248357._2
13801319 $Tuple2(state, totalAmount)
13811320 }
13821321 else throw("Strict value is not equal to itself.")
13931332 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
13941333 then {
13951334 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1396- let $t04909949163 = refreshDLpInternal(0, 0, 0)
1397- let dLpUpdateActions = $t04909949163._1
1398- let updatedDLp = $t04909949163._2
1335+ let $t04888148945 = refreshDLpInternal(0, 0, 0)
1336+ let dLpUpdateActions = $t04888148945._1
1337+ let updatedDLp = $t04888148945._2
13991338 let actions = if ((dLp != updatedDLp))
14001339 then dLpUpdateActions
14011340 else throwErr("nothing to refresh")
14231362 let newY = getYD(xp, index, D1)
14241363 let dy = (xp[index] - newY)
14251364 let totalGetRaw = max([0, toInt((dy - big1))])
1426- let $t05017350228 = takeFee(totalGetRaw, outFee)
1427- let totalGet = $t05017350228._1
1428- let feeAmount = $t05017350228._2
1365+ let $t04995550010 = takeFee(totalGetRaw, outFee)
1366+ let totalGet = $t04995550010._1
1367+ let feeAmount = $t04995550010._2
14291368 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
14301369 }
14311370
14381377 let lpId = toBase58String(value(cfgLpAssetId))
14391378 let amBalance = getAccBalance(amId)
14401379 let prBalance = getAccBalance(prId)
1441- let $t05060350718 = {
1380+ let $t05038550500 = {
14421381 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
14431382 if ($isInstanceOf(@, "(Int, Int)"))
14441383 then @
14451384 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
14461385 }
1447- let totalGet = $t05060350718._1
1448- let feeAmount = $t05060350718._2
1386+ let totalGet = $t05038550500._1
1387+ let feeAmount = $t05038550500._2
14491388 let r = ego("", lpId, lpAssetAmount, this)
14501389 let outAmAmt = r._1
14511390 let outPrAmt = r._2
14791418 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14801419 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14811420 then {
1482- let $t05188451965 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1483- let refreshDLpActions = $t05188451965._1
1484- let updatedDLp = $t05188451965._2
1421+ let $t05166651747 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1422+ let refreshDLpActions = $t05166651747._1
1423+ let updatedDLp = $t05166651747._2
14851424 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14861425 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14871426 then (state ++ refreshDLpActions)
15261465 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15271466 if ((burnA == burnA))
15281467 then {
1529- let $t05299253073 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1530- let refreshDLpActions = $t05299253073._1
1531- let updatedDLp = $t05299253073._2
1468+ let $t05277452855 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1469+ let refreshDLpActions = $t05277452855._1
1470+ let updatedDLp = $t05277452855._2
15321471 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15331472 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15341473 then (state ++ refreshDLpActions)
15791518 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15801519 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15811520 then {
1582- let $t05432454405 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1583- let refreshDLpActions = $t05432454405._1
1584- let updatedDLp = $t05432454405._2
1521+ let $t05410654187 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1522+ let refreshDLpActions = $t05410654187._1
1523+ let updatedDLp = $t05410654187._2
15851524 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15861525 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15871526 then (state ++ refreshDLpActions)
16301569 let unstakeInv = invoke(staking, "unstakeINTERNAL", [lpAssetId, unstakeAmount, userAddress.bytes, lpAssetRecipientAddress.bytes], nil)
16311570 if ((unstakeInv == unstakeInv))
16321571 then {
1633- let $t05542755615 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1634- let state = $t05542755615._1
1635- let totalAmount = $t05542755615._2
1572+ let $t05520955397 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1573+ let state = $t05520955397._1
1574+ let totalAmount = $t05520955397._2
16361575 $Tuple2(state, totalAmount)
16371576 }
16381577 else throw("Strict value is not equal to itself.")
16441583
16451584 @Callable(i)
16461585 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1647- let $t05574355846 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1648- let lpAmount = $t05574355846._1
1649- let state = $t05574355846._2
1650- let feeAmount = $t05574355846._3
1651- let bonus = $t05574355846._4
1586+ let $t05552555628 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1587+ let lpAmount = $t05552555628._1
1588+ let state = $t05552555628._2
1589+ let feeAmount = $t05552555628._3
1590+ let bonus = $t05552555628._4
16521591 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16531592 }
16541593
16561595
16571596 @Callable(i)
16581597 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1659- let $t05599456098 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1660- let lpAmount = $t05599456098._1
1661- let state = $t05599456098._2
1662- let feeAmount = $t05599456098._3
1663- let bonus = $t05599456098._4
1598+ let $t05577655880 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1599+ let lpAmount = $t05577655880._1
1600+ let state = $t05577655880._2
1601+ let feeAmount = $t05577655880._3
1602+ let bonus = $t05577655880._4
16641603 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16651604 }
16661605
17221661 @Callable(i)
17231662 func changeAmp () = {
17241663 let cfg = invoke(fca, "getChangeAmpConfigREADONLY", [toString(this)], nil)
1725- let $t05850758706 = match cfg {
1664+ let $t05828958488 = match cfg {
17261665 case list: List[Any] =>
17271666 $Tuple3({
17281667 let @ = list[0]
17431682 case _ =>
17441683 throwErr("invalid entry type")
17451684 }
1746- let delay = $t05850758706._1
1747- let delta = $t05850758706._2
1748- let target = $t05850758706._3
1685+ let delay = $t05828958488._1
1686+ let delta = $t05828958488._2
1687+ let target = $t05828958488._3
17491688 let curAmp = parseIntValue(getStringValue(amp()))
17501689 let newAmpRaw = (curAmp + delta)
17511690 let newAmp = if ((0 > delta))
17811720 match tx {
17821721 case order: Order =>
17831722 let matcherPub = mp()
1784- let $t05961859735 = if (skipOrderValidation())
1723+ let $t05940059517 = if (skipOrderValidation())
17851724 then $Tuple2(true, "")
17861725 else validateMatcherOrderAllowed(order)
1787- let orderValid = $t05961859735._1
1788- let orderValidInfo = $t05961859735._2
1726+ let orderValid = $t05940059517._1
1727+ let orderValidInfo = $t05940059517._2
17891728 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17901729 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17911730 if (if (if (orderValid)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let big3 = toBigInt(3)
1919
2020 let big4 = toBigInt(4)
2121
22-let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
23-
2422 let wavesString = "WAVES"
2523
2624 let ampInitial = 50
2725
2826 let Amult = "100"
2927
30-let Dconv = "1"
31-
3228 let SEP = "__"
33-
34-let EMPTY = ""
35-
36-let PoolActive = 1
3729
3830 let PoolPutDis = 2
3931
4032 let PoolMatcherDis = 3
4133
4234 let PoolShutdown = 4
4335
4436 let idxPoolAddress = 1
4537
4638 let idxPoolSt = 2
4739
4840 let idxLPAsId = 3
4941
5042 let idxAmAsId = 4
5143
5244 let idxPrAsId = 5
5345
5446 let idxAmtAsDcm = 6
5547
5648 let idxPriceAsDcm = 7
5749
58-let idxIAmtAsId = 8
59-
60-let idxIPriceAsId = 9
61-
6250 let idxFactStakCntr = 1
6351
6452 let idxFactoryRestCntr = 6
6553
6654 let idxFactSlippCntr = 7
67-
68-let idxFactGwxRewCntr = 10
6955
7056 let feeDefault = fraction(10, scale8, 10000)
7157
7258 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7359
7460
7561 func t1BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
7662
7763
7864 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7965
8066
8167 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
82-
83-
84-func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
85-
86-
87-func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
88-
89-
90-func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
9168
9269
9370 func abs (val) = if ((zeroBigInt > val))
9471 then -(val)
9572 else val
9673
9774
9875 func absBigInt (val) = if ((zeroBigInt > val))
9976 then -(val)
10077 else val
10178
10279
10380 func fc () = "%s__factoryContract"
10481
10582
10683 func mpk () = "%s__managerPublicKey"
10784
10885
10986 func pmpk () = "%s__pendingManagerPublicKey"
11087
11188
11289 func pl () = "%s%s__price__last"
11390
11491
11592 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
11693
11794
11895 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
11996
12097
12198 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
12299
123100
124101 func aa () = "%s__amountAsset"
125102
126103
127104 func pa () = "%s__priceAsset"
128105
129106
130107 func amp () = "%s__amp"
131108
132109
133110 func keyAmpHistory (heightBlocks) = ("%s%d__amp__" + toString(heightBlocks))
134111
135112
136113 func keyChangeAmpLastCall () = "%s__changeAmpLastCall"
137114
138115
139116 let keyFee = "%s__fee"
140117
141118 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
142119
143120 let keyDLp = makeString(["%s", "dLp"], SEP)
144121
145122 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
146123
147124 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
148125
149126 let dLpRefreshDelayDefault = 30
150127
151128 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
152129
153130 func fcfg () = "%s__factoryConfig"
154131
155132
156133 func mtpk () = "%s%s__matcher__publicKey"
157134
158135
159136 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
160137
161138
162139 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
163140
164141
165142 func aps () = "%s__shutdown"
166143
167144
168145 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
169146
170147
171148 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
172149
173150
174151 func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
175152
176153
177154 func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
178155
179156
180157 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
181158
182159
183160 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
184161
185162
186163 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
187164
188165
189166 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
190167
191168
192169 let fca = addressFromStringValue(strf(this, fc()))
193170
194171 let inFee = {
195172 let @ = invoke(fca, "getInFeeREADONLY", [toString(this)], nil)
196173 if ($isInstanceOf(@, "Int"))
197174 then @
198175 else throw(($getType(@) + " couldn't be cast to Int"))
199176 }
200177
201178 let outFee = {
202179 let @ = invoke(fca, "getOutFeeREADONLY", [toString(this)], nil)
203180 if ($isInstanceOf(@, "Int"))
204181 then @
205182 else throw(($getType(@) + " couldn't be cast to Int"))
206183 }
207184
208185 let A = strf(this, amp())
209186
210187 func igs () = valueOrElse(getBoolean(fca, aps()), false)
211188
212189
213190 func mp () = fromBase58String(strf(fca, mtpk()))
214191
215192
216193 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
217194
218195 func gpc () = {
219196 let amtAs = strf(this, aa())
220197 let priceAs = strf(this, pa())
221198 let iPriceAs = intf(fca, mba(priceAs))
222199 let iAmtAs = intf(fca, mba(amtAs))
223200 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
224201 }
225202
226203
227204 func parseAssetId (input) = if ((input == wavesString))
228205 then unit
229206 else fromBase58String(input)
230207
231208
232209 func assetIdToString (input) = if ((input == unit))
233210 then wavesString
234211 else toBase58String(value(input))
235212
236213
237-func parsePoolConfig (poolConfig) = $Tuple9(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]), fromBase58String(poolConfig[idxIAmtAsId]), fromBase58String(poolConfig[idxIPriceAsId]))
214+func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
238215
239216
240217 let poolConfigParsed = parsePoolConfig(gpc())
241218
242-let $t081858414 = poolConfigParsed
219+let $t080878273 = poolConfigParsed
243220
244-let cfgPoolAddress = $t081858414._1
221+let cfgPoolStatus = $t080878273._2
245222
246-let cfgPoolStatus = $t081858414._2
223+let cfgLpAssetId = $t080878273._3
247224
248-let cfgLpAssetId = $t081858414._3
225+let cfgAmountAssetId = $t080878273._4
249226
250-let cfgAmountAssetId = $t081858414._4
227+let cfgPriceAssetId = $t080878273._5
251228
252-let cfgPriceAssetId = $t081858414._5
229+let cfgAmountAssetDecimals = $t080878273._6
253230
254-let cfgAmountAssetDecimals = $t081858414._6
255-
256-let cfgPriceAssetDecimals = $t081858414._7
257-
258-let cfgInAmountAssedId = $t081858414._8
259-
260-let cfgInPriceAssetId = $t081858414._9
231+let cfgPriceAssetDecimals = $t080878273._7
261232
262233 func gfc () = split(strf(fca, fcfg()), SEP)
263234
264235
265236 let factoryConfig = gfc()
266237
267238 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
268-
269-let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
270-
271-let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
272239
273240 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
274241
275242 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
276243
277244
278245 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
279246
280247
281248 func getAccBalance (assetId) = if ((assetId == "WAVES"))
282249 then wavesBalance(this).available
283250 else assetBalance(this, fromBase58String(assetId))
284251
285252
286253 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
287254
288255
289256 func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
290257
291258
292-func vad (A1,A2,slippage) = {
293- let diff = fraction((A1 - A2), scale8BigInt, A2)
294- let pass = ((slippage - abs(diff)) > zeroBigInt)
295- if (!(pass))
296- then throw(("Big slpg: " + toString(diff)))
297- else $Tuple2(pass, min([A1, A2]))
298- }
299-
300-
301-func vd (D1,D0,slpg) = {
302- let diff = fraction(D0, scale8BigInt, D1)
303- let fail = (slpg > diff)
304- if (if (fail)
305- then true
306- else (D0 > D1))
307- then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
308- else fail
309- }
310-
311-
312259 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
313260 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
314261 let prAsAmtX18 = t1(prAmt, prAssetDcm)
315262 cpbi(prAsAmtX18, amtAsAmtX18)
316263 }
317264
318265
319266 func calcPrices (amAmt,prAmt,lpAmt) = {
320267 let amtAsDcm = cfgAmountAssetDecimals
321268 let prAsDcm = cfgPriceAssetDecimals
322269 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
323270 let amAmtX18 = t1(amAmt, amtAsDcm)
324271 let prAmtX18 = t1(prAmt, prAsDcm)
325272 let lpAmtX18 = t1(lpAmt, scale8)
326273 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
327274 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
328275 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
329- }
330-
331-
332-func calculatePrices (amAmt,prAmt,lpAmt) = {
333- let p = calcPrices(amAmt, prAmt, lpAmt)
334-[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
335276 }
336277
337278
338279 func takeFee (amount,fee) = {
339280 let feeAmount = if ((fee == 0))
340281 then 0
341282 else fraction(amount, fee, scale8)
342283 $Tuple2((amount - feeAmount), feeAmount)
343284 }
344285
345286
346287 func getD (xp) = {
347288 let xp0 = xp[0]
348289 let xp1 = xp[1]
349290 let s = (xp0 + xp1)
350291 if ((s == big0))
351292 then big0
352293 else {
353294 let a = parseIntValue(A)
354295 let ann = (a * 2)
355296 let p = fraction(xp0, xp1, big1)
356297 let xp0_xp1_n_n = fraction(p, big4, big1)
357298 let ann_s = fraction(toBigInt(ann), s, big1)
358299 let ann_1 = toBigInt((ann - 1))
359300 func calcDNext (d) = {
360301 let dd = fraction(d, d, big1)
361302 let ddd = fraction(dd, d, big1)
362303 let dp = fraction(ddd, big1, xp0_xp1_n_n)
363304 fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)))
364305 }
365306
366307 func calc (acc,i) = if (acc._2)
367308 then acc
368309 else {
369310 let d = acc._1
370311 let dNext = calcDNext(d)
371312 let dDiffRaw = (dNext - value(d))
372313 let dDiff = if ((big0 > dDiffRaw))
373314 then -(dDiffRaw)
374315 else dDiffRaw
375316 if ((big1 >= dDiff))
376317 then $Tuple2(dNext, true)
377318 else $Tuple2(dNext, false)
378319 }
379320
380321 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
381- let $t01291912967 = {
322+ let $t01277812826 = {
382323 let $l = arr
383324 let $s = size($l)
384325 let $acc0 = $Tuple2(s, false)
385326 func $f0_1 ($a,$i) = if (($i >= $s))
386327 then $a
387328 else calc($a, $l[$i])
388329
389330 func $f0_2 ($a,$i) = if (($i >= $s))
390331 then $a
391332 else throw("List size exceeds 17")
392333
393334 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17)
394335 }
395- let d = $t01291912967._1
396- let found = $t01291912967._2
336+ let d = $t01277812826._1
337+ let found = $t01277812826._2
397338 if (found)
398339 then d
399340 else throw(("D calculation error, D = " + toString(d)))
400341 }
401342 }
402343
403344
404345 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
405346 let lpId = cfgLpAssetId
406347 let amId = toBase58String(value(cfgAmountAssetId))
407348 let prId = toBase58String(value(cfgPriceAssetId))
408349 let amDcm = cfgAmountAssetDecimals
409350 let prDcm = cfgPriceAssetDecimals
410351 let sts = toString(cfgPoolStatus)
411352 let lpEmiss = valueOrErrorMessage(assetInfo(lpId), "Wrong LP id").quantity
412353 if ((toBase58String(lpId) != pmtAssetId))
413354 then throw("Wrong pmt asset")
414355 else {
415356 let amBalance = getAccBalance(amId)
416357 let amBalanceX18 = t1(amBalance, amDcm)
417358 let prBalance = getAccBalance(prId)
418359 let prBalanceX18 = t1(prBalance, prDcm)
419360 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
420361 let curPrice = f1(curPriceX18, scale8)
421362 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
422363 let lpEmissX18 = t1(lpEmiss, scale8)
423364 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
424365 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
425366 let outAmAmt = fromX18Round(outAmAmtX18, amDcm, FLOOR)
426367 let outPrAmt = fromX18Round(outPrAmtX18, prDcm, FLOOR)
427368 let state = if ((txId58 == ""))
428369 then nil
429370 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
430371 then unit
431372 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
432373 then unit
433374 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
434375 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
435376 }
436377 }
437378
438379
439380 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
440381 let lpId = cfgLpAssetId
441382 let amIdStr = toBase58String(value(cfgAmountAssetId))
442383 let prIdStr = toBase58String(value(cfgPriceAssetId))
443- let inAmIdStr = cfgInAmountAssedId
444- let inPrIdStr = cfgInPriceAssetId
445384 let amtDcm = cfgAmountAssetDecimals
446385 let priceDcm = cfgPriceAssetDecimals
447386 let sts = toString(cfgPoolStatus)
448387 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
449388 let amBalance = if (isEval)
450389 then getAccBalance(amIdStr)
451390 else if (if (isOneAsset)
452391 then (pmtId == amIdStr)
453392 else false)
454393 then (getAccBalance(amIdStr) - pmtAmt)
455394 else if (isOneAsset)
456395 then getAccBalance(amIdStr)
457396 else (getAccBalance(amIdStr) - inAmAmt)
458397 let prBalance = if (isEval)
459398 then getAccBalance(prIdStr)
460399 else if (if (isOneAsset)
461400 then (pmtId == prIdStr)
462401 else false)
463402 then (getAccBalance(prIdStr) - pmtAmt)
464403 else if (isOneAsset)
465404 then getAccBalance(prIdStr)
466405 else (getAccBalance(prIdStr) - inPrAmt)
467406 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
468407 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
469408 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
470409 let amBalanceX18 = t1(amBalance, amtDcm)
471410 let prBalanceX18 = t1(prBalance, priceDcm)
472411 let D0 = getD([amBalanceX18, prBalanceX18])
473412 let r = if ((lpEm == 0))
474413 then {
475414 let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
476415 let checkD = if ((D1 > D0))
477416 then true
478417 else throw("D1 should be greater than D0")
479418 if ((checkD == checkD))
480419 then {
481420 let curPriceX18 = zeroBigInt
482421 let slippageX18 = zeroBigInt
483422 let lpAmtX18 = D1
484423 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
485424 }
486425 else throw("Strict value is not equal to itself.")
487426 }
488427 else {
489428 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
490429 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
491430 let slippageX18 = t1(slippage, scale8)
492431 if (if (if (validateSlippage)
493432 then (curPriceX18 != zeroBigInt)
494433 else false)
495434 then (slippageRealX18 > slippageX18)
496435 else false)
497436 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
498437 else {
499438 let lpEmissionX18 = t1(lpEm, scale8)
500439 let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
501440 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
502441 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
503442 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
504443 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
505444 let expAmtAssetAmtX18 = expectedAmts._1
506445 let expPriceAssetAmtX18 = expectedAmts._2
507446 let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
508447 let checkD = if ((D1 > D0))
509448 then true
510449 else throw("D1 should be greater than D0")
511450 if ((checkD == checkD))
512451 then {
513452 let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
514453 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
515454 }
516455 else throw("Strict value is not equal to itself.")
517456 }
518457 }
519458 let calcLpAmt = r._1
520459 let calcAmAssetPmt = r._2
521460 let calcPrAssetPmt = r._3
522461 let curPrice = f1(r._4, scale8)
523462 let slippageCalc = f1(r._5, scale8)
524463 if ((0 >= calcLpAmt))
525464 then throw("LP <= 0")
526465 else {
527466 let emitLpAmt = if (!(emitLp))
528467 then 0
529468 else calcLpAmt
530469 let amDiff = (inAmAmt - calcAmAssetPmt)
531470 let prDiff = (inPrAmt - calcPrAssetPmt)
532- let $t02080621151 = if (if (isOneAsset)
471+ let $t02058820933 = if (if (isOneAsset)
533472 then (pmtId == amIdStr)
534473 else false)
535474 then $Tuple2(pmtAmt, 0)
536475 else if (if (isOneAsset)
537476 then (pmtId == prIdStr)
538477 else false)
539478 then $Tuple2(0, pmtAmt)
540479 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
541- let writeAmAmt = $t02080621151._1
542- let writePrAmt = $t02080621151._2
480+ let writeAmAmt = $t02058820933._1
481+ let writePrAmt = $t02058820933._2
543482 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
544483 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
545484 }
546485 }
547486
548487
549488 func getYD (xp,i,D) = {
550489 let n = big2
551490 let x = xp[if ((i == 0))
552491 then 1
553492 else 0]
554493 let aPrecision = parseBigIntValue(Amult)
555494 let a = (parseBigIntValue(A) * aPrecision)
556495 let s = x
557496 let ann = (a * n)
558497 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
559498 let b = ((s + ((D * aPrecision) / ann)) - D)
560499 func calc (acc,cur) = {
561- let $t02234622366 = acc
562- let y = $t02234622366._1
563- let found = $t02234622366._2
500+ let $t02212822148 = acc
501+ let y = $t02212822148._1
502+ let found = $t02212822148._2
564503 if ((found != unit))
565504 then acc
566505 else {
567506 let yNext = (((y * y) + c) / ((big2 * y) + b))
568507 let yDiff = absBigInt((yNext - value(y)))
569508 if ((big1 >= yDiff))
570509 then $Tuple2(yNext, cur)
571510 else $Tuple2(yNext, unit)
572511 }
573512 }
574513
575514 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
576- let $t02267322720 = {
515+ let $t02245522502 = {
577516 let $l = arr
578517 let $s = size($l)
579518 let $acc0 = $Tuple2(D, unit)
580519 func $f0_1 ($a,$i) = if (($i >= $s))
581520 then $a
582521 else calc($a, $l[$i])
583522
584523 func $f0_2 ($a,$i) = if (($i >= $s))
585524 then $a
586525 else throw("List size exceeds 15")
587526
588527 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
589528 }
590- let y = $t02267322720._1
591- let found = $t02267322720._2
529+ let y = $t02245522502._1
530+ let found = $t02245522502._2
592531 if ((found != unit))
593532 then y
594533 else throw(("Y calculation error, Y = " + toString(y)))
595534 }
596535
597536
598537 func calcDLp (amountBalance,priceBalance,lpEmission) = {
599538 let updatedDLp = fraction(getD([t1BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals)), t1BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))]), scale18, lpEmission)
600539 if ((lpEmission == big0))
601540 then big0
602541 else updatedDLp
603542 }
604543
605544
606545 func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
607546 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
608547 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
609548 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
610549 let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
611550 currentDLp
612551 }
613552
614553
615554 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
616555 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
617556 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
618557 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
619558 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
620559 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
621560 $Tuple2(actions, updatedDLp)
622561 }
623562
624563
625564 func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
626565 then true
627566 else throwErr("updated DLp lower than current DLp")
628567
629568
630569 func validateMatcherOrderAllowed (order) = {
631570 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
632571 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
633572 let amountAssetAmount = order.amount
634573 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
635- let $t02491825130 = if ((order.orderType == Buy))
574+ let $t02470024912 = if ((order.orderType == Buy))
636575 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
637576 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
638- let amountAssetBalanceDelta = $t02491825130._1
639- let priceAssetBalanceDelta = $t02491825130._2
577+ let amountAssetBalanceDelta = $t02470024912._1
578+ let priceAssetBalanceDelta = $t02470024912._2
640579 if (if (if (igs())
641580 then true
642581 else (cfgPoolStatus == PoolMatcherDis))
643582 then true
644583 else (cfgPoolStatus == PoolShutdown))
645584 then throw("Admin blocked")
646585 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
647586 then true
648587 else (order.assetPair.priceAsset != cfgPriceAssetId))
649588 then throw("Wr assets")
650589 else {
651590 let dLp = parseBigIntValue(valueOrElse(getString(this, keyDLp), "0"))
652- let $t02547225572 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
653- let unusedActions = $t02547225572._1
654- let dLpNew = $t02547225572._2
591+ let $t02525425354 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
592+ let unusedActions = $t02525425354._1
593+ let dLpNew = $t02525425354._2
655594 let isOrderValid = (dLpNew >= dLp)
656595 let info = makeString(["dLp=", toString(dLp), " dLpNew=", toString(dLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
657596 $Tuple2(isOrderValid, info)
658597 }
659598 }
660599
661600
662601 func cg (i) = if ((size(i.payments) != 1))
663602 then throw("1 pmnt exp")
664603 else {
665604 let pmt = value(i.payments[0])
666605 let pmtAssetId = value(pmt.assetId)
667606 let pmtAmt = pmt.amount
668607 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
669608 let outAmAmt = r._1
670609 let outPrAmt = r._2
671610 let sts = parseIntValue(r._9)
672611 let state = r._10
673612 if (if (igs())
674613 then true
675614 else (sts == PoolShutdown))
676615 then throw(("Admin blocked: " + toString(sts)))
677616 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
678617 }
679618
680619
681620 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
682621 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
683622 let sts = parseIntValue(r._8)
684623 if (if (if (igs())
685624 then true
686625 else (sts == PoolPutDis))
687626 then true
688627 else (sts == PoolShutdown))
689628 then throw(("Blocked:" + toString(sts)))
690629 else r
691630 }
692631
693632
694633 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
695634 let amId = toBase58String(value(cfgAmountAssetId))
696635 let prId = toBase58String(value(cfgPriceAssetId))
697636 let lpId = cfgLpAssetId
698637 let amtDcm = cfgAmountAssetDecimals
699638 let priceDcm = cfgPriceAssetDecimals
700639 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(lpId), "invalid lp asset").quantity)
701640 let chechEmission = if ((lpAssetEmission > big0))
702641 then true
703642 else throw("initial deposit requires all coins")
704643 if ((chechEmission == chechEmission))
705644 then {
706645 let amBalance = getAccBalance(amId)
707646 let prBalance = getAccBalance(prId)
708- let $t02822828690 = if ((txId == ""))
647+ let $t02801028472 = if ((txId == ""))
709648 then $Tuple2(amBalance, prBalance)
710649 else if ((pmtAssetId == amId))
711650 then if ((pmtAmtRaw > amBalance))
712651 then throw("invalid payment amount")
713652 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
714653 else if ((pmtAssetId == prId))
715654 then if ((pmtAmtRaw > prBalance))
716655 then throw("invalid payment amount")
717656 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
718657 else throw("wrong pmtAssetId")
719- let amBalanceOld = $t02822828690._1
720- let prBalanceOld = $t02822828690._2
721- let $t02869628872 = if ((pmtAssetId == amId))
658+ let amBalanceOld = $t02801028472._1
659+ let prBalanceOld = $t02801028472._2
660+ let $t02847828654 = if ((pmtAssetId == amId))
722661 then $Tuple2(pmtAmtRaw, 0)
723662 else if ((pmtAssetId == prId))
724663 then $Tuple2(0, pmtAmtRaw)
725664 else throw("invalid payment")
726- let amAmountRaw = $t02869628872._1
727- let prAmountRaw = $t02869628872._2
728- let $t02887629130 = if (withTakeFee)
665+ let amAmountRaw = $t02847828654._1
666+ let prAmountRaw = $t02847828654._2
667+ let $t02865828912 = if (withTakeFee)
729668 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
730669 else $Tuple3(amAmountRaw, prAmountRaw, 0)
731- let amAmount = $t02887629130._1
732- let prAmount = $t02887629130._2
733- let feeAmount = $t02887629130._3
670+ let amAmount = $t02865828912._1
671+ let prAmount = $t02865828912._2
672+ let feeAmount = $t02865828912._3
734673 let amBalanceNew = (amBalanceOld + amAmount)
735674 let prBalanceNew = (prBalanceOld + prAmount)
736675 let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
737676 let D1 = getD([t1(amBalanceNew, cfgAmountAssetDecimals), t1(prBalanceNew, cfgPriceAssetDecimals)])
738677 let checkD = if ((D1 > D0))
739678 then true
740679 else throw()
741680 if ((checkD == checkD))
742681 then {
743682 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0, FLOOR)
744683 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
745684 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
746685 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
747686 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
748687 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
749688 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
750689 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
751690 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
752691 }
753692 else throw("Strict value is not equal to itself.")
754693 }
755694 else throw("Strict value is not equal to itself.")
756695 }
757696
758697
759698 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
760699 let lpId = toBase58String(value(cfgLpAssetId))
761700 let amId = toBase58String(value(cfgAmountAssetId))
762701 let prId = toBase58String(value(cfgPriceAssetId))
763702 let amDecimals = cfgAmountAssetDecimals
764703 let prDecimals = cfgPriceAssetDecimals
765704 let poolStatus = cfgPoolStatus
766705 let userAddress = if ((caller == restContract))
767706 then originCaller
768707 else caller
769708 let pmt = value(payments[0])
770709 let pmtAssetId = value(pmt.assetId)
771710 let pmtAmt = pmt.amount
772711 let currentDLp = calcCurrentDLp(big0, big0, big0)
773712 if ((currentDLp == currentDLp))
774713 then {
775714 let txId58 = toBase58String(transactionId)
776715 if ((lpId != toBase58String(pmtAssetId)))
777716 then throw("Wrong LP")
778717 else {
779718 let amBalance = getAccBalance(amId)
780719 let prBalance = getAccBalance(prId)
781- let $t03124231353 = {
720+ let $t03102431135 = {
782721 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
783722 if ($isInstanceOf(@, "(Int, Int)"))
784723 then @
785724 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
786725 }
787- if (($t03124231353 == $t03124231353))
726+ if (($t03102431135 == $t03102431135))
788727 then {
789- let feeAmount = $t03124231353._2
790- let totalGet = $t03124231353._1
728+ let feeAmount = $t03102431135._2
729+ let totalGet = $t03102431135._1
791730 let totalAmount = if (if ((minOutAmount > 0))
792731 then (minOutAmount > totalGet)
793732 else false)
794733 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
795734 else totalGet
796- let $t03154331850 = if ((outAssetId == amId))
735+ let $t03132531632 = if ((outAssetId == amId))
797736 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
798737 else if ((outAssetId == prId))
799738 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
800739 else throw("invalid out asset id")
801- let outAm = $t03154331850._1
802- let outPr = $t03154331850._2
803- let amBalanceNew = $t03154331850._3
804- let prBalanceNew = $t03154331850._4
740+ let outAm = $t03132531632._1
741+ let outPr = $t03132531632._2
742+ let amBalanceNew = $t03132531632._3
743+ let prBalanceNew = $t03132531632._4
805744 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
806745 let curPr = f1(curPrX18, scale8)
807746 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
808747 then unit
809748 else fromBase58String(outAssetId)
810749 let sendFeeToMatcher = if ((feeAmount > 0))
811750 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
812751 else nil
813752 let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
814753 if ((state == state))
815754 then {
816755 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
817756 if ((burn == burn))
818757 then {
819- let $t03263532985 = {
758+ let $t03241732767 = {
820759 let feeAmountForCalc = if ((this == feeCollectorAddress))
821760 then 0
822761 else feeAmount
823762 let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
824763 then true
825764 else false
826765 if (outInAmountAsset)
827766 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
828767 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
829768 }
830- let amountAssetBalanceDelta = $t03263532985._1
831- let priceAssetBalanceDelta = $t03263532985._2
832- let $t03298833096 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
833- let refreshDLpActions = $t03298833096._1
834- let updatedDLp = $t03298833096._2
769+ let amountAssetBalanceDelta = $t03241732767._1
770+ let priceAssetBalanceDelta = $t03241732767._2
771+ let $t03277032878 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
772+ let refreshDLpActions = $t03277032878._1
773+ let updatedDLp = $t03277032878._2
835774 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
836775 if ((isUpdatedDLpValid == isUpdatedDLpValid))
837776 then $Tuple2((state ++ refreshDLpActions), totalAmount)
838777 else throw("Strict value is not equal to itself.")
839778 }
840779 else throw("Strict value is not equal to itself.")
841780 }
842781 else throw("Strict value is not equal to itself.")
843782 }
844783 else throw("Strict value is not equal to itself.")
845784 }
846785 }
847786 else throw("Strict value is not equal to itself.")
848787 }
849788
850789
851790 func m () = match getString(mpk()) {
852791 case s: String =>
853792 fromBase58String(s)
854793 case _: Unit =>
855794 unit
856795 case _ =>
857796 throw("Match error")
858797 }
859798
860799
861800 func pm () = match getString(pmpk()) {
862801 case s: String =>
863802 fromBase58String(s)
864803 case _: Unit =>
865804 unit
866805 case _ =>
867806 throw("Match error")
868807 }
869808
870809
871810 let pd = throw("Permission denied")
872811
873812 func isManager (i) = match m() {
874813 case pk: ByteVector =>
875814 (i.callerPublicKey == pk)
876815 case _: Unit =>
877816 (i.caller == this)
878817 case _ =>
879818 throw("Match error")
880819 }
881820
882821
883822 func mm (i) = match m() {
884823 case pk: ByteVector =>
885824 if ((i.callerPublicKey == pk))
886825 then true
887826 else pd
888827 case _: Unit =>
889828 if ((i.caller == this))
890829 then true
891830 else pd
892831 case _ =>
893832 throw("Match error")
894833 }
895834
896835
897836 func getY (isReverse,D,poolAmountInBalance) = {
898837 let poolConfig = gpc()
899838 let amId = poolConfig[idxAmAsId]
900839 let prId = poolConfig[idxPrAsId]
901840 let n = big2
902841 let aPrecision = parseBigIntValue(Amult)
903842 let a = (parseBigIntValue(A) * aPrecision)
904843 let xp = if ((isReverse == false))
905844 then [(toBigInt(getAccBalance(amId)) + poolAmountInBalance), toBigInt(getAccBalance(prId))]
906845 else [(toBigInt(getAccBalance(prId)) + poolAmountInBalance), toBigInt(getAccBalance(amId))]
907846 let x = xp[0]
908847 let s = x
909848 let ann = (a * n)
910849 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
911850 let b = ((s + ((D * aPrecision) / ann)) - D)
912851 func calc (acc,cur) = {
913- let $t03454334563 = acc
914- let y = $t03454334563._1
915- let found = $t03454334563._2
852+ let $t03432534345 = acc
853+ let y = $t03432534345._1
854+ let found = $t03432534345._2
916855 if ((found != unit))
917856 then acc
918857 else {
919858 let yNext = (((y * y) + c) / ((big2 * y) + b))
920859 let yDiff = absBigInt((yNext - value(y)))
921860 if ((big1 >= yDiff))
922861 then $Tuple2(yNext, cur)
923862 else $Tuple2(yNext, unit)
924863 }
925864 }
926865
927866 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
928- let $t03489434941 = {
867+ let $t03467634723 = {
929868 let $l = arr
930869 let $s = size($l)
931870 let $acc0 = $Tuple2(D, unit)
932871 func $f0_1 ($a,$i) = if (($i >= $s))
933872 then $a
934873 else calc($a, $l[$i])
935874
936875 func $f0_2 ($a,$i) = if (($i >= $s))
937876 then $a
938877 else throw("List size exceeds 15")
939878
940879 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
941880 }
942- let y = $t03489434941._1
943- let found = $t03489434941._2
881+ let y = $t03467634723._1
882+ let found = $t03467634723._2
944883 if ((found != unit))
945884 then y
946885 else throw(("Y calculation error, Y = " + toString(y)))
947886 }
948887
949888
950889 func skipOrderValidation () = valueOrElse(getBoolean(fca, keySkipOrderValidation(toString(this))), false)
951890
952891
953892 @Callable(i)
954893 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
955- let $t03529335717 = if ((isReverse == false))
894+ let $t03507535499 = if ((isReverse == false))
956895 then {
957896 let assetOut = strf(this, pa())
958897 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, aa()))) + toBigInt(cleanAmountIn))
959898 $Tuple2(assetOut, poolAmountInBalance)
960899 }
961900 else {
962901 let assetOut = strf(this, aa())
963902 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, pa()))) + toBigInt(cleanAmountIn))
964903 $Tuple2(assetOut, poolAmountInBalance)
965904 }
966- let assetOut = $t03529335717._1
967- let poolAmountInBalance = $t03529335717._2
905+ let assetOut = $t03507535499._1
906+ let poolAmountInBalance = $t03507535499._2
968907 let poolConfig = gpc()
969908 let amId = poolConfig[idxAmAsId]
970909 let prId = poolConfig[idxPrAsId]
971910 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
972911 let D = getD(xp)
973912 let y = getY(isReverse, D, toBigInt(cleanAmountIn))
974913 let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
975914 let totalGetRaw = max([0, toInt(dy)])
976915 let newXp = if ((isReverse == false))
977916 then [((toBigInt(getAccBalance(amId)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)), (toBigInt(getAccBalance(prId)) - dy)]
978917 else [(toBigInt(getAccBalance(amId)) - dy), ((toBigInt(getAccBalance(prId)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount))]
979918 let newD = getD(newXp)
980919 let checkD = if ((newD >= D))
981920 then true
982921 else throw(makeString(["new D is fewer error", toString(D), toString(newD)], "__"))
983922 if ((checkD == checkD))
984923 then $Tuple2(nil, totalGetRaw)
985924 else throw("Strict value is not equal to itself.")
986925 }
987926
988927
989928
990929 @Callable(i)
991930 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
992931 let swapContact = {
993932 let @ = invoke(fca, "getSwapContractREADONLY", nil, nil)
994933 if ($isInstanceOf(@, "String"))
995934 then @
996935 else throw(($getType(@) + " couldn't be cast to String"))
997936 }
998937 let checks = [if ((value(i.payments[0]).amount >= cleanAmountIn))
999938 then true
1000939 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
1001940 then true
1002941 else throwErr("Permission denied")]
1003942 if ((checks == checks))
1004943 then {
1005944 let pmt = value(i.payments[0])
1006945 let assetIn = assetIdToString(pmt.assetId)
1007- let $t03715337547 = if ((isReverse == false))
946+ let $t03693537329 = if ((isReverse == false))
1008947 then {
1009948 let assetOut = strf(this, pa())
1010949 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
1011950 $Tuple2(assetOut, poolAmountInBalance)
1012951 }
1013952 else {
1014953 let assetOut = strf(this, aa())
1015954 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
1016955 $Tuple2(assetOut, poolAmountInBalance)
1017956 }
1018- let assetOut = $t03715337547._1
1019- let poolAmountInBalance = $t03715337547._2
957+ let assetOut = $t03693537329._1
958+ let poolAmountInBalance = $t03693537329._2
1020959 let poolConfig = gpc()
1021960 let amId = poolConfig[idxAmAsId]
1022961 let prId = poolConfig[idxPrAsId]
1023962 let xp = if ((isReverse == false))
1024963 then [(toBigInt(getAccBalance(amId)) - toBigInt(value(i.payments[0]).amount)), toBigInt(getAccBalance(prId))]
1025964 else [toBigInt(getAccBalance(amId)), (toBigInt(getAccBalance(prId)) - toBigInt(value(i.payments[0]).amount))]
1026965 let D = getD(xp)
1027966 let y = getY(isReverse, D, toBigInt(0))
1028967 let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
1029968 let totalGetRaw = max([0, toInt(dy)])
1030969 let checkMin = if ((totalGetRaw >= amountOutMin))
1031970 then true
1032971 else throw("Exchange result is fewer coins than expected")
1033972 if ((checkMin == checkMin))
1034973 then {
1035974 let newXp = if ((isReverse == false))
1036975 then [(toBigInt(getAccBalance(amId)) + toBigInt(feePoolAmount)), (toBigInt(getAccBalance(prId)) - dy)]
1037976 else [(toBigInt(getAccBalance(amId)) - dy), (toBigInt(getAccBalance(prId)) + toBigInt(feePoolAmount))]
1038977 let newD = getD(newXp)
1039978 let checkD = if ((newD >= D))
1040979 then true
1041980 else throw("new D is fewer error")
1042981 if ((checkD == checkD))
1043982 then $Tuple2([ScriptTransfer(addressFromStringValue(addressTo), totalGetRaw, parseAssetId(assetOut))], totalGetRaw)
1044983 else throw("Strict value is not equal to itself.")
1045984 }
1046985 else throw("Strict value is not equal to itself.")
1047986 }
1048987 else throw("Strict value is not equal to itself.")
1049988 }
1050989
1051990
1052991
1053992 @Callable(i)
1054993 func constructor (fc) = {
1055994 let c = mm(i)
1056995 if ((c == c))
1057996 then [StringEntry(fc(), fc)]
1058997 else throw("Strict value is not equal to itself.")
1059998 }
1060999
10611000
10621001
10631002 @Callable(i)
10641003 func setManager (pendingManagerPublicKey) = {
10651004 let c = mm(i)
10661005 if ((c == c))
10671006 then {
10681007 let cm = fromBase58String(pendingManagerPublicKey)
10691008 if ((cm == cm))
10701009 then [StringEntry(pmpk(), pendingManagerPublicKey)]
10711010 else throw("Strict value is not equal to itself.")
10721011 }
10731012 else throw("Strict value is not equal to itself.")
10741013 }
10751014
10761015
10771016
10781017 @Callable(i)
10791018 func confirmManager () = {
10801019 let p = pm()
10811020 let hpm = if (isDefined(p))
10821021 then true
10831022 else throw("No pending manager")
10841023 if ((hpm == hpm))
10851024 then {
10861025 let cpm = if ((i.callerPublicKey == value(p)))
10871026 then true
10881027 else throw("You are not pending manager")
10891028 if ((cpm == cpm))
10901029 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
10911030 else throw("Strict value is not equal to itself.")
10921031 }
10931032 else throw("Strict value is not equal to itself.")
10941033 }
10951034
10961035
10971036
10981037 @Callable(i)
10991038 func put (slip,autoStake) = {
11001039 let factCfg = gfc()
11011040 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
11021041 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
11031042 if ((0 > slip))
11041043 then throw("Wrong slippage")
11051044 else if ((size(i.payments) != 2))
11061045 then throw("2 pmnts expd")
11071046 else {
11081047 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11091048 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11101049 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amAssetPmt)
11111050 if ((amountAssetBalance == amountAssetBalance))
11121051 then {
11131052 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - prAssetPmt)
11141053 if ((priceAssetBalance == priceAssetBalance))
11151054 then {
11161055 let lpAssetEmission = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
11171056 if ((lpAssetEmission == lpAssetEmission))
11181057 then {
11191058 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11201059 if ((currentDLp == currentDLp))
11211060 then {
11221061 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
11231062 let emitLpAmt = e._2
11241063 let lpAssetId = e._7
11251064 let state = e._9
11261065 let amDiff = e._10
11271066 let prDiff = e._11
11281067 let amId = e._12
11291068 let prId = e._13
11301069 let r = invoke(fca, "emit", [emitLpAmt], nil)
11311070 if ((r == r))
11321071 then {
11331072 let el = match r {
11341073 case legacy: Address =>
11351074 invoke(legacy, "emit", [emitLpAmt], nil)
11361075 case _ =>
11371076 unit
11381077 }
11391078 if ((el == el))
11401079 then {
11411080 let sa = if ((amDiff > 0))
11421081 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
11431082 else nil
11441083 if ((sa == sa))
11451084 then {
11461085 let sp = if ((prDiff > 0))
11471086 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
11481087 else nil
11491088 if ((sp == sp))
11501089 then {
11511090 let lpTrnsfr = if (autoStake)
11521091 then {
11531092 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
11541093 if ((ss == ss))
11551094 then nil
11561095 else throw("Strict value is not equal to itself.")
11571096 }
11581097 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1159- let $t04216642308 = refreshDLpInternal(0, 0, 0)
1160- let refreshDLpActions = $t04216642308._1
1161- let updatedDLp = $t04216642308._2
1098+ let $t04194842090 = refreshDLpInternal(0, 0, 0)
1099+ let refreshDLpActions = $t04194842090._1
1100+ let updatedDLp = $t04194842090._2
11621101 let check = if ((updatedDLp >= currentDLp))
11631102 then true
11641103 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
11651104 if ((check == check))
11661105 then {
11671106 let lpAssetEmissionAfter = value(assetInfo(cfgLpAssetId)).quantity
11681107 if ((lpAssetEmissionAfter == lpAssetEmissionAfter))
11691108 then ((state ++ lpTrnsfr) ++ refreshDLpActions)
11701109 else throw("Strict value is not equal to itself.")
11711110 }
11721111 else throw("Strict value is not equal to itself.")
11731112 }
11741113 else throw("Strict value is not equal to itself.")
11751114 }
11761115 else throw("Strict value is not equal to itself.")
11771116 }
11781117 else throw("Strict value is not equal to itself.")
11791118 }
11801119 else throw("Strict value is not equal to itself.")
11811120 }
11821121 else throw("Strict value is not equal to itself.")
11831122 }
11841123 else throw("Strict value is not equal to itself.")
11851124 }
11861125 else throw("Strict value is not equal to itself.")
11871126 }
11881127 else throw("Strict value is not equal to itself.")
11891128 }
11901129 }
11911130
11921131
11931132
11941133 @Callable(i)
11951134 func putOneTknV2 (minOutAmount,autoStake) = {
11961135 let isPoolOneTokenOperationsDisabled = {
11971136 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11981137 if ($isInstanceOf(@, "Boolean"))
11991138 then @
12001139 else throw(($getType(@) + " couldn't be cast to Boolean"))
12011140 }
12021141 let isPutDisabled = if (if (if (igs())
12031142 then true
12041143 else (cfgPoolStatus == PoolPutDis))
12051144 then true
12061145 else (cfgPoolStatus == PoolShutdown))
12071146 then true
12081147 else isPoolOneTokenOperationsDisabled
12091148 let checks = [if (if (!(isPutDisabled))
12101149 then true
12111150 else isManager(i))
12121151 then true
12131152 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
12141153 then true
12151154 else throwErr("exactly 1 payment are expected")]
12161155 if ((checks == checks))
12171156 then {
12181157 let amId = toBase58String(value(cfgAmountAssetId))
12191158 let prId = toBase58String(value(cfgPriceAssetId))
12201159 let lpId = cfgLpAssetId
12211160 let amDecimals = cfgAmountAssetDecimals
12221161 let prDecimals = cfgPriceAssetDecimals
12231162 let userAddress = if ((i.caller == this))
12241163 then i.originCaller
12251164 else i.caller
12261165 let pmt = value(i.payments[0])
12271166 let pmtAssetId = toBase58String(value(pmt.assetId))
12281167 let pmtAmt = pmt.amount
12291168 let currentDLp = if ((pmt.assetId == cfgAmountAssetId))
12301169 then calcCurrentDLp(toBigInt(pmtAmt), toBigInt(0), toBigInt(0))
12311170 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
12321171 if ((currentDLp == currentDLp))
12331172 then {
1234- let $t04394944107 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1235- if (($t04394944107 == $t04394944107))
1173+ let $t04373143889 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1174+ if (($t04373143889 == $t04373143889))
12361175 then {
1237- let feeAmount = $t04394944107._3
1238- let state = $t04394944107._2
1239- let estimLP = $t04394944107._1
1176+ let feeAmount = $t04373143889._3
1177+ let state = $t04373143889._2
1178+ let estimLP = $t04373143889._1
12401179 let emitLpAmt = if (if ((minOutAmount > 0))
12411180 then (minOutAmount > estimLP)
12421181 else false)
12431182 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
12441183 else estimLP
12451184 let e = invoke(fca, "emit", [emitLpAmt], nil)
12461185 if ((e == e))
12471186 then {
12481187 let el = match e {
12491188 case legacy: Address =>
12501189 invoke(legacy, "emit", [emitLpAmt], nil)
12511190 case _ =>
12521191 unit
12531192 }
12541193 if ((el == el))
12551194 then {
12561195 let lpTrnsfr = if (autoStake)
12571196 then {
12581197 let ss = invoke(stakingContract, "stakeFor", [toString(i.caller)], [AttachedPayment(lpId, emitLpAmt)])
12591198 if ((ss == ss))
12601199 then nil
12611200 else throw("Strict value is not equal to itself.")
12621201 }
12631202 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
12641203 let sendFeeToMatcher = if ((feeAmount > 0))
12651204 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
12661205 else nil
1267- let $t04499245341 = if ((this == feeCollectorAddress))
1206+ let $t04477445123 = if ((this == feeCollectorAddress))
12681207 then $Tuple2(0, 0)
12691208 else {
12701209 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
12711210 then true
12721211 else false
12731212 if (paymentInAmountAsset)
12741213 then $Tuple2(-(feeAmount), 0)
12751214 else $Tuple2(0, -(feeAmount))
12761215 }
1277- let amountAssetBalanceDelta = $t04499245341._1
1278- let priceAssetBalanceDelta = $t04499245341._2
1279- let $t04534445452 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1280- let refreshDLpActions = $t04534445452._1
1281- let updatedDLp = $t04534445452._2
1216+ let amountAssetBalanceDelta = $t04477445123._1
1217+ let priceAssetBalanceDelta = $t04477445123._2
1218+ let $t04512645234 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1219+ let refreshDLpActions = $t04512645234._1
1220+ let updatedDLp = $t04512645234._2
12821221 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
12831222 if ((isUpdatedDLpValid == isUpdatedDLpValid))
12841223 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
12851224 else throw("Strict value is not equal to itself.")
12861225 }
12871226 else throw("Strict value is not equal to itself.")
12881227 }
12891228 else throw("Strict value is not equal to itself.")
12901229 }
12911230 else throw("Strict value is not equal to itself.")
12921231 }
12931232 else throw("Strict value is not equal to itself.")
12941233 }
12951234 else throw("Strict value is not equal to itself.")
12961235 }
12971236
12981237
12991238
13001239 @Callable(i)
13011240 func putForFree (maxSlpg) = if ((0 > maxSlpg))
13021241 then throw("Wrong slpg")
13031242 else if ((size(i.payments) != 2))
13041243 then throw("2 pmnts expd")
13051244 else {
13061245 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
13071246 let state = estPut._9
13081247 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
13091248 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
13101249 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
13111250 if ((currentDLp == currentDLp))
13121251 then {
1313- let $t04648246547 = refreshDLpInternal(0, 0, 0)
1314- let refreshDLpActions = $t04648246547._1
1315- let updatedDLp = $t04648246547._2
1252+ let $t04626446329 = refreshDLpInternal(0, 0, 0)
1253+ let refreshDLpActions = $t04626446329._1
1254+ let updatedDLp = $t04626446329._2
13161255 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13171256 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13181257 then (state ++ refreshDLpActions)
13191258 else throw("Strict value is not equal to itself.")
13201259 }
13211260 else throw("Strict value is not equal to itself.")
13221261 }
13231262
13241263
13251264
13261265 @Callable(i)
13271266 func get () = {
13281267 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13291268 if ((currentDLp == currentDLp))
13301269 then {
13311270 let r = cg(i)
13321271 let outAmtAmt = r._1
13331272 let outPrAmt = r._2
13341273 let pmtAmt = r._3
13351274 let pmtAssetId = r._4
13361275 let state = r._5
13371276 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13381277 if ((b == b))
13391278 then {
1340- let $t04772047802 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1341- let refreshDLpActions = $t04772047802._1
1342- let updatedDLp = $t04772047802._2
1279+ let $t04750247584 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1280+ let refreshDLpActions = $t04750247584._1
1281+ let updatedDLp = $t04750247584._2
13431282 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13441283 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13451284 then (state ++ refreshDLpActions)
13461285 else throw("Strict value is not equal to itself.")
13471286 }
13481287 else throw("Strict value is not equal to itself.")
13491288 }
13501289 else throw("Strict value is not equal to itself.")
13511290 }
13521291
13531292
13541293
13551294 @Callable(i)
13561295 func getOneTknV2 (outAssetId,minOutAmount) = {
13571296 let isPoolOneTokenOperationsDisabled = {
13581297 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
13591298 if ($isInstanceOf(@, "Boolean"))
13601299 then @
13611300 else throw(($getType(@) + " couldn't be cast to Boolean"))
13621301 }
13631302 let isGetDisabled = if (if (igs())
13641303 then true
13651304 else (cfgPoolStatus == PoolShutdown))
13661305 then true
13671306 else isPoolOneTokenOperationsDisabled
13681307 let checks = [if (if (!(isGetDisabled))
13691308 then true
13701309 else isManager(i))
13711310 then true
13721311 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
13731312 then true
13741313 else throwErr("exactly 1 payment are expected")]
13751314 if ((checks == checks))
13761315 then {
1377- let $t04842048575 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1378- let state = $t04842048575._1
1379- let totalAmount = $t04842048575._2
1316+ let $t04820248357 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1317+ let state = $t04820248357._1
1318+ let totalAmount = $t04820248357._2
13801319 $Tuple2(state, totalAmount)
13811320 }
13821321 else throw("Strict value is not equal to itself.")
13831322 }
13841323
13851324
13861325
13871326 @Callable(i)
13881327 func refreshDLp () = {
13891328 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
13901329 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
13911330 then unit
13921331 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
13931332 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
13941333 then {
13951334 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1396- let $t04909949163 = refreshDLpInternal(0, 0, 0)
1397- let dLpUpdateActions = $t04909949163._1
1398- let updatedDLp = $t04909949163._2
1335+ let $t04888148945 = refreshDLpInternal(0, 0, 0)
1336+ let dLpUpdateActions = $t04888148945._1
1337+ let updatedDLp = $t04888148945._2
13991338 let actions = if ((dLp != updatedDLp))
14001339 then dLpUpdateActions
14011340 else throwErr("nothing to refresh")
14021341 $Tuple2(actions, toString(updatedDLp))
14031342 }
14041343 else throw("Strict value is not equal to itself.")
14051344 }
14061345
14071346
14081347
14091348 @Callable(i)
14101349 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
14111350 let amId = toBase58String(value(cfgAmountAssetId))
14121351 let prId = toBase58String(value(cfgPriceAssetId))
14131352 let lpId = toBase58String(value(cfgLpAssetId))
14141353 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
14151354 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
14161355 let D0 = getD(xp)
14171356 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
14181357 let index = if ((outAssetId == amId))
14191358 then 0
14201359 else if ((outAssetId == prId))
14211360 then 1
14221361 else throw("invalid out asset id")
14231362 let newY = getYD(xp, index, D1)
14241363 let dy = (xp[index] - newY)
14251364 let totalGetRaw = max([0, toInt((dy - big1))])
1426- let $t05017350228 = takeFee(totalGetRaw, outFee)
1427- let totalGet = $t05017350228._1
1428- let feeAmount = $t05017350228._2
1365+ let $t04995550010 = takeFee(totalGetRaw, outFee)
1366+ let totalGet = $t04995550010._1
1367+ let feeAmount = $t04995550010._2
14291368 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
14301369 }
14311370
14321371
14331372
14341373 @Callable(i)
14351374 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
14361375 let amId = toBase58String(value(cfgAmountAssetId))
14371376 let prId = toBase58String(value(cfgPriceAssetId))
14381377 let lpId = toBase58String(value(cfgLpAssetId))
14391378 let amBalance = getAccBalance(amId)
14401379 let prBalance = getAccBalance(prId)
1441- let $t05060350718 = {
1380+ let $t05038550500 = {
14421381 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
14431382 if ($isInstanceOf(@, "(Int, Int)"))
14441383 then @
14451384 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
14461385 }
1447- let totalGet = $t05060350718._1
1448- let feeAmount = $t05060350718._2
1386+ let totalGet = $t05038550500._1
1387+ let feeAmount = $t05038550500._2
14491388 let r = ego("", lpId, lpAssetAmount, this)
14501389 let outAmAmt = r._1
14511390 let outPrAmt = r._2
14521391 let sumOfGetAssets = (outAmAmt + outPrAmt)
14531392 let bonus = if ((sumOfGetAssets == 0))
14541393 then if ((totalGet == 0))
14551394 then 0
14561395 else throw("bonus calculation error")
14571396 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
14581397 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
14591398 }
14601399
14611400
14621401
14631402 @Callable(i)
14641403 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
14651404 let r = cg(i)
14661405 let outAmAmt = r._1
14671406 let outPrAmt = r._2
14681407 let pmtAmt = r._3
14691408 let pmtAssetId = r._4
14701409 let state = r._5
14711410 if ((noLessThenAmtAsset > outAmAmt))
14721411 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
14731412 else if ((noLessThenPriceAsset > outPrAmt))
14741413 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
14751414 else {
14761415 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
14771416 if ((currentDLp == currentDLp))
14781417 then {
14791418 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14801419 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14811420 then {
1482- let $t05188451965 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1483- let refreshDLpActions = $t05188451965._1
1484- let updatedDLp = $t05188451965._2
1421+ let $t05166651747 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1422+ let refreshDLpActions = $t05166651747._1
1423+ let updatedDLp = $t05166651747._2
14851424 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14861425 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14871426 then (state ++ refreshDLpActions)
14881427 else throw("Strict value is not equal to itself.")
14891428 }
14901429 else throw("Strict value is not equal to itself.")
14911430 }
14921431 else throw("Strict value is not equal to itself.")
14931432 }
14941433 }
14951434
14961435
14971436
14981437 @Callable(i)
14991438 func unstakeAndGet (amount) = {
15001439 let checkPayments = if ((size(i.payments) != 0))
15011440 then throw("No pmnts expd")
15021441 else true
15031442 if ((checkPayments == checkPayments))
15041443 then {
15051444 let factoryCfg = gfc()
15061445 let lpAssetId = cfgLpAssetId
15071446 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
15081447 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
15091448 if ((currentDLp == currentDLp))
15101449 then {
15111450 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
15121451 if ((unstakeInv == unstakeInv))
15131452 then {
15141453 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
15151454 let outAmAmt = r._1
15161455 let outPrAmt = r._2
15171456 let sts = parseIntValue(r._9)
15181457 let state = r._10
15191458 let v = if (if (igs())
15201459 then true
15211460 else (sts == PoolShutdown))
15221461 then throw(("Blocked: " + toString(sts)))
15231462 else true
15241463 if ((v == v))
15251464 then {
15261465 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15271466 if ((burnA == burnA))
15281467 then {
1529- let $t05299253073 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1530- let refreshDLpActions = $t05299253073._1
1531- let updatedDLp = $t05299253073._2
1468+ let $t05277452855 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1469+ let refreshDLpActions = $t05277452855._1
1470+ let updatedDLp = $t05277452855._2
15321471 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15331472 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15341473 then (state ++ refreshDLpActions)
15351474 else throw("Strict value is not equal to itself.")
15361475 }
15371476 else throw("Strict value is not equal to itself.")
15381477 }
15391478 else throw("Strict value is not equal to itself.")
15401479 }
15411480 else throw("Strict value is not equal to itself.")
15421481 }
15431482 else throw("Strict value is not equal to itself.")
15441483 }
15451484 else throw("Strict value is not equal to itself.")
15461485 }
15471486
15481487
15491488
15501489 @Callable(i)
15511490 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
15521491 let isGetDisabled = if (igs())
15531492 then true
15541493 else (cfgPoolStatus == PoolShutdown)
15551494 let checks = [if (!(isGetDisabled))
15561495 then true
15571496 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15581497 then true
15591498 else throw("no payments are expected")]
15601499 if ((checks == checks))
15611500 then {
15621501 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
15631502 if ((currentDLp == currentDLp))
15641503 then {
15651504 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
15661505 if ((unstakeInv == unstakeInv))
15671506 then {
15681507 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
15691508 let outAmAmt = res._1
15701509 let outPrAmt = res._2
15711510 let state = res._10
15721511 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
15731512 then true
15741513 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
15751514 then true
15761515 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
15771516 if ((checkAmounts == checkAmounts))
15781517 then {
15791518 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15801519 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15811520 then {
1582- let $t05432454405 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1583- let refreshDLpActions = $t05432454405._1
1584- let updatedDLp = $t05432454405._2
1521+ let $t05410654187 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1522+ let refreshDLpActions = $t05410654187._1
1523+ let updatedDLp = $t05410654187._2
15851524 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15861525 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15871526 then (state ++ refreshDLpActions)
15881527 else throw("Strict value is not equal to itself.")
15891528 }
15901529 else throw("Strict value is not equal to itself.")
15911530 }
15921531 else throw("Strict value is not equal to itself.")
15931532 }
15941533 else throw("Strict value is not equal to itself.")
15951534 }
15961535 else throw("Strict value is not equal to itself.")
15971536 }
15981537 else throw("Strict value is not equal to itself.")
15991538 }
16001539
16011540
16021541
16031542 @Callable(i)
16041543 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
16051544 let isPoolOneTokenOperationsDisabled = {
16061545 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
16071546 if ($isInstanceOf(@, "Boolean"))
16081547 then @
16091548 else throw(($getType(@) + " couldn't be cast to Boolean"))
16101549 }
16111550 let isGetDisabled = if (if (igs())
16121551 then true
16131552 else (cfgPoolStatus == PoolShutdown))
16141553 then true
16151554 else isPoolOneTokenOperationsDisabled
16161555 let checks = [if (if (!(isGetDisabled))
16171556 then true
16181557 else isManager(i))
16191558 then true
16201559 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
16211560 then true
16221561 else throwErr("no payments are expected")]
16231562 if ((checks == checks))
16241563 then {
16251564 let factoryCfg = gfc()
16261565 let lpAssetId = cfgLpAssetId
16271566 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
16281567 let userAddress = i.caller
16291568 let lpAssetRecipientAddress = this
16301569 let unstakeInv = invoke(staking, "unstakeINTERNAL", [lpAssetId, unstakeAmount, userAddress.bytes, lpAssetRecipientAddress.bytes], nil)
16311570 if ((unstakeInv == unstakeInv))
16321571 then {
1633- let $t05542755615 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1634- let state = $t05542755615._1
1635- let totalAmount = $t05542755615._2
1572+ let $t05520955397 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1573+ let state = $t05520955397._1
1574+ let totalAmount = $t05520955397._2
16361575 $Tuple2(state, totalAmount)
16371576 }
16381577 else throw("Strict value is not equal to itself.")
16391578 }
16401579 else throw("Strict value is not equal to itself.")
16411580 }
16421581
16431582
16441583
16451584 @Callable(i)
16461585 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1647- let $t05574355846 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1648- let lpAmount = $t05574355846._1
1649- let state = $t05574355846._2
1650- let feeAmount = $t05574355846._3
1651- let bonus = $t05574355846._4
1586+ let $t05552555628 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1587+ let lpAmount = $t05552555628._1
1588+ let state = $t05552555628._2
1589+ let feeAmount = $t05552555628._3
1590+ let bonus = $t05552555628._4
16521591 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16531592 }
16541593
16551594
16561595
16571596 @Callable(i)
16581597 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1659- let $t05599456098 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1660- let lpAmount = $t05599456098._1
1661- let state = $t05599456098._2
1662- let feeAmount = $t05599456098._3
1663- let bonus = $t05599456098._4
1598+ let $t05577655880 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1599+ let lpAmount = $t05577655880._1
1600+ let state = $t05577655880._2
1601+ let feeAmount = $t05577655880._3
1602+ let bonus = $t05577655880._4
16641603 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16651604 }
16661605
16671606
16681607
16691608 @Callable(i)
16701609 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
16711610 then throw("denied")
16721611 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr), StringEntry(amp(), toString(ampInitial))], "success")
16731612
16741613
16751614
16761615 @Callable(i)
16771616 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
16781617
16791618
16801619
16811620 @Callable(i)
16821621 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
16831622
16841623
16851624
16861625 @Callable(i)
16871626 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
16881627 let pr = calcPrices(amAmt, prAmt, lpAmt)
16891628 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
16901629 }
16911630
16921631
16931632
16941633 @Callable(i)
16951634 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
16961635
16971636
16981637
16991638 @Callable(i)
17001639 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
17011640
17021641
17031642
17041643 @Callable(i)
17051644 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
17061645
17071646
17081647
17091648 @Callable(i)
17101649 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
17111650
17121651
17131652
17141653 @Callable(i)
17151654 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
17161655 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
17171656 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
17181657 }
17191658
17201659
17211660
17221661 @Callable(i)
17231662 func changeAmp () = {
17241663 let cfg = invoke(fca, "getChangeAmpConfigREADONLY", [toString(this)], nil)
1725- let $t05850758706 = match cfg {
1664+ let $t05828958488 = match cfg {
17261665 case list: List[Any] =>
17271666 $Tuple3({
17281667 let @ = list[0]
17291668 if ($isInstanceOf(@, "Int"))
17301669 then @
17311670 else throw(($getType(@) + " couldn't be cast to Int"))
17321671 }, {
17331672 let @ = list[1]
17341673 if ($isInstanceOf(@, "Int"))
17351674 then @
17361675 else throw(($getType(@) + " couldn't be cast to Int"))
17371676 }, {
17381677 let @ = list[2]
17391678 if ($isInstanceOf(@, "Int"))
17401679 then @
17411680 else throw(($getType(@) + " couldn't be cast to Int"))
17421681 })
17431682 case _ =>
17441683 throwErr("invalid entry type")
17451684 }
1746- let delay = $t05850758706._1
1747- let delta = $t05850758706._2
1748- let target = $t05850758706._3
1685+ let delay = $t05828958488._1
1686+ let delta = $t05828958488._2
1687+ let target = $t05828958488._3
17491688 let curAmp = parseIntValue(getStringValue(amp()))
17501689 let newAmpRaw = (curAmp + delta)
17511690 let newAmp = if ((0 > delta))
17521691 then if ((target > newAmpRaw))
17531692 then target
17541693 else newAmpRaw
17551694 else if ((newAmpRaw > target))
17561695 then target
17571696 else newAmpRaw
17581697 let lastCall = valueOrElse(getInteger(keyChangeAmpLastCall()), 0)
17591698 let wait = (lastCall + delay)
17601699 let checks = [if ((height > wait))
17611700 then true
17621701 else throwErr("try again in few blocks"), if ((curAmp != newAmp))
17631702 then true
17641703 else throwErr("already reached target")]
17651704 if ((checks == checks))
17661705 then [IntegerEntry(keyChangeAmpLastCall(), height), StringEntry(amp(), toString(newAmp)), StringEntry(keyAmpHistory(height), toString(newAmp))]
17671706 else throw("Strict value is not equal to itself.")
17681707 }
17691708
17701709
17711710 @Verifier(tx)
17721711 func verify () = {
17731712 let targetPublicKey = match m() {
17741713 case pk: ByteVector =>
17751714 pk
17761715 case _: Unit =>
17771716 tx.senderPublicKey
17781717 case _ =>
17791718 throw("Match error")
17801719 }
17811720 match tx {
17821721 case order: Order =>
17831722 let matcherPub = mp()
1784- let $t05961859735 = if (skipOrderValidation())
1723+ let $t05940059517 = if (skipOrderValidation())
17851724 then $Tuple2(true, "")
17861725 else validateMatcherOrderAllowed(order)
1787- let orderValid = $t05961859735._1
1788- let orderValidInfo = $t05961859735._2
1726+ let orderValid = $t05940059517._1
1727+ let orderValidInfo = $t05940059517._2
17891728 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17901729 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17911730 if (if (if (orderValid)
17921731 then senderValid
17931732 else false)
17941733 then matcherValid
17951734 else false)
17961735 then true
17971736 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
17981737 case s: SetScriptTransaction =>
17991738 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
18001739 then true
18011740 else {
18021741 let newHash = blake2b256(value(s.script))
18031742 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
18041743 let currentHash = scriptHash(this)
18051744 if ((allowedHash == newHash))
18061745 then (currentHash != newHash)
18071746 else false
18081747 }
18091748 case _ =>
18101749 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
18111750 }
18121751 }
18131752

github/deemru/w8io/6500d08 
366.69 ms