tx · FGfMsF98AzMGR7w9RnHppLWc2C38hfUas5iRDyuHmBmR

3PJ3djSxvFgCkCFoMyX8tK5LJnVvpNtHgzj:  -0.05700000 Waves

2023.08.07 19:19 [3766023] smart account 3PJ3djSxvFgCkCFoMyX8tK5LJnVvpNtHgzj > SELF 0.00000000 Waves

{ "type": 13, "id": "FGfMsF98AzMGR7w9RnHppLWc2C38hfUas5iRDyuHmBmR", "fee": 5700000, "feeAssetId": null, "timestamp": 1691425114907, "version": 2, "chainId": 87, "sender": "3PJ3djSxvFgCkCFoMyX8tK5LJnVvpNtHgzj", "senderPublicKey": "33jcM1HN2VN7dR769BfTMqHqkERfFveK2jVdtSTHBgd2", "proofs": [ "31LBMFtfjWb8aM7T7p8XfFbRhHFNaQSWyCtameuDYqj8KjeTSeqK5wUctoqFXEkRMCTjhc8FVogSQsG2V4DgbCio" ], "script": "base64:BgJvCAISDwoNGBgBAQgIAQEBAQEIARIDCgEBEgMKAQESABIECgIIARIECgIIARIDCgEBEgQKAggBEgMKAQESBAoCCAESBQoDCAgBEgMKAQgSABIDCgEIEgASAwoBARIECgIIGBIAEgASAwoBCBIDCgEIcwADU0VQAgJfXwAFV0FWRVMCBXdhdmVzAAdNQVhfSU5UAP//////////fwAHTUFYX0ZFRQDAhD0ADU1BWF9BTVBMSUZJRVIAwIQ9ABRNQVhfV0VJR0hUX0FNUExJRklFUgDAhD0ACk1BWF9XRUlHSFQAwIQ9ABRTTElQUEFHRV9SQVRFX0ZBQ1RPUgDAhD0AD0ZFRV9SQVRFX0ZBQ1RPUgDAhD0AC1JBVEVfRkFDVE9SAMCEPQAOUEVSQ0VOVF9GQUNUT1IJALYCAQCAoJSljR0AEFpFUk9fSU5UX0xJU1RfMTAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAABQNuaWwAEFpFUk9fSU5UX0xJU1RfMTEJAM0IAgUQWkVST19JTlRfTElTVF8xMAAAAAtaRVJPX0JJR0lOVAkAtgIBAAAAE1pFUk9fQklHSU5UX0xJU1RfMTEJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQJAMwIAgULWkVST19CSUdJTlQFA25pbAAMSU5UX0RFQ0lNQUxTAAgAD0JJR0lOVF9ERUNJTUFMUwASAAdMSVNUXzY0CQC9CQICfzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzACAV8ADEtFWV9NVUxUSVNJRwIITVVMVElTSUcACktFWV9TVEFUVVMCBlNUQVRVUwAKS0VZX1BBVVNFRAIGUEFVU0VEAApLRVlfUEFVU0VSAgZQQVVTRVIAC0tFWV9TVE9SQUdFAgdTVE9SQUdFAApLRVlfQVNTRVRTAgZBU1NFVFMAEktFWV9BU1NFVF9CQUxBTkNFUwIOQVNTRVRfQkFMQU5DRVMAEUtFWV9BU1NFVF9XRUlHSFRTAg1BU1NFVF9XRUlHSFRTAApLRVlfTFBfRkVFAgZMUF9GRUUAEEtFWV9QUk9UT0NPTF9GRUUCDFBST1RPQ09MX0ZFRQANS0VZX1BSRUNJU0lPTgIJUFJFQ0lTSU9OABRLRVlfU0lHTUFfRkVFX1BFUl9MUAIQU0lHTUFfRkVFX1BFUl9MUAAZS0VZX1VTRVJfU0lHTUFfRkVFX1BFUl9MUAIVVVNFUl9TSUdNQV9GRUVfUEVSX0xQAAtLRVlfVVNFUl9MUAIHVVNFUl9MUAAMS0VZX1RPVEFMX0xQAghUT1RBTF9MUAAQS0VZX1VTRVJfUFJPRklUUwIMVVNFUl9QUk9GSVRTARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ1fdmFsaWRhdGVCb29sAwR2YWxfB3RhcmdldF8EZXJyXwMJAQIhPQIFBHZhbF8FB3RhcmdldF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBXZhbDFfBXZhbDJfBGVycl8DCQAAAgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBEF92YWxpZGF0ZUludExpc3QEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQHJG1hdGNoMAkAtgkBBQRlbGVtAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAMFA2FjYwkBDF92YWxpZGF0ZUludAQFAWEFDmxvd2VyQm91bmRhcnlfBQ51cHBlckJvdW5kYXJ5XwUEZXJyXwcJAAIBBQRlcnJfCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBD192YWxpZGF0ZUFzc2V0cwIHYXNzZXRzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwUDYWNjCQEOX3ZhbGlkYXRlQXNzZXQCBQRlbGVtBQRlcnJfBwoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJfdmFsaWRhdGVJbnRFcXVhbHMDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgESX3ZhbGlkYXRlVG9rZW5OYW1lAgR2YWxfBGVycl8DAwkAZgIABAkAsQIBBQR2YWxfBgkAZgIJALECAQUEdmFsXwAQCQACAQUEZXJyXwYBE192YWxpZGF0ZVRva2VuRGVzY3ICBHZhbF8EZXJyXwMJAGYCCQCxAgEFBHZhbF8A6AcJAAIBBQRlcnJfBgERX3ZhbGlkYXRlRGVjaW1hbHMCBHZhbF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZgIFBHZhbF8ACAkAAgEFBGVycl8GARBfdmFsaWRhdGVQYXltZW50BAhwYXltZW50Xwhhc3NldElkXw9yZXF1aXJlZEFtb3VudF8EZXJyXwQHJG1hdGNoMAgFCHBheW1lbnRfB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAMJAQIhPQIFCGFzc2V0SWRfCQDYBAEFAWEJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQDCQBmAgUPcmVxdWlyZWRBbW91bnRfCAUIcGF5bWVudF8GYW1vdW50CQACAQkArAICBQRlcnJfAgg6IGFtb3VudAYJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFbGlzdF8EdmFsXwRlcnJfAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUFbGlzdF8FBHZhbF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DAwkAAAIFBmFzc2V0XwUFV0FWRVMGCQAAAgUGYXNzZXRfAgAFBHVuaXQJANkEAQUGYXNzZXRfAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkU3RvcmFnZQAEByRtYXRjaDAJAKIIAQULS0VZX1NUT1JBR0UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUDU0VQCQCcCgoJANkEAQkAkQMCBQZzdHJ1Y3QAAAkAAAIJAJEDAgUGc3RydWN0AAECATEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QACQkAnAoKAQAHAAAAAAAAAAAAAAAAAAAJAQdBZGRyZXNzAQEAAQxfc2F2ZVN0b3JhZ2UBCHN0b3JhZ2VfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9TVE9SQUdFCQC5CQIJAMwIAgkA2AQBCAUIc3RvcmFnZV8CXzEJAMwIAgMIBQhzdG9yYWdlXwJfMgIBMQIBMAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfMwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNQkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNgkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOQkAzAgCCQClCAEIBQhzdG9yYWdlXwNfMTAFA25pbAUDU0VQBQNuaWwBC19sb2FkQXNzZXRzAAQHJG1hdGNoMAkAoggBBQpLRVlfQVNTRVRTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAkAvQkCBQFhBQNTRVAFA25pbAUDbmlsAQtfc2F2ZUFzc2V0cwEHYXNzZXRzXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfQVNTRVRTCQC7CQIFB2Fzc2V0c18FA1NFUAUDbmlsARJfbG9hZEFzc2V0QmFsYW5jZXMACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAdiYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEFBGVsZW0JAJQKAgkAzQgCCAUDYWNjAl8xBQdiYWxhbmNlCQBkAggFA2FjYwJfMgUHYmFsYW5jZQQHJG1hdGNoMAkAoggBBRJLRVlfQVNTRVRfQkFMQU5DRVMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACgACJGwJAL0JAgUBYQUDU0VQCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEw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AgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAMJAQIhPQIIBQdzdG9yYWdlAl8xAQAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQAAAggFB3N0b3JhZ2UCXzEBAAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEMX2dldERlY2ltYWxzAQhhc3NldElkXwQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwCAUBYQhkZWNpbWFscwkAAgEJAKwCAgIXX2dldERlY2ltYWxzOiBubyBhc3NldD0FCGFzc2V0SWRfARJfbm9ybWFsaXplRGVjaW1hbHMEB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwZyb3VuZF8DCQBnAgUPc291cmNlRGVjaW1hbHNfBQ90YXJn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CgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQGYW1vdW50CQCRAwIFCGFtb3VudHNfBQVpbmRleAQKbmV3QmFsYW5jZQkAZAIFBGVsZW0FBmFtb3VudAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQpuZXdCYWxhbmNlCQBkAggFA2FjYwJfMwUKbmV3QmFsYW5jZQQGcmVzdWx0CgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAggFBnJlc3VsdAJfMggFBnJlc3VsdAJfMwEcX2luY3JlbWVudEJhbGFuY2VzQnlQYXltZW50cwUJYmFsYW5jZXNfCXBheW1lbnRzXwdhc3NldHNfCWRlY2ltYWxzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQHcGF5bWVudAkAkQMCBQlwYXltZW50c18FBWluZGV4BA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEIBQdwYXltZW50B2Fzc2V0SWQEA2VycgMJAQIhPQIFD3BheW1lbnRBc3NldFN0cgkAkQMCBQdhc3NldHNfBQVpbmRleAkAAgEJAKwCAgkArAICBQRlcnJfAgg6IGluZGV4PQkApAMBBQVpbmRleAUEdW5pdAMJAAACBQNlcnIFA2VycgQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQKbmV3QmFsYW5jZQkAZAIFBGVsZW0JARJfbm9ybWFsaXplRGVjaW1hbHME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XzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBEl9jYWxjdWxhdGVNaWNyb0ZlZQUIYmFsYW5jZV8MZXF1aWxpYnJpdW1fEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwMJAGYCBQxlcXVpbGlicml1bV8FCGJhbGFuY2VfBAl0aHJlc2hvbGQJAGsDBQxlcXVpbGlicml1bV8JAGUCBRRNQVhfV0VJR0hUX0FNUExJRklFUgUQd2VpZ2h0QW1wbGlmaWVyXwUUTUFYX1dFSUdIVF9BTVBMSUZJRVIDCQBmAgUJdGhyZXNob2xkBQhiYWxhbmNlXwQMbWF4RGV2aWF0aW9uCQBlAgUJdGhyZXNob2xkBQhiYWxhbmNlXwQHZmVlUmF0ZQkAawMJAGsDBQxtYXhEZXZpYXRpb24FDXNsaXBwYWdlUmF0ZV8FFFNMSVBQQUdFX1JBVEVfRkFDVE9SBQ9GRUVfUkFURV9GQUNUT1IFDGVxdWlsaWJyaXVtXwMJAGYCBQdmZWVSYXRlBQtmZWVNYXhSYXRlXwkAawMFDG1heERldmlhdGlvbgULZmVlTWF4UmF0ZV8FD0ZFRV9SQVRFX0ZBQ1RPUgkAawMFDG1heERldmlhdGlvbgUHZmVlUmF0ZQUPRkVFX1JBVEVfRkFDVE9SAAAECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZAIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQhiYWxhbmNlXwUJdGhyZXNob2xkBAxtYXhEZXZpYXRpb24JAGUCBQhiYWxhbmNlXwUJdGhyZXNob2xkBAdmZWVSYXRlCQBrAwkAawMFDG1heERldmlhdGlvbgUNc2xpcHBhZ2VSYXRlXwUUU0xJUFBBR0VfUkFURV9GQUNUT1IFD0ZFRV9SQVRFX0ZBQ1RPUgUMZXF1aWxpYnJpdW1fAwkAZgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQBrAwUMbWF4RGV2aWF0aW9uBQtmZWVNYXhSYXRlXwUPRkVFX1JBVEVfRkFDVE9SCQBrAwUMbWF4RGV2aWF0aW9uBQdmZWVSYXRlBQ9GRUVfUkFURV9GQUNUT1IAAAENX2NhbGN1bGF0ZUZlZQcJYmFsYW5jZXNfEmFzc2V0c1RvdGFsU3VwcGx5Xwh3ZWlnaHRzXwxzaWdtYVdlaWdodF8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfCgEIZm9sZEZ1bmMCA2FjYwdiYWxhbmNlBAVpbmRleAgFA2FjYwJfMQQLZXF1aWxpYnJpdW0JAGsDBRJhc3NldHNUb3RhbFN1cHBseV8JAJEDAgUId2VpZ2h0c18FBWluZGV4BQxzaWdtYVdlaWdodF8JAJQKAgkAZAIFBWluZGV4AAEJAGQCCAUDYWNjAl8yCQESX2NhbGN1bGF0ZU1pY3JvRmVlBQUHYmFsYW5jZQULZXF1aWxpYnJpdW0FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAZyZXN1bHQKAAIkbAUJYmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5XxJwcmV2THBUb3RhbFN1cHBseV8ObHBUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwMJAAACBRJwcmV2THBUb3RhbFN1cHBseV8AAAYJAAACBQ5scFRvdGFsU3VwcGx5XwAABgQOcHJldkFzc2V0c1JhdGUJAGsDCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBQtSQVRFX0ZBQ1RPUgUScHJldkxwVG90YWxTdXBwbHlfBA1uZXdBc3NldHNSYXRlCQBrAwkAZQIFEWFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFDmFzc2V0QmFsYW5jZXNfBRFhc3NldFRvdGFsU3VwcGx5XwUNYXNzZXRXZWlnaHRzXwUMc2lnbWFXZWlnaHRfBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwULUkFURV9GQUNUT1IFDmxwVG90YWxTdXBwbHlfBARkaWZmCQBlAgUNbmV3QXNzZXRzUmF0ZQUOcHJldkFzc2V0c1JhdGUDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEFC1JBVEVfRkFDVE9SBQRkaWZmBwkAAgEJAKwCAgIqX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARZfdmFsaWRhdGVTd2FwSW52YXJpYW50CRJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfDWFzc2V0V2VpZ2h0c18Mc2lnbWFXZWlnaHRfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwQIcHJldlV0aWwJAGUCBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8EB25ld1V0aWwJAGUCBRFhc3NldFRvdGFsU3VwcGx5XwkBDV9jYWxjdWxhdGVGZWUHBQ5hc3NldEJhbGFuY2VzXwURYXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8EBGRpZmYJAGUCBQduZXdVdGlsBQhwcmV2VXRpbAMDCQBnAgAABQRkaWZmCQBmAgkAaAIA////////////AQULUkFURV9GQUNUT1IFBGRpZmYHCQACAQkArAICAiVfdmFsaWRhdGVTd2FwSW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HCGJhbGFuY2VfEWFzc2V0VG90YWxTdXBwbHlfDHByZXZCYWxhbmNlXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8Hd2VpZ2h0XwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBAtlcXVpbGlicml1bQkAawMFEWFzc2V0VG90YWxTdXBwbHlfBQd3ZWlnaHRfBQxzaWdtYVdlaWdodF8EEG1heEFsbG9jYXRpb25BbXADCQBmAgUIYmFsYW5jZV8FC2VxdWlsaWJyaXVtCQBkAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfCQBlAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfBA1tYXhBbGxvY2F0aW9uCQBrAwULZXF1aWxpYnJpdW0FEG1heEFsbG9jYXRpb25BbXAFDU1BWF9BTVBMSUZJRVIEEXByZXZNYXhBbGxvY2F0aW9uCQBrAwkAawMFFXByZXZBc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQMJAGYCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgMJAGYCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIgX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgdXADCQBmAgkAZQIFCGJhbGFuY2VfBQ1tYXhBbGxvY2F0aW9uCQBlAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgdXAGBgMJAGYCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwMJAGYCBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgZG93bgMJAGYCCQBlAgURcHJldk1heEFsbG9jYXRpb24FDHByZXZCYWxhbmNlXwkAZQIFDW1heEFsbG9jYXRpb24FCGJhbGFuY2VfCQACAQIkX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCBkb3duBgYBE192YWxpZGF0ZUFsbG9jYXRpb24HDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQkAlAoCCQBkAgUFaW5kZXgAAQMIBQNhY2MCXzIJARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HBQRlbGVtBRFhc3NldFRvdGFsU3VwcGx5XwkAkQMCBRJwcmV2QXNzZXRCYWxhbmNlc18FBWluZGV4BRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAJEDAgUNYXNzZXRXZWlnaHRzXwUFaW5kZXgFDHNpZ21hV2VpZ2h0XwUMbWF4QWxsb2NBbXBfBwQGcmVzdWx0CgACJGwFDmFzc2V0QmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDI0NTg5MjQ2NjIKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI0NTg5MjQ2NjICXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjQ1ODkyNDY2MgJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDI1MzEyMjUzOTEKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI1MzEyMjUzOTECXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjUzMTIyNTM5MQJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjU2MTIyNTg4NwMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjU2MTIyNTg4NwJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNTYxMjI1ODg3Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjYzOTYyNjQ0OQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjYzOTYyNjQ0OQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyNjM5NjI2NDQ5Al8yBA0kdDAyNjQ1NDI2NTIyCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyNjQ1NDI2NTIyAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI2NDU0MjY1MjICXzIEDSR0MDI2NTI4Mjc3NTgDCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkAAAoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAawMJAJEDAgUMYXNzZXRXZWlnaHRzBQVpbmRleAUHYW1vdW50XwULc2lnbWFXZWlnaHQJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNjk3MDI3MDQ0CgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNjk3MDI3MDQ0Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjY5NzAyNzA0NAJfMgkAlAoCBQdhbW91bnRfBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBAVyYXRpbwkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFFHByZXZBc3NldFRvdGFsU3VwcGx5CgEJZm9sZEZ1bmMxAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAoAMBCQC8AgMFBXJhdGlvCQC2AgEJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI3NTg3Mjc2NjIKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZm9sZEZ1bmMxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNzU4NzI3NjYyAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjc1ODcyNzY2MgJfMgkAlAoCCQBrAwUHYW1vdW50XwUNbHBUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMjY1MjgyNzc1OAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI2NTI4Mjc3NTgCXzIEDSR0MDI3NzY0Mjc4NzcJARtfaW5jcmVtZW50QmFsYW5jZXNCeUFtb3VudHMCBRFwcmV2QXNzZXRCYWxhbmNlcwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQNYXNzZXRCYWxhbmNlcwgFDSR0MDI3NzY0Mjc4NzcCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNzc2NDI3ODc3Al8yBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb01pbnQFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjg1NzIyODYyNQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjg1NzIyODYyNQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyODU3MjI4NjI1Al8yBA0kdDAyODYzMDI4NzQ0CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyODYzMDI4NzQ0Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI4NjMwMjg3NDQCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBQdhbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB2Ftb3VudF8EBGVycjIJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgMJAAACBQRlcnIyBQRlcnIyBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQObHBUb2tlbnNUb01pbnQDCQAAAgUNbHBUb3RhbFN1cHBseQAACQBlAgUQYXNzZXRUb3RhbFN1cHBseQUDZmVlBAlhc3NldERpZmYJAGUCBRBhc3NldFRvdGFsU3VwcGx5BRRwcmV2QXNzZXRUb3RhbFN1cHBseQQHZmVlRGlmZgkAZQIFA2ZlZQUHcHJldkZlZQQTdXRpbGl0eUNoYW5nZUZhY3RvcgkAawMJAGUCBQlhc3NldERpZmYFB2ZlZURpZmYFC1JBVEVfRkFDVE9SCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEE2xwVG9rZW5zVG9NaW50SW5uZXIJAGsDBQ1scFRvdGFsU3VwcGx5BRN1dGlsaXR5Q2hhbmdlRmFjdG9yBQtSQVRFX0ZBQ1RPUgQEZXJyMwkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZAIFDWxwVG90YWxTdXBwbHkFE2xwVG9rZW5zVG9NaW50SW5uZXIFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjMFBGVycjMFE2xwVG9rZW5zVG9NaW50SW5uZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUObHBUb2tlbnNUb01pbnQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDF93aXRoZHJhd0FsbAEHYW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BA0kdDAzMDY3MTMwNzM5CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAzMDY3MTMwNzM5Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDMwNjcxMzA3MzkCXzIEDSR0MDMwNzQ0MzA3OTcJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDMwNzQ0MzA3OTcCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzA3NDQzMDc5NwJfMgQNJHQwMzA4MDMzMDkxOQkBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQAAAUHYW1vdW50XwUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUEBWxwRmVlCAUNJHQwMzA4MDMzMDkxOQJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAzMDgwMzMwOTE5Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDMwODAzMzA5MTkCXzMEDmxwVG9rZW5zVG9CdXJuCQBlAgkAZQIFB2Ftb3VudF8FBWxwRmVlBQtwcm90b2NvbEZlZQQDZXJyCQEMX3ZhbGlkYXRlSW50BAUObHBUb2tlbnNUb0J1cm4AAAUHTUFYX0lOVAIoX3dpdGhkcmF3QWxsOiBscFRva2Vuc1RvQnVybiBsZXNzIHRoYW4gMAMJAAACBQNlcnIFA2VycgQNJHQwMzEwODIzMTIxNQkBHF9kZWNyZW1lbnRCYWxhbmNlc0J5THBBbW91bnQDBRFwcmV2QXNzZXRCYWxhbmNlcwUObHBUb2tlbnNUb0J1cm4FDWxwVG90YWxTdXBwbHkEDWFzc2V0QmFsYW5jZXMIBQ0kdDAzMTA4MjMxMjE1Al8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwMzEwODIzMTIxNQJfMgQNYmFsYW5jZXNUb1BheQgFDSR0MDMxMDgyMzEyMTUCXzMEBGVycjIJARtfdmFsaWRhdGVMaXF1aWRpdHlJbnZhcmlhbnQLBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDWxwVG90YWxTdXBwbHkJAGUCBQ1scFRvdGFsU3VwcGx5BQ5scFRva2Vuc1RvQnVybgUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDCQAAAgUEZXJyMgUEZXJyMgkAmAoGBQ5scFRva2Vuc1RvQnVybgUNYmFsYW5jZXNUb1BheQUNYXNzZXRCYWxhbmNlcwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEJX3dpdGhkcmF3Aghhc3NldElkXwlscEFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQJcHJlY2lzaW9uCQEOX2xvYWRQcmVjaXNpb24ABAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDMyMDQ5MzIxMTcJARJfbG9hZEFzc2V0QmFsYW5jZXMABBFwcmV2QXNzZXRCYWxhbmNlcwgFDSR0MDMyMDQ5MzIxMTcCXzEEFHByZXZBc3NldFRvdGFsU3VwcGx5CAUNJHQwMzIwNDkzMjExNwJfMgQNJHQwMzIxMjIzMjE3NQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMzIxMjIzMjE3NQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAzMjEyMjMyMTc1Al8yBBB0YXJnZXRBc3NldEluZGV4CQEFdmFsdWUBCQDPCAIFBmFzc2V0cwUIYXNzZXRJZF8EB3ByZXZGZWUJAQ1fY2FsY3VsYXRlRmVlBwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQNcHJldlV0aWxWYWx1ZQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdwcmV2RmVlBAFrCQC8AgMJALYCAQUNbHBUb3RhbFN1cHBseQUOUEVSQ0VOVF9GQUNUT1IJALYCAQkAZQIFDWxwVG90YWxTdXBwbHkFCWxwQW1vdW50XwQScHJldlV0aWxWYWx1ZVdpdGhLCQCgAwEJALoCAgkAugICCQC2AgEFDXByZXZVdGlsVmFsdWUFAWsFDlBFUkNFTlRfRkFDVE9SCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJAGkCCQBkAgUJc3RvcElubmVyBQpzdGFydElubmVyAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWN1cnJlbnRBbW91bnQECXV0aWxWYWx1ZQkAZQIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAZgIFCXByZWNpc2lvbgkAZQIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLCQBmAgkAZQIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLAAAHCQCWCgQGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQDCQBmAgAACQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCWCgQHBQpzdGFydElubmVyBQ1jdXJyZW50QW1vdW50AAAJAJYKBAcFDWN1cnJlbnRBbW91bnQFCXN0b3BJbm5lcgAABAx0YXJnZXRBbW91bnQEDHRhcmdldEFtb3VudAUJbHBBbW91bnRfBBF0ZW1wQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQx0YXJnZXRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDHRhcmdldEFtb3VudAQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEB2ZlZURpZmYJAGUCBQNmZWUFB3ByZXZGZWUDCQAAAgUHZmVlRGlmZgAABQx0YXJnZXRBbW91bnQEDSR0MDM0MTQ0MzQyNTkKAAIkbAUHTElTVF82NAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAcAAAkAZAIFCWxwQW1vdW50XwUHcHJldkZlZQAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNjQJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQAQHc3VjY2VzcwgFDSR0MDM0MTQ0MzQyNTkCXzEECHN0YXJ0T3V0CAUNJHQwMzQxNDQzNDI1OQJfMgQHc3RvcE91dAgFDSR0MDM0MTQ0MzQyNTkCXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM0MTQ0MzQyNTkCXzQDCQEBIQEFB3N1Y2Nlc3MJAAIBCQCsAgICKF93aXRoZHJhdzogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKQDAQUPdGFyZ2V0QW1vdW50T3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFCWxwQW1vdW50XwUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM1MTQ2MzUyODYJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgUQdGFyZ2V0QXNzZXRJbmRleAABBQx0YXJnZXRBbW91bnQFCWxwRmVlUmF0ZQUPcHJvdG9jb2xGZWVSYXRlBAVscEZlZQgFDSR0MDM1MTQ2MzUyODYCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzUxNDYzNTI4NgJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzNTE0NjM1Mjg2Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQVfc3dhcAMRc291cmNlQXNzZXRJbmRleF8RdGFyZ2V0QXNzZXRJbmRleF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQNJHQwMzU4NjgzNTkzNgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzU4NjgzNTkzNgJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNTg2ODM1OTM2Al8yBA0kdDAzNTk0MTM1OTk0CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNTk0MTM1OTk0Al8xBAtzaWdtYVdlaWdodAgFDSR0MDM1OTQxMzU5OTQCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJAGQCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNc291cmNlQW1vdW50XwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUKAQhmb2xkRnVuYwIDYWNjBGVsZW0DCAUDYWNjAl8xBQNhY2MECnN0YXJ0SW5uZXIIBQNhY2MCXzIECXN0b3BJbm5lcggFA2FjYwJfMwQNY3VycmVudEFtb3VudAkAaQIJAGQCBQlzdG9wSW5uZXIFCnN0YXJ0SW5uZXIAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQ1jdXJyZW50QW1vdW50BAl1dGlsVmFsdWUJAGUCBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwMJAGYCBQlwcmVjaXNpb24JAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUJAGYCCQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlAAAHCQCWCgQGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQDCQBmAgAACQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCWCgQHBQpzdGFydElubmVyBQ1jdXJyZW50QW1vdW50AAAJAJYKBAcFDWN1cnJlbnRBbW91bnQFCXN0b3BJbm5lcgAABAx0YXJnZXRBbW91bnQEDHRhcmdldEFtb3VudAUNc291cmNlQW1vdW50XwQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBR0ZW1wQXNzZXRUb3RhbFN1cHBseQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFDHRhcmdldEFtb3VudAQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEB2ZlZURpZmYJAGUCBQNmZWUFB3ByZXZGZWUDCQAAAgUHZmVlRGlmZgAABQx0YXJnZXRBbW91bnQEDSR0MDM3ODYwMzc5NzkKAAIkbAUHTElTVF82NAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAcAAAkAZAIFDXNvdXJjZUFtb3VudF8FB3ByZXZGZWUAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDY0CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAEB3N1Y2Nlc3MIBQ0kdDAzNzg2MDM3OTc5Al8xBAhzdGFydE91dAgFDSR0MDM3ODYwMzc5NzkCXzIEB3N0b3BPdXQIBQ0kdDAzNzg2MDM3OTc5Al8zBA90YXJnZXRBbW91bnRPdXQIBQ0kdDAzNzg2MDM3OTc5Al80AwkBASEBBQdzdWNjZXNzCQACAQkArAICAiRfc3dhcDogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKQDAQUPdGFyZ2V0QW1vdW50T3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFDWFzc2V0QmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFDHRhcmdldEFtb3VudAQEZXJyMQMJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAURbWF4QWxsb2NBbXBsaWZpZXIJARZfdmFsaWRhdGVTd2FwSW52YXJpYW50CQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM4NzkyMzg5MzMJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgURdGFyZ2V0QXNzZXRJbmRleF8AAQUMdGFyZ2V0QW1vdW50BQlscEZlZVJhdGUFD3Byb3RvY29sRmVlUmF0ZQQFbHBGZWUIBQ0kdDAzODc5MjM4OTMzAl8xBAtwcm90b2NvbEZlZQgFDSR0MDM4NzkyMzg5MzMCXzIEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMzg3OTIzODkzMwJfMwkAlwoFBQx0YXJnZXRBbW91bnQFEmZpbmFsQXNzZXRCYWxhbmNlcwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhUBaQEEaW5pdA0HYXNzZXRzXw1hc3NldFdlaWdodHNfCmxwRmVlUmF0ZV8QcHJvdG9jb2xGZWVSYXRlXwxscFRva2VuTmFtZV8NbHBUb2tlbkRlc2NyXxBscFRva2VuRGVjaW1hbHNfF21heEFsbG9jYXRpb25BbXBsaWZpZXJfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXxRwcm90b2NvbEZlZUNvbnRyYWN0XwpwcmVjaXNpb25fBANlcnIDAwMDAwMDAwMDAwMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJAQ9fdmFsaWRhdGVBc3NldHMCBQdhc3NldHNfAhRpbml0OiBpbnZhbGlkIGFzc2V0cwcJARBfdmFsaWRhdGVJbnRMaXN0BAUNYXNzZXRXZWlnaHRzXwAABQpNQVhfV0VJR0hUAhppbml0OiBpbnZhbGlkIGFzc2V0V2VpZ2h0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEFB2Fzc2V0c18JAJADAQUNYXNzZXRXZWlnaHRzXwIfaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMgc2l6ZQcJAQxfdmFsaWRhdGVJbnQEBQpscEZlZVJhdGVfAAAFB01BWF9GRUUCFGluaXQ6IGludmFsaWQgbHAgZmVlBwkBDF92YWxpZGF0ZUludAQFEHByb3RvY29sRmVlUmF0ZV8AAAUHTUFYX0ZFRQIaaW5pdDogaW52YWxpZCBwcm90b2NvbCBmZWUHCQESX3ZhbGlkYXRlVG9rZW5OYW1lAgUMbHBUb2tlbk5hbWVfAhJpbml0OiBpbnZhbGlkIG5hbWUHCQETX3ZhbGlkYXRlVG9rZW5EZXNjcgIFDWxwVG9rZW5EZXNjcl8CE2luaXQ6IGludmFsaWQgZGVzY3IHCQERX3ZhbGlkYXRlRGVjaW1hbHMCBRBscFRva2VuRGVjaW1hbHNfAhZpbml0OiBpbnZhbGlkIGRlY2ltYWxzBwkBDF92YWxpZGF0ZUludAQFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAAAFDU1BWF9BTVBMSUZJRVICJGluaXQ6IGludmFsaWQgbWF4QWxsb2NhdGlvbkFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRB3ZWlnaHRBbXBsaWZpZXJfAAAFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAh1pbml0OiBpbnZhbGlkIHdlaWdodEFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBQ1zbGlwcGFnZVJhdGVfAAAFB01BWF9JTlQCGmluaXQ6IGludmFsaWQgc2xpcHBhZ2VSYXRlBwkBDF92YWxpZGF0ZUludAQFC2ZlZU1heFJhdGVfAAAFB01BWF9JTlQCGGluaXQ6IGludmFsaWQgZmVlTWF4UmF0ZQcJARBfdmFsaWRhdGVBZGRyZXNzAgUUcHJvdG9jb2xGZWVDb250cmFjdF8CIWluaXQ6IGludmFsaWQgcHJvdG9jb2xGZWVDb250cmFjdAcJAQxfdmFsaWRhdGVJbnQEBQpwcmVjaXNpb25fAAAFB01BWF9JTlQCF2luaXQ6IGludmFsaWQgcHJlY2lzaW9uBwMJAAACBQNlcnIFA2VycgQNJHQwNDA3MTQ0MDc4MwkBFF9wcmVwYXJlQXNzZXRXZWlnaHRzAQUNYXNzZXRXZWlnaHRzXwQMYXNzZXRXZWlnaHRzCAUNJHQwNDA3MTQ0MDc4MwJfMQQLc2lnbWFXZWlnaHQIBQ0kdDA0MDcxNDQwNzgzAl8yBA1hc3NldEJhbGFuY2VzCQEVX3ByZXBhcmVBc3NldEJhbGFuY2VzAQUHYXNzZXRzXwQFaXNzdWUJAMIIBQUMbHBUb2tlbk5hbWVfBQ1scFRva2VuRGVzY3JfAAAFEGxwVG9rZW5EZWNpbWFsc18GBAlscEFzc2V0SWQJALgIAQUFaXNzdWUEDnN0b3JhZ2VVcGRhdGVkCQCcCgoFCWxwQXNzZXRJZAYAAAUKbHBGZWVSYXRlXwUQcHJvdG9jb2xGZWVSYXRlXwUXbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfCQERQGV4dHJOYXRpdmUoMTA2MikBBRRwcm90b2NvbEZlZUNvbnRyYWN0XwkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIFBWlzc3VlBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBC19zYXZlQXNzZXRzAQUHYXNzZXRzXwkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJARFfc2F2ZUFzc2V0V2VpZ2h0cwEFDGFzc2V0V2VpZ2h0cwkBDl9zYXZlUHJlY2lzaW9uAQUKcHJlY2lzaW9uXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEJARJfbG9hZFNpZ21hRmVlUGVyTHAABQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmRlcG9zaXRBbGwBB2Ftb3VudF8EA2VycgMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQdNQVhfSU5UAhpkZXBvc2l0QWxsOiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwNDI0NzY0MjU2MQkBC19kZXBvc2l0QWxsAQUHYW1vdW50XwQObHBUb2tlbnNUb01pbnQIBQ0kdDA0MjQ3NjQyNTYxAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwNDI0NzY0MjU2MQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQyNDc2NDI1NjECXzMKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAdhc3NldElkBBRwYXltZW50QXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkCQCRAwIFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFBWluZGV4BA5yZXF1aXJlZEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUUcGF5bWVudEFzc2V0RGVjaW1hbHMFB0NFSUxJTkcEBGVycjEDCQECIT0CBQ9wYXltZW50QXNzZXRTdHIFBGVsZW0JAAIBCQCsAgICI2RlcG9zaXRBbGw6IGludmFsaWQgcGF5bWVudDogaW5kZXg9CQCkAwEFBWluZGV4AwkAZwIAAAUOcmVxdWlyZWRBbW91bnQJAAIBAiZkZXBvc2l0QWxsOiB0b28gbGl0dGxlIGFtb3VudCByZXF1aXJlZAUEdW5pdAMJAAACBQRlcnIxBQRlcnIxBAZjaGFuZ2UDCQBmAggJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAUOcmVxdWlyZWRBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAggJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAUOcmVxdWlyZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAdhc3NldElkBQNuaWwDCQBmAgUOcmVxdWlyZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAihkZXBvc2l0QWxsOiBpbnN1ZmZpY2llbnQgcGF5bWVudCwgaW5kZXg9CQCkAwEFBWluZGV4AgssIHJlcXVpcmVkPQkApAMBBQ5yZXF1aXJlZEFtb3VudAUDbmlsCQCUCgIJAGQCBQVpbmRleAABCQDOCAIIBQNhY2MCXzIFBmNoYW5nZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNDM3MDQ0Mzc2NgoAAiRsBQZhc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwNDM3MDQ0Mzc2NgJfMQQNY2hhbmdlQWN0aW9ucwgFDSR0MDQzNzA0NDM3NjYCXzIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9NaW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDmxwVG9rZW5zVG9NaW50BQlscEFzc2V0SWQFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwUNY2hhbmdlQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdkZXBvc2l0AQxtaW5McEFtb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFDG1pbkxwQW1vdW50XwAABQdNQVhfSU5UAh5kZXBvc2l0OiBpbnZhbGlkIG1pbiBscCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBGVycjEDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAh5kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh5kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAUHTUFYX0lOVAIfZGVwb3NpdDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUEZXJyMQUEZXJyMQQIYXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0U3RyBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDWFzc2V0RGVjaW1hbHMFCmxwRGVjaW1hbHMFBERPV04EDSR0MDQ1MTQ1NDUyMTkJAQhfZGVwb3NpdAIFCGFzc2V0U3RyBRBhbW91bnROb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDQ1MTQ1NDUyMTkCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0NTE0NTQ1MjE5Al8yBARlcnIyCQEMX3ZhbGlkYXRlSW50BAUObHBUb2tlbnNUb01pbnQFDG1pbkxwQW1vdW50XwUHTUFYX0lOVAIZZGVwb3NpdDogbGVzcyB0aGFuIG1pbiBscAMJAAACBQRlcnIyBQRlcnIyBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUObHBUb2tlbnNUb01pbnQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3dpdGhkcmF3QWxsAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAiJ3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCI3dpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDY0NDA0NjU2OQkBDF93aXRoZHJhd0FsbAEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA5scFRva2Vuc1RvQnVybggFDSR0MDQ2NDQwNDY1NjkCXzEEDWJhbGFuY2VzVG9QYXkIBQ0kdDA0NjQ0MDQ2NTY5Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNDY0NDA0NjU2OQJfMwQFbHBGZWUIBQ0kdDA0NjQ0MDQ2NTY5Al80BAtwcm90b2NvbEZlZQgFDSR0MDQ2NDQwNDY1NjkCXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDY0NDA0NjU2OQJfNgQOcGF5bWVudEFjdGlvbnMJARhfZ2V0UGF5bWVudHNGcm9tQmFsYW5jZXMEBQZhc3NldHMFDWJhbGFuY2VzVG9QYXkIBQFpBmNhbGxlcgUKbHBEZWNpbWFscwQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBlAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9CdXJuCAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAUObHBUb2tlbnNUb0J1cm4FA25pbAUOcGF5bWVudEFjdGlvbnMJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUMbHBBc3NldElkU3RyCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUMbHBBc3NldElkU3RyCQEQX3NhdmVQcm90b2NvbEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDGxwQXNzZXRJZFN0cgkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECH3dpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAiB3aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFtb3VudAcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDBQZhc3NldHMFCGFzc2V0SWRfAhl3aXRoZHJhdzogaW52YWxpZCBhc3NldElkBwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIbd2l0aGRyYXc6IGludmFsaWQgbWluQW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDgxMDU0ODIzOQkBCV93aXRoZHJhdwIFCGFzc2V0SWRfCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDQ4MTA1NDgyMzkCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDQ4MTA1NDgyMzkCXzIEBWxwRmVlCAUNJHQwNDgxMDU0ODIzOQJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0ODEwNTQ4MjM5Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ4MTA1NDgyMzkCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgQEZXJyMQkBDF92YWxpZGF0ZUludAQFC2ZpbmFsQW1vdW50BQptaW5BbW91bnRfBQdNQVhfSU5UAiN3aXRoZHJhdzogaW5zdWZmaWNpZW50IGZpbmFsIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGUCCAUHc3RvcmFnZQJfMwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtmaW5hbEFtb3VudAkBC19zdHJUb0Fzc2V0AQUIYXNzZXRJZF8FA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFCGFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUIYXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUIYXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQhhc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBHN3YXACDnRhcmdldEFzc2V0SWRfCm1pbkFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQOc291cmNlQXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQEMX2dldERlY2ltYWxzAQUOc291cmNlQXNzZXRTdHIFCmxwRGVjaW1hbHMFBERPV04EEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0U3RyAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQDZXJyAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQxfdmFsaWRhdGVJbnQEBQptaW5BbW91bnRfAAAFB01BWF9JTlQCH3N3YXA6IGludmFsaWQgbWluIHRhcmdldCBhbW91bnQHCQEMX3ZhbGlkYXRlSW50BAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAAABQdNQVhfSU5UAhtzd2FwOiBpbnZhbGlkIHNvdXJjZSBhbW91bnQHCQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldFN0cgUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIbc3dhcDogaW52YWxpZCBwYXltZW50cyBzaXplBwMJAAACBQNlcnIFA2VycgQNJHQwNTAzMzY1MDQ5NAkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDUwMzM2NTA0OTQCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDUwMzM2NTA0OTQCXzIEBWxwRmVlCAUNJHQwNTAzMzY1MDQ5NAJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1MDMzNjUwNDk0Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDUwMzM2NTA0OTQCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgQEZXJyMQkBDF92YWxpZGF0ZUludAQFC2ZpbmFsQW1vdW50BQptaW5BbW91bnRfBQdNQVhfSU5UAh9zd2FwOiBpbnN1ZmZpY2llbnQgZmluYWwgYW1vdW50AwkAAAIFBGVycjEFBGVycjEJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULZmluYWxBbW91bnQJAQtfc3RyVG9Bc3NldAEFDnRhcmdldEFzc2V0SWRfBQNuaWwJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRJmaW5hbEFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQ50YXJnZXRBc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQ50YXJnZXRBc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDnRhcmdldEFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENZ2V0RGVwb3NpdEFsbAEJbHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQlscEFtb3VudF8AAAUHTUFYX0lOVAIdZ2V0RGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDUxNjI2NTE3MTMJAQtfZGVwb3NpdEFsbAEFCWxwQW1vdW50XwQObHBUb2tlbnNUb01pbnQIBQ0kdDA1MTYyNjUxNzEzAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwNTE2MjY1MTcxMwJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDUxNjI2NTE3MTMCXzMJAJQKAgUDbmlsCQCUCgIFDmxwVG9rZW5zVG9NaW50BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmdldERlcG9zaXQCCGFzc2V0SWRfB2Ftb3VudF8EA2VycgMJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMABQhhc3NldElkXwIZZ2V0RGVwb3NpdDogaW52YWxpZCBhc3NldAkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZ2V0RGVwb3NpdDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMEBQdhbW91bnRfBQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBA0kdDA1MjQ3MjUyNTQ2CQEIX2RlcG9zaXQCBQhhc3NldElkXwUQYW1vdW50Tm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDA1MjQ3MjUyNTQ2Al8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNTI0NzI1MjU0NgJfMgkAlAoCBQNuaWwFDmxwVG9rZW5zVG9NaW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmdldFdpdGhkcmF3QWxsAQlscEFtb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFCWxwQW1vdW50XwAABQdNQVhfSU5UAh5nZXRXaXRoZHJhd0FsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDUyOTIzNTMwNDEJAQxfd2l0aGRyYXdBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9CdXJuCAUNJHQwNTI5MjM1MzA0MQJfMQQNYmFsYW5jZXNUb0dldAgFDSR0MDUyOTIzNTMwNDECXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MjkyMzUzMDQxAl8zBAVscEZlZQgFDSR0MDUyOTIzNTMwNDECXzQEC3Byb3RvY29sRmVlCAUNJHQwNTI5MjM1MzA0MQJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MjkyMzUzMDQxAl82CQCUCgIFA25pbAUNYmFsYW5jZXNUb0dldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtnZXRXaXRoZHJhdwIIYXNzZXRJZF8HYW1vdW50XwQDZXJyAwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMJAQtfbG9hZEFzc2V0cwAFCGFzc2V0SWRfAhpnZXRXaXRoZHJhdzogaW52YWxpZCBhc3NldAkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIbZ2V0V2l0aGRyYXc6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNJHQwNTM2OTI1MzgwOAkBCV93aXRoZHJhdwIFCGFzc2V0SWRfBQdhbW91bnRfBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNTM2OTI1MzgwOAJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDUzNjkyNTM4MDgCXzIEBWxwRmVlCAUNJHQwNTM2OTI1MzgwOAJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1MzY5MjUzODA4Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDUzNjkyNTM4MDgCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgkAlAoCBQNuaWwFC2ZpbmFsQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2dldFN3YXADDnNvdXJjZUFzc2V0SWRfDnRhcmdldEFzc2V0SWRfDXNvdXJjZUFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRJZF8CGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAUNc291cmNlQW1vdW50XwkBDF9nZXREZWNpbWFscwEFDnNvdXJjZUFzc2V0SWRfBQpscERlY2ltYWxzBQRET1dOBANlcnIDCQEMX3ZhbGlkYXRlSW50BAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAAABQdNQVhfSU5UAhtzd2FwOiBpbnZhbGlkIHNvdXJjZSBhbW91bnQJARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFDnNvdXJjZUFzc2V0SWRfBQ50YXJnZXRBc3NldElkXwIRc3dhcDogc2FtZSBhc3NldHMHAwkAAAIFA2VycgUDZXJyBA0kdDA1NTIyMjU1MzgwCQEFX3N3YXADBRBzb3VyY2VBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BRZzb3VyY2VBbW91bnROb3JtYWxpemVkBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNTUyMjI1NTM4MAJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNTUyMjI1NTM4MAJfMgQFbHBGZWUIBQ0kdDA1NTIyMjU1MzgwAl8zBAtwcm90b2NvbEZlZQgFDSR0MDU1MjIyNTUzODACXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNTUyMjI1NTM4MAJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ50YXJnZXRBc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOCQCUCgIFA25pbAULZmluYWxBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZ2V0Q2xhaW0BBXVzZXJfBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhZnZXRDbGFpbTogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIEDSR0MDU2MDIyNTYwNzgJAQtfY2hlY2twb2ludAEFBHVzZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTYwMjI1NjA3OAJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1NjAyMjU2MDc4Al8yCQCUCgIFA25pbAULdXNlclByb2ZpdHMBaQELZ2V0VXRpbEZ1bmMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BA0kdDA1NjQxMTU2NDcxCQESX2xvYWRBc3NldEJhbGFuY2VzAAQNYXNzZXRCYWxhbmNlcwgFDSR0MDU2NDExNTY0NzECXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDA1NjQxMTU2NDcxAl8yBA0kdDA1NjQ3NjU2NTI5CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDA1NjQ3NjU2NTI5Al8xBAtzaWdtYVdlaWdodAgFDSR0MDU2NDc2NTY1MjkCXzIEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQJdXRpbFZhbHVlCQBlAgUQYXNzZXRUb3RhbFN1cHBseQUDZmVlCQCUCgIFA25pbAkAlAoCBQl1dGlsVmFsdWUFDWxwVG90YWxTdXBwbHkBaQEKY2hlY2twb2ludAEFdXNlcl8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CGGNoZWNrcG9pbnQ6IGludmFsaWQgdXNlcggFAWkGY2FsbGVyCQELX2NoZWNrcG9pbnQBBQR1c2VyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXN0YWtlAAQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgFB3N0b3JhZ2UCXzEEBGVycjEDAwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIcc3Rha2U6IGludmFsaWQgcGF5bWVudHMgc2l6ZQkBFF92YWxpZGF0ZVN0cmluZ0VxdWFsAwUMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHHN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAUHTUFYX0lOVAIdc3Rha2U6IGludmFsaWQgcGF5bWVudCBhbW91bnQHAwkAAAIFBGVycjEFBGVycjEEDSR0MDU3NjAyNTc2NjIJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1NzYwMjU3NjYyAl8xBAt1c2VyUHJvZml0cwgFDSR0MDU3NjAyNTc2NjICXzIJAJQKAgkAzggCCQDOCAIFEWNoZWNrcG9pbnRBY3Rpb25zCQELX3NhdmVVc2VyTHACCAUBaQZjYWxsZXIJAGQCCQELX2xvYWRVc2VyTHABCAUBaQZjYWxsZXIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQEMX3NhdmVUb3RhbExwAQkAZAIJAQxfbG9hZFRvdGFsTHAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnN0YWtlAQdhbW91bnRfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQGdXNlckxwCQELX2xvYWRVc2VyTHABCAUBaQZjYWxsZXIEBGVycjEJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAAFBnVzZXJMcAIXdW5zdGFrZTogaW52YWxpZCBhbW91bnQDCQAAAgUEZXJyMQUEZXJyMQQNJHQwNTgxNzM1ODIzMwkBC19jaGVja3BvaW50AQgFAWkGY2FsbGVyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU4MTczNTgyMzMCXzEEC3VzZXJQcm9maXRzCAUNJHQwNTgxNzM1ODIzMwJfMgkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHYW1vdW50XwUJbHBBc3NldElkBQNuaWwFEWNoZWNrcG9pbnRBY3Rpb25zCQELX3NhdmVVc2VyTHACCAUBaQZjYWxsZXIJAGUCBQZ1c2VyTHAFB2Ftb3VudF8JAQxfc2F2ZVRvdGFsTHABCQBlAgkBDF9sb2FkVG90YWxMcAAFB2Ftb3VudF8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0CBXVzZXJfB2Fzc2V0c18EA2VycgMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAkAkAMBBQdhc3NldHNfAAEACgIaY2xhaW06IGludmFsaWQgYXNzZXRzIHNpemUHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhNjbGFpbTogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEFCWxwQXNzZXRJZAQGYXNzZXRzCQDMCAIFDGxwQXNzZXRJZFN0cgkBC19sb2FkQXNzZXRzAAQIbWF4SW5kZXgJAGUCCQCQAwEFBmFzc2V0cwABBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBHVzZXIEDSR0MDU5MDU2NTkxMTIJAQtfY2hlY2twb2ludAEFBHVzZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTkwNTY1OTExMgJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1OTA1NjU5MTEyAl8yCgEIZm9sZEZ1bmMCA2FjYwZwcm9maXQEBWluZGV4CAUDYWNjAl8xAwkAZgIFBWluZGV4BQhtYXhJbmRleAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQZwcm9maXQIBQNhY2MCXzMEBWFzc2V0CQCRAwIFBmFzc2V0cwUFaW5kZXgDCQEPY29udGFpbnNFbGVtZW50AgUHYXNzZXRzXwUFYXNzZXQJAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgAACQDNCAIIBQNhY2MCXzMJAQ5TY3JpcHRUcmFuc2ZlcgMFBHVzZXIFBnByb2ZpdAkBC19zdHJUb0Fzc2V0AQUFYXNzZXQJAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUGcHJvZml0CAUDYWNjAl8zBA0kdDA1OTYwMTU5NjkyCgACJGwFC3VzZXJQcm9maXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDAAAFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDA1OTYwMTU5NjkyAl8xBBJ1c2VyUHJvZml0c1VwZGF0ZWQIBQ0kdDA1OTYwMTU5NjkyAl8yBA1wcm9maXRBY3Rpb25zCAUNJHQwNTk2MDE1OTY5MgJfMwkAlAoCCQDOCAIJAM4IAgUNcHJvZml0QWN0aW9ucwkA0QgCBRFjaGVja3BvaW50QWN0aW9ucwAACQEQX3NhdmVVc2VyUHJvZml0cwIFBHVzZXIFEnVzZXJQcm9maXRzVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVwYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5wYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQtfd2hlblBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQcFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMdXBkYXRlUGF1c2VyAQdwYXVzZXJfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CHHVwZGF0ZVBhdXNlcjogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2V0TXVsdGlzaWcBCW11bHRpc2lnXwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCW11bHRpc2lnXwIdc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ1fc2F2ZU11bHRpc2lnAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbXVsdGlzaWdfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwkAuQkCCQDMCAIFCktFWV9TVEFUVVMJAMwIAgkApQgBBQR0aGlzCQDMCAIJANgEAQgFAnR4AmlkBQNuaWwFA1NFUAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXk9k5eu", "height": 3766023, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9oG4XfCKh6Eys4G5MhAnQDsiEEmKnpCoP9E7LcFbXnL Next: EQ1TCek3bH5sJErFrhf8epuEw6KcJCNUFdrg9GQK6Nwa Diff:
OldNewDifferences
12771277 let targetAssetIndex = value(indexOf(assets, assetId_))
12781278 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12791279 let prevUtilValue = (prevAssetTotalSupply - prevFee)
1280+ let k = fraction(toBigInt(lpTotalSupply), PERCENT_FACTOR, toBigInt((lpTotalSupply - lpAmount_)))
1281+ let prevUtilValueWithK = toInt(((toBigInt(prevUtilValue) / k) / PERCENT_FACTOR))
12801282 func foldFunc (acc,elem) = if (acc._1)
12811283 then acc
12821284 else {
12861288 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12871289 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12881290 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1289- if (if ((precision > (utilValue - prevUtilValue)))
1290- then ((utilValue - prevUtilValue) > 0)
1291+ if (if ((precision > (utilValue - prevUtilValueWithK)))
1292+ then ((utilValue - prevUtilValueWithK) > 0)
12911293 else false)
12921294 then $Tuple4(true, startInner, stopInner, currentAmount)
12931295 else if ((0 > (utilValue - prevUtilValue)))
13041306 if ((feeDiff == 0))
13051307 then targetAmount
13061308 else {
1307- let $t03394534060 = {
1309+ let $t03414434259 = {
13081310 let $l = LIST_64
13091311 let $s = size($l)
13101312 let $acc0 = $Tuple4(false, 0, (lpAmount_ + prevFee), 0)
13181320
13191321 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
13201322 }
1321- let success = $t03394534060._1
1322- let startOut = $t03394534060._2
1323- let stopOut = $t03394534060._3
1324- let targetAmountOut = $t03394534060._4
1323+ let success = $t03414434259._1
1324+ let startOut = $t03414434259._2
1325+ let stopOut = $t03414434259._3
1326+ let targetAmountOut = $t03414434259._4
13251327 if (!(success))
13261328 then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
13271329 else targetAmountOut
13341336 else false
13351337 if ((err1 == err1))
13361338 then {
1337- let $t03494735087 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, lpFeeRate, protocolFeeRate)
1338- let lpFee = $t03494735087._1
1339- let protocolFee = $t03494735087._2
1340- let sigmaFeePerLpUpdated = $t03494735087._3
1339+ let $t03514635286 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, lpFeeRate, protocolFeeRate)
1340+ let lpFee = $t03514635286._1
1341+ let protocolFee = $t03514635286._2
1342+ let sigmaFeePerLpUpdated = $t03514635286._3
13411343 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13421344 }
13431345 else throw("Strict value is not equal to itself.")
13561358 let slippageRate = storage._8
13571359 let feeMaxRate = storage._9
13581360 let precision = _loadPrecision()
1359- let $t03566935737 = _loadAssetBalances()
1360- let prevAssetBalances = $t03566935737._1
1361- let prevAssetTotalSupply = $t03566935737._2
1362- let $t03574235795 = _loadAssetWeights()
1363- let assetWeights = $t03574235795._1
1364- let sigmaWeight = $t03574235795._2
1361+ let $t03586835936 = _loadAssetBalances()
1362+ let prevAssetBalances = $t03586835936._1
1363+ let prevAssetTotalSupply = $t03586835936._2
1364+ let $t03594135994 = _loadAssetWeights()
1365+ let assetWeights = $t03594135994._1
1366+ let sigmaWeight = $t03594135994._2
13651367 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13661368 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13671369 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13931395 if ((feeDiff == 0))
13941396 then targetAmount
13951397 else {
1396- let $t03766137780 = {
1398+ let $t03786037979 = {
13971399 let $l = LIST_64
13981400 let $s = size($l)
13991401 let $acc0 = $Tuple4(false, 0, (sourceAmount_ + prevFee), 0)
14071409
14081410 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
14091411 }
1410- let success = $t03766137780._1
1411- let startOut = $t03766137780._2
1412- let stopOut = $t03766137780._3
1413- let targetAmountOut = $t03766137780._4
1412+ let success = $t03786037979._1
1413+ let startOut = $t03786037979._2
1414+ let stopOut = $t03786037979._3
1415+ let targetAmountOut = $t03786037979._4
14141416 if (!(success))
14151417 then throw(("_swap: can't calculate targetAmount=" + toString(targetAmountOut)))
14161418 else targetAmountOut
14231425 else false
14241426 if ((err1 == err1))
14251427 then {
1426- let $t03859338734 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1427- let lpFee = $t03859338734._1
1428- let protocolFee = $t03859338734._2
1429- let sigmaFeePerLpUpdated = $t03859338734._3
1428+ let $t03879238933 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1429+ let lpFee = $t03879238933._1
1430+ let protocolFee = $t03879238933._2
1431+ let sigmaFeePerLpUpdated = $t03879238933._3
14301432 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14311433 }
14321434 else throw("Strict value is not equal to itself.")
14701472 else false
14711473 if ((err == err))
14721474 then {
1473- let $t04051540584 = _prepareAssetWeights(assetWeights_)
1474- let assetWeights = $t04051540584._1
1475- let sigmaWeight = $t04051540584._2
1475+ let $t04071440783 = _prepareAssetWeights(assetWeights_)
1476+ let assetWeights = $t04071440783._1
1477+ let sigmaWeight = $t04071440783._2
14761478 let assetBalances = _prepareAssetBalances(assets_)
14771479 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14781480 let lpAssetId = calculateAssetId(issue)
14971499 let lpAssetId = storage._1
14981500 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14991501 let assets = _loadAssets()
1500- let $t04227742362 = _depositAll(amount_)
1501- let lpTokensToMint = $t04227742362._1
1502- let requiredAmountsNormalized = $t04227742362._2
1503- let assetBalances = $t04227742362._3
1502+ let $t04247642561 = _depositAll(amount_)
1503+ let lpTokensToMint = $t04247642561._1
1504+ let requiredAmountsNormalized = $t04247642561._2
1505+ let assetBalances = $t04247642561._3
15041506 func foldFunc (acc,elem) = {
15051507 let index = acc._1
15061508 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15241526 else throw("Strict value is not equal to itself.")
15251527 }
15261528
1527- let $t04350543567 = {
1529+ let $t04370443766 = {
15281530 let $l = assets
15291531 let $s = size($l)
15301532 let $acc0 = $Tuple2(0, nil)
15381540
15391541 $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)
15401542 }
1541- let idx = $t04350543567._1
1542- let changeActions = $t04350543567._2
1543+ let idx = $t04370443766._1
1544+ let changeActions = $t04370443766._2
15431545 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15441546 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15451547 }
15701572 let assetStr = _assetToStr(i.payments[0].assetId)
15711573 let assetDecimals = _getDecimals(assetStr)
15721574 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1573- let $t04494645020 = _deposit(assetStr, amountNormalized)
1574- let lpTokensToMint = $t04494645020._1
1575- let assetBalances = $t04494645020._2
1575+ let $t04514545219 = _deposit(assetStr, amountNormalized)
1576+ let lpTokensToMint = $t04514545219._1
1577+ let assetBalances = $t04514545219._2
15761578 let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
15771579 if ((err2 == err2))
15781580 then {
16061608 else false
16071609 if ((err == err))
16081610 then {
1609- let $t04624146370 = _withdrawAll(i.payments[0].amount)
1610- let lpTokensToBurn = $t04624146370._1
1611- let balancesToPay = $t04624146370._2
1612- let assetBalances = $t04624146370._3
1613- let lpFee = $t04624146370._4
1614- let protocolFee = $t04624146370._5
1615- let sigmaFeePerLpUpdated = $t04624146370._6
1611+ let $t04644046569 = _withdrawAll(i.payments[0].amount)
1612+ let lpTokensToBurn = $t04644046569._1
1613+ let balancesToPay = $t04644046569._2
1614+ let assetBalances = $t04644046569._3
1615+ let lpFee = $t04644046569._4
1616+ let protocolFee = $t04644046569._5
1617+ let sigmaFeePerLpUpdated = $t04644046569._6
16161618 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16171619 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16181620 $Tuple2((((((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16441646 else false
16451647 if ((err == err))
16461648 then {
1647- let $t04790648040 = _withdraw(assetId_, i.payments[0].amount)
1648- let targetAmountNormalized = $t04790648040._1
1649- let finalAssetBalances = $t04790648040._2
1650- let lpFee = $t04790648040._3
1651- let protocolFee = $t04790648040._4
1652- let sigmaFeePerLpUpdated = $t04790648040._5
1649+ let $t04810548239 = _withdraw(assetId_, i.payments[0].amount)
1650+ let targetAmountNormalized = $t04810548239._1
1651+ let finalAssetBalances = $t04810548239._2
1652+ let lpFee = $t04810548239._3
1653+ let protocolFee = $t04810548239._4
1654+ let sigmaFeePerLpUpdated = $t04810548239._5
16531655 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16541656 let targetDecimals = _getDecimals(assetId_)
16551657 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16931695 else false
16941696 if ((err == err))
16951697 then {
1696- let $t05013750295 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1697- let targetAmountNormalized = $t05013750295._1
1698- let finalAssetBalances = $t05013750295._2
1699- let lpFee = $t05013750295._3
1700- let protocolFee = $t05013750295._4
1701- let sigmaFeePerLpUpdated = $t05013750295._5
1698+ let $t05033650494 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1699+ let targetAmountNormalized = $t05033650494._1
1700+ let finalAssetBalances = $t05033650494._2
1701+ let lpFee = $t05033650494._3
1702+ let protocolFee = $t05033650494._4
1703+ let sigmaFeePerLpUpdated = $t05033650494._5
17021704 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17031705 let targetDecimals = _getDecimals(targetAssetId_)
17041706 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17211723 let err = _validateInt(lpAmount_, 0, MAX_INT, "getDepositAll: invalid amount")
17221724 if ((err == err))
17231725 then {
1724- let $t05142751514 = _depositAll(lpAmount_)
1725- let lpTokensToMint = $t05142751514._1
1726- let requiredAmountsNormalized = $t05142751514._2
1727- let assetBalances = $t05142751514._3
1726+ let $t05162651713 = _depositAll(lpAmount_)
1727+ let lpTokensToMint = $t05162651713._1
1728+ let requiredAmountsNormalized = $t05162651713._2
1729+ let assetBalances = $t05162651713._3
17281730 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17291731 }
17301732 else throw("Strict value is not equal to itself.")
17441746 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17451747 let assetDecimals = _getDecimals(assetId_)
17461748 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1747- let $t05227352347 = _deposit(assetId_, amountNormalized)
1748- let lpTokensToMint = $t05227352347._1
1749- let assetBalances = $t05227352347._2
1749+ let $t05247252546 = _deposit(assetId_, amountNormalized)
1750+ let lpTokensToMint = $t05247252546._1
1751+ let assetBalances = $t05247252546._2
17501752 $Tuple2(nil, lpTokensToMint)
17511753 }
17521754 else throw("Strict value is not equal to itself.")
17591761 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17601762 if ((err == err))
17611763 then {
1762- let $t05272452842 = _withdrawAll(lpAmount_)
1763- let lpTokensToBurn = $t05272452842._1
1764- let balancesToGet = $t05272452842._2
1765- let assetBalances = $t05272452842._3
1766- let lpFee = $t05272452842._4
1767- let protocolFee = $t05272452842._5
1768- let sigmaFeePerLpUpdated = $t05272452842._6
1764+ let $t05292353041 = _withdrawAll(lpAmount_)
1765+ let lpTokensToBurn = $t05292353041._1
1766+ let balancesToGet = $t05292353041._2
1767+ let assetBalances = $t05292353041._3
1768+ let lpFee = $t05292353041._4
1769+ let protocolFee = $t05292353041._5
1770+ let sigmaFeePerLpUpdated = $t05292353041._6
17691771 $Tuple2(nil, balancesToGet)
17701772 }
17711773 else throw("Strict value is not equal to itself.")
17831785 let storage = _loadStorage()
17841786 let lpAssetId = storage._1
17851787 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1786- let $t05349353609 = _withdraw(assetId_, amount_)
1787- let targetAmountNormalized = $t05349353609._1
1788- let assetBalances = $t05349353609._2
1789- let lpFee = $t05349353609._3
1790- let protocolFee = $t05349353609._4
1791- let sigmaFeePerLpUpdated = $t05349353609._5
1788+ let $t05369253808 = _withdraw(assetId_, amount_)
1789+ let targetAmountNormalized = $t05369253808._1
1790+ let assetBalances = $t05369253808._2
1791+ let lpFee = $t05369253808._3
1792+ let protocolFee = $t05369253808._4
1793+ let sigmaFeePerLpUpdated = $t05369253808._5
17921794 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17931795 let targetDecimals = _getDecimals(assetId_)
17941796 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18171819 else false
18181820 if ((err == err))
18191821 then {
1820- let $t05502355181 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1821- let targetAmountNormalized = $t05502355181._1
1822- let finalAssetBalances = $t05502355181._2
1823- let lpFee = $t05502355181._3
1824- let protocolFee = $t05502355181._4
1825- let sigmaFeePerLpUpdated = $t05502355181._5
1822+ let $t05522255380 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823+ let targetAmountNormalized = $t05522255380._1
1824+ let finalAssetBalances = $t05522255380._2
1825+ let lpFee = $t05522255380._3
1826+ let protocolFee = $t05522255380._4
1827+ let sigmaFeePerLpUpdated = $t05522255380._5
18261828 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18271829 let targetDecimals = _getDecimals(targetAssetId_)
18281830 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18421844 let user = if ((size(user_) > 0))
18431845 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18441846 else i.caller
1845- let $t05582355879 = _checkpoint(user)
1846- let checkpointActions = $t05582355879._1
1847- let userProfits = $t05582355879._2
1847+ let $t05602256078 = _checkpoint(user)
1848+ let checkpointActions = $t05602256078._1
1849+ let userProfits = $t05602256078._2
18481850 $Tuple2(nil, userProfits)
18491851 }
18501852
18571859 let weightAmplifier = storage._7
18581860 let slippageRate = storage._8
18591861 let feeMaxRate = storage._9
1860- let $t05621256272 = _loadAssetBalances()
1861- let assetBalances = $t05621256272._1
1862- let assetTotalSupply = $t05621256272._2
1863- let $t05627756330 = _loadAssetWeights()
1864- let assetWeights = $t05627756330._1
1865- let sigmaWeight = $t05627756330._2
1862+ let $t05641156471 = _loadAssetBalances()
1863+ let assetBalances = $t05641156471._1
1864+ let assetTotalSupply = $t05641156471._2
1865+ let $t05647656529 = _loadAssetWeights()
1866+ let assetWeights = $t05647656529._1
1867+ let sigmaWeight = $t05647656529._2
18661868 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18671869 let utilValue = (assetTotalSupply - fee)
18681870 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
19031905 else false
19041906 if ((err1 == err1))
19051907 then {
1906- let $t05740357463 = _checkpoint(i.caller)
1907- let checkpointActions = $t05740357463._1
1908- let userProfits = $t05740357463._2
1908+ let $t05760257662 = _checkpoint(i.caller)
1909+ let checkpointActions = $t05760257662._1
1910+ let userProfits = $t05760257662._2
19091911 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19101912 }
19111913 else throw("Strict value is not equal to itself.")
19281930 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19291931 if ((err1 == err1))
19301932 then {
1931- let $t05797458034 = _checkpoint(i.caller)
1932- let checkpointActions = $t05797458034._1
1933- let userProfits = $t05797458034._2
1933+ let $t05817358233 = _checkpoint(i.caller)
1934+ let checkpointActions = $t05817358233._1
1935+ let userProfits = $t05817358233._2
19341936 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19351937 }
19361938 else throw("Strict value is not equal to itself.")
19581960 let assets = [lpAssetIdStr, _loadAssets()]
19591961 let maxIndex = (size(assets) - 1)
19601962 let userLp = _loadUserLp(user)
1961- let $t05885758913 = _checkpoint(user)
1962- let checkpointActions = $t05885758913._1
1963- let userProfits = $t05885758913._2
1963+ let $t05905659112 = _checkpoint(user)
1964+ let checkpointActions = $t05905659112._1
1965+ let userProfits = $t05905659112._2
19641966 func foldFunc (acc,profit) = {
19651967 let index = acc._1
19661968 if ((index > maxIndex))
19731975 }
19741976 }
19751977
1976- let $t05940259493 = {
1978+ let $t05960159692 = {
19771979 let $l = userProfits
19781980 let $s = size($l)
19791981 let $acc0 = $Tuple3(0, nil, nil)
19871989
19881990 $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)
19891991 }
1990- let idx = $t05940259493._1
1991- let userProfitsUpdated = $t05940259493._2
1992- let profitActions = $t05940259493._3
1992+ let idx = $t05960159692._1
1993+ let userProfitsUpdated = $t05960159692._2
1994+ let profitActions = $t05960159692._3
19931995 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19941996 }
19951997 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVES = "waves"
77
88 let MAX_INT = 9223372036854775807
99
1010 let MAX_FEE = 1000000
1111
1212 let MAX_AMPLIFIER = 1000000
1313
1414 let MAX_WEIGHT_AMPLIFIER = 1000000
1515
1616 let MAX_WEIGHT = 1000000
1717
1818 let SLIPPAGE_RATE_FACTOR = 1000000
1919
2020 let FEE_RATE_FACTOR = 1000000
2121
2222 let RATE_FACTOR = 1000000
2323
2424 let PERCENT_FACTOR = toBigInt(1000000000000)
2525
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
3030 let ZERO_BIGINT = toBigInt(0)
3131
3232 let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
3333
3434 let INT_DECIMALS = 8
3535
3636 let BIGINT_DECIMALS = 18
3737
3838 let 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", "_")
3939
4040 let KEY_MULTISIG = "MULTISIG"
4141
4242 let KEY_STATUS = "STATUS"
4343
4444 let KEY_PAUSED = "PAUSED"
4545
4646 let KEY_PAUSER = "PAUSER"
4747
4848 let KEY_STORAGE = "STORAGE"
4949
5050 let KEY_ASSETS = "ASSETS"
5151
5252 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5353
5454 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5555
5656 let KEY_LP_FEE = "LP_FEE"
5757
5858 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
5959
6060 let KEY_PRECISION = "PRECISION"
6161
6262 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6363
6464 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6565
6666 let KEY_USER_LP = "USER_LP"
6767
6868 let KEY_TOTAL_LP = "TOTAL_LP"
6969
7070 let KEY_USER_PROFITS = "USER_PROFITS"
7171
7272 func _validateAddress (address_,err_) = match addressFromString(address_) {
7373 case a: Address =>
7474 true
7575 case _ =>
7676 throw(err_)
7777 }
7878
7979
8080 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8181 then true
8282 else match assetInfo(fromBase58String(assetId_)) {
8383 case a: Asset =>
8484 true
8585 case _ =>
8686 throw(err_)
8787 }
8888
8989
9090 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
9191 then true
9292 else (val_ > upperBoundary_))
9393 then throw(err_)
9494 else true
9595
9696
9797 func _validateBool (val_,target_,err_) = if ((val_ != target_))
9898 then throw(err_)
9999 else true
100100
101101
102102 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
103103 then throw(err_)
104104 else true
105105
106106
107107 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
108108 then throw(err_)
109109 else true
110110
111111
112112 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
113113 func foldFunc (acc,elem) = match parseInt(elem) {
114114 case a: Int =>
115115 if (acc)
116116 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
117117 else false
118118 case _ =>
119119 throw(err_)
120120 }
121121
122122 let $l = val_
123123 let $s = size($l)
124124 let $acc0 = true
125125 func $f0_1 ($a,$i) = if (($i >= $s))
126126 then $a
127127 else foldFunc($a, $l[$i])
128128
129129 func $f0_2 ($a,$i) = if (($i >= $s))
130130 then $a
131131 else throw("List size exceeds 10")
132132
133133 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
134134 }
135135
136136
137137 func _validateAssets (assets_,err_) = {
138138 func foldFunc (acc,elem) = if (acc)
139139 then _validateAsset(elem, err_)
140140 else false
141141
142142 let $l = assets_
143143 let $s = size($l)
144144 let $acc0 = true
145145 func $f0_1 ($a,$i) = if (($i >= $s))
146146 then $a
147147 else foldFunc($a, $l[$i])
148148
149149 func $f0_2 ($a,$i) = if (($i >= $s))
150150 then $a
151151 else throw("List size exceeds 10")
152152
153153 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
154154 }
155155
156156
157157 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
158158 then throw(err_)
159159 else true
160160
161161
162162 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
163163 then true
164164 else (size(val_) > 16))
165165 then throw(err_)
166166 else true
167167
168168
169169 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
170170 then throw(err_)
171171 else true
172172
173173
174174 func _validateDecimals (val_,err_) = if (if ((0 > val_))
175175 then true
176176 else (val_ > 8))
177177 then throw(err_)
178178 else true
179179
180180
181181 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
182182 case a: ByteVector =>
183183 if ((assetId_ != toBase58String(a)))
184184 then throw((err_ + ": asset"))
185185 else if ((requiredAmount_ > payment_.amount))
186186 then throw((err_ + ": amount"))
187187 else true
188188 case _ =>
189189 throw((err_ + ": asset"))
190190 }
191191
192192
193193 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
194194 then throw(err_)
195195 else true
196196
197197
198198 func _assetToStr (asset_) = match asset_ {
199199 case a: ByteVector =>
200200 toBase58String(a)
201201 case _ =>
202202 WAVES
203203 }
204204
205205
206206 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
207207 then true
208208 else (asset_ == ""))
209209 then unit
210210 else fromBase58String(asset_)
211211
212212
213213 func _loadPause () = match getBoolean(KEY_PAUSED) {
214214 case a: Boolean =>
215215 a
216216 case _ =>
217217 false
218218 }
219219
220220
221221 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
222222
223223
224224 func _loadPauser () = match getString(KEY_PAUSER) {
225225 case a: String =>
226226 addressFromStringValue(a)
227227 case _ =>
228228 Address(base58'')
229229 }
230230
231231
232232 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
233233
234234
235235 func _loadMultisig () = match getString(KEY_MULTISIG) {
236236 case a: String =>
237237 addressFromStringValue(a)
238238 case _ =>
239239 Address(base58'')
240240 }
241241
242242
243243 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
244244
245245
246246 func _loadStorage () = match getString(KEY_STORAGE) {
247247 case a: String =>
248248 let struct = split(a, SEP)
249249 $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), parseIntValue(struct[6]), parseIntValue(struct[7]), parseIntValue(struct[8]), addressFromStringValue(struct[9]))
250250 case _ =>
251251 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
252252 }
253253
254254
255255 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
256256 then "1"
257257 else "0", toString(storage_._3), toString(storage_._4), toString(storage_._5), toString(storage_._6), toString(storage_._7), toString(storage_._8), toString(storage_._9), toString(storage_._10)], SEP))]
258258
259259
260260 func _loadAssets () = match getString(KEY_ASSETS) {
261261 case a: String =>
262262 if ((size(a) > 0))
263263 then split_51C(a, SEP)
264264 else nil
265265 case _ =>
266266 nil
267267 }
268268
269269
270270 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
271271
272272
273273 func _loadAssetBalances () = {
274274 func foldFunc (acc,elem) = {
275275 let balance = parseIntValue(elem)
276276 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
277277 }
278278
279279 match getString(KEY_ASSET_BALANCES) {
280280 case a: String =>
281281 if ((size(a) > 0))
282282 then {
283283 let $l = split_51C(a, SEP)
284284 let $s = size($l)
285285 let $acc0 = $Tuple2(nil, 0)
286286 func $f0_1 ($a,$i) = if (($i >= $s))
287287 then $a
288288 else foldFunc($a, $l[$i])
289289
290290 func $f0_2 ($a,$i) = if (($i >= $s))
291291 then $a
292292 else throw("List size exceeds 10")
293293
294294 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
295295 }
296296 else $Tuple2(ZERO_INT_LIST_10, 0)
297297 case _ =>
298298 $Tuple2(ZERO_INT_LIST_10, 0)
299299 }
300300 }
301301
302302
303303 func _saveAssetBalances (balances_) = {
304304 func foldFunc (acc,elem) = (acc :+ toString(elem))
305305
306306 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
307307 let $l = balances_
308308 let $s = size($l)
309309 let $acc0 = nil
310310 func $f0_1 ($a,$i) = if (($i >= $s))
311311 then $a
312312 else foldFunc($a, $l[$i])
313313
314314 func $f0_2 ($a,$i) = if (($i >= $s))
315315 then $a
316316 else throw("List size exceeds 10")
317317
318318 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
319319 }, SEP))]
320320 }
321321
322322
323323 func _loadAssetWeights () = {
324324 func foldFunc (acc,elem) = {
325325 let weight = parseIntValue(elem)
326326 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
327327 }
328328
329329 match getString(KEY_ASSET_WEIGHTS) {
330330 case a: String =>
331331 if ((size(a) > 0))
332332 then {
333333 let $l = split_51C(a, SEP)
334334 let $s = size($l)
335335 let $acc0 = $Tuple2(nil, 0)
336336 func $f0_1 ($a,$i) = if (($i >= $s))
337337 then $a
338338 else foldFunc($a, $l[$i])
339339
340340 func $f0_2 ($a,$i) = if (($i >= $s))
341341 then $a
342342 else throw("List size exceeds 10")
343343
344344 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
345345 }
346346 else $Tuple2(ZERO_INT_LIST_10, 0)
347347 case _ =>
348348 $Tuple2(ZERO_INT_LIST_10, 0)
349349 }
350350 }
351351
352352
353353 func _saveAssetWeights (weights_) = {
354354 func foldFunc (acc,elem) = (acc :+ toString(elem))
355355
356356 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
357357 let $l = weights_
358358 let $s = size($l)
359359 let $acc0 = nil
360360 func $f0_1 ($a,$i) = if (($i >= $s))
361361 then $a
362362 else foldFunc($a, $l[$i])
363363
364364 func $f0_2 ($a,$i) = if (($i >= $s))
365365 then $a
366366 else throw("List size exceeds 10")
367367
368368 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
369369 }, SEP))]
370370 }
371371
372372
373373 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
374374 case a: Int =>
375375 a
376376 case _ =>
377377 0
378378 }
379379
380380
381381 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
382382
383383
384384 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
385385 case a: Int =>
386386 a
387387 case _ =>
388388 0
389389 }
390390
391391
392392 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
393393
394394
395395 func _loadPrecision () = match getInteger(KEY_PRECISION) {
396396 case a: Int =>
397397 a
398398 case _ =>
399399 0
400400 }
401401
402402
403403 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
404404
405405
406406 func _loadSigmaFeePerLp () = {
407407 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
408408
409409 match getString(KEY_SIGMA_FEE_PER_LP) {
410410 case a: String =>
411411 if ((size(a) > 0))
412412 then {
413413 let $l = split_51C(a, SEP)
414414 let $s = size($l)
415415 let $acc0 = nil
416416 func $f0_1 ($a,$i) = if (($i >= $s))
417417 then $a
418418 else foldFunc($a, $l[$i])
419419
420420 func $f0_2 ($a,$i) = if (($i >= $s))
421421 then $a
422422 else throw("List size exceeds 11")
423423
424424 $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)
425425 }
426426 else ZERO_BIGINT_LIST_11
427427 case _ =>
428428 ZERO_BIGINT_LIST_11
429429 }
430430 }
431431
432432
433433 func _saveSigmaFeePerLp (val_) = {
434434 func foldFunc (acc,elem) = (acc :+ toString(elem))
435435
436436 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
437437 let $l = val_
438438 let $s = size($l)
439439 let $acc0 = nil
440440 func $f0_1 ($a,$i) = if (($i >= $s))
441441 then $a
442442 else foldFunc($a, $l[$i])
443443
444444 func $f0_2 ($a,$i) = if (($i >= $s))
445445 then $a
446446 else throw("List size exceeds 11")
447447
448448 $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)
449449 }, SEP))]
450450 }
451451
452452
453453 func _loadUserSigmaFeePerLp (user_) = {
454454 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
455455
456456 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
457457 case a: String =>
458458 if ((size(a) > 0))
459459 then {
460460 let $l = split_51C(a, SEP)
461461 let $s = size($l)
462462 let $acc0 = nil
463463 func $f0_1 ($a,$i) = if (($i >= $s))
464464 then $a
465465 else foldFunc($a, $l[$i])
466466
467467 func $f0_2 ($a,$i) = if (($i >= $s))
468468 then $a
469469 else throw("List size exceeds 11")
470470
471471 $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)
472472 }
473473 else ZERO_BIGINT_LIST_11
474474 case _ =>
475475 ZERO_BIGINT_LIST_11
476476 }
477477 }
478478
479479
480480 func _saveUserSigmaFeePerLp (user_,val_) = {
481481 func foldFunc (acc,elem) = (acc :+ toString(elem))
482482
483483 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
484484 let $l = val_
485485 let $s = size($l)
486486 let $acc0 = nil
487487 func $f0_1 ($a,$i) = if (($i >= $s))
488488 then $a
489489 else foldFunc($a, $l[$i])
490490
491491 func $f0_2 ($a,$i) = if (($i >= $s))
492492 then $a
493493 else throw("List size exceeds 11")
494494
495495 $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)
496496 }, SEP))]
497497 }
498498
499499
500500 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
501501 case a: Int =>
502502 a
503503 case _ =>
504504 0
505505 }
506506
507507
508508 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
509509
510510
511511 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
512512 case a: Int =>
513513 a
514514 case _ =>
515515 0
516516 }
517517
518518
519519 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
520520
521521
522522 func _loadUserProfits (user_) = {
523523 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
524524
525525 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
526526 case a: String =>
527527 if ((size(a) > 0))
528528 then {
529529 let $l = split_51C(a, SEP)
530530 let $s = size($l)
531531 let $acc0 = nil
532532 func $f0_1 ($a,$i) = if (($i >= $s))
533533 then $a
534534 else foldFunc($a, $l[$i])
535535
536536 func $f0_2 ($a,$i) = if (($i >= $s))
537537 then $a
538538 else throw("List size exceeds 11")
539539
540540 $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)
541541 }
542542 else ZERO_INT_LIST_11
543543 case _ =>
544544 ZERO_INT_LIST_11
545545 }
546546 }
547547
548548
549549 func _saveUserProfits (user_,val_) = {
550550 func foldFunc (acc,elem) = (acc :+ toString(elem))
551551
552552 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
553553 let $l = val_
554554 let $s = size($l)
555555 let $acc0 = nil
556556 func $f0_1 ($a,$i) = if (($i >= $s))
557557 then $a
558558 else foldFunc($a, $l[$i])
559559
560560 func $f0_2 ($a,$i) = if (($i >= $s))
561561 then $a
562562 else throw("List size exceeds 11")
563563
564564 $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)
565565 }, SEP))]
566566 }
567567
568568
569569 func _onlyThisContract (caller_) = if ((caller_ != this))
570570 then throw("_onlyThisContract: revert")
571571 else true
572572
573573
574574 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
575575 then throw("_whenMultisigSet: revert")
576576 else true
577577
578578
579579 func _whenNotInitialized () = {
580580 let storage = _loadStorage()
581581 if ((storage._1 != base58''))
582582 then throw("_whenNotInitialized: revert")
583583 else true
584584 }
585585
586586
587587 func _whenInitialized () = {
588588 let storage = _loadStorage()
589589 if ((storage._1 == base58''))
590590 then throw("_whenInitialized: revert")
591591 else true
592592 }
593593
594594
595595 func _whenNotPaused () = if (_loadPause())
596596 then throw("_whenNotPaused: revert")
597597 else true
598598
599599
600600 func _whenPaused () = if (!(_loadPause()))
601601 then throw("_whenPaused: revert")
602602 else true
603603
604604
605605 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
606606 then throw("_onlyPauser: revert")
607607 else true
608608
609609
610610 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
611611 case a: Asset =>
612612 a.decimals
613613 case _ =>
614614 throw(("_getDecimals: no asset=" + assetId_))
615615 }
616616
617617
618618 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
619619 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
620620 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
621621
622622
623623 func _prepareAssetBalances (assets_) = {
624624 func foldFunc (acc,elem) = (acc :+ 0)
625625
626626 let $l = assets_
627627 let $s = size($l)
628628 let $acc0 = nil
629629 func $f0_1 ($a,$i) = if (($i >= $s))
630630 then $a
631631 else foldFunc($a, $l[$i])
632632
633633 func $f0_2 ($a,$i) = if (($i >= $s))
634634 then $a
635635 else throw("List size exceeds 10")
636636
637637 $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)
638638 }
639639
640640
641641 func _prepareAssetWeights (assetWeights_) = {
642642 func foldFunc (acc,elem) = {
643643 let weight = parseIntValue(elem)
644644 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
645645 }
646646
647647 let $l = assetWeights_
648648 let $s = size($l)
649649 let $acc0 = $Tuple2(nil, 0)
650650 func $f0_1 ($a,$i) = if (($i >= $s))
651651 then $a
652652 else foldFunc($a, $l[$i])
653653
654654 func $f0_2 ($a,$i) = if (($i >= $s))
655655 then $a
656656 else throw("List size exceeds 10")
657657
658658 $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)
659659 }
660660
661661
662662 func _getAssetBalances (assets_,decimals_) = {
663663 func foldFunc (acc,elem) = {
664664 let assetDecimals = _getDecimals(elem)
665665 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
666666 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
667667 }
668668
669669 let $l = assets_
670670 let $s = size($l)
671671 let $acc0 = $Tuple2(nil, 0)
672672 func $f0_1 ($a,$i) = if (($i >= $s))
673673 then $a
674674 else foldFunc($a, $l[$i])
675675
676676 func $f0_2 ($a,$i) = if (($i >= $s))
677677 then $a
678678 else throw("List size exceeds 10")
679679
680680 $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)
681681 }
682682
683683
684684 func _listIntToString (assets_) = {
685685 func foldFunc (acc,elem) = (acc :+ toString(elem))
686686
687687 makeString({
688688 let $l = assets_
689689 let $s = size($l)
690690 let $acc0 = nil
691691 func $f0_1 ($a,$i) = if (($i >= $s))
692692 then $a
693693 else foldFunc($a, $l[$i])
694694
695695 func $f0_2 ($a,$i) = if (($i >= $s))
696696 then $a
697697 else throw("List size exceeds 11")
698698
699699 $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)
700700 }, SEP)
701701 }
702702
703703
704704 func _listBigIntToString (assets_) = {
705705 func foldFunc (acc,elem) = (acc :+ toString(elem))
706706
707707 makeString({
708708 let $l = assets_
709709 let $s = size($l)
710710 let $acc0 = nil
711711 func $f0_1 ($a,$i) = if (($i >= $s))
712712 then $a
713713 else foldFunc($a, $l[$i])
714714
715715 func $f0_2 ($a,$i) = if (($i >= $s))
716716 then $a
717717 else throw("List size exceeds 11")
718718
719719 $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)
720720 }, SEP)
721721 }
722722
723723
724724 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
725725 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
726726
727727 let $l = weights_
728728 let $s = size($l)
729729 let $acc0 = nil
730730 func $f0_1 ($a,$i) = if (($i >= $s))
731731 then $a
732732 else foldFunc($a, $l[$i])
733733
734734 func $f0_2 ($a,$i) = if (($i >= $s))
735735 then $a
736736 else throw("List size exceeds 10")
737737
738738 $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)
739739 }
740740
741741
742742 func _incrementBalancesByAmounts (balances_,amounts_) = {
743743 func foldFunc (acc,elem) = {
744744 let index = acc._1
745745 let amount = amounts_[index]
746746 let newBalance = (elem + amount)
747747 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
748748 }
749749
750750 let result = {
751751 let $l = balances_
752752 let $s = size($l)
753753 let $acc0 = $Tuple3(0, nil, 0)
754754 func $f0_1 ($a,$i) = if (($i >= $s))
755755 then $a
756756 else foldFunc($a, $l[$i])
757757
758758 func $f0_2 ($a,$i) = if (($i >= $s))
759759 then $a
760760 else throw("List size exceeds 10")
761761
762762 $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)
763763 }
764764 $Tuple2(result._2, result._3)
765765 }
766766
767767
768768 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
769769 func foldFunc (acc,elem) = {
770770 let index = acc._1
771771 let payment = payments_[index]
772772 let paymentAssetStr = _assetToStr(payment.assetId)
773773 let err = if ((paymentAssetStr != assets_[index]))
774774 then throw(((err_ + ": index=") + toString(index)))
775775 else unit
776776 if ((err == err))
777777 then {
778778 let assetDecimals = _getDecimals(paymentAssetStr)
779779 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
780780 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
781781 }
782782 else throw("Strict value is not equal to itself.")
783783 }
784784
785785 let result = {
786786 let $l = balances_
787787 let $s = size($l)
788788 let $acc0 = $Tuple3(0, nil, 0)
789789 func $f0_1 ($a,$i) = if (($i >= $s))
790790 then $a
791791 else foldFunc($a, $l[$i])
792792
793793 func $f0_2 ($a,$i) = if (($i >= $s))
794794 then $a
795795 else throw("List size exceeds 10")
796796
797797 $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)
798798 }
799799 $Tuple2(result._2, result._3)
800800 }
801801
802802
803803 func _incrementBalanceByIndex (balances_,index_,amount_) = {
804804 func foldFunc (acc,elem) = {
805805 let index = acc._1
806806 if ((index == index_))
807807 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
808808 else $Tuple2((index + 1), (acc._2 :+ elem))
809809 }
810810
811811 let result = {
812812 let $l = balances_
813813 let $s = size($l)
814814 let $acc0 = $Tuple2(0, nil)
815815 func $f0_1 ($a,$i) = if (($i >= $s))
816816 then $a
817817 else foldFunc($a, $l[$i])
818818
819819 func $f0_2 ($a,$i) = if (($i >= $s))
820820 then $a
821821 else throw("List size exceeds 10")
822822
823823 $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)
824824 }
825825 result._2
826826 }
827827
828828
829829 func _decrementBalanceByIndex (balances_,index_,amount_) = {
830830 func foldFunc (acc,elem) = {
831831 let index = acc._1
832832 if ((index == index_))
833833 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
834834 else $Tuple2((index + 1), (acc._2 :+ elem))
835835 }
836836
837837 let result = {
838838 let $l = balances_
839839 let $s = size($l)
840840 let $acc0 = $Tuple2(0, nil)
841841 func $f0_1 ($a,$i) = if (($i >= $s))
842842 then $a
843843 else foldFunc($a, $l[$i])
844844
845845 func $f0_2 ($a,$i) = if (($i >= $s))
846846 then $a
847847 else throw("List size exceeds 10")
848848
849849 $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)
850850 }
851851 result._2
852852 }
853853
854854
855855 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
856856 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
857857 func foldFunc (acc,elem) = {
858858 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
859859 let deltaBalance = (elem - newBalance)
860860 $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
861861 }
862862
863863 let $l = balances_
864864 let $s = size($l)
865865 let $acc0 = $Tuple3(nil, 0, nil)
866866 func $f0_1 ($a,$i) = if (($i >= $s))
867867 then $a
868868 else foldFunc($a, $l[$i])
869869
870870 func $f0_2 ($a,$i) = if (($i >= $s))
871871 then $a
872872 else throw("List size exceeds 10")
873873
874874 $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)
875875 }
876876
877877
878878 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
879879 func foldFunc (acc,elem) = {
880880 let index = acc._1
881881 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
882882 }
883883
884884 let result = {
885885 let $l = assets_
886886 let $s = size($l)
887887 let $acc0 = $Tuple2(0, nil)
888888 func $f0_1 ($a,$i) = if (($i >= $s))
889889 then $a
890890 else foldFunc($a, $l[$i])
891891
892892 func $f0_2 ($a,$i) = if (($i >= $s))
893893 then $a
894894 else throw("List size exceeds 10")
895895
896896 $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)
897897 }
898898 result._2
899899 }
900900
901901
902902 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
903903 then {
904904 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
905905 if ((threshold > balance_))
906906 then {
907907 let maxDeviation = (threshold - balance_)
908908 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
909909 if ((feeRate > feeMaxRate_))
910910 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
911911 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
912912 }
913913 else 0
914914 }
915915 else {
916916 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
917917 if ((balance_ > threshold))
918918 then {
919919 let maxDeviation = (balance_ - threshold)
920920 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
921921 if ((feeRate > feeMaxRate_))
922922 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
923923 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
924924 }
925925 else 0
926926 }
927927
928928
929929 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
930930 func foldFunc (acc,balance) = {
931931 let index = acc._1
932932 let equilibrium = fraction(assetsTotalSupply_, weights_[index], sigmaWeight_)
933933 $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
934934 }
935935
936936 let result = {
937937 let $l = balances_
938938 let $s = size($l)
939939 let $acc0 = $Tuple2(0, 0)
940940 func $f0_1 ($a,$i) = if (($i >= $s))
941941 then $a
942942 else foldFunc($a, $l[$i])
943943
944944 func $f0_2 ($a,$i) = if (($i >= $s))
945945 then $a
946946 else throw("List size exceeds 10")
947947
948948 $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)
949949 }
950950 result._2
951951 }
952952
953953
954954 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
955955 then true
956956 else (lpTotalSupply_ == 0))
957957 then true
958958 else {
959959 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
960960 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
961961 let diff = (newAssetsRate - prevAssetsRate)
962962 if (if ((0 >= diff))
963963 then ((-1 * RATE_FACTOR) > diff)
964964 else false)
965965 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
966966 else true
967967 }
968968
969969
970970 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
971971 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
972972 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
973973 let diff = (newUtil - prevUtil)
974974 if (if ((0 >= diff))
975975 then ((-1 * RATE_FACTOR) > diff)
976976 else false)
977977 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
978978 else true
979979 }
980980
981981
982982 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
983983 let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
984984 let maxAllocationAmp = if ((balance_ > equilibrium))
985985 then (MAX_AMPLIFIER + maxAllocAmp_)
986986 else (MAX_AMPLIFIER - maxAllocAmp_)
987987 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
988988 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
989989 if ((balance_ > equilibrium))
990990 then if ((balance_ > maxAllocation))
991991 then if ((prevMaxAllocation > prevBalance_))
992992 then throw("_validateAssetAllocation: new up")
993993 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
994994 then throw("_validateAssetAllocation: still up")
995995 else true
996996 else true
997997 else if ((maxAllocation > balance_))
998998 then if ((prevBalance_ > prevMaxAllocation))
999999 then throw("_validateAssetAllocation: new down")
10001000 else if (((prevMaxAllocation - prevBalance_) > (maxAllocation - balance_)))
10011001 then throw("_validateAssetAllocation: still down")
10021002 else true
10031003 else true
10041004 }
10051005
10061006
10071007 func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
10081008 func foldFunc (acc,elem) = {
10091009 let index = acc._1
10101010 $Tuple2((index + 1), if (acc._2)
10111011 then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
10121012 else false)
10131013 }
10141014
10151015 let result = {
10161016 let $l = assetBalances_
10171017 let $s = size($l)
10181018 let $acc0 = $Tuple2(0, true)
10191019 func $f0_1 ($a,$i) = if (($i >= $s))
10201020 then $a
10211021 else foldFunc($a, $l[$i])
10221022
10231023 func $f0_2 ($a,$i) = if (($i >= $s))
10241024 then $a
10251025 else throw("List size exceeds 10")
10261026
10271027 $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)
10281028 }
10291029 result._2
10301030 }
10311031
10321032
10331033 func _checkpoint (user_) = {
10341034 let userLp = _loadUserLp(user_)
10351035 let userProfits = _loadUserProfits(user_)
10361036 let sigmaFeePerLp = _loadSigmaFeePerLp()
10371037 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10381038 func foldFunc (acc,elem) = {
10391039 let index = acc._1
10401040 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10411041 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10421042 }
10431043
10441044 let $t02458924662 = {
10451045 let $l = ZERO_INT_LIST_11
10461046 let $s = size($l)
10471047 let $acc0 = $Tuple2(0, nil)
10481048 func $f0_1 ($a,$i) = if (($i >= $s))
10491049 then $a
10501050 else foldFunc($a, $l[$i])
10511051
10521052 func $f0_2 ($a,$i) = if (($i >= $s))
10531053 then $a
10541054 else throw("List size exceeds 11")
10551055
10561056 $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)
10571057 }
10581058 let idx = $t02458924662._1
10591059 let profitsUpdated = $t02458924662._2
10601060 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10611061 }
10621062
10631063
10641064 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10651065 func foldFunc (acc,elem) = {
10661066 let index = acc._1
10671067 let sigmaFeePerLpUpdated = if ((index_ == index))
10681068 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10691069 else sigmaFeePerLp_[index]
10701070 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10711071 }
10721072
10731073 let $t02531225391 = {
10741074 let $l = ZERO_INT_LIST_11
10751075 let $s = size($l)
10761076 let $acc0 = $Tuple2(0, nil)
10771077 func $f0_1 ($a,$i) = if (($i >= $s))
10781078 then $a
10791079 else foldFunc($a, $l[$i])
10801080
10811081 func $f0_2 ($a,$i) = if (($i >= $s))
10821082 then $a
10831083 else throw("List size exceeds 11")
10841084
10851085 $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)
10861086 }
10871087 let idx = $t02531225391._1
10881088 let sigmaFeePerLpUpdated = $t02531225391._2
10891089 sigmaFeePerLpUpdated
10901090 }
10911091
10921092
10931093 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10941094 let sigmaFeePerLp = _loadSigmaFeePerLp()
10951095 let totalLp = _loadTotalLp()
10961096 let $t02561225887 = if ((totalLp == 0))
10971097 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10981098 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
10991099 let lpFee = $t02561225887._1
11001100 let protocolFee = $t02561225887._2
11011101 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11021102 then sigmaFeePerLp
11031103 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11041104 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11051105 }
11061106
11071107
11081108 func _depositAll (amount_) = {
11091109 let storage = _loadStorage()
11101110 let lpTotalSupply = storage._3
11111111 let weightAmplifier = storage._7
11121112 let slippageRate = storage._8
11131113 let feeMaxRate = storage._9
11141114 let assets = _loadAssets()
11151115 let $t02639626449 = _loadAssetWeights()
11161116 let assetWeights = $t02639626449._1
11171117 let sigmaWeight = $t02639626449._2
11181118 let $t02645426522 = _loadAssetBalances()
11191119 let prevAssetBalances = $t02645426522._1
11201120 let prevAssetTotalSupply = $t02645426522._2
11211121 let $t02652827758 = if ((prevAssetTotalSupply == 0))
11221122 then {
11231123 func foldFunc (acc,elem) = {
11241124 let index = acc._1
11251125 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11261126 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11271127 }
11281128
11291129 let $t02697027044 = {
11301130 let $l = assets
11311131 let $s = size($l)
11321132 let $acc0 = $Tuple2(0, nil)
11331133 func $f0_1 ($a,$i) = if (($i >= $s))
11341134 then $a
11351135 else foldFunc($a, $l[$i])
11361136
11371137 func $f0_2 ($a,$i) = if (($i >= $s))
11381138 then $a
11391139 else throw("List size exceeds 10")
11401140
11411141 $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)
11421142 }
11431143 let idx = $t02697027044._1
11441144 let requiredAmountsNormalized = $t02697027044._2
11451145 $Tuple2(amount_, requiredAmountsNormalized)
11461146 }
11471147 else {
11481148 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11491149 func foldFunc1 (acc,elem) = {
11501150 let index = acc._1
11511151 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11521152 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531153 }
11541154
11551155 let $t02758727662 = {
11561156 let $l = assets
11571157 let $s = size($l)
11581158 let $acc0 = $Tuple2(0, nil)
11591159 func $f0_1 ($a,$i) = if (($i >= $s))
11601160 then $a
11611161 else foldFunc1($a, $l[$i])
11621162
11631163 func $f0_2 ($a,$i) = if (($i >= $s))
11641164 then $a
11651165 else throw("List size exceeds 10")
11661166
11671167 $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)
11681168 }
11691169 let idx = $t02758727662._1
11701170 let requiredAmountsNormalized = $t02758727662._2
11711171 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11721172 }
11731173 let lpTokensToMint = $t02652827758._1
11741174 let requiredAmountsNormalized = $t02652827758._2
11751175 let $t02776427877 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
11761176 let assetBalances = $t02776427877._1
11771177 let assetTotalSupply = $t02776427877._2
11781178 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791179 if ((err2 == err2))
11801180 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11811181 else throw("Strict value is not equal to itself.")
11821182 }
11831183
11841184
11851185 func _deposit (assetId_,amount_) = {
11861186 let storage = _loadStorage()
11871187 let lpTotalSupply = storage._3
11881188 let maxAllocAmplifier = storage._6
11891189 let weightAmplifier = storage._7
11901190 let slippageRate = storage._8
11911191 let feeMaxRate = storage._9
11921192 let assets = _loadAssets()
11931193 let $t02857228625 = _loadAssetWeights()
11941194 let assetWeights = $t02857228625._1
11951195 let sigmaWeight = $t02857228625._2
11961196 let $t02863028744 = _loadAssetBalances()
11971197 let prevAssetBalances = $t02863028744._1
11981198 let prevAssetTotalSupply = $t02863028744._2
11991199 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12001200 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12011201 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12021202 if ((err2 == err2))
12031203 then {
12041204 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12051205 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12061206 let lpTokensToMint = if ((lpTotalSupply == 0))
12071207 then (assetTotalSupply - fee)
12081208 else {
12091209 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12101210 let feeDiff = (fee - prevFee)
12111211 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12121212 let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
12131213 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12141214 if ((err3 == err3))
12151215 then lpTokensToMintInner
12161216 else throw("Strict value is not equal to itself.")
12171217 }
12181218 $Tuple2(lpTokensToMint, assetBalances)
12191219 }
12201220 else throw("Strict value is not equal to itself.")
12211221 }
12221222
12231223
12241224 func _withdrawAll (amount_) = {
12251225 let storage = _loadStorage()
12261226 let lpTotalSupply = storage._3
12271227 let lpFeeRate = storage._4
12281228 let protocolFeeRate = storage._5
12291229 let maxAllocAmplifier = storage._6
12301230 let weightAmplifier = storage._7
12311231 let slippageRate = storage._8
12321232 let feeMaxRate = storage._9
12331233 let $t03067130739 = _loadAssetBalances()
12341234 let prevAssetBalances = $t03067130739._1
12351235 let prevAssetTotalSupply = $t03067130739._2
12361236 let $t03074430797 = _loadAssetWeights()
12371237 let assetWeights = $t03074430797._1
12381238 let sigmaWeight = $t03074430797._2
12391239 let $t03080330919 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate)
12401240 let lpFee = $t03080330919._1
12411241 let protocolFee = $t03080330919._2
12421242 let sigmaFeePerLpUpdated = $t03080330919._3
12431243 let lpTokensToBurn = ((amount_ - lpFee) - protocolFee)
12441244 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12451245 if ((err == err))
12461246 then {
12471247 let $t03108231215 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
12481248 let assetBalances = $t03108231215._1
12491249 let assetTotalSupply = $t03108231215._2
12501250 let balancesToPay = $t03108231215._3
12511251 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12521252 if ((err2 == err2))
12531253 then $Tuple6(lpTokensToBurn, balancesToPay, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12541254 else throw("Strict value is not equal to itself.")
12551255 }
12561256 else throw("Strict value is not equal to itself.")
12571257 }
12581258
12591259
12601260 func _withdraw (assetId_,lpAmount_) = {
12611261 let storage = _loadStorage()
12621262 let lpTotalSupply = storage._3
12631263 let lpFeeRate = storage._4
12641264 let protocolFeeRate = storage._5
12651265 let maxAllocAmplifier = storage._6
12661266 let weightAmplifier = storage._7
12671267 let slippageRate = storage._8
12681268 let feeMaxRate = storage._9
12691269 let precision = _loadPrecision()
12701270 let assets = _loadAssets()
12711271 let $t03204932117 = _loadAssetBalances()
12721272 let prevAssetBalances = $t03204932117._1
12731273 let prevAssetTotalSupply = $t03204932117._2
12741274 let $t03212232175 = _loadAssetWeights()
12751275 let assetWeights = $t03212232175._1
12761276 let sigmaWeight = $t03212232175._2
12771277 let targetAssetIndex = value(indexOf(assets, assetId_))
12781278 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12791279 let prevUtilValue = (prevAssetTotalSupply - prevFee)
1280+ let k = fraction(toBigInt(lpTotalSupply), PERCENT_FACTOR, toBigInt((lpTotalSupply - lpAmount_)))
1281+ let prevUtilValueWithK = toInt(((toBigInt(prevUtilValue) / k) / PERCENT_FACTOR))
12801282 func foldFunc (acc,elem) = if (acc._1)
12811283 then acc
12821284 else {
12831285 let startInner = acc._2
12841286 let stopInner = acc._3
12851287 let currentAmount = ((stopInner + startInner) / 2)
12861288 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12871289 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12881290 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1289- if (if ((precision > (utilValue - prevUtilValue)))
1290- then ((utilValue - prevUtilValue) > 0)
1291+ if (if ((precision > (utilValue - prevUtilValueWithK)))
1292+ then ((utilValue - prevUtilValueWithK) > 0)
12911293 else false)
12921294 then $Tuple4(true, startInner, stopInner, currentAmount)
12931295 else if ((0 > (utilValue - prevUtilValue)))
12941296 then $Tuple4(false, startInner, currentAmount, 0)
12951297 else $Tuple4(false, currentAmount, stopInner, 0)
12961298 }
12971299
12981300 let targetAmount = {
12991301 let targetAmount = lpAmount_
13001302 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13011303 let tempAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13021304 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13031305 let feeDiff = (fee - prevFee)
13041306 if ((feeDiff == 0))
13051307 then targetAmount
13061308 else {
1307- let $t03394534060 = {
1309+ let $t03414434259 = {
13081310 let $l = LIST_64
13091311 let $s = size($l)
13101312 let $acc0 = $Tuple4(false, 0, (lpAmount_ + prevFee), 0)
13111313 func $f0_1 ($a,$i) = if (($i >= $s))
13121314 then $a
13131315 else foldFunc($a, $l[$i])
13141316
13151317 func $f0_2 ($a,$i) = if (($i >= $s))
13161318 then $a
13171319 else throw("List size exceeds 64")
13181320
13191321 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
13201322 }
1321- let success = $t03394534060._1
1322- let startOut = $t03394534060._2
1323- let stopOut = $t03394534060._3
1324- let targetAmountOut = $t03394534060._4
1323+ let success = $t03414434259._1
1324+ let startOut = $t03414434259._2
1325+ let stopOut = $t03414434259._3
1326+ let targetAmountOut = $t03414434259._4
13251327 if (!(success))
13261328 then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
13271329 else targetAmountOut
13281330 }
13291331 }
13301332 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13311333 let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13321334 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
13331335 then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13341336 else false
13351337 if ((err1 == err1))
13361338 then {
1337- let $t03494735087 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, lpFeeRate, protocolFeeRate)
1338- let lpFee = $t03494735087._1
1339- let protocolFee = $t03494735087._2
1340- let sigmaFeePerLpUpdated = $t03494735087._3
1339+ let $t03514635286 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, lpFeeRate, protocolFeeRate)
1340+ let lpFee = $t03514635286._1
1341+ let protocolFee = $t03514635286._2
1342+ let sigmaFeePerLpUpdated = $t03514635286._3
13411343 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13421344 }
13431345 else throw("Strict value is not equal to itself.")
13441346 }
13451347
13461348
13471349 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13481350 let storage = _loadStorage()
13491351 let lpAssetId = storage._1
13501352 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13511353 let lpTotalSupply = storage._3
13521354 let lpFeeRate = storage._4
13531355 let protocolFeeRate = storage._5
13541356 let maxAllocAmplifier = storage._6
13551357 let weightAmplifier = storage._7
13561358 let slippageRate = storage._8
13571359 let feeMaxRate = storage._9
13581360 let precision = _loadPrecision()
1359- let $t03566935737 = _loadAssetBalances()
1360- let prevAssetBalances = $t03566935737._1
1361- let prevAssetTotalSupply = $t03566935737._2
1362- let $t03574235795 = _loadAssetWeights()
1363- let assetWeights = $t03574235795._1
1364- let sigmaWeight = $t03574235795._2
1361+ let $t03586835936 = _loadAssetBalances()
1362+ let prevAssetBalances = $t03586835936._1
1363+ let prevAssetTotalSupply = $t03586835936._2
1364+ let $t03594135994 = _loadAssetWeights()
1365+ let assetWeights = $t03594135994._1
1366+ let sigmaWeight = $t03594135994._2
13651367 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13661368 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13671369 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13681370 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13691371 func foldFunc (acc,elem) = if (acc._1)
13701372 then acc
13711373 else {
13721374 let startInner = acc._2
13731375 let stopInner = acc._3
13741376 let currentAmount = ((stopInner + startInner) / 2)
13751377 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13761378 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13771379 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
13781380 if (if ((precision > (utilValue - prevUtilValue)))
13791381 then ((utilValue - prevUtilValue) > 0)
13801382 else false)
13811383 then $Tuple4(true, startInner, stopInner, currentAmount)
13821384 else if ((0 > (utilValue - prevUtilValue)))
13831385 then $Tuple4(false, startInner, currentAmount, 0)
13841386 else $Tuple4(false, currentAmount, stopInner, 0)
13851387 }
13861388
13871389 let targetAmount = {
13881390 let targetAmount = sourceAmount_
13891391 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
13901392 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
13911393 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13921394 let feeDiff = (fee - prevFee)
13931395 if ((feeDiff == 0))
13941396 then targetAmount
13951397 else {
1396- let $t03766137780 = {
1398+ let $t03786037979 = {
13971399 let $l = LIST_64
13981400 let $s = size($l)
13991401 let $acc0 = $Tuple4(false, 0, (sourceAmount_ + prevFee), 0)
14001402 func $f0_1 ($a,$i) = if (($i >= $s))
14011403 then $a
14021404 else foldFunc($a, $l[$i])
14031405
14041406 func $f0_2 ($a,$i) = if (($i >= $s))
14051407 then $a
14061408 else throw("List size exceeds 64")
14071409
14081410 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
14091411 }
1410- let success = $t03766137780._1
1411- let startOut = $t03766137780._2
1412- let stopOut = $t03766137780._3
1413- let targetAmountOut = $t03766137780._4
1412+ let success = $t03786037979._1
1413+ let startOut = $t03786037979._2
1414+ let stopOut = $t03786037979._3
1415+ let targetAmountOut = $t03786037979._4
14141416 if (!(success))
14151417 then throw(("_swap: can't calculate targetAmount=" + toString(targetAmountOut)))
14161418 else targetAmountOut
14171419 }
14181420 }
14191421 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14201422 let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
14211423 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
14221424 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14231425 else false
14241426 if ((err1 == err1))
14251427 then {
1426- let $t03859338734 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1427- let lpFee = $t03859338734._1
1428- let protocolFee = $t03859338734._2
1429- let sigmaFeePerLpUpdated = $t03859338734._3
1428+ let $t03879238933 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1429+ let lpFee = $t03879238933._1
1430+ let protocolFee = $t03879238933._2
1431+ let sigmaFeePerLpUpdated = $t03879238933._3
14301432 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14311433 }
14321434 else throw("Strict value is not equal to itself.")
14331435 }
14341436
14351437
14361438 @Callable(i)
14371439 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_) = {
14381440 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14391441 then _whenNotInitialized()
14401442 else false)
14411443 then _whenMultisigSet()
14421444 else false)
14431445 then _validateAssets(assets_, "init: invalid assets")
14441446 else false)
14451447 then _validateIntList(assetWeights_, 0, MAX_WEIGHT, "init: invalid assetWeights")
14461448 else false)
14471449 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14481450 else false)
14491451 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14501452 else false)
14511453 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14521454 else false)
14531455 then _validateTokenName(lpTokenName_, "init: invalid name")
14541456 else false)
14551457 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14561458 else false)
14571459 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14581460 else false)
14591461 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
14601462 else false)
14611463 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14621464 else false)
14631465 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14641466 else false)
14651467 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14661468 else false)
14671469 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14681470 else false)
14691471 then _validateInt(precision_, 0, MAX_INT, "init: invalid precision")
14701472 else false
14711473 if ((err == err))
14721474 then {
1473- let $t04051540584 = _prepareAssetWeights(assetWeights_)
1474- let assetWeights = $t04051540584._1
1475- let sigmaWeight = $t04051540584._2
1475+ let $t04071440783 = _prepareAssetWeights(assetWeights_)
1476+ let assetWeights = $t04071440783._1
1477+ let sigmaWeight = $t04071440783._2
14761478 let assetBalances = _prepareAssetBalances(assets_)
14771479 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14781480 let lpAssetId = calculateAssetId(issue)
14791481 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
14801482 $Tuple2((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())), unit)
14811483 }
14821484 else throw("Strict value is not equal to itself.")
14831485 }
14841486
14851487
14861488
14871489 @Callable(i)
14881490 func depositAll (amount_) = {
14891491 let err = if (if (_whenInitialized())
14901492 then _whenNotPaused()
14911493 else false)
14921494 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14931495 else false
14941496 if ((err == err))
14951497 then {
14961498 let storage = _loadStorage()
14971499 let lpAssetId = storage._1
14981500 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14991501 let assets = _loadAssets()
1500- let $t04227742362 = _depositAll(amount_)
1501- let lpTokensToMint = $t04227742362._1
1502- let requiredAmountsNormalized = $t04227742362._2
1503- let assetBalances = $t04227742362._3
1502+ let $t04247642561 = _depositAll(amount_)
1503+ let lpTokensToMint = $t04247642561._1
1504+ let requiredAmountsNormalized = $t04247642561._2
1505+ let assetBalances = $t04247642561._3
15041506 func foldFunc (acc,elem) = {
15051507 let index = acc._1
15061508 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15071509 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15081510 let requiredAmountNormalized = requiredAmountsNormalized[index]
15091511 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
15101512 let err1 = if ((paymentAssetStr != elem))
15111513 then throw(("depositAll: invalid payment: index=" + toString(index)))
15121514 else if ((0 >= requiredAmount))
15131515 then throw("depositAll: too little amount required")
15141516 else unit
15151517 if ((err1 == err1))
15161518 then {
15171519 let change = if ((i.payments[index].amount > requiredAmount))
15181520 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15191521 else if ((requiredAmount > i.payments[index].amount))
15201522 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15211523 else nil
15221524 $Tuple2((index + 1), (acc._2 ++ change))
15231525 }
15241526 else throw("Strict value is not equal to itself.")
15251527 }
15261528
1527- let $t04350543567 = {
1529+ let $t04370443766 = {
15281530 let $l = assets
15291531 let $s = size($l)
15301532 let $acc0 = $Tuple2(0, nil)
15311533 func $f0_1 ($a,$i) = if (($i >= $s))
15321534 then $a
15331535 else foldFunc($a, $l[$i])
15341536
15351537 func $f0_2 ($a,$i) = if (($i >= $s))
15361538 then $a
15371539 else throw("List size exceeds 10")
15381540
15391541 $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)
15401542 }
1541- let idx = $t04350543567._1
1542- let changeActions = $t04350543567._2
1543+ let idx = $t04370443766._1
1544+ let changeActions = $t04370443766._2
15431545 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15441546 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15451547 }
15461548 else throw("Strict value is not equal to itself.")
15471549 }
15481550
15491551
15501552
15511553 @Callable(i)
15521554 func deposit (minLpAmount_) = {
15531555 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15541556 if ((err == err))
15551557 then {
15561558 let storage = _loadStorage()
15571559 let lpAssetId = storage._1
15581560 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15591561 let err1 = if (if (if (if (_whenInitialized())
15601562 then _whenNotPaused()
15611563 else false)
15621564 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15631565 else false)
15641566 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15651567 else false)
15661568 then _validateInt(i.payments[0].amount, 0, MAX_INT, "deposit: invalid payment amount")
15671569 else false
15681570 if ((err1 == err1))
15691571 then {
15701572 let assetStr = _assetToStr(i.payments[0].assetId)
15711573 let assetDecimals = _getDecimals(assetStr)
15721574 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1573- let $t04494645020 = _deposit(assetStr, amountNormalized)
1574- let lpTokensToMint = $t04494645020._1
1575- let assetBalances = $t04494645020._2
1575+ let $t04514545219 = _deposit(assetStr, amountNormalized)
1576+ let lpTokensToMint = $t04514545219._1
1577+ let assetBalances = $t04514545219._2
15761578 let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
15771579 if ((err2 == err2))
15781580 then {
15791581 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15801582 $Tuple2((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
15811583 }
15821584 else throw("Strict value is not equal to itself.")
15831585 }
15841586 else throw("Strict value is not equal to itself.")
15851587 }
15861588 else throw("Strict value is not equal to itself.")
15871589 }
15881590
15891591
15901592
15911593 @Callable(i)
15921594 func withdrawAll () = {
15931595 let storage = _loadStorage()
15941596 let lpAssetId = storage._1
15951597 let lpAssetIdStr = toBase58String(lpAssetId)
15961598 let lpDecimals = _getDecimals(lpAssetIdStr)
15971599 let assets = _loadAssets()
15981600 let err = if (if (if (if (_whenInitialized())
15991601 then _whenNotPaused()
16001602 else false)
16011603 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
16021604 else false)
16031605 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16041606 else false)
16051607 then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdrawAll: invalid payment amount")
16061608 else false
16071609 if ((err == err))
16081610 then {
1609- let $t04624146370 = _withdrawAll(i.payments[0].amount)
1610- let lpTokensToBurn = $t04624146370._1
1611- let balancesToPay = $t04624146370._2
1612- let assetBalances = $t04624146370._3
1613- let lpFee = $t04624146370._4
1614- let protocolFee = $t04624146370._5
1615- let sigmaFeePerLpUpdated = $t04624146370._6
1611+ let $t04644046569 = _withdrawAll(i.payments[0].amount)
1612+ let lpTokensToBurn = $t04644046569._1
1613+ let balancesToPay = $t04644046569._2
1614+ let assetBalances = $t04644046569._3
1615+ let lpFee = $t04644046569._4
1616+ let protocolFee = $t04644046569._5
1617+ let sigmaFeePerLpUpdated = $t04644046569._6
16161618 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16171619 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16181620 $Tuple2((((((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16191621 }
16201622 else throw("Strict value is not equal to itself.")
16211623 }
16221624
16231625
16241626
16251627 @Callable(i)
16261628 func withdraw (assetId_,minAmount_) = {
16271629 let storage = _loadStorage()
16281630 let lpAssetId = storage._1
16291631 let lpAssetIdStr = toBase58String(lpAssetId)
16301632 let lpDecimals = _getDecimals(lpAssetIdStr)
16311633 let assets = _loadAssets()
16321634 let err = if (if (if (if (if (if (_whenInitialized())
16331635 then _whenNotPaused()
16341636 else false)
16351637 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16361638 else false)
16371639 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16381640 else false)
16391641 then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdraw: invalid payment amount")
16401642 else false)
16411643 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16421644 else false)
16431645 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16441646 else false
16451647 if ((err == err))
16461648 then {
1647- let $t04790648040 = _withdraw(assetId_, i.payments[0].amount)
1648- let targetAmountNormalized = $t04790648040._1
1649- let finalAssetBalances = $t04790648040._2
1650- let lpFee = $t04790648040._3
1651- let protocolFee = $t04790648040._4
1652- let sigmaFeePerLpUpdated = $t04790648040._5
1649+ let $t04810548239 = _withdraw(assetId_, i.payments[0].amount)
1650+ let targetAmountNormalized = $t04810548239._1
1651+ let finalAssetBalances = $t04810548239._2
1652+ let lpFee = $t04810548239._3
1653+ let protocolFee = $t04810548239._4
1654+ let sigmaFeePerLpUpdated = $t04810548239._5
16531655 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16541656 let targetDecimals = _getDecimals(assetId_)
16551657 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16561658 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: insufficient final amount")
16571659 if ((err1 == err1))
16581660 then {
16591661 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)
16601662 $Tuple2(((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16611663 }
16621664 else throw("Strict value is not equal to itself.")
16631665 }
16641666 else throw("Strict value is not equal to itself.")
16651667 }
16661668
16671669
16681670
16691671 @Callable(i)
16701672 func swap (targetAssetId_,minAmount_) = {
16711673 let storage = _loadStorage()
16721674 let lpAssetId = storage._1
16731675 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16741676 let assets = _loadAssets()
16751677 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16761678 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16771679 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16781680 if ((sourceAssetIndex == sourceAssetIndex))
16791681 then {
16801682 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16811683 if ((targetAssetIndex == targetAssetIndex))
16821684 then {
16831685 let err = if (if (if (if (if (_whenInitialized())
16841686 then _whenNotPaused()
16851687 else false)
16861688 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16871689 else false)
16881690 then _validateInt(sourceAmountNormalized, 0, MAX_INT, "swap: invalid source amount")
16891691 else false)
16901692 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16911693 else false)
16921694 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16931695 else false
16941696 if ((err == err))
16951697 then {
1696- let $t05013750295 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1697- let targetAmountNormalized = $t05013750295._1
1698- let finalAssetBalances = $t05013750295._2
1699- let lpFee = $t05013750295._3
1700- let protocolFee = $t05013750295._4
1701- let sigmaFeePerLpUpdated = $t05013750295._5
1698+ let $t05033650494 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1699+ let targetAmountNormalized = $t05033650494._1
1700+ let finalAssetBalances = $t05033650494._2
1701+ let lpFee = $t05033650494._3
1702+ let protocolFee = $t05033650494._4
1703+ let sigmaFeePerLpUpdated = $t05033650494._5
17021704 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17031705 let targetDecimals = _getDecimals(targetAssetId_)
17041706 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17051707 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: insufficient final amount")
17061708 if ((err1 == err1))
17071709 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17081710 else throw("Strict value is not equal to itself.")
17091711 }
17101712 else throw("Strict value is not equal to itself.")
17111713 }
17121714 else throw("Strict value is not equal to itself.")
17131715 }
17141716 else throw("Strict value is not equal to itself.")
17151717 }
17161718
17171719
17181720
17191721 @Callable(i)
17201722 func getDepositAll (lpAmount_) = {
17211723 let err = _validateInt(lpAmount_, 0, MAX_INT, "getDepositAll: invalid amount")
17221724 if ((err == err))
17231725 then {
1724- let $t05142751514 = _depositAll(lpAmount_)
1725- let lpTokensToMint = $t05142751514._1
1726- let requiredAmountsNormalized = $t05142751514._2
1727- let assetBalances = $t05142751514._3
1726+ let $t05162651713 = _depositAll(lpAmount_)
1727+ let lpTokensToMint = $t05162651713._1
1728+ let requiredAmountsNormalized = $t05162651713._2
1729+ let assetBalances = $t05162651713._3
17281730 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17291731 }
17301732 else throw("Strict value is not equal to itself.")
17311733 }
17321734
17331735
17341736
17351737 @Callable(i)
17361738 func getDeposit (assetId_,amount_) = {
17371739 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17381740 then _validateInt(amount_, 0, MAX_INT, "getDeposit: invalid amount")
17391741 else false
17401742 if ((err == err))
17411743 then {
17421744 let storage = _loadStorage()
17431745 let lpAssetId = storage._1
17441746 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17451747 let assetDecimals = _getDecimals(assetId_)
17461748 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1747- let $t05227352347 = _deposit(assetId_, amountNormalized)
1748- let lpTokensToMint = $t05227352347._1
1749- let assetBalances = $t05227352347._2
1749+ let $t05247252546 = _deposit(assetId_, amountNormalized)
1750+ let lpTokensToMint = $t05247252546._1
1751+ let assetBalances = $t05247252546._2
17501752 $Tuple2(nil, lpTokensToMint)
17511753 }
17521754 else throw("Strict value is not equal to itself.")
17531755 }
17541756
17551757
17561758
17571759 @Callable(i)
17581760 func getWithdrawAll (lpAmount_) = {
17591761 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17601762 if ((err == err))
17611763 then {
1762- let $t05272452842 = _withdrawAll(lpAmount_)
1763- let lpTokensToBurn = $t05272452842._1
1764- let balancesToGet = $t05272452842._2
1765- let assetBalances = $t05272452842._3
1766- let lpFee = $t05272452842._4
1767- let protocolFee = $t05272452842._5
1768- let sigmaFeePerLpUpdated = $t05272452842._6
1764+ let $t05292353041 = _withdrawAll(lpAmount_)
1765+ let lpTokensToBurn = $t05292353041._1
1766+ let balancesToGet = $t05292353041._2
1767+ let assetBalances = $t05292353041._3
1768+ let lpFee = $t05292353041._4
1769+ let protocolFee = $t05292353041._5
1770+ let sigmaFeePerLpUpdated = $t05292353041._6
17691771 $Tuple2(nil, balancesToGet)
17701772 }
17711773 else throw("Strict value is not equal to itself.")
17721774 }
17731775
17741776
17751777
17761778 @Callable(i)
17771779 func getWithdraw (assetId_,amount_) = {
17781780 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17791781 then _validateInt(amount_, 0, MAX_INT, "getWithdraw: invalid amount")
17801782 else false
17811783 if ((err == err))
17821784 then {
17831785 let storage = _loadStorage()
17841786 let lpAssetId = storage._1
17851787 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1786- let $t05349353609 = _withdraw(assetId_, amount_)
1787- let targetAmountNormalized = $t05349353609._1
1788- let assetBalances = $t05349353609._2
1789- let lpFee = $t05349353609._3
1790- let protocolFee = $t05349353609._4
1791- let sigmaFeePerLpUpdated = $t05349353609._5
1788+ let $t05369253808 = _withdraw(assetId_, amount_)
1789+ let targetAmountNormalized = $t05369253808._1
1790+ let assetBalances = $t05369253808._2
1791+ let lpFee = $t05369253808._3
1792+ let protocolFee = $t05369253808._4
1793+ let sigmaFeePerLpUpdated = $t05369253808._5
17921794 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17931795 let targetDecimals = _getDecimals(assetId_)
17941796 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17951797 $Tuple2(nil, finalAmount)
17961798 }
17971799 else throw("Strict value is not equal to itself.")
17981800 }
17991801
18001802
18011803
18021804 @Callable(i)
18031805 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
18041806 let storage = _loadStorage()
18051807 let lpAssetId = storage._1
18061808 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
18071809 let assets = _loadAssets()
18081810 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
18091811 if ((sourceAssetIndex == sourceAssetIndex))
18101812 then {
18111813 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
18121814 if ((targetAssetIndex == targetAssetIndex))
18131815 then {
18141816 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
18151817 let err = if (_validateInt(sourceAmountNormalized, 0, MAX_INT, "swap: invalid source amount"))
18161818 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18171819 else false
18181820 if ((err == err))
18191821 then {
1820- let $t05502355181 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1821- let targetAmountNormalized = $t05502355181._1
1822- let finalAssetBalances = $t05502355181._2
1823- let lpFee = $t05502355181._3
1824- let protocolFee = $t05502355181._4
1825- let sigmaFeePerLpUpdated = $t05502355181._5
1822+ let $t05522255380 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823+ let targetAmountNormalized = $t05522255380._1
1824+ let finalAssetBalances = $t05522255380._2
1825+ let lpFee = $t05522255380._3
1826+ let protocolFee = $t05522255380._4
1827+ let sigmaFeePerLpUpdated = $t05522255380._5
18261828 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18271829 let targetDecimals = _getDecimals(targetAssetId_)
18281830 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18291831 $Tuple2(nil, finalAmount)
18301832 }
18311833 else throw("Strict value is not equal to itself.")
18321834 }
18331835 else throw("Strict value is not equal to itself.")
18341836 }
18351837 else throw("Strict value is not equal to itself.")
18361838 }
18371839
18381840
18391841
18401842 @Callable(i)
18411843 func getClaim (user_) = {
18421844 let user = if ((size(user_) > 0))
18431845 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18441846 else i.caller
1845- let $t05582355879 = _checkpoint(user)
1846- let checkpointActions = $t05582355879._1
1847- let userProfits = $t05582355879._2
1847+ let $t05602256078 = _checkpoint(user)
1848+ let checkpointActions = $t05602256078._1
1849+ let userProfits = $t05602256078._2
18481850 $Tuple2(nil, userProfits)
18491851 }
18501852
18511853
18521854
18531855 @Callable(i)
18541856 func getUtilFunc () = {
18551857 let storage = _loadStorage()
18561858 let lpTotalSupply = storage._3
18571859 let weightAmplifier = storage._7
18581860 let slippageRate = storage._8
18591861 let feeMaxRate = storage._9
1860- let $t05621256272 = _loadAssetBalances()
1861- let assetBalances = $t05621256272._1
1862- let assetTotalSupply = $t05621256272._2
1863- let $t05627756330 = _loadAssetWeights()
1864- let assetWeights = $t05627756330._1
1865- let sigmaWeight = $t05627756330._2
1862+ let $t05641156471 = _loadAssetBalances()
1863+ let assetBalances = $t05641156471._1
1864+ let assetTotalSupply = $t05641156471._2
1865+ let $t05647656529 = _loadAssetWeights()
1866+ let assetWeights = $t05647656529._1
1867+ let sigmaWeight = $t05647656529._2
18661868 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18671869 let utilValue = (assetTotalSupply - fee)
18681870 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18691871 }
18701872
18711873
18721874
18731875 @Callable(i)
18741876 func checkpoint (user_) = {
18751877 let err = if (_whenInitialized())
18761878 then _whenNotPaused()
18771879 else false
18781880 if ((err == err))
18791881 then {
18801882 let user = if ((size(user_) > 0))
18811883 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
18821884 else i.caller
18831885 _checkpoint(user)
18841886 }
18851887 else throw("Strict value is not equal to itself.")
18861888 }
18871889
18881890
18891891
18901892 @Callable(i)
18911893 func stake () = {
18921894 let err = if (_whenInitialized())
18931895 then _whenNotPaused()
18941896 else false
18951897 if ((err == err))
18961898 then {
18971899 let storage = _loadStorage()
18981900 let lpAssetIdStr = _assetToStr(storage._1)
18991901 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
19001902 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
19011903 else false)
19021904 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
19031905 else false
19041906 if ((err1 == err1))
19051907 then {
1906- let $t05740357463 = _checkpoint(i.caller)
1907- let checkpointActions = $t05740357463._1
1908- let userProfits = $t05740357463._2
1908+ let $t05760257662 = _checkpoint(i.caller)
1909+ let checkpointActions = $t05760257662._1
1910+ let userProfits = $t05760257662._2
19091911 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19101912 }
19111913 else throw("Strict value is not equal to itself.")
19121914 }
19131915 else throw("Strict value is not equal to itself.")
19141916 }
19151917
19161918
19171919
19181920 @Callable(i)
19191921 func unstake (amount_) = {
19201922 let err = if (_whenInitialized())
19211923 then _whenNotPaused()
19221924 else false
19231925 if ((err == err))
19241926 then {
19251927 let storage = _loadStorage()
19261928 let lpAssetId = storage._1
19271929 let userLp = _loadUserLp(i.caller)
19281930 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19291931 if ((err1 == err1))
19301932 then {
1931- let $t05797458034 = _checkpoint(i.caller)
1932- let checkpointActions = $t05797458034._1
1933- let userProfits = $t05797458034._2
1933+ let $t05817358233 = _checkpoint(i.caller)
1934+ let checkpointActions = $t05817358233._1
1935+ let userProfits = $t05817358233._2
19341936 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19351937 }
19361938 else throw("Strict value is not equal to itself.")
19371939 }
19381940 else throw("Strict value is not equal to itself.")
19391941 }
19401942
19411943
19421944
19431945 @Callable(i)
19441946 func claim (user_,assets_) = {
19451947 let err = if (if (_whenInitialized())
19461948 then _whenNotPaused()
19471949 else false)
19481950 then _validateInt(size(assets_), 1, 10, "claim: invalid assets size")
19491951 else false
19501952 if ((err == err))
19511953 then {
19521954 let user = if ((size(user_) > 0))
19531955 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19541956 else i.caller
19551957 let storage = _loadStorage()
19561958 let lpAssetId = storage._1
19571959 let lpAssetIdStr = _assetToStr(lpAssetId)
19581960 let assets = [lpAssetIdStr, _loadAssets()]
19591961 let maxIndex = (size(assets) - 1)
19601962 let userLp = _loadUserLp(user)
1961- let $t05885758913 = _checkpoint(user)
1962- let checkpointActions = $t05885758913._1
1963- let userProfits = $t05885758913._2
1963+ let $t05905659112 = _checkpoint(user)
1964+ let checkpointActions = $t05905659112._1
1965+ let userProfits = $t05905659112._2
19641966 func foldFunc (acc,profit) = {
19651967 let index = acc._1
19661968 if ((index > maxIndex))
19671969 then $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19681970 else {
19691971 let asset = assets[index]
19701972 if (containsElement(assets_, asset))
19711973 then $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19721974 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19731975 }
19741976 }
19751977
1976- let $t05940259493 = {
1978+ let $t05960159692 = {
19771979 let $l = userProfits
19781980 let $s = size($l)
19791981 let $acc0 = $Tuple3(0, nil, nil)
19801982 func $f0_1 ($a,$i) = if (($i >= $s))
19811983 then $a
19821984 else foldFunc($a, $l[$i])
19831985
19841986 func $f0_2 ($a,$i) = if (($i >= $s))
19851987 then $a
19861988 else throw("List size exceeds 11")
19871989
19881990 $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)
19891991 }
1990- let idx = $t05940259493._1
1991- let userProfitsUpdated = $t05940259493._2
1992- let profitActions = $t05940259493._3
1992+ let idx = $t05960159692._1
1993+ let userProfitsUpdated = $t05960159692._2
1994+ let profitActions = $t05960159692._3
19931995 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19941996 }
19951997 else throw("Strict value is not equal to itself.")
19961998 }
19971999
19982000
19992001
20002002 @Callable(i)
20012003 func pause () = {
20022004 let err = if (if (_onlyPauser(i.caller))
20032005 then _whenInitialized()
20042006 else false)
20052007 then _whenNotPaused()
20062008 else false
20072009 if ((err == err))
20082010 then $Tuple2(_savePause(true), unit)
20092011 else throw("Strict value is not equal to itself.")
20102012 }
20112013
20122014
20132015
20142016 @Callable(i)
20152017 func unpause () = {
20162018 let err = if (if (_onlyPauser(i.caller))
20172019 then _whenInitialized()
20182020 else false)
20192021 then _whenPaused()
20202022 else false
20212023 if ((err == err))
20222024 then $Tuple2(_savePause(false), unit)
20232025 else throw("Strict value is not equal to itself.")
20242026 }
20252027
20262028
20272029
20282030 @Callable(i)
20292031 func updatePauser (pauser_) = {
20302032 let err = if (if (_onlyThisContract(i.caller))
20312033 then _whenInitialized()
20322034 else false)
20332035 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20342036 else false
20352037 if ((err == err))
20362038 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20372039 else throw("Strict value is not equal to itself.")
20382040 }
20392041
20402042
20412043
20422044 @Callable(i)
20432045 func setMultisig (multisig_) = {
20442046 let err = if (_onlyThisContract(i.caller))
20452047 then _validateAddress(multisig_, "setMultisig: invalid multisig")
20462048 else false
20472049 if ((err == err))
20482050 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
20492051 else throw("Strict value is not equal to itself.")
20502052 }
20512053
20522054
20532055 @Verifier(tx)
20542056 func verify () = match getString(KEY_MULTISIG) {
20552057 case multisig: String =>
20562058 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
20572059 case _ =>
20582060 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
20592061 }
20602062

github/deemru/w8io/3ef1775 
268.37 ms