tx · FDNWC3xdp9CGzczkrQiMFpg6Jy1pEMXFzadPTwvtXEYm

3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt:  -0.05300000 Waves

2023.07.28 14:46 [2685673] smart account 3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt > SELF 0.00000000 Waves

{ "type": 13, "id": "FDNWC3xdp9CGzczkrQiMFpg6Jy1pEMXFzadPTwvtXEYm", "fee": 5300000, "feeAssetId": null, "timestamp": 1690544642909, "version": 2, "chainId": 84, "sender": "3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt", "senderPublicKey": "3fNYAZ872D7hsaic3sPDZd5uAk59U5CiWiA153FUZ6Qv", "proofs": [ "41ofsnX3uupfoWgS5dVnifukUdDCwMxfdkwjekDA6YDNEG6x4jyiwqT4khuWZQtEPdLYzGvxQ9b5eENVehvZ5sfW" ], "script": "base64:BgJnCAISDgoMGBgBAQgIAQEBAQEIEgMKAQESAwoBARIAEgQKAggBEgQKAggBEgMKAQESBAoCCAESAwoBARIECgIIARIFCgMICAESAwoBCBIDCgEIEgASAwoBARIECgIIGBIAEgASAwoBCHEAA1NFUAICX18ABVdBVkVTAgV3YXZlcwAHTUFYX0lOVAD//////////38AB01BWF9GRUUAwIQ9AA1NQVhfQU1QTElGSUVSAMCEPQAUTUFYX1dFSUdIVF9BTVBMSUZJRVIAwIQ9AApNQVhfV0VJR0hUAMCEPQAUU0xJUFBBR0VfUkFURV9GQUNUT1IAwIQ9AA9GRUVfUkFURV9GQUNUT1IAwIQ9AAtSQVRFX0ZBQ1RPUgDAhD0ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgKCUpY0dABBaRVJPX0lOVF9MSVNUXzEwCQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAUDbmlsABBaRVJPX0lOVF9MSVNUXzExCQDNCAIFEFpFUk9fSU5UX0xJU1RfMTAAAAALWkVST19CSUdJTlQJALYCAQAAABNaRVJPX0JJR0lOVF9MSVNUXzExCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UBQNuaWwADElOVF9ERUNJTUFMUwAIAA9CSUdJTlRfREVDSU1BTFMAEgAJUFJFQ0lTSU9OAMCEPQAHTElTVF8yNQkAvQkCAjEwXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wAgFfAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMACktFWV9QQVVTRUQCBlBBVVNFRAAKS0VZX1BBVVNFUgIGUEFVU0VSAAtLRVlfU1RPUkFHRQIHU1RPUkFHRQAKS0VZX0FTU0VUUwIGQVNTRVRTABJLRVlfQVNTRVRfQkFMQU5DRVMCDkFTU0VUX0JBTEFOQ0VTABFLRVlfQVNTRVRfV0VJR0hUUwINQVNTRVRfV0VJR0hUUwAKS0VZX0xQX0ZFRQIGTFBfRkVFABBLRVlfUFJPVE9DT0xfRkVFAgxQUk9UT0NPTF9GRUUAFEtFWV9TSUdNQV9GRUVfUEVSX0xQAhBTSUdNQV9GRUVfUEVSX0xQABlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQAhVVU0VSX1NJR01BX0ZFRV9QRVJfTFAAC0tFWV9VU0VSX0xQAgdVU0VSX0xQAAxLRVlfVE9UQUxfTFACCFRPVEFMX0xQABBLRVlfVVNFUl9QUk9GSVRTAgxVU0VSX1BST0ZJVFMBEF92YWxpZGF0ZUFkZHJlc3MCCGFkZHJlc3NfBGVycl8EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQ5fdmFsaWRhdGVBc3NldAIIYXNzZXRJZF8EZXJyXwMJAAACBQhhc3NldElkXwUFV0FWRVMGBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBDV92YWxpZGF0ZUJvb2wDBHZhbF8HdGFyZ2V0XwRlcnJfAwkBAiE9AgUEdmFsXwUHdGFyZ2V0XwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFdmFsMV8FdmFsMl8EZXJyXwMJAAACBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEQX3ZhbGlkYXRlSW50TGlzdAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAckbWF0Y2gwCQC2CQEFBGVsZW0DCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwAwUDYWNjCQEMX3ZhbGlkYXRlSW50BAUBYQUObG93ZXJCb3VuZGFyeV8FDnVwcGVyQm91bmRhcnlfBQRlcnJfBwkAAgEFBGVycl8KAAIkbAUEdmFsXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEPX3ZhbGlkYXRlQXNzZXRzAgdhc3NldHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0DBQNhY2MJAQ5fdmFsaWRhdGVBc3NldAIFBGVsZW0FBGVycl8HCgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEl92YWxpZGF0ZUludEVxdWFscwMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARJfdmFsaWRhdGVUb2tlbk5hbWUCBHZhbF8EZXJyXwMDCQBmAgAECQCxAgEFBHZhbF8GCQBmAgkAsQIBBQR2YWxfABAJAAIBBQRlcnJfBgETX3ZhbGlkYXRlVG9rZW5EZXNjcgIEdmFsXwRlcnJfAwkAZgIJALECAQUEdmFsXwDoBwkAAgEFBGVycl8GARFfdmFsaWRhdGVEZWNpbWFscwIEdmFsXwRlcnJfAwMJAGYCAAAFBHZhbF8GCQBmAgUEdmFsXwAICQACAQUEZXJyXwYBEF92YWxpZGF0ZVBheW1lbnQECHBheW1lbnRfCGFzc2V0SWRfD3JlcXVpcmVkQW1vdW50XwRlcnJfBAckbWF0Y2gwCAUIcGF5bWVudF8HYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwAwkBAiE9AgUIYXNzZXRJZF8JANgEAQUBYQkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAMJAGYCBQ9yZXF1aXJlZEFtb3VudF8IBQhwYXltZW50XwZhbW91bnQJAAIBCQCsAgIFBGVycl8CCDogYW1vdW50BgkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwVsaXN0XwR2YWxfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQVsaXN0XwUEdmFsXwkAAgEFBGVycl8GAQtfYXNzZXRUb1N0cgEGYXNzZXRfBAckbWF0Y2gwBQZhc3NldF8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkA2AQBBQFhBQVXQVZFUwELX3N0clRvQXNzZXQBBmFzc2V0XwMDCQAAAgUGYXNzZXRfBQVXQVZFUwYJAAACBQZhc3NldF8CAAUEdW5pdAkA2QQBBQZhc3NldF8BCl9sb2FkUGF1c2UABAckbWF0Y2gwCQCgCAEFCktFWV9QQVVTRUQDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYQUHJG1hdGNoMAUBYQcBCl9zYXZlUGF1c2UBCWlzUGF1c2VkXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUKS0VZX1BBVVNFRAUJaXNQYXVzZWRfBQNuaWwBC19sb2FkUGF1c2VyAAQHJG1hdGNoMAkAoggBBQpLRVlfUEFVU0VSAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABC19zYXZlUGF1c2VyAQdwYXVzZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9QQVVTRVIJAKUIAQUHcGF1c2VyXwUDbmlsAQ1fbG9hZE11bHRpc2lnAAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVNdWx0aXNpZwEJbXVsdGlzaWdfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9NVUxUSVNJRwkApQgBBQltdWx0aXNpZ18FA25pbAEMX2xvYWRTdG9yYWdlAAQHJG1hdGNoMAkAoggBBQtLRVlfU1RPUkFHRQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAEBnN0cnVjdAkAtQkCBQFhBQNTRVAJAJwKCgkA2QQBCQCRAwIFBnN0cnVjdAAACQAAAgkAkQMCBQZzdHJ1Y3QAAQIBMQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAFCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAICQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBnN0cnVjdAAJCQCcCgoBAAcAAAAAAAAAAAAAAAAAAAkBB0FkZHJlc3MBAQABDF9zYXZlU3RvcmFnZQEIc3RvcmFnZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgULS0VZX1NUT1JBR0UJALkJAgkAzAgCCQDYBAEIBQhzdG9yYWdlXwJfMQkAzAgCAwgFCHN0b3JhZ2VfAl8yAgExAgEwCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl8zCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl80CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl81CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl82CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl83CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl84CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl85CQDMCAIJAKUIAQgFCHN0b3JhZ2VfA18xMAUDbmlsBQNTRVAFA25pbAELX2xvYWRBc3NldHMABAckbWF0Y2gwCQCiCAEFCktFWV9BU1NFVFMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACQC9CQIFAWEFA1NFUAUDbmlsBQNuaWwBC19zYXZlQXNzZXRzAQdhc3NldHNfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9BU1NFVFMJALsJAgUHYXNzZXRzXwUDU0VQBQNuaWwBEl9sb2FkQXNzZXRCYWxhbmNlcwAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EB2JhbGFuY2UJAQ1wYXJzZUludFZhbHVlAQUEZWxlbQkAlAoCCQDNCAIIBQNhY2MCXzEFB2JhbGFuY2UJAGQCCAUDYWNjAl8yBQdiYWxhbmNlBAckbWF0Y2gwCQCiCAEFEktFWV9BU1NFVF9CQUxBTkNFUwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQBmAgkAsQIBBQFhAAAKAAIkbAkAvQkCBQFhBQNTRVAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCBRBaRVJPX0lOVF9MSVNUXzEwAAAJAJQKAgUQWkVST19JTlRfTElTVF8xMAAAARJfc2F2ZUFzc2V0QmFsYW5jZXMBCWJhbGFuY2VzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MJAKQDAQUEZWxlbQkAzAgCCQELU3RyaW5nRW50cnkCBRJLRVlfQVNTRVRfQkFMQU5DRVMJALsJAgoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBQNTRVAFA25pbAERX2xvYWRBc3NldFdlaWdodHMACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAZ3ZWlnaHQJAQ1wYXJzZUludFZhbHVlAQUEZWxlbQkAlAoCCQDNCAIIBQNhY2MCXzEFBndlaWdodAkAZAIIBQNhY2MCXzIFBndlaWdodAQHJG1hdGNoMAkAoggBBRFLRVlfQVNTRVRfV0VJR0hUUwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQBmAgkAsQIBBQFhAAAKAAIkbAkAvQkCBQFhBQNTRVAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCBRBaRVJPX0lOVF9MSVNUXzEwAAAJAJQKAgUQWkVST19JTlRfTElTVF8xMAAAARFfc2F2ZUFzc2V0V2VpZ2h0cwEId2VpZ2h0c18KAQhmb2xkRnVuYwIDYWNjBGVsZW0JAM0IAgUDYWNjCQCkAwEFBGVsZW0JAMwIAgkBC1N0cmluZ0VudHJ5AgURS0VZX0FTU0VUX1dFSUdIVFMJALsJAgoAAiRsBQh3ZWlnaHRzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoFA1NFUAUDbmlsAQpfbG9hZExwRmVlAQhhc3NldElkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUKS0VZX0xQX0ZFRQkAzAgCBQhhc3NldElkXwUDbmlsBQNTRVADCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABCl9zYXZlTHBGZWUCCGFzc2V0SWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBQpLRVlfTFBfRkVFCQDMCAIFCGFzc2V0SWRfBQNuaWwFA1NFUAUEdmFsXwUDbmlsARBfbG9hZFByb3RvY29sRmVlAQhhc3NldElkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUQS0VZX1BST1RPQ09MX0ZFRQkAzAgCBQhhc3NldElkXwUDbmlsBQNTRVADCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEF9zYXZlUHJvdG9jb2xGZWUCCGFzc2V0SWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRBLRVlfUFJPVE9DT0xfRkVFCQDMCAIFCGFzc2V0SWRfBQNuaWwFA1NFUAUEdmFsXwUDbmlsARJfbG9hZFNpZ21hRmVlUGVyTHAACgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwkApwMBBQRlbGVtBAckbWF0Y2gwCQCiCAEFFEtFWV9TSUdNQV9GRUVfUEVSX0xQAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAoAAiRsCQC9CQIFAWEFA1NFUAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwUTWkVST19CSUdJTlRfTElTVF8xMQUTWkVST19CSUdJTlRfTElTVF8xMQESX3NhdmVTaWdtYUZlZVBlckxwAQR2YWxfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwkApgMBBQRlbGVtCQDMCAIJAQtTdHJpbmdFbnRyeQIFFEtFWV9TSUdNQV9GRUVfUEVSX0xQCQC7CQIKAAIkbAUEdmFsXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwUDU0VQBQNuaWwBFl9sb2FkVXNlclNpZ21hRmVlUGVyTHABBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwkApwMBBQRlbGVtBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBRlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQCQDMCAIJAKUIAQUFdXNlcl8FA25pbAUDU0VQAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAoAAiRsCQC9CQIFAWEFA1NFUAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwUTWkVST19CSUdJTlRfTElTVF8xMQUTWkVST19CSUdJTlRfTElTVF8xMQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFdXNlcl8EdmFsXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MJAKYDAQUEZWxlbQkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUZS0VZX1VTRVJfU0lHTUFfRkVFX1BFUl9MUAkAzAgCCQClCAEFBXVzZXJfBQNuaWwFA1NFUAkAuwkCCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsAQtfbG9hZFVzZXJMcAEIYWRkcmVzc18EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFC0tFWV9VU0VSX0xQCQDMCAIJAKUIAQUIYWRkcmVzc18FA25pbAUDU0VQAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQtfc2F2ZVVzZXJMcAIIYWRkcmVzc18EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFC0tFWV9VU0VSX0xQCQDMCAIJAKUIAQUIYWRkcmVzc18FA25pbAUDU0VQBQR2YWxfBQNuaWwBDF9sb2FkVG90YWxMcAAEByRtYXRjaDAJAJ8IAQUMS0VZX1RPVEFMX0xQAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQxfc2F2ZVRvdGFsTHABBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFDEtFWV9UT1RBTF9MUAUEdmFsXwUDbmlsARBfbG9hZFVzZXJQcm9maXRzAQV1c2VyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MJAQ1wYXJzZUludFZhbHVlAQUEZWxlbQQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUQS0VZX1VTRVJfUFJPRklUUwkAzAgCCQClCAEFBXVzZXJfBQNuaWwFA1NFUAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQBmAgkAsQIBBQFhAAAKAAIkbAkAvQkCBQFhBQNTRVAKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFEFpFUk9fSU5UX0xJU1RfMTEFEFpFUk9fSU5UX0xJU1RfMTEBEF9zYXZlVXNlclByb2ZpdHMCBXVzZXJfBHZhbF8KAQhmb2xkRnVuYwIDYWNjBGVsZW0JAM0IAgUDYWNjCQCkAwEFBGVsZW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFEEtFWV9VU0VSX1BST0ZJVFMJAMwIAgkApQgBBQV1c2VyXwUDbmlsBQNTRVAJALsJAgoAAiRsBQR2YWxfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBQNTRVAFA25pbAERX29ubHlUaGlzQ29udHJhY3QBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfBQR0aGlzCQACAQIZX29ubHlUaGlzQ29udHJhY3Q6IHJldmVydAYBEF93aGVuTXVsdGlzaWdTZXQAAwkAAAIJAQ1fbG9hZE11bHRpc2lnAAkBB0FkZHJlc3MBAQAJAAIBAhhfd2hlbk11bHRpc2lnU2V0OiByZXZlcnQGARNfd2hlbk5vdEluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQECIT0CCAUHc3RvcmFnZQJfMQEACQACAQIbX3doZW5Ob3RJbml0aWFsaXplZDogcmV2ZXJ0BgEQX3doZW5Jbml0aWFsaXplZAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UAAwkAAAIIBQdzdG9yYWdlAl8xAQAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBDF9nZXREZWNpbWFscwEIYXNzZXRJZF8EByRtYXRjaDAJAOwHAQkA2QQBBQhhc3NldElkXwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAgFAWEIZGVjaW1hbHMJAAIBCQCsAgICF19nZXREZWNpbWFsczogbm8gYXNzZXQ9BQhhc3NldElkXwESX25vcm1hbGl6ZURlY2ltYWxzBAdhbW91bnRfD3NvdXJjZURlY2ltYWxzXw90YXJnZXREZWNpbWFsc18Gcm91bmRfAwkAZwIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfCQBuBAUHYW1vdW50XwABCQBsBgAKAAAJAGUCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwAAAAAFBERPV04FBnJvdW5kXwkAaAIFB2Ftb3VudF8JAGwGAAoAAAkAZQIFD3RhcmdldERlY2ltYWxzXwUPc291cmNlRGVjaW1hbHNfAAAAAAUERE9XTgEVX3ByZXBhcmVBc3NldEJhbGFuY2VzAQdhc3NldHNfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwAACgACJGwFB2Fzc2V0c18KAAIkcwkAkAMB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JGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQCUCgIIBQZyZXN1bHQCXzIIBQZyZXN1bHQCXzMBHF9pbmNyZW1lbnRCYWxhbmNlc0J5UGF5bWVudHMFCWJhbGFuY2VzXwlwYXltZW50c18HYXNzZXRzXwlkZWNpbWFsc18EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEB3BheW1lbnQJAJEDAgUJcGF5bWVudHNfBQVpbmRleAQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAUHcGF5bWVudAdhc3NldElkBANlcnIDCQECIT0CBQ9wYXltZW50QXNzZXRTdHIJAJEDAgUHYXNzZXRzXwUFaW5kZXgJAAIBCQCsAgIJAKwCAgUEZXJyXwIIOiBpbmRleD0JAKQDAQUFaW5kZXgFBHVuaXQDCQAAAgUDZXJyBQNlcnIEDWFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIECm5ld0JhbGFuY2UJAGQCBQRlbGVtCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAgUJcGF5bWVudHNfBQVpbmRleAZhbW91bnQFDWFzc2V0RGVjaW1hbHMFCWRlY2ltYWxzXwUERE9XTgkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQpuZXdCYWxhbmNlCQBkAggFA2FjYwJfMwUKbmV3QmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQGcmVzdWx0CgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwAAAoBBSRmMF8xAgIkYQIk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BSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARhfZ2V0UGF5bWVudHNGcm9tQmFsYW5jZXMEB2Fzc2V0c18JYmFsYW5jZXNfCnJlY2lwaWVudF8Pc291cmNlRGVjaW1hbHNfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yCQEOU2NyaXB0VHJhbnNmZXIDBQpyZWNpcGllbnRfCQESX25vcm1hbGl6ZURlY2ltYWxzBAkAkQMCBQliYWxhbmNlc18FBWluZGV4BQ9zb3VyY2VEZWNpbWFsc18JAQxfZ2V0RGVjaW1hbHMBBQRlbGVtBQRET1dOCQELX3N0clRvQXNzZXQBBQRlbGVtBAZyZXN1bHQKAAIkbAUHYXNzZXRzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCAUGcmVzdWx0Al8yARJfY2FsY3VsYXRlTWljcm9GZWUFCGJhbGFuY2VfDGVxdWlsaWJyaXVtXxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8DCQBmAgUMZXF1aWxpYnJpdW1fBQhiYWxhbmNlXwQJdGhyZXNob2xkCQBrAwUMZXF1aWxpYnJpdW1fCQBlAgUUTUFYX1dFSUdIVF9BTVBMSUZJRVIFEHdlaWdodEFtcGxpZmllcl8FFE1BWF9XRUlHSFRfQU1QTElGSUVSAwkAZgIFCXRocmVzaG9sZAUIYmFsYW5jZV8EDG1heERldmlhdGlvbgkAZQIFCXRocmVzaG9sZAUIYmFsYW5jZV8EB2ZlZVJhdGUJAGsDCQBrAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQBmAgUHZmVlUmF0ZQULZmVlTWF4UmF0ZV8JAGsDBQxtYXhEZXZpYXRpb24FC2ZlZU1heFJhdGVfBQ9GRUVfUkFURV9GQUNUT1IJAGsDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgAABAl0aHJlc2hvbGQJAGsDBQxlcXVpbGlicml1bV8JAGQCBRRNQVhfV0VJR0hUX0FNUExJRklFUgUQd2VpZ2h0QW1wbGlmaWVyXwUUTUFYX1dFSUdIVF9BTVBMSUZJRVIDCQBmAgUIYmFsYW5jZV8FCXRocmVzaG9sZAQMbWF4RGV2aWF0aW9uCQBlAgUIYmFsYW5jZV8FCXRocmVzaG9sZAQHZmVlUmF0ZQkAawMJAGsDBQxtYXhEZXZpYXRpb24FDXNsaXBwYWdlUmF0ZV8FFFNMSVBQQUdFX1JBVEVfRkFDVE9SBQ9GRUVfUkFURV9GQUNUT1IFDGVxdWlsaWJyaXVtXwMJAGYCBQdmZWVSYXRlBQtmZWVNYXhSYXRlXwkAawMFDG1heERldmlhdGlvbgULZmVlTWF4UmF0ZV8FD0ZFRV9SQVRFX0ZBQ1RPUgkAawMFDG1heERldmlhdGlvbgUHZmVlUmF0ZQUPRkVFX1JBVEVfRkFDVE9SAAABDV9jYWxjdWxhdGVGZWUHCWJhbGFuY2VzXxJhc3NldHNUb3RhbFN1cHBseV8Id2VpZ2h0c18Mc2lnbWFXZWlnaHRfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwoBCGZvbGRGdW5jAgNhY2MHYmFsYW5jZQQFaW5kZXgIBQNhY2MCXzEEC2VxdWlsaWJyaXVtCQBrAwUSYXNzZXRzVG90YWxTdXBwbHlfCQCRAwIFCHdlaWdodHNfBQVpbmRleAUMc2lnbWFXZWlnaHRfCQCUCgIJAGQCBQVpbmRleAABCQBkAggFA2FjYwJfMgkBEl9jYWxjdWxhdGVNaWNyb0ZlZQUFB2JhbGFuY2UFC2VxdWlsaWJyaXVtBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwQGcmVzdWx0CgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCAUGcmVzdWx0Al8yARtfdmFsaWRhdGVMaXF1aWRpdHlJbnZhcmlhbnQLEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8OYXNzZXRCYWxhbmNlc18RYXNzZXRUb3RhbFN1cHBseV8ScHJldkxwVG90YWxTdXBwbHlfDmxwVG90YWxTdXBwbHlfDWFzc2V0V2VpZ2h0c18Mc2lnbWFXZWlnaHRfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwMDCQAAAgUScHJldkxwVG90YWxTdXBwbHlfAAAGCQAAAgUObHBUb3RhbFN1cHBseV8AAAYEDnByZXZBc3NldHNSYXRlCQBrAwkAZQIFFXByZXZBc3NldFRvdGFsU3VwcGx5XwkBDV9jYWxjdWxhdGVGZWUHBRJwcmV2QXNzZXRCYWxhbmNlc18FFXByZXZBc3NldFRvdGFsU3VwcGx5XwUNYXNzZXRXZWlnaHRzXwUMc2lnbWFXZWlnaHRfBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwULUkFURV9GQUNUT1IFEnByZXZMcFRvdGFsU3VwcGx5XwQNbmV3QXNzZXRzUmF0ZQkAawMJAGUCBRFhc3NldFRvdGFsU3VwcGx5XwkBDV9jYWxjdWxhdGVGZWUHBQ5hc3NldEJhbGFuY2VzXwURYXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SBQ5scFRvdGFsU3VwcGx5XwQEZGlmZgkAZQIFDW5ld0Fzc2V0c1JhdGUFDnByZXZBc3NldHNSYXRlAwMJAGcCAAAFBGRpZmYJAGYCCQBoAgD///////////8BBQtSQVRFX0ZBQ1RPUgUEZGlmZgcJAAIBCQCsAgICKl92YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8ECHByZXZVdGlsCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAduZXdVdGlsCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBARkaWZmCQBlAgUHbmV3VXRpbAUIcHJldlV0aWwDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEFC1JBVEVfRkFDVE9SBQRkaWZmBwkAAgEJAKwCAgIlX3ZhbGlkYXRlU3dhcEludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEYX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uBwhiYWxhbmNlXxFhc3NldFRvdGFsU3VwcGx5XwxwcmV2QmFsYW5jZV8VcHJldkFzc2V0VG90YWxTdXBwbHlfB3dlaWdodF8Mc2lnbWFXZWlnaHRfDG1heEFsbG9jQW1wXwQLZXF1aWxpYnJpdW0JAGsDBRFhc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBBBtYXhBbGxvY2F0aW9uQW1wAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQkAZAIFDU1BWF9BTVBMSUZJRVIFDG1heEFsbG9jQW1wXwkAZQIFDU1BWF9BTVBMSUZJRVIFDG1heEFsbG9jQW1wXwQNbWF4QWxsb2NhdGlvbgkAawMFC2VxdWlsaWJyaXVtBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSBBFwcmV2TWF4QWxsb2NhdGlvbgkAawMJAGsDBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FB3dlaWdodF8FDHNpZ21hV2VpZ2h0XwUQbWF4QWxsb2NhdGlvbkFtcAUNTUFYX0FNUExJRklFUgMJAGYCBQhiYWxhbmNlXwULZXF1aWxpYnJpdW0DCQBmAgUIYmFsYW5jZV8FDW1heEFsbG9jYXRpb24DCQBmAgURcHJldk1heEFsbG9jYXRpb24FDHByZXZCYWxhbmNlXwkAAgECIF92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogbmV3IHVwAwkAZgIJAGUCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgkAZQIFDHByZXZCYWxhbmNlXwURcHJldk1heEFsbG9jYXRpb24JAAIBAiJfdmFsaWRhdGVBc3NldEFsbG9jYXRpb246IHN0aWxsIHVwBgYDCQBmAgUNbWF4QWxsb2NhdGlvbgUIYmFsYW5jZV8DCQBmAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogbmV3IGRvd24DCQBmAgkAZQIFEXByZXZNYXhBbGxvY2F0aW9uBQxwcmV2QmFsYW5jZV8JAGUCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwkAAgECJF92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgZG93bgYGARNfdmFsaWRhdGVBbGxvY2F0aW9uBw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5XxJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDWFzc2V0V2VpZ2h0c18Mc2lnbWFXZWlnaHRfDG1heEFsbG9jQW1wXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEJAJQKAgkAZAIFBWluZGV4AAEDCAUDYWNjAl8yCQEYX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uBwUEZWxlbQURYXNzZXRUb3RhbFN1cHBseV8JAJEDAgUScHJldkFzc2V0QmFsYW5jZXNfBQVpbmRleAUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQCRAwIFDWFzc2V0V2VpZ2h0c18FBWluZGV4BQxzaWdtYVdlaWdodF8FDG1heEFsbG9jQW1wXwcEBnJlc3VsdAoAAiRsBQ5hc3NldEJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBC19jaGVja3BvaW50AQV1c2VyXwQGdXNlckxwCQELX2xvYWRVc2VyTHABBQV1c2VyXwQLdXNlclByb2ZpdHMJARBfbG9hZFVzZXJQcm9maXRzAQUFdXNlcl8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABBF1c2VyU2lnbWFGZWVQZXJMcAkBFl9sb2FkVXNlclNpZ21hRmVlUGVyTHABBQV1c2VyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEDXByb2ZpdFVwZGF0ZWQJAGQCCQCRAwIFC3VzZXJQcm9maXRzBQVpbmRleAkAoAMBCQC8AgMJALYCAQUGdXNlckxwCQC4AgIJAJEDAgUNc2lnbWFGZWVQZXJMcAUFaW5kZXgJAJEDAgURdXNlclNpZ21hRmVlUGVyTHAFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQ1wcm9maXRVcGRhdGVkBA0kdDAyNDMwOTI0MzgyCgACJGwFEFpFUk9fSU5UX0xJU1RfMTEKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDAyNDMwOTI0MzgyAl8xBA5wcm9maXRzVXBkYXRlZAgFDSR0MDI0MzA5MjQzODICXzIJAJQKAgkAzggCCQEQX3NhdmVVc2VyUHJvZml0cwIFBXVzZXJfBQ5wcm9maXRzVXBkYXRlZAkBFl9zYXZlVXNlclNpZ21hRmVlUGVyTHACBQV1c2VyXwUNc2lnbWFGZWVQZXJMcAUOcHJvZml0c1VwZGF0ZWQBFF91cGRhdGVTaWdtYUZlZVBlckxwBA5zaWdtYUZlZVBlckxwXwh0b3RhbExwXwZpbmRleF8GbHBGZWVfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQDCQAAAgUGaW5kZXhfBQVpbmRleAkAtwICCQCRAwIFDnNpZ21hRmVlUGVyTHBfBQVpbmRleAkAvAIDCQC2AgEFBmxwRmVlXwUOUEVSQ0VOVF9GQUNUT1IJALYCAQUIdG90YWxMcF8JAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBA0kdDAyNTAzMjI1MTExCgACJGwFEFpFUk9fSU5UX0xJU1RfMTEKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDAyNTAzMjI1MTExAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDI1MDMyMjUxMTECXzIFFHNpZ21hRmVlUGVyTHBVcGRhdGVkARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMFC2Fzc2V0SW5kZXhfB2Ftb3VudF8KbHBGZWVSYXRlXxBwcm90b2NvbEZlZVJhdGVfDWlzRnVsbEFtb3VudF8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjUzNTYyNjA2NAMFDWlzRnVsbEFtb3VudF8DCQAAAgUHdG90YWxMcAAACQCUCgIAAAkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUJAJQKAgkAawMFB2Ftb3VudF8FCmxwRmVlUmF0ZV8FB01BWF9GRUUJAGsDBQdhbW91bnRfBRBwcm90b2NvbEZlZVJhdGVfBQdNQVhfRkVFAwkAAAIFB3RvdGFsTHAAAAkAlAoCAAAJAGsDBQdhbW91bnRfBRBwcm90b2NvbEZlZVJhdGVfCQBlAgUHTUFYX0ZFRQUQcHJvdG9jb2xGZWVSYXRlXwkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwkAZQIJAGUCBQdNQVhfRkVFBQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfCQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwkAZQIJAGUCBQdNQVhfRkVFBQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfBAVscEZlZQgFDSR0MDI1MzU2MjYwNjQCXzEEC3Byb3RvY29sRmVlCAUNJHQwMjUzNTYyNjA2NAJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQDCQAAAgUFbHBGZWUAAAUNc2lnbWFGZWVQZXJMcAkBFF91cGRhdGVTaWdtYUZlZVBlckxwBAUNc2lnbWFGZWVQZXJMcAUHdG90YWxMcAULYXNzZXRJbmRleF8FBWxwRmVlCQCVCgMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBC19kZXBvc2l0QWxsAQdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI2NTczMjY2MjYJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI2NTczMjY2MjYCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjY1NzMyNjYyNgJfMgQNJHQwMjY2MzEyNjY5OQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjY2MzEyNjY5OQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNjYzMTI2Njk5Al8yBA0kdDAyNjcwNTI3OTM1AwkAAAIFFHByZXZBc3NldFRvdGFsU3VwcGx5AAAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAGsDCQCRAwIFDGFzc2V0V2VpZ2h0cwUFaW5kZXgFB2Ftb3VudF8FC3NpZ21hV2VpZ2h0CQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAQNJHQwMjcxNDcyNzIyMQoAAiRsBQZhc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwMjcxNDcyNzIyMQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3MTQ3MjcyMjECXzIJAJQKAgUHYW1vdW50XwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQFcmF0aW8JALwCAwkAtgIBBQdhbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBRRwcmV2QXNzZXRUb3RhbFN1cHBseQoBCWZvbGRGdW5jMQIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAKADAQkAvAIDBQVyYXRpbwkAtgIBCQCRAwIFEXByZXZBc3NldEJhbGFuY2VzBQVpbmRleAUOUEVSQ0VOVF9GQUNUT1IJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNzc2NDI3ODM5CgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWZvbGRGdW5jMQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwMjc3NjQyNzgzOQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3NzY0Mjc4MzkCXzIJAJQKAgkAawMFB2Ftb3VudF8FDWxwVG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDI2NzA1Mjc5MzUCXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAyNjcwNTI3OTM1Al8yBA0kdDAyNzk0MTI4MDU0CQEbX2luY3JlbWVudEJhbGFuY2VzQnlBbW91bnRzAgURcHJldkFzc2V0QmFsYW5jZXMFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDWFzc2V0QmFsYW5jZXMIBQ0kdDAyNzk0MTI4MDU0Al8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwMjc5NDEyODA1NAJfMgQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZAIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9NaW50BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9NaW50BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQhfZGVwb3NpdAIIYXNzZXRJZF8HYW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI4NzQ5Mjg4MDIJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI4NzQ5Mjg4MDICXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjg3NDkyODgwMgJfMgQNJHQwMjg4MDcyODkyMQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjg4MDcyODkyMQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODgwNzI4OTIxAl8yBA1hc3NldEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwUHYW1vdW50XwQQYXNzZXRUb3RhbFN1cHBseQkAZAIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdhbW91bnRfBARlcnIyCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAURbWF4QWxsb2NBbXBsaWZpZXIDCQAAAgUEZXJyMgUEZXJyMgQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEDmxwVG9rZW5zVG9NaW50AwkAAAIFDWxwVG90YWxTdXBwbHkAAAkAZQIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQQJYXNzZXREaWZmCQBlAgUQYXNzZXRUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkEB2ZlZURpZmYJAGUCBQNmZWUFB3ByZXZGZWUEE3V0aWxpdHlDaGFuZ2VGYWN0b3IJAGsDCQBlAgUJYXNzZXREaWZmBQdmZWVEaWZmBQtSQVRFX0ZBQ1RPUgkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdwcmV2RmVlBBNscFRva2Vuc1RvTWludElubmVyCQBrAwUNbHBUb3RhbFN1cHBseQUTdXRpbGl0eUNoYW5nZUZhY3RvcgULUkFURV9GQUNUT1IEBGVycjMJARtfdmFsaWRhdGVMaXF1aWRpdHlJbnZhcmlhbnQLBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDWxwVG90YWxTdXBwbHkJAGQCBQ1scFRvdGFsU3VwcGx5BRNscFRva2Vuc1RvTWludElubmVyBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIzBQRlcnIzBRNscFRva2Vuc1RvTWludElubmVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDmxwVG9rZW5zVG9NaW50BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzA4NDgzMDkxNgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzA4NDgzMDkxNgJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMDg0ODMwOTE2Al8yBA0kdDAzMDkyMTMwOTc0CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMDkyMTMwOTc0Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMwOTIxMzA5NzQCXzIEDSR0MDMwOTgwMzExMDIJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMFAAAFB2Ftb3VudF8FCWxwRmVlUmF0ZQUPcHJvdG9jb2xGZWVSYXRlBgQFbHBGZWUIBQ0kdDAzMDk4MDMxMTAyAl8xBAtwcm90b2NvbEZlZQgFDSR0MDMwOTgwMzExMDICXzIEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMzA5ODAzMTEwMgJfMwQObHBUb2tlbnNUb0J1cm4JAGUCCQBlAgUHYW1vdW50XwUFbHBGZWUFC3Byb3RvY29sRmVlBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQdNQVhfSU5UAihfd2l0aGRyYXdBbGw6IGxwVG9rZW5zVG9CdXJuIGxlc3MgdGhhbiAwAwkAAAIFA2VycgUDZXJyBA0kdDAzMTI2NTMxMzk4CQEcX2RlY3JlbWVudEJhbGFuY2VzQnlMcEFtb3VudAMFEXByZXZBc3NldEJhbGFuY2VzBQ5scFRva2Vuc1RvQnVybgUNbHBUb3RhbFN1cHBseQQNYXNzZXRCYWxhbmNlcwgFDSR0MDMxMjY1MzEzOTgCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMTI2NTMxMzk4Al8yBA1iYWxhbmNlc1RvUGF5CAUNJHQwMzEyNjUzMTM5OAJfMwQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9CdXJuBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCYCgYFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDMyMzM3MzI0MDUJARJfbG9hZEFzc2V0QmFsYW5jZXMABBFwcmV2QXNzZXRCYWxhbmNlcwgFDSR0MDMyMzM3MzI0MDUCXzEEFHByZXZBc3NldFRvdGFsU3VwcGx5CAUNJHQwMzIzMzczMjQwNQJfMgQNJHQwMzI0MTAzMjUxNQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMzI0MTAzMjUxNQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAzMjQxMDMyNTE1Al8yBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMEBQdhbW91bnRfBQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBAphc3NldEluZGV4CQEFdmFsdWUBCQDPCAIFBmFzc2V0cwUIYXNzZXRJZF8EDWFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwUKYXNzZXRJbmRleAUQYW1vdW50Tm9ybWFsaXplZAQQYXNzZXRUb3RhbFN1cHBseQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BRBhbW91bnROb3JtYWxpemVkBARlcnIxCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAURbWF4QWxsb2NBbXBsaWZpZXIDCQAAAgUEZXJyMQUEZXJyMQQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEDmxwVG9rZW5zVG9CdXJuAwkAAAIFDWxwVG90YWxTdXBwbHkAAAkAZQIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQQJYXNzZXREaWZmCQBlAgUQYXNzZXRUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkEB2ZlZURpZmYJAGUCBQNmZWUFB3ByZXZGZWUEE3V0aWxpdHlDaGFuZ2VGYWN0b3IJAGsDCQBlAgUJYXNzZXREaWZmBQdmZWVEaWZmBQtSQVRFX0ZBQ1RPUgkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdwcmV2RmVlBBNscFRva2Vuc1RvQnVybklubmVyCQBoAgD///////////8BCQBrAwUNbHBUb3RhbFN1cHBseQUTdXRpbGl0eUNoYW5nZUZhY3RvcgULUkFURV9GQUNUT1IEBGVycjIJARtfdmFsaWRhdGVMaXF1aWRpdHlJbnZhcmlhbnQLBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDWxwVG90YWxTdXBwbHkJAGUCBQ1scFRvdGFsU3VwcGx5BRNscFRva2Vuc1RvQnVybklubmVyBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyBRNscFRva2Vuc1RvQnVybklubmVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAzNDI3ODM0NDAxCQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBQAABQdhbW91bnRfBQlscEZlZVJhdGUFD3Byb3RvY29sRmVlUmF0ZQcEBWxwRmVlCAUNJHQwMzQyNzgzNDQwMQJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAzNDI3ODM0NDAxAl8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDM0Mjc4MzQ0MDECXzMJAJcKBQUObHBUb2tlbnNUb0J1cm4FDWFzc2V0QmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BBV9zd2FwAxFzb3VyY2VBc3NldEluZGV4XxF0YXJnZXRBc3NldEluZGV4Xw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzQ5NDQzNTAxMgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzQ5NDQzNTAxMgJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNDk0NDM1MDEyAl8yBA0kdDAzNTAxNzM1MDcwCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNTAxNzM1MDcwAl8xBAtzaWdtYVdlaWdodAgFDSR0MDM1MDE3MzUwNzACXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJAGQCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNc291cmNlQW1vdW50XwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBAx0YXJnZXRBbW91bnQIBQNhY2MCXzIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwUNYXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8FDHRhcmdldEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBAdmZWVEaWZmCQBlAgUDZmVlBQdwcmV2RmVlBAp0ZW1wQW1vdW50CQBlAgUNc291cmNlQW1vdW50XwUHZmVlRGlmZgQFY2hlY2sDCQBnAgAABQp0ZW1wQW1vdW50CQACAQISX3N3YXA6IGxlc3MgdGhhbiAwBQR1bml0AwkAAAIFBWNoZWNrBQVjaGVjawMDCQBmAgkAZQIFDHRhcmdldEFtb3VudAUKdGVtcEFtb3VudAkAaAIA////////////AQUJUFJFQ0lTSU9OCQBmAgUJUFJFQ0lTSU9OCQBlAgUMdGFyZ2V0QW1vdW50BQp0ZW1wQW1vdW50BwQSZmluYWxBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwUNYXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8FCnRlbXBBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFCnRlbXBBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxCQCVCgMGBQp0ZW1wQW1vdW50BRJmaW5hbEFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJUKAwcFCnRlbXBBbW91bnQFEXRlbXBBc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAzNzE5NzM3MzAyCgACJGwFB0xJU1RfMjUKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMHBQ1zb3VyY2VBbW91bnRfBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZBAdzdWNjZXNzCAUNJHQwMzcxOTczNzMwMgJfMQQMdGFyZ2V0QW1vdW50CAUNJHQwMzcxOTczNzMwMgJfMgQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwMzcxOTczNzMwMgJfMwMJAQEhAQUHc3VjY2VzcwkAAgEJAKwCAgIkX3N3YXA6IGNhbid0IGNhbGN1bGF0ZSB0YXJnZXRBbW91bnQ9CQCkAwEFDHRhcmdldEFtb3VudAQNJHQwMzc0MTkzNzU2NgkBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwUJAGQCBRF0YXJnZXRBc3NldEluZGV4XwABBQx0YXJnZXRBbW91bnQFCWxwRmVlUmF0ZQUPcHJvdG9jb2xGZWVSYXRlBgQFbHBGZWUIBQ0kdDAzNzQxOTM3NTY2Al8xBAtwcm90b2NvbEZlZQgFDSR0MDM3NDE5Mzc1NjYCXzIEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMzc0MTkzNzU2NgJfMwkAlwoFBQx0YXJnZXRBbW91bnQFEmZpbmFsQXNzZXRCYWxhbmNlcwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZBMBaQEEaW5pdAwHYXNzZXRzXw1hc3NldFdlaWdodHNfCmxwRmVlUmF0ZV8QcHJvdG9jb2xGZWVSYXRlXwxscFRva2VuTmFtZV8NbHBUb2tlbkRlc2NyXxBscFRva2VuRGVjaW1hbHNfF21heEFsbG9jYXRpb25BbXBsaWZpZXJfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXxRwcm90b2NvbEZlZUNvbnRyYWN0XwQDZXJyAwMDAwMDAwMDAwMDAwkBE193aGVuTm90SW5pdGlhbGl6ZWQACQEPX3ZhbGlkYXRlQXNzZXRzAgUHYXNzZXRzXwIUaW5pdDogaW52YWxpZCBhc3NldHMHCQEQX3ZhbGlkYXRlSW50TGlzdAQFDWFzc2V0V2VpZ2h0c18AAAUKTUFYX1dFSUdIVAIaaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBBQdhc3NldHNfCQCQAwEFDWFzc2V0V2VpZ2h0c18CH2luaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzIHNpemUHCQEMX3ZhbGlkYXRlSW50BAUKbHBGZWVSYXRlXwAABQdNQVhfRkVFAhRpbml0OiBpbnZhbGlkIGxwIGZlZQcJAQxfdmFsaWRhdGVJbnQEBRBwcm90b2NvbEZlZVJhdGVfAAAFB01BWF9GRUUCGmluaXQ6IGludmFsaWQgcHJvdG9jb2wgZmVlBwkBEl92YWxpZGF0ZVRva2VuTmFtZQIFDGxwVG9rZW5OYW1lXwISaW5pdDogaW52YWxpZCBuYW1lBwkBE192YWxpZGF0ZVRva2VuRGVzY3ICBQ1scFRva2VuRGVzY3JfAhNpbml0OiBpbnZhbGlkIGRlc2NyBwkBEV92YWxpZGF0ZURlY2ltYWxzAgUQbHBUb2tlbkRlY2ltYWxzXwIWaW5pdDogaW52YWxpZCBkZWNpbWFscwcJAQxfdmFsaWRhdGVJbnQEBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwAABQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUNc2xpcHBhZ2VSYXRlXwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHNsaXBwYWdlUmF0ZQcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHAwkAAAIFA2VycgUDZXJyBA0kdDAzOTE4NjM5MjU1CQEUX3ByZXBhcmVBc3NldFdlaWdodHMBBQ1hc3NldFdlaWdodHNfBAxhc3NldFdlaWdodHMIBQ0kdDAzOTE4NjM5MjU1Al8xBAtzaWdtYVdlaWdodAgFDSR0MDM5MTg2MzkyNTUCXzIEDWFzc2V0QmFsYW5jZXMJARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBBQdhc3NldHNfBAVpc3N1ZQkAwggFBQxscFRva2VuTmFtZV8FDWxwVG9rZW5EZXNjcl8AAAUQbHBUb2tlbkRlY2ltYWxzXwYECWxwQXNzZXRJZAkAuAgBBQVpc3N1ZQQOc3RvcmFnZVVwZGF0ZWQJAJwKCgUJbHBBc3NldElkBgAABQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8JARFAZXh0ck5hdGl2ZSgxMDYyKQEFFHByb3RvY29sRmVlQ29udHJhY3RfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIFBWlzc3VlBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBC19zYXZlQXNzZXRzAQUHYXNzZXRzXwkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJARFfc2F2ZUFzc2V0V2VpZ2h0cwEFDGFzc2V0V2VpZ2h0cwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEJARJfbG9hZFNpZ21hRmVlUGVyTHAABQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmRlcG9zaXRBbGwBB2Ftb3VudF8EA2VycgMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQdNQVhfSU5UAhpkZXBvc2l0QWxsOiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwNDA5MTA0MDk5NQkBC19kZXBvc2l0QWxsAQUHYW1vdW50XwQObHBUb2tlbnNUb01pbnQIBQ0kdDA0MDkxMDQwOTk1Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwNDA5MTA0MDk5NQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQwOTEwNDA5OTUCXzMKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAdhc3NldElkBBRwYXltZW50QXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkCQCRAwIFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFBWluZGV4BA5yZXF1aXJlZEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUUcGF5bWVudEFzc2V0RGVjaW1hbHMFB0NFSUxJTkcEBGVycjEDCQECIT0CBQ9wYXltZW50QXNzZXRTdHIFBGVsZW0JAAIBCQCsAgICI2RlcG9zaXRBbGw6IGludmFsaWQgcGF5bWVudDogaW5kZXg9CQCkAwEFBWluZGV4AwkAZwIAAAUOcmVxdWlyZWRBbW91bnQJAAIBAiZkZXBvc2l0QWxsOiB0b28gbGl0dGxlIGFtb3VudCByZXF1aXJlZAUEdW5pdAMJAAACBQRlcnIxBQRlcnIxBAZjaGFuZ2UDCQBmAggJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAUOcmVxdWlyZWRBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAggJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAUOcmVxdWlyZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAdhc3NldElkBQNuaWwDCQBmAgUOcmVxdWlyZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAihkZXBvc2l0QWxsOiBpbnN1ZmZpY2llbnQgcGF5bWVudCwgaW5kZXg9CQCkAwEFBWluZGV4AgssIHJlcXVpcmVkPQkApAMBBQ5yZXF1aXJlZEFtb3VudAUDbmlsCQCUCgIJAGQCBQVpbmRleAABCQDOCAIIBQNhY2MCXzIFBmNoYW5nZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNDIxMzg0MjIwMAoAAiRsBQZhc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwNDIxMzg0MjIwMAJfMQQNY2hhbmdlQWN0aW9ucwgFDSR0MDQyMTM4NDIyMDACXzIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9NaW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDmxwVG9rZW5zVG9NaW50BQlscEFzc2V0SWQFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwUNY2hhbmdlQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdkZXBvc2l0AQxtaW5McEFtb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFDG1pbkxwQW1vdW50XwAABQdNQVhfSU5UAh5kZXBvc2l0OiBpbnZhbGlkIG1pbiBscCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBGVycjEDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAh5kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh5kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAUHTUFYX0lOVAIfZGVwb3NpdDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUEZXJyMQUEZXJyMQQIYXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0U3RyBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDWFzc2V0RGVjaW1hbHMFCmxwRGVjaW1hbHMFBERPV04EDSR0MDQzNTc5NDM2NTMJAQhfZGVwb3NpdAIFCGFzc2V0U3RyBRBhbW91bnROb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDQzNTc5NDM2NTMCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0MzU3OTQzNjUzAl8yBARlcnIyCQEMX3ZhbGlkYXRlSW50BAUObHBUb2tlbnNUb01pbnQFDG1pbkxwQW1vdW50XwUHTUFYX0lOVAIZZGVwb3NpdDogbGVzcyB0aGFuIG1pbiBscAMJAAACBQRlcnIyBQRlcnIyBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUObHBUb2tlbnNUb01pbnQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3dpdGhkcmF3QWxsAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAiJ3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCI3dpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDQ4NzQ0NTAwMwkBDF93aXRoZHJhd0FsbAEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA5scFRva2Vuc1RvQnVybggFDSR0MDQ0ODc0NDUwMDMCXzEEDWJhbGFuY2VzVG9QYXkIBQ0kdDA0NDg3NDQ1MDAzAl8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNDQ4NzQ0NTAwMwJfMwQFbHBGZWUIBQ0kdDA0NDg3NDQ1MDAzAl80BAtwcm90b2NvbEZlZQgFDSR0MDQ0ODc0NDUwMDMCXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDQ4NzQ0NTAwMwJfNgQOcGF5bWVudEFjdGlvbnMJARhfZ2V0UGF5bWVudHNGcm9tQmFsYW5jZXMEBQZhc3NldHMFDWJhbGFuY2VzVG9QYXkIBQFpBmNhbGxlcgUKbHBEZWNpbWFscwQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBlAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9CdXJuCAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAUObHBUb2tlbnNUb0J1cm4FA25pbAUOcGF5bWVudEFjdGlvbnMJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUMbHBBc3NldElkU3RyCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUMbHBBc3NldElkU3RyCQEQX3NhdmVQcm90b2NvbEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDGxwQXNzZXRJZFN0cgkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECH3dpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAiB3aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFtb3VudAcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDBQZhc3NldHMFCGFzc2V0SWRfAhl3aXRoZHJhdzogaW52YWxpZCBhc3NldElkBwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIYd2l0aGRyYXc6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDY0ODQ0NjU5MgkBCV93aXRoZHJhdwIFCGFzc2V0SWRfBQdhbW91bnRfBA5scFRva2Vuc1RvQnVybggFDSR0MDQ2NDg0NDY1OTICXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0NjQ4NDQ2NTkyAl8yBAVscEZlZQgFDSR0MDQ2NDg0NDY1OTICXzMEC3Byb3RvY29sRmVlCAUNJHQwNDY0ODQ0NjU5MgJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0NjQ4NDQ2NTkyAl81BBByZXF1aXJlZExwVG9rZW5zCQBkAgkAZAIFDmxwVG9rZW5zVG9CdXJuBQVscEZlZQULcHJvdG9jb2xGZWUEDGNoYW5nZUFjdGlvbgMJAGYCBRByZXF1aXJlZExwVG9rZW5zCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAAgECHXdpdGhkcmF3OiBpbnN1ZmZpY2llbnQgYW1vdW50AwkAZgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRByZXF1aXJlZExwVG9rZW5zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRByZXF1aXJlZExwVG9rZW5zCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAUDbmlsBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGUCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb0J1cm4IBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkBQ5scFRva2Vuc1RvQnVybgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8JAQtfc3RyVG9Bc3NldAEFCGFzc2V0SWRfBQNuaWwFDGNoYW5nZUFjdGlvbgkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwkBCl9zYXZlTHBGZWUCBQxscEFzc2V0SWRTdHIJAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQxscEFzc2V0SWRTdHIJARBfc2F2ZVByb3RvY29sRmVlAgUMbHBBc3NldElkU3RyCQBkAgULcHJvdG9jb2xGZWUJARBfbG9hZFByb3RvY29sRmVlAQUMbHBBc3NldElkU3RyCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEc3dhcAIOdGFyZ2V0QXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA5zb3VyY2VBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIfc3dhcDogaW52YWxpZCBtaW4gdGFyZ2V0IGFtb3VudAcJAQxfdmFsaWRhdGVJbnQEBRZzb3VyY2VBbW91bnROb3JtYWxpemVkAAAFB01BWF9JTlQCG3N3YXA6IGludmFsaWQgc291cmNlIGFtb3VudAcJARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFDnNvdXJjZUFzc2V0U3RyBQ50YXJnZXRBc3NldElkXwIRc3dhcDogc2FtZSBhc3NldHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAhtzd2FwOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHAwkAAAIFA2VycgUDZXJyBA0kdDA0ODc1NjQ4OTE0CQEFX3N3YXADBRBzb3VyY2VBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BRZzb3VyY2VBbW91bnROb3JtYWxpemVkBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNDg3NTY0ODkxNAJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNDg3NTY0ODkxNAJfMgQFbHBGZWUIBQ0kdDA0ODc1NjQ4OTE0Al8zBAtwcm90b2NvbEZlZQgFDSR0MDQ4NzU2NDg5MTQCXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDg3NTY0ODkxNAJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ50YXJnZXRBc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCH3N3YXA6IGluc3VmZmljaWVudCBmaW5hbCBhbW91bnQDCQAAAgUEZXJyMQUEZXJyMQkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtmaW5hbEFtb3VudAkBC19zdHJUb0Fzc2V0AQUOdGFyZ2V0QXNzZXRJZF8FA25pbAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFEmZpbmFsQXNzZXRCYWxhbmNlcwkBCl9zYXZlTHBGZWUCBQ50YXJnZXRBc3NldElkXwkAZAIFBWxwRmVlCQEKX2xvYWRMcEZlZQEFDnRhcmdldEFzc2V0SWRfCQEQX3NhdmVQcm90b2NvbEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgULcHJvdG9jb2xGZWUJARBfbG9hZFByb3RvY29sRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARJfc2F2ZVNpZ21hRmVlUGVyTHABBRRzaWdtYUZlZVBlckxwVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1nZXREZXBvc2l0QWxsAQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAAFB01BWF9JTlQCHWdldERlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1MDA0MDUwMTI1CQELX2RlcG9zaXRBbGwBBQdhbW91bnRfBA5scFRva2Vuc1RvTWludAgFDSR0MDUwMDQwNTAxMjUCXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDA1MDA0MDUwMTI1Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNTAwNDA1MDEyNQJfMwkAlAoCBQNuaWwJAJQKAgUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKZ2V0RGVwb3NpdAIIYXNzZXRJZF8HYW1vdW50XwQDZXJyAwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMJAQtfbG9hZEFzc2V0cwAFCGFzc2V0SWRfAhlnZXREZXBvc2l0OiBpbnZhbGlkIGFzc2V0CQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQdNQVhfSU5UAhpnZXREZXBvc2l0OiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDWFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQQYW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFB2Ftb3VudF8FDWFzc2V0RGVjaW1hbHMFCmxwRGVjaW1hbHMFBERPV04EDSR0MDUwODg0NTA5NTgJAQhfZGVwb3NpdAIFCGFzc2V0SWRfBRBhbW91bnROb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDUwODg0NTA5NTgCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MDg4NDUwOTU4Al8yCQCUCgIFA25pbAUObHBUb2tlbnNUb01pbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZ2V0V2l0aGRyYXdBbGwBB2Ftb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIeZ2V0V2l0aGRyYXdBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1MTMyOTUxNDQ1CQEMX3dpdGhkcmF3QWxsAQUHYW1vdW50XwQObHBUb2tlbnNUb0J1cm4IBQ0kdDA1MTMyOTUxNDQ1Al8xBA1iYWxhbmNlc1RvR2V0CAUNJHQwNTEzMjk1MTQ0NQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDUxMzI5NTE0NDUCXzMEBWxwRmVlCAUNJHQwNTEzMjk1MTQ0NQJfNAQLcHJvdG9jb2xGZWUIBQ0kdDA1MTMyOTUxNDQ1Al81BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDUxMzI5NTE0NDUCXzYJAJQKAgUDbmlsBQ1iYWxhbmNlc1RvR2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2dldFdpdGhkcmF3Aghhc3NldElkXwdhbW91bnRfBA0kdDA1MTgxMTUxOTE5CQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8FB2Ftb3VudF8EDmxwVG9rZW5zVG9CdXJuCAUNJHQwNTE4MTE1MTkxOQJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDUxODExNTE5MTkCXzIEBWxwRmVlCAUNJHQwNTE4MTE1MTkxOQJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1MTgxMTUxOTE5Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDUxODExNTE5MTkCXzUEEHJlcXVpcmVkTHBUb2tlbnMJAGQCCQBkAgUObHBUb2tlbnNUb0J1cm4FBWxwRmVlBQtwcm90b2NvbEZlZQkAlAoCBQNuaWwFEHJlcXVpcmVkTHBUb2tlbnMBaQEHZ2V0U3dhcAMOc291cmNlQXNzZXRJZF8OdGFyZ2V0QXNzZXRJZF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABBBzb3VyY2VBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ5zb3VyY2VBc3NldElkXwIac3dhcDogaW52YWxpZCBzb3VyY2UgYXNzZXQDCQAAAgUQc291cmNlQXNzZXRJbmRleAUQc291cmNlQXNzZXRJbmRleAQQdGFyZ2V0QXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOdGFyZ2V0QXNzZXRJZF8CGnN3YXA6IGludmFsaWQgdGFyZ2V0IGFzc2V0AwkAAAIFEHRhcmdldEFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgEFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMEBQ1zb3VyY2VBbW91bnRfCQEMX2dldERlY2ltYWxzAQUOc291cmNlQXNzZXRJZF8FCmxwRGVjaW1hbHMFBERPV04EA2VycgMJAQxfdmFsaWRhdGVJbnQEBRZzb3VyY2VBbW91bnROb3JtYWxpemVkAAAFB01BWF9JTlQCG3N3YXA6IGludmFsaWQgc291cmNlIGFtb3VudAkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRJZF8FDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcDCQAAAgUDZXJyBQNlcnIEDSR0MDUzMTc5NTMzMzcJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1MzE3OTUzMzM3Al8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1MzE3OTUzMzM3Al8yBAVscEZlZQgFDSR0MDUzMTc5NTMzMzcCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTMxNzk1MzMzNwJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MzE3OTUzMzM3Al81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhnZXRDbGFpbQEFdXNlcl8EBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CFmdldENsYWltOiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgQNJHQwNTM5Nzk1NDAzNQkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1Mzk3OTU0MDM1Al8xBAt1c2VyUHJvZml0cwgFDSR0MDUzOTc5NTQwMzUCXzIJAJQKAgUDbmlsBQt1c2VyUHJvZml0cwFpAQpjaGVja3BvaW50AQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIYY2hlY2twb2ludDogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIJAQtfY2hlY2twb2ludAEFBHVzZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFc3Rha2UABANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBCAUHc3RvcmFnZQJfMQQEZXJyMQMDCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAhxzdGFrZTogaW52YWxpZCBwYXltZW50cyBzaXplCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIcc3Rha2U6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAh1zdGFrZTogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUEZXJyMQUEZXJyMQQNJHQwNTQ5MTk1NDk3OQkBC19jaGVja3BvaW50AQgFAWkGY2FsbGVyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU0OTE5NTQ5NzkCXzEEC3VzZXJQcm9maXRzCAUNJHQwNTQ5MTk1NDk3OQJfMgkAlAoCCQDOCAIJAM4IAgURY2hlY2twb2ludEFjdGlvbnMJAQtfc2F2ZVVzZXJMcAIIBQFpBmNhbGxlcgkAZAIJAQtfbG9hZFVzZXJMcAEIBQFpBmNhbGxlcggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfc2F2ZVRvdGFsTHABCQBkAgkBDF9sb2FkVG90YWxMcAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3Vuc3Rha2UBB2Ftb3VudF8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEIBQFpBmNhbGxlcgQEZXJyMQkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUGdXNlckxwAhd1bnN0YWtlOiBpbnZhbGlkIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxBA0kdDA1NTQ5MDU1NTUwCQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTU0OTA1NTU1MAJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1NTQ5MDU1NTUwAl8yCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdhbW91bnRfBQlscEFzc2V0SWQFA25pbAURY2hlY2twb2ludEFjdGlvbnMJAQtfc2F2ZVVzZXJMcAIIBQFpBmNhbGxlcgkAZQIFBnVzZXJMcAUHYW1vdW50XwkBDF9zYXZlVG90YWxMcAEJAGUCCQEMX2xvYWRUb3RhbExwAAUHYW1vdW50XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQIFdXNlcl8HYXNzZXRzXwQDZXJyAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQxfdmFsaWRhdGVJbnQECQCQAwEFB2Fzc2V0c18AAQAKAhpjbGFpbTogaW52YWxpZCBhc3NldHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CE2NsYWltOiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQUJbHBBc3NldElkBAZhc3NldHMJAMwIAgUMbHBBc3NldElkU3RyCQELX2xvYWRBc3NldHMABAhtYXhJbmRleAkAZQIJAJADAQUGYXNzZXRzAAEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQUEdXNlcgQNJHQwNTYzNzM1NjQyOQkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1NjM3MzU2NDI5Al8xBAt1c2VyUHJvZml0cwgFDSR0MDU2MzczNTY0MjkCXzIKAQhmb2xkRnVuYwIDYWNjBnByb2ZpdAQFaW5kZXgIBQNhY2MCXzEDCQBmAgUFaW5kZXgFCG1heEluZGV4CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBnByb2ZpdAgFA2FjYwJfMwQFYXNzZXQJAJEDAgUGYXNzZXRzBQVpbmRleAMJAQ9jb250YWluc0VsZW1lbnQCBQdhc3NldHNfBQVhc3NldAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yAAAJAM0IAggFA2FjYwJfMwkBDlNjcmlwdFRyYW5zZmVyAwUEdXNlcgUGcHJvZml0CQELX3N0clRvQXNzZXQBBQVhc3NldAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQZwcm9maXQIBQNhY2MCXzMEDSR0MDU2OTE4NTcwMDkKAAIkbAULdXNlclByb2ZpdHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDU2OTE4NTcwMDkCXzEEEnVzZXJQcm9maXRzVXBkYXRlZAgFDSR0MDU2OTE4NTcwMDkCXzIEDXByb2ZpdEFjdGlvbnMIBQ0kdDA1NjkxODU3MDA5Al8zCQCUCgIJAM4IAgkAzggCBQ1wcm9maXRBY3Rpb25zCQDRCAIFEWNoZWNrcG9pbnRBY3Rpb25zAAAJARBfc2F2ZVVzZXJQcm9maXRzAgUEdXNlcgUSdXNlclByb2ZpdHNVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBC193aGVuUGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx1cGRhdGVQYXVzZXIBB3BhdXNlcl8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIcdXBkYXRlUGF1c2VyOiBpbnZhbGlkIHBhdXNlcgcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgDmax4+", "height": 2685673, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CsjsKnPhpJG2Q59nroVS4Hc8KdgcDQiLUTtqVfqyNW6y Next: 8RSd6zegp2ZJcGPYj16ySkvqgEvRjnUrx3PjBkbXt8n5 Diff:
OldNewDifferences
3838 let PRECISION = 1000000
3939
4040 let LIST_25 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
41+
42+let KEY_MULTISIG = "MULTISIG"
43+
44+let KEY_STATUS = "STATUS"
45+
46+let KEY_PAUSED = "PAUSED"
47+
48+let KEY_PAUSER = "PAUSER"
4149
4250 let KEY_STORAGE = "STORAGE"
4351
200208 else (asset_ == ""))
201209 then unit
202210 else fromBase58String(asset_)
211+
212+
213+func _loadPause () = match getBoolean(KEY_PAUSED) {
214+ case a: Boolean =>
215+ a
216+ case _ =>
217+ false
218+}
219+
220+
221+func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
222+
223+
224+func _loadPauser () = match getString(KEY_PAUSER) {
225+ case a: String =>
226+ addressFromStringValue(a)
227+ case _ =>
228+ Address(base58'')
229+}
230+
231+
232+func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
233+
234+
235+func _loadMultisig () = match getString(KEY_MULTISIG) {
236+ case a: String =>
237+ addressFromStringValue(a)
238+ case _ =>
239+ Address(base58'')
240+}
241+
242+
243+func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
203244
204245
205246 func _loadStorage () = match getString(KEY_STORAGE) {
514555 }
515556
516557
558+func _onlyThisContract (caller_) = if ((caller_ != this))
559+ then throw("_onlyThisContract: revert")
560+ else true
561+
562+
563+func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
564+ then throw("_whenMultisigSet: revert")
565+ else true
566+
567+
517568 func _whenNotInitialized () = {
518569 let storage = _loadStorage()
519570 if ((storage._1 != base58''))
528579 then throw("_whenInitialized: revert")
529580 else true
530581 }
582+
583+
584+func _whenNotPaused () = if (_loadPause())
585+ then throw("_whenNotPaused: revert")
586+ else true
587+
588+
589+func _whenPaused () = if (!(_loadPause()))
590+ then throw("_whenPaused: revert")
591+ else true
592+
593+
594+func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
595+ then throw("_onlyPauser: revert")
596+ else true
531597
532598
533599 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
9641030 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
9651031 }
9661032
967- let $t02293123004 = {
1033+ let $t02430924382 = {
9681034 let $l = ZERO_INT_LIST_11
9691035 let $s = size($l)
9701036 let $acc0 = $Tuple2(0, nil)
9781044
9791045 $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)
9801046 }
981- let idx = $t02293123004._1
982- let profitsUpdated = $t02293123004._2
1047+ let idx = $t02430924382._1
1048+ let profitsUpdated = $t02430924382._2
9831049 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
9841050 }
9851051
9931059 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
9941060 }
9951061
996- let $t02365423733 = {
1062+ let $t02503225111 = {
9971063 let $l = ZERO_INT_LIST_11
9981064 let $s = size($l)
9991065 let $acc0 = $Tuple2(0, nil)
10071073
10081074 $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)
10091075 }
1010- let idx = $t02365423733._1
1011- let sigmaFeePerLpUpdated = $t02365423733._2
1076+ let idx = $t02503225111._1
1077+ let sigmaFeePerLpUpdated = $t02503225111._2
10121078 sigmaFeePerLpUpdated
10131079 }
10141080
10161082 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_,isFullAmount_) = {
10171083 let sigmaFeePerLp = _loadSigmaFeePerLp()
10181084 let totalLp = _loadTotalLp()
1019- let $t02397824686 = if (isFullAmount_)
1085+ let $t02535626064 = if (isFullAmount_)
10201086 then if ((totalLp == 0))
10211087 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10221088 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
10231089 else if ((totalLp == 0))
10241090 then $Tuple2(0, fraction(amount_, protocolFeeRate_, (MAX_FEE - protocolFeeRate_)))
10251091 else $Tuple2(fraction(amount_, lpFeeRate_, ((MAX_FEE - lpFeeRate_) - protocolFeeRate_)), fraction(amount_, protocolFeeRate_, ((MAX_FEE - lpFeeRate_) - protocolFeeRate_)))
1026- let lpFee = $t02397824686._1
1027- let protocolFee = $t02397824686._2
1092+ let lpFee = $t02535626064._1
1093+ let protocolFee = $t02535626064._2
10281094 let sigmaFeePerLpUpdated = if ((lpFee == 0))
10291095 then sigmaFeePerLp
10301096 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
10391105 let slippageRate = storage._8
10401106 let feeMaxRate = storage._9
10411107 let assets = _loadAssets()
1042- let $t02519525248 = _loadAssetWeights()
1043- let assetWeights = $t02519525248._1
1044- let sigmaWeight = $t02519525248._2
1045- let $t02525325321 = _loadAssetBalances()
1046- let prevAssetBalances = $t02525325321._1
1047- let prevAssetTotalSupply = $t02525325321._2
1048- let $t02532726557 = if ((prevAssetTotalSupply == 0))
1108+ let $t02657326626 = _loadAssetWeights()
1109+ let assetWeights = $t02657326626._1
1110+ let sigmaWeight = $t02657326626._2
1111+ let $t02663126699 = _loadAssetBalances()
1112+ let prevAssetBalances = $t02663126699._1
1113+ let prevAssetTotalSupply = $t02663126699._2
1114+ let $t02670527935 = if ((prevAssetTotalSupply == 0))
10491115 then {
10501116 func foldFunc (acc,elem) = {
10511117 let index = acc._1
10531119 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
10541120 }
10551121
1056- let $t02576925843 = {
1122+ let $t02714727221 = {
10571123 let $l = assets
10581124 let $s = size($l)
10591125 let $acc0 = $Tuple2(0, nil)
10671133
10681134 $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)
10691135 }
1070- let idx = $t02576925843._1
1071- let requiredAmountsNormalized = $t02576925843._2
1136+ let idx = $t02714727221._1
1137+ let requiredAmountsNormalized = $t02714727221._2
10721138 $Tuple2(amount_, requiredAmountsNormalized)
10731139 }
10741140 else {
10791145 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
10801146 }
10811147
1082- let $t02638626461 = {
1148+ let $t02776427839 = {
10831149 let $l = assets
10841150 let $s = size($l)
10851151 let $acc0 = $Tuple2(0, nil)
10931159
10941160 $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)
10951161 }
1096- let idx = $t02638626461._1
1097- let requiredAmountsNormalized = $t02638626461._2
1162+ let idx = $t02776427839._1
1163+ let requiredAmountsNormalized = $t02776427839._2
10981164 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
10991165 }
1100- let lpTokensToMint = $t02532726557._1
1101- let requiredAmountsNormalized = $t02532726557._2
1102- let $t02656326676 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1103- let assetBalances = $t02656326676._1
1104- let assetTotalSupply = $t02656326676._2
1166+ let lpTokensToMint = $t02670527935._1
1167+ let requiredAmountsNormalized = $t02670527935._2
1168+ let $t02794128054 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1169+ let assetBalances = $t02794128054._1
1170+ let assetTotalSupply = $t02794128054._2
11051171 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11061172 if ((err2 == err2))
11071173 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11171183 let slippageRate = storage._8
11181184 let feeMaxRate = storage._9
11191185 let assets = _loadAssets()
1120- let $t02737127424 = _loadAssetWeights()
1121- let assetWeights = $t02737127424._1
1122- let sigmaWeight = $t02737127424._2
1123- let $t02742927543 = _loadAssetBalances()
1124- let prevAssetBalances = $t02742927543._1
1125- let prevAssetTotalSupply = $t02742927543._2
1186+ let $t02874928802 = _loadAssetWeights()
1187+ let assetWeights = $t02874928802._1
1188+ let sigmaWeight = $t02874928802._2
1189+ let $t02880728921 = _loadAssetBalances()
1190+ let prevAssetBalances = $t02880728921._1
1191+ let prevAssetTotalSupply = $t02880728921._2
11261192 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
11271193 let assetTotalSupply = (prevAssetTotalSupply + amount_)
11281194 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
11571223 let weightAmplifier = storage._7
11581224 let slippageRate = storage._8
11591225 let feeMaxRate = storage._9
1160- let $t02952329591 = _loadAssetBalances()
1161- let prevAssetBalances = $t02952329591._1
1162- let prevAssetTotalSupply = $t02952329591._2
1163- let $t02959629649 = _loadAssetWeights()
1164- let assetWeights = $t02959629649._1
1165- let sigmaWeight = $t02959629649._2
1166- let $t02965529777 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, true)
1167- let lpFee = $t02965529777._1
1168- let protocolFee = $t02965529777._2
1169- let sigmaFeePerLpUpdated = $t02965529777._3
1226+ let $t03084830916 = _loadAssetBalances()
1227+ let prevAssetBalances = $t03084830916._1
1228+ let prevAssetTotalSupply = $t03084830916._2
1229+ let $t03092130974 = _loadAssetWeights()
1230+ let assetWeights = $t03092130974._1
1231+ let sigmaWeight = $t03092130974._2
1232+ let $t03098031102 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, true)
1233+ let lpFee = $t03098031102._1
1234+ let protocolFee = $t03098031102._2
1235+ let sigmaFeePerLpUpdated = $t03098031102._3
11701236 let lpTokensToBurn = ((amount_ - lpFee) - protocolFee)
11711237 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
11721238 if ((err == err))
11731239 then {
1174- let $t02994030073 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1175- let assetBalances = $t02994030073._1
1176- let assetTotalSupply = $t02994030073._2
1177- let balancesToPay = $t02994030073._3
1240+ let $t03126531398 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1241+ let assetBalances = $t03126531398._1
1242+ let assetTotalSupply = $t03126531398._2
1243+ let balancesToPay = $t03126531398._3
11781244 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791245 if ((err2 == err2))
11801246 then $Tuple6(lpTokensToBurn, balancesToPay, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
11971263 let feeMaxRate = storage._9
11981264 let lpAssetIdStr = toBase58String(lpAssetId)
11991265 let assets = _loadAssets()
1200- let $t03101231080 = _loadAssetBalances()
1201- let prevAssetBalances = $t03101231080._1
1202- let prevAssetTotalSupply = $t03101231080._2
1203- let $t03108531190 = _loadAssetWeights()
1204- let assetWeights = $t03108531190._1
1205- let sigmaWeight = $t03108531190._2
1266+ let $t03233732405 = _loadAssetBalances()
1267+ let prevAssetBalances = $t03233732405._1
1268+ let prevAssetTotalSupply = $t03233732405._2
1269+ let $t03241032515 = _loadAssetWeights()
1270+ let assetWeights = $t03241032515._1
1271+ let sigmaWeight = $t03241032515._2
12061272 let assetDecimals = _getDecimals(assetId_)
12071273 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
12081274 let assetIndex = value(indexOf(assets, assetId_))
12251291 then lpTokensToBurnInner
12261292 else throw("Strict value is not equal to itself.")
12271293 }
1228- let $t03306533188 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, false)
1229- let lpFee = $t03306533188._1
1230- let protocolFee = $t03306533188._2
1231- let sigmaFeePerLpUpdated = $t03306533188._3
1294+ let $t03427834401 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, false)
1295+ let lpFee = $t03427834401._1
1296+ let protocolFee = $t03427834401._2
1297+ let sigmaFeePerLpUpdated = $t03427834401._3
12321298 $Tuple5(lpTokensToBurn, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12331299 }
12341300 else throw("Strict value is not equal to itself.")
12461312 let weightAmplifier = storage._7
12471313 let slippageRate = storage._8
12481314 let feeMaxRate = storage._9
1249- let $t03373133799 = _loadAssetBalances()
1250- let prevAssetBalances = $t03373133799._1
1251- let prevAssetTotalSupply = $t03373133799._2
1252- let $t03380433857 = _loadAssetWeights()
1253- let assetWeights = $t03380433857._1
1254- let sigmaWeight = $t03380433857._2
1315+ let $t03494435012 = _loadAssetBalances()
1316+ let prevAssetBalances = $t03494435012._1
1317+ let prevAssetTotalSupply = $t03494435012._2
1318+ let $t03501735070 = _loadAssetWeights()
1319+ let assetWeights = $t03501735070._1
1320+ let sigmaWeight = $t03501735070._2
12551321 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
12561322 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
12571323 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12851351 else throw("Strict value is not equal to itself.")
12861352 }
12871353
1288- let $t03598436089 = {
1354+ let $t03719737302 = {
12891355 let $l = LIST_25
12901356 let $s = size($l)
12911357 let $acc0 = $Tuple3(false, sourceAmount_, nil)
12991365
13001366 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
13011367 }
1302- let success = $t03598436089._1
1303- let targetAmount = $t03598436089._2
1304- let finalAssetBalances = $t03598436089._3
1368+ let success = $t03719737302._1
1369+ let targetAmount = $t03719737302._2
1370+ let finalAssetBalances = $t03719737302._3
13051371 if (!(success))
13061372 then throw(("_swap: can't calculate targetAmount=" + toString(targetAmount)))
13071373 else {
1308- let $t03620636353 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate, true)
1309- let lpFee = $t03620636353._1
1310- let protocolFee = $t03620636353._2
1311- let sigmaFeePerLpUpdated = $t03620636353._3
1374+ let $t03741937566 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate, true)
1375+ let lpFee = $t03741937566._1
1376+ let protocolFee = $t03741937566._2
1377+ let sigmaFeePerLpUpdated = $t03741937566._3
13121378 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13131379 }
13141380 }
13451411 else false
13461412 if ((err == err))
13471413 then {
1348- let $t03797338042 = _prepareAssetWeights(assetWeights_)
1349- let assetWeights = $t03797338042._1
1350- let sigmaWeight = $t03797338042._2
1414+ let $t03918639255 = _prepareAssetWeights(assetWeights_)
1415+ let assetWeights = $t03918639255._1
1416+ let sigmaWeight = $t03918639255._2
13511417 let assetBalances = _prepareAssetBalances(assets_)
13521418 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
13531419 let lpAssetId = calculateAssetId(issue)
13611427
13621428 @Callable(i)
13631429 func depositAll (amount_) = {
1364- let err = _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
1430+ let err = if (if (_whenInitialized())
1431+ then _whenNotPaused()
1432+ else false)
1433+ then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
1434+ else false
13651435 if ((err == err))
13661436 then {
13671437 let storage = _loadStorage()
13681438 let lpAssetId = storage._1
13691439 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13701440 let assets = _loadAssets()
1371- let $t03963139716 = _depositAll(amount_)
1372- let lpTokensToMint = $t03963139716._1
1373- let requiredAmountsNormalized = $t03963139716._2
1374- let assetBalances = $t03963139716._3
1441+ let $t04091040995 = _depositAll(amount_)
1442+ let lpTokensToMint = $t04091040995._1
1443+ let requiredAmountsNormalized = $t04091040995._2
1444+ let assetBalances = $t04091040995._3
13751445 func foldFunc (acc,elem) = {
13761446 let index = acc._1
13771447 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
13951465 else throw("Strict value is not equal to itself.")
13961466 }
13971467
1398- let $t04085940921 = {
1468+ let $t04213842200 = {
13991469 let $l = assets
14001470 let $s = size($l)
14011471 let $acc0 = $Tuple2(0, nil)
14091479
14101480 $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)
14111481 }
1412- let idx = $t04085940921._1
1413- let changeActions = $t04085940921._2
1482+ let idx = $t04213842200._1
1483+ let changeActions = $t04213842200._2
14141484 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14151485 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
14161486 }
14271497 let storage = _loadStorage()
14281498 let lpAssetId = storage._1
14291499 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1430- let err1 = if (if (_validateIntEquals(size(i.payments), 1, "deposit: invalid payments size"))
1500+ let err1 = if (if (if (if (_whenInitialized())
1501+ then _whenNotPaused()
1502+ else false)
1503+ then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
1504+ else false)
14311505 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
14321506 else false)
14331507 then _validateInt(i.payments[0].amount, 0, MAX_INT, "deposit: invalid payment amount")
14371511 let assetStr = _assetToStr(i.payments[0].assetId)
14381512 let assetDecimals = _getDecimals(assetStr)
14391513 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1440- let $t04224242316 = _deposit(assetStr, amountNormalized)
1441- let lpTokensToMint = $t04224242316._1
1442- let assetBalances = $t04224242316._2
1514+ let $t04357943653 = _deposit(assetStr, amountNormalized)
1515+ let lpTokensToMint = $t04357943653._1
1516+ let assetBalances = $t04357943653._2
14431517 let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
14441518 if ((err2 == err2))
14451519 then {
14621536 let lpAssetIdStr = toBase58String(lpAssetId)
14631537 let lpDecimals = _getDecimals(lpAssetIdStr)
14641538 let assets = _loadAssets()
1465- let err = if (if (_validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size"))
1539+ let err = if (if (if (if (_whenInitialized())
1540+ then _whenNotPaused()
1541+ else false)
1542+ then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
1543+ else false)
14661544 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
14671545 else false)
14681546 then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdrawAll: invalid payment amount")
14691547 else false
14701548 if ((err == err))
14711549 then {
1472- let $t04347943608 = _withdrawAll(i.payments[0].amount)
1473- let lpTokensToBurn = $t04347943608._1
1474- let balancesToPay = $t04347943608._2
1475- let assetBalances = $t04347943608._3
1476- let lpFee = $t04347943608._4
1477- let protocolFee = $t04347943608._5
1478- let sigmaFeePerLpUpdated = $t04347943608._6
1550+ let $t04487445003 = _withdrawAll(i.payments[0].amount)
1551+ let lpTokensToBurn = $t04487445003._1
1552+ let balancesToPay = $t04487445003._2
1553+ let assetBalances = $t04487445003._3
1554+ let lpFee = $t04487445003._4
1555+ let protocolFee = $t04487445003._5
1556+ let sigmaFeePerLpUpdated = $t04487445003._6
14791557 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
14801558 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14811559 $Tuple2((((((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
14911569 let lpAssetId = storage._1
14921570 let lpAssetIdStr = toBase58String(lpAssetId)
14931571 let assets = _loadAssets()
1494- let err = if (if (if (if (_validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size"))
1572+ let err = if (if (if (if (if (if (_whenInitialized())
1573+ then _whenNotPaused()
1574+ else false)
1575+ then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
1576+ else false)
14951577 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
14961578 else false)
14971579 then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdraw: invalid payment amount")
15021584 else false
15031585 if ((err == err))
15041586 then {
1505- let $t04503145139 = _withdraw(assetId_, amount_)
1506- let lpTokensToBurn = $t04503145139._1
1507- let assetBalances = $t04503145139._2
1508- let lpFee = $t04503145139._3
1509- let protocolFee = $t04503145139._4
1510- let sigmaFeePerLpUpdated = $t04503145139._5
1587+ let $t04648446592 = _withdraw(assetId_, amount_)
1588+ let lpTokensToBurn = $t04648446592._1
1589+ let assetBalances = $t04648446592._2
1590+ let lpFee = $t04648446592._3
1591+ let protocolFee = $t04648446592._4
1592+ let sigmaFeePerLpUpdated = $t04648446592._5
15111593 let requiredLpTokens = ((lpTokensToBurn + lpFee) + protocolFee)
15121594 let changeAction = if ((requiredLpTokens > i.payments[0].amount))
15131595 then throw("withdraw: insufficient amount")
15361618 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
15371619 if ((targetAssetIndex == targetAssetIndex))
15381620 then {
1539- let err = if (if (if (_validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount"))
1621+ let err = if (if (if (if (if (_whenInitialized())
1622+ then _whenNotPaused()
1623+ else false)
1624+ then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
1625+ else false)
15401626 then _validateInt(sourceAmountNormalized, 0, MAX_INT, "swap: invalid source amount")
15411627 else false)
15421628 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
15451631 else false
15461632 if ((err == err))
15471633 then {
1548- let $t04724547403 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1549- let targetAmountNormalized = $t04724547403._1
1550- let finalAssetBalances = $t04724547403._2
1551- let lpFee = $t04724547403._3
1552- let protocolFee = $t04724547403._4
1553- let sigmaFeePerLpUpdated = $t04724547403._5
1634+ let $t04875648914 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1635+ let targetAmountNormalized = $t04875648914._1
1636+ let finalAssetBalances = $t04875648914._2
1637+ let lpFee = $t04875648914._3
1638+ let protocolFee = $t04875648914._4
1639+ let sigmaFeePerLpUpdated = $t04875648914._5
15541640 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
15551641 let targetDecimals = _getDecimals(targetAssetId_)
15561642 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
15731659 let err = _validateInt(amount_, 0, MAX_INT, "getDepositAll: invalid amount")
15741660 if ((err == err))
15751661 then {
1576- let $t04852948614 = _depositAll(amount_)
1577- let lpTokensToMint = $t04852948614._1
1578- let requiredAmountsNormalized = $t04852948614._2
1579- let assetBalances = $t04852948614._3
1662+ let $t05004050125 = _depositAll(amount_)
1663+ let lpTokensToMint = $t05004050125._1
1664+ let requiredAmountsNormalized = $t05004050125._2
1665+ let assetBalances = $t05004050125._3
15801666 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
15811667 }
15821668 else throw("Strict value is not equal to itself.")
15961682 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15971683 let assetDecimals = _getDecimals(assetId_)
15981684 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1599- let $t04937349447 = _deposit(assetId_, amountNormalized)
1600- let lpTokensToMint = $t04937349447._1
1601- let assetBalances = $t04937349447._2
1685+ let $t05088450958 = _deposit(assetId_, amountNormalized)
1686+ let lpTokensToMint = $t05088450958._1
1687+ let assetBalances = $t05088450958._2
16021688 $Tuple2(nil, lpTokensToMint)
16031689 }
16041690 else throw("Strict value is not equal to itself.")
16111697 let err = _validateInt(amount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
16121698 if ((err == err))
16131699 then {
1614- let $t04981849934 = _withdrawAll(amount_)
1615- let lpTokensToBurn = $t04981849934._1
1616- let balancesToGet = $t04981849934._2
1617- let assetBalances = $t04981849934._3
1618- let lpFee = $t04981849934._4
1619- let protocolFee = $t04981849934._5
1620- let sigmaFeePerLpUpdated = $t04981849934._6
1700+ let $t05132951445 = _withdrawAll(amount_)
1701+ let lpTokensToBurn = $t05132951445._1
1702+ let balancesToGet = $t05132951445._2
1703+ let assetBalances = $t05132951445._3
1704+ let lpFee = $t05132951445._4
1705+ let protocolFee = $t05132951445._5
1706+ let sigmaFeePerLpUpdated = $t05132951445._6
16211707 $Tuple2(nil, balancesToGet)
16221708 }
16231709 else throw("Strict value is not equal to itself.")
16271713
16281714 @Callable(i)
16291715 func getWithdraw (assetId_,amount_) = {
1630- let $t05030050408 = _withdraw(assetId_, amount_)
1631- let lpTokensToBurn = $t05030050408._1
1632- let assetBalances = $t05030050408._2
1633- let lpFee = $t05030050408._3
1634- let protocolFee = $t05030050408._4
1635- let sigmaFeePerLpUpdated = $t05030050408._5
1716+ let $t05181151919 = _withdraw(assetId_, amount_)
1717+ let lpTokensToBurn = $t05181151919._1
1718+ let assetBalances = $t05181151919._2
1719+ let lpFee = $t05181151919._3
1720+ let protocolFee = $t05181151919._4
1721+ let sigmaFeePerLpUpdated = $t05181151919._5
16361722 let requiredLpTokens = ((lpTokensToBurn + lpFee) + protocolFee)
16371723 $Tuple2(nil, requiredLpTokens)
16381724 }
16571743 else false
16581744 if ((err == err))
16591745 then {
1660- let $t05166851826 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1661- let targetAmountNormalized = $t05166851826._1
1662- let finalAssetBalances = $t05166851826._2
1663- let lpFee = $t05166851826._3
1664- let protocolFee = $t05166851826._4
1665- let sigmaFeePerLpUpdated = $t05166851826._5
1746+ let $t05317953337 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1747+ let targetAmountNormalized = $t05317953337._1
1748+ let finalAssetBalances = $t05317953337._2
1749+ let lpFee = $t05317953337._3
1750+ let protocolFee = $t05317953337._4
1751+ let sigmaFeePerLpUpdated = $t05317953337._5
16661752 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16671753 let targetDecimals = _getDecimals(targetAssetId_)
16681754 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16781764
16791765
16801766 @Callable(i)
1767+func getClaim (user_) = {
1768+ let user = if ((size(user_) > 0))
1769+ then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
1770+ else i.caller
1771+ let $t05397954035 = _checkpoint(user)
1772+ let checkpointActions = $t05397954035._1
1773+ let userProfits = $t05397954035._2
1774+ $Tuple2(nil, userProfits)
1775+ }
1776+
1777+
1778+
1779+@Callable(i)
16811780 func checkpoint (user_) = {
1682- let user = if ((size(user_) > 0))
1683- then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
1684- else i.caller
1685- _checkpoint(user)
1781+ let err = if (_whenInitialized())
1782+ then _whenNotPaused()
1783+ else false
1784+ if ((err == err))
1785+ then {
1786+ let user = if ((size(user_) > 0))
1787+ then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
1788+ else i.caller
1789+ _checkpoint(user)
1790+ }
1791+ else throw("Strict value is not equal to itself.")
16861792 }
16871793
16881794
16891795
16901796 @Callable(i)
16911797 func stake () = {
1692- let storage = _loadStorage()
1693- let lpAssetIdStr = _assetToStr(storage._1)
1694- let err = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
1695- then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
1696- else false)
1697- then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
1798+ let err = if (_whenInitialized())
1799+ then _whenNotPaused()
16981800 else false
16991801 if ((err == err))
17001802 then {
1701- let $t05279252852 = _checkpoint(i.caller)
1702- let checkpointActions = $t05279252852._1
1703- let userProfits = $t05279252852._2
1704- $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
1803+ let storage = _loadStorage()
1804+ let lpAssetIdStr = _assetToStr(storage._1)
1805+ let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
1806+ then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
1807+ else false)
1808+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
1809+ else false
1810+ if ((err1 == err1))
1811+ then {
1812+ let $t05491954979 = _checkpoint(i.caller)
1813+ let checkpointActions = $t05491954979._1
1814+ let userProfits = $t05491954979._2
1815+ $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
1816+ }
1817+ else throw("Strict value is not equal to itself.")
17051818 }
17061819 else throw("Strict value is not equal to itself.")
17071820 }
17101823
17111824 @Callable(i)
17121825 func unstake (amount_) = {
1713- let storage = _loadStorage()
1714- let lpAssetId = storage._1
1715- let userLp = _loadUserLp(i.caller)
1716- let err = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
1826+ let err = if (_whenInitialized())
1827+ then _whenNotPaused()
1828+ else false
17171829 if ((err == err))
17181830 then {
1719- let $t05328953349 = _checkpoint(i.caller)
1720- let checkpointActions = $t05328953349._1
1721- let userProfits = $t05328953349._2
1722- $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
1831+ let storage = _loadStorage()
1832+ let lpAssetId = storage._1
1833+ let userLp = _loadUserLp(i.caller)
1834+ let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
1835+ if ((err1 == err1))
1836+ then {
1837+ let $t05549055550 = _checkpoint(i.caller)
1838+ let checkpointActions = $t05549055550._1
1839+ let userProfits = $t05549055550._2
1840+ $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
1841+ }
1842+ else throw("Strict value is not equal to itself.")
17231843 }
17241844 else throw("Strict value is not equal to itself.")
17251845 }
17271847
17281848
17291849 @Callable(i)
1730-func claim (user_,assetId_,amount_) = {
1731- let user = if ((size(user_) > 0))
1732- then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
1733- else i.caller
1734- let storage = _loadStorage()
1735- let lpAssetId = storage._1
1736- let lpAssetIdStr = _assetToStr(lpAssetId)
1737- let assets = [lpAssetIdStr, _loadAssets()]
1738- let userLp = _loadUserLp(user)
1739- let err = if (_validateListContains(assets, assetId_, "claim: invalid assetId"))
1740- then _validateInt(amount_, 0, MAX_INT, "claim: invalid amount")
1850+func claim (user_,assets_) = {
1851+ let err = if (if (_whenInitialized())
1852+ then _whenNotPaused()
1853+ else false)
1854+ then _validateInt(size(assets_), 1, 10, "claim: invalid assets size")
17411855 else false
17421856 if ((err == err))
17431857 then {
1744- let $t05415654212 = _checkpoint(user)
1745- let checkpointActions = $t05415654212._1
1746- let userProfits = $t05415654212._2
1747- let assetIndex = value(indexOf(assets, assetId_))
1748- func foldFunc (acc,elem) = {
1858+ let user = if ((size(user_) > 0))
1859+ then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
1860+ else i.caller
1861+ let storage = _loadStorage()
1862+ let lpAssetId = storage._1
1863+ let lpAssetIdStr = _assetToStr(lpAssetId)
1864+ let assets = [lpAssetIdStr, _loadAssets()]
1865+ let maxIndex = (size(assets) - 1)
1866+ let userLp = _loadUserLp(user)
1867+ let $t05637356429 = _checkpoint(user)
1868+ let checkpointActions = $t05637356429._1
1869+ let userProfits = $t05637356429._2
1870+ func foldFunc (acc,profit) = {
17491871 let index = acc._1
1750- if ((index == assetIndex))
1751- then if ((amount_ > elem))
1752- then throw("claim: insufficient amount")
1753- else $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
1754- else $Tuple2((index + 1), (acc._2 :+ elem))
1872+ if ((index > maxIndex))
1873+ then $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
1874+ else {
1875+ let asset = assets[index]
1876+ if (containsElement(assets_, asset))
1877+ then $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
1878+ else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
1879+ }
17551880 }
17561881
1757- let $t05461154683 = {
1882+ let $t05691857009 = {
17581883 let $l = userProfits
17591884 let $s = size($l)
1760- let $acc0 = $Tuple2(0, nil)
1885+ let $acc0 = $Tuple3(0, nil, nil)
17611886 func $f0_1 ($a,$i) = if (($i >= $s))
17621887 then $a
17631888 else foldFunc($a, $l[$i])
17681893
17691894 $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)
17701895 }
1771- let idx = $t05461154683._1
1772- let userProfitsUpdated = $t05461154683._2
1773- $Tuple2((([ScriptTransfer(user, amount_, _strToAsset(assetId_))] ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
1896+ let idx = $t05691857009._1
1897+ let userProfitsUpdated = $t05691857009._2
1898+ let profitActions = $t05691857009._3
1899+ $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
17741900 }
1901+ else throw("Strict value is not equal to itself.")
1902+ }
1903+
1904+
1905+
1906+@Callable(i)
1907+func pause () = {
1908+ let err = if (if (_onlyPauser(i.caller))
1909+ then _whenInitialized()
1910+ else false)
1911+ then _whenNotPaused()
1912+ else false
1913+ if ((err == err))
1914+ then $Tuple2(_savePause(true), unit)
1915+ else throw("Strict value is not equal to itself.")
1916+ }
1917+
1918+
1919+
1920+@Callable(i)
1921+func unpause () = {
1922+ let err = if (if (_onlyPauser(i.caller))
1923+ then _whenInitialized()
1924+ else false)
1925+ then _whenPaused()
1926+ else false
1927+ if ((err == err))
1928+ then $Tuple2(_savePause(false), unit)
1929+ else throw("Strict value is not equal to itself.")
1930+ }
1931+
1932+
1933+
1934+@Callable(i)
1935+func updatePauser (pauser_) = {
1936+ let err = if (if (_onlyThisContract(i.caller))
1937+ then _whenInitialized()
1938+ else false)
1939+ then _validateAddress(pauser_, "updatePauser: invalid pauser")
1940+ else false
1941+ if ((err == err))
1942+ then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
17751943 else throw("Strict value is not equal to itself.")
17761944 }
17771945
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVES = "waves"
77
88 let MAX_INT = 9223372036854775807
99
1010 let MAX_FEE = 1000000
1111
1212 let MAX_AMPLIFIER = 1000000
1313
1414 let MAX_WEIGHT_AMPLIFIER = 1000000
1515
1616 let MAX_WEIGHT = 1000000
1717
1818 let SLIPPAGE_RATE_FACTOR = 1000000
1919
2020 let FEE_RATE_FACTOR = 1000000
2121
2222 let RATE_FACTOR = 1000000
2323
2424 let PERCENT_FACTOR = toBigInt(1000000000000)
2525
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
3030 let ZERO_BIGINT = toBigInt(0)
3131
3232 let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
3333
3434 let INT_DECIMALS = 8
3535
3636 let BIGINT_DECIMALS = 18
3737
3838 let PRECISION = 1000000
3939
4040 let LIST_25 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
41+
42+let KEY_MULTISIG = "MULTISIG"
43+
44+let KEY_STATUS = "STATUS"
45+
46+let KEY_PAUSED = "PAUSED"
47+
48+let KEY_PAUSER = "PAUSER"
4149
4250 let KEY_STORAGE = "STORAGE"
4351
4452 let KEY_ASSETS = "ASSETS"
4553
4654 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
4755
4856 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
4957
5058 let KEY_LP_FEE = "LP_FEE"
5159
5260 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
5361
5462 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
5563
5664 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
5765
5866 let KEY_USER_LP = "USER_LP"
5967
6068 let KEY_TOTAL_LP = "TOTAL_LP"
6169
6270 let KEY_USER_PROFITS = "USER_PROFITS"
6371
6472 func _validateAddress (address_,err_) = match addressFromString(address_) {
6573 case a: Address =>
6674 true
6775 case _ =>
6876 throw(err_)
6977 }
7078
7179
7280 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
7381 then true
7482 else match assetInfo(fromBase58String(assetId_)) {
7583 case a: Asset =>
7684 true
7785 case _ =>
7886 throw(err_)
7987 }
8088
8189
8290 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
8391 then true
8492 else (val_ > upperBoundary_))
8593 then throw(err_)
8694 else true
8795
8896
8997 func _validateBool (val_,target_,err_) = if ((val_ != target_))
9098 then throw(err_)
9199 else true
92100
93101
94102 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
95103 then throw(err_)
96104 else true
97105
98106
99107 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
100108 then throw(err_)
101109 else true
102110
103111
104112 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
105113 func foldFunc (acc,elem) = match parseInt(elem) {
106114 case a: Int =>
107115 if (acc)
108116 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
109117 else false
110118 case _ =>
111119 throw(err_)
112120 }
113121
114122 let $l = val_
115123 let $s = size($l)
116124 let $acc0 = true
117125 func $f0_1 ($a,$i) = if (($i >= $s))
118126 then $a
119127 else foldFunc($a, $l[$i])
120128
121129 func $f0_2 ($a,$i) = if (($i >= $s))
122130 then $a
123131 else throw("List size exceeds 10")
124132
125133 $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)
126134 }
127135
128136
129137 func _validateAssets (assets_,err_) = {
130138 func foldFunc (acc,elem) = if (acc)
131139 then _validateAsset(elem, err_)
132140 else false
133141
134142 let $l = assets_
135143 let $s = size($l)
136144 let $acc0 = true
137145 func $f0_1 ($a,$i) = if (($i >= $s))
138146 then $a
139147 else foldFunc($a, $l[$i])
140148
141149 func $f0_2 ($a,$i) = if (($i >= $s))
142150 then $a
143151 else throw("List size exceeds 10")
144152
145153 $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)
146154 }
147155
148156
149157 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
150158 then throw(err_)
151159 else true
152160
153161
154162 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
155163 then true
156164 else (size(val_) > 16))
157165 then throw(err_)
158166 else true
159167
160168
161169 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
162170 then throw(err_)
163171 else true
164172
165173
166174 func _validateDecimals (val_,err_) = if (if ((0 > val_))
167175 then true
168176 else (val_ > 8))
169177 then throw(err_)
170178 else true
171179
172180
173181 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
174182 case a: ByteVector =>
175183 if ((assetId_ != toBase58String(a)))
176184 then throw((err_ + ": asset"))
177185 else if ((requiredAmount_ > payment_.amount))
178186 then throw((err_ + ": amount"))
179187 else true
180188 case _ =>
181189 throw((err_ + ": asset"))
182190 }
183191
184192
185193 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
186194 then throw(err_)
187195 else true
188196
189197
190198 func _assetToStr (asset_) = match asset_ {
191199 case a: ByteVector =>
192200 toBase58String(a)
193201 case _ =>
194202 WAVES
195203 }
196204
197205
198206 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
199207 then true
200208 else (asset_ == ""))
201209 then unit
202210 else fromBase58String(asset_)
211+
212+
213+func _loadPause () = match getBoolean(KEY_PAUSED) {
214+ case a: Boolean =>
215+ a
216+ case _ =>
217+ false
218+}
219+
220+
221+func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
222+
223+
224+func _loadPauser () = match getString(KEY_PAUSER) {
225+ case a: String =>
226+ addressFromStringValue(a)
227+ case _ =>
228+ Address(base58'')
229+}
230+
231+
232+func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
233+
234+
235+func _loadMultisig () = match getString(KEY_MULTISIG) {
236+ case a: String =>
237+ addressFromStringValue(a)
238+ case _ =>
239+ Address(base58'')
240+}
241+
242+
243+func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
203244
204245
205246 func _loadStorage () = match getString(KEY_STORAGE) {
206247 case a: String =>
207248 let struct = split(a, SEP)
208249 $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]))
209250 case _ =>
210251 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
211252 }
212253
213254
214255 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
215256 then "1"
216257 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))]
217258
218259
219260 func _loadAssets () = match getString(KEY_ASSETS) {
220261 case a: String =>
221262 if ((size(a) > 0))
222263 then split_51C(a, SEP)
223264 else nil
224265 case _ =>
225266 nil
226267 }
227268
228269
229270 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
230271
231272
232273 func _loadAssetBalances () = {
233274 func foldFunc (acc,elem) = {
234275 let balance = parseIntValue(elem)
235276 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
236277 }
237278
238279 match getString(KEY_ASSET_BALANCES) {
239280 case a: String =>
240281 if ((size(a) > 0))
241282 then {
242283 let $l = split_51C(a, SEP)
243284 let $s = size($l)
244285 let $acc0 = $Tuple2(nil, 0)
245286 func $f0_1 ($a,$i) = if (($i >= $s))
246287 then $a
247288 else foldFunc($a, $l[$i])
248289
249290 func $f0_2 ($a,$i) = if (($i >= $s))
250291 then $a
251292 else throw("List size exceeds 10")
252293
253294 $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)
254295 }
255296 else $Tuple2(ZERO_INT_LIST_10, 0)
256297 case _ =>
257298 $Tuple2(ZERO_INT_LIST_10, 0)
258299 }
259300 }
260301
261302
262303 func _saveAssetBalances (balances_) = {
263304 func foldFunc (acc,elem) = (acc :+ toString(elem))
264305
265306 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
266307 let $l = balances_
267308 let $s = size($l)
268309 let $acc0 = nil
269310 func $f0_1 ($a,$i) = if (($i >= $s))
270311 then $a
271312 else foldFunc($a, $l[$i])
272313
273314 func $f0_2 ($a,$i) = if (($i >= $s))
274315 then $a
275316 else throw("List size exceeds 10")
276317
277318 $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)
278319 }, SEP))]
279320 }
280321
281322
282323 func _loadAssetWeights () = {
283324 func foldFunc (acc,elem) = {
284325 let weight = parseIntValue(elem)
285326 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
286327 }
287328
288329 match getString(KEY_ASSET_WEIGHTS) {
289330 case a: String =>
290331 if ((size(a) > 0))
291332 then {
292333 let $l = split_51C(a, SEP)
293334 let $s = size($l)
294335 let $acc0 = $Tuple2(nil, 0)
295336 func $f0_1 ($a,$i) = if (($i >= $s))
296337 then $a
297338 else foldFunc($a, $l[$i])
298339
299340 func $f0_2 ($a,$i) = if (($i >= $s))
300341 then $a
301342 else throw("List size exceeds 10")
302343
303344 $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)
304345 }
305346 else $Tuple2(ZERO_INT_LIST_10, 0)
306347 case _ =>
307348 $Tuple2(ZERO_INT_LIST_10, 0)
308349 }
309350 }
310351
311352
312353 func _saveAssetWeights (weights_) = {
313354 func foldFunc (acc,elem) = (acc :+ toString(elem))
314355
315356 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
316357 let $l = weights_
317358 let $s = size($l)
318359 let $acc0 = nil
319360 func $f0_1 ($a,$i) = if (($i >= $s))
320361 then $a
321362 else foldFunc($a, $l[$i])
322363
323364 func $f0_2 ($a,$i) = if (($i >= $s))
324365 then $a
325366 else throw("List size exceeds 10")
326367
327368 $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)
328369 }, SEP))]
329370 }
330371
331372
332373 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
333374 case a: Int =>
334375 a
335376 case _ =>
336377 0
337378 }
338379
339380
340381 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
341382
342383
343384 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
344385 case a: Int =>
345386 a
346387 case _ =>
347388 0
348389 }
349390
350391
351392 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
352393
353394
354395 func _loadSigmaFeePerLp () = {
355396 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
356397
357398 match getString(KEY_SIGMA_FEE_PER_LP) {
358399 case a: String =>
359400 if ((size(a) > 0))
360401 then {
361402 let $l = split_51C(a, SEP)
362403 let $s = size($l)
363404 let $acc0 = nil
364405 func $f0_1 ($a,$i) = if (($i >= $s))
365406 then $a
366407 else foldFunc($a, $l[$i])
367408
368409 func $f0_2 ($a,$i) = if (($i >= $s))
369410 then $a
370411 else throw("List size exceeds 11")
371412
372413 $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)
373414 }
374415 else ZERO_BIGINT_LIST_11
375416 case _ =>
376417 ZERO_BIGINT_LIST_11
377418 }
378419 }
379420
380421
381422 func _saveSigmaFeePerLp (val_) = {
382423 func foldFunc (acc,elem) = (acc :+ toString(elem))
383424
384425 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
385426 let $l = val_
386427 let $s = size($l)
387428 let $acc0 = nil
388429 func $f0_1 ($a,$i) = if (($i >= $s))
389430 then $a
390431 else foldFunc($a, $l[$i])
391432
392433 func $f0_2 ($a,$i) = if (($i >= $s))
393434 then $a
394435 else throw("List size exceeds 11")
395436
396437 $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)
397438 }, SEP))]
398439 }
399440
400441
401442 func _loadUserSigmaFeePerLp (user_) = {
402443 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
403444
404445 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
405446 case a: String =>
406447 if ((size(a) > 0))
407448 then {
408449 let $l = split_51C(a, SEP)
409450 let $s = size($l)
410451 let $acc0 = nil
411452 func $f0_1 ($a,$i) = if (($i >= $s))
412453 then $a
413454 else foldFunc($a, $l[$i])
414455
415456 func $f0_2 ($a,$i) = if (($i >= $s))
416457 then $a
417458 else throw("List size exceeds 11")
418459
419460 $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)
420461 }
421462 else ZERO_BIGINT_LIST_11
422463 case _ =>
423464 ZERO_BIGINT_LIST_11
424465 }
425466 }
426467
427468
428469 func _saveUserSigmaFeePerLp (user_,val_) = {
429470 func foldFunc (acc,elem) = (acc :+ toString(elem))
430471
431472 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
432473 let $l = val_
433474 let $s = size($l)
434475 let $acc0 = nil
435476 func $f0_1 ($a,$i) = if (($i >= $s))
436477 then $a
437478 else foldFunc($a, $l[$i])
438479
439480 func $f0_2 ($a,$i) = if (($i >= $s))
440481 then $a
441482 else throw("List size exceeds 11")
442483
443484 $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)
444485 }, SEP))]
445486 }
446487
447488
448489 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
449490 case a: Int =>
450491 a
451492 case _ =>
452493 0
453494 }
454495
455496
456497 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
457498
458499
459500 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
460501 case a: Int =>
461502 a
462503 case _ =>
463504 0
464505 }
465506
466507
467508 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
468509
469510
470511 func _loadUserProfits (user_) = {
471512 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
472513
473514 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
474515 case a: String =>
475516 if ((size(a) > 0))
476517 then {
477518 let $l = split_51C(a, SEP)
478519 let $s = size($l)
479520 let $acc0 = nil
480521 func $f0_1 ($a,$i) = if (($i >= $s))
481522 then $a
482523 else foldFunc($a, $l[$i])
483524
484525 func $f0_2 ($a,$i) = if (($i >= $s))
485526 then $a
486527 else throw("List size exceeds 11")
487528
488529 $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)
489530 }
490531 else ZERO_INT_LIST_11
491532 case _ =>
492533 ZERO_INT_LIST_11
493534 }
494535 }
495536
496537
497538 func _saveUserProfits (user_,val_) = {
498539 func foldFunc (acc,elem) = (acc :+ toString(elem))
499540
500541 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
501542 let $l = val_
502543 let $s = size($l)
503544 let $acc0 = nil
504545 func $f0_1 ($a,$i) = if (($i >= $s))
505546 then $a
506547 else foldFunc($a, $l[$i])
507548
508549 func $f0_2 ($a,$i) = if (($i >= $s))
509550 then $a
510551 else throw("List size exceeds 11")
511552
512553 $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)
513554 }, SEP))]
514555 }
515556
516557
558+func _onlyThisContract (caller_) = if ((caller_ != this))
559+ then throw("_onlyThisContract: revert")
560+ else true
561+
562+
563+func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
564+ then throw("_whenMultisigSet: revert")
565+ else true
566+
567+
517568 func _whenNotInitialized () = {
518569 let storage = _loadStorage()
519570 if ((storage._1 != base58''))
520571 then throw("_whenNotInitialized: revert")
521572 else true
522573 }
523574
524575
525576 func _whenInitialized () = {
526577 let storage = _loadStorage()
527578 if ((storage._1 == base58''))
528579 then throw("_whenInitialized: revert")
529580 else true
530581 }
582+
583+
584+func _whenNotPaused () = if (_loadPause())
585+ then throw("_whenNotPaused: revert")
586+ else true
587+
588+
589+func _whenPaused () = if (!(_loadPause()))
590+ then throw("_whenPaused: revert")
591+ else true
592+
593+
594+func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
595+ then throw("_onlyPauser: revert")
596+ else true
531597
532598
533599 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
534600 case a: Asset =>
535601 a.decimals
536602 case _ =>
537603 throw(("_getDecimals: no asset=" + assetId_))
538604 }
539605
540606
541607 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
542608 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
543609 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
544610
545611
546612 func _prepareAssetBalances (assets_) = {
547613 func foldFunc (acc,elem) = (acc :+ 0)
548614
549615 let $l = assets_
550616 let $s = size($l)
551617 let $acc0 = nil
552618 func $f0_1 ($a,$i) = if (($i >= $s))
553619 then $a
554620 else foldFunc($a, $l[$i])
555621
556622 func $f0_2 ($a,$i) = if (($i >= $s))
557623 then $a
558624 else throw("List size exceeds 10")
559625
560626 $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)
561627 }
562628
563629
564630 func _prepareAssetWeights (assetWeights_) = {
565631 func foldFunc (acc,elem) = {
566632 let weight = parseIntValue(elem)
567633 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
568634 }
569635
570636 let $l = assetWeights_
571637 let $s = size($l)
572638 let $acc0 = $Tuple2(nil, 0)
573639 func $f0_1 ($a,$i) = if (($i >= $s))
574640 then $a
575641 else foldFunc($a, $l[$i])
576642
577643 func $f0_2 ($a,$i) = if (($i >= $s))
578644 then $a
579645 else throw("List size exceeds 10")
580646
581647 $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)
582648 }
583649
584650
585651 func _getAssetBalances (assets_,decimals_) = {
586652 func foldFunc (acc,elem) = {
587653 let assetDecimals = _getDecimals(elem)
588654 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
589655 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
590656 }
591657
592658 let $l = assets_
593659 let $s = size($l)
594660 let $acc0 = $Tuple2(nil, 0)
595661 func $f0_1 ($a,$i) = if (($i >= $s))
596662 then $a
597663 else foldFunc($a, $l[$i])
598664
599665 func $f0_2 ($a,$i) = if (($i >= $s))
600666 then $a
601667 else throw("List size exceeds 10")
602668
603669 $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)
604670 }
605671
606672
607673 func _listIntToString (assets_) = {
608674 func foldFunc (acc,elem) = (acc :+ toString(elem))
609675
610676 makeString({
611677 let $l = assets_
612678 let $s = size($l)
613679 let $acc0 = nil
614680 func $f0_1 ($a,$i) = if (($i >= $s))
615681 then $a
616682 else foldFunc($a, $l[$i])
617683
618684 func $f0_2 ($a,$i) = if (($i >= $s))
619685 then $a
620686 else throw("List size exceeds 11")
621687
622688 $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)
623689 }, SEP)
624690 }
625691
626692
627693 func _listBigIntToString (assets_) = {
628694 func foldFunc (acc,elem) = (acc :+ toString(elem))
629695
630696 makeString({
631697 let $l = assets_
632698 let $s = size($l)
633699 let $acc0 = nil
634700 func $f0_1 ($a,$i) = if (($i >= $s))
635701 then $a
636702 else foldFunc($a, $l[$i])
637703
638704 func $f0_2 ($a,$i) = if (($i >= $s))
639705 then $a
640706 else throw("List size exceeds 11")
641707
642708 $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)
643709 }, SEP)
644710 }
645711
646712
647713 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
648714 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
649715
650716 let $l = weights_
651717 let $s = size($l)
652718 let $acc0 = nil
653719 func $f0_1 ($a,$i) = if (($i >= $s))
654720 then $a
655721 else foldFunc($a, $l[$i])
656722
657723 func $f0_2 ($a,$i) = if (($i >= $s))
658724 then $a
659725 else throw("List size exceeds 10")
660726
661727 $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)
662728 }
663729
664730
665731 func _incrementBalancesByAmounts (balances_,amounts_) = {
666732 func foldFunc (acc,elem) = {
667733 let index = acc._1
668734 let amount = amounts_[index]
669735 let newBalance = (elem + amount)
670736 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
671737 }
672738
673739 let result = {
674740 let $l = balances_
675741 let $s = size($l)
676742 let $acc0 = $Tuple3(0, nil, 0)
677743 func $f0_1 ($a,$i) = if (($i >= $s))
678744 then $a
679745 else foldFunc($a, $l[$i])
680746
681747 func $f0_2 ($a,$i) = if (($i >= $s))
682748 then $a
683749 else throw("List size exceeds 10")
684750
685751 $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)
686752 }
687753 $Tuple2(result._2, result._3)
688754 }
689755
690756
691757 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
692758 func foldFunc (acc,elem) = {
693759 let index = acc._1
694760 let payment = payments_[index]
695761 let paymentAssetStr = _assetToStr(payment.assetId)
696762 let err = if ((paymentAssetStr != assets_[index]))
697763 then throw(((err_ + ": index=") + toString(index)))
698764 else unit
699765 if ((err == err))
700766 then {
701767 let assetDecimals = _getDecimals(paymentAssetStr)
702768 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
703769 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
704770 }
705771 else throw("Strict value is not equal to itself.")
706772 }
707773
708774 let result = {
709775 let $l = balances_
710776 let $s = size($l)
711777 let $acc0 = $Tuple3(0, nil, 0)
712778 func $f0_1 ($a,$i) = if (($i >= $s))
713779 then $a
714780 else foldFunc($a, $l[$i])
715781
716782 func $f0_2 ($a,$i) = if (($i >= $s))
717783 then $a
718784 else throw("List size exceeds 10")
719785
720786 $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)
721787 }
722788 $Tuple2(result._2, result._3)
723789 }
724790
725791
726792 func _incrementBalanceByIndex (balances_,index_,amount_) = {
727793 func foldFunc (acc,elem) = {
728794 let index = acc._1
729795 if ((index == index_))
730796 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
731797 else $Tuple2((index + 1), (acc._2 :+ elem))
732798 }
733799
734800 let result = {
735801 let $l = balances_
736802 let $s = size($l)
737803 let $acc0 = $Tuple2(0, nil)
738804 func $f0_1 ($a,$i) = if (($i >= $s))
739805 then $a
740806 else foldFunc($a, $l[$i])
741807
742808 func $f0_2 ($a,$i) = if (($i >= $s))
743809 then $a
744810 else throw("List size exceeds 10")
745811
746812 $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)
747813 }
748814 result._2
749815 }
750816
751817
752818 func _decrementBalanceByIndex (balances_,index_,amount_) = {
753819 func foldFunc (acc,elem) = {
754820 let index = acc._1
755821 if ((index == index_))
756822 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
757823 else $Tuple2((index + 1), (acc._2 :+ elem))
758824 }
759825
760826 let result = {
761827 let $l = balances_
762828 let $s = size($l)
763829 let $acc0 = $Tuple2(0, nil)
764830 func $f0_1 ($a,$i) = if (($i >= $s))
765831 then $a
766832 else foldFunc($a, $l[$i])
767833
768834 func $f0_2 ($a,$i) = if (($i >= $s))
769835 then $a
770836 else throw("List size exceeds 10")
771837
772838 $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)
773839 }
774840 result._2
775841 }
776842
777843
778844 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
779845 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
780846 func foldFunc (acc,elem) = {
781847 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
782848 let deltaBalance = (elem - newBalance)
783849 $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
784850 }
785851
786852 let $l = balances_
787853 let $s = size($l)
788854 let $acc0 = $Tuple3(nil, 0, nil)
789855 func $f0_1 ($a,$i) = if (($i >= $s))
790856 then $a
791857 else foldFunc($a, $l[$i])
792858
793859 func $f0_2 ($a,$i) = if (($i >= $s))
794860 then $a
795861 else throw("List size exceeds 10")
796862
797863 $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)
798864 }
799865
800866
801867 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
802868 func foldFunc (acc,elem) = {
803869 let index = acc._1
804870 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
805871 }
806872
807873 let result = {
808874 let $l = assets_
809875 let $s = size($l)
810876 let $acc0 = $Tuple2(0, nil)
811877 func $f0_1 ($a,$i) = if (($i >= $s))
812878 then $a
813879 else foldFunc($a, $l[$i])
814880
815881 func $f0_2 ($a,$i) = if (($i >= $s))
816882 then $a
817883 else throw("List size exceeds 10")
818884
819885 $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)
820886 }
821887 result._2
822888 }
823889
824890
825891 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
826892 then {
827893 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
828894 if ((threshold > balance_))
829895 then {
830896 let maxDeviation = (threshold - balance_)
831897 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
832898 if ((feeRate > feeMaxRate_))
833899 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
834900 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
835901 }
836902 else 0
837903 }
838904 else {
839905 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
840906 if ((balance_ > threshold))
841907 then {
842908 let maxDeviation = (balance_ - threshold)
843909 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
844910 if ((feeRate > feeMaxRate_))
845911 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
846912 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
847913 }
848914 else 0
849915 }
850916
851917
852918 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
853919 func foldFunc (acc,balance) = {
854920 let index = acc._1
855921 let equilibrium = fraction(assetsTotalSupply_, weights_[index], sigmaWeight_)
856922 $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
857923 }
858924
859925 let result = {
860926 let $l = balances_
861927 let $s = size($l)
862928 let $acc0 = $Tuple2(0, 0)
863929 func $f0_1 ($a,$i) = if (($i >= $s))
864930 then $a
865931 else foldFunc($a, $l[$i])
866932
867933 func $f0_2 ($a,$i) = if (($i >= $s))
868934 then $a
869935 else throw("List size exceeds 10")
870936
871937 $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)
872938 }
873939 result._2
874940 }
875941
876942
877943 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
878944 then true
879945 else (lpTotalSupply_ == 0))
880946 then true
881947 else {
882948 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
883949 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
884950 let diff = (newAssetsRate - prevAssetsRate)
885951 if (if ((0 >= diff))
886952 then ((-1 * RATE_FACTOR) > diff)
887953 else false)
888954 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
889955 else true
890956 }
891957
892958
893959 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
894960 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
895961 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
896962 let diff = (newUtil - prevUtil)
897963 if (if ((0 >= diff))
898964 then ((-1 * RATE_FACTOR) > diff)
899965 else false)
900966 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
901967 else true
902968 }
903969
904970
905971 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
906972 let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
907973 let maxAllocationAmp = if ((balance_ > equilibrium))
908974 then (MAX_AMPLIFIER + maxAllocAmp_)
909975 else (MAX_AMPLIFIER - maxAllocAmp_)
910976 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
911977 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
912978 if ((balance_ > equilibrium))
913979 then if ((balance_ > maxAllocation))
914980 then if ((prevMaxAllocation > prevBalance_))
915981 then throw("_validateAssetAllocation: new up")
916982 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
917983 then throw("_validateAssetAllocation: still up")
918984 else true
919985 else true
920986 else if ((maxAllocation > balance_))
921987 then if ((prevBalance_ > prevMaxAllocation))
922988 then throw("_validateAssetAllocation: new down")
923989 else if (((prevMaxAllocation - prevBalance_) > (maxAllocation - balance_)))
924990 then throw("_validateAssetAllocation: still down")
925991 else true
926992 else true
927993 }
928994
929995
930996 func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
931997 func foldFunc (acc,elem) = {
932998 let index = acc._1
933999 $Tuple2((index + 1), if (acc._2)
9341000 then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
9351001 else false)
9361002 }
9371003
9381004 let result = {
9391005 let $l = assetBalances_
9401006 let $s = size($l)
9411007 let $acc0 = $Tuple2(0, true)
9421008 func $f0_1 ($a,$i) = if (($i >= $s))
9431009 then $a
9441010 else foldFunc($a, $l[$i])
9451011
9461012 func $f0_2 ($a,$i) = if (($i >= $s))
9471013 then $a
9481014 else throw("List size exceeds 10")
9491015
9501016 $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)
9511017 }
9521018 result._2
9531019 }
9541020
9551021
9561022 func _checkpoint (user_) = {
9571023 let userLp = _loadUserLp(user_)
9581024 let userProfits = _loadUserProfits(user_)
9591025 let sigmaFeePerLp = _loadSigmaFeePerLp()
9601026 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
9611027 func foldFunc (acc,elem) = {
9621028 let index = acc._1
9631029 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
9641030 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
9651031 }
9661032
967- let $t02293123004 = {
1033+ let $t02430924382 = {
9681034 let $l = ZERO_INT_LIST_11
9691035 let $s = size($l)
9701036 let $acc0 = $Tuple2(0, nil)
9711037 func $f0_1 ($a,$i) = if (($i >= $s))
9721038 then $a
9731039 else foldFunc($a, $l[$i])
9741040
9751041 func $f0_2 ($a,$i) = if (($i >= $s))
9761042 then $a
9771043 else throw("List size exceeds 11")
9781044
9791045 $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)
9801046 }
981- let idx = $t02293123004._1
982- let profitsUpdated = $t02293123004._2
1047+ let idx = $t02430924382._1
1048+ let profitsUpdated = $t02430924382._2
9831049 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
9841050 }
9851051
9861052
9871053 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
9881054 func foldFunc (acc,elem) = {
9891055 let index = acc._1
9901056 let sigmaFeePerLpUpdated = if ((index_ == index))
9911057 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
9921058 else sigmaFeePerLp_[index]
9931059 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
9941060 }
9951061
996- let $t02365423733 = {
1062+ let $t02503225111 = {
9971063 let $l = ZERO_INT_LIST_11
9981064 let $s = size($l)
9991065 let $acc0 = $Tuple2(0, nil)
10001066 func $f0_1 ($a,$i) = if (($i >= $s))
10011067 then $a
10021068 else foldFunc($a, $l[$i])
10031069
10041070 func $f0_2 ($a,$i) = if (($i >= $s))
10051071 then $a
10061072 else throw("List size exceeds 11")
10071073
10081074 $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)
10091075 }
1010- let idx = $t02365423733._1
1011- let sigmaFeePerLpUpdated = $t02365423733._2
1076+ let idx = $t02503225111._1
1077+ let sigmaFeePerLpUpdated = $t02503225111._2
10121078 sigmaFeePerLpUpdated
10131079 }
10141080
10151081
10161082 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_,isFullAmount_) = {
10171083 let sigmaFeePerLp = _loadSigmaFeePerLp()
10181084 let totalLp = _loadTotalLp()
1019- let $t02397824686 = if (isFullAmount_)
1085+ let $t02535626064 = if (isFullAmount_)
10201086 then if ((totalLp == 0))
10211087 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10221088 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
10231089 else if ((totalLp == 0))
10241090 then $Tuple2(0, fraction(amount_, protocolFeeRate_, (MAX_FEE - protocolFeeRate_)))
10251091 else $Tuple2(fraction(amount_, lpFeeRate_, ((MAX_FEE - lpFeeRate_) - protocolFeeRate_)), fraction(amount_, protocolFeeRate_, ((MAX_FEE - lpFeeRate_) - protocolFeeRate_)))
1026- let lpFee = $t02397824686._1
1027- let protocolFee = $t02397824686._2
1092+ let lpFee = $t02535626064._1
1093+ let protocolFee = $t02535626064._2
10281094 let sigmaFeePerLpUpdated = if ((lpFee == 0))
10291095 then sigmaFeePerLp
10301096 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
10311097 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
10321098 }
10331099
10341100
10351101 func _depositAll (amount_) = {
10361102 let storage = _loadStorage()
10371103 let lpTotalSupply = storage._3
10381104 let weightAmplifier = storage._7
10391105 let slippageRate = storage._8
10401106 let feeMaxRate = storage._9
10411107 let assets = _loadAssets()
1042- let $t02519525248 = _loadAssetWeights()
1043- let assetWeights = $t02519525248._1
1044- let sigmaWeight = $t02519525248._2
1045- let $t02525325321 = _loadAssetBalances()
1046- let prevAssetBalances = $t02525325321._1
1047- let prevAssetTotalSupply = $t02525325321._2
1048- let $t02532726557 = if ((prevAssetTotalSupply == 0))
1108+ let $t02657326626 = _loadAssetWeights()
1109+ let assetWeights = $t02657326626._1
1110+ let sigmaWeight = $t02657326626._2
1111+ let $t02663126699 = _loadAssetBalances()
1112+ let prevAssetBalances = $t02663126699._1
1113+ let prevAssetTotalSupply = $t02663126699._2
1114+ let $t02670527935 = if ((prevAssetTotalSupply == 0))
10491115 then {
10501116 func foldFunc (acc,elem) = {
10511117 let index = acc._1
10521118 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
10531119 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
10541120 }
10551121
1056- let $t02576925843 = {
1122+ let $t02714727221 = {
10571123 let $l = assets
10581124 let $s = size($l)
10591125 let $acc0 = $Tuple2(0, nil)
10601126 func $f0_1 ($a,$i) = if (($i >= $s))
10611127 then $a
10621128 else foldFunc($a, $l[$i])
10631129
10641130 func $f0_2 ($a,$i) = if (($i >= $s))
10651131 then $a
10661132 else throw("List size exceeds 10")
10671133
10681134 $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)
10691135 }
1070- let idx = $t02576925843._1
1071- let requiredAmountsNormalized = $t02576925843._2
1136+ let idx = $t02714727221._1
1137+ let requiredAmountsNormalized = $t02714727221._2
10721138 $Tuple2(amount_, requiredAmountsNormalized)
10731139 }
10741140 else {
10751141 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
10761142 func foldFunc1 (acc,elem) = {
10771143 let index = acc._1
10781144 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
10791145 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
10801146 }
10811147
1082- let $t02638626461 = {
1148+ let $t02776427839 = {
10831149 let $l = assets
10841150 let $s = size($l)
10851151 let $acc0 = $Tuple2(0, nil)
10861152 func $f0_1 ($a,$i) = if (($i >= $s))
10871153 then $a
10881154 else foldFunc1($a, $l[$i])
10891155
10901156 func $f0_2 ($a,$i) = if (($i >= $s))
10911157 then $a
10921158 else throw("List size exceeds 10")
10931159
10941160 $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)
10951161 }
1096- let idx = $t02638626461._1
1097- let requiredAmountsNormalized = $t02638626461._2
1162+ let idx = $t02776427839._1
1163+ let requiredAmountsNormalized = $t02776427839._2
10981164 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
10991165 }
1100- let lpTokensToMint = $t02532726557._1
1101- let requiredAmountsNormalized = $t02532726557._2
1102- let $t02656326676 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1103- let assetBalances = $t02656326676._1
1104- let assetTotalSupply = $t02656326676._2
1166+ let lpTokensToMint = $t02670527935._1
1167+ let requiredAmountsNormalized = $t02670527935._2
1168+ let $t02794128054 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1169+ let assetBalances = $t02794128054._1
1170+ let assetTotalSupply = $t02794128054._2
11051171 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11061172 if ((err2 == err2))
11071173 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11081174 else throw("Strict value is not equal to itself.")
11091175 }
11101176
11111177
11121178 func _deposit (assetId_,amount_) = {
11131179 let storage = _loadStorage()
11141180 let lpTotalSupply = storage._3
11151181 let maxAllocAmplifier = storage._6
11161182 let weightAmplifier = storage._7
11171183 let slippageRate = storage._8
11181184 let feeMaxRate = storage._9
11191185 let assets = _loadAssets()
1120- let $t02737127424 = _loadAssetWeights()
1121- let assetWeights = $t02737127424._1
1122- let sigmaWeight = $t02737127424._2
1123- let $t02742927543 = _loadAssetBalances()
1124- let prevAssetBalances = $t02742927543._1
1125- let prevAssetTotalSupply = $t02742927543._2
1186+ let $t02874928802 = _loadAssetWeights()
1187+ let assetWeights = $t02874928802._1
1188+ let sigmaWeight = $t02874928802._2
1189+ let $t02880728921 = _loadAssetBalances()
1190+ let prevAssetBalances = $t02880728921._1
1191+ let prevAssetTotalSupply = $t02880728921._2
11261192 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
11271193 let assetTotalSupply = (prevAssetTotalSupply + amount_)
11281194 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
11291195 if ((err2 == err2))
11301196 then {
11311197 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11321198 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11331199 let lpTokensToMint = if ((lpTotalSupply == 0))
11341200 then (assetTotalSupply - fee)
11351201 else {
11361202 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
11371203 let feeDiff = (fee - prevFee)
11381204 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
11391205 let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
11401206 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11411207 if ((err3 == err3))
11421208 then lpTokensToMintInner
11431209 else throw("Strict value is not equal to itself.")
11441210 }
11451211 $Tuple2(lpTokensToMint, assetBalances)
11461212 }
11471213 else throw("Strict value is not equal to itself.")
11481214 }
11491215
11501216
11511217 func _withdrawAll (amount_) = {
11521218 let storage = _loadStorage()
11531219 let lpTotalSupply = storage._3
11541220 let lpFeeRate = storage._4
11551221 let protocolFeeRate = storage._5
11561222 let maxAllocAmplifier = storage._6
11571223 let weightAmplifier = storage._7
11581224 let slippageRate = storage._8
11591225 let feeMaxRate = storage._9
1160- let $t02952329591 = _loadAssetBalances()
1161- let prevAssetBalances = $t02952329591._1
1162- let prevAssetTotalSupply = $t02952329591._2
1163- let $t02959629649 = _loadAssetWeights()
1164- let assetWeights = $t02959629649._1
1165- let sigmaWeight = $t02959629649._2
1166- let $t02965529777 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, true)
1167- let lpFee = $t02965529777._1
1168- let protocolFee = $t02965529777._2
1169- let sigmaFeePerLpUpdated = $t02965529777._3
1226+ let $t03084830916 = _loadAssetBalances()
1227+ let prevAssetBalances = $t03084830916._1
1228+ let prevAssetTotalSupply = $t03084830916._2
1229+ let $t03092130974 = _loadAssetWeights()
1230+ let assetWeights = $t03092130974._1
1231+ let sigmaWeight = $t03092130974._2
1232+ let $t03098031102 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, true)
1233+ let lpFee = $t03098031102._1
1234+ let protocolFee = $t03098031102._2
1235+ let sigmaFeePerLpUpdated = $t03098031102._3
11701236 let lpTokensToBurn = ((amount_ - lpFee) - protocolFee)
11711237 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
11721238 if ((err == err))
11731239 then {
1174- let $t02994030073 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1175- let assetBalances = $t02994030073._1
1176- let assetTotalSupply = $t02994030073._2
1177- let balancesToPay = $t02994030073._3
1240+ let $t03126531398 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1241+ let assetBalances = $t03126531398._1
1242+ let assetTotalSupply = $t03126531398._2
1243+ let balancesToPay = $t03126531398._3
11781244 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791245 if ((err2 == err2))
11801246 then $Tuple6(lpTokensToBurn, balancesToPay, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
11811247 else throw("Strict value is not equal to itself.")
11821248 }
11831249 else throw("Strict value is not equal to itself.")
11841250 }
11851251
11861252
11871253 func _withdraw (assetId_,amount_) = {
11881254 let storage = _loadStorage()
11891255 let lpAssetId = storage._1
11901256 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
11911257 let lpTotalSupply = storage._3
11921258 let lpFeeRate = storage._4
11931259 let protocolFeeRate = storage._5
11941260 let maxAllocAmplifier = storage._6
11951261 let weightAmplifier = storage._7
11961262 let slippageRate = storage._8
11971263 let feeMaxRate = storage._9
11981264 let lpAssetIdStr = toBase58String(lpAssetId)
11991265 let assets = _loadAssets()
1200- let $t03101231080 = _loadAssetBalances()
1201- let prevAssetBalances = $t03101231080._1
1202- let prevAssetTotalSupply = $t03101231080._2
1203- let $t03108531190 = _loadAssetWeights()
1204- let assetWeights = $t03108531190._1
1205- let sigmaWeight = $t03108531190._2
1266+ let $t03233732405 = _loadAssetBalances()
1267+ let prevAssetBalances = $t03233732405._1
1268+ let prevAssetTotalSupply = $t03233732405._2
1269+ let $t03241032515 = _loadAssetWeights()
1270+ let assetWeights = $t03241032515._1
1271+ let sigmaWeight = $t03241032515._2
12061272 let assetDecimals = _getDecimals(assetId_)
12071273 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
12081274 let assetIndex = value(indexOf(assets, assetId_))
12091275 let assetBalances = _decrementBalanceByIndex(prevAssetBalances, assetIndex, amountNormalized)
12101276 let assetTotalSupply = (prevAssetTotalSupply - amountNormalized)
12111277 let err1 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12121278 if ((err1 == err1))
12131279 then {
12141280 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12151281 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12161282 let lpTokensToBurn = if ((lpTotalSupply == 0))
12171283 then (assetTotalSupply - fee)
12181284 else {
12191285 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12201286 let feeDiff = (fee - prevFee)
12211287 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12221288 let lpTokensToBurnInner = (-1 * fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR))
12231289 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurnInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12241290 if ((err2 == err2))
12251291 then lpTokensToBurnInner
12261292 else throw("Strict value is not equal to itself.")
12271293 }
1228- let $t03306533188 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, false)
1229- let lpFee = $t03306533188._1
1230- let protocolFee = $t03306533188._2
1231- let sigmaFeePerLpUpdated = $t03306533188._3
1294+ let $t03427834401 = _calculateLpAndProtocolFees(0, amount_, lpFeeRate, protocolFeeRate, false)
1295+ let lpFee = $t03427834401._1
1296+ let protocolFee = $t03427834401._2
1297+ let sigmaFeePerLpUpdated = $t03427834401._3
12321298 $Tuple5(lpTokensToBurn, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12331299 }
12341300 else throw("Strict value is not equal to itself.")
12351301 }
12361302
12371303
12381304 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
12391305 let storage = _loadStorage()
12401306 let lpAssetId = storage._1
12411307 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
12421308 let lpTotalSupply = storage._3
12431309 let lpFeeRate = storage._4
12441310 let protocolFeeRate = storage._5
12451311 let maxAllocAmplifier = storage._6
12461312 let weightAmplifier = storage._7
12471313 let slippageRate = storage._8
12481314 let feeMaxRate = storage._9
1249- let $t03373133799 = _loadAssetBalances()
1250- let prevAssetBalances = $t03373133799._1
1251- let prevAssetTotalSupply = $t03373133799._2
1252- let $t03380433857 = _loadAssetWeights()
1253- let assetWeights = $t03380433857._1
1254- let sigmaWeight = $t03380433857._2
1315+ let $t03494435012 = _loadAssetBalances()
1316+ let prevAssetBalances = $t03494435012._1
1317+ let prevAssetTotalSupply = $t03494435012._2
1318+ let $t03501735070 = _loadAssetWeights()
1319+ let assetWeights = $t03501735070._1
1320+ let sigmaWeight = $t03501735070._2
12551321 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
12561322 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
12571323 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12581324 func foldFunc (acc,elem) = if (acc._1)
12591325 then acc
12601326 else {
12611327 let targetAmount = acc._2
12621328 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
12631329 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
12641330 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12651331 let feeDiff = (fee - prevFee)
12661332 let tempAmount = (sourceAmount_ - feeDiff)
12671333 let check = if ((0 >= tempAmount))
12681334 then throw("_swap: less than 0")
12691335 else unit
12701336 if ((check == check))
12711337 then if (if (((targetAmount - tempAmount) > (-1 * PRECISION)))
12721338 then (PRECISION > (targetAmount - tempAmount))
12731339 else false)
12741340 then {
12751341 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, tempAmount)
12761342 let finalAssetTotalSupply = (assetTotalSupply - tempAmount)
12771343 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
12781344 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12791345 else false
12801346 if ((err1 == err1))
12811347 then $Tuple3(true, tempAmount, finalAssetBalances)
12821348 else throw("Strict value is not equal to itself.")
12831349 }
12841350 else $Tuple3(false, tempAmount, tempAssetBalances)
12851351 else throw("Strict value is not equal to itself.")
12861352 }
12871353
1288- let $t03598436089 = {
1354+ let $t03719737302 = {
12891355 let $l = LIST_25
12901356 let $s = size($l)
12911357 let $acc0 = $Tuple3(false, sourceAmount_, nil)
12921358 func $f0_1 ($a,$i) = if (($i >= $s))
12931359 then $a
12941360 else foldFunc($a, $l[$i])
12951361
12961362 func $f0_2 ($a,$i) = if (($i >= $s))
12971363 then $a
12981364 else throw("List size exceeds 25")
12991365
13001366 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
13011367 }
1302- let success = $t03598436089._1
1303- let targetAmount = $t03598436089._2
1304- let finalAssetBalances = $t03598436089._3
1368+ let success = $t03719737302._1
1369+ let targetAmount = $t03719737302._2
1370+ let finalAssetBalances = $t03719737302._3
13051371 if (!(success))
13061372 then throw(("_swap: can't calculate targetAmount=" + toString(targetAmount)))
13071373 else {
1308- let $t03620636353 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate, true)
1309- let lpFee = $t03620636353._1
1310- let protocolFee = $t03620636353._2
1311- let sigmaFeePerLpUpdated = $t03620636353._3
1374+ let $t03741937566 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate, true)
1375+ let lpFee = $t03741937566._1
1376+ let protocolFee = $t03741937566._2
1377+ let sigmaFeePerLpUpdated = $t03741937566._3
13121378 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13131379 }
13141380 }
13151381
13161382
13171383 @Callable(i)
13181384 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_) = {
13191385 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (_whenNotInitialized())
13201386 then _validateAssets(assets_, "init: invalid assets")
13211387 else false)
13221388 then _validateIntList(assetWeights_, 0, MAX_WEIGHT, "init: invalid assetWeights")
13231389 else false)
13241390 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
13251391 else false)
13261392 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
13271393 else false)
13281394 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
13291395 else false)
13301396 then _validateTokenName(lpTokenName_, "init: invalid name")
13311397 else false)
13321398 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
13331399 else false)
13341400 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
13351401 else false)
13361402 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
13371403 else false)
13381404 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
13391405 else false)
13401406 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
13411407 else false)
13421408 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
13431409 else false)
13441410 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
13451411 else false
13461412 if ((err == err))
13471413 then {
1348- let $t03797338042 = _prepareAssetWeights(assetWeights_)
1349- let assetWeights = $t03797338042._1
1350- let sigmaWeight = $t03797338042._2
1414+ let $t03918639255 = _prepareAssetWeights(assetWeights_)
1415+ let assetWeights = $t03918639255._1
1416+ let sigmaWeight = $t03918639255._2
13511417 let assetBalances = _prepareAssetBalances(assets_)
13521418 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
13531419 let lpAssetId = calculateAssetId(issue)
13541420 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
13551421 $Tuple2(((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())), unit)
13561422 }
13571423 else throw("Strict value is not equal to itself.")
13581424 }
13591425
13601426
13611427
13621428 @Callable(i)
13631429 func depositAll (amount_) = {
1364- let err = _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
1430+ let err = if (if (_whenInitialized())
1431+ then _whenNotPaused()
1432+ else false)
1433+ then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
1434+ else false
13651435 if ((err == err))
13661436 then {
13671437 let storage = _loadStorage()
13681438 let lpAssetId = storage._1
13691439 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13701440 let assets = _loadAssets()
1371- let $t03963139716 = _depositAll(amount_)
1372- let lpTokensToMint = $t03963139716._1
1373- let requiredAmountsNormalized = $t03963139716._2
1374- let assetBalances = $t03963139716._3
1441+ let $t04091040995 = _depositAll(amount_)
1442+ let lpTokensToMint = $t04091040995._1
1443+ let requiredAmountsNormalized = $t04091040995._2
1444+ let assetBalances = $t04091040995._3
13751445 func foldFunc (acc,elem) = {
13761446 let index = acc._1
13771447 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
13781448 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
13791449 let requiredAmountNormalized = requiredAmountsNormalized[index]
13801450 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
13811451 let err1 = if ((paymentAssetStr != elem))
13821452 then throw(("depositAll: invalid payment: index=" + toString(index)))
13831453 else if ((0 >= requiredAmount))
13841454 then throw("depositAll: too little amount required")
13851455 else unit
13861456 if ((err1 == err1))
13871457 then {
13881458 let change = if ((i.payments[index].amount > requiredAmount))
13891459 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
13901460 else if ((requiredAmount > i.payments[index].amount))
13911461 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
13921462 else nil
13931463 $Tuple2((index + 1), (acc._2 ++ change))
13941464 }
13951465 else throw("Strict value is not equal to itself.")
13961466 }
13971467
1398- let $t04085940921 = {
1468+ let $t04213842200 = {
13991469 let $l = assets
14001470 let $s = size($l)
14011471 let $acc0 = $Tuple2(0, nil)
14021472 func $f0_1 ($a,$i) = if (($i >= $s))
14031473 then $a
14041474 else foldFunc($a, $l[$i])
14051475
14061476 func $f0_2 ($a,$i) = if (($i >= $s))
14071477 then $a
14081478 else throw("List size exceeds 10")
14091479
14101480 $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)
14111481 }
1412- let idx = $t04085940921._1
1413- let changeActions = $t04085940921._2
1482+ let idx = $t04213842200._1
1483+ let changeActions = $t04213842200._2
14141484 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14151485 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
14161486 }
14171487 else throw("Strict value is not equal to itself.")
14181488 }
14191489
14201490
14211491
14221492 @Callable(i)
14231493 func deposit (minLpAmount_) = {
14241494 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
14251495 if ((err == err))
14261496 then {
14271497 let storage = _loadStorage()
14281498 let lpAssetId = storage._1
14291499 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1430- let err1 = if (if (_validateIntEquals(size(i.payments), 1, "deposit: invalid payments size"))
1500+ let err1 = if (if (if (if (_whenInitialized())
1501+ then _whenNotPaused()
1502+ else false)
1503+ then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
1504+ else false)
14311505 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
14321506 else false)
14331507 then _validateInt(i.payments[0].amount, 0, MAX_INT, "deposit: invalid payment amount")
14341508 else false
14351509 if ((err1 == err1))
14361510 then {
14371511 let assetStr = _assetToStr(i.payments[0].assetId)
14381512 let assetDecimals = _getDecimals(assetStr)
14391513 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1440- let $t04224242316 = _deposit(assetStr, amountNormalized)
1441- let lpTokensToMint = $t04224242316._1
1442- let assetBalances = $t04224242316._2
1514+ let $t04357943653 = _deposit(assetStr, amountNormalized)
1515+ let lpTokensToMint = $t04357943653._1
1516+ let assetBalances = $t04357943653._2
14431517 let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
14441518 if ((err2 == err2))
14451519 then {
14461520 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14471521 $Tuple2((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
14481522 }
14491523 else throw("Strict value is not equal to itself.")
14501524 }
14511525 else throw("Strict value is not equal to itself.")
14521526 }
14531527 else throw("Strict value is not equal to itself.")
14541528 }
14551529
14561530
14571531
14581532 @Callable(i)
14591533 func withdrawAll () = {
14601534 let storage = _loadStorage()
14611535 let lpAssetId = storage._1
14621536 let lpAssetIdStr = toBase58String(lpAssetId)
14631537 let lpDecimals = _getDecimals(lpAssetIdStr)
14641538 let assets = _loadAssets()
1465- let err = if (if (_validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size"))
1539+ let err = if (if (if (if (_whenInitialized())
1540+ then _whenNotPaused()
1541+ else false)
1542+ then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
1543+ else false)
14661544 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
14671545 else false)
14681546 then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdrawAll: invalid payment amount")
14691547 else false
14701548 if ((err == err))
14711549 then {
1472- let $t04347943608 = _withdrawAll(i.payments[0].amount)
1473- let lpTokensToBurn = $t04347943608._1
1474- let balancesToPay = $t04347943608._2
1475- let assetBalances = $t04347943608._3
1476- let lpFee = $t04347943608._4
1477- let protocolFee = $t04347943608._5
1478- let sigmaFeePerLpUpdated = $t04347943608._6
1550+ let $t04487445003 = _withdrawAll(i.payments[0].amount)
1551+ let lpTokensToBurn = $t04487445003._1
1552+ let balancesToPay = $t04487445003._2
1553+ let assetBalances = $t04487445003._3
1554+ let lpFee = $t04487445003._4
1555+ let protocolFee = $t04487445003._5
1556+ let sigmaFeePerLpUpdated = $t04487445003._6
14791557 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
14801558 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14811559 $Tuple2((((((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
14821560 }
14831561 else throw("Strict value is not equal to itself.")
14841562 }
14851563
14861564
14871565
14881566 @Callable(i)
14891567 func withdraw (assetId_,amount_) = {
14901568 let storage = _loadStorage()
14911569 let lpAssetId = storage._1
14921570 let lpAssetIdStr = toBase58String(lpAssetId)
14931571 let assets = _loadAssets()
1494- let err = if (if (if (if (_validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size"))
1572+ let err = if (if (if (if (if (if (_whenInitialized())
1573+ then _whenNotPaused()
1574+ else false)
1575+ then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
1576+ else false)
14951577 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
14961578 else false)
14971579 then _validateInt(i.payments[0].amount, 0, MAX_INT, "withdraw: invalid payment amount")
14981580 else false)
14991581 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
15001582 else false)
15011583 then _validateInt(amount_, 0, MAX_INT, "withdraw: invalid amount")
15021584 else false
15031585 if ((err == err))
15041586 then {
1505- let $t04503145139 = _withdraw(assetId_, amount_)
1506- let lpTokensToBurn = $t04503145139._1
1507- let assetBalances = $t04503145139._2
1508- let lpFee = $t04503145139._3
1509- let protocolFee = $t04503145139._4
1510- let sigmaFeePerLpUpdated = $t04503145139._5
1587+ let $t04648446592 = _withdraw(assetId_, amount_)
1588+ let lpTokensToBurn = $t04648446592._1
1589+ let assetBalances = $t04648446592._2
1590+ let lpFee = $t04648446592._3
1591+ let protocolFee = $t04648446592._4
1592+ let sigmaFeePerLpUpdated = $t04648446592._5
15111593 let requiredLpTokens = ((lpTokensToBurn + lpFee) + protocolFee)
15121594 let changeAction = if ((requiredLpTokens > i.payments[0].amount))
15131595 then throw("withdraw: insufficient amount")
15141596 else if ((i.payments[0].amount > requiredLpTokens))
15151597 then [ScriptTransfer(i.caller, (i.payments[0].amount - requiredLpTokens), i.payments[0].assetId)]
15161598 else nil
15171599 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15181600 $Tuple2((((((([Burn(lpAssetId, lpTokensToBurn), ScriptTransfer(i.caller, amount_, _strToAsset(assetId_))] ++ changeAction) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15191601 }
15201602 else throw("Strict value is not equal to itself.")
15211603 }
15221604
15231605
15241606
15251607 @Callable(i)
15261608 func swap (targetAssetId_,minAmount_) = {
15271609 let storage = _loadStorage()
15281610 let lpAssetId = storage._1
15291611 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15301612 let assets = _loadAssets()
15311613 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
15321614 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
15331615 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
15341616 if ((sourceAssetIndex == sourceAssetIndex))
15351617 then {
15361618 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
15371619 if ((targetAssetIndex == targetAssetIndex))
15381620 then {
1539- let err = if (if (if (_validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount"))
1621+ let err = if (if (if (if (if (_whenInitialized())
1622+ then _whenNotPaused()
1623+ else false)
1624+ then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
1625+ else false)
15401626 then _validateInt(sourceAmountNormalized, 0, MAX_INT, "swap: invalid source amount")
15411627 else false)
15421628 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
15431629 else false)
15441630 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
15451631 else false
15461632 if ((err == err))
15471633 then {
1548- let $t04724547403 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1549- let targetAmountNormalized = $t04724547403._1
1550- let finalAssetBalances = $t04724547403._2
1551- let lpFee = $t04724547403._3
1552- let protocolFee = $t04724547403._4
1553- let sigmaFeePerLpUpdated = $t04724547403._5
1634+ let $t04875648914 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1635+ let targetAmountNormalized = $t04875648914._1
1636+ let finalAssetBalances = $t04875648914._2
1637+ let lpFee = $t04875648914._3
1638+ let protocolFee = $t04875648914._4
1639+ let sigmaFeePerLpUpdated = $t04875648914._5
15541640 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
15551641 let targetDecimals = _getDecimals(targetAssetId_)
15561642 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
15571643 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: insufficient final amount")
15581644 if ((err1 == err1))
15591645 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15601646 else throw("Strict value is not equal to itself.")
15611647 }
15621648 else throw("Strict value is not equal to itself.")
15631649 }
15641650 else throw("Strict value is not equal to itself.")
15651651 }
15661652 else throw("Strict value is not equal to itself.")
15671653 }
15681654
15691655
15701656
15711657 @Callable(i)
15721658 func getDepositAll (amount_) = {
15731659 let err = _validateInt(amount_, 0, MAX_INT, "getDepositAll: invalid amount")
15741660 if ((err == err))
15751661 then {
1576- let $t04852948614 = _depositAll(amount_)
1577- let lpTokensToMint = $t04852948614._1
1578- let requiredAmountsNormalized = $t04852948614._2
1579- let assetBalances = $t04852948614._3
1662+ let $t05004050125 = _depositAll(amount_)
1663+ let lpTokensToMint = $t05004050125._1
1664+ let requiredAmountsNormalized = $t05004050125._2
1665+ let assetBalances = $t05004050125._3
15801666 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
15811667 }
15821668 else throw("Strict value is not equal to itself.")
15831669 }
15841670
15851671
15861672
15871673 @Callable(i)
15881674 func getDeposit (assetId_,amount_) = {
15891675 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
15901676 then _validateInt(amount_, 0, MAX_INT, "getDeposit: invalid amount")
15911677 else false
15921678 if ((err == err))
15931679 then {
15941680 let storage = _loadStorage()
15951681 let lpAssetId = storage._1
15961682 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15971683 let assetDecimals = _getDecimals(assetId_)
15981684 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1599- let $t04937349447 = _deposit(assetId_, amountNormalized)
1600- let lpTokensToMint = $t04937349447._1
1601- let assetBalances = $t04937349447._2
1685+ let $t05088450958 = _deposit(assetId_, amountNormalized)
1686+ let lpTokensToMint = $t05088450958._1
1687+ let assetBalances = $t05088450958._2
16021688 $Tuple2(nil, lpTokensToMint)
16031689 }
16041690 else throw("Strict value is not equal to itself.")
16051691 }
16061692
16071693
16081694
16091695 @Callable(i)
16101696 func getWithdrawAll (amount_) = {
16111697 let err = _validateInt(amount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
16121698 if ((err == err))
16131699 then {
1614- let $t04981849934 = _withdrawAll(amount_)
1615- let lpTokensToBurn = $t04981849934._1
1616- let balancesToGet = $t04981849934._2
1617- let assetBalances = $t04981849934._3
1618- let lpFee = $t04981849934._4
1619- let protocolFee = $t04981849934._5
1620- let sigmaFeePerLpUpdated = $t04981849934._6
1700+ let $t05132951445 = _withdrawAll(amount_)
1701+ let lpTokensToBurn = $t05132951445._1
1702+ let balancesToGet = $t05132951445._2
1703+ let assetBalances = $t05132951445._3
1704+ let lpFee = $t05132951445._4
1705+ let protocolFee = $t05132951445._5
1706+ let sigmaFeePerLpUpdated = $t05132951445._6
16211707 $Tuple2(nil, balancesToGet)
16221708 }
16231709 else throw("Strict value is not equal to itself.")
16241710 }
16251711
16261712
16271713
16281714 @Callable(i)
16291715 func getWithdraw (assetId_,amount_) = {
1630- let $t05030050408 = _withdraw(assetId_, amount_)
1631- let lpTokensToBurn = $t05030050408._1
1632- let assetBalances = $t05030050408._2
1633- let lpFee = $t05030050408._3
1634- let protocolFee = $t05030050408._4
1635- let sigmaFeePerLpUpdated = $t05030050408._5
1716+ let $t05181151919 = _withdraw(assetId_, amount_)
1717+ let lpTokensToBurn = $t05181151919._1
1718+ let assetBalances = $t05181151919._2
1719+ let lpFee = $t05181151919._3
1720+ let protocolFee = $t05181151919._4
1721+ let sigmaFeePerLpUpdated = $t05181151919._5
16361722 let requiredLpTokens = ((lpTokensToBurn + lpFee) + protocolFee)
16371723 $Tuple2(nil, requiredLpTokens)
16381724 }
16391725
16401726
16411727
16421728 @Callable(i)
16431729 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
16441730 let storage = _loadStorage()
16451731 let lpAssetId = storage._1
16461732 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16471733 let assets = _loadAssets()
16481734 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
16491735 if ((sourceAssetIndex == sourceAssetIndex))
16501736 then {
16511737 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16521738 if ((targetAssetIndex == targetAssetIndex))
16531739 then {
16541740 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
16551741 let err = if (_validateInt(sourceAmountNormalized, 0, MAX_INT, "swap: invalid source amount"))
16561742 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
16571743 else false
16581744 if ((err == err))
16591745 then {
1660- let $t05166851826 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1661- let targetAmountNormalized = $t05166851826._1
1662- let finalAssetBalances = $t05166851826._2
1663- let lpFee = $t05166851826._3
1664- let protocolFee = $t05166851826._4
1665- let sigmaFeePerLpUpdated = $t05166851826._5
1746+ let $t05317953337 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1747+ let targetAmountNormalized = $t05317953337._1
1748+ let finalAssetBalances = $t05317953337._2
1749+ let lpFee = $t05317953337._3
1750+ let protocolFee = $t05317953337._4
1751+ let sigmaFeePerLpUpdated = $t05317953337._5
16661752 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16671753 let targetDecimals = _getDecimals(targetAssetId_)
16681754 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16691755 $Tuple2(nil, finalAmount)
16701756 }
16711757 else throw("Strict value is not equal to itself.")
16721758 }
16731759 else throw("Strict value is not equal to itself.")
16741760 }
16751761 else throw("Strict value is not equal to itself.")
16761762 }
16771763
16781764
16791765
16801766 @Callable(i)
1767+func getClaim (user_) = {
1768+ let user = if ((size(user_) > 0))
1769+ then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
1770+ else i.caller
1771+ let $t05397954035 = _checkpoint(user)
1772+ let checkpointActions = $t05397954035._1
1773+ let userProfits = $t05397954035._2
1774+ $Tuple2(nil, userProfits)
1775+ }
1776+
1777+
1778+
1779+@Callable(i)
16811780 func checkpoint (user_) = {
1682- let user = if ((size(user_) > 0))
1683- then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
1684- else i.caller
1685- _checkpoint(user)
1781+ let err = if (_whenInitialized())
1782+ then _whenNotPaused()
1783+ else false
1784+ if ((err == err))
1785+ then {
1786+ let user = if ((size(user_) > 0))
1787+ then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
1788+ else i.caller
1789+ _checkpoint(user)
1790+ }
1791+ else throw("Strict value is not equal to itself.")
16861792 }
16871793
16881794
16891795
16901796 @Callable(i)
16911797 func stake () = {
1692- let storage = _loadStorage()
1693- let lpAssetIdStr = _assetToStr(storage._1)
1694- let err = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
1695- then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
1696- else false)
1697- then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
1798+ let err = if (_whenInitialized())
1799+ then _whenNotPaused()
16981800 else false
16991801 if ((err == err))
17001802 then {
1701- let $t05279252852 = _checkpoint(i.caller)
1702- let checkpointActions = $t05279252852._1
1703- let userProfits = $t05279252852._2
1704- $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
1803+ let storage = _loadStorage()
1804+ let lpAssetIdStr = _assetToStr(storage._1)
1805+ let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
1806+ then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
1807+ else false)
1808+ then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
1809+ else false
1810+ if ((err1 == err1))
1811+ then {
1812+ let $t05491954979 = _checkpoint(i.caller)
1813+ let checkpointActions = $t05491954979._1
1814+ let userProfits = $t05491954979._2
1815+ $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
1816+ }
1817+ else throw("Strict value is not equal to itself.")
17051818 }
17061819 else throw("Strict value is not equal to itself.")
17071820 }
17081821
17091822
17101823
17111824 @Callable(i)
17121825 func unstake (amount_) = {
1713- let storage = _loadStorage()
1714- let lpAssetId = storage._1
1715- let userLp = _loadUserLp(i.caller)
1716- let err = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
1826+ let err = if (_whenInitialized())
1827+ then _whenNotPaused()
1828+ else false
17171829 if ((err == err))
17181830 then {
1719- let $t05328953349 = _checkpoint(i.caller)
1720- let checkpointActions = $t05328953349._1
1721- let userProfits = $t05328953349._2
1722- $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
1831+ let storage = _loadStorage()
1832+ let lpAssetId = storage._1
1833+ let userLp = _loadUserLp(i.caller)
1834+ let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
1835+ if ((err1 == err1))
1836+ then {
1837+ let $t05549055550 = _checkpoint(i.caller)
1838+ let checkpointActions = $t05549055550._1
1839+ let userProfits = $t05549055550._2
1840+ $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
1841+ }
1842+ else throw("Strict value is not equal to itself.")
17231843 }
17241844 else throw("Strict value is not equal to itself.")
17251845 }
17261846
17271847
17281848
17291849 @Callable(i)
1730-func claim (user_,assetId_,amount_) = {
1731- let user = if ((size(user_) > 0))
1732- then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
1733- else i.caller
1734- let storage = _loadStorage()
1735- let lpAssetId = storage._1
1736- let lpAssetIdStr = _assetToStr(lpAssetId)
1737- let assets = [lpAssetIdStr, _loadAssets()]
1738- let userLp = _loadUserLp(user)
1739- let err = if (_validateListContains(assets, assetId_, "claim: invalid assetId"))
1740- then _validateInt(amount_, 0, MAX_INT, "claim: invalid amount")
1850+func claim (user_,assets_) = {
1851+ let err = if (if (_whenInitialized())
1852+ then _whenNotPaused()
1853+ else false)
1854+ then _validateInt(size(assets_), 1, 10, "claim: invalid assets size")
17411855 else false
17421856 if ((err == err))
17431857 then {
1744- let $t05415654212 = _checkpoint(user)
1745- let checkpointActions = $t05415654212._1
1746- let userProfits = $t05415654212._2
1747- let assetIndex = value(indexOf(assets, assetId_))
1748- func foldFunc (acc,elem) = {
1858+ let user = if ((size(user_) > 0))
1859+ then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
1860+ else i.caller
1861+ let storage = _loadStorage()
1862+ let lpAssetId = storage._1
1863+ let lpAssetIdStr = _assetToStr(lpAssetId)
1864+ let assets = [lpAssetIdStr, _loadAssets()]
1865+ let maxIndex = (size(assets) - 1)
1866+ let userLp = _loadUserLp(user)
1867+ let $t05637356429 = _checkpoint(user)
1868+ let checkpointActions = $t05637356429._1
1869+ let userProfits = $t05637356429._2
1870+ func foldFunc (acc,profit) = {
17491871 let index = acc._1
1750- if ((index == assetIndex))
1751- then if ((amount_ > elem))
1752- then throw("claim: insufficient amount")
1753- else $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
1754- else $Tuple2((index + 1), (acc._2 :+ elem))
1872+ if ((index > maxIndex))
1873+ then $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
1874+ else {
1875+ let asset = assets[index]
1876+ if (containsElement(assets_, asset))
1877+ then $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
1878+ else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
1879+ }
17551880 }
17561881
1757- let $t05461154683 = {
1882+ let $t05691857009 = {
17581883 let $l = userProfits
17591884 let $s = size($l)
1760- let $acc0 = $Tuple2(0, nil)
1885+ let $acc0 = $Tuple3(0, nil, nil)
17611886 func $f0_1 ($a,$i) = if (($i >= $s))
17621887 then $a
17631888 else foldFunc($a, $l[$i])
17641889
17651890 func $f0_2 ($a,$i) = if (($i >= $s))
17661891 then $a
17671892 else throw("List size exceeds 11")
17681893
17691894 $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)
17701895 }
1771- let idx = $t05461154683._1
1772- let userProfitsUpdated = $t05461154683._2
1773- $Tuple2((([ScriptTransfer(user, amount_, _strToAsset(assetId_))] ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
1896+ let idx = $t05691857009._1
1897+ let userProfitsUpdated = $t05691857009._2
1898+ let profitActions = $t05691857009._3
1899+ $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
17741900 }
1901+ else throw("Strict value is not equal to itself.")
1902+ }
1903+
1904+
1905+
1906+@Callable(i)
1907+func pause () = {
1908+ let err = if (if (_onlyPauser(i.caller))
1909+ then _whenInitialized()
1910+ else false)
1911+ then _whenNotPaused()
1912+ else false
1913+ if ((err == err))
1914+ then $Tuple2(_savePause(true), unit)
1915+ else throw("Strict value is not equal to itself.")
1916+ }
1917+
1918+
1919+
1920+@Callable(i)
1921+func unpause () = {
1922+ let err = if (if (_onlyPauser(i.caller))
1923+ then _whenInitialized()
1924+ else false)
1925+ then _whenPaused()
1926+ else false
1927+ if ((err == err))
1928+ then $Tuple2(_savePause(false), unit)
1929+ else throw("Strict value is not equal to itself.")
1930+ }
1931+
1932+
1933+
1934+@Callable(i)
1935+func updatePauser (pauser_) = {
1936+ let err = if (if (_onlyThisContract(i.caller))
1937+ then _whenInitialized()
1938+ else false)
1939+ then _validateAddress(pauser_, "updatePauser: invalid pauser")
1940+ else false
1941+ if ((err == err))
1942+ then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
17751943 else throw("Strict value is not equal to itself.")
17761944 }
17771945
17781946

github/deemru/w8io/169f3d6 
331.96 ms