tx · 4WXGM8Ex4JopqvBz4rhWERaoxfZ1CnDr23kccnmy9WXT

3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk:  -0.06000000 Waves

2024.01.12 12:19 [3993917] smart account 3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk > SELF 0.00000000 Waves

{ "type": 13, "id": "4WXGM8Ex4JopqvBz4rhWERaoxfZ1CnDr23kccnmy9WXT", "fee": 6000000, "feeAssetId": null, "timestamp": 1705051108786, "version": 2, "chainId": 87, "sender": "3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk", "senderPublicKey": "DGuDyEBiewoZje46attYBabwJWnk7PPwtLi6yBjzctPV", "proofs": [ "5dX9oNTNWqhoCHpyT1mj634FBNFPMSrEiRPsbG133PFwUNLYc9auPPLj87ngH7rHSRm1U6L25NJk9E4u8WKYfBM" ], "script": "base64:BgKMAQgCEhAKDhgYAQEICAEBAQEBCAEIEgMKAQESAwoBARIAEgQKAggBEgQKAggBEgMKAQESBAoCCAESAwoBARIECgIIARIFCgMICAESAwoBCBIAEgASAwoBCBIAEgMKAQESAwoBCBIDCgEIEgQKAgEBEgYKBAEBAQESABIAEgASAwoBCBIECgIIARIDCgEIfwADU0VQAgJfXwAFV0FWRVMCBXdhdmVzAAdNQVhfSU5UAP//////////fwAHTUFYX0ZFRQDAhD0ADU1BWF9BTVBMSUZJRVIAwIQ9ABRNQVhfV0VJR0hUX0FNUExJRklFUgDAhD0ACk1BWF9XRUlHSFQAwIQ9AA9GRUVfUkFURV9GQUNUT1IAwIQ9AAtSQVRFX0ZBQ1RPUgDAhD0ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgICQu7rWrfANABdESVNCQWxBTkNFX0NPRUZGX0ZBQ1RPUgkAtgIBAICglKWNHQAQWkVST19JTlRfTElTVF8xMAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAAQWkVST19JTlRfTElTVF8xMQkAzQgCBRBaRVJPX0lOVF9MSVNUXzEwAAAACklOREVYX0xJU1QJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJBQNuaWwAC1pFUk9fQklHSU5UCQC2AgEAAAATWkVST19CSUdJTlRfTElTVF8xMQkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAUDbmlsAAxJTlRfREVDSU1BTFMACAAPQklHSU5UX0RFQ0lNQUxTABIAB0xJU1RfNjQJAL0JAgJ/MF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMAIBXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX1NUT1JBR0UCB1NUT1JBR0UACktFWV9BU1NFVFMCBkFTU0VUUwASS0VZX0FTU0VUX0JBTEFOQ0VTAg5BU1NFVF9CQUxBTkNFUwATS0VZX1JFV0FSRF9CQUxBTkNFUwIPUkVXQVJEX0JBTEFOQ0VTABFLRVlfQVNTRVRfV0VJR0hUUwINQVNTRVRfV0VJR0hUUwAKS0VZX0xQX0ZFRQIGTFBfRkVFABBLRVlfUFJPVE9DT0xfRkVFAgxQUk9UT0NPTF9GRUUADUtFWV9QUkVDSVNJT04CCVBSRUNJU0lPTgAUS0VZX1NJR01BX0ZFRV9QRVJfTFACEFNJR01BX0ZFRV9QRVJfTFAAGUtFWV9VU0VSX1NJR01BX0ZFRV9QRVJfTFACFVVTRVJfU0lHTUFfRkVFX1BFUl9MUAALS0VZX1VTRVJfTFACB1VTRVJfTFAADEtFWV9UT1RBTF9MUAIIVE9UQUxfTFAAEEtFWV9VU0VSX1BST0ZJVFMCDFVTRVJfUFJPRklUUwAMS0VZX1dBVENIRE9HAghXQVRDSERPRwATS0VZX1dBVENIRE9HX09GRlNFVAIPV0FUQ0hET0dfT0ZGU0VUABNLRVlfV0FUQ0hET0dfSEVJR0hUAg9XQVRDSERPR19IRUlHSFQBEF92YWxpZGF0ZUFkZHJlc3MCCGFkZHJlc3NfBGVycl8EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQ5fdmFsaWRhdGVBc3NldAIIYXNzZXRJZF8EZXJyXwMJAAACBQhhc3NldElkXwUFV0FWRVMGBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBDV92YWxpZGF0ZUJvb2wDBHZhbF8HdGFyZ2V0XwRlcnJfAwkBAiE9AgUEdmFsXwUHdGFyZ2V0XwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFdmFsMV8FdmFsMl8EZXJyXwMJAAACBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEQX3ZhbGlkYXRlSW50TGlzdAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAckbWF0Y2gwCQC2CQEFBGVsZW0DCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwAwUDYWNjCQEMX3ZhbGlkYXRlSW50BAUBYQUObG93ZXJCb3VuZGFyeV8FDnVwcGVyQm91bmRhcnlfBQRlcnJfBwkAAgEFBGVycl8KAAIkbAUEdmFsXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEPX3ZhbGlkYXRlQXNzZXRzAgdhc3NldHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0DBQNhY2MJAQ5fdmFsaWRhdGVBc3NldAIFBGVsZW0FBGVycl8HCgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEl92YWxpZGF0ZUludEVxdWFscwMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARJfdmFsaWRhdGVUb2tlbk5hbWUCBHZhbF8EZXJyXwMDCQBmAgAECQCxAgEFBHZhbF8GCQBmAgkAsQIBBQR2YWxfABAJAAIBBQRlcnJfBgETX3ZhbGlkYXRlVG9rZW5EZXNjcgIEdmFsXwRlcnJfAwkAZgIJALECAQUEdmFsXwDoBwkAAgEFBGVycl8GARFfdmFsaWRhdGVEZWNpbWFscwIEdmFsXwRlcnJfAwMJAGYCAAAFBHZhbF8GCQBmAgUEdmFsXwAICQACAQUEZXJyXwYBEF92YWxpZGF0ZVBheW1lbnQECHBheW1lbnRfCGFzc2V0SWRfD3JlcXVpcmVkQW1vdW50XwRlcnJfBAckbWF0Y2gwCAUIcGF5bWVudF8HYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwAwkBAiE9AgUIYXNzZXRJZF8JANgEAQUBYQkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAMJAGYCBQ9yZXF1aXJlZEFtb3VudF8IBQhwYXltZW50XwZhbW91bnQJAAIBCQCsAgIFBGVycl8CCDogYW1vdW50BgkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwVsaXN0XwR2YWxfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQVsaXN0XwUEdmFsXwkAAgEFBGVycl8GAQtfYXNzZXRUb1N0cgEGYXNzZXRfBAckbWF0Y2gwBQZhc3NldF8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkA2AQBBQFhBQVXQVZFUwELX3N0clRvQXNzZXQBBmFzc2V0XwMDCQAAAgUGYXNzZXRfBQVXQVZFUwYJAAACBQZhc3NldF8CAAUEdW5pdAkA2QQBBQZhc3NldF8BCl9sb2FkUGF1c2UABAckbWF0Y2gwCQCgCAEFCktFWV9QQVVTRUQDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYQUHJG1hdGNoMAUBYQcBCl9zYXZlUGF1c2UBCWlzUGF1c2VkXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUKS0VZX1BBVVNFRAUJaXNQYXVzZWRfBQNuaWwBC19sb2FkUGF1c2VyAAQHJG1hdGNoMAkAoggBBQpLRVlfUEFVU0VSAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABC19zYXZlUGF1c2VyAQdwYXVzZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9QQVVTRVIJAKUIAQUHcGF1c2VyXwUDbmlsAQ1fbG9hZE11bHRpc2lnAAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVNdWx0aXNpZwEJbXVsdGlzaWdfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9NVUxUSVNJRwkApQgBBQltdWx0aXNpZ18FA25pbAEMX2xvYWRTdG9yYWdlAAQHJG1hdGNoMAkAoggBBQtLRVlfU1RPUkFHRQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAEBnN0cnVjdAkAtQkCBQFhBQNTRVAJAJwKCgkA2QQBCQCRAwIFBnN0cnVjdAAACQAAAgkAkQMCBQZzdHJ1Y3QAAQIBMQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAFCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAICQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBnN0cnVjdAAJCQCcCgoBAAcAAAAAAAAAAAAAAAAAAAkBB0FkZHJlc3MBAQABDF9zYXZlU3RvcmFnZQEIc3RvcmFnZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgULS0VZX1NUT1JBR0UJALkJAgkAzAgCCQDYBAEIBQhzdG9yYWdlXwJfMQkAzAgCAwgFCHN0b3JhZ2VfAl8yAgExAgEwCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl8zCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl80CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl81CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl82CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl83CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl84CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl85CQDMCAIJAKUIAQgFCHN0b3JhZ2VfA18xMAUDbmlsBQNTRVAFA25pbAELX2xvYWRBc3NldHMABAckbWF0Y2gwCQCiCAEFCktFWV9BU1NFVFMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACQC9CQIFAWEFA1NFUAUDbmlsBQNuaWwBC19zYXZlQXNzZXRzAQdhc3NldHNfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9BU1NFVFMJALsJAgUHYXNzZXRzXwUDU0VQBQNuaWwBEl9sb2FkQXNzZXRCYWxhbmNlcwAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EB2JhbGFuY2UJAQ1wYXJzZUludFZhbHVlAQUEZWxlbQkAlAoCCQDNCAIIBQNhY2MCXzEFB2JhbGFuY2UJAGQCCAUD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BGVsZW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFEEtFWV9VU0VSX1BST0ZJVFMJAMwIAgkApQgBBQV1c2VyXwUDbmlsBQNTRVAJALsJAgoAAiRsBQR2YWxfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBQNTRVAFA25pbAENX2xvYWRXYXRjaGRvZwAEByRtYXRjaDAJAKIIAQUMS0VZX1dBVENIRE9HAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlV2F0Y2hkb2cBCXdhdGNoZG9nXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfV0FUQ0hET0cJAKUIAQUJd2F0Y2hkb2dfBQNuaWwBE19sb2FkV2F0Y2hkb2dPZmZzZXQABAckbWF0Y2gwCQCfCAEFE0tFWV9XQVRDSERPR19PRkZTRVQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABE19zYXZlV2F0Y2hkb2dPZmZzZXQBB29mZnNldF8JAMwIAgkBDEludGVnZXJFbnRyeQIFE0tFWV9XQVRDSERPR19PRkZTRVQFB29mZnNldF8FA25pbAERX29ubHlUaGlzQ29udHJhY3QBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfBQR0aGlzCQACAQIZX29ubHlUaGlzQ29udHJhY3Q6IHJldmVydAYBEF93aGVuTXVsdGlzaWdTZXQAAwkAAAIJAQ1fbG9hZE11bHRpc2lnAAkBB0FkZHJlc3MBAQAJAAIBAhhfd2hlbk11bHRpc2lnU2V0OiByZXZlcnQGARNfd2hlbk5vdEluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQECIT0CCAUHc3RvcmFnZQJfMQEACQACAQIbX3doZW5Ob3RJbml0aWFsaXplZDogcmV2ZXJ0BgEQX3doZW5Jbml0aWFsaXplZAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UAAwkAAAIIBQdzdG9yYWdlAl8xAQAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBDl9jaGVja1dhdGNoZG9nAAQCd2QEByRtYXRjaDAJAJoIAgkBDV9sb2FkV2F0Y2hkb2cABRNLRVlfV0FUQ0hET0dfSEVJR0hUAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAkAZAIFAWEJARNfbG9hZFdhdGNoZG9nT2Zmc2V0AAAAAwkAZgIFBmhlaWdodAUCd2QJAAIBAhZfY2hlY2tXYXRjaGRvZzogcmV2ZXJ0BgEMX2dldERlY2ltYWxzAQhhc3NldElkXwQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwCAUBYQhkZWNpbWFscwkAAgEJAKwCAgIXX2dldERlY2ltYWxzOiBubyBhc3NldD0FCGFzc2V0SWRfARJfbm9ybWFsaXplRGVjaW1hbHMEB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwZyb3VuZF8DCQBnAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18JAG4EBQdhbW91bnRfAAEJAGwGAAoAAAkAZQIFD3NvdXJjZURl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AwIFCGFtb3VudHNfBQVpbmRleAQKbmV3QmFsYW5jZQkAZAIFBGVsZW0FBmFtb3VudAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQpuZXdCYWxhbmNlCQBkAggFA2FjYwJfMwUKbmV3QmFsYW5jZQQGcmVzdWx0CgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAggFBnJlc3VsdAJfMggFBnJlc3VsdAJfMwEcX2luY3JlbWVudEJhbGFuY2VzQnlQYXltZW50cwUJYmFsYW5jZXNfCXBheW1lbnRzXwdhc3NldHNfCWRlY2ltYWxzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQHcGF5bWVudAkAkQMCBQlwYXltZW50c18FBWluZGV4BA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEIBQdwYXltZW50B2Fzc2V0SWQEA2VycgMJAQIhPQIFD3BheW1lbnRBc3NldFN0cgkAkQMCBQdhc3NldHNfBQVpbmRleAkAAgEJAKwCAgkArAICBQRlcnJfAgg6IGluZGV4PQkApAMBBQVpbmRleAUEdW5pdAMJAAACBQNlcnIFA2VycgQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQKbmV3QmFsYW5jZQkAZAIFBGVsZW0JARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCBQlwYXltZW50c18FBWluZGV4BmFtb3VudAUNYXNzZXREZWNpbWFscwUJ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AgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBEl9jYWxjdWxhdGVNaW51c0ZlZQUIYmFsYW5jZV8MZXF1aWxpYnJpdW1fCWxwQW1vdW50XxB3ZWlnaHRBbXBsaWZpZXJfEGRpc2JhbGFuY2VDb2VmZl8ECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZQIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQhiYWxhbmNlXwUJdGhyZXNob2xkAAAJAKADAQkAvQIECQC8AgMJALYCAQUJbHBBbW91bnRfCQC2AgEFEGRpc2JhbGFuY2VDb2VmZl8FF0RJU0JBbEFOQ0VfQ09FRkZfRkFDVE9SCQC2AgEJAGUCBQl0aHJlc2hvbGQFCGJhbGFuY2VfCQC2AgEFCXRocmVzaG9sZAUHQ0VJTElORwEXX2NhbGN1bGF0ZU1pbnVzRmVlRGVsdGEGDmJhbGFuY2VCZWZvcmVfDWJhbGFuY2VBZnRlcl8MZXF1aWxpYnJpdW1fCWxwQW1vdW50XxB3ZWlnaHRBbXBsaWZpZXJfEGRpc2JhbGFuY2VDb2VmZl8DCQBmAgUNYmFsYW5jZUFmdGVyXwUOYmFsYW5jZUJlZm9yZV8AAAkAZQIJARJfY2FsY3VsYXRlTWludXNGZWUFBQ1iYWxhbmNlQWZ0ZXJfBQxlcXVpbGlicml1bV8FCWxwQW1vdW50XwUQd2VpZ2h0QW1wbGlmaWVyXwUQZGlzYmFsYW5jZUNvZWZmXwkBEl9jYWxjdWxhdGVNaW51c0ZlZQUFDmJhbGFuY2VCZWZvcmVfBQxlcXVpbGlicml1bV8FCWxwQW1vdW50XwUQd2VpZ2h0QW1wbGlmaWVyXwUQZGlzYmFsYW5jZUNvZWZmXwERX2NhbGN1bGF0ZVBsdXNGZWUECGJhbGFuY2VfDGVxdWlsaWJyaXVtXw5yZXdhcmRCYWxhbmNlXxB3ZWlnaHRBbXBsaWZpZXJfBAl0aHJlc2hvbGQJAGsDBQxlcXVpbGlicml1bV8JAGUCBRRNQVhfV0VJR0hUX0FNUExJRklFUgUQd2VpZ2h0QW1wbGlmaWVyXwUUTUFYX1dFSUdIVF9BTVBMSUZJRVIEEGRpc2JhbGFuY2VSZXdhcmQJAGsDBQ5yZXdhcmRCYWxhbmNlXwUJdGhyZXNob2xkBQxlcXVpbGlicml1bV8DCQBmAgUIYmFsYW5jZV8FCXRocmVzaG9sZAUQZGlzYmFsYW5jZVJld2FyZAkAbgQFEGRpc2JhbGFuY2VSZXdhcmQFCGJhbGFuY2VfBQl0aHJlc2hvbGQFBUZMT09SARZfY2FsY3VsYXRlUGx1c0ZlZURlbHRhBQ5iYWxhbmNlQmVmb3JlXw1iYWxhbmNlQWZ0ZXJfDGVxdWlsaWJyaXVtXw5yZXdhcmRCYWxhbmNlXxB3ZWlnaHRBbXBsaWZpZXJfAwkAZgIFDmJhbGFuY2VCZWZvcmVfBQ1iYWxhbmNlQWZ0ZXJfAAAJAGUCCQERX2NhbGN1bGF0ZVBsdXNGZWUEBQ1iYWxhbmNlQWZ0ZXJfBQxlcXVpbGlicml1bV8FDnJld2FyZEJhbGFuY2VfBRB3ZWlnaHRBbXBsaWZpZXJfCQERX2NhbGN1bGF0ZVBsdXNGZWUEBQ5iYWxhbmNlQmVmb3JlXwUMZXF1aWxpYnJpdW1fBQ5yZXdhcmRCYWxhbmNlXwUQd2VpZ2h0QW1wbGlmaWVyXwEQX2ZlZUNvbXBlbnNhdGlvbgIOcmV3YXJkQmFsYW5jZV8EZmVlXwMJAGYCBQRmZWVfBQ5yZXdhcmRCYWxhbmNlXwUOcmV3YXJkQmFsYW5jZV8FBGZlZV8BE192YWxpZGF0ZUFsbG9jYXRpb24CDmFzc2V0QmFsYW5jZXNfD3Jld2FyZEJhbGFuY2VzXwQIbWF4SW5kZXgJAJADAQUOYXNzZXRCYWxhbmNlc18KAQhmb2xkRnVuYwIDYWNjBWluZGV4AwkAZwIFBWluZGV4BQhtYXhJbmRleAUDYWNjAwkAZgIAAAkAkQMCBQ5hc3NldEJhbGFuY2VzXwUFaW5kZXgJAAIBAitfdmFsaWRhdGVBbGxvY2F0aW9uOiBuZWdhdGl2ZSBhc3NldEJhbGFuY2VzAwkAZgIAAAkAkQMCBQ9yZXdhcmRCYWxhbmNlc18FBWluZGV4CQACAQIsX3ZhbGlkYXRlQWxsb2NhdGlvbjogbmVnYXRpdmUgcmV3YXJkQmFsYW5jZXMFA2FjYwoAAiRsBQpJTkRFWF9MSVNUCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAQtfY2hlY2twb2ludAEFdXNlcl8EBnVzZXJMcAkBC19sb2FkVXNlckxwAQUFdXNlcl8EC3VzZXJQcm9maXRzCQEQX2xvYWRVc2VyUHJvZml0cwEFBXVzZXJfBA1zaWdtYUZlZVBlckxwCQESX2xvYWRTaWdtYUZlZVBlckxwAAQRdXNlclNpZ21hRmVlUGVyTHAJARZfbG9hZFVzZXJTaWdtYUZlZVBlckxwAQUFdXNlcl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBA1wcm9maXRVcGRhdGVkCQBkAgkAkQMCBQt1c2VyUHJvZml0cwUFaW5kZXgJAKADAQkAvAIDCQC2AgEFBnVzZXJMcAkAuAICCQCRAwIFDXNpZ21hRmVlUGVyTHAFBWluZGV4CQCRAwIFEXVzZXJTaWdtYUZlZVBlckxwBQVpbmRleAUOUEVSQ0VOVF9GQUNUT1IJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUNcHJvZml0VXBkYXRlZAQNJHQwMjI3MDAyMjc3MwoAAiRsBRBaRVJPX0lOVF9MSVNUXzExCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwMjI3MDAyMjc3MwJfMQQOcHJvZml0c1VwZGF0ZWQIBQ0kdDAyMjcwMDIyNzczAl8yCQCUCgIJAM4IAgkBEF9zYXZlVXNlclByb2ZpdHMCBQV1c2VyXwUOcHJvZml0c1VwZGF0ZWQJARZfc2F2ZVVzZXJTaWdtYUZlZVBlckxwAgUFdXNlcl8FDXNpZ21hRmVlUGVyTHAFDnByb2ZpdHNVcGRhdGVkARRfdXBkYXRlU2lnbWFGZWVQZXJMcAQOc2lnbWFGZWVQZXJMcF8IdG90YWxMcF8GaW5kZXhfBmxwRmVlXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkAwkAAAIFBmluZGV4XwUFaW5kZXgJALcCAgkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJALwCAwkAtgIBBQZscEZlZV8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFCHRvdGFsTHBfCQCRAwIFDnNpZ21hRmVlUGVyTHBfBQVpbmRleAkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRRzaWdtYUZlZVBlckxwVXBkYXRlZAQNJHQwMjM0MjMyMzUwMgoAAiRsBRBaRVJPX0lOVF9MSVNUXzExCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwMjM0MjMyMzUwMgJfMQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAyMzQyMzIzNTAyAl8yBRRzaWdtYUZlZVBlckxwVXBkYXRlZAEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAthc3NldEluZGV4XwdhbW91bnRfCmxwRmVlUmF0ZV8QcHJvdG9jb2xGZWVSYXRlXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEB3RvdGFsTHAJAQxfbG9hZFRvdGFsTHAABA0kdDAyMzcyMzIzOTk4AwkAAAIFB3RvdGFsTHAAAAkAlAoCAAAJAGsDBQdhbW91bnRfBRBwcm90b2NvbEZlZVJhdGVfBQdNQVhfRkVFCQCUCgIJAGsDBQdhbW91bnRfBQpscEZlZVJhdGVfBQdNQVhfRkVFCQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQQFbHBGZWUIBQ0kdDAyMzcyMzIzOTk4Al8xBAtwcm90b2NvbEZlZQgFDSR0MDIzNzIzMjM5OTgCXzIEFHNpZ21hRmVlUGVyTHBVcGRhdGVkAwkAAAIFBWxwRmVlAAAFDXNpZ21hRmVlUGVyTHAJARRfdXBkYXRlU2lnbWFGZWVQZXJMcAQFDXNpZ21hRmVlUGVyTHAFB3RvdGFsTHAFC2Fzc2V0SW5kZXhfBQVscEZlZQkAlQoDBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkAQtfZGVwb3NpdEFsbAEHYW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI0NDA0MjQ0NTcJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI0NDA0MjQ0NTcCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjQ0MDQyNDQ1NwJfMgQNJHQwMjQ0NjIyNDUzMAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjQ0NjIyNDUzMAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNDQ2MjI0NTMwAl8yBA0kdDAyNDUzNjI1NzY2AwkAAAIFFHByZXZBc3NldFRvdGFsU3VwcGx5AAAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAGsDCQCRAwIFDGFzc2V0V2VpZ2h0cwUFaW5kZXgFB2Ftb3VudF8FC3NpZ21hV2VpZ2h0CQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAQNJHQwMjQ5NzgyNTA1MgoAAiRsBQZhc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwMjQ5NzgyNTA1MgJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI0OTc4MjUwNTICXzIJAJQKAgUHYW1vdW50XwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQFcmF0aW8JALwCAwkAtgIBBQdhbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBRRwcmV2QXNzZXRUb3RhbFN1cHBseQoBCWZvbGRGdW5jMQIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAKADAQkAvAIDBQVyYXRpbwkAtgIBCQCRAwIFEXByZXZBc3NldEJhbGFuY2VzBQVpbmRleAUOUEVSQ0VOVF9GQUNUT1IJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNTU5NTI1NjcwCgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWZvbGRGdW5jMQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwMjU1OTUyNTY3MAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI1NTk1MjU2NzACXzIJAJQKAgkAawMFB2Ftb3VudF8FDWxwVG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDI0NTM2MjU3NjYCXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAyNDUzNjI1NzY2Al8yBA0kdDAyNTc3MjI1ODg1CQEbX2luY3JlbWVudEJhbGFuY2VzQnlBbW91bnRzAgURcHJldkFzc2V0QmFsYW5jZXMFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDWFzc2V0QmFsYW5jZXMIBQ0kdDAyNTc3MjI1ODg1Al8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwMjU3NzIyNTg4NQJfMgkAlQoDBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAUNYXNzZXRCYWxhbmNlcwEIX2RlcG9zaXQCCGFzc2V0SWRfB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI2MjUxMjYzMDQJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI2MjUxMjYzMDQCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjYyNTEyNjMwNAJfMgQNJHQwMjYzMDkyNjM3NwkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjYzMDkyNjM3NwJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNjMwOTI2Mzc3Al8yBBJwcmV2UmV3YXJkQmFsYW5jZXMJARNfbG9hZFJld2FyZEJhbGFuY2VzAAQDZXJyAwMJAAACBRRwcmV2QXNzZXRUb3RhbFN1cHBseQAABgkAAAIFDWxwVG90YWxTdXBwbHkAAAkAAgECFF9kZXBvc2l0OiBlbXB0eSBwb29sBgMJAAACBQNlcnIFA2VycgQQc291cmNlQXNzZXRJbmRleAkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBBFzb3VyY2VFcXVpbGlicml1bQkAawMFFHByZXZBc3NldFRvdGFsU3VwcGx5CQCRAwIFDGFzc2V0V2VpZ2h0cwUQc291cmNlQXNzZXRJbmRleAULc2lnbWFXZWlnaHQEE3NvdXJjZUJhbGFuY2VCZWZvcmUJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFEHNvdXJjZUFzc2V0SW5kZXgEE3NvdXJjZVJld2FyZEJhbGFuY2UJAJEDAgUScHJldlJld2FyZEJhbGFuY2VzBRBzb3VyY2VBc3NldEluZGV4BBJzb3VyY2VQbHVzRmVlRGVsdGEJARZfY2FsY3VsYXRlUGx1c0ZlZURlbHRhBQUTc291cmNlQmFsYW5jZUJlZm9yZQkAZAIFE3NvdXJjZUJhbGFuY2VCZWZvcmUFB2Ftb3VudF8FEXNvdXJjZUVxdWlsaWJyaXVtBRNzb3VyY2VSZXdhcmRCYWxhbmNlBQ93ZWlnaHRBbXBsaWZpZXIEDmxwVG9rZW5zVG9NaW50CQBkAgUHYW1vdW50XwUSc291cmNlUGx1c0ZlZURlbHRhBA0kdDAyNzE3NzI3MzA4CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAAABQ5scFRva2Vuc1RvTWludAkAaQIFCWxwRmVlUmF0ZQACCQBpAgUPcHJvdG9jb2xGZWVSYXRlAAIEBWxwRmVlCAUNJHQwMjcxNzcyNzMwOAJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNzE3NzI3MzA4Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDI3MTc3MjczMDgCXzMED2ZlZUNvbXBlbnNhdGlvbgkBEF9mZWVDb21wZW5zYXRpb24CCQBlAgUTc291cmNlUmV3YXJkQmFsYW5jZQUSc291cmNlUGx1c0ZlZURlbHRhCQBkAgUFbHBGZWUFC3Byb3RvY29sRmVlBBFuZXdSZXdhcmRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEnByZXZSZXdhcmRCYWxhbmNlcwUQc291cmNlQXNzZXRJbmRleAkAZAIFEnNvdXJjZVBsdXNGZWVEZWx0YQUPZmVlQ29tcGVuc2F0aW9uBBBuZXdBc3NldEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHNvdXJjZUFzc2V0SW5kZXgJAGQCBQ5scFRva2Vuc1RvTWludAUPZmVlQ29tcGVuc2F0aW9uBARlcnIxCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgIFEG5ld0Fzc2V0QmFsYW5jZXMFEW5ld1Jld2FyZEJhbGFuY2VzAwkAAAIFBGVycjEFBGVycjEJAJgKBgkAZAIFDmxwVG9rZW5zVG9NaW50BQ9mZWVDb21wZW5zYXRpb24FEG5ld0Fzc2V0QmFsYW5jZXMFEW5ld1Jld2FyZEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQNJHQwMjc5NzYyODA0NAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjc5NzYyODA0NAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNzk3NjI4MDQ0Al8yBA0kdDAyODA0OTI4MTAyCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAyODA0OTI4MTAyAl8xBAtzaWdtYVdlaWdodAgFDSR0MDI4MDQ5MjgxMDICXzIEDmxwVG9rZW5zVG9CdXJuBQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQ1scFRvdGFsU3VwcGx5AiRfd2l0aGRyYXdBbGw6IGludmFsaWQgbHBUb2tlbnNUb0J1cm4DCQAAAgUDZXJyBQNlcnIEDSR0MDI4MjQ2MjgzNzkJARxfZGVjcmVtZW50QmFsYW5jZXNCeUxwQW1vdW50AwURcHJldkFzc2V0QmFsYW5jZXMFDmxwVG9rZW5zVG9CdXJuBQ1scFRvdGFsU3VwcGx5BA1hc3NldEJhbGFuY2VzCAUNJHQwMjgyNDYyODM3OQJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDI4MjQ2MjgzNzkCXzIEDWJhbGFuY2VzVG9QYXkIBQ0kdDAyODI0NjI4Mzc5Al8zCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcED2Rpc2JhbGFuY2VDb2VmZggFB3N0b3JhZ2UCXzgEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjg3NzMyODg0MQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjg3NzMyODg0MQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODc3MzI4ODQxAl8yBA0kdDAyODg0NjI4ODk5CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAyODg0NjI4ODk5Al8xBAtzaWdtYVdlaWdodAgFDSR0MDI4ODQ2Mjg4OTkCXzIEEnByZXZSZXdhcmRCYWxhbmNlcwkBE19sb2FkUmV3YXJkQmFsYW5jZXMABBB0YXJnZXRBc3NldEluZGV4CQEFdmFsdWUBCQDPCAIFBmFzc2V0cwUIYXNzZXRJZF8EE3RhcmdldEJhbGFuY2VCZWZvcmUJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgEEXRhcmdldEVxdWlsaWJyaXVtCQBrAwUUcHJldkFzc2V0VG90YWxTdXBwbHkJAJEDAgUMYXNzZXRXZWlnaHRzBRB0YXJnZXRBc3NldEluZGV4BQtzaWdtYVdlaWdodAQTdGFyZ2V0UmV3YXJkQmFsYW5jZQkAkQMCBRJwcmV2UmV3YXJkQmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgEE3RhcmdldE1pbnVzRmVlRGVsdGEJARdfY2FsY3VsYXRlTWludXNGZWVEZWx0YQYFE3RhcmdldEJhbGFuY2VCZWZvcmUJAGUCBRN0YXJnZXRCYWxhbmNlQmVmb3JlBQlscEFtb3VudF8FEXRhcmdldEVxdWlsaWJyaXVtBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUPd2VpZ2h0QW1wbGlmaWVyBQ9kaXNiYWxhbmNlQ29lZmYEDnJld2FyZEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwUScHJldlJld2FyZEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BRN0YXJnZXRNaW51c0ZlZURlbHRhBA1hc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFCWxwQW1vdW50XwQMdGFyZ2V0QW1vdW50CQBlAgUJbHBBbW91bnRfBRN0YXJnZXRNaW51c0ZlZURlbHRhBANlcnIJARNfdmFsaWRhdGVBbGxvY2F0aW9uAgUNYXNzZXRCYWxhbmNlcwUOcmV3YXJkQmFsYW5jZXMDCQAAAgUDZXJyBQNlcnIEDSR0MDI5ODg1MzAwMzMJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgUQdGFyZ2V0QXNzZXRJbmRleAABBQx0YXJnZXRBbW91bnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDI5ODg1MzAwMzMCXzEEC3Byb3RvY29sRmVlCAUNJHQwMjk4ODUzMDAzMwJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAyOTg4NTMwMDMzAl8zCQCYCgYFDHRhcmdldEFtb3VudAUNYXNzZXRCYWxhbmNlcwUOcmV3YXJkQmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BBV9zd2FwAxFzb3VyY2VBc3NldEluZGV4XxF0YXJnZXRBc3NldEluZGV4Xw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BA9kaXNiYWxhbmNlQ29lZmYIBQdzdG9yYWdlAl84BA0kdDAzMDU2MDMwNjI4CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAzMDU2MDMwNjI4Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDMwNTYwMzA2MjgCXzIEDSR0MDMwNjMzMzA2ODYJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDMwNjMzMzA2ODYCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzA2MzMzMDY4NgJfMgQScHJldlJld2FyZEJhbGFuY2VzCQETX2xvYWRSZXdhcmRCYWxhbmNlcwAEEXNvdXJjZUVxdWlsaWJyaXVtCQBrAwUUcHJldkFzc2V0VG90YWxTdXBwbHkJAJEDAgUMYXNzZXRXZWlnaHRzBRFzb3VyY2VBc3NldEluZGV4XwULc2lnbWFXZWlnaHQEE3NvdXJjZUJhbGFuY2VCZWZvcmUJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFEXNvdXJjZUFzc2V0SW5kZXhfBBNzb3VyY2VSZXdhcmRCYWxhbmNlCQCRAwIFEnByZXZSZXdhcmRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8EEnNvdXJjZVBsdXNGZWVEZWx0YQkBFl9jYWxjdWxhdGVQbHVzRmVlRGVsdGEFBRNzb3VyY2VCYWxhbmNlQmVmb3JlCQBkAgUTc291cmNlQmFsYW5jZUJlZm9yZQUNc291cmNlQW1vdW50XwURc291cmNlRXF1aWxpYnJpdW0FE3NvdXJjZVJld2FyZEJhbGFuY2UFD3dlaWdodEFtcGxpZmllcgQTdGFyZ2V0QmFsYW5jZUJlZm9yZQkAkQMCBRFwcmV2QXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8EEXRhcmdldEVxdWlsaWJyaXVtCQBrAwUUcHJldkFzc2V0VG90YWxTdXBwbHkJAJEDAgUMYXNzZXRXZWlnaHRzBRF0YXJnZXRBc3NldEluZGV4XwULc2lnbWFXZWlnaHQEE3RhcmdldFJld2FyZEJhbGFuY2UJAJEDAgUScHJldlJld2FyZEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwQTdGFyZ2V0TWludXNGZWVEZWx0YQkBF19jYWxjdWxhdGVNaW51c0ZlZURlbHRhBgUTdGFyZ2V0QmFsYW5jZUJlZm9yZQkAZQIFE3RhcmdldEJhbGFuY2VCZWZvcmUFDXNvdXJjZUFtb3VudF8FEXRhcmdldEVxdWlsaWJyaXVtBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUPd2VpZ2h0QW1wbGlmaWVyBQ9kaXNiYWxhbmNlQ29lZmYEEnRlbXBSZXdhcmRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEnByZXZSZXdhcmRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FEnNvdXJjZVBsdXNGZWVEZWx0YQQRbmV3UmV3YXJkQmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRJ0ZW1wUmV3YXJkQmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBRN0YXJnZXRNaW51c0ZlZURlbHRhBBF0ZW1wQXNzZXRCYWxhbmNlcwkBGF9pbmNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRFzb3VyY2VBc3NldEluZGV4XwkAZAIFDXNvdXJjZUFtb3VudF8FEnNvdXJjZVBsdXNGZWVEZWx0YQQQbmV3QXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXRlbXBBc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwkAZAIFDXNvdXJjZUFtb3VudF8FEnNvdXJjZVBsdXNGZWVEZWx0YQQMdGFyZ2V0QW1vdW50CQBlAgkAZAIFDXNvdXJjZUFtb3VudF8FEnNvdXJjZVBsdXNGZWVEZWx0YQUTdGFyZ2V0TWludXNGZWVEZWx0YQQDZXJyCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgIFEG5ld0Fzc2V0QmFsYW5jZXMFEW5ld1Jld2FyZEJhbGFuY2VzAwkAAAIFA2VycgUDZXJyBA0kdDAzMjI4MjMyNDIzCQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEXRhcmdldEFzc2V0SW5kZXhfAAEFDHRhcmdldEFtb3VudAUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUEBWxwRmVlCAUNJHQwMzIyODIzMjQyMwJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAzMjI4MjMyNDIzAl8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDMyMjgyMzI0MjMCXzMJAJgKBgUMdGFyZ2V0QW1vdW50BRBuZXdBc3NldEJhbGFuY2VzBRFuZXdSZXdhcmRCYWxhbmNlcwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhsBaQEEaW5pdA4HYXNzZXRzXw1hc3NldFdlaWdodHNfCmxwRmVlUmF0ZV8QcHJvdG9jb2xGZWVSYXRlXwxscFRva2VuTmFtZV8NbHBUb2tlbkRlc2NyXxBscFRva2VuRGVjaW1hbHNfF21heEFsbG9jYXRpb25BbXBsaWZpZXJfEHdlaWdodEFtcGxpZmllcl8QZGlzYmFsYW5jZUNvZWZmXwtmZWVNYXhSYXRlXxRwcm90b2NvbEZlZUNvbnRyYWN0XwpwcmVjaXNpb25fB3BhdXNlcl8EA2VycgMDAwMDAwMDAwMDAwMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJAQ9fdmFsaWRhdGVBc3NldHMCBQdhc3NldHNfAhRpbml0OiBpbnZhbGlkIGFzc2V0cwcJARBfdmFsaWRhdGVJbnRMaXN0BAUNYXNzZXRXZWlnaHRzXwABBQpNQVhfV0VJR0hUAhppbml0OiBpbnZhbGlkIGFzc2V0V2VpZ2h0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEFB2Fzc2V0c18JAJADAQUNYXNzZXRXZWlnaHRzXwIfaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMgc2l6ZQcJAQxfdmFsaWRhdGVJbnQEBQpscEZlZVJhdGVfAAAFB01BWF9GRUUCFGluaXQ6IGludmFsaWQgbHAgZmVlBwkBDF92YWxpZGF0ZUludAQFEHByb3RvY29sRmVlUmF0ZV8AAAUHTUFYX0ZFRQIaaW5pdDogaW52YWxpZCBwcm90b2NvbCBmZWUHCQESX3ZhbGlkYXRlVG9rZW5OYW1lAgUMbHBUb2tlbk5hbWVfAhJpbml0OiBpbnZhbGlkIG5hbWUHCQETX3ZhbGlkYXRlVG9rZW5EZXNjcgIFDWxwVG9rZW5EZXNjcl8CE2luaXQ6IGludmFsaWQgZGVzY3IHCQERX3ZhbGlkYXRlRGVjaW1hbHMCBRBscFRva2VuRGVjaW1hbHNfAhZpbml0OiBpbnZhbGlkIGRlY2ltYWxzBwkBDF92YWxpZGF0ZUludAQFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAAAFDU1BWF9BTVBMSUZJRVICJGluaXQ6IGludmFsaWQgbWF4QWxsb2NhdGlvbkFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRB3ZWlnaHRBbXBsaWZpZXJfAAAFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAh1pbml0OiBpbnZhbGlkIHdlaWdodEFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRBkaXNiYWxhbmNlQ29lZmZfAAAFB01BWF9JTlQCHWluaXQ6IGludmFsaWQgZGlzYmFsYW5jZUNvZWZmBwkBDF92YWxpZGF0ZUludAQFC2ZlZU1heFJhdGVfAAAFB01BWF9JTlQCGGluaXQ6IGludmFsaWQgZmVlTWF4UmF0ZQcJARBfdmFsaWRhdGVBZGRyZXNzAgUUcHJvdG9jb2xGZWVDb250cmFjdF8CIWluaXQ6IGludmFsaWQgcHJvdG9jb2xGZWVDb250cmFjdAcJAQxfdmFsaWRhdGVJbnQEBQpwcmVjaXNpb25fAAEFB01BWF9JTlQCF2luaXQ6IGludmFsaWQgcHJlY2lzaW9uBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhRpbml0OiBpbnZhbGlkIHBhdXNlcgcDCQAAAgUDZXJyBQNlcnIEDSR0MDM0MzEyMzQzODEJARRfcHJlcGFyZUFzc2V0V2VpZ2h0cwEFDWFzc2V0V2VpZ2h0c18EDGFzc2V0V2VpZ2h0cwgFDSR0MDM0MzEyMzQzODECXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzQzMTIzNDM4MQJfMgQNYXNzZXRCYWxhbmNlcwkBFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEFB2Fzc2V0c18EBWlzc3VlCQDCCAUFDGxwVG9rZW5OYW1lXwUNbHBUb2tlbkRlc2NyXwAABRBscFRva2VuRGVjaW1hbHNfBgQJbHBBc3NldElkCQC4CAEFBWlzc3VlBA5zdG9yYWdlVXBkYXRlZAkAnAoKBQlscEFzc2V0SWQGAAAFCmxwRmVlUmF0ZV8FEHByb3RvY29sRmVlUmF0ZV8FF21heEFsbG9jYXRpb25BbXBsaWZpZXJfBRB3ZWlnaHRBbXBsaWZpZXJfBRBkaXNiYWxhbmNlQ29lZmZfBQtmZWVNYXhSYXRlXwkBEUBleHRyTmF0aXZlKDEwNjIpAQUUcHJvdG9jb2xGZWVDb250cmFjdF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgUFaXNzdWUFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQELX3NhdmVBc3NldHMBBQdhc3NldHNfCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwkBE19zYXZlUmV3YXJkQmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQERX3NhdmVBc3NldFdlaWdodHMBBQxhc3NldFdlaWdodHMJAQ5fc2F2ZVByZWNpc2lvbgEFCnByZWNpc2lvbl8JARJfc2F2ZVNpZ21hRmVlUGVyTHABCQESX2xvYWRTaWdtYUZlZVBlckxwAAkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpkZXBvc2l0QWxsAQdhbW91bnRfBANlcnIDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDM2MTgwMzYyNjUJAQtfZGVwb3NpdEFsbAEFB2Ftb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwMzYxODAzNjI2NQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDM2MTgwMzYyNjUCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDAzNjE4MDM2MjY1Al8zCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAQUcGF5bWVudEFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAkQMCBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQVpbmRleAQOcmVxdWlyZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFFHBheW1lbnRBc3NldERlY2ltYWxzBQdDRUlMSU5HBARlcnIxAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyBQRlbGVtCQACAQkArAICAiNkZXBvc2l0QWxsOiBpbnZhbGlkIHBheW1lbnQ6IGluZGV4PQkApAMBBQVpbmRleAMJAGcCAAAFDnJlcXVpcmVkQW1vdW50CQACAQImZGVwb3NpdEFsbDogdG9vIGxpdHRsZSBhbW91bnQgcmVxdWlyZWQFBHVuaXQDCQAAAgUEZXJyMQUEZXJyMQQGY2hhbmdlAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAUDbmlsAwkAZgIFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIoZGVwb3NpdEFsbDogaW5zdWZmaWNpZW50IHBheW1lbnQsIGluZGV4PQkApAMBBQVpbmRleAILLCByZXF1aXJlZD0JAKQDAQUOcmVxdWlyZWRBbW91bnQFA25pbAkAlAoCCQBkAgUFaW5kZXgAAQkAzggCCAUDYWNjAl8yBQZjaGFuZ2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDM3NDA4Mzc0NzAKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDM3NDA4Mzc0NzACXzEEDWNoYW5nZUFjdGlvbnMIBQ0kdDAzNzQwODM3NDcwAl8yBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvTWludAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFDWNoYW5nZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAEMbWluTHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQxtaW5McEFtb3VudF8AAAUHTUFYX0lOVAIeZGVwb3NpdDogaW52YWxpZCBtaW4gbHAgYW1vdW50AwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBGVycjEDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl9jaGVja1dhdGNoZG9nAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwMzg5MTAzOTA0MgkBCF9kZXBvc2l0AgUIYXNzZXRTdHIFEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMzg5MTAzOTA0MgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDM4OTEwMzkwNDICXzIEDnJld2FyZEJhbGFuY2VzCAUNJHQwMzg5MTAzOTA0MgJfMwQFbHBGZWUIBQ0kdDAzODkxMDM5MDQyAl80BAtwcm90b2NvbEZlZQgFDSR0MDM4OTEwMzkwNDICXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMzg5MTAzOTA0MgJfNgQObHBUb2tlbnNUb1NlbmQJAGUCCQBlAgUObHBUb2tlbnNUb01pbnQFBWxwRmVlBQtwcm90b2NvbEZlZQQEZXJyMgkBDF92YWxpZGF0ZUludAQFDmxwVG9rZW5zVG9TZW5kBQxtaW5McEFtb3VudF8FB01BWF9JTlQCFmRlcG9zaXQ6IGxlc3MgdGhhbiBtaW4DCQAAAgUEZXJyMgUEZXJyMgQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9NaW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUObHBUb2tlbnNUb1NlbmQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQETX3NhdmVSZXdhcmRCYWxhbmNlcwEFDnJld2FyZEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFBWxwRmVlCQEKX2xvYWRMcEZlZQEFDGxwQXNzZXRJZFN0cgkBEF9zYXZlUHJvdG9jb2xGZWUCBQxscEFzc2V0SWRTdHIJAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQxscEFzc2V0SWRTdHIJARJfc2F2ZVNpZ21hRmVlUGVyTHABBRRzaWdtYUZlZVBlckxwVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt3aXRoZHJhd0FsbAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUMbHBBc3NldElkU3RyBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEA2VycgMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAiJ3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50cyBzaXplBwkBFF92YWxpZGF0ZVN0cmluZ0VxdWFsAwUMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQUHTUFYX0lOVAIjd2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0MDU1MDQwNjM3CQEMX3dpdGhkcmF3QWxsAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEDmxwVG9rZW5zVG9CdXJuCAUNJHQwNDA1NTA0MDYzNwJfMQQNYmFsYW5jZXNUb1BheQgFDSR0MDQwNTUwNDA2MzcCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0MDU1MDQwNjM3Al8zBA5wYXltZW50QWN0aW9ucwkBGF9nZXRQYXltZW50c0Zyb21CYWxhbmNlcwQFBmFzc2V0cwUNYmFsYW5jZXNUb1BheQgFAWkGY2FsbGVyBQpscERlY2ltYWxzBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGUCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb0J1cm4IBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkBQ5scFRva2Vuc1RvQnVybgUDbmlsBQ5wYXltZW50QWN0aW9ucwkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwIIYXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl9jaGVja1dhdGNoZG9nAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECH3dpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiB3aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFtb3VudAcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDBQZhc3NldHMFCGFzc2V0SWRfAhl3aXRoZHJhdzogaW52YWxpZCBhc3NldElkBwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIbd2l0aGRyYXc6IGludmFsaWQgbWluQW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDE5OTE0MjE0NgkBCV93aXRoZHJhdwIFCGFzc2V0SWRfCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDQxOTkxNDIxNDYCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDQxOTkxNDIxNDYCXzIEE2ZpbmFsUmV3YXJkQmFsYW5jZXMIBQ0kdDA0MTk5MTQyMTQ2Al8zBAVscEZlZQgFDSR0MDQxOTkxNDIxNDYCXzQEC3Byb3RvY29sRmVlCAUNJHQwNDE5OTE0MjE0NgJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0MTk5MTQyMTQ2Al82BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAIXd2l0aGRyYXc6IGxlc3MgdGhhbiBtaW4DCQAAAgUEZXJyMQUEZXJyMQQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBlAggFB3N0b3JhZ2UCXzMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtmaW5hbEFtb3VudAkBC19zdHJUb0Fzc2V0AQUIYXNzZXRJZF8FA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQETX3NhdmVSZXdhcmRCYWxhbmNlcwEFE2ZpbmFsUmV3YXJkQmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUIYXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQhhc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQhhc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFCGFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEc3dhcAIOdGFyZ2V0QXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA5zb3VyY2VBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fY2hlY2tXYXRjaGRvZwAHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAh9zd2FwOiBpbnZhbGlkIG1pbiB0YXJnZXQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ0MzExNDQ0OTAJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA0NDMxMTQ0NDkwAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA0NDMxMTQ0NDkwAl8yBBNmaW5hbFJld2FyZEJhbGFuY2VzCAUNJHQwNDQzMTE0NDQ5MAJfMwQFbHBGZWUIBQ0kdDA0NDMxMTQ0NDkwAl80BAtwcm90b2NvbEZlZQgFDSR0MDQ0MzExNDQ0OTACXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDQzMTE0NDQ5MAJfNgQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ50YXJnZXRBc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCE3N3YXA6IGxlc3MgdGhhbiBtaW4DCQAAAgUEZXJyMQUEZXJyMQkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQETX3NhdmVSZXdhcmRCYWxhbmNlcwEFE2ZpbmFsUmV3YXJkQmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQ50YXJnZXRBc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQ50YXJnZXRBc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDnRhcmdldEFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENZ2V0RGVwb3NpdEFsbAEJbHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQlscEFtb3VudF8AAQUHTUFYX0lOVAIdZ2V0RGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDQ1NjYyNDU3NDkJAQtfZGVwb3NpdEFsbAEFCWxwQW1vdW50XwQObHBUb2tlbnNUb01pbnQIBQ0kdDA0NTY2MjQ1NzQ5Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwNDU2NjI0NTc0OQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ1NjYyNDU3NDkCXzMJAJQKAgUDbmlsCQCUCgIFDmxwVG9rZW5zVG9NaW50BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmdldERlcG9zaXQCCGFzc2V0SWRfB2Ftb3VudF8EA2VycgMJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMABQhhc3NldElkXwIZZ2V0RGVwb3NpdDogaW52YWxpZCBhc3NldAkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAQUHTUFYX0lOVAIaZ2V0RGVwb3NpdDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMEBQdhbW91bnRfBQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBA0kdDA0NjUwODQ2NjQwCQEIX2RlcG9zaXQCBQhhc3NldElkXwUQYW1vdW50Tm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDA0NjUwODQ2NjQwAl8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNDY1MDg0NjY0MAJfMgQOcmV3YXJkQmFsYW5jZXMIBQ0kdDA0NjUwODQ2NjQwAl8zBAVscEZlZQgFDSR0MDQ2NTA4NDY2NDACXzQEC3Byb3RvY29sRmVlCAUNJHQwNDY1MDg0NjY0MAJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0NjUwODQ2NjQwAl82BA5scFRva2Vuc1RvU2VuZAkAZQIJAGUCBQ5scFRva2Vuc1RvTWludAUFbHBGZWUFC3Byb3RvY29sRmVlCQCUCgIFA25pbAUObHBUb2tlbnNUb1NlbmQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZ2V0V2l0aGRyYXdBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAAFB01BWF9JTlQCHmdldFdpdGhkcmF3QWxsOiBpbnZhbGlkIGFtb3VudAMJAAACBQNlcnIFA2VycgQNJHQwNDcwNzk0NzE1NQkBDF93aXRoZHJhd0FsbAEFCWxwQW1vdW50XwQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0NzA3OTQ3MTU1Al8xBA1iYWxhbmNlc1RvR2V0CAUNJHQwNDcwNzk0NzE1NQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ3MDc5NDcxNTUCXzMJAJQKAgUDbmlsBQ1iYWxhbmNlc1RvR2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2dldFdpdGhkcmF3Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGmdldFdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0CQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwABBQdNQVhfSU5UAhtnZXRXaXRoZHJhdzogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA0kdDA0NzgwNjQ3OTM4CQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8FB2Ftb3VudF8EFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA0NzgwNjQ3OTM4Al8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNDc4MDY0NzkzOAJfMgQOcmV3YXJkQmFsYW5jZXMIBQ0kdDA0NzgwNjQ3OTM4Al8zBAVscEZlZQgFDSR0MDQ3ODA2NDc5MzgCXzQEC3Byb3RvY29sRmVlCAUNJHQwNDc4MDY0NzkzOAJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0NzgwNjQ3OTM4Al82BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFDXNvdXJjZUFtb3VudF8JAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldElkXwUKbHBEZWNpbWFscwUERE9XTgQDZXJyAwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50CQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldElkXwUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwMJAAACBQNlcnIFA2VycgQNJHQwNDkzNDg0OTUyNwkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDQ5MzQ4NDk1MjcCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDQ5MzQ4NDk1MjcCXzIEE2ZpbmFsUmV3YXJkQmFsYW5jZXMIBQ0kdDA0OTM0ODQ5NTI3Al8zBAVscEZlZQgFDSR0MDQ5MzQ4NDk1MjcCXzQEC3Byb3RvY29sRmVlCAUNJHQwNDkzNDg0OTUyNwJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0OTM0ODQ5NTI3Al82BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhnZXRDbGFpbQEFdXNlcl8EBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CFmdldENsYWltOiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgQNJHQwNTAxNjk1MDIyNQkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1MDE2OTUwMjI1Al8xBAt1c2VyUHJvZml0cwgFDSR0MDUwMTY5NTAyMjUCXzIJAJQKAgUDbmlsBQt1c2VyUHJvZml0cwFpAQpnZXRBc3NldElkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEJAJQKAgUDbmlsCQDYBAEFCWxwQXNzZXRJZAFpAQtnZXREZWNpbWFscwAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQJAJQKAgUDbmlsBQpscERlY2ltYWxzAWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1MTQzNzUxNDk3CQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTE0Mzc1MTQ5NwJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1MTQzNzUxNDk3Al8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDUyMDA4NTIwNjgJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1MjAwODUyMDY4Al8xBAt1c2VyUHJvZml0cwgFDSR0MDUyMDA4NTIwNjgCXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQNJHQwNTI3NTY1MjgxMgkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1Mjc1NjUyODEyAl8xBAt1c2VyUHJvZml0cwgFDSR0MDUyNzU2NTI4MTICXzIKAQhmb2xkRnVuYwIDYWNjBnByb2ZpdAQFaW5kZXgIBQNhY2MCXzEDAwkAZwIFCG1heEluZGV4BQVpbmRleAkAZgIFBnByb2ZpdAAABwQFYXNzZXQJAJEDAgUGYXNzZXRzBQVpbmRleAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yAAAJAM0IAggFA2FjYwJfMwkBDlNjcmlwdFRyYW5zZmVyAwUEdXNlcgUGcHJvZml0CQELX3N0clRvQXNzZXQBBQVhc3NldAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQZwcm9maXQIBQNhY2MCXzMEDSR0MDUzMTkwNTMyODEKAAIkbAULdXNlclByb2ZpdHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDUzMTkwNTMyODECXzEEEnVzZXJQcm9maXRzVXBkYXRlZAgFDSR0MDUzMTkwNTMyODECXzIEDXByb2ZpdEFjdGlvbnMIBQ0kdDA1MzE5MDUzMjgxAl8zCQCUCgIJAM4IAgkAzggCBQ1wcm9maXRBY3Rpb25zCQDRCAIFEWNoZWNrcG9pbnRBY3Rpb25zAAAJARBfc2F2ZVVzZXJQcm9maXRzAgUEdXNlcgUSdXNlclByb2ZpdHNVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGNsYWltQWxsAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIWY2xhaW1BbGw6IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQNJHQwNTM5MTE1Mzk3MQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MzkxMTUzOTcxAl8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwNTM5MTE1Mzk3MQJfMgQNJHQwNTM5Nzc1NDAzMwkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1Mzk3NzU0MDMzAl8xBAt1c2VyUHJvZml0cwgFDSR0MDUzOTc3NTQwMzMCXzIKAQhmb2xkRnVuYwIDYWNjBnByb2ZpdAQFaW5kZXgIBQNhY2MCXzEDCQAAAgUFaW5kZXgAAAkAlwoFCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yAAAIBQNhY2MCXzMIBQNhY2MCXzQJAGQCCAUDYWNjAl81BQZwcm9maXQDAwkAZgIFBWluZGV4AAAJAGcCBQhtYXhJbmRleAUFaW5kZXgHBAphc3NldEluZGV4CQBlAgUFaW5kZXgAAQQHYmFsYW5jZQkAkQMCBQ1hc3NldEJhbGFuY2VzBQphc3NldEluZGV4CQCXCgUJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQBkAgUHYmFsYW5jZQUGcHJvZml0CQBkAggFA2FjYwJfNAUGcHJvZml0CAUDYWNjAl81CQCXCgUJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAgFA2FjYwJfMwgFA2FjYwJfNAgFA2FjYwJfNQQNJHQwNTQ1Njk1NDcwNQoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJcKBQAABQNuaWwFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDU0NTY5NTQ3MDUCXzEEEnVzZXJQcm9maXRzVXBkYXRlZAgFDSR0MDU0NTY5NTQ3MDUCXzIEFGFzc2V0QmFsYW5jZXNVcGRhdGVkCAUNJHQwNTQ1Njk1NDcwNQJfMwQObHBUb2tlbnNUb01pbnQIBQ0kdDA1NDU2OTU0NzA1Al80BA5scFRva2Vuc1Byb2ZpdAgFDSR0MDU0NTY5NTQ3MDUCXzUEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZAIFDmxwVG9rZW5zVG9NaW50BQ5scFRva2Vuc1Byb2ZpdAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFFGFzc2V0QmFsYW5jZXNVcGRhdGVkCQDRCAIFEWNoZWNrcG9pbnRBY3Rpb25zAAAJARBfc2F2ZVVzZXJQcm9maXRzAgUEdXNlcgUSdXNlclByb2ZpdHNVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnVwZGF0ZVBvb2xGZWVzAgpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EA2VycgMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEMX3ZhbGlkYXRlSW50BAUKbHBGZWVSYXRlXwAABQdNQVhfRkVFAh51cGRhdGVQb29sRmVlczogaW52YWxpZCBscCBmZWUHCQEMX3ZhbGlkYXRlSW50BAUQcHJvdG9jb2xGZWVSYXRlXwAABQdNQVhfRkVFAiR1cGRhdGVQb29sRmVlczogaW52YWxpZCBwcm90b2NvbCBmZWUHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCAUHc3RvcmFnZQJfMwUKbHBGZWVSYXRlXwUQcHJvdG9jb2xGZWVSYXRlXwgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQdXBkYXRlUG9vbFBhcmFtcwQXbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8Qd2VpZ2h0QW1wbGlmaWVyXxBkaXNiYWxhbmNlQ29lZmZfC2ZlZU1heFJhdGVfBANlcnIDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEMX3ZhbGlkYXRlSW50BAUXbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8AAAUNTUFYX0FNUExJRklFUgIwdXBkYXRlUG9vbFBhcmFtczogaW52YWxpZCBtYXhBbGxvY2F0aW9uQW1wbGlmaWVyBwkBDF92YWxpZGF0ZUludAQFEHdlaWdodEFtcGxpZmllcl8AAAUXbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8CKXVwZGF0ZVBvb2xQYXJhbXM6IGludmFsaWQgd2VpZ2h0QW1wbGlmaWVyBwkBDF92YWxpZGF0ZUludAQFEGRpc2JhbGFuY2VDb2VmZl8AAAUHTUFYX0lOVAIpdXBkYXRlUG9vbFBhcmFtczogaW52YWxpZCBkaXNiYWxhbmNlQ29lZmYHCQEMX3ZhbGlkYXRlSW50BAULZmVlTWF4UmF0ZV8AAAUHTUFYX0lOVAIkdXBkYXRlUG9vbFBhcmFtczogaW52YWxpZCBmZWVNYXhSYXRlBwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMggFB3N0b3JhZ2UCXzMIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQUXbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8FEHdlaWdodEFtcGxpZmllcl8FEGRpc2JhbGFuY2VDb2VmZl8FC2ZlZU1heFJhdGVfCAUHc3RvcmFnZQNfMTAJAJQKAgkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD21pZ3JhdGVCYWxhbmNlcwAEA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG9rZW5TdXBwbHkIBQdzdG9yYWdlAl8zBA0kdDA1NzI0MDU3MzAwCQESX2xvYWRBc3NldEJhbGFuY2VzAAQNYXNzZXRCYWxhbmNlcwgFDSR0MDU3MjQwNTczMDACXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDA1NzI0MDU3MzAwAl8yBAxiYWxhbmNlc0RpZmYJAJYDAQkAzAgCCQBlAgUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb2tlblN1cHBseQkAzAgCAAAFA25pbAQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAgUNbHBUb2tlblN1cHBseQUMYmFsYW5jZXNEaWZmCAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnBhdXNlAAQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBC193aGVuUGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx1cGRhdGVQYXVzZXIBB3BhdXNlcl8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIcdXBkYXRlUGF1c2VyOiBpbnZhbGlkIHBhdXNlcgcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ51cGRhdGVXYXRjaGRvZwIJd2F0Y2hkb2dfB29mZnNldF8EA2VycgMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCXdhdGNoZG9nXwIgdXBkYXRlV2F0Y2hkb2c6IGludmFsaWQgd2F0Y2hkb2cHCQEMX3ZhbGlkYXRlSW50BAUHb2Zmc2V0XwAABQdNQVhfSU5UAh51cGRhdGVXYXRjaGRvZzogaW52YWxpZCBvZmZzZXQHAwkAAAIFA2VycgUDZXJyCQCUCgIJAM4IAgkBDV9zYXZlV2F0Y2hkb2cBCQERQGV4dHJOYXRpdmUoMTA2MikBBQl3YXRjaGRvZ18JARNfc2F2ZVdhdGNoZG9nT2Zmc2V0AQUHb2Zmc2V0XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfdmFsaWRhdGVBZGRyZXNzAgUJbXVsdGlzaWdfAh1zZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZwcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDV9zYXZlTXVsdGlzaWcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQltdWx0aXNpZ18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcECG11bHRpc2lnBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG11bHRpc2lnCQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCCQClCAEFBHRoaXMJAMwIAgkA2AQBCAUCdHgCaWQFA25pbAUDU0VQBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQclOBQ=", "height": 3993917, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 87XJ4vZyNCcgde4Jt1zSAY2EhavvZk8XV64fzAUyebhJ Next: DbLY6cXdtxTNkwgMexrxw5DeTmht4zfxxgZr4jPbdwwM Diff:
OldNewDifferences
10151015 else (_calculateMinusFee(balanceAfter_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_) - _calculateMinusFee(balanceBefore_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_))
10161016
10171017
1018-func _calculatePlusFee (balance_,equilibrium_,rewardBalance_) = if ((balance_ > equilibrium_))
1018+func _calculatePlusFee (balance_,equilibrium_,rewardBalance_,weightAmplifier_) = {
1019+ let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
1020+ let disbalanceReward = fraction(rewardBalance_, threshold, equilibrium_)
1021+ if ((balance_ > threshold))
1022+ then disbalanceReward
1023+ else fraction(disbalanceReward, balance_, threshold, FLOOR)
1024+ }
1025+
1026+
1027+func _calculatePlusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,rewardBalance_,weightAmplifier_) = if ((balanceBefore_ > balanceAfter_))
1028+ then 0
1029+ else (_calculatePlusFee(balanceAfter_, equilibrium_, rewardBalance_, weightAmplifier_) - _calculatePlusFee(balanceBefore_, equilibrium_, rewardBalance_, weightAmplifier_))
1030+
1031+
1032+func _feeCompensation (rewardBalance_,fee_) = if ((fee_ > rewardBalance_))
10191033 then rewardBalance_
1020- else fraction(rewardBalance_, balance_, equilibrium_, FLOOR)
1021-
1022-
1023-func _calculatePlusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,rewardBalance_) = if ((balanceBefore_ > balanceAfter_))
1024- then 0
1025- else (_calculatePlusFee(balanceAfter_, equilibrium_, rewardBalance_) - _calculatePlusFee(balanceBefore_, equilibrium_, rewardBalance_))
1034+ else fee_
10261035
10271036
10281037 func _validateAllocation (assetBalances_,rewardBalances_) = {
10611070 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10621071 }
10631072
1064- let $t02231422387 = {
1073+ let $t02270022773 = {
10651074 let $l = ZERO_INT_LIST_11
10661075 let $s = size($l)
10671076 let $acc0 = $Tuple2(0, nil)
10751084
10761085 $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)
10771086 }
1078- let idx = $t02231422387._1
1079- let profitsUpdated = $t02231422387._2
1087+ let idx = $t02270022773._1
1088+ let profitsUpdated = $t02270022773._2
10801089 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10811090 }
10821091
10901099 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10911100 }
10921101
1093- let $t02303723116 = {
1102+ let $t02342323502 = {
10941103 let $l = ZERO_INT_LIST_11
10951104 let $s = size($l)
10961105 let $acc0 = $Tuple2(0, nil)
11041113
11051114 $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)
11061115 }
1107- let idx = $t02303723116._1
1108- let sigmaFeePerLpUpdated = $t02303723116._2
1116+ let idx = $t02342323502._1
1117+ let sigmaFeePerLpUpdated = $t02342323502._2
11091118 sigmaFeePerLpUpdated
11101119 }
11111120
11131122 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
11141123 let sigmaFeePerLp = _loadSigmaFeePerLp()
11151124 let totalLp = _loadTotalLp()
1116- let $t02333723612 = if ((totalLp == 0))
1125+ let $t02372323998 = if ((totalLp == 0))
11171126 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11181127 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1119- let lpFee = $t02333723612._1
1120- let protocolFee = $t02333723612._2
1128+ let lpFee = $t02372323998._1
1129+ let protocolFee = $t02372323998._2
11211130 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11221131 then sigmaFeePerLp
11231132 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11291138 let storage = _loadStorage()
11301139 let lpTotalSupply = storage._3
11311140 let assets = _loadAssets()
1132- let $t02401824071 = _loadAssetWeights()
1133- let assetWeights = $t02401824071._1
1134- let sigmaWeight = $t02401824071._2
1135- let $t02407624144 = _loadAssetBalances()
1136- let prevAssetBalances = $t02407624144._1
1137- let prevAssetTotalSupply = $t02407624144._2
1138- let $t02415025380 = if ((prevAssetTotalSupply == 0))
1141+ let $t02440424457 = _loadAssetWeights()
1142+ let assetWeights = $t02440424457._1
1143+ let sigmaWeight = $t02440424457._2
1144+ let $t02446224530 = _loadAssetBalances()
1145+ let prevAssetBalances = $t02446224530._1
1146+ let prevAssetTotalSupply = $t02446224530._2
1147+ let $t02453625766 = if ((prevAssetTotalSupply == 0))
11391148 then {
11401149 func foldFunc (acc,elem) = {
11411150 let index = acc._1
11431152 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11441153 }
11451154
1146- let $t02459224666 = {
1155+ let $t02497825052 = {
11471156 let $l = assets
11481157 let $s = size($l)
11491158 let $acc0 = $Tuple2(0, nil)
11571166
11581167 $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)
11591168 }
1160- let idx = $t02459224666._1
1161- let requiredAmountsNormalized = $t02459224666._2
1169+ let idx = $t02497825052._1
1170+ let requiredAmountsNormalized = $t02497825052._2
11621171 $Tuple2(amount_, requiredAmountsNormalized)
11631172 }
11641173 else {
11691178 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11701179 }
11711180
1172- let $t02520925284 = {
1181+ let $t02559525670 = {
11731182 let $l = assets
11741183 let $s = size($l)
11751184 let $acc0 = $Tuple2(0, nil)
11831192
11841193 $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)
11851194 }
1186- let idx = $t02520925284._1
1187- let requiredAmountsNormalized = $t02520925284._2
1195+ let idx = $t02559525670._1
1196+ let requiredAmountsNormalized = $t02559525670._2
11881197 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11891198 }
1190- let lpTokensToMint = $t02415025380._1
1191- let requiredAmountsNormalized = $t02415025380._2
1192- let $t02538625499 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1193- let assetBalances = $t02538625499._1
1194- let assetTotalSupply = $t02538625499._2
1199+ let lpTokensToMint = $t02453625766._1
1200+ let requiredAmountsNormalized = $t02453625766._2
1201+ let $t02577225885 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1202+ let assetBalances = $t02577225885._1
1203+ let assetTotalSupply = $t02577225885._2
11951204 $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11961205 }
11971206
12041213 let maxAllocAmplifier = storage._6
12051214 let weightAmplifier = storage._7
12061215 let assets = _loadAssets()
1207- let $t02586525918 = _loadAssetWeights()
1208- let assetWeights = $t02586525918._1
1209- let sigmaWeight = $t02586525918._2
1210- let $t02592325991 = _loadAssetBalances()
1211- let prevAssetBalances = $t02592325991._1
1212- let prevAssetTotalSupply = $t02592325991._2
1216+ let $t02625126304 = _loadAssetWeights()
1217+ let assetWeights = $t02625126304._1
1218+ let sigmaWeight = $t02625126304._2
1219+ let $t02630926377 = _loadAssetBalances()
1220+ let prevAssetBalances = $t02630926377._1
1221+ let prevAssetTotalSupply = $t02630926377._2
12131222 let prevRewardBalances = _loadRewardBalances()
12141223 let err = if (if ((prevAssetTotalSupply == 0))
12151224 then true
12221231 let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex], sigmaWeight)
12231232 let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex]
12241233 let sourceRewardBalance = prevRewardBalances[sourceAssetIndex]
1225- let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + amount_), sourceEquilibrium, sourceRewardBalance)
1226- let newRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex, sourcePlusFeeDelta)
1227- let newAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex, (amount_ + sourcePlusFeeDelta))
1234+ let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + amount_), sourceEquilibrium, sourceRewardBalance, weightAmplifier)
12281235 let lpTokensToMint = (amount_ + sourcePlusFeeDelta)
1236+ let $t02717727308 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1237+ let lpFee = $t02717727308._1
1238+ let protocolFee = $t02717727308._2
1239+ let sigmaFeePerLpUpdated = $t02717727308._3
1240+ let feeCompensation = _feeCompensation((sourceRewardBalance - sourcePlusFeeDelta), (lpFee + protocolFee))
1241+ let newRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex, (sourcePlusFeeDelta + feeCompensation))
1242+ let newAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex, (lpTokensToMint + feeCompensation))
12291243 let err1 = _validateAllocation(newAssetBalances, newRewardBalances)
12301244 if ((err1 == err1))
1231- then {
1232- let $t02708127212 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1233- let lpFee = $t02708127212._1
1234- let protocolFee = $t02708127212._2
1235- let sigmaFeePerLpUpdated = $t02708127212._3
1236- $Tuple6(lpTokensToMint, newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1237- }
1245+ then $Tuple6((lpTokensToMint + feeCompensation), newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12381246 else throw("Strict value is not equal to itself.")
12391247 }
12401248 else throw("Strict value is not equal to itself.")
12441252 func _withdrawAll (amount_) = {
12451253 let storage = _loadStorage()
12461254 let lpTotalSupply = storage._3
1247- let $t02742527493 = _loadAssetBalances()
1248- let prevAssetBalances = $t02742527493._1
1249- let prevAssetTotalSupply = $t02742527493._2
1250- let $t02749827551 = _loadAssetWeights()
1251- let assetWeights = $t02749827551._1
1252- let sigmaWeight = $t02749827551._2
1255+ let $t02797628044 = _loadAssetBalances()
1256+ let prevAssetBalances = $t02797628044._1
1257+ let prevAssetTotalSupply = $t02797628044._2
1258+ let $t02804928102 = _loadAssetWeights()
1259+ let assetWeights = $t02804928102._1
1260+ let sigmaWeight = $t02804928102._2
12531261 let lpTokensToBurn = amount_
12541262 let err = _validateInt(lpTokensToBurn, 0, lpTotalSupply, "_withdrawAll: invalid lpTokensToBurn")
12551263 if ((err == err))
12561264 then {
1257- let $t02769527828 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1258- let assetBalances = $t02769527828._1
1259- let assetTotalSupply = $t02769527828._2
1260- let balancesToPay = $t02769527828._3
1265+ let $t02824628379 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1266+ let assetBalances = $t02824628379._1
1267+ let assetTotalSupply = $t02824628379._2
1268+ let balancesToPay = $t02824628379._3
12611269 $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12621270 }
12631271 else throw("Strict value is not equal to itself.")
12731281 let weightAmplifier = storage._7
12741282 let disbalanceCoeff = storage._8
12751283 let assets = _loadAssets()
1276- let $t02822228290 = _loadAssetBalances()
1277- let prevAssetBalances = $t02822228290._1
1278- let prevAssetTotalSupply = $t02822228290._2
1279- let $t02829528348 = _loadAssetWeights()
1280- let assetWeights = $t02829528348._1
1281- let sigmaWeight = $t02829528348._2
1284+ let $t02877328841 = _loadAssetBalances()
1285+ let prevAssetBalances = $t02877328841._1
1286+ let prevAssetTotalSupply = $t02877328841._2
1287+ let $t02884628899 = _loadAssetWeights()
1288+ let assetWeights = $t02884628899._1
1289+ let sigmaWeight = $t02884628899._2
12821290 let prevRewardBalances = _loadRewardBalances()
12831291 let targetAssetIndex = value(indexOf(assets, assetId_))
12841292 let targetBalanceBefore = prevAssetBalances[targetAssetIndex]
12911299 let err = _validateAllocation(assetBalances, rewardBalances)
12921300 if ((err == err))
12931301 then {
1294- let $t02933429482 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1295- let lpFee = $t02933429482._1
1296- let protocolFee = $t02933429482._2
1297- let sigmaFeePerLpUpdated = $t02933429482._3
1302+ let $t02988530033 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1303+ let lpFee = $t02988530033._1
1304+ let protocolFee = $t02988530033._2
1305+ let sigmaFeePerLpUpdated = $t02988530033._3
12981306 $Tuple6(targetAmount, assetBalances, rewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12991307 }
13001308 else throw("Strict value is not equal to itself.")
13111319 let maxAllocAmplifier = storage._6
13121320 let weightAmplifier = storage._7
13131321 let disbalanceCoeff = storage._8
1314- let $t03000930077 = _loadAssetBalances()
1315- let prevAssetBalances = $t03000930077._1
1316- let prevAssetTotalSupply = $t03000930077._2
1317- let $t03008230135 = _loadAssetWeights()
1318- let assetWeights = $t03008230135._1
1319- let sigmaWeight = $t03008230135._2
1322+ let $t03056030628 = _loadAssetBalances()
1323+ let prevAssetBalances = $t03056030628._1
1324+ let prevAssetTotalSupply = $t03056030628._2
1325+ let $t03063330686 = _loadAssetWeights()
1326+ let assetWeights = $t03063330686._1
1327+ let sigmaWeight = $t03063330686._2
13201328 let prevRewardBalances = _loadRewardBalances()
13211329 let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex_], sigmaWeight)
13221330 let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex_]
13231331 let sourceRewardBalance = prevRewardBalances[sourceAssetIndex_]
1324- let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + sourceAmount_), sourceEquilibrium, sourceRewardBalance)
1332+ let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + sourceAmount_), sourceEquilibrium, sourceRewardBalance, weightAmplifier)
13251333 let targetBalanceBefore = prevAssetBalances[targetAssetIndex_]
13261334 let targetEquilibrium = fraction(prevAssetTotalSupply, assetWeights[targetAssetIndex_], sigmaWeight)
13271335 let targetRewardBalance = prevRewardBalances[targetAssetIndex_]
13341342 let err = _validateAllocation(newAssetBalances, newRewardBalances)
13351343 if ((err == err))
13361344 then {
1337- let $t03171431855 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1338- let lpFee = $t03171431855._1
1339- let protocolFee = $t03171431855._2
1340- let sigmaFeePerLpUpdated = $t03171431855._3
1345+ let $t03228232423 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1346+ let lpFee = $t03228232423._1
1347+ let protocolFee = $t03228232423._2
1348+ let sigmaFeePerLpUpdated = $t03228232423._3
13411349 $Tuple6(targetAmount, newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13421350 }
13431351 else throw("Strict value is not equal to itself.")
13831391 else false
13841392 if ((err == err))
13851393 then {
1386- let $t03374433813 = _prepareAssetWeights(assetWeights_)
1387- let assetWeights = $t03374433813._1
1388- let sigmaWeight = $t03374433813._2
1394+ let $t03431234381 = _prepareAssetWeights(assetWeights_)
1395+ let assetWeights = $t03431234381._1
1396+ let sigmaWeight = $t03431234381._2
13891397 let assetBalances = _prepareAssetBalances(assets_)
13901398 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
13911399 let lpAssetId = calculateAssetId(issue)
14101418 let lpAssetId = storage._1
14111419 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14121420 let assets = _loadAssets()
1413- let $t03561235697 = _depositAll(amount_)
1414- let lpTokensToMint = $t03561235697._1
1415- let requiredAmountsNormalized = $t03561235697._2
1416- let assetBalances = $t03561235697._3
1421+ let $t03618036265 = _depositAll(amount_)
1422+ let lpTokensToMint = $t03618036265._1
1423+ let requiredAmountsNormalized = $t03618036265._2
1424+ let assetBalances = $t03618036265._3
14171425 func foldFunc (acc,elem) = {
14181426 let index = acc._1
14191427 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
14371445 else throw("Strict value is not equal to itself.")
14381446 }
14391447
1440- let $t03684036902 = {
1448+ let $t03740837470 = {
14411449 let $l = assets
14421450 let $s = size($l)
14431451 let $acc0 = $Tuple2(0, nil)
14511459
14521460 $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)
14531461 }
1454- let idx = $t03684036902._1
1455- let changeActions = $t03684036902._2
1462+ let idx = $t03740837470._1
1463+ let changeActions = $t03740837470._2
14561464 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14571465 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
14581466 }
14861494 let assetStr = _assetToStr(i.payments[0].assetId)
14871495 let assetDecimals = _getDecimals(assetStr)
14881496 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1489- let $t03834238474 = _deposit(assetStr, amountNormalized)
1490- let lpTokensToMint = $t03834238474._1
1491- let assetBalances = $t03834238474._2
1492- let rewardBalances = $t03834238474._3
1493- let lpFee = $t03834238474._4
1494- let protocolFee = $t03834238474._5
1495- let sigmaFeePerLpUpdated = $t03834238474._6
1497+ let $t03891039042 = _deposit(assetStr, amountNormalized)
1498+ let lpTokensToMint = $t03891039042._1
1499+ let assetBalances = $t03891039042._2
1500+ let rewardBalances = $t03891039042._3
1501+ let lpFee = $t03891039042._4
1502+ let protocolFee = $t03891039042._5
1503+ let sigmaFeePerLpUpdated = $t03891039042._6
14961504 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
14971505 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
14981506 if ((err2 == err2))
15251533 else false
15261534 if ((err == err))
15271535 then {
1528- let $t03998240069 = _withdrawAll(i.payments[0].amount)
1529- let lpTokensToBurn = $t03998240069._1
1530- let balancesToPay = $t03998240069._2
1531- let assetBalances = $t03998240069._3
1536+ let $t04055040637 = _withdrawAll(i.payments[0].amount)
1537+ let lpTokensToBurn = $t04055040637._1
1538+ let balancesToPay = $t04055040637._2
1539+ let assetBalances = $t04055040637._3
15321540 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
15331541 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15341542 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
15621570 else false
15631571 if ((err == err))
15641572 then {
1565- let $t04142341578 = _withdraw(assetId_, i.payments[0].amount)
1566- let targetAmountNormalized = $t04142341578._1
1567- let finalAssetBalances = $t04142341578._2
1568- let finalRewardBalances = $t04142341578._3
1569- let lpFee = $t04142341578._4
1570- let protocolFee = $t04142341578._5
1571- let sigmaFeePerLpUpdated = $t04142341578._6
1573+ let $t04199142146 = _withdraw(assetId_, i.payments[0].amount)
1574+ let targetAmountNormalized = $t04199142146._1
1575+ let finalAssetBalances = $t04199142146._2
1576+ let finalRewardBalances = $t04199142146._3
1577+ let lpFee = $t04199142146._4
1578+ let protocolFee = $t04199142146._5
1579+ let sigmaFeePerLpUpdated = $t04199142146._6
15721580 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
15731581 let targetDecimals = _getDecimals(assetId_)
15741582 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16141622 else false
16151623 if ((err == err))
16161624 then {
1617- let $t04374343922 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1618- let targetAmountNormalized = $t04374343922._1
1619- let finalAssetBalances = $t04374343922._2
1620- let finalRewardBalances = $t04374343922._3
1621- let lpFee = $t04374343922._4
1622- let protocolFee = $t04374343922._5
1623- let sigmaFeePerLpUpdated = $t04374343922._6
1625+ let $t04431144490 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1626+ let targetAmountNormalized = $t04431144490._1
1627+ let finalAssetBalances = $t04431144490._2
1628+ let finalRewardBalances = $t04431144490._3
1629+ let lpFee = $t04431144490._4
1630+ let protocolFee = $t04431144490._5
1631+ let sigmaFeePerLpUpdated = $t04431144490._6
16241632 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16251633 let targetDecimals = _getDecimals(targetAssetId_)
16261634 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16431651 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
16441652 if ((err == err))
16451653 then {
1646- let $t04509445181 = _depositAll(lpAmount_)
1647- let lpTokensToMint = $t04509445181._1
1648- let requiredAmountsNormalized = $t04509445181._2
1649- let assetBalances = $t04509445181._3
1654+ let $t04566245749 = _depositAll(lpAmount_)
1655+ let lpTokensToMint = $t04566245749._1
1656+ let requiredAmountsNormalized = $t04566245749._2
1657+ let assetBalances = $t04566245749._3
16501658 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
16511659 }
16521660 else throw("Strict value is not equal to itself.")
16661674 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16671675 let assetDecimals = _getDecimals(assetId_)
16681676 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1669- let $t04594046072 = _deposit(assetId_, amountNormalized)
1670- let lpTokensToMint = $t04594046072._1
1671- let assetBalances = $t04594046072._2
1672- let rewardBalances = $t04594046072._3
1673- let lpFee = $t04594046072._4
1674- let protocolFee = $t04594046072._5
1675- let sigmaFeePerLpUpdated = $t04594046072._6
1677+ let $t04650846640 = _deposit(assetId_, amountNormalized)
1678+ let lpTokensToMint = $t04650846640._1
1679+ let assetBalances = $t04650846640._2
1680+ let rewardBalances = $t04650846640._3
1681+ let lpFee = $t04650846640._4
1682+ let protocolFee = $t04650846640._5
1683+ let sigmaFeePerLpUpdated = $t04650846640._6
16761684 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
16771685 $Tuple2(nil, lpTokensToSend)
16781686 }
16861694 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
16871695 if ((err == err))
16881696 then {
1689- let $t04651146587 = _withdrawAll(lpAmount_)
1690- let lpTokensToBurn = $t04651146587._1
1691- let balancesToGet = $t04651146587._2
1692- let assetBalances = $t04651146587._3
1697+ let $t04707947155 = _withdrawAll(lpAmount_)
1698+ let lpTokensToBurn = $t04707947155._1
1699+ let balancesToGet = $t04707947155._2
1700+ let assetBalances = $t04707947155._3
16931701 $Tuple2(nil, balancesToGet)
16941702 }
16951703 else throw("Strict value is not equal to itself.")
17071715 let storage = _loadStorage()
17081716 let lpAssetId = storage._1
17091717 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1710- let $t04723847370 = _withdraw(assetId_, amount_)
1711- let targetAmountNormalized = $t04723847370._1
1712- let assetBalances = $t04723847370._2
1713- let rewardBalances = $t04723847370._3
1714- let lpFee = $t04723847370._4
1715- let protocolFee = $t04723847370._5
1716- let sigmaFeePerLpUpdated = $t04723847370._6
1718+ let $t04780647938 = _withdraw(assetId_, amount_)
1719+ let targetAmountNormalized = $t04780647938._1
1720+ let assetBalances = $t04780647938._2
1721+ let rewardBalances = $t04780647938._3
1722+ let lpFee = $t04780647938._4
1723+ let protocolFee = $t04780647938._5
1724+ let sigmaFeePerLpUpdated = $t04780647938._6
17171725 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17181726 let targetDecimals = _getDecimals(assetId_)
17191727 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17421750 else false
17431751 if ((err == err))
17441752 then {
1745- let $t04878048959 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1746- let targetAmountNormalized = $t04878048959._1
1747- let finalAssetBalances = $t04878048959._2
1748- let finalRewardBalances = $t04878048959._3
1749- let lpFee = $t04878048959._4
1750- let protocolFee = $t04878048959._5
1751- let sigmaFeePerLpUpdated = $t04878048959._6
1753+ let $t04934849527 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1754+ let targetAmountNormalized = $t04934849527._1
1755+ let finalAssetBalances = $t04934849527._2
1756+ let finalRewardBalances = $t04934849527._3
1757+ let lpFee = $t04934849527._4
1758+ let protocolFee = $t04934849527._5
1759+ let sigmaFeePerLpUpdated = $t04934849527._6
17521760 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17531761 let targetDecimals = _getDecimals(targetAssetId_)
17541762 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17681776 let user = if ((size(user_) > 0))
17691777 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
17701778 else i.caller
1771- let $t04960149657 = _checkpoint(user)
1772- let checkpointActions = $t04960149657._1
1773- let userProfits = $t04960149657._2
1779+ let $t05016950225 = _checkpoint(user)
1780+ let checkpointActions = $t05016950225._1
1781+ let userProfits = $t05016950225._2
17741782 $Tuple2(nil, userProfits)
17751783 }
17761784
18281836 else false
18291837 if ((err1 == err1))
18301838 then {
1831- let $t05086950929 = _checkpoint(i.caller)
1832- let checkpointActions = $t05086950929._1
1833- let userProfits = $t05086950929._2
1839+ let $t05143751497 = _checkpoint(i.caller)
1840+ let checkpointActions = $t05143751497._1
1841+ let userProfits = $t05143751497._2
18341842 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
18351843 }
18361844 else throw("Strict value is not equal to itself.")
18531861 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
18541862 if ((err1 == err1))
18551863 then {
1856- let $t05144051500 = _checkpoint(i.caller)
1857- let checkpointActions = $t05144051500._1
1858- let userProfits = $t05144051500._2
1864+ let $t05200852068 = _checkpoint(i.caller)
1865+ let checkpointActions = $t05200852068._1
1866+ let userProfits = $t05200852068._2
18591867 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
18601868 }
18611869 else throw("Strict value is not equal to itself.")
18801888 let lpAssetIdStr = _assetToStr(lpAssetId)
18811889 let assets = [lpAssetIdStr, _loadAssets()]
18821890 let maxIndex = (size(assets) - 1)
1883- let $t05218852244 = _checkpoint(user)
1884- let checkpointActions = $t05218852244._1
1885- let userProfits = $t05218852244._2
1891+ let $t05275652812 = _checkpoint(user)
1892+ let checkpointActions = $t05275652812._1
1893+ let userProfits = $t05275652812._2
18861894 func foldFunc (acc,profit) = {
18871895 let index = acc._1
18881896 if (if ((maxIndex >= index))
18951903 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
18961904 }
18971905
1898- let $t05262252713 = {
1906+ let $t05319053281 = {
18991907 let $l = userProfits
19001908 let $s = size($l)
19011909 let $acc0 = $Tuple3(0, nil, nil)
19091917
19101918 $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)
19111919 }
1912- let idx = $t05262252713._1
1913- let userProfitsUpdated = $t05262252713._2
1914- let profitActions = $t05262252713._3
1920+ let idx = $t05319053281._1
1921+ let userProfitsUpdated = $t05319053281._2
1922+ let profitActions = $t05319053281._3
19151923 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19161924 }
19171925 else throw("Strict value is not equal to itself.")
19341942 let lpAssetIdStr = _assetToStr(lpAssetId)
19351943 let assets = [lpAssetIdStr, _loadAssets()]
19361944 let maxIndex = (size(assets) - 1)
1937- let $t05334353403 = _loadAssetBalances()
1938- let assetBalances = $t05334353403._1
1939- let assetTotalSupply = $t05334353403._2
1940- let $t05340953465 = _checkpoint(user)
1941- let checkpointActions = $t05340953465._1
1942- let userProfits = $t05340953465._2
1945+ let $t05391153971 = _loadAssetBalances()
1946+ let assetBalances = $t05391153971._1
1947+ let assetTotalSupply = $t05391153971._2
1948+ let $t05397754033 = _checkpoint(user)
1949+ let checkpointActions = $t05397754033._1
1950+ let userProfits = $t05397754033._2
19431951 func foldFunc (acc,profit) = {
19441952 let index = acc._1
19451953 if ((index == 0))
19551963 else $Tuple5((index + 1), (acc._2 :+ 0), acc._3, acc._4, acc._5)
19561964 }
19571965
1958- let $t05400154137 = {
1966+ let $t05456954705 = {
19591967 let $l = userProfits
19601968 let $s = size($l)
19611969 let $acc0 = $Tuple5(0, nil, nil, 0, 0)
19691977
19701978 $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)
19711979 }
1972- let idx = $t05400154137._1
1973- let userProfitsUpdated = $t05400154137._2
1974- let assetBalancesUpdated = $t05400154137._3
1975- let lpTokensToMint = $t05400154137._4
1976- let lpTokensProfit = $t05400154137._5
1980+ let idx = $t05456954705._1
1981+ let userProfitsUpdated = $t05456954705._2
1982+ let assetBalancesUpdated = $t05456954705._3
1983+ let lpTokensToMint = $t05456954705._4
1984+ let lpTokensProfit = $t05456954705._5
19771985 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
19781986 $Tuple2((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, (lpTokensToMint + lpTokensProfit), lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalancesUpdated)) ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19791987 }
20352043 then {
20362044 let storage = _loadStorage()
20372045 let lpTokenSupply = storage._3
2038- let $t05667256732 = _loadAssetBalances()
2039- let assetBalances = $t05667256732._1
2040- let assetTotalSupply = $t05667256732._2
2046+ let $t05724057300 = _loadAssetBalances()
2047+ let assetBalances = $t05724057300._1
2048+ let assetTotalSupply = $t05724057300._2
20412049 let balancesDiff = max([(assetTotalSupply - lpTokenSupply), 0])
20422050 let storageUpdated = $Tuple10(storage._1, storage._2, (lpTokenSupply + balancesDiff), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
20432051 $Tuple2(_saveStorage(storageUpdated), unit)
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 FEE_RATE_FACTOR = 1000000
1919
2020 let RATE_FACTOR = 1000000
2121
2222 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2323
2424 let DISBAlANCE_COEFF_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 INDEX_LIST = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3131
3232 let ZERO_BIGINT = toBigInt(0)
3333
3434 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]
3535
3636 let INT_DECIMALS = 8
3737
3838 let BIGINT_DECIMALS = 18
3939
4040 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_REWARD_BALANCES = "REWARD_BALANCES"
5757
5858 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5959
6060 let KEY_LP_FEE = "LP_FEE"
6161
6262 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
6363
6464 let KEY_PRECISION = "PRECISION"
6565
6666 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6767
6868 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6969
7070 let KEY_USER_LP = "USER_LP"
7171
7272 let KEY_TOTAL_LP = "TOTAL_LP"
7373
7474 let KEY_USER_PROFITS = "USER_PROFITS"
7575
7676 let KEY_WATCHDOG = "WATCHDOG"
7777
7878 let KEY_WATCHDOG_OFFSET = "WATCHDOG_OFFSET"
7979
8080 let KEY_WATCHDOG_HEIGHT = "WATCHDOG_HEIGHT"
8181
8282 func _validateAddress (address_,err_) = match addressFromString(address_) {
8383 case a: Address =>
8484 true
8585 case _ =>
8686 throw(err_)
8787 }
8888
8989
9090 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
9191 then true
9292 else match assetInfo(fromBase58String(assetId_)) {
9393 case a: Asset =>
9494 true
9595 case _ =>
9696 throw(err_)
9797 }
9898
9999
100100 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
101101 then true
102102 else (val_ > upperBoundary_))
103103 then throw(err_)
104104 else true
105105
106106
107107 func _validateBool (val_,target_,err_) = if ((val_ != target_))
108108 then throw(err_)
109109 else true
110110
111111
112112 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
113113 then throw(err_)
114114 else true
115115
116116
117117 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
118118 then throw(err_)
119119 else true
120120
121121
122122 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
123123 func foldFunc (acc,elem) = match parseInt(elem) {
124124 case a: Int =>
125125 if (acc)
126126 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
127127 else false
128128 case _ =>
129129 throw(err_)
130130 }
131131
132132 let $l = val_
133133 let $s = size($l)
134134 let $acc0 = true
135135 func $f0_1 ($a,$i) = if (($i >= $s))
136136 then $a
137137 else foldFunc($a, $l[$i])
138138
139139 func $f0_2 ($a,$i) = if (($i >= $s))
140140 then $a
141141 else throw("List size exceeds 10")
142142
143143 $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)
144144 }
145145
146146
147147 func _validateAssets (assets_,err_) = {
148148 func foldFunc (acc,elem) = if (acc)
149149 then _validateAsset(elem, err_)
150150 else false
151151
152152 let $l = assets_
153153 let $s = size($l)
154154 let $acc0 = true
155155 func $f0_1 ($a,$i) = if (($i >= $s))
156156 then $a
157157 else foldFunc($a, $l[$i])
158158
159159 func $f0_2 ($a,$i) = if (($i >= $s))
160160 then $a
161161 else throw("List size exceeds 10")
162162
163163 $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)
164164 }
165165
166166
167167 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
168168 then throw(err_)
169169 else true
170170
171171
172172 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
173173 then true
174174 else (size(val_) > 16))
175175 then throw(err_)
176176 else true
177177
178178
179179 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
180180 then throw(err_)
181181 else true
182182
183183
184184 func _validateDecimals (val_,err_) = if (if ((0 > val_))
185185 then true
186186 else (val_ > 8))
187187 then throw(err_)
188188 else true
189189
190190
191191 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
192192 case a: ByteVector =>
193193 if ((assetId_ != toBase58String(a)))
194194 then throw((err_ + ": asset"))
195195 else if ((requiredAmount_ > payment_.amount))
196196 then throw((err_ + ": amount"))
197197 else true
198198 case _ =>
199199 throw((err_ + ": asset"))
200200 }
201201
202202
203203 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
204204 then throw(err_)
205205 else true
206206
207207
208208 func _assetToStr (asset_) = match asset_ {
209209 case a: ByteVector =>
210210 toBase58String(a)
211211 case _ =>
212212 WAVES
213213 }
214214
215215
216216 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
217217 then true
218218 else (asset_ == ""))
219219 then unit
220220 else fromBase58String(asset_)
221221
222222
223223 func _loadPause () = match getBoolean(KEY_PAUSED) {
224224 case a: Boolean =>
225225 a
226226 case _ =>
227227 false
228228 }
229229
230230
231231 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
232232
233233
234234 func _loadPauser () = match getString(KEY_PAUSER) {
235235 case a: String =>
236236 addressFromStringValue(a)
237237 case _ =>
238238 Address(base58'')
239239 }
240240
241241
242242 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
243243
244244
245245 func _loadMultisig () = match getString(KEY_MULTISIG) {
246246 case a: String =>
247247 addressFromStringValue(a)
248248 case _ =>
249249 Address(base58'')
250250 }
251251
252252
253253 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
254254
255255
256256 func _loadStorage () = match getString(KEY_STORAGE) {
257257 case a: String =>
258258 let struct = split(a, SEP)
259259 $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]))
260260 case _ =>
261261 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
262262 }
263263
264264
265265 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
266266 then "1"
267267 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))]
268268
269269
270270 func _loadAssets () = match getString(KEY_ASSETS) {
271271 case a: String =>
272272 if ((size(a) > 0))
273273 then split_51C(a, SEP)
274274 else nil
275275 case _ =>
276276 nil
277277 }
278278
279279
280280 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
281281
282282
283283 func _loadAssetBalances () = {
284284 func foldFunc (acc,elem) = {
285285 let balance = parseIntValue(elem)
286286 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
287287 }
288288
289289 match getString(KEY_ASSET_BALANCES) {
290290 case a: String =>
291291 if ((size(a) > 0))
292292 then {
293293 let $l = split_51C(a, SEP)
294294 let $s = size($l)
295295 let $acc0 = $Tuple2(nil, 0)
296296 func $f0_1 ($a,$i) = if (($i >= $s))
297297 then $a
298298 else foldFunc($a, $l[$i])
299299
300300 func $f0_2 ($a,$i) = if (($i >= $s))
301301 then $a
302302 else throw("List size exceeds 10")
303303
304304 $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)
305305 }
306306 else $Tuple2(ZERO_INT_LIST_10, 0)
307307 case _ =>
308308 $Tuple2(ZERO_INT_LIST_10, 0)
309309 }
310310 }
311311
312312
313313 func _saveAssetBalances (balances_) = {
314314 func foldFunc (acc,elem) = (acc :+ toString(elem))
315315
316316 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
317317 let $l = balances_
318318 let $s = size($l)
319319 let $acc0 = nil
320320 func $f0_1 ($a,$i) = if (($i >= $s))
321321 then $a
322322 else foldFunc($a, $l[$i])
323323
324324 func $f0_2 ($a,$i) = if (($i >= $s))
325325 then $a
326326 else throw("List size exceeds 10")
327327
328328 $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)
329329 }, SEP))]
330330 }
331331
332332
333333 func _loadRewardBalances () = {
334334 func foldFunc (acc,elem) = {
335335 let balance = parseIntValue(elem)
336336 (acc :+ balance)
337337 }
338338
339339 match getString(KEY_REWARD_BALANCES) {
340340 case a: String =>
341341 if ((size(a) > 0))
342342 then {
343343 let $l = split_51C(a, SEP)
344344 let $s = size($l)
345345 let $acc0 = nil
346346 func $f0_1 ($a,$i) = if (($i >= $s))
347347 then $a
348348 else foldFunc($a, $l[$i])
349349
350350 func $f0_2 ($a,$i) = if (($i >= $s))
351351 then $a
352352 else throw("List size exceeds 10")
353353
354354 $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)
355355 }
356356 else ZERO_INT_LIST_10
357357 case _ =>
358358 ZERO_INT_LIST_10
359359 }
360360 }
361361
362362
363363 func _saveRewardBalances (balances_) = {
364364 func foldFunc (acc,elem) = (acc :+ toString(elem))
365365
366366 [StringEntry(KEY_REWARD_BALANCES, makeString_11C({
367367 let $l = balances_
368368 let $s = size($l)
369369 let $acc0 = nil
370370 func $f0_1 ($a,$i) = if (($i >= $s))
371371 then $a
372372 else foldFunc($a, $l[$i])
373373
374374 func $f0_2 ($a,$i) = if (($i >= $s))
375375 then $a
376376 else throw("List size exceeds 10")
377377
378378 $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)
379379 }, SEP))]
380380 }
381381
382382
383383 func _loadAssetWeights () = {
384384 func foldFunc (acc,elem) = {
385385 let weight = parseIntValue(elem)
386386 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
387387 }
388388
389389 match getString(KEY_ASSET_WEIGHTS) {
390390 case a: String =>
391391 if ((size(a) > 0))
392392 then {
393393 let $l = split_51C(a, SEP)
394394 let $s = size($l)
395395 let $acc0 = $Tuple2(nil, 0)
396396 func $f0_1 ($a,$i) = if (($i >= $s))
397397 then $a
398398 else foldFunc($a, $l[$i])
399399
400400 func $f0_2 ($a,$i) = if (($i >= $s))
401401 then $a
402402 else throw("List size exceeds 10")
403403
404404 $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)
405405 }
406406 else $Tuple2(ZERO_INT_LIST_10, 0)
407407 case _ =>
408408 $Tuple2(ZERO_INT_LIST_10, 0)
409409 }
410410 }
411411
412412
413413 func _saveAssetWeights (weights_) = {
414414 func foldFunc (acc,elem) = (acc :+ toString(elem))
415415
416416 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
417417 let $l = weights_
418418 let $s = size($l)
419419 let $acc0 = nil
420420 func $f0_1 ($a,$i) = if (($i >= $s))
421421 then $a
422422 else foldFunc($a, $l[$i])
423423
424424 func $f0_2 ($a,$i) = if (($i >= $s))
425425 then $a
426426 else throw("List size exceeds 10")
427427
428428 $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)
429429 }, SEP))]
430430 }
431431
432432
433433 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
434434 case a: Int =>
435435 a
436436 case _ =>
437437 0
438438 }
439439
440440
441441 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
442442
443443
444444 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
445445 case a: Int =>
446446 a
447447 case _ =>
448448 0
449449 }
450450
451451
452452 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
453453
454454
455455 func _loadPrecision () = match getInteger(KEY_PRECISION) {
456456 case a: Int =>
457457 a
458458 case _ =>
459459 0
460460 }
461461
462462
463463 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
464464
465465
466466 func _loadSigmaFeePerLp () = {
467467 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
468468
469469 match getString(KEY_SIGMA_FEE_PER_LP) {
470470 case a: String =>
471471 if ((size(a) > 0))
472472 then {
473473 let $l = split_51C(a, SEP)
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 }
486486 else ZERO_BIGINT_LIST_11
487487 case _ =>
488488 ZERO_BIGINT_LIST_11
489489 }
490490 }
491491
492492
493493 func _saveSigmaFeePerLp (val_) = {
494494 func foldFunc (acc,elem) = (acc :+ toString(elem))
495495
496496 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
497497 let $l = val_
498498 let $s = size($l)
499499 let $acc0 = nil
500500 func $f0_1 ($a,$i) = if (($i >= $s))
501501 then $a
502502 else foldFunc($a, $l[$i])
503503
504504 func $f0_2 ($a,$i) = if (($i >= $s))
505505 then $a
506506 else throw("List size exceeds 11")
507507
508508 $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)
509509 }, SEP))]
510510 }
511511
512512
513513 func _loadUserSigmaFeePerLp (user_) = {
514514 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
515515
516516 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
517517 case a: String =>
518518 if ((size(a) > 0))
519519 then {
520520 let $l = split_51C(a, SEP)
521521 let $s = size($l)
522522 let $acc0 = nil
523523 func $f0_1 ($a,$i) = if (($i >= $s))
524524 then $a
525525 else foldFunc($a, $l[$i])
526526
527527 func $f0_2 ($a,$i) = if (($i >= $s))
528528 then $a
529529 else throw("List size exceeds 11")
530530
531531 $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)
532532 }
533533 else ZERO_BIGINT_LIST_11
534534 case _ =>
535535 ZERO_BIGINT_LIST_11
536536 }
537537 }
538538
539539
540540 func _saveUserSigmaFeePerLp (user_,val_) = {
541541 func foldFunc (acc,elem) = (acc :+ toString(elem))
542542
543543 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
544544 let $l = val_
545545 let $s = size($l)
546546 let $acc0 = nil
547547 func $f0_1 ($a,$i) = if (($i >= $s))
548548 then $a
549549 else foldFunc($a, $l[$i])
550550
551551 func $f0_2 ($a,$i) = if (($i >= $s))
552552 then $a
553553 else throw("List size exceeds 11")
554554
555555 $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)
556556 }, SEP))]
557557 }
558558
559559
560560 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
561561 case a: Int =>
562562 a
563563 case _ =>
564564 0
565565 }
566566
567567
568568 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
569569
570570
571571 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
572572 case a: Int =>
573573 a
574574 case _ =>
575575 0
576576 }
577577
578578
579579 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
580580
581581
582582 func _loadUserProfits (user_) = {
583583 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
584584
585585 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
586586 case a: String =>
587587 if ((size(a) > 0))
588588 then {
589589 let $l = split_51C(a, SEP)
590590 let $s = size($l)
591591 let $acc0 = nil
592592 func $f0_1 ($a,$i) = if (($i >= $s))
593593 then $a
594594 else foldFunc($a, $l[$i])
595595
596596 func $f0_2 ($a,$i) = if (($i >= $s))
597597 then $a
598598 else throw("List size exceeds 11")
599599
600600 $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)
601601 }
602602 else ZERO_INT_LIST_11
603603 case _ =>
604604 ZERO_INT_LIST_11
605605 }
606606 }
607607
608608
609609 func _saveUserProfits (user_,val_) = {
610610 func foldFunc (acc,elem) = (acc :+ toString(elem))
611611
612612 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
613613 let $l = val_
614614 let $s = size($l)
615615 let $acc0 = nil
616616 func $f0_1 ($a,$i) = if (($i >= $s))
617617 then $a
618618 else foldFunc($a, $l[$i])
619619
620620 func $f0_2 ($a,$i) = if (($i >= $s))
621621 then $a
622622 else throw("List size exceeds 11")
623623
624624 $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)
625625 }, SEP))]
626626 }
627627
628628
629629 func _loadWatchdog () = match getString(KEY_WATCHDOG) {
630630 case a: String =>
631631 addressFromStringValue(a)
632632 case _ =>
633633 Address(base58'')
634634 }
635635
636636
637637 func _saveWatchdog (watchdog_) = [StringEntry(KEY_WATCHDOG, toString(watchdog_))]
638638
639639
640640 func _loadWatchdogOffset () = match getInteger(KEY_WATCHDOG_OFFSET) {
641641 case a: Int =>
642642 a
643643 case _ =>
644644 0
645645 }
646646
647647
648648 func _saveWatchdogOffset (offset_) = [IntegerEntry(KEY_WATCHDOG_OFFSET, offset_)]
649649
650650
651651 func _onlyThisContract (caller_) = if ((caller_ != this))
652652 then throw("_onlyThisContract: revert")
653653 else true
654654
655655
656656 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
657657 then throw("_whenMultisigSet: revert")
658658 else true
659659
660660
661661 func _whenNotInitialized () = {
662662 let storage = _loadStorage()
663663 if ((storage._1 != base58''))
664664 then throw("_whenNotInitialized: revert")
665665 else true
666666 }
667667
668668
669669 func _whenInitialized () = {
670670 let storage = _loadStorage()
671671 if ((storage._1 == base58''))
672672 then throw("_whenInitialized: revert")
673673 else true
674674 }
675675
676676
677677 func _whenNotPaused () = if (_loadPause())
678678 then throw("_whenNotPaused: revert")
679679 else true
680680
681681
682682 func _whenPaused () = if (!(_loadPause()))
683683 then throw("_whenPaused: revert")
684684 else true
685685
686686
687687 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
688688 then throw("_onlyPauser: revert")
689689 else true
690690
691691
692692 func _checkWatchdog () = {
693693 let wd = match getInteger(_loadWatchdog(), KEY_WATCHDOG_HEIGHT) {
694694 case a: Int =>
695695 (a + _loadWatchdogOffset())
696696 case _ =>
697697 0
698698 }
699699 if ((height > wd))
700700 then throw("_checkWatchdog: revert")
701701 else true
702702 }
703703
704704
705705 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
706706 case a: Asset =>
707707 a.decimals
708708 case _ =>
709709 throw(("_getDecimals: no asset=" + assetId_))
710710 }
711711
712712
713713 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
714714 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
715715 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
716716
717717
718718 func _prepareAssetBalances (assets_) = {
719719 func foldFunc (acc,elem) = (acc :+ 0)
720720
721721 let $l = assets_
722722 let $s = size($l)
723723 let $acc0 = nil
724724 func $f0_1 ($a,$i) = if (($i >= $s))
725725 then $a
726726 else foldFunc($a, $l[$i])
727727
728728 func $f0_2 ($a,$i) = if (($i >= $s))
729729 then $a
730730 else throw("List size exceeds 10")
731731
732732 $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)
733733 }
734734
735735
736736 func _prepareAssetWeights (assetWeights_) = {
737737 func foldFunc (acc,elem) = {
738738 let weight = parseIntValue(elem)
739739 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
740740 }
741741
742742 let $l = assetWeights_
743743 let $s = size($l)
744744 let $acc0 = $Tuple2(nil, 0)
745745 func $f0_1 ($a,$i) = if (($i >= $s))
746746 then $a
747747 else foldFunc($a, $l[$i])
748748
749749 func $f0_2 ($a,$i) = if (($i >= $s))
750750 then $a
751751 else throw("List size exceeds 10")
752752
753753 $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)
754754 }
755755
756756
757757 func _getAssetBalances (assets_,decimals_) = {
758758 func foldFunc (acc,elem) = {
759759 let assetDecimals = _getDecimals(elem)
760760 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
761761 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
762762 }
763763
764764 let $l = assets_
765765 let $s = size($l)
766766 let $acc0 = $Tuple2(nil, 0)
767767 func $f0_1 ($a,$i) = if (($i >= $s))
768768 then $a
769769 else foldFunc($a, $l[$i])
770770
771771 func $f0_2 ($a,$i) = if (($i >= $s))
772772 then $a
773773 else throw("List size exceeds 10")
774774
775775 $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)
776776 }
777777
778778
779779 func _listIntToString (assets_) = {
780780 func foldFunc (acc,elem) = (acc :+ toString(elem))
781781
782782 makeString({
783783 let $l = assets_
784784 let $s = size($l)
785785 let $acc0 = nil
786786 func $f0_1 ($a,$i) = if (($i >= $s))
787787 then $a
788788 else foldFunc($a, $l[$i])
789789
790790 func $f0_2 ($a,$i) = if (($i >= $s))
791791 then $a
792792 else throw("List size exceeds 11")
793793
794794 $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)
795795 }, SEP)
796796 }
797797
798798
799799 func _listBigIntToString (assets_) = {
800800 func foldFunc (acc,elem) = (acc :+ toString(elem))
801801
802802 makeString({
803803 let $l = assets_
804804 let $s = size($l)
805805 let $acc0 = nil
806806 func $f0_1 ($a,$i) = if (($i >= $s))
807807 then $a
808808 else foldFunc($a, $l[$i])
809809
810810 func $f0_2 ($a,$i) = if (($i >= $s))
811811 then $a
812812 else throw("List size exceeds 11")
813813
814814 $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)
815815 }, SEP)
816816 }
817817
818818
819819 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
820820 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
821821
822822 let $l = weights_
823823 let $s = size($l)
824824 let $acc0 = nil
825825 func $f0_1 ($a,$i) = if (($i >= $s))
826826 then $a
827827 else foldFunc($a, $l[$i])
828828
829829 func $f0_2 ($a,$i) = if (($i >= $s))
830830 then $a
831831 else throw("List size exceeds 10")
832832
833833 $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)
834834 }
835835
836836
837837 func _incrementBalancesByAmounts (balances_,amounts_) = {
838838 func foldFunc (acc,elem) = {
839839 let index = acc._1
840840 let amount = amounts_[index]
841841 let newBalance = (elem + amount)
842842 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
843843 }
844844
845845 let result = {
846846 let $l = balances_
847847 let $s = size($l)
848848 let $acc0 = $Tuple3(0, nil, 0)
849849 func $f0_1 ($a,$i) = if (($i >= $s))
850850 then $a
851851 else foldFunc($a, $l[$i])
852852
853853 func $f0_2 ($a,$i) = if (($i >= $s))
854854 then $a
855855 else throw("List size exceeds 10")
856856
857857 $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)
858858 }
859859 $Tuple2(result._2, result._3)
860860 }
861861
862862
863863 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
864864 func foldFunc (acc,elem) = {
865865 let index = acc._1
866866 let payment = payments_[index]
867867 let paymentAssetStr = _assetToStr(payment.assetId)
868868 let err = if ((paymentAssetStr != assets_[index]))
869869 then throw(((err_ + ": index=") + toString(index)))
870870 else unit
871871 if ((err == err))
872872 then {
873873 let assetDecimals = _getDecimals(paymentAssetStr)
874874 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
875875 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
876876 }
877877 else throw("Strict value is not equal to itself.")
878878 }
879879
880880 let result = {
881881 let $l = balances_
882882 let $s = size($l)
883883 let $acc0 = $Tuple3(0, nil, 0)
884884 func $f0_1 ($a,$i) = if (($i >= $s))
885885 then $a
886886 else foldFunc($a, $l[$i])
887887
888888 func $f0_2 ($a,$i) = if (($i >= $s))
889889 then $a
890890 else throw("List size exceeds 10")
891891
892892 $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)
893893 }
894894 $Tuple2(result._2, result._3)
895895 }
896896
897897
898898 func _incrementBalanceByIndex (balances_,index_,amount_) = {
899899 func foldFunc (acc,elem) = {
900900 let index = acc._1
901901 if ((index == index_))
902902 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
903903 else $Tuple2((index + 1), (acc._2 :+ elem))
904904 }
905905
906906 let result = {
907907 let $l = balances_
908908 let $s = size($l)
909909 let $acc0 = $Tuple2(0, nil)
910910 func $f0_1 ($a,$i) = if (($i >= $s))
911911 then $a
912912 else foldFunc($a, $l[$i])
913913
914914 func $f0_2 ($a,$i) = if (($i >= $s))
915915 then $a
916916 else throw("List size exceeds 10")
917917
918918 $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)
919919 }
920920 result._2
921921 }
922922
923923
924924 func _decrementBalanceByIndex (balances_,index_,amount_) = {
925925 func foldFunc (acc,elem) = {
926926 let index = acc._1
927927 if (if ((index == index_))
928928 then (amount_ > elem)
929929 else false)
930930 then throw("insufficient balance")
931931 else if (if ((index == index_))
932932 then (elem >= amount_)
933933 else false)
934934 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
935935 else $Tuple2((index + 1), (acc._2 :+ elem))
936936 }
937937
938938 let result = {
939939 let $l = balances_
940940 let $s = size($l)
941941 let $acc0 = $Tuple2(0, nil)
942942 func $f0_1 ($a,$i) = if (($i >= $s))
943943 then $a
944944 else foldFunc($a, $l[$i])
945945
946946 func $f0_2 ($a,$i) = if (($i >= $s))
947947 then $a
948948 else throw("List size exceeds 10")
949949
950950 $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)
951951 }
952952 result._2
953953 }
954954
955955
956956 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
957957 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
958958 func foldFunc (acc,elem) = {
959959 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
960960 let deltaBalance = (elem - newBalance)
961961 if ((0 > deltaBalance))
962962 then throw("insufficient delta balance")
963963 else $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
964964 }
965965
966966 let $l = balances_
967967 let $s = size($l)
968968 let $acc0 = $Tuple3(nil, 0, nil)
969969 func $f0_1 ($a,$i) = if (($i >= $s))
970970 then $a
971971 else foldFunc($a, $l[$i])
972972
973973 func $f0_2 ($a,$i) = if (($i >= $s))
974974 then $a
975975 else throw("List size exceeds 10")
976976
977977 $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)
978978 }
979979
980980
981981 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
982982 func foldFunc (acc,elem) = {
983983 let index = acc._1
984984 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
985985 }
986986
987987 let result = {
988988 let $l = assets_
989989 let $s = size($l)
990990 let $acc0 = $Tuple2(0, nil)
991991 func $f0_1 ($a,$i) = if (($i >= $s))
992992 then $a
993993 else foldFunc($a, $l[$i])
994994
995995 func $f0_2 ($a,$i) = if (($i >= $s))
996996 then $a
997997 else throw("List size exceeds 10")
998998
999999 $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)
10001000 }
10011001 result._2
10021002 }
10031003
10041004
10051005 func _calculateMinusFee (balance_,equilibrium_,lpAmount_,weightAmplifier_,disbalanceCoeff_) = {
10061006 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
10071007 if ((balance_ > threshold))
10081008 then 0
10091009 else toInt(fraction(fraction(toBigInt(lpAmount_), toBigInt(disbalanceCoeff_), DISBAlANCE_COEFF_FACTOR), toBigInt((threshold - balance_)), toBigInt(threshold), CEILING))
10101010 }
10111011
10121012
10131013 func _calculateMinusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,lpAmount_,weightAmplifier_,disbalanceCoeff_) = if ((balanceAfter_ > balanceBefore_))
10141014 then 0
10151015 else (_calculateMinusFee(balanceAfter_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_) - _calculateMinusFee(balanceBefore_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_))
10161016
10171017
1018-func _calculatePlusFee (balance_,equilibrium_,rewardBalance_) = if ((balance_ > equilibrium_))
1018+func _calculatePlusFee (balance_,equilibrium_,rewardBalance_,weightAmplifier_) = {
1019+ let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
1020+ let disbalanceReward = fraction(rewardBalance_, threshold, equilibrium_)
1021+ if ((balance_ > threshold))
1022+ then disbalanceReward
1023+ else fraction(disbalanceReward, balance_, threshold, FLOOR)
1024+ }
1025+
1026+
1027+func _calculatePlusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,rewardBalance_,weightAmplifier_) = if ((balanceBefore_ > balanceAfter_))
1028+ then 0
1029+ else (_calculatePlusFee(balanceAfter_, equilibrium_, rewardBalance_, weightAmplifier_) - _calculatePlusFee(balanceBefore_, equilibrium_, rewardBalance_, weightAmplifier_))
1030+
1031+
1032+func _feeCompensation (rewardBalance_,fee_) = if ((fee_ > rewardBalance_))
10191033 then rewardBalance_
1020- else fraction(rewardBalance_, balance_, equilibrium_, FLOOR)
1021-
1022-
1023-func _calculatePlusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,rewardBalance_) = if ((balanceBefore_ > balanceAfter_))
1024- then 0
1025- else (_calculatePlusFee(balanceAfter_, equilibrium_, rewardBalance_) - _calculatePlusFee(balanceBefore_, equilibrium_, rewardBalance_))
1034+ else fee_
10261035
10271036
10281037 func _validateAllocation (assetBalances_,rewardBalances_) = {
10291038 let maxIndex = size(assetBalances_)
10301039 func foldFunc (acc,index) = if ((index >= maxIndex))
10311040 then acc
10321041 else if ((0 > assetBalances_[index]))
10331042 then throw("_validateAllocation: negative assetBalances")
10341043 else if ((0 > rewardBalances_[index]))
10351044 then throw("_validateAllocation: negative rewardBalances")
10361045 else acc
10371046
10381047 let $l = INDEX_LIST
10391048 let $s = size($l)
10401049 let $acc0 = true
10411050 func $f0_1 ($a,$i) = if (($i >= $s))
10421051 then $a
10431052 else foldFunc($a, $l[$i])
10441053
10451054 func $f0_2 ($a,$i) = if (($i >= $s))
10461055 then $a
10471056 else throw("List size exceeds 10")
10481057
10491058 $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)
10501059 }
10511060
10521061
10531062 func _checkpoint (user_) = {
10541063 let userLp = _loadUserLp(user_)
10551064 let userProfits = _loadUserProfits(user_)
10561065 let sigmaFeePerLp = _loadSigmaFeePerLp()
10571066 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10581067 func foldFunc (acc,elem) = {
10591068 let index = acc._1
10601069 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10611070 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10621071 }
10631072
1064- let $t02231422387 = {
1073+ let $t02270022773 = {
10651074 let $l = ZERO_INT_LIST_11
10661075 let $s = size($l)
10671076 let $acc0 = $Tuple2(0, nil)
10681077 func $f0_1 ($a,$i) = if (($i >= $s))
10691078 then $a
10701079 else foldFunc($a, $l[$i])
10711080
10721081 func $f0_2 ($a,$i) = if (($i >= $s))
10731082 then $a
10741083 else throw("List size exceeds 11")
10751084
10761085 $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)
10771086 }
1078- let idx = $t02231422387._1
1079- let profitsUpdated = $t02231422387._2
1087+ let idx = $t02270022773._1
1088+ let profitsUpdated = $t02270022773._2
10801089 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10811090 }
10821091
10831092
10841093 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10851094 func foldFunc (acc,elem) = {
10861095 let index = acc._1
10871096 let sigmaFeePerLpUpdated = if ((index_ == index))
10881097 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10891098 else sigmaFeePerLp_[index]
10901099 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10911100 }
10921101
1093- let $t02303723116 = {
1102+ let $t02342323502 = {
10941103 let $l = ZERO_INT_LIST_11
10951104 let $s = size($l)
10961105 let $acc0 = $Tuple2(0, nil)
10971106 func $f0_1 ($a,$i) = if (($i >= $s))
10981107 then $a
10991108 else foldFunc($a, $l[$i])
11001109
11011110 func $f0_2 ($a,$i) = if (($i >= $s))
11021111 then $a
11031112 else throw("List size exceeds 11")
11041113
11051114 $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)
11061115 }
1107- let idx = $t02303723116._1
1108- let sigmaFeePerLpUpdated = $t02303723116._2
1116+ let idx = $t02342323502._1
1117+ let sigmaFeePerLpUpdated = $t02342323502._2
11091118 sigmaFeePerLpUpdated
11101119 }
11111120
11121121
11131122 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
11141123 let sigmaFeePerLp = _loadSigmaFeePerLp()
11151124 let totalLp = _loadTotalLp()
1116- let $t02333723612 = if ((totalLp == 0))
1125+ let $t02372323998 = if ((totalLp == 0))
11171126 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11181127 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1119- let lpFee = $t02333723612._1
1120- let protocolFee = $t02333723612._2
1128+ let lpFee = $t02372323998._1
1129+ let protocolFee = $t02372323998._2
11211130 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11221131 then sigmaFeePerLp
11231132 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11241133 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11251134 }
11261135
11271136
11281137 func _depositAll (amount_) = {
11291138 let storage = _loadStorage()
11301139 let lpTotalSupply = storage._3
11311140 let assets = _loadAssets()
1132- let $t02401824071 = _loadAssetWeights()
1133- let assetWeights = $t02401824071._1
1134- let sigmaWeight = $t02401824071._2
1135- let $t02407624144 = _loadAssetBalances()
1136- let prevAssetBalances = $t02407624144._1
1137- let prevAssetTotalSupply = $t02407624144._2
1138- let $t02415025380 = if ((prevAssetTotalSupply == 0))
1141+ let $t02440424457 = _loadAssetWeights()
1142+ let assetWeights = $t02440424457._1
1143+ let sigmaWeight = $t02440424457._2
1144+ let $t02446224530 = _loadAssetBalances()
1145+ let prevAssetBalances = $t02446224530._1
1146+ let prevAssetTotalSupply = $t02446224530._2
1147+ let $t02453625766 = if ((prevAssetTotalSupply == 0))
11391148 then {
11401149 func foldFunc (acc,elem) = {
11411150 let index = acc._1
11421151 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11431152 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11441153 }
11451154
1146- let $t02459224666 = {
1155+ let $t02497825052 = {
11471156 let $l = assets
11481157 let $s = size($l)
11491158 let $acc0 = $Tuple2(0, nil)
11501159 func $f0_1 ($a,$i) = if (($i >= $s))
11511160 then $a
11521161 else foldFunc($a, $l[$i])
11531162
11541163 func $f0_2 ($a,$i) = if (($i >= $s))
11551164 then $a
11561165 else throw("List size exceeds 10")
11571166
11581167 $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)
11591168 }
1160- let idx = $t02459224666._1
1161- let requiredAmountsNormalized = $t02459224666._2
1169+ let idx = $t02497825052._1
1170+ let requiredAmountsNormalized = $t02497825052._2
11621171 $Tuple2(amount_, requiredAmountsNormalized)
11631172 }
11641173 else {
11651174 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11661175 func foldFunc1 (acc,elem) = {
11671176 let index = acc._1
11681177 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11691178 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11701179 }
11711180
1172- let $t02520925284 = {
1181+ let $t02559525670 = {
11731182 let $l = assets
11741183 let $s = size($l)
11751184 let $acc0 = $Tuple2(0, nil)
11761185 func $f0_1 ($a,$i) = if (($i >= $s))
11771186 then $a
11781187 else foldFunc1($a, $l[$i])
11791188
11801189 func $f0_2 ($a,$i) = if (($i >= $s))
11811190 then $a
11821191 else throw("List size exceeds 10")
11831192
11841193 $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)
11851194 }
1186- let idx = $t02520925284._1
1187- let requiredAmountsNormalized = $t02520925284._2
1195+ let idx = $t02559525670._1
1196+ let requiredAmountsNormalized = $t02559525670._2
11881197 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11891198 }
1190- let lpTokensToMint = $t02415025380._1
1191- let requiredAmountsNormalized = $t02415025380._2
1192- let $t02538625499 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1193- let assetBalances = $t02538625499._1
1194- let assetTotalSupply = $t02538625499._2
1199+ let lpTokensToMint = $t02453625766._1
1200+ let requiredAmountsNormalized = $t02453625766._2
1201+ let $t02577225885 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1202+ let assetBalances = $t02577225885._1
1203+ let assetTotalSupply = $t02577225885._2
11951204 $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11961205 }
11971206
11981207
11991208 func _deposit (assetId_,amount_) = {
12001209 let storage = _loadStorage()
12011210 let lpTotalSupply = storage._3
12021211 let lpFeeRate = storage._4
12031212 let protocolFeeRate = storage._5
12041213 let maxAllocAmplifier = storage._6
12051214 let weightAmplifier = storage._7
12061215 let assets = _loadAssets()
1207- let $t02586525918 = _loadAssetWeights()
1208- let assetWeights = $t02586525918._1
1209- let sigmaWeight = $t02586525918._2
1210- let $t02592325991 = _loadAssetBalances()
1211- let prevAssetBalances = $t02592325991._1
1212- let prevAssetTotalSupply = $t02592325991._2
1216+ let $t02625126304 = _loadAssetWeights()
1217+ let assetWeights = $t02625126304._1
1218+ let sigmaWeight = $t02625126304._2
1219+ let $t02630926377 = _loadAssetBalances()
1220+ let prevAssetBalances = $t02630926377._1
1221+ let prevAssetTotalSupply = $t02630926377._2
12131222 let prevRewardBalances = _loadRewardBalances()
12141223 let err = if (if ((prevAssetTotalSupply == 0))
12151224 then true
12161225 else (lpTotalSupply == 0))
12171226 then throw("_deposit: empty pool")
12181227 else true
12191228 if ((err == err))
12201229 then {
12211230 let sourceAssetIndex = value(indexOf(assets, assetId_))
12221231 let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex], sigmaWeight)
12231232 let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex]
12241233 let sourceRewardBalance = prevRewardBalances[sourceAssetIndex]
1225- let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + amount_), sourceEquilibrium, sourceRewardBalance)
1226- let newRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex, sourcePlusFeeDelta)
1227- let newAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex, (amount_ + sourcePlusFeeDelta))
1234+ let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + amount_), sourceEquilibrium, sourceRewardBalance, weightAmplifier)
12281235 let lpTokensToMint = (amount_ + sourcePlusFeeDelta)
1236+ let $t02717727308 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1237+ let lpFee = $t02717727308._1
1238+ let protocolFee = $t02717727308._2
1239+ let sigmaFeePerLpUpdated = $t02717727308._3
1240+ let feeCompensation = _feeCompensation((sourceRewardBalance - sourcePlusFeeDelta), (lpFee + protocolFee))
1241+ let newRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex, (sourcePlusFeeDelta + feeCompensation))
1242+ let newAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex, (lpTokensToMint + feeCompensation))
12291243 let err1 = _validateAllocation(newAssetBalances, newRewardBalances)
12301244 if ((err1 == err1))
1231- then {
1232- let $t02708127212 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1233- let lpFee = $t02708127212._1
1234- let protocolFee = $t02708127212._2
1235- let sigmaFeePerLpUpdated = $t02708127212._3
1236- $Tuple6(lpTokensToMint, newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
1237- }
1245+ then $Tuple6((lpTokensToMint + feeCompensation), newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12381246 else throw("Strict value is not equal to itself.")
12391247 }
12401248 else throw("Strict value is not equal to itself.")
12411249 }
12421250
12431251
12441252 func _withdrawAll (amount_) = {
12451253 let storage = _loadStorage()
12461254 let lpTotalSupply = storage._3
1247- let $t02742527493 = _loadAssetBalances()
1248- let prevAssetBalances = $t02742527493._1
1249- let prevAssetTotalSupply = $t02742527493._2
1250- let $t02749827551 = _loadAssetWeights()
1251- let assetWeights = $t02749827551._1
1252- let sigmaWeight = $t02749827551._2
1255+ let $t02797628044 = _loadAssetBalances()
1256+ let prevAssetBalances = $t02797628044._1
1257+ let prevAssetTotalSupply = $t02797628044._2
1258+ let $t02804928102 = _loadAssetWeights()
1259+ let assetWeights = $t02804928102._1
1260+ let sigmaWeight = $t02804928102._2
12531261 let lpTokensToBurn = amount_
12541262 let err = _validateInt(lpTokensToBurn, 0, lpTotalSupply, "_withdrawAll: invalid lpTokensToBurn")
12551263 if ((err == err))
12561264 then {
1257- let $t02769527828 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1258- let assetBalances = $t02769527828._1
1259- let assetTotalSupply = $t02769527828._2
1260- let balancesToPay = $t02769527828._3
1265+ let $t02824628379 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1266+ let assetBalances = $t02824628379._1
1267+ let assetTotalSupply = $t02824628379._2
1268+ let balancesToPay = $t02824628379._3
12611269 $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12621270 }
12631271 else throw("Strict value is not equal to itself.")
12641272 }
12651273
12661274
12671275 func _withdraw (assetId_,lpAmount_) = {
12681276 let storage = _loadStorage()
12691277 let lpTotalSupply = storage._3
12701278 let lpFeeRate = storage._4
12711279 let protocolFeeRate = storage._5
12721280 let maxAllocAmplifier = storage._6
12731281 let weightAmplifier = storage._7
12741282 let disbalanceCoeff = storage._8
12751283 let assets = _loadAssets()
1276- let $t02822228290 = _loadAssetBalances()
1277- let prevAssetBalances = $t02822228290._1
1278- let prevAssetTotalSupply = $t02822228290._2
1279- let $t02829528348 = _loadAssetWeights()
1280- let assetWeights = $t02829528348._1
1281- let sigmaWeight = $t02829528348._2
1284+ let $t02877328841 = _loadAssetBalances()
1285+ let prevAssetBalances = $t02877328841._1
1286+ let prevAssetTotalSupply = $t02877328841._2
1287+ let $t02884628899 = _loadAssetWeights()
1288+ let assetWeights = $t02884628899._1
1289+ let sigmaWeight = $t02884628899._2
12821290 let prevRewardBalances = _loadRewardBalances()
12831291 let targetAssetIndex = value(indexOf(assets, assetId_))
12841292 let targetBalanceBefore = prevAssetBalances[targetAssetIndex]
12851293 let targetEquilibrium = fraction(prevAssetTotalSupply, assetWeights[targetAssetIndex], sigmaWeight)
12861294 let targetRewardBalance = prevRewardBalances[targetAssetIndex]
12871295 let targetMinusFeeDelta = _calculateMinusFeeDelta(targetBalanceBefore, (targetBalanceBefore - lpAmount_), targetEquilibrium, prevAssetTotalSupply, weightAmplifier, disbalanceCoeff)
12881296 let rewardBalances = _incrementBalanceByIndex(prevRewardBalances, targetAssetIndex, targetMinusFeeDelta)
12891297 let assetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, lpAmount_)
12901298 let targetAmount = (lpAmount_ - targetMinusFeeDelta)
12911299 let err = _validateAllocation(assetBalances, rewardBalances)
12921300 if ((err == err))
12931301 then {
1294- let $t02933429482 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1295- let lpFee = $t02933429482._1
1296- let protocolFee = $t02933429482._2
1297- let sigmaFeePerLpUpdated = $t02933429482._3
1302+ let $t02988530033 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1303+ let lpFee = $t02988530033._1
1304+ let protocolFee = $t02988530033._2
1305+ let sigmaFeePerLpUpdated = $t02988530033._3
12981306 $Tuple6(targetAmount, assetBalances, rewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12991307 }
13001308 else throw("Strict value is not equal to itself.")
13011309 }
13021310
13031311
13041312 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13051313 let storage = _loadStorage()
13061314 let lpAssetId = storage._1
13071315 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13081316 let lpTotalSupply = storage._3
13091317 let lpFeeRate = storage._4
13101318 let protocolFeeRate = storage._5
13111319 let maxAllocAmplifier = storage._6
13121320 let weightAmplifier = storage._7
13131321 let disbalanceCoeff = storage._8
1314- let $t03000930077 = _loadAssetBalances()
1315- let prevAssetBalances = $t03000930077._1
1316- let prevAssetTotalSupply = $t03000930077._2
1317- let $t03008230135 = _loadAssetWeights()
1318- let assetWeights = $t03008230135._1
1319- let sigmaWeight = $t03008230135._2
1322+ let $t03056030628 = _loadAssetBalances()
1323+ let prevAssetBalances = $t03056030628._1
1324+ let prevAssetTotalSupply = $t03056030628._2
1325+ let $t03063330686 = _loadAssetWeights()
1326+ let assetWeights = $t03063330686._1
1327+ let sigmaWeight = $t03063330686._2
13201328 let prevRewardBalances = _loadRewardBalances()
13211329 let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex_], sigmaWeight)
13221330 let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex_]
13231331 let sourceRewardBalance = prevRewardBalances[sourceAssetIndex_]
1324- let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + sourceAmount_), sourceEquilibrium, sourceRewardBalance)
1332+ let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + sourceAmount_), sourceEquilibrium, sourceRewardBalance, weightAmplifier)
13251333 let targetBalanceBefore = prevAssetBalances[targetAssetIndex_]
13261334 let targetEquilibrium = fraction(prevAssetTotalSupply, assetWeights[targetAssetIndex_], sigmaWeight)
13271335 let targetRewardBalance = prevRewardBalances[targetAssetIndex_]
13281336 let targetMinusFeeDelta = _calculateMinusFeeDelta(targetBalanceBefore, (targetBalanceBefore - sourceAmount_), targetEquilibrium, prevAssetTotalSupply, weightAmplifier, disbalanceCoeff)
13291337 let tempRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex_, sourcePlusFeeDelta)
13301338 let newRewardBalances = _incrementBalanceByIndex(tempRewardBalances, targetAssetIndex_, targetMinusFeeDelta)
13311339 let tempAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, (sourceAmount_ + sourcePlusFeeDelta))
13321340 let newAssetBalances = _decrementBalanceByIndex(tempAssetBalances, targetAssetIndex_, (sourceAmount_ + sourcePlusFeeDelta))
13331341 let targetAmount = ((sourceAmount_ + sourcePlusFeeDelta) - targetMinusFeeDelta)
13341342 let err = _validateAllocation(newAssetBalances, newRewardBalances)
13351343 if ((err == err))
13361344 then {
1337- let $t03171431855 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1338- let lpFee = $t03171431855._1
1339- let protocolFee = $t03171431855._2
1340- let sigmaFeePerLpUpdated = $t03171431855._3
1345+ let $t03228232423 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1346+ let lpFee = $t03228232423._1
1347+ let protocolFee = $t03228232423._2
1348+ let sigmaFeePerLpUpdated = $t03228232423._3
13411349 $Tuple6(targetAmount, newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13421350 }
13431351 else throw("Strict value is not equal to itself.")
13441352 }
13451353
13461354
13471355 @Callable(i)
13481356 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,disbalanceCoeff_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
13491357 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
13501358 then _whenNotInitialized()
13511359 else false)
13521360 then _whenMultisigSet()
13531361 else false)
13541362 then _validateAssets(assets_, "init: invalid assets")
13551363 else false)
13561364 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
13571365 else false)
13581366 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
13591367 else false)
13601368 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
13611369 else false)
13621370 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
13631371 else false)
13641372 then _validateTokenName(lpTokenName_, "init: invalid name")
13651373 else false)
13661374 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
13671375 else false)
13681376 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
13691377 else false)
13701378 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
13711379 else false)
13721380 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
13731381 else false)
13741382 then _validateInt(disbalanceCoeff_, 0, MAX_INT, "init: invalid disbalanceCoeff")
13751383 else false)
13761384 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
13771385 else false)
13781386 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
13791387 else false)
13801388 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
13811389 else false)
13821390 then _validateAddress(pauser_, "init: invalid pauser")
13831391 else false
13841392 if ((err == err))
13851393 then {
1386- let $t03374433813 = _prepareAssetWeights(assetWeights_)
1387- let assetWeights = $t03374433813._1
1388- let sigmaWeight = $t03374433813._2
1394+ let $t03431234381 = _prepareAssetWeights(assetWeights_)
1395+ let assetWeights = $t03431234381._1
1396+ let sigmaWeight = $t03431234381._2
13891397 let assetBalances = _prepareAssetBalances(assets_)
13901398 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
13911399 let lpAssetId = calculateAssetId(issue)
13921400 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, disbalanceCoeff_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
13931401 $Tuple2((((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveRewardBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
13941402 }
13951403 else throw("Strict value is not equal to itself.")
13961404 }
13971405
13981406
13991407
14001408 @Callable(i)
14011409 func depositAll (amount_) = {
14021410 let err = if (if (_whenInitialized())
14031411 then _whenNotPaused()
14041412 else false)
14051413 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14061414 else false
14071415 if ((err == err))
14081416 then {
14091417 let storage = _loadStorage()
14101418 let lpAssetId = storage._1
14111419 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14121420 let assets = _loadAssets()
1413- let $t03561235697 = _depositAll(amount_)
1414- let lpTokensToMint = $t03561235697._1
1415- let requiredAmountsNormalized = $t03561235697._2
1416- let assetBalances = $t03561235697._3
1421+ let $t03618036265 = _depositAll(amount_)
1422+ let lpTokensToMint = $t03618036265._1
1423+ let requiredAmountsNormalized = $t03618036265._2
1424+ let assetBalances = $t03618036265._3
14171425 func foldFunc (acc,elem) = {
14181426 let index = acc._1
14191427 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
14201428 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
14211429 let requiredAmountNormalized = requiredAmountsNormalized[index]
14221430 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
14231431 let err1 = if ((paymentAssetStr != elem))
14241432 then throw(("depositAll: invalid payment: index=" + toString(index)))
14251433 else if ((0 >= requiredAmount))
14261434 then throw("depositAll: too little amount required")
14271435 else unit
14281436 if ((err1 == err1))
14291437 then {
14301438 let change = if ((i.payments[index].amount > requiredAmount))
14311439 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
14321440 else if ((requiredAmount > i.payments[index].amount))
14331441 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
14341442 else nil
14351443 $Tuple2((index + 1), (acc._2 ++ change))
14361444 }
14371445 else throw("Strict value is not equal to itself.")
14381446 }
14391447
1440- let $t03684036902 = {
1448+ let $t03740837470 = {
14411449 let $l = assets
14421450 let $s = size($l)
14431451 let $acc0 = $Tuple2(0, nil)
14441452 func $f0_1 ($a,$i) = if (($i >= $s))
14451453 then $a
14461454 else foldFunc($a, $l[$i])
14471455
14481456 func $f0_2 ($a,$i) = if (($i >= $s))
14491457 then $a
14501458 else throw("List size exceeds 10")
14511459
14521460 $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)
14531461 }
1454- let idx = $t03684036902._1
1455- let changeActions = $t03684036902._2
1462+ let idx = $t03740837470._1
1463+ let changeActions = $t03740837470._2
14561464 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14571465 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
14581466 }
14591467 else throw("Strict value is not equal to itself.")
14601468 }
14611469
14621470
14631471
14641472 @Callable(i)
14651473 func deposit (minLpAmount_) = {
14661474 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
14671475 if ((err == err))
14681476 then {
14691477 let storage = _loadStorage()
14701478 let lpAssetId = storage._1
14711479 let lpAssetIdStr = _assetToStr(lpAssetId)
14721480 let lpDecimals = _getDecimals(lpAssetIdStr)
14731481 let err1 = if (if (if (if (if (_whenInitialized())
14741482 then _whenNotPaused()
14751483 else false)
14761484 then _checkWatchdog()
14771485 else false)
14781486 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
14791487 else false)
14801488 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
14811489 else false)
14821490 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
14831491 else false
14841492 if ((err1 == err1))
14851493 then {
14861494 let assetStr = _assetToStr(i.payments[0].assetId)
14871495 let assetDecimals = _getDecimals(assetStr)
14881496 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1489- let $t03834238474 = _deposit(assetStr, amountNormalized)
1490- let lpTokensToMint = $t03834238474._1
1491- let assetBalances = $t03834238474._2
1492- let rewardBalances = $t03834238474._3
1493- let lpFee = $t03834238474._4
1494- let protocolFee = $t03834238474._5
1495- let sigmaFeePerLpUpdated = $t03834238474._6
1497+ let $t03891039042 = _deposit(assetStr, amountNormalized)
1498+ let lpTokensToMint = $t03891039042._1
1499+ let assetBalances = $t03891039042._2
1500+ let rewardBalances = $t03891039042._3
1501+ let lpFee = $t03891039042._4
1502+ let protocolFee = $t03891039042._5
1503+ let sigmaFeePerLpUpdated = $t03891039042._6
14961504 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
14971505 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
14981506 if ((err2 == err2))
14991507 then {
15001508 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15011509 $Tuple2((((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveRewardBalances(rewardBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15021510 }
15031511 else throw("Strict value is not equal to itself.")
15041512 }
15051513 else throw("Strict value is not equal to itself.")
15061514 }
15071515 else throw("Strict value is not equal to itself.")
15081516 }
15091517
15101518
15111519
15121520 @Callable(i)
15131521 func withdrawAll () = {
15141522 let storage = _loadStorage()
15151523 let lpAssetId = storage._1
15161524 let lpAssetIdStr = toBase58String(lpAssetId)
15171525 let lpDecimals = _getDecimals(lpAssetIdStr)
15181526 let assets = _loadAssets()
15191527 let err = if (if (if (_whenInitialized())
15201528 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
15211529 else false)
15221530 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
15231531 else false)
15241532 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
15251533 else false
15261534 if ((err == err))
15271535 then {
1528- let $t03998240069 = _withdrawAll(i.payments[0].amount)
1529- let lpTokensToBurn = $t03998240069._1
1530- let balancesToPay = $t03998240069._2
1531- let assetBalances = $t03998240069._3
1536+ let $t04055040637 = _withdrawAll(i.payments[0].amount)
1537+ let lpTokensToBurn = $t04055040637._1
1538+ let balancesToPay = $t04055040637._2
1539+ let assetBalances = $t04055040637._3
15321540 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
15331541 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15341542 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
15351543 }
15361544 else throw("Strict value is not equal to itself.")
15371545 }
15381546
15391547
15401548
15411549 @Callable(i)
15421550 func withdraw (assetId_,minAmount_) = {
15431551 let storage = _loadStorage()
15441552 let lpAssetId = storage._1
15451553 let lpAssetIdStr = toBase58String(lpAssetId)
15461554 let lpDecimals = _getDecimals(lpAssetIdStr)
15471555 let assets = _loadAssets()
15481556 let err = if (if (if (if (if (if (if (_whenInitialized())
15491557 then _whenNotPaused()
15501558 else false)
15511559 then _checkWatchdog()
15521560 else false)
15531561 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
15541562 else false)
15551563 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
15561564 else false)
15571565 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
15581566 else false)
15591567 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
15601568 else false)
15611569 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
15621570 else false
15631571 if ((err == err))
15641572 then {
1565- let $t04142341578 = _withdraw(assetId_, i.payments[0].amount)
1566- let targetAmountNormalized = $t04142341578._1
1567- let finalAssetBalances = $t04142341578._2
1568- let finalRewardBalances = $t04142341578._3
1569- let lpFee = $t04142341578._4
1570- let protocolFee = $t04142341578._5
1571- let sigmaFeePerLpUpdated = $t04142341578._6
1573+ let $t04199142146 = _withdraw(assetId_, i.payments[0].amount)
1574+ let targetAmountNormalized = $t04199142146._1
1575+ let finalAssetBalances = $t04199142146._2
1576+ let finalRewardBalances = $t04199142146._3
1577+ let lpFee = $t04199142146._4
1578+ let protocolFee = $t04199142146._5
1579+ let sigmaFeePerLpUpdated = $t04199142146._6
15721580 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
15731581 let targetDecimals = _getDecimals(assetId_)
15741582 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
15751583 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
15761584 if ((err1 == err1))
15771585 then {
15781586 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - i.payments[0].amount), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15791587 $Tuple2((((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveRewardBalances(finalRewardBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15801588 }
15811589 else throw("Strict value is not equal to itself.")
15821590 }
15831591 else throw("Strict value is not equal to itself.")
15841592 }
15851593
15861594
15871595
15881596 @Callable(i)
15891597 func swap (targetAssetId_,minAmount_) = {
15901598 let storage = _loadStorage()
15911599 let lpAssetId = storage._1
15921600 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15931601 let assets = _loadAssets()
15941602 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
15951603 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
15961604 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
15971605 if ((sourceAssetIndex == sourceAssetIndex))
15981606 then {
15991607 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16001608 if ((targetAssetIndex == targetAssetIndex))
16011609 then {
16021610 let err = if (if (if (if (if (if (_whenInitialized())
16031611 then _whenNotPaused()
16041612 else false)
16051613 then _checkWatchdog()
16061614 else false)
16071615 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16081616 else false)
16091617 then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
16101618 else false)
16111619 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16121620 else false)
16131621 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16141622 else false
16151623 if ((err == err))
16161624 then {
1617- let $t04374343922 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1618- let targetAmountNormalized = $t04374343922._1
1619- let finalAssetBalances = $t04374343922._2
1620- let finalRewardBalances = $t04374343922._3
1621- let lpFee = $t04374343922._4
1622- let protocolFee = $t04374343922._5
1623- let sigmaFeePerLpUpdated = $t04374343922._6
1625+ let $t04431144490 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1626+ let targetAmountNormalized = $t04431144490._1
1627+ let finalAssetBalances = $t04431144490._2
1628+ let finalRewardBalances = $t04431144490._3
1629+ let lpFee = $t04431144490._4
1630+ let protocolFee = $t04431144490._5
1631+ let sigmaFeePerLpUpdated = $t04431144490._6
16241632 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16251633 let targetDecimals = _getDecimals(targetAssetId_)
16261634 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16271635 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
16281636 if ((err1 == err1))
16291637 then $Tuple2(((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveRewardBalances(finalRewardBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16301638 else throw("Strict value is not equal to itself.")
16311639 }
16321640 else throw("Strict value is not equal to itself.")
16331641 }
16341642 else throw("Strict value is not equal to itself.")
16351643 }
16361644 else throw("Strict value is not equal to itself.")
16371645 }
16381646
16391647
16401648
16411649 @Callable(i)
16421650 func getDepositAll (lpAmount_) = {
16431651 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
16441652 if ((err == err))
16451653 then {
1646- let $t04509445181 = _depositAll(lpAmount_)
1647- let lpTokensToMint = $t04509445181._1
1648- let requiredAmountsNormalized = $t04509445181._2
1649- let assetBalances = $t04509445181._3
1654+ let $t04566245749 = _depositAll(lpAmount_)
1655+ let lpTokensToMint = $t04566245749._1
1656+ let requiredAmountsNormalized = $t04566245749._2
1657+ let assetBalances = $t04566245749._3
16501658 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
16511659 }
16521660 else throw("Strict value is not equal to itself.")
16531661 }
16541662
16551663
16561664
16571665 @Callable(i)
16581666 func getDeposit (assetId_,amount_) = {
16591667 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
16601668 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
16611669 else false
16621670 if ((err == err))
16631671 then {
16641672 let storage = _loadStorage()
16651673 let lpAssetId = storage._1
16661674 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16671675 let assetDecimals = _getDecimals(assetId_)
16681676 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1669- let $t04594046072 = _deposit(assetId_, amountNormalized)
1670- let lpTokensToMint = $t04594046072._1
1671- let assetBalances = $t04594046072._2
1672- let rewardBalances = $t04594046072._3
1673- let lpFee = $t04594046072._4
1674- let protocolFee = $t04594046072._5
1675- let sigmaFeePerLpUpdated = $t04594046072._6
1677+ let $t04650846640 = _deposit(assetId_, amountNormalized)
1678+ let lpTokensToMint = $t04650846640._1
1679+ let assetBalances = $t04650846640._2
1680+ let rewardBalances = $t04650846640._3
1681+ let lpFee = $t04650846640._4
1682+ let protocolFee = $t04650846640._5
1683+ let sigmaFeePerLpUpdated = $t04650846640._6
16761684 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
16771685 $Tuple2(nil, lpTokensToSend)
16781686 }
16791687 else throw("Strict value is not equal to itself.")
16801688 }
16811689
16821690
16831691
16841692 @Callable(i)
16851693 func getWithdrawAll (lpAmount_) = {
16861694 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
16871695 if ((err == err))
16881696 then {
1689- let $t04651146587 = _withdrawAll(lpAmount_)
1690- let lpTokensToBurn = $t04651146587._1
1691- let balancesToGet = $t04651146587._2
1692- let assetBalances = $t04651146587._3
1697+ let $t04707947155 = _withdrawAll(lpAmount_)
1698+ let lpTokensToBurn = $t04707947155._1
1699+ let balancesToGet = $t04707947155._2
1700+ let assetBalances = $t04707947155._3
16931701 $Tuple2(nil, balancesToGet)
16941702 }
16951703 else throw("Strict value is not equal to itself.")
16961704 }
16971705
16981706
16991707
17001708 @Callable(i)
17011709 func getWithdraw (assetId_,amount_) = {
17021710 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17031711 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17041712 else false
17051713 if ((err == err))
17061714 then {
17071715 let storage = _loadStorage()
17081716 let lpAssetId = storage._1
17091717 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1710- let $t04723847370 = _withdraw(assetId_, amount_)
1711- let targetAmountNormalized = $t04723847370._1
1712- let assetBalances = $t04723847370._2
1713- let rewardBalances = $t04723847370._3
1714- let lpFee = $t04723847370._4
1715- let protocolFee = $t04723847370._5
1716- let sigmaFeePerLpUpdated = $t04723847370._6
1718+ let $t04780647938 = _withdraw(assetId_, amount_)
1719+ let targetAmountNormalized = $t04780647938._1
1720+ let assetBalances = $t04780647938._2
1721+ let rewardBalances = $t04780647938._3
1722+ let lpFee = $t04780647938._4
1723+ let protocolFee = $t04780647938._5
1724+ let sigmaFeePerLpUpdated = $t04780647938._6
17171725 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17181726 let targetDecimals = _getDecimals(assetId_)
17191727 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17201728 $Tuple2(nil, finalAmount)
17211729 }
17221730 else throw("Strict value is not equal to itself.")
17231731 }
17241732
17251733
17261734
17271735 @Callable(i)
17281736 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
17291737 let storage = _loadStorage()
17301738 let lpAssetId = storage._1
17311739 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17321740 let assets = _loadAssets()
17331741 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
17341742 if ((sourceAssetIndex == sourceAssetIndex))
17351743 then {
17361744 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
17371745 if ((targetAssetIndex == targetAssetIndex))
17381746 then {
17391747 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
17401748 let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
17411749 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
17421750 else false
17431751 if ((err == err))
17441752 then {
1745- let $t04878048959 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1746- let targetAmountNormalized = $t04878048959._1
1747- let finalAssetBalances = $t04878048959._2
1748- let finalRewardBalances = $t04878048959._3
1749- let lpFee = $t04878048959._4
1750- let protocolFee = $t04878048959._5
1751- let sigmaFeePerLpUpdated = $t04878048959._6
1753+ let $t04934849527 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1754+ let targetAmountNormalized = $t04934849527._1
1755+ let finalAssetBalances = $t04934849527._2
1756+ let finalRewardBalances = $t04934849527._3
1757+ let lpFee = $t04934849527._4
1758+ let protocolFee = $t04934849527._5
1759+ let sigmaFeePerLpUpdated = $t04934849527._6
17521760 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17531761 let targetDecimals = _getDecimals(targetAssetId_)
17541762 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17551763 $Tuple2(nil, finalAmount)
17561764 }
17571765 else throw("Strict value is not equal to itself.")
17581766 }
17591767 else throw("Strict value is not equal to itself.")
17601768 }
17611769 else throw("Strict value is not equal to itself.")
17621770 }
17631771
17641772
17651773
17661774 @Callable(i)
17671775 func getClaim (user_) = {
17681776 let user = if ((size(user_) > 0))
17691777 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
17701778 else i.caller
1771- let $t04960149657 = _checkpoint(user)
1772- let checkpointActions = $t04960149657._1
1773- let userProfits = $t04960149657._2
1779+ let $t05016950225 = _checkpoint(user)
1780+ let checkpointActions = $t05016950225._1
1781+ let userProfits = $t05016950225._2
17741782 $Tuple2(nil, userProfits)
17751783 }
17761784
17771785
17781786
17791787 @Callable(i)
17801788 func getAssetId () = {
17811789 let storage = _loadStorage()
17821790 let lpAssetId = storage._1
17831791 $Tuple2(nil, toBase58String(lpAssetId))
17841792 }
17851793
17861794
17871795
17881796 @Callable(i)
17891797 func getDecimals () = {
17901798 let storage = _loadStorage()
17911799 let lpAssetId = storage._1
17921800 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17931801 $Tuple2(nil, lpDecimals)
17941802 }
17951803
17961804
17971805
17981806 @Callable(i)
17991807 func checkpoint (user_) = {
18001808 let err = if (_whenInitialized())
18011809 then _whenNotPaused()
18021810 else false
18031811 if ((err == err))
18041812 then {
18051813 let user = if ((size(user_) > 0))
18061814 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
18071815 else i.caller
18081816 _checkpoint(user)
18091817 }
18101818 else throw("Strict value is not equal to itself.")
18111819 }
18121820
18131821
18141822
18151823 @Callable(i)
18161824 func stake () = {
18171825 let err = if (_whenInitialized())
18181826 then _whenNotPaused()
18191827 else false
18201828 if ((err == err))
18211829 then {
18221830 let storage = _loadStorage()
18231831 let lpAssetIdStr = _assetToStr(storage._1)
18241832 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
18251833 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
18261834 else false)
18271835 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
18281836 else false
18291837 if ((err1 == err1))
18301838 then {
1831- let $t05086950929 = _checkpoint(i.caller)
1832- let checkpointActions = $t05086950929._1
1833- let userProfits = $t05086950929._2
1839+ let $t05143751497 = _checkpoint(i.caller)
1840+ let checkpointActions = $t05143751497._1
1841+ let userProfits = $t05143751497._2
18341842 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
18351843 }
18361844 else throw("Strict value is not equal to itself.")
18371845 }
18381846 else throw("Strict value is not equal to itself.")
18391847 }
18401848
18411849
18421850
18431851 @Callable(i)
18441852 func unstake (amount_) = {
18451853 let err = if (_whenInitialized())
18461854 then _whenNotPaused()
18471855 else false
18481856 if ((err == err))
18491857 then {
18501858 let storage = _loadStorage()
18511859 let lpAssetId = storage._1
18521860 let userLp = _loadUserLp(i.caller)
18531861 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
18541862 if ((err1 == err1))
18551863 then {
1856- let $t05144051500 = _checkpoint(i.caller)
1857- let checkpointActions = $t05144051500._1
1858- let userProfits = $t05144051500._2
1864+ let $t05200852068 = _checkpoint(i.caller)
1865+ let checkpointActions = $t05200852068._1
1866+ let userProfits = $t05200852068._2
18591867 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
18601868 }
18611869 else throw("Strict value is not equal to itself.")
18621870 }
18631871 else throw("Strict value is not equal to itself.")
18641872 }
18651873
18661874
18671875
18681876 @Callable(i)
18691877 func claim (user_) = {
18701878 let err = if (_whenInitialized())
18711879 then _whenNotPaused()
18721880 else false
18731881 if ((err == err))
18741882 then {
18751883 let user = if ((size(user_) > 0))
18761884 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
18771885 else i.caller
18781886 let storage = _loadStorage()
18791887 let lpAssetId = storage._1
18801888 let lpAssetIdStr = _assetToStr(lpAssetId)
18811889 let assets = [lpAssetIdStr, _loadAssets()]
18821890 let maxIndex = (size(assets) - 1)
1883- let $t05218852244 = _checkpoint(user)
1884- let checkpointActions = $t05218852244._1
1885- let userProfits = $t05218852244._2
1891+ let $t05275652812 = _checkpoint(user)
1892+ let checkpointActions = $t05275652812._1
1893+ let userProfits = $t05275652812._2
18861894 func foldFunc (acc,profit) = {
18871895 let index = acc._1
18881896 if (if ((maxIndex >= index))
18891897 then (profit > 0)
18901898 else false)
18911899 then {
18921900 let asset = assets[index]
18931901 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
18941902 }
18951903 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
18961904 }
18971905
1898- let $t05262252713 = {
1906+ let $t05319053281 = {
18991907 let $l = userProfits
19001908 let $s = size($l)
19011909 let $acc0 = $Tuple3(0, nil, nil)
19021910 func $f0_1 ($a,$i) = if (($i >= $s))
19031911 then $a
19041912 else foldFunc($a, $l[$i])
19051913
19061914 func $f0_2 ($a,$i) = if (($i >= $s))
19071915 then $a
19081916 else throw("List size exceeds 11")
19091917
19101918 $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)
19111919 }
1912- let idx = $t05262252713._1
1913- let userProfitsUpdated = $t05262252713._2
1914- let profitActions = $t05262252713._3
1920+ let idx = $t05319053281._1
1921+ let userProfitsUpdated = $t05319053281._2
1922+ let profitActions = $t05319053281._3
19151923 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19161924 }
19171925 else throw("Strict value is not equal to itself.")
19181926 }
19191927
19201928
19211929
19221930 @Callable(i)
19231931 func claimAll (user_) = {
19241932 let err = if (_whenInitialized())
19251933 then _whenNotPaused()
19261934 else false
19271935 if ((err == err))
19281936 then {
19291937 let user = if ((size(user_) > 0))
19301938 then valueOrErrorMessage(addressFromString(user_), "claimAll: invalid user")
19311939 else i.caller
19321940 let storage = _loadStorage()
19331941 let lpAssetId = storage._1
19341942 let lpAssetIdStr = _assetToStr(lpAssetId)
19351943 let assets = [lpAssetIdStr, _loadAssets()]
19361944 let maxIndex = (size(assets) - 1)
1937- let $t05334353403 = _loadAssetBalances()
1938- let assetBalances = $t05334353403._1
1939- let assetTotalSupply = $t05334353403._2
1940- let $t05340953465 = _checkpoint(user)
1941- let checkpointActions = $t05340953465._1
1942- let userProfits = $t05340953465._2
1945+ let $t05391153971 = _loadAssetBalances()
1946+ let assetBalances = $t05391153971._1
1947+ let assetTotalSupply = $t05391153971._2
1948+ let $t05397754033 = _checkpoint(user)
1949+ let checkpointActions = $t05397754033._1
1950+ let userProfits = $t05397754033._2
19431951 func foldFunc (acc,profit) = {
19441952 let index = acc._1
19451953 if ((index == 0))
19461954 then $Tuple5((index + 1), (acc._2 :+ 0), acc._3, acc._4, (acc._5 + profit))
19471955 else if (if ((index > 0))
19481956 then (maxIndex >= index)
19491957 else false)
19501958 then {
19511959 let assetIndex = (index - 1)
19521960 let balance = assetBalances[assetIndex]
19531961 $Tuple5((index + 1), (acc._2 :+ 0), (acc._3 :+ (balance + profit)), (acc._4 + profit), acc._5)
19541962 }
19551963 else $Tuple5((index + 1), (acc._2 :+ 0), acc._3, acc._4, acc._5)
19561964 }
19571965
1958- let $t05400154137 = {
1966+ let $t05456954705 = {
19591967 let $l = userProfits
19601968 let $s = size($l)
19611969 let $acc0 = $Tuple5(0, nil, nil, 0, 0)
19621970 func $f0_1 ($a,$i) = if (($i >= $s))
19631971 then $a
19641972 else foldFunc($a, $l[$i])
19651973
19661974 func $f0_2 ($a,$i) = if (($i >= $s))
19671975 then $a
19681976 else throw("List size exceeds 11")
19691977
19701978 $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)
19711979 }
1972- let idx = $t05400154137._1
1973- let userProfitsUpdated = $t05400154137._2
1974- let assetBalancesUpdated = $t05400154137._3
1975- let lpTokensToMint = $t05400154137._4
1976- let lpTokensProfit = $t05400154137._5
1980+ let idx = $t05456954705._1
1981+ let userProfitsUpdated = $t05456954705._2
1982+ let assetBalancesUpdated = $t05456954705._3
1983+ let lpTokensToMint = $t05456954705._4
1984+ let lpTokensProfit = $t05456954705._5
19771985 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
19781986 $Tuple2((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, (lpTokensToMint + lpTokensProfit), lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalancesUpdated)) ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19791987 }
19801988 else throw("Strict value is not equal to itself.")
19811989 }
19821990
19831991
19841992
19851993 @Callable(i)
19861994 func updatePoolFees (lpFeeRate_,protocolFeeRate_) = {
19871995 let err = if (if (if (_onlyThisContract(i.caller))
19881996 then _whenInitialized()
19891997 else false)
19901998 then _validateInt(lpFeeRate_, 0, MAX_FEE, "updatePoolFees: invalid lp fee")
19911999 else false)
19922000 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "updatePoolFees: invalid protocol fee")
19932001 else false
19942002 if ((err == err))
19952003 then {
19962004 let storage = _loadStorage()
19972005 let storageUpdated = $Tuple10(storage._1, storage._2, storage._3, lpFeeRate_, protocolFeeRate_, storage._6, storage._7, storage._8, storage._9, storage._10)
19982006 $Tuple2(_saveStorage(storageUpdated), unit)
19992007 }
20002008 else throw("Strict value is not equal to itself.")
20012009 }
20022010
20032011
20042012
20052013 @Callable(i)
20062014 func updatePoolParams (maxAllocationAmplifier_,weightAmplifier_,disbalanceCoeff_,feeMaxRate_) = {
20072015 let err = if (if (if (if (if (_onlyThisContract(i.caller))
20082016 then _whenInitialized()
20092017 else false)
20102018 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "updatePoolParams: invalid maxAllocationAmplifier")
20112019 else false)
20122020 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "updatePoolParams: invalid weightAmplifier")
20132021 else false)
20142022 then _validateInt(disbalanceCoeff_, 0, MAX_INT, "updatePoolParams: invalid disbalanceCoeff")
20152023 else false)
20162024 then _validateInt(feeMaxRate_, 0, MAX_INT, "updatePoolParams: invalid feeMaxRate")
20172025 else false
20182026 if ((err == err))
20192027 then {
20202028 let storage = _loadStorage()
20212029 let storageUpdated = $Tuple10(storage._1, storage._2, storage._3, storage._4, storage._5, maxAllocationAmplifier_, weightAmplifier_, disbalanceCoeff_, feeMaxRate_, storage._10)
20222030 $Tuple2(_saveStorage(storageUpdated), unit)
20232031 }
20242032 else throw("Strict value is not equal to itself.")
20252033 }
20262034
20272035
20282036
20292037 @Callable(i)
20302038 func migrateBalances () = {
20312039 let err = if (_onlyThisContract(i.caller))
20322040 then _whenInitialized()
20332041 else false
20342042 if ((err == err))
20352043 then {
20362044 let storage = _loadStorage()
20372045 let lpTokenSupply = storage._3
2038- let $t05667256732 = _loadAssetBalances()
2039- let assetBalances = $t05667256732._1
2040- let assetTotalSupply = $t05667256732._2
2046+ let $t05724057300 = _loadAssetBalances()
2047+ let assetBalances = $t05724057300._1
2048+ let assetTotalSupply = $t05724057300._2
20412049 let balancesDiff = max([(assetTotalSupply - lpTokenSupply), 0])
20422050 let storageUpdated = $Tuple10(storage._1, storage._2, (lpTokenSupply + balancesDiff), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
20432051 $Tuple2(_saveStorage(storageUpdated), unit)
20442052 }
20452053 else throw("Strict value is not equal to itself.")
20462054 }
20472055
20482056
20492057
20502058 @Callable(i)
20512059 func pause () = {
20522060 let err = if (if (_onlyPauser(i.caller))
20532061 then _whenInitialized()
20542062 else false)
20552063 then _whenNotPaused()
20562064 else false
20572065 if ((err == err))
20582066 then $Tuple2(_savePause(true), unit)
20592067 else throw("Strict value is not equal to itself.")
20602068 }
20612069
20622070
20632071
20642072 @Callable(i)
20652073 func unpause () = {
20662074 let err = if (if (_onlyThisContract(i.caller))
20672075 then _whenInitialized()
20682076 else false)
20692077 then _whenPaused()
20702078 else false
20712079 if ((err == err))
20722080 then $Tuple2(_savePause(false), unit)
20732081 else throw("Strict value is not equal to itself.")
20742082 }
20752083
20762084
20772085
20782086 @Callable(i)
20792087 func updatePauser (pauser_) = {
20802088 let err = if (if (_onlyThisContract(i.caller))
20812089 then _whenInitialized()
20822090 else false)
20832091 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20842092 else false
20852093 if ((err == err))
20862094 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20872095 else throw("Strict value is not equal to itself.")
20882096 }
20892097
20902098
20912099
20922100 @Callable(i)
20932101 func updateWatchdog (watchdog_,offset_) = {
20942102 let err = if (if (if (_onlyThisContract(i.caller))
20952103 then _whenInitialized()
20962104 else false)
20972105 then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
20982106 else false)
20992107 then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
21002108 else false
21012109 if ((err == err))
21022110 then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
21032111 else throw("Strict value is not equal to itself.")
21042112 }
21052113
21062114
21072115
21082116 @Callable(i)
21092117 func setMultisig (multisig_) = {
21102118 let err = if (_onlyThisContract(i.caller))
21112119 then _validateAddress(multisig_, "setMultisig: invalid multisig")
21122120 else false
21132121 if ((err == err))
21142122 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
21152123 else throw("Strict value is not equal to itself.")
21162124 }
21172125
21182126
21192127 @Verifier(tx)
21202128 func verify () = match getString(KEY_MULTISIG) {
21212129 case multisig: String =>
21222130 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
21232131 case _ =>
21242132 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
21252133 }
21262134

github/deemru/w8io/3ef1775 
195.22 ms