tx · 8RSd6zegp2ZJcGPYj16ySkvqgEvRjnUrx3PjBkbXt8n5

3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt:  -0.05400000 Waves

2023.08.02 14:01 [2692868] smart account 3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt > SELF 0.00000000 Waves

{ "type": 13, "id": "8RSd6zegp2ZJcGPYj16ySkvqgEvRjnUrx3PjBkbXt8n5", "fee": 5400000, "feeAssetId": null, "timestamp": 1690974088197, "version": 2, "chainId": 84, "sender": "3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt", "senderPublicKey": "3fNYAZ872D7hsaic3sPDZd5uAk59U5CiWiA153FUZ6Qv", "proofs": [ "4Fbg9uDLwAZ9vuyNWAd98VVfLciWrFsZ1kBnP4RvJSigk6Lp5yoeJ67R1wTdMXFNA7Kd6X8eMTNMCcwWAkeCRriB" ], "script": "base64:BgJnCAISDgoMGBgBAQgIAQEBAQEIEgMKAQESAwoBARIAEgQKAggBEgQKAggBEgMKAQESBAoCCAESAwoBARIECgIIARIFCgMICAESAwoBCBIDCgEIEgASAwoBARIECgIIGBIAEgASAwoBCHEAA1NFUAICX18ABVdBVkVTAgV3YXZlcwAHTUFYX0lOVAD//////////38AB01BWF9GRUUAwIQ9AA1NQVhfQU1QTElGSUVSAMCEPQAUTUFYX1dFSUdIVF9BTVBMSUZJRVIAwIQ9AApNQVhfV0VJR0hUAMCEPQAUU0xJUFBBR0VfUkFURV9GQUNUT1IAwIQ9AA9GRUVfUkFURV9GQUNUT1IAwIQ9AAtSQVRFX0ZBQ1RPUgDAhD0ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgKCUpY0dABBaRVJPX0lOVF9MSVNUXzEwCQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAUDbmlsABBaRVJPX0lOVF9MSVNUXzExCQDNCAIFEFpFUk9fSU5UX0xJU1RfMTAAAAALWkVST19CSUdJTlQJALYCAQAAABNaRVJPX0JJR0lOVF9MSVNUXzExCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UBQNuaWwADElOVF9ERUNJTUFMUwAIAA9CSUdJTlRfREVDSU1BTFMAEgAJUFJFQ0lTSU9OAMCEPQAHTElTVF82NAkAvQkCAn8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wAgFfAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMACktFWV9QQVVTRUQCBlBBVVNFRAAKS0VZX1BBVVNFUgIGUEFVU0VSAAtLRVlfU1RPUkFHRQIHU1RPUkFHRQAKS0VZX0FTU0VUUwIGQVNTRVRTABJLRVlfQVNTRVRfQkFMQU5DRVMCDkFTU0VUX0JBTEFOQ0VTABFLRVlfQVNTRVRfV0VJR0hUUwINQVNTRVRfV0VJR0hUUwAKS0VZX0xQX0ZFRQIGTFBfRkVFABBLRVlfUFJPVE9DT0xfRkVFAgxQUk9UT0NPTF9GRUUAFEtFWV9TSUdNQV9GRUVfUEVSX0xQAhBTSUdNQV9GRUVfUEVSX0xQABlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQAhVVU0VSX1NJR01BX0ZFRV9QRVJfTFAAC0tFWV9VU0VSX0xQAgdVU0VSX0xQAAxLRVlfVE9UQUxfTFACCFRPVEFMX0xQABBLRVlfVVNFUl9QUk9GSVRTAgxVU0VSX1BST0ZJVFMBEF92YWxpZGF0ZUFkZHJlc3MCCGFkZHJlc3NfBGVycl8EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQ5fdmFsaWRhdGVBc3NldAIIYXNzZXRJZF8EZXJyXwMJAAACBQhhc3NldElkXwUFV0FWRVMGBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBDV92YWxpZGF0ZUJvb2wDBHZhbF8HdGFyZ2V0XwRlcnJfAwkBAiE9AgUEdmFsXwUHdGFyZ2V0XwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFdmFsMV8FdmFsMl8EZXJyXwMJAAACBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEQX3ZhbGlkYXRlSW50TGlzdAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAckbWF0Y2gwCQC2CQEFBGVsZW0DCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwAwUDYWNjCQEMX3ZhbGlkYXRlSW50BAUBYQUObG93ZXJCb3VuZGFyeV8FDnVwcGVyQm91bmRhcnlfBQRlcnJfBwkAAgEFBGVycl8KAAIkbAUEdmFsXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEPX3ZhbGlkYXRlQXNzZXRzAgdhc3NldHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0DBQNhY2MJAQ5fdmFsaWRhdGVBc3NldAIFBGVsZW0FBGVycl8HCgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEl92YWxpZGF0ZUludEVxdWFscwMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARJfdmFsaWRhdGVUb2tlbk5hbWUCBHZhbF8EZXJyXwMDCQBmAgAECQCxAgEFBHZhbF8GCQBmAgkAsQIBBQR2YWxfABAJAAIBBQRlcnJfBgETX3ZhbGlkYXRlVG9rZW5EZXNjcgIEdmFsXwRlcnJfAwkAZgIJALECAQUEdmFsXwDoBwkAAgEFBGVycl8GARFfdmFsaWRhdGVEZWNpbWFscwIEdmFsXwRlcnJfAwMJAGYCAAAFBHZhbF8GCQBmAgUEdmFsXwAICQACAQUEZXJyXwYBEF92YWxpZGF0ZVBheW1lbnQECHBheW1lbnRfCGFzc2V0SWRfD3JlcXVpcmVkQW1vdW50XwRlcnJfBAckbWF0Y2gwCAUIcGF5bWVudF8HYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwAwkBAiE9AgUIYXNzZXRJZF8JANgEAQUBYQkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAMJAGYCBQ9yZXF1aXJlZEFtb3VudF8IBQhwYXltZW50XwZhbW91bnQJAAIBCQCsAgIFBGVycl8CCDogYW1vdW50BgkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwVsaXN0XwR2YWxfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQVsaXN0XwUEdmFsXwkAAgEFBGVycl8GAQtfYXNzZXRUb1N0cgEGYXNzZXRfBAckbWF0Y2gwBQZhc3NldF8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkA2AQBBQFhBQVXQVZFUwELX3N0clRvQXNzZXQBBmFzc2V0XwMDCQAAAgUGYXNzZXRfBQVXQVZFUwYJAAACBQZhc3NldF8CAAUEdW5pdAkA2QQBBQZhc3NldF8BCl9sb2FkUGF1c2UABAckbWF0Y2gwCQCgCAEFCktFWV9QQVVTRUQDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYQUHJG1hdGNoMAUBYQcBCl9zYXZlUGF1c2UBCWlzUGF1c2VkXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUKS0VZX1BBVVNFRAUJaXNQYXVzZWRfBQNuaWwBC19sb2FkUGF1c2VyAAQHJG1hdGNoMAkAoggBBQpLRVlfUEFVU0VSAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABC19zYXZlUGF1c2VyAQdwYXVzZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9QQVVTRVIJAKUIAQUHcGF1c2VyXwUDbmlsAQ1fbG9hZE11bHRpc2lnAAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVNdWx0aXNpZwEJbXVsdGlzaWdfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9NVUxUSVNJRwkApQgBBQltdWx0aXNpZ18FA25pbAEMX2xvYWRTdG9yYWdlAAQHJG1hdGNoMAkAoggBBQtLRVlfU1RPUkFHRQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAEBnN0cnVjdAkAtQkCBQFhBQNTRVAJAJwKCgkA2QQBCQCRAwIFBnN0cnVjdAAACQAAAgkAkQMCBQZzdHJ1Y3QAAQIBMQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAFCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAICQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBnN0cnVjdAAJCQCcCgoBAAcAAAAAAAAAAAAAAAAAAAkBB0FkZHJlc3MBAQABDF9zYXZlU3RvcmFnZQEIc3RvcmFnZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgULS0VZX1NUT1JBR0UJALkJAgkAzAgCCQDYBAEIBQhzdG9yYWdlXwJfMQkAzAgCAwgFCHN0b3JhZ2VfAl8yAgExAgEwCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl8zCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl80CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl81CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl82CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl83CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl84CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl85CQDMCAIJAKUIAQgFCHN0b3JhZ2VfA18xMAUDbmlsBQNTRVAFA25pbAELX2xvYWRBc3NldHMABAckbWF0Y2gwCQCiCAEFCktFWV9BU1NFVFMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACQC9CQIFAWEFA1NFUAUDbmlsBQNuaWwBC19zYXZlQXNzZXRzAQdhc3NldHNfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9BU1NFVFMJALsJAgUHYXNzZXRzXwUDU0VQBQNuaWwBEl9sb2FkQXNzZXRCYWxhbmNlcwAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EB2JhbGFuY2UJAQ1wYXJzZUludFZhbHVlAQUEZWxlbQkAlAoCCQDNCAIIBQNhY2MCXzEFB2JhbGFuY2UJAGQCCAUDYWNjAl8yBQdiYWxhbmNlBAckbWF0Y2gwCQCiCAEFEktFWV9BU1NFVF9CQUxBTkNFUwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQBmAgkAsQIBBQFhAAAKAAIkbAkAvQkCBQFhBQNTRVAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJ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IHJldmVydAYBEF93aGVuTXVsdGlzaWdTZXQAAwkAAAIJAQ1fbG9hZE11bHRpc2lnAAkBB0FkZHJlc3MBAQAJAAIBAhhfd2hlbk11bHRpc2lnU2V0OiByZXZlcnQGARNfd2hlbk5vdEluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQECIT0CCAUHc3RvcmFnZQJfMQEACQACAQIbX3doZW5Ob3RJbml0aWFsaXplZDogcmV2ZXJ0BgEQX3doZW5Jbml0aWFsaXplZAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UAAwkAAAIIBQdzdG9yYWdlAl8xAQAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBDF9nZXREZWNpbWFscwEIYXNzZXRJZF8EByRtYXRjaDAJAOwHAQkA2QQBBQhhc3NldElkXwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAgFAWEIZGVjaW1hbHMJAAIBCQCsAgICF19nZXREZWNpbWFsczogbm8gYXNzZXQ9BQhhc3NldElkXwESX25vcm1hbGl6ZURlY2ltYWxzBAdhbW91bnRfD3NvdXJjZURlY2ltYWxzXw90YXJnZXREZWNpbWFsc18Gcm91bmRfAwkAZwIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfCQBuBAUHYW1vdW50XwABCQBsBgAKAAAJAGUCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwAAAAAFBERPV04FBnJvdW5kXwkAaAIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3RhcmdldERlY2ltYWxzXwUPc291cmNlRGVjaW1hbHNfAAAAAAUERE9XTgEVX3ByZXBhcmVB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c3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQCUCgIIBQZyZXN1bHQCXzIIBQZyZXN1bHQCXzMBHF9pbmNyZW1lbnRCYWxhbmNlc0J5UGF5bWVudHMFCWJhbGFuY2VzXwlwYXltZW50c18HYXNzZXRzXwlkZWNpbWFsc18EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEB3BheW1lbnQJAJEDAgUJcGF5bWVudHNfBQVpbmRleAQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAUHcGF5bWVudAdhc3NldElkBANlcnIDCQECIT0CBQ9wYXltZW50QXNzZXRTdHIJAJEDAgUHYXNzZXRzXwUFaW5kZXgJAAIBCQCsAgIJAKwCAgUEZXJyXwIIOiBpbmRleD0JAKQDAQUFaW5kZXgFBHVuaXQDCQAAAgUDZXJyBQNlcnIEDWFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIECm5ld0JhbGFuY2UJAGQCBQRlbGVtCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAgUJcGF5bWVudHNfBQVpbmRleAZhbW91bnQFDWFzc2V0RGVjaW1hbHMFCWRlY2ltYWxzXwUERE9XTgkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQpuZXdCYWxhbmNlCQBkAggFA2FjYwJfMwUKbmV3QmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRz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YnJpdW1fBQhiYWxhbmNlXwQJdGhyZXNob2xkCQBrAwUMZXF1aWxpYnJpdW1fCQBlAgUUTUFYX1dFSUdIVF9BTVBMSUZJRVIFEHdlaWdodEFtcGxpZmllcl8FFE1BWF9XRUlHSFRfQU1QTElGSUVSAwkAZgIFCXRocmVzaG9sZAUIYmFsYW5jZV8EDG1heERldmlhdGlvbgkAZQIFCXRocmVzaG9sZAUIYmFsYW5jZV8EB2ZlZVJhdGUJAGsDCQBrAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQBmAgUHZmVlUmF0ZQULZmVlTWF4UmF0ZV8JAGsDBQxtYXhEZXZpYXRpb24FC2ZlZU1heFJhdGVfBQ9GRUVfUkFURV9GQUNUT1IJAGsDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgAABAl0aHJlc2hvbGQJAGsDBQxlcXVpbGlicml1bV8JAGQCBRRNQVhfV0VJR0hUX0FNUExJRklFUgUQd2VpZ2h0QW1wbGlmaWVyXwUUTUFYX1dFSUdIVF9BTVBMSUZJRVIDCQBmAgUIYmFsYW5jZV8FCXRocmVzaG9sZAQMbWF4RGV2aWF0aW9uCQBlAgUIYmFsYW5jZV8FCXRocmVzaG9sZAQHZmVlUmF0ZQkAawMJAGsDBQxtYXhEZXZpYXRpb24FDXNsaXBwYWdlUmF0ZV8FFFNMSVBQQUdFX1JBVEVfRkFDVE9SBQ9GRUVfUkFURV9GQUNUT1IFDGVxdWlsaWJyaXVtXwMJAGYCBQdmZWVSYXRlBQtmZWVNYXhSYXRlXwkAawMFDG1heERldmlhdGlvbgULZmVlTWF4UmF0ZV8FD0ZFRV9SQVRFX0ZBQ1RPUgkAawMFDG1heERldmlhdGlvbgUHZmVlUmF0ZQUPRkVFX1JBVEVfRkFDVE9SAAABDV9jYWxjdWxhdGVGZWUHCWJhbGFuY2VzXxJhc3NldHNUb3RhbFN1cHBseV8Id2VpZ2h0c18Mc2lnbWFXZWlnaHRfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwoBCGZvbGRGdW5jAgNhY2MHYmFsYW5jZQQFaW5kZXgIBQNhY2MCXzEEC2VxdWlsaWJyaXVtCQBrAwUSYXNzZXRzVG90YWxTdXBwbHlfCQCRAwIFCHdlaWdodHNfBQVpbmRleAUMc2lnbWFXZWlnaHRfCQCUCgIJAGQCBQVpbmRleAABCQBkAggFA2FjYwJfMgkBEl9jYWxjdWxhdGVNaWNyb0ZlZQUFB2JhbGFuY2UFC2VxdWlsaWJyaXVtBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwQGcmVzdWx0CgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCAUGcmVzdWx0Al8yARtfdmFsaWRhdGVMaXF1aWRpdHlJbnZhcmlhbnQLEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8OYXNzZXRCYWxhbmNlc18RYXNzZXRUb3RhbFN1cHBseV8ScHJldkxwVG90YWxTdXBwbHlfDmxwVG90YWxTdXBwbHlfDWFzc2V0V2VpZ2h0c18Mc2lnbWFXZWlnaHRfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwMDCQAAAgUScHJldkxwVG90YWxTdXBwbHlfAAAGCQAAAgUObHBUb3RhbFN1cHBseV8AAAYEDnByZXZBc3NldHNSYXRlCQBrAwkAZQIFFXByZXZBc3NldFRvdGFsU3VwcGx5XwkBDV9jYWxjdWxhdGVGZWUHBRJwcmV2QXNzZXRCYWxhbmNlc18FFXByZXZBc3NldFRvdGFsU3VwcGx5XwUNYXNzZXRXZWlnaHRzXwUMc2lnbWFXZWlnaHRfBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwULUkFURV9GQUNUT1IFEnByZXZMcFRvdGFsU3VwcGx5XwQNbmV3QXNzZXRzUmF0ZQkAawMJAGUCBRFhc3NldFRvdGFsU3VwcGx5XwkBDV9jYWxjdWxhdGVGZWUHBQ5hc3NldEJhbGFuY2VzXwURYXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SBQ5scFRvdGFsU3VwcGx5XwQEZGlmZgkAZQIFDW5ld0Fzc2V0c1JhdGUFDnByZXZBc3NldHNSYXRlAwMJAGcCAAAFBGRpZmYJAGYCCQBoAgD///////////8BBQtSQVRFX0ZBQ1RPUgUEZGlmZgcJAAIBCQCsAgICKl92YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8ECHByZXZVdGlsCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAduZXdVdGlsCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBARkaWZmCQBlAgUHbmV3VXRpbAUIcHJldlV0aWwDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEFC1JBVEVfRkFDVE9SBQRkaWZmBwkAAgEJAKwCAgIlX3ZhbGlkYXRlU3dhcEludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEYX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uBwhiYWxhbmNlXxFhc3NldFRvdGFsU3VwcGx5XwxwcmV2QmFsYW5jZV8VcHJldkFzc2V0VG90YWxTdXBwbHlfB3dlaWdodF8Mc2lnbWFXZWlnaHRfDG1heEFsbG9jQW1wXwQLZXF1aWxpYnJpdW0JAGsDBRFhc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBBBtYXhBbGxvY2F0aW9uQW1wAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQkAZAIFDU1BWF9BTVBMSUZJRVIFDG1heEFsbG9jQW1wXwkAZQIFDU1BWF9BTVBMSUZJRVIFDG1heEFsbG9jQW1wXwQNbWF4QWxsb2NhdGlvbgkAawMFC2VxdWlsaWJyaXVtBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSBBFwcmV2TWF4QWxsb2NhdGlvbgkAawMJAGsDBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FB3dlaWdodF8FDHNpZ21hV2VpZ2h0XwUQbWF4QWxsb2NhdGlvbkFtcAUNTUFYX0FNUExJRklFUgMJAGYCBQhiYWxhbmNlXwULZXF1aWxpYnJpdW0DCQBmAgUIYmFsYW5jZV8FDW1heEFsbG9jYXRpb24DCQBmAgURcHJldk1heEFsbG9jYXRpb24FDHByZXZCYWxhbmNlXwkAAgECIF92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogbmV3IHVwAwkAZgIJAGUCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgkAZQIFDHByZXZCYWxhbmNlXwURcHJldk1heEFsbG9jYXRpb24JAAIBAiJfdmFsaWRhdGVBc3NldEFsbG9jYXRpb246IHN0aWxsIHVwBgYDCQBmAgUNbWF4QWxsb2NhdGlvbgUIYmFsYW5jZV8DCQBmAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogbmV3IGRvd24DCQBmAgkAZQIFEXByZXZNYXhBbGxvY2F0aW9uBQxwcmV2QmFsYW5jZV8JAGUCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwkAAgECJF92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgZG93bgYGARNfdmFsaWRhdGVBbGxvY2F0aW9uBw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5XxJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDWFzc2V0V2VpZ2h0c18Mc2lnbWFXZWlnaHRfDG1heEFsbG9jQW1wXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEJAJQKAgkAZAIFBWluZGV4AAEDCAUDYWNjAl8yCQEYX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uBwUEZWxlbQURYXNzZXRUb3RhbFN1cHBseV8JAJEDAgUScHJldkFzc2V0QmFsYW5jZXNfBQVpbmRleAUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQCRAwIFDWFzc2V0V2VpZ2h0c18FBWluZGV4BQxzaWdtYVdlaWdodF8FDG1heEFsbG9jQW1wXwcEBnJlc3VsdAoAAiRsBQ5hc3NldEJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBC19jaGVja3BvaW50AQV1c2VyXwQGdXNlckxwCQELX2xvYWRVc2VyTHABBQV1c2VyXwQLdXNlclByb2ZpdHMJARBfbG9hZFVzZXJQcm9maXRzAQUFdXNlcl8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABBF1c2VyU2lnbWFGZWVQZXJMcAkBFl9sb2FkVXNlclNpZ21hRmVlUGVyTHABBQV1c2VyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEDXByb2ZpdFVwZGF0ZWQJAGQCCQCRAwIFC3VzZXJQcm9maXRzBQVpbmRleAkAoAMBCQC8AgMJALYCAQUGdXNlckxwCQC4AgIJAJEDAgUNc2lnbWFGZWVQZXJMcAUFaW5kZXgJAJEDAgURdXNlclNpZ21hRmVlUGVyTHAFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQ1wcm9maXRVcGRhdGVkBA0kdDAyNDQ3MTI0NTQ0CgACJGwFEFpFUk9fSU5UX0xJU1RfMTEKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDAyNDQ3MTI0NTQ0Al8xBA5wcm9maXRzVXBkYXRlZAgFDSR0MDI0NDcxMjQ1NDQCXzIJAJQKAgkAzggCCQEQX3NhdmVVc2VyUHJvZml0cwIFBXVzZXJfBQ5wcm9maXRzVXBkYXRlZAkBFl9zYXZlVXNlclNpZ21hRmVlUGVyTHACBQV1c2VyXwUNc2lnbWFGZWVQZXJMcAUOcHJvZml0c1VwZGF0ZWQBFF91cGRhdGVTaWdtYUZlZVBlckxwBA5zaWdtYUZlZVBlckxwXwh0b3RhbExwXwZpbmRleF8GbHBGZWVfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQDCQAAAgUGaW5kZXhfBQVpbmRleAkAtwICCQCRAwIFDnNpZ21hRmVlUGVyTHBfBQVpbmRleAkAvAIDCQC2AgEFBmxwRmVlXwUOUEVSQ0VOVF9GQUNUT1IJALYCAQUIdG90YWxMcF8JAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBA0kdDAyNTE5NDI1MjczCgACJGwFEFpFUk9fSU5UX0xJU1RfMTEKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDAyNTE5NDI1MjczAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDI1MTk0MjUyNzMCXzIFFHNpZ21hRmVlUGVyTHBVcGRhdGVkARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMFC2Fzc2V0SW5kZXhfB2Ftb3VudF8KbHBGZWVSYXRlXxBwcm90b2NvbEZlZVJhdGVfDWlzRnVsbEFtb3VudF8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjU1MTgyNjIyNgMFDWlzRnVsbEFtb3VudF8DCQAAAgUHdG90YWxMcAAACQCUCgIAAAkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUJAJQKAgkAawMFB2Ftb3VudF8FCmxwRmVlUmF0ZV8FB01BWF9GRUUJAGsDBQdhbW91bnRfBRBwcm90b2NvbEZlZVJhdGVfBQdNQVhfRkVFAwkAAAIFB3RvdGFsTHAAAAkAlAoCAAAJAGsDBQdhbW91bnRfBRBwcm90b2NvbEZlZVJhdGVfCQBlAgUHTUFYX0ZFRQUQcHJvdG9jb2xGZWVSYXRlXwkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwkAZQIJAGUCBQdNQVhfRkVFBQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfCQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwkAZQIJAGUCBQdNQVhfRkVFBQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfBAVscEZlZQgFDSR0MDI1NTE4MjYyMjYCXzEEC3Byb3RvY29sRmVlCAUNJHQwMjU1MTgyNjIyNgJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQDCQAAAgUFbHBGZWUAAAUNc2lnbWFGZWVQZXJMcAkBFF91cGRhdGVTaWdtYUZlZVBlckxwBAUNc2lnbWFGZWVQZXJMcAUHdG90YWxMcAULYXNzZXRJbmRleF8FBWxwRmVlCQCVCgMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBC19kZXBvc2l0QWxsAQdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI2NzM1MjY3ODgJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI2NzM1MjY3ODgCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjY3MzUyNjc4OAJfMgQNJHQwMjY3OTMyNjg2MQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjY3OTMyNjg2MQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNjc5MzI2ODYxAl8yBA0kdDAyNjg2NzI4MDk3AwkAAAIFFHByZXZBc3NldFRvdGFsU3VwcGx5AAAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAGsDCQCRAwIFDGFzc2V0V2VpZ2h0cwUFaW5kZXgFB2Ftb3VudF8FC3NpZ21hV2VpZ2h0CQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAQNJHQwMjczMDkyNzM4MwoAAiRsBQZhc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwMjczMDkyNzM4MwJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3MzA5MjczODMCXzIJAJQKAgUHYW1vdW50XwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQFcmF0aW8JALwCAwkAtgIBBQdhbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBRRwcmV2QXNzZXRUb3RhbFN1cHBseQoBCWZvbGRGdW5jMQIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAKADAQkAvAIDBQVyYXRpbwkAtgIBCQCRAwIFEXByZXZBc3NldEJhbGFuY2VzBQVpbmRleAUOUEVSQ0VOVF9GQUNUT1IJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNzkyNjI4MDAxCgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWZvbGRGdW5jMQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwMjc5MjYyODAwMQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3OTI2MjgwMDECXzIJAJQKAgkAawMFB2Ftb3VudF8FDWxwVG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDI2ODY3MjgwOTcCXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAyNjg2NzI4MDk3Al8yBA0kdDAyODEwMzI4MjE2CQEbX2luY3JlbWVudEJhbGFuY2VzQnlBbW91bnRzAgURcHJldkFzc2V0QmFsYW5jZXMFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDWFzc2V0QmFsYW5jZXMIBQ0kdDAyODEwMzI4MjE2Al8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwMjgxMDMyODIxNgJfMgQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZAIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9NaW50BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9NaW50BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQhfZGVwb3NpdAIIYXNzZXRJZF8HYW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI4OTExMjg5NjQJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI4OTExMjg5NjQCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjg5MTEyODk2NAJfMgQNJHQwMjg5NjkyOTA4MwkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjg5NjkyOTA4MwJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODk2OTI5MDgzAl8yBA1hc3NldEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwUHYW1vdW50XwQQYXNzZXRUb3RhbFN1cHBseQkAZAIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdhbW91bnRfBARlcnIyCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAURbWF4QWxsb2NBbXBsaWZpZXIDCQAAAgUEZXJyMgUEZXJyMgQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEDmxwVG9rZW5zVG9NaW50AwkAAAIFDWxwVG90YWxTdXBwbHkAAAkAZQIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQQJYXNzZXREaWZmCQBlAgUQYXNzZXRUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkEB2ZlZURpZmYJAGUCBQNmZWUFB3ByZXZGZWUEE3V0aWxpdHlDaGFuZ2VGYWN0b3IJAGsDCQBlAgUJYXNzZXREaWZmBQdmZWVEaWZmBQtSQVRFX0ZBQ1RPUgkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdwcmV2RmVlBBNscFRva2Vuc1RvTWludElubmVyCQBrAwUNbHBUb3RhbFN1cHBseQUTdXRpbGl0eUNoYW5nZUZhY3RvcgULUkFURV9GQUNUT1IEBGVycjMJARtfdmFsaWRhdGVMaXF1aWRpdHlJbnZhcmlhbnQLBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDWxwVG90YWxTdXBwbHkJAGQCBQ1scFRvdGFsU3VwcGx5BRNscFRva2Vuc1RvTWludElubmVyBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIzBQRlcnIzBRNscFRva2Vuc1RvTWludElubmVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDmxwVG9rZW5zVG9NaW50BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzEwMTAzMTA3OAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzEwMTAzMTA3OAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMTAxMDMxMDc4Al8yBA0kdDAzMTA4MzMxMTM2CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMTA4MzMxMTM2Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMxMDgzMzExMzYCXzIEDSR0MDMxMTQyMzEyNjQJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMFAAAFB2Ftb3VudF8FCWxwRmVlUmF0ZQUPcHJvdG9jb2xGZWVSYXRlBgQFbHBGZWUIBQ0kdDAzMTE0MjMxMjY0Al8xBAtwcm90b2NvbEZlZQgFDSR0MDMxMTQyMzEyNjQCXzIEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMzExNDIzMTI2NAJfMwQObHBUb2tlbnNUb0J1cm4JAGUCCQBlAgUHYW1vdW50XwUFbHBGZWUFC3Byb3RvY29sRmVlBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQdNQVhfSU5UAihfd2l0aGRyYXdBbGw6IGxwVG9rZW5zVG9CdXJuIGxlc3MgdGhhbiAwAwkAAAIFA2VycgUDZXJyBA0kdDAzMTQyNzMxNTYwCQEcX2RlY3JlbWVudEJhbGFuY2VzQnlMcEFtb3VudAMFEXByZXZBc3NldEJhbGFuY2VzBQ5scFRva2Vuc1RvQnVybgUNbHBUb3RhbFN1cHBseQQNYXNzZXRCYWxhbmNlcwgFDSR0MDMxNDI3MzE1NjACXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMTQyNzMxNTYwAl8yBA1iYWxhbmNlc1RvUGF5CAUNJHQwMzE0MjczMTU2MAJfMwQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9CdXJuBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCYCgYFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDMyNDk5MzI1NjcJARJfbG9hZEFzc2V0QmFsYW5jZXMABBFwcmV2QXNzZXRCYWxhbmNlcwgFDSR0MDMyNDk5MzI1NjcCXzEEFHByZXZBc3NldFRvdGFsU3VwcGx5CAUNJHQwMzI0OTkzMjU2NwJfMgQNJHQwMzI1NzIzMjY3NwkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMzI1NzIzMjY3NwJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAzMjU3MjMyNjc3Al8yBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMEBQdhbW91bnRfBQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBAphc3NldEluZGV4CQEFdmFsdWUBCQDPCAIFBmFzc2V0cwUIYXNzZXRJZF8EDWFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwUKYXNzZXRJbmRleAUQYW1vdW50Tm9ybWFsaXplZAQQYXNzZXRUb3RhbFN1cHBseQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BRBhbW91bnROb3JtYWxpemVkBARlcnIxCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAURbWF4QWxsb2NBbXBsaWZpZXIDCQAAAgUEZXJyMQUEZXJyMQQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEDmxwVG9rZW5zVG9CdXJuAwkAAAIFDWxwVG90YWxTdXBwbHkAAAkAZQIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQQJYXNzZXREaWZmCQBlAgUQYXNzZXRUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkEB2ZlZURpZmYJAGUCBQNmZWUFB3ByZXZGZWUEE3V0aWxpdHlDaGFuZ2VGYWN0b3IJAGsDCQBlAgUJYXNzZXREaWZmBQdmZWVEaWZmBQtSQVRFX0ZBQ1RPUgkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdwcmV2RmVlBBNscFRva2Vuc1RvQnVybklubmVyCQBoAgD///////////8BCQBrAwUNbHBUb3RhbFN1cHBseQUTdXRpbGl0eUNoYW5nZUZhY3RvcgULUkFURV9GQUNUT1IEBGVycjIJARtfdmFsaWRhdGVMaXF1aWRpdHlJbnZhcmlhbnQLBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDWxwVG90YWxTdXBwbHkJAGUCBQ1scFRvdGFsU3VwcGx5BRNscFRva2Vuc1RvQnVybklubmVyBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyBRNscFRva2Vuc1RvQnVybklubmVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAzNDQ0MDM0NTYzCQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBQAABQdhbW91bnRfBQlscEZlZVJhdGUFD3Byb3RvY29sRmVlUmF0ZQcEBWxwRmVlCAUNJHQwMzQ0NDAzNDU2MwJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAzNDQ0MDM0NTYzAl8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDM0NDQwMzQ1NjMCXzMJAJcKBQUObHBUb2tlbnNUb0J1cm4FDWFzc2V0QmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BBV9zd2FwAxFzb3VyY2VBc3NldEluZGV4XxF0YXJnZXRBc3NldEluZGV4Xw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzUxMDYzNTE3NAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzUxMDYzNTE3NAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNTEwNjM1MTc0Al8yBA0kdDAzNTE3OTM1MjMyCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNTE3OTM1MjMyAl8xBAtzaWdtYVdlaWdodAgFDSR0MDM1MTc5MzUyMzICXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJAGQCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNc291cmNlQW1vdW50XwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBAxyZWZVdGlsVmFsdWUJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQQFc3RhcnQAAAQEc3RvcAkAZAIFDXNvdXJjZUFtb3VudF8FB3ByZXZGZWUKAQhmb2xkRnVuYwIDYWNjBGVsZW0DCAUDYWNjAl8xBQNhY2MECnN0YXJ0SW5uZXIIBQNhY2MCXzIECXN0b3BJbm5lcggFA2FjYwJfMwQNY3VycmVudEFtb3VudAkAaQIJAGQCBQlzdG9wSW5uZXIFCnN0YXJ0SW5uZXIAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQ1jdXJyZW50QW1vdW50BAl1dGlsVmFsdWUJAGUCBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwMJAGYCBQlQUkVDSVNJT04JAGUCBQl1dGlsVmFsdWUFDHJlZlV0aWxWYWx1ZQkAZgIJAGUCBQl1dGlsVmFsdWUFDHJlZlV0aWxWYWx1ZQAABwkAlgoEBgUKc3RhcnRJbm5lcgUJc3RvcElubmVyBQ1jdXJyZW50QW1vdW50AwkAZgIAAAkAZQIFCXV0aWxWYWx1ZQUMcmVmVXRpbFZhbHVlCQCWCgQHBQpzdGFydElubmVyBQ1jdXJyZW50QW1vdW50AAAJAJYKBAcFDWN1cnJlbnRBbW91bnQFCXN0b3BJbm5lcgAABAx0YXJnZXRBbW91bnQEDHRhcmdldEFtb3VudAUNc291cmNlQW1vdW50XwQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBR0ZW1wQXNzZXRUb3RhbFN1cHBseQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFDHRhcmdldEFtb3VudAQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEB2ZlZURpZmYJAGUCBQNmZWUFB3ByZXZGZWUDCQAAAgUHZmVlRGlmZgAABQx0YXJnZXRBbW91bnQEDSR0MDM3NjIwMzc3MjQKAAIkbAUHTElTVF82NAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAcFBXN0YXJ0BQRzdG9wAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2NAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBABAdzdWNjZXNzCAUNJHQwMzc2MjAzNzcyNAJfMQQIc3RhcnRPdXQIBQ0kdDAzNzYyMDM3NzI0Al8yBAdzdG9wT3V0CAUNJHQwMzc2MjAzNzcyNAJfMwQPdGFyZ2V0QW1vdW50T3V0CAUNJHQwMzc2MjAzNzcyNAJfNAMJAQEhAQUHc3VjY2VzcwkAAgEJAKwCAgIkX3N3YXA6IGNhbid0IGNhbGN1bGF0ZSB0YXJnZXRBbW91bnQ9CQCkAwEFD3RhcmdldEFtb3VudE91dAUPdGFyZ2V0QW1vdW50T3V0BBJmaW5hbEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBVmaW5hbEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDAzODUzNzM4Njg0CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBQkAZAIFEXRhcmdldEFzc2V0SW5kZXhfAAEFDHRhcmdldEFtb3VudAUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUGBAVscEZlZQgFDSR0MDM4NTM3Mzg2ODQCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzg1MzczODY4NAJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzODUzNzM4Njg0Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuEwFpAQRpbml0DAdhc3NldHNfDWFzc2V0V2VpZ2h0c18KbHBGZWVSYXRlXxBwcm90b2NvbEZlZVJhdGVfDGxwVG9rZW5OYW1lXw1scFRva2VuRGVzY3JfEGxwVG9rZW5EZWNpbWFsc18XbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfFHByb3RvY29sRmVlQ29udHJhY3RfBANlcnIDAwMDAwMDAwMDAwMDCQETX3doZW5Ob3RJbml0aWFsaXplZAAJAQ9fdmFsaWRhdGVBc3NldHMCBQdhc3NldHNfAhRpbml0OiBpbnZhbGlkIGFzc2V0cwcJARBfdmFsaWRhdGVJbnRMaXN0BAUNYXNzZXRXZWlnaHRzXwAABQpNQVhfV0VJR0hUAhppbml0OiBpbnZhbGlkIGFzc2V0V2VpZ2h0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEFB2Fzc2V0c18JAJADAQUNYXNzZXRXZWlnaHRzXwIfaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMgc2l6ZQcJAQxfdmFsaWRhdGVJbnQEBQpscEZlZVJhdGVfAAAFB01BWF9GRUUCFGluaXQ6IGludmFsaWQgbHAgZmVlBwkBDF92YWxpZGF0ZUludAQFEHByb3RvY29sRmVlUmF0ZV8AAAUHTUFYX0ZFRQIaaW5pdDogaW52YWxpZCBwcm90b2NvbCBmZWUHCQESX3ZhbGlkYXRlVG9rZW5OYW1lAgUMbHBUb2tlbk5hbWVfAhJpbml0OiBpbnZhbGlkIG5hbWUHCQETX3ZhbGlkYXRlVG9rZW5EZXNjcgIFDWxwVG9rZW5EZXNjcl8CE2luaXQ6IGludmFsaWQgZGVzY3IHCQERX3ZhbGlkYXRlRGVjaW1hbHMCBRBscFRva2VuRGVjaW1hbHNfAhZpbml0OiBpbnZhbGlkIGRlY2ltYWxzBwkBDF92YWxpZGF0ZUludAQFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAAAFDU1BWF9BTVBMSUZJRVICJGluaXQ6IGludmFsaWQgbWF4QWxsb2NhdGlvbkFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRB3ZWlnaHRBbXBsaWZpZXJfAAAFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAh1pbml0OiBpbnZhbGlkIHdlaWdodEFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBQ1zbGlwcGFnZVJhdGVfAAAFB01BWF9JTlQCGmluaXQ6IGludmFsaWQgc2xpcHBhZ2VSYXRlBwkBDF92YWxpZGF0ZUludAQFC2ZlZU1heFJhdGVfAAAFB01BWF9JTlQCGGluaXQ6IGludmFsaWQgZmVlTWF4UmF0ZQcJARBfdmFsaWRhdGVBZGRyZXNzAgUUcHJvdG9jb2xGZWVDb250cmFjdF8CIWluaXQ6IGludmFsaWQgcHJvdG9jb2xGZWVDb250cmFjdAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQwMzAwNDAzNjkJARRfcHJlcGFyZUFzc2V0V2VpZ2h0cwEFDWFzc2V0V2VpZ2h0c18EDGFzc2V0V2VpZ2h0cwgFDSR0MDQwMzAwNDAzNjkCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwNDAzMDA0MDM2OQJfMgQNYXNzZXRCYWxhbmNlcwkBFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEFB2Fzc2V0c18EBWlzc3VlCQDCCAUFDGxwVG9rZW5OYW1lXwUNbHBUb2tlbkRlc2NyXwAABRBscFRva2VuRGVjaW1hbHNfBgQJbHBBc3NldElkCQC4CAEFBWlzc3VlBA5zdG9yYWdlVXBkYXRlZAkAnAoKBQlscEFzc2V0SWQGAAAFCmxwRmVlUmF0ZV8FEHByb3RvY29sRmVlUmF0ZV8FF21heEFsbG9jYXRpb25BbXBsaWZpZXJfBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwkBEUBleHRyTmF0aXZlKDEwNjIpAQUUcHJvdG9jb2xGZWVDb250cmFjdF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgUFaXNzdWUFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQELX3NhdmVBc3NldHMBBQdhc3NldHNfCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwkBEV9zYXZlQXNzZXRXZWlnaHRzAQUMYXNzZXRXZWlnaHRzCQESX3NhdmVTaWdtYUZlZVBlckxwAQkBEl9sb2FkU2lnbWFGZWVQZXJMcAAFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKZGVwb3NpdEFsbAEHYW1vdW50XwQDZXJyAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAAFB01BWF9JTlQCGmRlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA0kdDA0MjAyNDQyMTA5CQELX2RlcG9zaXRBbGwBBQdhbW91bnRfBA5scFRva2Vuc1RvTWludAgFDSR0MDQyMDI0NDIxMDkCXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDA0MjAyNDQyMTA5Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNDIwMjQ0MjEwOQJfMwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEED3BheW1lbnRBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4B2Fzc2V0SWQEFHBheW1lbnRBc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUPcGF5bWVudEFzc2V0U3RyBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAJEDAgUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAUFaW5kZXgEDnJlcXVpcmVkQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBRRwYXltZW50QXNzZXREZWNpbWFscwUHQ0VJTElORwQEZXJyMQMJAQIhPQIFD3BheW1lbnRBc3NldFN0cgUEZWxlbQkAAgEJAKwCAgIjZGVwb3NpdEFsbDogaW52YWxpZCBwYXltZW50OiBpbmRleD0JAKQDAQUFaW5kZXgDCQBnAgAABQ5yZXF1aXJlZEFtb3VudAkAAgECJmRlcG9zaXRBbGw6IHRvbyBsaXR0bGUgYW1vdW50IHJlcXVpcmVkBQR1bml0AwkAAAIFBGVycjEFBGVycjEEBmNoYW5nZQMJAGYCCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50BQ5yZXF1aXJlZEFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50BQ5yZXF1aXJlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4B2Fzc2V0SWQFA25pbAMJAGYCBQ5yZXF1aXJlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAkAAgEJAKwCAgkArAICCQCsAgICKGRlcG9zaXRBbGw6IGluc3VmZmljaWVudCBwYXltZW50LCBpbmRleD0JAKQDAQUFaW5kZXgCCywgcmVxdWlyZWQ9CQCkAwEFDnJlcXVpcmVkQW1vdW50BQNuaWwJAJQKAgkAZAIFBWluZGV4AAEJAM4IAggFA2FjYwJfMgUGY2hhbmdlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDA0MzI1MjQzMzE0CgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDA0MzI1MjQzMzE0Al8xBA1jaGFuZ2VBY3Rpb25zCAUNJHQwNDMyNTI0MzMxNAJfMgQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9NaW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUObHBUb2tlbnNUb01pbnQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQ1jaGFuZ2VBY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2RlcG9zaXQBDG1pbkxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUMbWluTHBBbW91bnRfAAAFB01BWF9JTlQCHmRlcG9zaXQ6IGludmFsaWQgbWluIGxwIGFtb3VudAMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQEZXJyMQMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNDQ2OTM0NDc2NwkBCF9kZXBvc2l0AgUIYXNzZXRTdHIFEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNDQ2OTM0NDc2NwJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ0NjkzNDQ3NjcCXzIEBGVycjIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvTWludAUMbWluTHBBbW91bnRfBQdNQVhfSU5UAhlkZXBvc2l0OiBsZXNzIHRoYW4gbWluIGxwAwkAAAIFBGVycjIFBGVycjIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvTWludAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELd2l0aGRyYXdBbGwABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAiJ3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50cyBzaXplBwkBFF92YWxpZGF0ZVN0cmluZ0VxdWFsAwUMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAUHTUFYX0lOVAIjd2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0NTk4ODQ2MTE3CQEMX3dpdGhkcmF3QWxsAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEDmxwVG9rZW5zVG9CdXJuCAUNJHQwNDU5ODg0NjExNwJfMQQNYmFsYW5jZXNUb1BheQgFDSR0MDQ1OTg4NDYxMTcCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0NTk4ODQ2MTE3Al8zBAVscEZlZQgFDSR0MDQ1OTg4NDYxMTcCXzQEC3Byb3RvY29sRmVlCAUNJHQwNDU5ODg0NjExNwJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0NTk4ODQ2MTE3Al82BA5wYXltZW50QWN0aW9ucwkBGF9nZXRQYXltZW50c0Zyb21CYWxhbmNlcwQFBmFzc2V0cwUNYmFsYW5jZXNUb1BheQgFAWkGY2FsbGVyBQpscERlY2ltYWxzBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGUCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb0J1cm4IBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkBQ5scFRva2Vuc1RvQnVybgUDbmlsBQ5wYXltZW50QWN0aW9ucwkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwkBCl9zYXZlTHBGZWUCBQxscEFzc2V0SWRTdHIJAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQxscEFzc2V0SWRTdHIJARBfc2F2ZVByb3RvY29sRmVlAgUMbHBBc3NldElkU3RyCQBkAgULcHJvdG9jb2xGZWUJARBfbG9hZFByb3RvY29sRmVlAQUMbHBBc3NldElkU3RyCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCCGFzc2V0SWRfB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEA2VycgMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh93aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCIHdpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFBmFzc2V0cwUIYXNzZXRJZF8CGXdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0SWQHCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQdNQVhfSU5UAhh3aXRoZHJhdzogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0NzU5ODQ3NzA2CQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8FB2Ftb3VudF8EDmxwVG9rZW5zVG9CdXJuCAUNJHQwNDc1OTg0NzcwNgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ3NTk4NDc3MDYCXzIEBWxwRmVlCAUNJHQwNDc1OTg0NzcwNgJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0NzU5ODQ3NzA2Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ3NTk4NDc3MDYCXzUEEHJlcXVpcmVkTHBUb2tlbnMJAGQCCQBkAgUObHBUb2tlbnNUb0J1cm4FBWxwRmVlBQtwcm90b2NvbEZlZQQMY2hhbmdlQWN0aW9uAwkAZgIFEHJlcXVpcmVkTHBUb2tlbnMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQACAQIdd2l0aGRyYXc6IGluc3VmZmljaWVudCBhbW91bnQDCQBmAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFEHJlcXVpcmVkTHBUb2tlbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFEHJlcXVpcmVkTHBUb2tlbnMICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBQNuaWwEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvQnVybggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9CdXJuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHYW1vdW50XwkBC19zdHJUb0Fzc2V0AQUIYXNzZXRJZF8FA25pbAUMY2hhbmdlQWN0aW9uCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFBWxwRmVlCQEKX2xvYWRMcEZlZQEFDGxwQXNzZXRJZFN0cgkBEF9zYXZlUHJvdG9jb2xGZWUCBQxscEFzc2V0SWRTdHIJAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQxscEFzc2V0SWRTdHIJARJfc2F2ZVNpZ21hRmVlUGVyTHABBRRzaWdtYUZlZVBlckxwVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQRzd2FwAg50YXJnZXRBc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDnNvdXJjZUFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9nZXREZWNpbWFscwEFDnNvdXJjZUFzc2V0U3RyBQpscERlY2ltYWxzBQRET1dOBBBzb3VyY2VBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ5zb3VyY2VBc3NldFN0cgIac3dhcDogaW52YWxpZCBzb3VyY2UgYXNzZXQDCQAAAgUQc291cmNlQXNzZXRJbmRleAUQc291cmNlQXNzZXRJbmRleAQQdGFyZ2V0QXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOdGFyZ2V0QXNzZXRJZF8CGnN3YXA6IGludmFsaWQgdGFyZ2V0IGFzc2V0AwkAAAIFEHRhcmdldEFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgEA2VycgMDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAh9zd2FwOiBpbnZhbGlkIG1pbiB0YXJnZXQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAAUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ5ODcwNTAwMjgJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA0OTg3MDUwMDI4Al8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA0OTg3MDUwMDI4Al8yBAVscEZlZQgFDSR0MDQ5ODcwNTAwMjgCXzMEC3Byb3RvY29sRmVlCAUNJHQwNDk4NzA1MDAyOAJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0OTg3MDUwMDI4Al81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAIfc3dhcDogaW5zdWZmaWNpZW50IGZpbmFsIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQ50YXJnZXRBc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWdldERlcG9zaXRBbGwBB2Ftb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIdZ2V0RGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDUxMTU0NTEyMzkJAQtfZGVwb3NpdEFsbAEFB2Ftb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNTExNTQ1MTIzOQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDUxMTU0NTEyMzkCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MTE1NDUxMjM5Al8zCQCUCgIFA25pbAkAlAoCBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpnZXREZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGWdldERlcG9zaXQ6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAAFB01BWF9JTlQCGmdldERlcG9zaXQ6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAUHYW1vdW50XwUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNTE5OTg1MjA3MgkBCF9kZXBvc2l0AgUIYXNzZXRJZF8FEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNTE5OTg1MjA3MgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDUxOTk4NTIwNzICXzIJAJQKAgUDbmlsBQ5scFRva2Vuc1RvTWludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5nZXRXaXRoZHJhd0FsbAEHYW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQdNQVhfSU5UAh5nZXRXaXRoZHJhd0FsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDUyNDQzNTI1NTkJAQxfd2l0aGRyYXdBbGwBBQdhbW91bnRfBA5scFRva2Vuc1RvQnVybggFDSR0MDUyNDQzNTI1NTkCXzEEDWJhbGFuY2VzVG9HZXQIBQ0kdDA1MjQ0MzUyNTU5Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNTI0NDM1MjU1OQJfMwQFbHBGZWUIBQ0kdDA1MjQ0MzUyNTU5Al80BAtwcm90b2NvbEZlZQgFDSR0MDUyNDQzNTI1NTkCXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNTI0NDM1MjU1OQJfNgkAlAoCBQNuaWwFDWJhbGFuY2VzVG9HZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELZ2V0V2l0aGRyYXcCCGFzc2V0SWRfB2Ftb3VudF8EDSR0MDUyOTI1NTMwMzMJAQlfd2l0aGRyYXcCBQhhc3NldElkXwUHYW1vdW50XwQObHBUb2tlbnNUb0J1cm4IBQ0kdDA1MjkyNTUzMDMzAl8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNTI5MjU1MzAzMwJfMgQFbHBGZWUIBQ0kdDA1MjkyNTUzMDMzAl8zBAtwcm90b2NvbEZlZQgFDSR0MDUyOTI1NTMwMzMCXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNTI5MjU1MzAzMwJfNQQQcmVxdWlyZWRMcFRva2VucwkAZAIJAGQCBQ5scFRva2Vuc1RvQnVybgUFbHBGZWUFC3Byb3RvY29sRmVlCQCUCgIFA25pbAUQcmVxdWlyZWRMcFRva2VucwFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFDXNvdXJjZUFtb3VudF8JAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldElkXwUKbHBEZWNpbWFscwUERE9XTgQDZXJyAwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAAUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50CQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldElkXwUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwMJAAACBQNlcnIFA2VycgQNJHQwNTQyOTM1NDQ1MQkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU0MjkzNTQ0NTECXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDU0MjkzNTQ0NTECXzIEBWxwRmVlCAUNJHQwNTQyOTM1NDQ1MQJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1NDI5MzU0NDUxAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU0MjkzNTQ0NTECXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgkAlAoCBQNuaWwFC2ZpbmFsQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGdldENsYWltAQV1c2VyXwQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIWZ2V0Q2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBA0kdDA1NTA5MzU1MTQ5CQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU1MDkzNTUxNDkCXzEEC3VzZXJQcm9maXRzCAUNJHQwNTUwOTM1NTE0OQJfMgkAlAoCBQNuaWwFC3VzZXJQcm9maXRzAWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1NjAzMzU2MDkzCQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTYwMzM1NjA5MwJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1NjAzMzU2MDkzAl8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDU2NjA0NTY2NjQJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1NjYwNDU2NjY0Al8xBAt1c2VyUHJvZml0cwgFDSR0MDU2NjA0NTY2NjQCXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAgV1c2VyXwdhc3NldHNfBANlcnIDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQJAJADAQUHYXNzZXRzXwABAAoCGmNsYWltOiBpbnZhbGlkIGFzc2V0cyBzaXplBwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQGdXNlckxwCQELX2xvYWRVc2VyTHABBQR1c2VyBA0kdDA1NzQ4NzU3NTQzCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU3NDg3NTc1NDMCXzEEC3VzZXJQcm9maXRzCAUNJHQwNTc0ODc1NzU0MwJfMgoBCGZvbGRGdW5jAgNhY2MGcHJvZml0BAVpbmRleAgFA2FjYwJfMQMJAGYCBQVpbmRleAUIbWF4SW5kZXgJAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUGcHJvZml0CAUDYWNjAl8zBAVhc3NldAkAkQMCBQZhc3NldHMFBWluZGV4AwkBD2NvbnRhaW5zRWxlbWVudAIFB2Fzc2V0c18FBWFzc2V0CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQEOU2NyaXB0VHJhbnNmZXIDBQR1c2VyBQZwcm9maXQJAQtfc3RyVG9Bc3NldAEFBWFzc2V0CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBnByb2ZpdAgFA2FjYwJfMwQNJHQwNTgwMzI1ODEyMwoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwNTgwMzI1ODEyMwJfMQQSdXNlclByb2ZpdHNVcGRhdGVkCAUNJHQwNTgwMzI1ODEyMwJfMgQNcHJvZml0QWN0aW9ucwgFDSR0MDU4MDMyNTgxMjMCXzMJAJQKAgkAzggCCQDOCAIFDXByb2ZpdEFjdGlvbnMJANEIAgURY2hlY2twb2ludEFjdGlvbnMAAAkBEF9zYXZlVXNlclByb2ZpdHMCBQR1c2VyBRJ1c2VyUHJvZml0c1VwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuABOlSg4=", "height": 2692868, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FDNWC3xdp9CGzczkrQiMFpg6Jy1pEMXFzadPTwvtXEYm Next: 6TuquJ6qd8guV9iAMiVFrBziGDGx8A1x4CqXoLQLQWsg Diff:
OldNewDifferences
3737
3838 let PRECISION = 1000000
3939
40-let LIST_25 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
40+let LIST_64 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
4141
4242 let KEY_MULTISIG = "MULTISIG"
4343
10301030 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10311031 }
10321032
1033- let $t02430924382 = {
1033+ let $t02447124544 = {
10341034 let $l = ZERO_INT_LIST_11
10351035 let $s = size($l)
10361036 let $acc0 = $Tuple2(0, nil)
10441044
10451045 $f0_2($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)
10461046 }
1047- let idx = $t02430924382._1
1048- let profitsUpdated = $t02430924382._2
1047+ let idx = $t02447124544._1
1048+ let profitsUpdated = $t02447124544._2
10491049 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10501050 }
10511051
10591059 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10601060 }
10611061
1062- let $t02503225111 = {
1062+ let $t02519425273 = {
10631063 let $l = ZERO_INT_LIST_11
10641064 let $s = size($l)
10651065 let $acc0 = $Tuple2(0, nil)
10731073
10741074 $f0_2($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)
10751075 }
1076- let idx = $t02503225111._1
1077- let sigmaFeePerLpUpdated = $t02503225111._2
1076+ let idx = $t02519425273._1
1077+ let sigmaFeePerLpUpdated = $t02519425273._2
10781078 sigmaFeePerLpUpdated
10791079 }
10801080
10821082 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_,isFullAmount_) = {
10831083 let sigmaFeePerLp = _loadSigmaFeePerLp()
10841084 let totalLp = _loadTotalLp()
1085- let $t02535626064 = if (isFullAmount_)
1085+ let $t02551826226 = if (isFullAmount_)
10861086 then if ((totalLp == 0))
10871087 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10881088 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
10891089 else if ((totalLp == 0))
10901090 then $Tuple2(0, fraction(amount_, protocolFeeRate_, (MAX_FEE - protocolFeeRate_)))
10911091 else $Tuple2(fraction(amount_, lpFeeRate_, ((MAX_FEE - lpFeeRate_) - protocolFeeRate_)), fraction(amount_, protocolFeeRate_, ((MAX_FEE - lpFeeRate_) - protocolFeeRate_)))
1092- let lpFee = $t02535626064._1
1093- let protocolFee = $t02535626064._2
1092+ let lpFee = $t02551826226._1
1093+ let protocolFee = $t02551826226._2
10941094 let sigmaFeePerLpUpdated = if ((lpFee == 0))
10951095 then sigmaFeePerLp
10961096 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11051105 let slippageRate = storage._8
11061106 let feeMaxRate = storage._9
11071107 let assets = _loadAssets()
1108- let $t02657326626 = _loadAssetWeights()
1109- let assetWeights = $t02657326626._1
1110- let sigmaWeight = $t02657326626._2
1111- let $t02663126699 = _loadAssetBalances()
1112- let prevAssetBalances = $t02663126699._1
1113- let prevAssetTotalSupply = $t02663126699._2
1114- let $t02670527935 = if ((prevAssetTotalSupply == 0))
1108+ let $t02673526788 = _loadAssetWeights()
1109+ let assetWeights = $t02673526788._1
1110+ let sigmaWeight = $t02673526788._2
1111+ let $t02679326861 = _loadAssetBalances()
1112+ let prevAssetBalances = $t02679326861._1
1113+ let prevAssetTotalSupply = $t02679326861._2
1114+ let $t02686728097 = if ((prevAssetTotalSupply == 0))
11151115 then {
11161116 func foldFunc (acc,elem) = {
11171117 let index = acc._1
11191119 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11201120 }
11211121
1122- let $t02714727221 = {
1122+ let $t02730927383 = {
11231123 let $l = assets
11241124 let $s = size($l)
11251125 let $acc0 = $Tuple2(0, nil)
11331133
11341134 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11351135 }
1136- let idx = $t02714727221._1
1137- let requiredAmountsNormalized = $t02714727221._2
1136+ let idx = $t02730927383._1
1137+ let requiredAmountsNormalized = $t02730927383._2
11381138 $Tuple2(amount_, requiredAmountsNormalized)
11391139 }
11401140 else {
11451145 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11461146 }
11471147
1148- let $t02776427839 = {
1148+ let $t02792628001 = {
11491149 let $l = assets
11501150 let $s = size($l)
11511151 let $acc0 = $Tuple2(0, nil)
11591159
11601160 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11611161 }
1162- let idx = $t02776427839._1
1163- let requiredAmountsNormalized = $t02776427839._2
1162+ let idx = $t02792628001._1
1163+ let requiredAmountsNormalized = $t02792628001._2
11641164 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11651165 }
1166- let lpTokensToMint = $t02670527935._1
1167- let requiredAmountsNormalized = $t02670527935._2
1168- let $t02794128054 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1169- let assetBalances = $t02794128054._1
1170- let assetTotalSupply = $t02794128054._2
1166+ let lpTokensToMint = $t02686728097._1
1167+ let requiredAmountsNormalized = $t02686728097._2
1168+ let $t02810328216 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1169+ let assetBalances = $t02810328216._1
1170+ let assetTotalSupply = $t02810328216._2
11711171 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11721172 if ((err2 == err2))
11731173 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11831183 let slippageRate = storage._8
11841184 let feeMaxRate = storage._9
11851185 let assets = _loadAssets()
1186- let $t02874928802 = _loadAssetWeights()
1187- let assetWeights = $t02874928802._1
1188- let sigmaWeight = $t02874928802._2
1189- let $t02880728921 = _loadAssetBalances()
1190- let prevAssetBalances = $t02880728921._1
1191- let prevAssetTotalSupply = $t02880728921._2
1186+ let $t02891128964 = _loadAssetWeights()
1187+ let assetWeights = $t02891128964._1
1188+ let sigmaWeight = $t02891128964._2
1189+ let $t02896929083 = _loadAssetBalances()
1190+ let prevAssetBalances = $t02896929083._1
1191+ let prevAssetTotalSupply = $t02896929083._2
11921192 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
11931193 let assetTotalSupply = (prevAssetTotalSupply + amount_)
11941194 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12231223 let weightAmplifier = storage._7
12241224 let slippageRate = storage._8
12251225 let feeMaxRate = storage._9
1226- let $t03084830916 = _loadAssetBalances()
1227- let prevAssetBalances = $t03084830916._1
1228- let prevAssetTotalSupply = $t03084830916._2
1229- let $t03092130974 = _loadAssetWeights()
1230- let assetWeights = $t03092130974._1
1231- let sigmaWeight = $t03092130974._2
1232- let $t03098031102 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, true)
1233- let lpFee = $t03098031102._1
1234- let protocolFee = $t03098031102._2
1235- let sigmaFeePerLpUpdated = $t03098031102._3
1226+ let $t03101031078 = _loadAssetBalances()
1227+ let prevAssetBalances = $t03101031078._1
1228+ let prevAssetTotalSupply = $t03101031078._2
1229+ let $t03108331136 = _loadAssetWeights()
1230+ let assetWeights = $t03108331136._1
1231+ let sigmaWeight = $t03108331136._2
1232+ let $t03114231264 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, true)
1233+ let lpFee = $t03114231264._1
1234+ let protocolFee = $t03114231264._2
1235+ let sigmaFeePerLpUpdated = $t03114231264._3
12361236 let lpTokensToBurn = ((amount_ - lpFee) - protocolFee)
12371237 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12381238 if ((err == err))
12391239 then {
1240- let $t03126531398 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1241- let assetBalances = $t03126531398._1
1242- let assetTotalSupply = $t03126531398._2
1243- let balancesToPay = $t03126531398._3
1240+ let $t03142731560 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1241+ let assetBalances = $t03142731560._1
1242+ let assetTotalSupply = $t03142731560._2
1243+ let balancesToPay = $t03142731560._3
12441244 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12451245 if ((err2 == err2))
12461246 then $Tuple6(lpTokensToBurn, balancesToPay, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12631263 let feeMaxRate = storage._9
12641264 let lpAssetIdStr = toBase58String(lpAssetId)
12651265 let assets = _loadAssets()
1266- let $t03233732405 = _loadAssetBalances()
1267- let prevAssetBalances = $t03233732405._1
1268- let prevAssetTotalSupply = $t03233732405._2
1269- let $t03241032515 = _loadAssetWeights()
1270- let assetWeights = $t03241032515._1
1271- let sigmaWeight = $t03241032515._2
1266+ let $t03249932567 = _loadAssetBalances()
1267+ let prevAssetBalances = $t03249932567._1
1268+ let prevAssetTotalSupply = $t03249932567._2
1269+ let $t03257232677 = _loadAssetWeights()
1270+ let assetWeights = $t03257232677._1
1271+ let sigmaWeight = $t03257232677._2
12721272 let assetDecimals = _getDecimals(assetId_)
12731273 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
12741274 let assetIndex = value(indexOf(assets, assetId_))
12911291 then lpTokensToBurnInner
12921292 else throw("Strict value is not equal to itself.")
12931293 }
1294- let $t03427834401 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, false)
1295- let lpFee = $t03427834401._1
1296- let protocolFee = $t03427834401._2
1297- let sigmaFeePerLpUpdated = $t03427834401._3
1294+ let $t03444034563 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, false)
1295+ let lpFee = $t03444034563._1
1296+ let protocolFee = $t03444034563._2
1297+ let sigmaFeePerLpUpdated = $t03444034563._3
12981298 $Tuple5(lpTokensToBurn, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12991299 }
13001300 else throw("Strict value is not equal to itself.")
13121312 let weightAmplifier = storage._7
13131313 let slippageRate = storage._8
13141314 let feeMaxRate = storage._9
1315- let $t03494435012 = _loadAssetBalances()
1316- let prevAssetBalances = $t03494435012._1
1317- let prevAssetTotalSupply = $t03494435012._2
1318- let $t03501735070 = _loadAssetWeights()
1319- let assetWeights = $t03501735070._1
1320- let sigmaWeight = $t03501735070._2
1315+ let $t03510635174 = _loadAssetBalances()
1316+ let prevAssetBalances = $t03510635174._1
1317+ let prevAssetTotalSupply = $t03510635174._2
1318+ let $t03517935232 = _loadAssetWeights()
1319+ let assetWeights = $t03517935232._1
1320+ let sigmaWeight = $t03517935232._2
13211321 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13221322 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13231323 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1324+ let refUtilValue = (prevAssetTotalSupply - prevFee)
1325+ let start = 0
1326+ let stop = (sourceAmount_ + prevFee)
13241327 func foldFunc (acc,elem) = if (acc._1)
13251328 then acc
13261329 else {
1327- let targetAmount = acc._2
1328- let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1329- let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
1330- let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1331- let feeDiff = (fee - prevFee)
1332- let tempAmount = (sourceAmount_ - feeDiff)
1333- let check = if ((0 >= tempAmount))
1334- then throw("_swap: less than 0")
1335- else unit
1336- if ((check == check))
1337- then if (if (((targetAmount - tempAmount) > (-1 * PRECISION)))
1338- then (PRECISION > (targetAmount - tempAmount))
1339- else false)
1340- then {
1341- let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, tempAmount)
1342- let finalAssetTotalSupply = (assetTotalSupply - tempAmount)
1343- let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1344- then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1345- else false
1346- if ((err1 == err1))
1347- then $Tuple3(true, tempAmount, finalAssetBalances)
1348- else throw("Strict value is not equal to itself.")
1349- }
1350- else $Tuple3(false, tempAmount, tempAssetBalances)
1351- else throw("Strict value is not equal to itself.")
1330+ let startInner = acc._2
1331+ let stopInner = acc._3
1332+ let currentAmount = ((stopInner + startInner) / 2)
1333+ let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
1334+ let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
1335+ let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1336+ if (if ((PRECISION > (utilValue - refUtilValue)))
1337+ then ((utilValue - refUtilValue) > 0)
1338+ else false)
1339+ then $Tuple4(true, startInner, stopInner, currentAmount)
1340+ else if ((0 > (utilValue - refUtilValue)))
1341+ then $Tuple4(false, startInner, currentAmount, 0)
1342+ else $Tuple4(false, currentAmount, stopInner, 0)
13521343 }
13531344
1354- let $t03719737302 = {
1355- let $l = LIST_25
1356- let $s = size($l)
1357- let $acc0 = $Tuple3(false, sourceAmount_, nil)
1358- func $f0_1 ($a,$i) = if (($i >= $s))
1359- then $a
1360- else foldFunc($a, $l[$i])
1345+ let targetAmount = {
1346+ let targetAmount = sourceAmount_
1347+ let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1348+ let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
1349+ let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1350+ let feeDiff = (fee - prevFee)
1351+ if ((feeDiff == 0))
1352+ then targetAmount
1353+ else {
1354+ let $t03762037724 = {
1355+ let $l = LIST_64
1356+ let $s = size($l)
1357+ let $acc0 = $Tuple4(false, start, stop, 0)
1358+ func $f0_1 ($a,$i) = if (($i >= $s))
1359+ then $a
1360+ else foldFunc($a, $l[$i])
13611361
1362- func $f0_2 ($a,$i) = if (($i >= $s))
1363- then $a
1364- else throw("List size exceeds 25")
1362+ func $f0_2 ($a,$i) = if (($i >= $s))
1363+ then $a
1364+ else throw("List size exceeds 64")
13651365
1366- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
1366+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1367+ }
1368+ let success = $t03762037724._1
1369+ let startOut = $t03762037724._2
1370+ let stopOut = $t03762037724._3
1371+ let targetAmountOut = $t03762037724._4
1372+ if (!(success))
1373+ then throw(("_swap: can't calculate targetAmount=" + toString(targetAmountOut)))
1374+ else targetAmountOut
1375+ }
13671376 }
1368- let success = $t03719737302._1
1369- let targetAmount = $t03719737302._2
1370- let finalAssetBalances = $t03719737302._3
1371- if (!(success))
1372- then throw(("_swap: can't calculate targetAmount=" + toString(targetAmount)))
1373- else {
1374- let $t03741937566 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate, true)
1375- let lpFee = $t03741937566._1
1376- let protocolFee = $t03741937566._2
1377- let sigmaFeePerLpUpdated = $t03741937566._3
1377+ let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1378+ let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
1379+ let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1380+ then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1381+ else false
1382+ if ((err1 == err1))
1383+ then {
1384+ let $t03853738684 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate, true)
1385+ let lpFee = $t03853738684._1
1386+ let protocolFee = $t03853738684._2
1387+ let sigmaFeePerLpUpdated = $t03853738684._3
13781388 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13791389 }
1390+ else throw("Strict value is not equal to itself.")
13801391 }
13811392
13821393
14111422 else false
14121423 if ((err == err))
14131424 then {
1414- let $t03918639255 = _prepareAssetWeights(assetWeights_)
1415- let assetWeights = $t03918639255._1
1416- let sigmaWeight = $t03918639255._2
1425+ let $t04030040369 = _prepareAssetWeights(assetWeights_)
1426+ let assetWeights = $t04030040369._1
1427+ let sigmaWeight = $t04030040369._2
14171428 let assetBalances = _prepareAssetBalances(assets_)
14181429 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14191430 let lpAssetId = calculateAssetId(issue)
14381449 let lpAssetId = storage._1
14391450 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14401451 let assets = _loadAssets()
1441- let $t04091040995 = _depositAll(amount_)
1442- let lpTokensToMint = $t04091040995._1
1443- let requiredAmountsNormalized = $t04091040995._2
1444- let assetBalances = $t04091040995._3
1452+ let $t04202442109 = _depositAll(amount_)
1453+ let lpTokensToMint = $t04202442109._1
1454+ let requiredAmountsNormalized = $t04202442109._2
1455+ let assetBalances = $t04202442109._3
14451456 func foldFunc (acc,elem) = {
14461457 let index = acc._1
14471458 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
14651476 else throw("Strict value is not equal to itself.")
14661477 }
14671478
1468- let $t04213842200 = {
1479+ let $t04325243314 = {
14691480 let $l = assets
14701481 let $s = size($l)
14711482 let $acc0 = $Tuple2(0, nil)
14791490
14801491 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
14811492 }
1482- let idx = $t04213842200._1
1483- let changeActions = $t04213842200._2
1493+ let idx = $t04325243314._1
1494+ let changeActions = $t04325243314._2
14841495 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14851496 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
14861497 }
15111522 let assetStr = _assetToStr(i.payments[0].assetId)
15121523 let assetDecimals = _getDecimals(assetStr)
15131524 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1514- let $t04357943653 = _deposit(assetStr, amountNormalized)
1515- let lpTokensToMint = $t04357943653._1
1516- let assetBalances = $t04357943653._2
1525+ let $t04469344767 = _deposit(assetStr, amountNormalized)
1526+ let lpTokensToMint = $t04469344767._1
1527+ let assetBalances = $t04469344767._2
15171528 let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
15181529 if ((err2 == err2))
15191530 then {
15471558 else false
15481559 if ((err == err))
15491560 then {
1550- let $t04487445003 = _withdrawAll(i.payments[0].amount)
1551- let lpTokensToBurn = $t04487445003._1
1552- let balancesToPay = $t04487445003._2
1553- let assetBalances = $t04487445003._3
1554- let lpFee = $t04487445003._4
1555- let protocolFee = $t04487445003._5
1556- let sigmaFeePerLpUpdated = $t04487445003._6
1561+ let $t04598846117 = _withdrawAll(i.payments[0].amount)
1562+ let lpTokensToBurn = $t04598846117._1
1563+ let balancesToPay = $t04598846117._2
1564+ let assetBalances = $t04598846117._3
1565+ let lpFee = $t04598846117._4
1566+ let protocolFee = $t04598846117._5
1567+ let sigmaFeePerLpUpdated = $t04598846117._6
15571568 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
15581569 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15591570 $Tuple2((((((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15841595 else false
15851596 if ((err == err))
15861597 then {
1587- let $t04648446592 = _withdraw(assetId_, amount_)
1588- let lpTokensToBurn = $t04648446592._1
1589- let assetBalances = $t04648446592._2
1590- let lpFee = $t04648446592._3
1591- let protocolFee = $t04648446592._4
1592- let sigmaFeePerLpUpdated = $t04648446592._5
1598+ let $t04759847706 = _withdraw(assetId_, amount_)
1599+ let lpTokensToBurn = $t04759847706._1
1600+ let assetBalances = $t04759847706._2
1601+ let lpFee = $t04759847706._3
1602+ let protocolFee = $t04759847706._4
1603+ let sigmaFeePerLpUpdated = $t04759847706._5
15931604 let requiredLpTokens = ((lpTokensToBurn + lpFee) + protocolFee)
15941605 let changeAction = if ((requiredLpTokens > i.payments[0].amount))
15951606 then throw("withdraw: insufficient amount")
16311642 else false
16321643 if ((err == err))
16331644 then {
1634- let $t04875648914 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1635- let targetAmountNormalized = $t04875648914._1
1636- let finalAssetBalances = $t04875648914._2
1637- let lpFee = $t04875648914._3
1638- let protocolFee = $t04875648914._4
1639- let sigmaFeePerLpUpdated = $t04875648914._5
1645+ let $t04987050028 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1646+ let targetAmountNormalized = $t04987050028._1
1647+ let finalAssetBalances = $t04987050028._2
1648+ let lpFee = $t04987050028._3
1649+ let protocolFee = $t04987050028._4
1650+ let sigmaFeePerLpUpdated = $t04987050028._5
16401651 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16411652 let targetDecimals = _getDecimals(targetAssetId_)
16421653 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16591670 let err = _validateInt(amount_, 0, MAX_INT, "getDepositAll: invalid amount")
16601671 if ((err == err))
16611672 then {
1662- let $t05004050125 = _depositAll(amount_)
1663- let lpTokensToMint = $t05004050125._1
1664- let requiredAmountsNormalized = $t05004050125._2
1665- let assetBalances = $t05004050125._3
1673+ let $t05115451239 = _depositAll(amount_)
1674+ let lpTokensToMint = $t05115451239._1
1675+ let requiredAmountsNormalized = $t05115451239._2
1676+ let assetBalances = $t05115451239._3
16661677 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
16671678 }
16681679 else throw("Strict value is not equal to itself.")
16821693 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16831694 let assetDecimals = _getDecimals(assetId_)
16841695 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1685- let $t05088450958 = _deposit(assetId_, amountNormalized)
1686- let lpTokensToMint = $t05088450958._1
1687- let assetBalances = $t05088450958._2
1696+ let $t05199852072 = _deposit(assetId_, amountNormalized)
1697+ let lpTokensToMint = $t05199852072._1
1698+ let assetBalances = $t05199852072._2
16881699 $Tuple2(nil, lpTokensToMint)
16891700 }
16901701 else throw("Strict value is not equal to itself.")
16971708 let err = _validateInt(amount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
16981709 if ((err == err))
16991710 then {
1700- let $t05132951445 = _withdrawAll(amount_)
1701- let lpTokensToBurn = $t05132951445._1
1702- let balancesToGet = $t05132951445._2
1703- let assetBalances = $t05132951445._3
1704- let lpFee = $t05132951445._4
1705- let protocolFee = $t05132951445._5
1706- let sigmaFeePerLpUpdated = $t05132951445._6
1711+ let $t05244352559 = _withdrawAll(amount_)
1712+ let lpTokensToBurn = $t05244352559._1
1713+ let balancesToGet = $t05244352559._2
1714+ let assetBalances = $t05244352559._3
1715+ let lpFee = $t05244352559._4
1716+ let protocolFee = $t05244352559._5
1717+ let sigmaFeePerLpUpdated = $t05244352559._6
17071718 $Tuple2(nil, balancesToGet)
17081719 }
17091720 else throw("Strict value is not equal to itself.")
17131724
17141725 @Callable(i)
17151726 func getWithdraw (assetId_,amount_) = {
1716- let $t05181151919 = _withdraw(assetId_, amount_)
1717- let lpTokensToBurn = $t05181151919._1
1718- let assetBalances = $t05181151919._2
1719- let lpFee = $t05181151919._3
1720- let protocolFee = $t05181151919._4
1721- let sigmaFeePerLpUpdated = $t05181151919._5
1727+ let $t05292553033 = _withdraw(assetId_, amount_)
1728+ let lpTokensToBurn = $t05292553033._1
1729+ let assetBalances = $t05292553033._2
1730+ let lpFee = $t05292553033._3
1731+ let protocolFee = $t05292553033._4
1732+ let sigmaFeePerLpUpdated = $t05292553033._5
17221733 let requiredLpTokens = ((lpTokensToBurn + lpFee) + protocolFee)
17231734 $Tuple2(nil, requiredLpTokens)
17241735 }
17431754 else false
17441755 if ((err == err))
17451756 then {
1746- let $t05317953337 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1747- let targetAmountNormalized = $t05317953337._1
1748- let finalAssetBalances = $t05317953337._2
1749- let lpFee = $t05317953337._3
1750- let protocolFee = $t05317953337._4
1751- let sigmaFeePerLpUpdated = $t05317953337._5
1757+ let $t05429354451 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1758+ let targetAmountNormalized = $t05429354451._1
1759+ let finalAssetBalances = $t05429354451._2
1760+ let lpFee = $t05429354451._3
1761+ let protocolFee = $t05429354451._4
1762+ let sigmaFeePerLpUpdated = $t05429354451._5
17521763 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17531764 let targetDecimals = _getDecimals(targetAssetId_)
17541765 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17681779 let user = if ((size(user_) > 0))
17691780 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
17701781 else i.caller
1771- let $t05397954035 = _checkpoint(user)
1772- let checkpointActions = $t05397954035._1
1773- let userProfits = $t05397954035._2
1782+ let $t05509355149 = _checkpoint(user)
1783+ let checkpointActions = $t05509355149._1
1784+ let userProfits = $t05509355149._2
17741785 $Tuple2(nil, userProfits)
17751786 }
17761787
18091820 else false
18101821 if ((err1 == err1))
18111822 then {
1812- let $t05491954979 = _checkpoint(i.caller)
1813- let checkpointActions = $t05491954979._1
1814- let userProfits = $t05491954979._2
1823+ let $t05603356093 = _checkpoint(i.caller)
1824+ let checkpointActions = $t05603356093._1
1825+ let userProfits = $t05603356093._2
18151826 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
18161827 }
18171828 else throw("Strict value is not equal to itself.")
18341845 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
18351846 if ((err1 == err1))
18361847 then {
1837- let $t05549055550 = _checkpoint(i.caller)
1838- let checkpointActions = $t05549055550._1
1839- let userProfits = $t05549055550._2
1848+ let $t05660456664 = _checkpoint(i.caller)
1849+ let checkpointActions = $t05660456664._1
1850+ let userProfits = $t05660456664._2
18401851 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
18411852 }
18421853 else throw("Strict value is not equal to itself.")
18641875 let assets = [lpAssetIdStr, _loadAssets()]
18651876 let maxIndex = (size(assets) - 1)
18661877 let userLp = _loadUserLp(user)
1867- let $t05637356429 = _checkpoint(user)
1868- let checkpointActions = $t05637356429._1
1869- let userProfits = $t05637356429._2
1878+ let $t05748757543 = _checkpoint(user)
1879+ let checkpointActions = $t05748757543._1
1880+ let userProfits = $t05748757543._2
18701881 func foldFunc (acc,profit) = {
18711882 let index = acc._1
18721883 if ((index > maxIndex))
18791890 }
18801891 }
18811892
1882- let $t05691857009 = {
1893+ let $t05803258123 = {
18831894 let $l = userProfits
18841895 let $s = size($l)
18851896 let $acc0 = $Tuple3(0, nil, nil)
18931904
18941905 $f0_2($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)
18951906 }
1896- let idx = $t05691857009._1
1897- let userProfitsUpdated = $t05691857009._2
1898- let profitActions = $t05691857009._3
1907+ let idx = $t05803258123._1
1908+ let userProfitsUpdated = $t05803258123._2
1909+ let profitActions = $t05803258123._3
18991910 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19001911 }
19011912 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVES = "waves"
77
88 let MAX_INT = 9223372036854775807
99
1010 let MAX_FEE = 1000000
1111
1212 let MAX_AMPLIFIER = 1000000
1313
1414 let MAX_WEIGHT_AMPLIFIER = 1000000
1515
1616 let MAX_WEIGHT = 1000000
1717
1818 let SLIPPAGE_RATE_FACTOR = 1000000
1919
2020 let FEE_RATE_FACTOR = 1000000
2121
2222 let RATE_FACTOR = 1000000
2323
2424 let PERCENT_FACTOR = toBigInt(1000000000000)
2525
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
3030 let ZERO_BIGINT = toBigInt(0)
3131
3232 let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
3333
3434 let INT_DECIMALS = 8
3535
3636 let BIGINT_DECIMALS = 18
3737
3838 let PRECISION = 1000000
3939
40-let LIST_25 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
40+let LIST_64 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
4141
4242 let KEY_MULTISIG = "MULTISIG"
4343
4444 let KEY_STATUS = "STATUS"
4545
4646 let KEY_PAUSED = "PAUSED"
4747
4848 let KEY_PAUSER = "PAUSER"
4949
5050 let KEY_STORAGE = "STORAGE"
5151
5252 let KEY_ASSETS = "ASSETS"
5353
5454 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5555
5656 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5757
5858 let KEY_LP_FEE = "LP_FEE"
5959
6060 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
6161
6262 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6363
6464 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6565
6666 let KEY_USER_LP = "USER_LP"
6767
6868 let KEY_TOTAL_LP = "TOTAL_LP"
6969
7070 let KEY_USER_PROFITS = "USER_PROFITS"
7171
7272 func _validateAddress (address_,err_) = match addressFromString(address_) {
7373 case a: Address =>
7474 true
7575 case _ =>
7676 throw(err_)
7777 }
7878
7979
8080 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8181 then true
8282 else match assetInfo(fromBase58String(assetId_)) {
8383 case a: Asset =>
8484 true
8585 case _ =>
8686 throw(err_)
8787 }
8888
8989
9090 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
9191 then true
9292 else (val_ > upperBoundary_))
9393 then throw(err_)
9494 else true
9595
9696
9797 func _validateBool (val_,target_,err_) = if ((val_ != target_))
9898 then throw(err_)
9999 else true
100100
101101
102102 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
103103 then throw(err_)
104104 else true
105105
106106
107107 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
108108 then throw(err_)
109109 else true
110110
111111
112112 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
113113 func foldFunc (acc,elem) = match parseInt(elem) {
114114 case a: Int =>
115115 if (acc)
116116 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
117117 else false
118118 case _ =>
119119 throw(err_)
120120 }
121121
122122 let $l = val_
123123 let $s = size($l)
124124 let $acc0 = true
125125 func $f0_1 ($a,$i) = if (($i >= $s))
126126 then $a
127127 else foldFunc($a, $l[$i])
128128
129129 func $f0_2 ($a,$i) = if (($i >= $s))
130130 then $a
131131 else throw("List size exceeds 10")
132132
133133 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
134134 }
135135
136136
137137 func _validateAssets (assets_,err_) = {
138138 func foldFunc (acc,elem) = if (acc)
139139 then _validateAsset(elem, err_)
140140 else false
141141
142142 let $l = assets_
143143 let $s = size($l)
144144 let $acc0 = true
145145 func $f0_1 ($a,$i) = if (($i >= $s))
146146 then $a
147147 else foldFunc($a, $l[$i])
148148
149149 func $f0_2 ($a,$i) = if (($i >= $s))
150150 then $a
151151 else throw("List size exceeds 10")
152152
153153 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
154154 }
155155
156156
157157 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
158158 then throw(err_)
159159 else true
160160
161161
162162 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
163163 then true
164164 else (size(val_) > 16))
165165 then throw(err_)
166166 else true
167167
168168
169169 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
170170 then throw(err_)
171171 else true
172172
173173
174174 func _validateDecimals (val_,err_) = if (if ((0 > val_))
175175 then true
176176 else (val_ > 8))
177177 then throw(err_)
178178 else true
179179
180180
181181 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
182182 case a: ByteVector =>
183183 if ((assetId_ != toBase58String(a)))
184184 then throw((err_ + ": asset"))
185185 else if ((requiredAmount_ > payment_.amount))
186186 then throw((err_ + ": amount"))
187187 else true
188188 case _ =>
189189 throw((err_ + ": asset"))
190190 }
191191
192192
193193 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
194194 then throw(err_)
195195 else true
196196
197197
198198 func _assetToStr (asset_) = match asset_ {
199199 case a: ByteVector =>
200200 toBase58String(a)
201201 case _ =>
202202 WAVES
203203 }
204204
205205
206206 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
207207 then true
208208 else (asset_ == ""))
209209 then unit
210210 else fromBase58String(asset_)
211211
212212
213213 func _loadPause () = match getBoolean(KEY_PAUSED) {
214214 case a: Boolean =>
215215 a
216216 case _ =>
217217 false
218218 }
219219
220220
221221 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
222222
223223
224224 func _loadPauser () = match getString(KEY_PAUSER) {
225225 case a: String =>
226226 addressFromStringValue(a)
227227 case _ =>
228228 Address(base58'')
229229 }
230230
231231
232232 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
233233
234234
235235 func _loadMultisig () = match getString(KEY_MULTISIG) {
236236 case a: String =>
237237 addressFromStringValue(a)
238238 case _ =>
239239 Address(base58'')
240240 }
241241
242242
243243 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
244244
245245
246246 func _loadStorage () = match getString(KEY_STORAGE) {
247247 case a: String =>
248248 let struct = split(a, SEP)
249249 $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), parseIntValue(struct[6]), parseIntValue(struct[7]), parseIntValue(struct[8]), addressFromStringValue(struct[9]))
250250 case _ =>
251251 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
252252 }
253253
254254
255255 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
256256 then "1"
257257 else "0", toString(storage_._3), toString(storage_._4), toString(storage_._5), toString(storage_._6), toString(storage_._7), toString(storage_._8), toString(storage_._9), toString(storage_._10)], SEP))]
258258
259259
260260 func _loadAssets () = match getString(KEY_ASSETS) {
261261 case a: String =>
262262 if ((size(a) > 0))
263263 then split_51C(a, SEP)
264264 else nil
265265 case _ =>
266266 nil
267267 }
268268
269269
270270 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
271271
272272
273273 func _loadAssetBalances () = {
274274 func foldFunc (acc,elem) = {
275275 let balance = parseIntValue(elem)
276276 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
277277 }
278278
279279 match getString(KEY_ASSET_BALANCES) {
280280 case a: String =>
281281 if ((size(a) > 0))
282282 then {
283283 let $l = split_51C(a, SEP)
284284 let $s = size($l)
285285 let $acc0 = $Tuple2(nil, 0)
286286 func $f0_1 ($a,$i) = if (($i >= $s))
287287 then $a
288288 else foldFunc($a, $l[$i])
289289
290290 func $f0_2 ($a,$i) = if (($i >= $s))
291291 then $a
292292 else throw("List size exceeds 10")
293293
294294 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
295295 }
296296 else $Tuple2(ZERO_INT_LIST_10, 0)
297297 case _ =>
298298 $Tuple2(ZERO_INT_LIST_10, 0)
299299 }
300300 }
301301
302302
303303 func _saveAssetBalances (balances_) = {
304304 func foldFunc (acc,elem) = (acc :+ toString(elem))
305305
306306 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
307307 let $l = balances_
308308 let $s = size($l)
309309 let $acc0 = nil
310310 func $f0_1 ($a,$i) = if (($i >= $s))
311311 then $a
312312 else foldFunc($a, $l[$i])
313313
314314 func $f0_2 ($a,$i) = if (($i >= $s))
315315 then $a
316316 else throw("List size exceeds 10")
317317
318318 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
319319 }, SEP))]
320320 }
321321
322322
323323 func _loadAssetWeights () = {
324324 func foldFunc (acc,elem) = {
325325 let weight = parseIntValue(elem)
326326 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
327327 }
328328
329329 match getString(KEY_ASSET_WEIGHTS) {
330330 case a: String =>
331331 if ((size(a) > 0))
332332 then {
333333 let $l = split_51C(a, SEP)
334334 let $s = size($l)
335335 let $acc0 = $Tuple2(nil, 0)
336336 func $f0_1 ($a,$i) = if (($i >= $s))
337337 then $a
338338 else foldFunc($a, $l[$i])
339339
340340 func $f0_2 ($a,$i) = if (($i >= $s))
341341 then $a
342342 else throw("List size exceeds 10")
343343
344344 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
345345 }
346346 else $Tuple2(ZERO_INT_LIST_10, 0)
347347 case _ =>
348348 $Tuple2(ZERO_INT_LIST_10, 0)
349349 }
350350 }
351351
352352
353353 func _saveAssetWeights (weights_) = {
354354 func foldFunc (acc,elem) = (acc :+ toString(elem))
355355
356356 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
357357 let $l = weights_
358358 let $s = size($l)
359359 let $acc0 = nil
360360 func $f0_1 ($a,$i) = if (($i >= $s))
361361 then $a
362362 else foldFunc($a, $l[$i])
363363
364364 func $f0_2 ($a,$i) = if (($i >= $s))
365365 then $a
366366 else throw("List size exceeds 10")
367367
368368 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
369369 }, SEP))]
370370 }
371371
372372
373373 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
374374 case a: Int =>
375375 a
376376 case _ =>
377377 0
378378 }
379379
380380
381381 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
382382
383383
384384 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
385385 case a: Int =>
386386 a
387387 case _ =>
388388 0
389389 }
390390
391391
392392 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
393393
394394
395395 func _loadSigmaFeePerLp () = {
396396 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
397397
398398 match getString(KEY_SIGMA_FEE_PER_LP) {
399399 case a: String =>
400400 if ((size(a) > 0))
401401 then {
402402 let $l = split_51C(a, SEP)
403403 let $s = size($l)
404404 let $acc0 = nil
405405 func $f0_1 ($a,$i) = if (($i >= $s))
406406 then $a
407407 else foldFunc($a, $l[$i])
408408
409409 func $f0_2 ($a,$i) = if (($i >= $s))
410410 then $a
411411 else throw("List size exceeds 11")
412412
413413 $f0_2($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)
414414 }
415415 else ZERO_BIGINT_LIST_11
416416 case _ =>
417417 ZERO_BIGINT_LIST_11
418418 }
419419 }
420420
421421
422422 func _saveSigmaFeePerLp (val_) = {
423423 func foldFunc (acc,elem) = (acc :+ toString(elem))
424424
425425 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
426426 let $l = val_
427427 let $s = size($l)
428428 let $acc0 = nil
429429 func $f0_1 ($a,$i) = if (($i >= $s))
430430 then $a
431431 else foldFunc($a, $l[$i])
432432
433433 func $f0_2 ($a,$i) = if (($i >= $s))
434434 then $a
435435 else throw("List size exceeds 11")
436436
437437 $f0_2($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)
438438 }, SEP))]
439439 }
440440
441441
442442 func _loadUserSigmaFeePerLp (user_) = {
443443 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
444444
445445 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
446446 case a: String =>
447447 if ((size(a) > 0))
448448 then {
449449 let $l = split_51C(a, SEP)
450450 let $s = size($l)
451451 let $acc0 = nil
452452 func $f0_1 ($a,$i) = if (($i >= $s))
453453 then $a
454454 else foldFunc($a, $l[$i])
455455
456456 func $f0_2 ($a,$i) = if (($i >= $s))
457457 then $a
458458 else throw("List size exceeds 11")
459459
460460 $f0_2($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)
461461 }
462462 else ZERO_BIGINT_LIST_11
463463 case _ =>
464464 ZERO_BIGINT_LIST_11
465465 }
466466 }
467467
468468
469469 func _saveUserSigmaFeePerLp (user_,val_) = {
470470 func foldFunc (acc,elem) = (acc :+ toString(elem))
471471
472472 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
473473 let $l = val_
474474 let $s = size($l)
475475 let $acc0 = nil
476476 func $f0_1 ($a,$i) = if (($i >= $s))
477477 then $a
478478 else foldFunc($a, $l[$i])
479479
480480 func $f0_2 ($a,$i) = if (($i >= $s))
481481 then $a
482482 else throw("List size exceeds 11")
483483
484484 $f0_2($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)
485485 }, SEP))]
486486 }
487487
488488
489489 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
490490 case a: Int =>
491491 a
492492 case _ =>
493493 0
494494 }
495495
496496
497497 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
498498
499499
500500 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
501501 case a: Int =>
502502 a
503503 case _ =>
504504 0
505505 }
506506
507507
508508 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
509509
510510
511511 func _loadUserProfits (user_) = {
512512 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
513513
514514 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
515515 case a: String =>
516516 if ((size(a) > 0))
517517 then {
518518 let $l = split_51C(a, SEP)
519519 let $s = size($l)
520520 let $acc0 = nil
521521 func $f0_1 ($a,$i) = if (($i >= $s))
522522 then $a
523523 else foldFunc($a, $l[$i])
524524
525525 func $f0_2 ($a,$i) = if (($i >= $s))
526526 then $a
527527 else throw("List size exceeds 11")
528528
529529 $f0_2($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)
530530 }
531531 else ZERO_INT_LIST_11
532532 case _ =>
533533 ZERO_INT_LIST_11
534534 }
535535 }
536536
537537
538538 func _saveUserProfits (user_,val_) = {
539539 func foldFunc (acc,elem) = (acc :+ toString(elem))
540540
541541 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
542542 let $l = val_
543543 let $s = size($l)
544544 let $acc0 = nil
545545 func $f0_1 ($a,$i) = if (($i >= $s))
546546 then $a
547547 else foldFunc($a, $l[$i])
548548
549549 func $f0_2 ($a,$i) = if (($i >= $s))
550550 then $a
551551 else throw("List size exceeds 11")
552552
553553 $f0_2($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)
554554 }, SEP))]
555555 }
556556
557557
558558 func _onlyThisContract (caller_) = if ((caller_ != this))
559559 then throw("_onlyThisContract: revert")
560560 else true
561561
562562
563563 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
564564 then throw("_whenMultisigSet: revert")
565565 else true
566566
567567
568568 func _whenNotInitialized () = {
569569 let storage = _loadStorage()
570570 if ((storage._1 != base58''))
571571 then throw("_whenNotInitialized: revert")
572572 else true
573573 }
574574
575575
576576 func _whenInitialized () = {
577577 let storage = _loadStorage()
578578 if ((storage._1 == base58''))
579579 then throw("_whenInitialized: revert")
580580 else true
581581 }
582582
583583
584584 func _whenNotPaused () = if (_loadPause())
585585 then throw("_whenNotPaused: revert")
586586 else true
587587
588588
589589 func _whenPaused () = if (!(_loadPause()))
590590 then throw("_whenPaused: revert")
591591 else true
592592
593593
594594 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
595595 then throw("_onlyPauser: revert")
596596 else true
597597
598598
599599 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
600600 case a: Asset =>
601601 a.decimals
602602 case _ =>
603603 throw(("_getDecimals: no asset=" + assetId_))
604604 }
605605
606606
607607 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
608608 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
609609 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
610610
611611
612612 func _prepareAssetBalances (assets_) = {
613613 func foldFunc (acc,elem) = (acc :+ 0)
614614
615615 let $l = assets_
616616 let $s = size($l)
617617 let $acc0 = nil
618618 func $f0_1 ($a,$i) = if (($i >= $s))
619619 then $a
620620 else foldFunc($a, $l[$i])
621621
622622 func $f0_2 ($a,$i) = if (($i >= $s))
623623 then $a
624624 else throw("List size exceeds 10")
625625
626626 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
627627 }
628628
629629
630630 func _prepareAssetWeights (assetWeights_) = {
631631 func foldFunc (acc,elem) = {
632632 let weight = parseIntValue(elem)
633633 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
634634 }
635635
636636 let $l = assetWeights_
637637 let $s = size($l)
638638 let $acc0 = $Tuple2(nil, 0)
639639 func $f0_1 ($a,$i) = if (($i >= $s))
640640 then $a
641641 else foldFunc($a, $l[$i])
642642
643643 func $f0_2 ($a,$i) = if (($i >= $s))
644644 then $a
645645 else throw("List size exceeds 10")
646646
647647 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
648648 }
649649
650650
651651 func _getAssetBalances (assets_,decimals_) = {
652652 func foldFunc (acc,elem) = {
653653 let assetDecimals = _getDecimals(elem)
654654 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
655655 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
656656 }
657657
658658 let $l = assets_
659659 let $s = size($l)
660660 let $acc0 = $Tuple2(nil, 0)
661661 func $f0_1 ($a,$i) = if (($i >= $s))
662662 then $a
663663 else foldFunc($a, $l[$i])
664664
665665 func $f0_2 ($a,$i) = if (($i >= $s))
666666 then $a
667667 else throw("List size exceeds 10")
668668
669669 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
670670 }
671671
672672
673673 func _listIntToString (assets_) = {
674674 func foldFunc (acc,elem) = (acc :+ toString(elem))
675675
676676 makeString({
677677 let $l = assets_
678678 let $s = size($l)
679679 let $acc0 = nil
680680 func $f0_1 ($a,$i) = if (($i >= $s))
681681 then $a
682682 else foldFunc($a, $l[$i])
683683
684684 func $f0_2 ($a,$i) = if (($i >= $s))
685685 then $a
686686 else throw("List size exceeds 11")
687687
688688 $f0_2($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)
689689 }, SEP)
690690 }
691691
692692
693693 func _listBigIntToString (assets_) = {
694694 func foldFunc (acc,elem) = (acc :+ toString(elem))
695695
696696 makeString({
697697 let $l = assets_
698698 let $s = size($l)
699699 let $acc0 = nil
700700 func $f0_1 ($a,$i) = if (($i >= $s))
701701 then $a
702702 else foldFunc($a, $l[$i])
703703
704704 func $f0_2 ($a,$i) = if (($i >= $s))
705705 then $a
706706 else throw("List size exceeds 11")
707707
708708 $f0_2($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)
709709 }, SEP)
710710 }
711711
712712
713713 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
714714 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
715715
716716 let $l = weights_
717717 let $s = size($l)
718718 let $acc0 = nil
719719 func $f0_1 ($a,$i) = if (($i >= $s))
720720 then $a
721721 else foldFunc($a, $l[$i])
722722
723723 func $f0_2 ($a,$i) = if (($i >= $s))
724724 then $a
725725 else throw("List size exceeds 10")
726726
727727 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
728728 }
729729
730730
731731 func _incrementBalancesByAmounts (balances_,amounts_) = {
732732 func foldFunc (acc,elem) = {
733733 let index = acc._1
734734 let amount = amounts_[index]
735735 let newBalance = (elem + amount)
736736 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
737737 }
738738
739739 let result = {
740740 let $l = balances_
741741 let $s = size($l)
742742 let $acc0 = $Tuple3(0, nil, 0)
743743 func $f0_1 ($a,$i) = if (($i >= $s))
744744 then $a
745745 else foldFunc($a, $l[$i])
746746
747747 func $f0_2 ($a,$i) = if (($i >= $s))
748748 then $a
749749 else throw("List size exceeds 10")
750750
751751 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
752752 }
753753 $Tuple2(result._2, result._3)
754754 }
755755
756756
757757 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
758758 func foldFunc (acc,elem) = {
759759 let index = acc._1
760760 let payment = payments_[index]
761761 let paymentAssetStr = _assetToStr(payment.assetId)
762762 let err = if ((paymentAssetStr != assets_[index]))
763763 then throw(((err_ + ": index=") + toString(index)))
764764 else unit
765765 if ((err == err))
766766 then {
767767 let assetDecimals = _getDecimals(paymentAssetStr)
768768 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
769769 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
770770 }
771771 else throw("Strict value is not equal to itself.")
772772 }
773773
774774 let result = {
775775 let $l = balances_
776776 let $s = size($l)
777777 let $acc0 = $Tuple3(0, nil, 0)
778778 func $f0_1 ($a,$i) = if (($i >= $s))
779779 then $a
780780 else foldFunc($a, $l[$i])
781781
782782 func $f0_2 ($a,$i) = if (($i >= $s))
783783 then $a
784784 else throw("List size exceeds 10")
785785
786786 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
787787 }
788788 $Tuple2(result._2, result._3)
789789 }
790790
791791
792792 func _incrementBalanceByIndex (balances_,index_,amount_) = {
793793 func foldFunc (acc,elem) = {
794794 let index = acc._1
795795 if ((index == index_))
796796 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
797797 else $Tuple2((index + 1), (acc._2 :+ elem))
798798 }
799799
800800 let result = {
801801 let $l = balances_
802802 let $s = size($l)
803803 let $acc0 = $Tuple2(0, nil)
804804 func $f0_1 ($a,$i) = if (($i >= $s))
805805 then $a
806806 else foldFunc($a, $l[$i])
807807
808808 func $f0_2 ($a,$i) = if (($i >= $s))
809809 then $a
810810 else throw("List size exceeds 10")
811811
812812 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
813813 }
814814 result._2
815815 }
816816
817817
818818 func _decrementBalanceByIndex (balances_,index_,amount_) = {
819819 func foldFunc (acc,elem) = {
820820 let index = acc._1
821821 if ((index == index_))
822822 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
823823 else $Tuple2((index + 1), (acc._2 :+ elem))
824824 }
825825
826826 let result = {
827827 let $l = balances_
828828 let $s = size($l)
829829 let $acc0 = $Tuple2(0, nil)
830830 func $f0_1 ($a,$i) = if (($i >= $s))
831831 then $a
832832 else foldFunc($a, $l[$i])
833833
834834 func $f0_2 ($a,$i) = if (($i >= $s))
835835 then $a
836836 else throw("List size exceeds 10")
837837
838838 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
839839 }
840840 result._2
841841 }
842842
843843
844844 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
845845 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
846846 func foldFunc (acc,elem) = {
847847 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
848848 let deltaBalance = (elem - newBalance)
849849 $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
850850 }
851851
852852 let $l = balances_
853853 let $s = size($l)
854854 let $acc0 = $Tuple3(nil, 0, nil)
855855 func $f0_1 ($a,$i) = if (($i >= $s))
856856 then $a
857857 else foldFunc($a, $l[$i])
858858
859859 func $f0_2 ($a,$i) = if (($i >= $s))
860860 then $a
861861 else throw("List size exceeds 10")
862862
863863 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
864864 }
865865
866866
867867 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
868868 func foldFunc (acc,elem) = {
869869 let index = acc._1
870870 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
871871 }
872872
873873 let result = {
874874 let $l = assets_
875875 let $s = size($l)
876876 let $acc0 = $Tuple2(0, nil)
877877 func $f0_1 ($a,$i) = if (($i >= $s))
878878 then $a
879879 else foldFunc($a, $l[$i])
880880
881881 func $f0_2 ($a,$i) = if (($i >= $s))
882882 then $a
883883 else throw("List size exceeds 10")
884884
885885 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
886886 }
887887 result._2
888888 }
889889
890890
891891 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
892892 then {
893893 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
894894 if ((threshold > balance_))
895895 then {
896896 let maxDeviation = (threshold - balance_)
897897 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
898898 if ((feeRate > feeMaxRate_))
899899 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
900900 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
901901 }
902902 else 0
903903 }
904904 else {
905905 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
906906 if ((balance_ > threshold))
907907 then {
908908 let maxDeviation = (balance_ - threshold)
909909 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
910910 if ((feeRate > feeMaxRate_))
911911 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
912912 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
913913 }
914914 else 0
915915 }
916916
917917
918918 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
919919 func foldFunc (acc,balance) = {
920920 let index = acc._1
921921 let equilibrium = fraction(assetsTotalSupply_, weights_[index], sigmaWeight_)
922922 $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
923923 }
924924
925925 let result = {
926926 let $l = balances_
927927 let $s = size($l)
928928 let $acc0 = $Tuple2(0, 0)
929929 func $f0_1 ($a,$i) = if (($i >= $s))
930930 then $a
931931 else foldFunc($a, $l[$i])
932932
933933 func $f0_2 ($a,$i) = if (($i >= $s))
934934 then $a
935935 else throw("List size exceeds 10")
936936
937937 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
938938 }
939939 result._2
940940 }
941941
942942
943943 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
944944 then true
945945 else (lpTotalSupply_ == 0))
946946 then true
947947 else {
948948 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
949949 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
950950 let diff = (newAssetsRate - prevAssetsRate)
951951 if (if ((0 >= diff))
952952 then ((-1 * RATE_FACTOR) > diff)
953953 else false)
954954 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
955955 else true
956956 }
957957
958958
959959 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
960960 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
961961 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
962962 let diff = (newUtil - prevUtil)
963963 if (if ((0 >= diff))
964964 then ((-1 * RATE_FACTOR) > diff)
965965 else false)
966966 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
967967 else true
968968 }
969969
970970
971971 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
972972 let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
973973 let maxAllocationAmp = if ((balance_ > equilibrium))
974974 then (MAX_AMPLIFIER + maxAllocAmp_)
975975 else (MAX_AMPLIFIER - maxAllocAmp_)
976976 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
977977 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
978978 if ((balance_ > equilibrium))
979979 then if ((balance_ > maxAllocation))
980980 then if ((prevMaxAllocation > prevBalance_))
981981 then throw("_validateAssetAllocation: new up")
982982 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
983983 then throw("_validateAssetAllocation: still up")
984984 else true
985985 else true
986986 else if ((maxAllocation > balance_))
987987 then if ((prevBalance_ > prevMaxAllocation))
988988 then throw("_validateAssetAllocation: new down")
989989 else if (((prevMaxAllocation - prevBalance_) > (maxAllocation - balance_)))
990990 then throw("_validateAssetAllocation: still down")
991991 else true
992992 else true
993993 }
994994
995995
996996 func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
997997 func foldFunc (acc,elem) = {
998998 let index = acc._1
999999 $Tuple2((index + 1), if (acc._2)
10001000 then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
10011001 else false)
10021002 }
10031003
10041004 let result = {
10051005 let $l = assetBalances_
10061006 let $s = size($l)
10071007 let $acc0 = $Tuple2(0, true)
10081008 func $f0_1 ($a,$i) = if (($i >= $s))
10091009 then $a
10101010 else foldFunc($a, $l[$i])
10111011
10121012 func $f0_2 ($a,$i) = if (($i >= $s))
10131013 then $a
10141014 else throw("List size exceeds 10")
10151015
10161016 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
10171017 }
10181018 result._2
10191019 }
10201020
10211021
10221022 func _checkpoint (user_) = {
10231023 let userLp = _loadUserLp(user_)
10241024 let userProfits = _loadUserProfits(user_)
10251025 let sigmaFeePerLp = _loadSigmaFeePerLp()
10261026 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10271027 func foldFunc (acc,elem) = {
10281028 let index = acc._1
10291029 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10301030 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10311031 }
10321032
1033- let $t02430924382 = {
1033+ let $t02447124544 = {
10341034 let $l = ZERO_INT_LIST_11
10351035 let $s = size($l)
10361036 let $acc0 = $Tuple2(0, nil)
10371037 func $f0_1 ($a,$i) = if (($i >= $s))
10381038 then $a
10391039 else foldFunc($a, $l[$i])
10401040
10411041 func $f0_2 ($a,$i) = if (($i >= $s))
10421042 then $a
10431043 else throw("List size exceeds 11")
10441044
10451045 $f0_2($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)
10461046 }
1047- let idx = $t02430924382._1
1048- let profitsUpdated = $t02430924382._2
1047+ let idx = $t02447124544._1
1048+ let profitsUpdated = $t02447124544._2
10491049 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10501050 }
10511051
10521052
10531053 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10541054 func foldFunc (acc,elem) = {
10551055 let index = acc._1
10561056 let sigmaFeePerLpUpdated = if ((index_ == index))
10571057 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10581058 else sigmaFeePerLp_[index]
10591059 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10601060 }
10611061
1062- let $t02503225111 = {
1062+ let $t02519425273 = {
10631063 let $l = ZERO_INT_LIST_11
10641064 let $s = size($l)
10651065 let $acc0 = $Tuple2(0, nil)
10661066 func $f0_1 ($a,$i) = if (($i >= $s))
10671067 then $a
10681068 else foldFunc($a, $l[$i])
10691069
10701070 func $f0_2 ($a,$i) = if (($i >= $s))
10711071 then $a
10721072 else throw("List size exceeds 11")
10731073
10741074 $f0_2($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)
10751075 }
1076- let idx = $t02503225111._1
1077- let sigmaFeePerLpUpdated = $t02503225111._2
1076+ let idx = $t02519425273._1
1077+ let sigmaFeePerLpUpdated = $t02519425273._2
10781078 sigmaFeePerLpUpdated
10791079 }
10801080
10811081
10821082 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_,isFullAmount_) = {
10831083 let sigmaFeePerLp = _loadSigmaFeePerLp()
10841084 let totalLp = _loadTotalLp()
1085- let $t02535626064 = if (isFullAmount_)
1085+ let $t02551826226 = if (isFullAmount_)
10861086 then if ((totalLp == 0))
10871087 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10881088 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
10891089 else if ((totalLp == 0))
10901090 then $Tuple2(0, fraction(amount_, protocolFeeRate_, (MAX_FEE - protocolFeeRate_)))
10911091 else $Tuple2(fraction(amount_, lpFeeRate_, ((MAX_FEE - lpFeeRate_) - protocolFeeRate_)), fraction(amount_, protocolFeeRate_, ((MAX_FEE - lpFeeRate_) - protocolFeeRate_)))
1092- let lpFee = $t02535626064._1
1093- let protocolFee = $t02535626064._2
1092+ let lpFee = $t02551826226._1
1093+ let protocolFee = $t02551826226._2
10941094 let sigmaFeePerLpUpdated = if ((lpFee == 0))
10951095 then sigmaFeePerLp
10961096 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
10971097 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
10981098 }
10991099
11001100
11011101 func _depositAll (amount_) = {
11021102 let storage = _loadStorage()
11031103 let lpTotalSupply = storage._3
11041104 let weightAmplifier = storage._7
11051105 let slippageRate = storage._8
11061106 let feeMaxRate = storage._9
11071107 let assets = _loadAssets()
1108- let $t02657326626 = _loadAssetWeights()
1109- let assetWeights = $t02657326626._1
1110- let sigmaWeight = $t02657326626._2
1111- let $t02663126699 = _loadAssetBalances()
1112- let prevAssetBalances = $t02663126699._1
1113- let prevAssetTotalSupply = $t02663126699._2
1114- let $t02670527935 = if ((prevAssetTotalSupply == 0))
1108+ let $t02673526788 = _loadAssetWeights()
1109+ let assetWeights = $t02673526788._1
1110+ let sigmaWeight = $t02673526788._2
1111+ let $t02679326861 = _loadAssetBalances()
1112+ let prevAssetBalances = $t02679326861._1
1113+ let prevAssetTotalSupply = $t02679326861._2
1114+ let $t02686728097 = if ((prevAssetTotalSupply == 0))
11151115 then {
11161116 func foldFunc (acc,elem) = {
11171117 let index = acc._1
11181118 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11191119 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11201120 }
11211121
1122- let $t02714727221 = {
1122+ let $t02730927383 = {
11231123 let $l = assets
11241124 let $s = size($l)
11251125 let $acc0 = $Tuple2(0, nil)
11261126 func $f0_1 ($a,$i) = if (($i >= $s))
11271127 then $a
11281128 else foldFunc($a, $l[$i])
11291129
11301130 func $f0_2 ($a,$i) = if (($i >= $s))
11311131 then $a
11321132 else throw("List size exceeds 10")
11331133
11341134 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11351135 }
1136- let idx = $t02714727221._1
1137- let requiredAmountsNormalized = $t02714727221._2
1136+ let idx = $t02730927383._1
1137+ let requiredAmountsNormalized = $t02730927383._2
11381138 $Tuple2(amount_, requiredAmountsNormalized)
11391139 }
11401140 else {
11411141 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11421142 func foldFunc1 (acc,elem) = {
11431143 let index = acc._1
11441144 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11451145 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11461146 }
11471147
1148- let $t02776427839 = {
1148+ let $t02792628001 = {
11491149 let $l = assets
11501150 let $s = size($l)
11511151 let $acc0 = $Tuple2(0, nil)
11521152 func $f0_1 ($a,$i) = if (($i >= $s))
11531153 then $a
11541154 else foldFunc1($a, $l[$i])
11551155
11561156 func $f0_2 ($a,$i) = if (($i >= $s))
11571157 then $a
11581158 else throw("List size exceeds 10")
11591159
11601160 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11611161 }
1162- let idx = $t02776427839._1
1163- let requiredAmountsNormalized = $t02776427839._2
1162+ let idx = $t02792628001._1
1163+ let requiredAmountsNormalized = $t02792628001._2
11641164 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11651165 }
1166- let lpTokensToMint = $t02670527935._1
1167- let requiredAmountsNormalized = $t02670527935._2
1168- let $t02794128054 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1169- let assetBalances = $t02794128054._1
1170- let assetTotalSupply = $t02794128054._2
1166+ let lpTokensToMint = $t02686728097._1
1167+ let requiredAmountsNormalized = $t02686728097._2
1168+ let $t02810328216 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1169+ let assetBalances = $t02810328216._1
1170+ let assetTotalSupply = $t02810328216._2
11711171 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11721172 if ((err2 == err2))
11731173 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11741174 else throw("Strict value is not equal to itself.")
11751175 }
11761176
11771177
11781178 func _deposit (assetId_,amount_) = {
11791179 let storage = _loadStorage()
11801180 let lpTotalSupply = storage._3
11811181 let maxAllocAmplifier = storage._6
11821182 let weightAmplifier = storage._7
11831183 let slippageRate = storage._8
11841184 let feeMaxRate = storage._9
11851185 let assets = _loadAssets()
1186- let $t02874928802 = _loadAssetWeights()
1187- let assetWeights = $t02874928802._1
1188- let sigmaWeight = $t02874928802._2
1189- let $t02880728921 = _loadAssetBalances()
1190- let prevAssetBalances = $t02880728921._1
1191- let prevAssetTotalSupply = $t02880728921._2
1186+ let $t02891128964 = _loadAssetWeights()
1187+ let assetWeights = $t02891128964._1
1188+ let sigmaWeight = $t02891128964._2
1189+ let $t02896929083 = _loadAssetBalances()
1190+ let prevAssetBalances = $t02896929083._1
1191+ let prevAssetTotalSupply = $t02896929083._2
11921192 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
11931193 let assetTotalSupply = (prevAssetTotalSupply + amount_)
11941194 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
11951195 if ((err2 == err2))
11961196 then {
11971197 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11981198 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11991199 let lpTokensToMint = if ((lpTotalSupply == 0))
12001200 then (assetTotalSupply - fee)
12011201 else {
12021202 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12031203 let feeDiff = (fee - prevFee)
12041204 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12051205 let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
12061206 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12071207 if ((err3 == err3))
12081208 then lpTokensToMintInner
12091209 else throw("Strict value is not equal to itself.")
12101210 }
12111211 $Tuple2(lpTokensToMint, assetBalances)
12121212 }
12131213 else throw("Strict value is not equal to itself.")
12141214 }
12151215
12161216
12171217 func _withdrawAll (amount_) = {
12181218 let storage = _loadStorage()
12191219 let lpTotalSupply = storage._3
12201220 let lpFeeRate = storage._4
12211221 let protocolFeeRate = storage._5
12221222 let maxAllocAmplifier = storage._6
12231223 let weightAmplifier = storage._7
12241224 let slippageRate = storage._8
12251225 let feeMaxRate = storage._9
1226- let $t03084830916 = _loadAssetBalances()
1227- let prevAssetBalances = $t03084830916._1
1228- let prevAssetTotalSupply = $t03084830916._2
1229- let $t03092130974 = _loadAssetWeights()
1230- let assetWeights = $t03092130974._1
1231- let sigmaWeight = $t03092130974._2
1232- let $t03098031102 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, true)
1233- let lpFee = $t03098031102._1
1234- let protocolFee = $t03098031102._2
1235- let sigmaFeePerLpUpdated = $t03098031102._3
1226+ let $t03101031078 = _loadAssetBalances()
1227+ let prevAssetBalances = $t03101031078._1
1228+ let prevAssetTotalSupply = $t03101031078._2
1229+ let $t03108331136 = _loadAssetWeights()
1230+ let assetWeights = $t03108331136._1
1231+ let sigmaWeight = $t03108331136._2
1232+ let $t03114231264 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, true)
1233+ let lpFee = $t03114231264._1
1234+ let protocolFee = $t03114231264._2
1235+ let sigmaFeePerLpUpdated = $t03114231264._3
12361236 let lpTokensToBurn = ((amount_ - lpFee) - protocolFee)
12371237 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12381238 if ((err == err))
12391239 then {
1240- let $t03126531398 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1241- let assetBalances = $t03126531398._1
1242- let assetTotalSupply = $t03126531398._2
1243- let balancesToPay = $t03126531398._3
1240+ let $t03142731560 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1241+ let assetBalances = $t03142731560._1
1242+ let assetTotalSupply = $t03142731560._2
1243+ let balancesToPay = $t03142731560._3
12441244 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12451245 if ((err2 == err2))
12461246 then $Tuple6(lpTokensToBurn, balancesToPay, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12471247 else throw("Strict value is not equal to itself.")
12481248 }
12491249 else throw("Strict value is not equal to itself.")
12501250 }
12511251
12521252
12531253 func _withdraw (assetId_,amount_) = {
12541254 let storage = _loadStorage()
12551255 let lpAssetId = storage._1
12561256 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
12571257 let lpTotalSupply = storage._3
12581258 let lpFeeRate = storage._4
12591259 let protocolFeeRate = storage._5
12601260 let maxAllocAmplifier = storage._6
12611261 let weightAmplifier = storage._7
12621262 let slippageRate = storage._8
12631263 let feeMaxRate = storage._9
12641264 let lpAssetIdStr = toBase58String(lpAssetId)
12651265 let assets = _loadAssets()
1266- let $t03233732405 = _loadAssetBalances()
1267- let prevAssetBalances = $t03233732405._1
1268- let prevAssetTotalSupply = $t03233732405._2
1269- let $t03241032515 = _loadAssetWeights()
1270- let assetWeights = $t03241032515._1
1271- let sigmaWeight = $t03241032515._2
1266+ let $t03249932567 = _loadAssetBalances()
1267+ let prevAssetBalances = $t03249932567._1
1268+ let prevAssetTotalSupply = $t03249932567._2
1269+ let $t03257232677 = _loadAssetWeights()
1270+ let assetWeights = $t03257232677._1
1271+ let sigmaWeight = $t03257232677._2
12721272 let assetDecimals = _getDecimals(assetId_)
12731273 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
12741274 let assetIndex = value(indexOf(assets, assetId_))
12751275 let assetBalances = _decrementBalanceByIndex(prevAssetBalances, assetIndex, amountNormalized)
12761276 let assetTotalSupply = (prevAssetTotalSupply - amountNormalized)
12771277 let err1 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12781278 if ((err1 == err1))
12791279 then {
12801280 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12811281 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12821282 let lpTokensToBurn = if ((lpTotalSupply == 0))
12831283 then (assetTotalSupply - fee)
12841284 else {
12851285 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12861286 let feeDiff = (fee - prevFee)
12871287 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12881288 let lpTokensToBurnInner = (-1 * fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR))
12891289 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurnInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12901290 if ((err2 == err2))
12911291 then lpTokensToBurnInner
12921292 else throw("Strict value is not equal to itself.")
12931293 }
1294- let $t03427834401 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, false)
1295- let lpFee = $t03427834401._1
1296- let protocolFee = $t03427834401._2
1297- let sigmaFeePerLpUpdated = $t03427834401._3
1294+ let $t03444034563 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, false)
1295+ let lpFee = $t03444034563._1
1296+ let protocolFee = $t03444034563._2
1297+ let sigmaFeePerLpUpdated = $t03444034563._3
12981298 $Tuple5(lpTokensToBurn, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12991299 }
13001300 else throw("Strict value is not equal to itself.")
13011301 }
13021302
13031303
13041304 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13051305 let storage = _loadStorage()
13061306 let lpAssetId = storage._1
13071307 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13081308 let lpTotalSupply = storage._3
13091309 let lpFeeRate = storage._4
13101310 let protocolFeeRate = storage._5
13111311 let maxAllocAmplifier = storage._6
13121312 let weightAmplifier = storage._7
13131313 let slippageRate = storage._8
13141314 let feeMaxRate = storage._9
1315- let $t03494435012 = _loadAssetBalances()
1316- let prevAssetBalances = $t03494435012._1
1317- let prevAssetTotalSupply = $t03494435012._2
1318- let $t03501735070 = _loadAssetWeights()
1319- let assetWeights = $t03501735070._1
1320- let sigmaWeight = $t03501735070._2
1315+ let $t03510635174 = _loadAssetBalances()
1316+ let prevAssetBalances = $t03510635174._1
1317+ let prevAssetTotalSupply = $t03510635174._2
1318+ let $t03517935232 = _loadAssetWeights()
1319+ let assetWeights = $t03517935232._1
1320+ let sigmaWeight = $t03517935232._2
13211321 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13221322 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13231323 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1324+ let refUtilValue = (prevAssetTotalSupply - prevFee)
1325+ let start = 0
1326+ let stop = (sourceAmount_ + prevFee)
13241327 func foldFunc (acc,elem) = if (acc._1)
13251328 then acc
13261329 else {
1327- let targetAmount = acc._2
1328- let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1329- let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
1330- let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1331- let feeDiff = (fee - prevFee)
1332- let tempAmount = (sourceAmount_ - feeDiff)
1333- let check = if ((0 >= tempAmount))
1334- then throw("_swap: less than 0")
1335- else unit
1336- if ((check == check))
1337- then if (if (((targetAmount - tempAmount) > (-1 * PRECISION)))
1338- then (PRECISION > (targetAmount - tempAmount))
1339- else false)
1340- then {
1341- let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, tempAmount)
1342- let finalAssetTotalSupply = (assetTotalSupply - tempAmount)
1343- let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1344- then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1345- else false
1346- if ((err1 == err1))
1347- then $Tuple3(true, tempAmount, finalAssetBalances)
1348- else throw("Strict value is not equal to itself.")
1349- }
1350- else $Tuple3(false, tempAmount, tempAssetBalances)
1351- else throw("Strict value is not equal to itself.")
1330+ let startInner = acc._2
1331+ let stopInner = acc._3
1332+ let currentAmount = ((stopInner + startInner) / 2)
1333+ let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
1334+ let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
1335+ let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1336+ if (if ((PRECISION > (utilValue - refUtilValue)))
1337+ then ((utilValue - refUtilValue) > 0)
1338+ else false)
1339+ then $Tuple4(true, startInner, stopInner, currentAmount)
1340+ else if ((0 > (utilValue - refUtilValue)))
1341+ then $Tuple4(false, startInner, currentAmount, 0)
1342+ else $Tuple4(false, currentAmount, stopInner, 0)
13521343 }
13531344
1354- let $t03719737302 = {
1355- let $l = LIST_25
1356- let $s = size($l)
1357- let $acc0 = $Tuple3(false, sourceAmount_, nil)
1358- func $f0_1 ($a,$i) = if (($i >= $s))
1359- then $a
1360- else foldFunc($a, $l[$i])
1345+ let targetAmount = {
1346+ let targetAmount = sourceAmount_
1347+ let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1348+ let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
1349+ let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1350+ let feeDiff = (fee - prevFee)
1351+ if ((feeDiff == 0))
1352+ then targetAmount
1353+ else {
1354+ let $t03762037724 = {
1355+ let $l = LIST_64
1356+ let $s = size($l)
1357+ let $acc0 = $Tuple4(false, start, stop, 0)
1358+ func $f0_1 ($a,$i) = if (($i >= $s))
1359+ then $a
1360+ else foldFunc($a, $l[$i])
13611361
1362- func $f0_2 ($a,$i) = if (($i >= $s))
1363- then $a
1364- else throw("List size exceeds 25")
1362+ func $f0_2 ($a,$i) = if (($i >= $s))
1363+ then $a
1364+ else throw("List size exceeds 64")
13651365
1366- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
1366+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1367+ }
1368+ let success = $t03762037724._1
1369+ let startOut = $t03762037724._2
1370+ let stopOut = $t03762037724._3
1371+ let targetAmountOut = $t03762037724._4
1372+ if (!(success))
1373+ then throw(("_swap: can't calculate targetAmount=" + toString(targetAmountOut)))
1374+ else targetAmountOut
1375+ }
13671376 }
1368- let success = $t03719737302._1
1369- let targetAmount = $t03719737302._2
1370- let finalAssetBalances = $t03719737302._3
1371- if (!(success))
1372- then throw(("_swap: can't calculate targetAmount=" + toString(targetAmount)))
1373- else {
1374- let $t03741937566 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate, true)
1375- let lpFee = $t03741937566._1
1376- let protocolFee = $t03741937566._2
1377- let sigmaFeePerLpUpdated = $t03741937566._3
1377+ let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
1378+ let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
1379+ let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
1380+ then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1381+ else false
1382+ if ((err1 == err1))
1383+ then {
1384+ let $t03853738684 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate, true)
1385+ let lpFee = $t03853738684._1
1386+ let protocolFee = $t03853738684._2
1387+ let sigmaFeePerLpUpdated = $t03853738684._3
13781388 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13791389 }
1390+ else throw("Strict value is not equal to itself.")
13801391 }
13811392
13821393
13831394 @Callable(i)
13841395 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_) = {
13851396 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (_whenNotInitialized())
13861397 then _validateAssets(assets_, "init: invalid assets")
13871398 else false)
13881399 then _validateIntList(assetWeights_, 0, MAX_WEIGHT, "init: invalid assetWeights")
13891400 else false)
13901401 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
13911402 else false)
13921403 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
13931404 else false)
13941405 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
13951406 else false)
13961407 then _validateTokenName(lpTokenName_, "init: invalid name")
13971408 else false)
13981409 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
13991410 else false)
14001411 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14011412 else false)
14021413 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
14031414 else false)
14041415 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14051416 else false)
14061417 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14071418 else false)
14081419 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14091420 else false)
14101421 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14111422 else false
14121423 if ((err == err))
14131424 then {
1414- let $t03918639255 = _prepareAssetWeights(assetWeights_)
1415- let assetWeights = $t03918639255._1
1416- let sigmaWeight = $t03918639255._2
1425+ let $t04030040369 = _prepareAssetWeights(assetWeights_)
1426+ let assetWeights = $t04030040369._1
1427+ let sigmaWeight = $t04030040369._2
14171428 let assetBalances = _prepareAssetBalances(assets_)
14181429 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14191430 let lpAssetId = calculateAssetId(issue)
14201431 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
14211432 $Tuple2(((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())), unit)
14221433 }
14231434 else throw("Strict value is not equal to itself.")
14241435 }
14251436
14261437
14271438
14281439 @Callable(i)
14291440 func depositAll (amount_) = {
14301441 let err = if (if (_whenInitialized())
14311442 then _whenNotPaused()
14321443 else false)
14331444 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14341445 else false
14351446 if ((err == err))
14361447 then {
14371448 let storage = _loadStorage()
14381449 let lpAssetId = storage._1
14391450 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14401451 let assets = _loadAssets()
1441- let $t04091040995 = _depositAll(amount_)
1442- let lpTokensToMint = $t04091040995._1
1443- let requiredAmountsNormalized = $t04091040995._2
1444- let assetBalances = $t04091040995._3
1452+ let $t04202442109 = _depositAll(amount_)
1453+ let lpTokensToMint = $t04202442109._1
1454+ let requiredAmountsNormalized = $t04202442109._2
1455+ let assetBalances = $t04202442109._3
14451456 func foldFunc (acc,elem) = {
14461457 let index = acc._1
14471458 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
14481459 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
14491460 let requiredAmountNormalized = requiredAmountsNormalized[index]
14501461 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
14511462 let err1 = if ((paymentAssetStr != elem))
14521463 then throw(("depositAll: invalid payment: index=" + toString(index)))
14531464 else if ((0 >= requiredAmount))
14541465 then throw("depositAll: too little amount required")
14551466 else unit
14561467 if ((err1 == err1))
14571468 then {
14581469 let change = if ((i.payments[index].amount > requiredAmount))
14591470 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
14601471 else if ((requiredAmount > i.payments[index].amount))
14611472 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
14621473 else nil
14631474 $Tuple2((index + 1), (acc._2 ++ change))
14641475 }
14651476 else throw("Strict value is not equal to itself.")
14661477 }
14671478
1468- let $t04213842200 = {
1479+ let $t04325243314 = {
14691480 let $l = assets
14701481 let $s = size($l)
14711482 let $acc0 = $Tuple2(0, nil)
14721483 func $f0_1 ($a,$i) = if (($i >= $s))
14731484 then $a
14741485 else foldFunc($a, $l[$i])
14751486
14761487 func $f0_2 ($a,$i) = if (($i >= $s))
14771488 then $a
14781489 else throw("List size exceeds 10")
14791490
14801491 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
14811492 }
1482- let idx = $t04213842200._1
1483- let changeActions = $t04213842200._2
1493+ let idx = $t04325243314._1
1494+ let changeActions = $t04325243314._2
14841495 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14851496 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
14861497 }
14871498 else throw("Strict value is not equal to itself.")
14881499 }
14891500
14901501
14911502
14921503 @Callable(i)
14931504 func deposit (minLpAmount_) = {
14941505 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
14951506 if ((err == err))
14961507 then {
14971508 let storage = _loadStorage()
14981509 let lpAssetId = storage._1
14991510 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15001511 let err1 = if (if (if (if (_whenInitialized())
15011512 then _whenNotPaused()
15021513 else false)
15031514 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15041515 else false)
15051516 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15061517 else false)
15071518 then _validateInt(i.payments[0].amount, 0, MAX_INT, "deposit: invalid payment amount")
15081519 else false
15091520 if ((err1 == err1))
15101521 then {
15111522 let assetStr = _assetToStr(i.payments[0].assetId)
15121523 let assetDecimals = _getDecimals(assetStr)
15131524 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1514- let $t04357943653 = _deposit(assetStr, amountNormalized)
1515- let lpTokensToMint = $t04357943653._1
1516- let assetBalances = $t04357943653._2
1525+ let $t04469344767 = _deposit(assetStr, amountNormalized)
1526+ let lpTokensToMint = $t04469344767._1
1527+ let assetBalances = $t04469344767._2
15171528 let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
15181529 if ((err2 == err2))
15191530 then {
15201531 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15211532 $Tuple2((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
15221533 }
15231534 else throw("Strict value is not equal to itself.")
15241535 }
15251536 else throw("Strict value is not equal to itself.")
15261537 }
15271538 else throw("Strict value is not equal to itself.")
15281539 }
15291540
15301541
15311542
15321543 @Callable(i)
15331544 func withdrawAll () = {
15341545 let storage = _loadStorage()
15351546 let lpAssetId = storage._1
15361547 let lpAssetIdStr = toBase58String(lpAssetId)
15371548 let lpDecimals = _getDecimals(lpAssetIdStr)
15381549 let assets = _loadAssets()
15391550 let err = if (if (if (if (_whenInitialized())
15401551 then _whenNotPaused()
15411552 else false)
15421553 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
15431554 else false)
15441555 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
15451556 else false)
15461557 then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdrawAll: invalid payment amount")
15471558 else false
15481559 if ((err == err))
15491560 then {
1550- let $t04487445003 = _withdrawAll(i.payments[0].amount)
1551- let lpTokensToBurn = $t04487445003._1
1552- let balancesToPay = $t04487445003._2
1553- let assetBalances = $t04487445003._3
1554- let lpFee = $t04487445003._4
1555- let protocolFee = $t04487445003._5
1556- let sigmaFeePerLpUpdated = $t04487445003._6
1561+ let $t04598846117 = _withdrawAll(i.payments[0].amount)
1562+ let lpTokensToBurn = $t04598846117._1
1563+ let balancesToPay = $t04598846117._2
1564+ let assetBalances = $t04598846117._3
1565+ let lpFee = $t04598846117._4
1566+ let protocolFee = $t04598846117._5
1567+ let sigmaFeePerLpUpdated = $t04598846117._6
15571568 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
15581569 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15591570 $Tuple2((((((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15601571 }
15611572 else throw("Strict value is not equal to itself.")
15621573 }
15631574
15641575
15651576
15661577 @Callable(i)
15671578 func withdraw (assetId_,amount_) = {
15681579 let storage = _loadStorage()
15691580 let lpAssetId = storage._1
15701581 let lpAssetIdStr = toBase58String(lpAssetId)
15711582 let assets = _loadAssets()
15721583 let err = if (if (if (if (if (if (_whenInitialized())
15731584 then _whenNotPaused()
15741585 else false)
15751586 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
15761587 else false)
15771588 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
15781589 else false)
15791590 then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdraw: invalid payment amount")
15801591 else false)
15811592 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
15821593 else false)
15831594 then _validateInt(amount_, 0, MAX_INT, "withdraw: invalid amount")
15841595 else false
15851596 if ((err == err))
15861597 then {
1587- let $t04648446592 = _withdraw(assetId_, amount_)
1588- let lpTokensToBurn = $t04648446592._1
1589- let assetBalances = $t04648446592._2
1590- let lpFee = $t04648446592._3
1591- let protocolFee = $t04648446592._4
1592- let sigmaFeePerLpUpdated = $t04648446592._5
1598+ let $t04759847706 = _withdraw(assetId_, amount_)
1599+ let lpTokensToBurn = $t04759847706._1
1600+ let assetBalances = $t04759847706._2
1601+ let lpFee = $t04759847706._3
1602+ let protocolFee = $t04759847706._4
1603+ let sigmaFeePerLpUpdated = $t04759847706._5
15931604 let requiredLpTokens = ((lpTokensToBurn + lpFee) + protocolFee)
15941605 let changeAction = if ((requiredLpTokens > i.payments[0].amount))
15951606 then throw("withdraw: insufficient amount")
15961607 else if ((i.payments[0].amount > requiredLpTokens))
15971608 then [ScriptTransfer(i.caller, (i.payments[0].amount - requiredLpTokens), i.payments[0].assetId)]
15981609 else nil
15991610 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16001611 $Tuple2((((((([Burn(lpAssetId, lpTokensToBurn), ScriptTransfer(i.caller, amount_, _strToAsset(assetId_))] ++ changeAction) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16011612 }
16021613 else throw("Strict value is not equal to itself.")
16031614 }
16041615
16051616
16061617
16071618 @Callable(i)
16081619 func swap (targetAssetId_,minAmount_) = {
16091620 let storage = _loadStorage()
16101621 let lpAssetId = storage._1
16111622 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16121623 let assets = _loadAssets()
16131624 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16141625 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16151626 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16161627 if ((sourceAssetIndex == sourceAssetIndex))
16171628 then {
16181629 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16191630 if ((targetAssetIndex == targetAssetIndex))
16201631 then {
16211632 let err = if (if (if (if (if (_whenInitialized())
16221633 then _whenNotPaused()
16231634 else false)
16241635 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16251636 else false)
16261637 then _validateInt(sourceAmountNormalized, 0, MAX_INT, "swap: invalid source amount")
16271638 else false)
16281639 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16291640 else false)
16301641 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16311642 else false
16321643 if ((err == err))
16331644 then {
1634- let $t04875648914 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1635- let targetAmountNormalized = $t04875648914._1
1636- let finalAssetBalances = $t04875648914._2
1637- let lpFee = $t04875648914._3
1638- let protocolFee = $t04875648914._4
1639- let sigmaFeePerLpUpdated = $t04875648914._5
1645+ let $t04987050028 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1646+ let targetAmountNormalized = $t04987050028._1
1647+ let finalAssetBalances = $t04987050028._2
1648+ let lpFee = $t04987050028._3
1649+ let protocolFee = $t04987050028._4
1650+ let sigmaFeePerLpUpdated = $t04987050028._5
16401651 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16411652 let targetDecimals = _getDecimals(targetAssetId_)
16421653 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16431654 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: insufficient final amount")
16441655 if ((err1 == err1))
16451656 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16461657 else throw("Strict value is not equal to itself.")
16471658 }
16481659 else throw("Strict value is not equal to itself.")
16491660 }
16501661 else throw("Strict value is not equal to itself.")
16511662 }
16521663 else throw("Strict value is not equal to itself.")
16531664 }
16541665
16551666
16561667
16571668 @Callable(i)
16581669 func getDepositAll (amount_) = {
16591670 let err = _validateInt(amount_, 0, MAX_INT, "getDepositAll: invalid amount")
16601671 if ((err == err))
16611672 then {
1662- let $t05004050125 = _depositAll(amount_)
1663- let lpTokensToMint = $t05004050125._1
1664- let requiredAmountsNormalized = $t05004050125._2
1665- let assetBalances = $t05004050125._3
1673+ let $t05115451239 = _depositAll(amount_)
1674+ let lpTokensToMint = $t05115451239._1
1675+ let requiredAmountsNormalized = $t05115451239._2
1676+ let assetBalances = $t05115451239._3
16661677 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
16671678 }
16681679 else throw("Strict value is not equal to itself.")
16691680 }
16701681
16711682
16721683
16731684 @Callable(i)
16741685 func getDeposit (assetId_,amount_) = {
16751686 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
16761687 then _validateInt(amount_, 0, MAX_INT, "getDeposit: invalid amount")
16771688 else false
16781689 if ((err == err))
16791690 then {
16801691 let storage = _loadStorage()
16811692 let lpAssetId = storage._1
16821693 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16831694 let assetDecimals = _getDecimals(assetId_)
16841695 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1685- let $t05088450958 = _deposit(assetId_, amountNormalized)
1686- let lpTokensToMint = $t05088450958._1
1687- let assetBalances = $t05088450958._2
1696+ let $t05199852072 = _deposit(assetId_, amountNormalized)
1697+ let lpTokensToMint = $t05199852072._1
1698+ let assetBalances = $t05199852072._2
16881699 $Tuple2(nil, lpTokensToMint)
16891700 }
16901701 else throw("Strict value is not equal to itself.")
16911702 }
16921703
16931704
16941705
16951706 @Callable(i)
16961707 func getWithdrawAll (amount_) = {
16971708 let err = _validateInt(amount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
16981709 if ((err == err))
16991710 then {
1700- let $t05132951445 = _withdrawAll(amount_)
1701- let lpTokensToBurn = $t05132951445._1
1702- let balancesToGet = $t05132951445._2
1703- let assetBalances = $t05132951445._3
1704- let lpFee = $t05132951445._4
1705- let protocolFee = $t05132951445._5
1706- let sigmaFeePerLpUpdated = $t05132951445._6
1711+ let $t05244352559 = _withdrawAll(amount_)
1712+ let lpTokensToBurn = $t05244352559._1
1713+ let balancesToGet = $t05244352559._2
1714+ let assetBalances = $t05244352559._3
1715+ let lpFee = $t05244352559._4
1716+ let protocolFee = $t05244352559._5
1717+ let sigmaFeePerLpUpdated = $t05244352559._6
17071718 $Tuple2(nil, balancesToGet)
17081719 }
17091720 else throw("Strict value is not equal to itself.")
17101721 }
17111722
17121723
17131724
17141725 @Callable(i)
17151726 func getWithdraw (assetId_,amount_) = {
1716- let $t05181151919 = _withdraw(assetId_, amount_)
1717- let lpTokensToBurn = $t05181151919._1
1718- let assetBalances = $t05181151919._2
1719- let lpFee = $t05181151919._3
1720- let protocolFee = $t05181151919._4
1721- let sigmaFeePerLpUpdated = $t05181151919._5
1727+ let $t05292553033 = _withdraw(assetId_, amount_)
1728+ let lpTokensToBurn = $t05292553033._1
1729+ let assetBalances = $t05292553033._2
1730+ let lpFee = $t05292553033._3
1731+ let protocolFee = $t05292553033._4
1732+ let sigmaFeePerLpUpdated = $t05292553033._5
17221733 let requiredLpTokens = ((lpTokensToBurn + lpFee) + protocolFee)
17231734 $Tuple2(nil, requiredLpTokens)
17241735 }
17251736
17261737
17271738
17281739 @Callable(i)
17291740 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
17301741 let storage = _loadStorage()
17311742 let lpAssetId = storage._1
17321743 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17331744 let assets = _loadAssets()
17341745 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
17351746 if ((sourceAssetIndex == sourceAssetIndex))
17361747 then {
17371748 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
17381749 if ((targetAssetIndex == targetAssetIndex))
17391750 then {
17401751 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
17411752 let err = if (_validateInt(sourceAmountNormalized, 0, MAX_INT, "swap: invalid source amount"))
17421753 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
17431754 else false
17441755 if ((err == err))
17451756 then {
1746- let $t05317953337 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1747- let targetAmountNormalized = $t05317953337._1
1748- let finalAssetBalances = $t05317953337._2
1749- let lpFee = $t05317953337._3
1750- let protocolFee = $t05317953337._4
1751- let sigmaFeePerLpUpdated = $t05317953337._5
1757+ let $t05429354451 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1758+ let targetAmountNormalized = $t05429354451._1
1759+ let finalAssetBalances = $t05429354451._2
1760+ let lpFee = $t05429354451._3
1761+ let protocolFee = $t05429354451._4
1762+ let sigmaFeePerLpUpdated = $t05429354451._5
17521763 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17531764 let targetDecimals = _getDecimals(targetAssetId_)
17541765 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17551766 $Tuple2(nil, finalAmount)
17561767 }
17571768 else throw("Strict value is not equal to itself.")
17581769 }
17591770 else throw("Strict value is not equal to itself.")
17601771 }
17611772 else throw("Strict value is not equal to itself.")
17621773 }
17631774
17641775
17651776
17661777 @Callable(i)
17671778 func getClaim (user_) = {
17681779 let user = if ((size(user_) > 0))
17691780 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
17701781 else i.caller
1771- let $t05397954035 = _checkpoint(user)
1772- let checkpointActions = $t05397954035._1
1773- let userProfits = $t05397954035._2
1782+ let $t05509355149 = _checkpoint(user)
1783+ let checkpointActions = $t05509355149._1
1784+ let userProfits = $t05509355149._2
17741785 $Tuple2(nil, userProfits)
17751786 }
17761787
17771788
17781789
17791790 @Callable(i)
17801791 func checkpoint (user_) = {
17811792 let err = if (_whenInitialized())
17821793 then _whenNotPaused()
17831794 else false
17841795 if ((err == err))
17851796 then {
17861797 let user = if ((size(user_) > 0))
17871798 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
17881799 else i.caller
17891800 _checkpoint(user)
17901801 }
17911802 else throw("Strict value is not equal to itself.")
17921803 }
17931804
17941805
17951806
17961807 @Callable(i)
17971808 func stake () = {
17981809 let err = if (_whenInitialized())
17991810 then _whenNotPaused()
18001811 else false
18011812 if ((err == err))
18021813 then {
18031814 let storage = _loadStorage()
18041815 let lpAssetIdStr = _assetToStr(storage._1)
18051816 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
18061817 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
18071818 else false)
18081819 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
18091820 else false
18101821 if ((err1 == err1))
18111822 then {
1812- let $t05491954979 = _checkpoint(i.caller)
1813- let checkpointActions = $t05491954979._1
1814- let userProfits = $t05491954979._2
1823+ let $t05603356093 = _checkpoint(i.caller)
1824+ let checkpointActions = $t05603356093._1
1825+ let userProfits = $t05603356093._2
18151826 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
18161827 }
18171828 else throw("Strict value is not equal to itself.")
18181829 }
18191830 else throw("Strict value is not equal to itself.")
18201831 }
18211832
18221833
18231834
18241835 @Callable(i)
18251836 func unstake (amount_) = {
18261837 let err = if (_whenInitialized())
18271838 then _whenNotPaused()
18281839 else false
18291840 if ((err == err))
18301841 then {
18311842 let storage = _loadStorage()
18321843 let lpAssetId = storage._1
18331844 let userLp = _loadUserLp(i.caller)
18341845 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
18351846 if ((err1 == err1))
18361847 then {
1837- let $t05549055550 = _checkpoint(i.caller)
1838- let checkpointActions = $t05549055550._1
1839- let userProfits = $t05549055550._2
1848+ let $t05660456664 = _checkpoint(i.caller)
1849+ let checkpointActions = $t05660456664._1
1850+ let userProfits = $t05660456664._2
18401851 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
18411852 }
18421853 else throw("Strict value is not equal to itself.")
18431854 }
18441855 else throw("Strict value is not equal to itself.")
18451856 }
18461857
18471858
18481859
18491860 @Callable(i)
18501861 func claim (user_,assets_) = {
18511862 let err = if (if (_whenInitialized())
18521863 then _whenNotPaused()
18531864 else false)
18541865 then _validateInt(size(assets_), 1, 10, "claim: invalid assets size")
18551866 else false
18561867 if ((err == err))
18571868 then {
18581869 let user = if ((size(user_) > 0))
18591870 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
18601871 else i.caller
18611872 let storage = _loadStorage()
18621873 let lpAssetId = storage._1
18631874 let lpAssetIdStr = _assetToStr(lpAssetId)
18641875 let assets = [lpAssetIdStr, _loadAssets()]
18651876 let maxIndex = (size(assets) - 1)
18661877 let userLp = _loadUserLp(user)
1867- let $t05637356429 = _checkpoint(user)
1868- let checkpointActions = $t05637356429._1
1869- let userProfits = $t05637356429._2
1878+ let $t05748757543 = _checkpoint(user)
1879+ let checkpointActions = $t05748757543._1
1880+ let userProfits = $t05748757543._2
18701881 func foldFunc (acc,profit) = {
18711882 let index = acc._1
18721883 if ((index > maxIndex))
18731884 then $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
18741885 else {
18751886 let asset = assets[index]
18761887 if (containsElement(assets_, asset))
18771888 then $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
18781889 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
18791890 }
18801891 }
18811892
1882- let $t05691857009 = {
1893+ let $t05803258123 = {
18831894 let $l = userProfits
18841895 let $s = size($l)
18851896 let $acc0 = $Tuple3(0, nil, nil)
18861897 func $f0_1 ($a,$i) = if (($i >= $s))
18871898 then $a
18881899 else foldFunc($a, $l[$i])
18891900
18901901 func $f0_2 ($a,$i) = if (($i >= $s))
18911902 then $a
18921903 else throw("List size exceeds 11")
18931904
18941905 $f0_2($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)
18951906 }
1896- let idx = $t05691857009._1
1897- let userProfitsUpdated = $t05691857009._2
1898- let profitActions = $t05691857009._3
1907+ let idx = $t05803258123._1
1908+ let userProfitsUpdated = $t05803258123._2
1909+ let profitActions = $t05803258123._3
18991910 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19001911 }
19011912 else throw("Strict value is not equal to itself.")
19021913 }
19031914
19041915
19051916
19061917 @Callable(i)
19071918 func pause () = {
19081919 let err = if (if (_onlyPauser(i.caller))
19091920 then _whenInitialized()
19101921 else false)
19111922 then _whenNotPaused()
19121923 else false
19131924 if ((err == err))
19141925 then $Tuple2(_savePause(true), unit)
19151926 else throw("Strict value is not equal to itself.")
19161927 }
19171928
19181929
19191930
19201931 @Callable(i)
19211932 func unpause () = {
19221933 let err = if (if (_onlyPauser(i.caller))
19231934 then _whenInitialized()
19241935 else false)
19251936 then _whenPaused()
19261937 else false
19271938 if ((err == err))
19281939 then $Tuple2(_savePause(false), unit)
19291940 else throw("Strict value is not equal to itself.")
19301941 }
19311942
19321943
19331944
19341945 @Callable(i)
19351946 func updatePauser (pauser_) = {
19361947 let err = if (if (_onlyThisContract(i.caller))
19371948 then _whenInitialized()
19381949 else false)
19391950 then _validateAddress(pauser_, "updatePauser: invalid pauser")
19401951 else false
19411952 if ((err == err))
19421953 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
19431954 else throw("Strict value is not equal to itself.")
19441955 }
19451956
19461957

github/deemru/w8io/873ac7e 
262.55 ms