tx · 69EhFSvg9dmkmeAx6efSgAdrXnx7SDLcqDG4apRPY2Y3

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.06000000 Waves

2023.11.07 16:07 [3898803] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "69EhFSvg9dmkmeAx6efSgAdrXnx7SDLcqDG4apRPY2Y3", "fee": 6000000, "feeAssetId": null, "timestamp": 1699362430863, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "5eX9HZpn5ohMdptYF124ynGKMDk81KNWNuy7ZQcP8awnpi5agaS1ckwdG2ReMkbHRtFnvCe9aHsP4W8o837yCDLE", "46rUV1pTWuNt2SvuCfvsneL35yAcZC5imVY4YgGc7idP5hsi1tH57yPzX743NaXg9Revx6fPLknbV4BkZ6Yx4UWZ" ], "script": "base64:BgKkAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBgoECAEIBBIECgIIARIGCgQBCAgBEgUKAwEICBIPCg0ICAgICAgICAgICAgIEgMKAQgSAwoBCBIFCgMICAESBgoECAEICBIHCgUICAgBBBIFCgMIBAESDQoLCAgIAQEBAQEBBAQSCQoHCAEBAQEBARIAEgASABIAEgASABIAEgASAwoBCBIDCgEIkgEABENPTkYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMCBmNvbmZpZwAHU0ZfUE9PTAICU0YAB1dYX1BPT0wCAldYAARDUE1NAgRjcG1tAARGTEFUAgRmbGF0AA9DQVBfRkVFX05PX0xPQU4CCWNhcE5vTG9hbgAMQ0FQX0ZFRV9MT0FOAgdjYXBMb2FuABRTVE9QTE9TU19GRUVfTk9fTE9BTgIOc3RvcExvc3NOb0xvYW4ADVNUT1BMT1NTX0xPQU4CDHN0b3BMb3NzTG9hbgAITE9BTl9GRUUCBGxvYW4AC05PX0xPQU5fRkVFAgZub0xvYW4ABk5PX0ZFRQIFbm9GZWUABlNDQUxFOACAwtcvAAdTQ0FMRTEwAIDIr6AlAAdTQ0FMRTE2CQC2AgEAgICE/qbe4REACkZFRV9TQ0FMRTYAwIQ9ABRrU0ZQb29sQUFzc2V0QmFsYW5jZQIPQV9hc3NldF9iYWxhbmNlABRrU0ZQb29sQkFzc2V0QmFsYW5jZQIPQl9hc3NldF9iYWxhbmNlAA9rU0ZQb29sQUFzc2V0SWQCCkFfYXNzZXRfaWQAD2tTRlBvb2xCQXNzZXRJZAIKQl9hc3NldF9pZAAOa1NGUG9vbFNoYXJlSWQCDnNoYXJlX2Fzc2V0X2lkABJrU0ZQb29sU2hhcmVTdXBwbHkCEnNoYXJlX2Fzc2V0X3N1cHBseQAKa1NGUG9vbEZlZQIKY29tbWlzc2lvbgANa1VzZXJQb3NpdGlvbgINX3VzZXJQb3NpdGlvbgARa1VzZXJQb3NpdGlvblBvb2wCEV91c2VyUG9zaXRpb25Qb29sABFrVXNlckJvcnJvd0Ftb3VudAIZX3VzZXJQb3NpdGlvbkJvcnJvd0Ftb3VudAASa1VzZXJCb3Jyb3dBc3NldElkAhpfdXNlclBvc2l0aW9uQm9ycm93QXNzZXRJZAAQa1VzZXJQb3NpdGlvbk51bQITX3VzZXJQb3NpdGlvbk51bWJlcgAVa1VzZXJQb3NpdGlvbkludGVyZXN0AhVfdXNlclBvc2l0aW9uSW50ZXJlc3QAFmtVc2VyUG9zaXRpb25JblBNYXJrZXQCFF91c2VyUG9zaXRpb25QTWFya2V0AAprUG9vbFRvdGFsAgpfcG9vbFRvdGFsAA5rUG9vbFRvdGFsTG9hbgIOX3Bvb2xUb3RhbExvYW4AEGtQb29sVG90YWxNYXJrZXQCEF9wb29sVG90YWxNYXJrZXQAFGtQb29sVG90YWxNYXJrZXRMb2FuAhRfcG9vbFRvdGFsTWFya2V0TG9hbgARa1Bvb2xJbnRlcmVzdExvYW4CEV9wb29sSW50ZXJlc3RMb2FuABNrUG9vbEludGVyZXN0Tm9Mb2FuAhNfcG9vbEludGVyZXN0Tm9Mb2FuABdrUG9vbEludGVyZXN0TWFya2V0TG9hbgIXX3Bvb2xJbnRlcmVzdE1hcmtldExvYW4AGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4CGV9wb29sSW50ZXJlc3RNYXJrZXROb0xvYW4ADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAMa1Bvb2xQTUFya2V0AhFfcG9vbFB1enpsZU1hcmtldAAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAJa1Bvb2xUeXBlAglfcG9vbFR5cGUACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCF19mYWxsYmFja0V4Y2hhbmdlU3dvcGZpAAlrTW9uZXlCb3gCDmF4bHlfbW9uZXlfYm94AA5rU0ZGYXJtaW5nQWRkcgITc3dvcGZpX2Zhcm1pbmdfYWRkcgAMa0xlbmRTZXJ2aWNlAhFsZW5kX3NlcnZpY2VfYWRkcgAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlAAtrRXhDb250cmFjdAIRZXhjaGFuZ2VfY29udHJhY3QAD2tXeFN3YXBDb250cmFjdAIQd3hfc3dhcF9jb250cmFjdAAHa1d4UmVzdAIMd3hfcmVzdF9hZGRyAAdrU3dvcElkAgdzd29wX2lkAAVrV3hJZAIFd3hfaWQADGtQTWFya2V0QWRkcgIVcHV6emxlX21hcmtldF9hZGRyZXNzABBrUE1hcmtldFJlc3RBZGRyAhpwdXp6bGVfbWFya2V0X3Jlc3RfYWRkcmVzcwAPa0dyb3VwMUFkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQtrRXhDb250cmFjdAIcTm8gZXhjaGFuZ2UgY29udHJhY3QgYWRkcmVzcwAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGd3hSZXN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUHa1d4UmVzdAISTm8gd3ggcmVzdCBhZGRyZXNzAAZTV09QSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tTd29wSWQCCk5vIHN3b3AgaWQABFdYSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFBWtXeElkAghObyB3eCBpZAALcE1hcmtldEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQxrUE1hcmtldEFkZHICGE5vIHB1enpsZSBtYXJrZXQgYWRkcmVzcwAPcE1hcmtldFJlc3RBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUQa1BNYXJrZXRSZXN0QWRkcgIdTm8gcHV6emxlIG1hcmtldCByZXN0IGFkZHJlc3MADmdyb3VwMUFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4xUEsADmdyb3VwMUFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4yUEsADmdyb3VwMkFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsADmdyb3VwMkFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsBD3Vua25vd25Qb29sVHlwZQAJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldExlbmRTcnZBZGRyAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFDGtMZW5kU2VydmljZQIbQ2FuJ3QgZ2V0IGxlbmQgc2VydmljZSBhZGRyAQ5pc09wZXJhdG9yQ2FsbAEBaQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFCm9wZXJhdG9yUEsFBHVuaXQJAAIBAiRPbmx5IG9wZXJhdG9yIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BC2lzQWRtaW5DYWxsAQFpAwMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMVBLBgkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4yUEsFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzTGFuZENhbGwBAWkDCQAAAggFAWkGY2FsbGVyCQEOZ2V0TGVuZFNydkFkZHIABQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCGlzQWN0aXZlAAMJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGBgUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBEGlzQWN0aXZlRm9yVXNlcnMAAwMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYGBwUEdW5pdAkAAgECKURBcHAgaXMgaW5hY3RpdmUgZm9yIHVzZXJzIGF0IHRoaXMgbW9tZW50AQxpc1Bvb2xBY3RpdmUCBHBvb2wEdHlwZQQKV1hTRkFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHR5cGUFC2tBY3RpdmVTRldYBgQKcG9vbEFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgMDBQpXWFNGQWN0aXZlBQpwb29sQWN0aXZlBwYHAQ5hY2NvdW50QmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA8AcCBQR0aGlzBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAAIBAgtNYXRjaCBlcnJvcgERZ2V0U0ZQb29sQmFsYW5jZXMBCHBvb2xBZGRyCQCUCgIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEFBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEEgYXNzZXQgYmFsYW5jZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQkFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBiYWxhbmNlARFnZXRXWFBvb2xCYWxhbmNlcwMIcG9vbEFkZHIDYUlkA2JJZAkAlAoCCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNhSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYklkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBD2dldFBvb2xCYWxhbmNlcwQIcG9vbEFkZHIEdHlwZQNhSWQDYklkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAkBD3Vua25vd25Qb29sVHlwZQABDWdldFNGUG9vbERhdGEBCHBvb2xBZGRyBAskdDA5NDIzOTQ3MgkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgULJHQwOTQyMzk0NzIFCyR0MDk0MjM5NDcyBARiYWxCCAULJHQwOTQyMzk0NzICXzIEBGJhbEEIBQskdDA5NDIzOTQ3MgJfMQkAlwoFCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xBQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQkFzc2V0SWQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQFBGJhbEEFBGJhbEIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUOa1NGUG9vbFNoYXJlSWQCGENhbid0IGdldCBzaGFyZSBhc3NldCBpZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgENZ2V0V1hQb29sRGF0YQEIcG9vbEFkZHIEA2NmZwoAAUAJAPwHBAUIcG9vbEFkZHICHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNjZmcFA2NmZwQDYUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAEAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAQDYklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAFAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAQHc2hhcmVJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcAAwMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGkNhbid0IGdldCBwb29sIExQIGFzc2V0IGlkBA0kdDAxMDE2OTEwMjI4CQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgUNJHQwMTAxNjkxMDIyOAUNJHQwMTAxNjkxMDIyOAQEYmFsQggFDSR0MDEwMTY5MTAyMjgCXzIEBGJhbEEIBQ0kdDAxMDE2OTEwMjI4Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BCQDNCAIFAWEFCmFzc2V0UHJpY2UKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sAiBDYW4ndCBmaW5kIHBvb2wgYWRkciBieSBzaGFyZSBpZAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMTMyMTcxMzI4MgkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQ0kdDAxMzIxNzEzMjgyAl8xBANiSWQIBQ0kdDAxMzIxNzEzMjgyAl8yBAhhQmFsYW5jZQgFDSR0MDEzMjE3MTMyODICXzMECGJCYWxhbmNlCAUNJHQwMTMyMTcxMzI4MgJfNAQGcHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQHZFByaWNlQQkAkQMCBQZwcmljZXMAAAQHZFByaWNlQgkAkQMCBQZwcmljZXMAAQMDCQBmAgAABQdkUHJpY2VBBgkAZgIAAAUHZFByaWNlQgD///////////8BBAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkBApBUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQKQlByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2JJZAAAAAAFBERPV04EDnNoYXJlUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHc2hhcmVJZAAAAAAFBERPV04EA3N1bQkAZAIJAGsDBQhhQmFsYW5jZQUHZFByaWNlQQUKQVByZWNpc2lvbgkAawMFCGJCYWxhbmNlBQdkUHJpY2VCBQpCUHJlY2lzaW9uCQBrAwUDc3VtBQ5zaGFyZVByZWNpc2lvbgULc2hhcmVTdXBwbHkBDmdldFNoYXJlUHJpY2VzAQhzaGFyZUlkcwoBCWdldFByaWNlcwIBYQdzaGFyZUlkCQDNCAIFAWEJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAoAAiRsBQhzaGFyZUlkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZ2V0UHJpY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQBDmdldEN1cnNFbnRyaWVzBANhSWQDYklkB3NoYXJlSWQId0Ftb3VudHMEDGFzc2V0c1ByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwECnNoYXJlUHJpY2UJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAQGcHJpY2VzCQDOCAIJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwAACQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAQkAzAgCCQCkAwEFCnNoYXJlUHJpY2UFA25pbAUId0Ftb3VudHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1Rva2VuTGFzdFByaWNlCQC5CQIFBnByaWNlcwIBLAUDbmlsARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMJBXBUeXBlCHBvb2xBZGRyBExQSWQEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCAwkAAAIFBXBUeXBlBQdTRl9QT09MBARyZXBsCgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICIGNhbGNMUFJlcGxlbmlzaFR3b1Rva2Vuc1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQRwbXRBCQDMCAIJAKQDAQUEcG10QgUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUEcmVwbAUEcmVwbAkAlwoFCgABQAkAkQMCBQRyZXBsAAMDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQRyZXBsAAQDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQRyZXBsAAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQEMYXNzZXRJZFRvU3RyAQkAkQMCBQRyZXBsAAIKAAFACQCRAwIFBHJlcGwAAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDE0ODQwMTUxMDYJAJQKAgkAtQkCCgABQAkA/AcEBQZ3eFJlc3QCJHBvb2xFdmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQkAzAgCBQRMUElkCQDMCAIFBHBtdEEFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18JALUJAgoAAUAJAPwHBAUGd3hSZXN0AiNwb29sRXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQkAzAgCBQRMUElkCQDMCAIFBHBtdEIFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18DCQAAAgUNJHQwMTQ4NDAxNTEwNgUNJHQwMTQ4NDAxNTEwNgQKZXZhbFB1dEluQggFDSR0MDE0ODQwMTUxMDYCXzIECmV2YWxQdXRJbkEIBQ0kdDAxNDg0MDE1MTA2Al8xBAVscEluQQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEAAQQFbHBJbkIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5CAAEDCQBmAgUFbHBJbkIFBWxwSW5BBANwbXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5BAAgJAJcKBQUEcG10QQUDcG10CQBlAgUEcG10QgUDcG10BQNiSWQFBWxwSW5CBANwbXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5CAAcJAJcKBQUDcG10BQRwbXRCCQBlAgUEcG10QQUDcG10BQNhSWQFBWxwSW5BCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBghwb29sQWRkcgVwVHlwZQRwbXRBA2FJZARwbXRCA2JJZAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2FJZAUEcG10QQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYklkBQRwbXRCBQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQDMCAIJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFCHBvb2xBZGRyAgNwdXQJAMwIAgDAhD0JAMwIAgcFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQIcG9vbEFkZHIFcFR5cGUDcG10BXBtdElkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUFcG10SWQFA3BtdAUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIJAMwIAgIBMAkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmZjAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQlrUG9vbFR5cGUCBGNwbW0FBEZMQVQCC3B1dE9uZVRrblYyAglwdXRPbmVUa24JAPwHBAUIcG9vbEFkZHIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABB3N0YWtlTFAFBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQNc3Rha2VUb01hcmtldAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwDBQ1zdGFrZVRvTWFya2V0CQD8BwQFC3BNYXJrZXRBZGRyAgZzdXBwbHkFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgVzdGFrZQUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAUEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudApmcm9tTWFya2V0BA0kdDAxNzAwNTE3NDY2AwUKZnJvbU1hcmtldAkAlQoDBQtwTWFya2V0QWRkcgIId2l0aGRyYXcJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE3MDA1MTc0NjYCXzEEBWZOYW1lCAUNJHQwMTcwMDUxNzQ2NgJfMgQGcGFyYW1zCAUNJHQwMTcwMDUxNzQ2NgJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxNzg4ODE4MTk0AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE3ODg4MTgxOTQCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNzg4ODE4MTk0Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAxODkzNDE4OTczCQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAxODkzNDE4OTczAl8xBAVwckZlZQgFDSR0MDE4OTM0MTg5NzMCXzIECGZlZVNjYWxlCQC2AgEAgMLXLwQNJHQwMTkwMTMxOTMyMQMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEIJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxBCQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTkwMTMxOTMyMQJfMQQKYXNzZXRUb1BheQgFDSR0MDE5MDEzMTkzMjECXzIEEmFtb3VudFRvUGF5V2l0aEZlZQkAoAMBCQC9AgQJALYCAQULYW1vdW50VG9QYXkFCGZlZVNjYWxlCQC4AgIFCGZlZVNjYWxlCQC2AgEJAGQCBQVwckZlZQUEcEZlZQUHQ0VJTElORwkAlAoCBQphc3NldFRvUGF5BRJhbW91bnRUb1BheVdpdGhGZWUBEGV4Y2hhbmdlRGlyZWN0bHkIBXBUeXBlBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAZwb29sRkIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBRdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIAAwMJAAACBQVwVHlwZQUHU0ZfUE9PTAYJAQIhPQIFBnBvb2xGQgIABA0kdDAxOTc2MjE5OTc0AwkAAAIFBnBvb2xGQgIACQCVCgMFBGJhbEEFBGJhbEIFBHBvb2wEDSR0MDE5ODY4MTk5NDEJARFnZXRTRlBvb2xCYWxhbmNlcwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBnBvb2xGQgQGc2ZCYWxBCAUNJHQwMTk4NjgxOTk0MQJfMQQGc2ZCYWxCCAUNJHQwMTk4NjgxOTk0MQJfMgkAlQoDBQZzZkJhbEEFBnNmQmFsQgUGcG9vbEZCBAVwQmFsQQgFDSR0MDE5NzYyMTk5NzQCXzEEBXBCYWxCCAUNJHQwMTk3NjIxOTk3NAJfMgQGZXhQb29sCAUNJHQwMTk3NjIxOTk3NAJfMwQNJHQwMTk5NzkyMDEwNQkBEWNhbGNBbW91bnRUb1BheVNGBwUGZXhQb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBXBCYWxBBQVwQmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTk5NzkyMDEwNQJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxOTk3OTIwMTA1Al8yCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmV4UG9vbAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW91bnRUb2tlblRvR2V0BQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMjAzMDcyMDQyOQkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAyMDMwNzIwNDI5Al8xBAthbW91bnRUb1BheQgFDSR0MDIwMzA3MjA0MjkCXzIJAPwHBAUOd3hTd2FwQ29udHJhY3QCBHN3YXAJAMwIAgUQYW1vdW50VG9rZW5Ub0dldAkAzAgCBQ9hc3NldFRva2VuVG9HZXQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwJAQ91bmtub3duUG9vbFR5cGUAARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDIwNzE2MjExODcDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUGd3hSZXN0Ahdwb29sRXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAyMDcxNjIxMTg3Al8xBAdhbW91bnRCCAUNJHQwMjA3MTYyMTE4NwJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDIxNTU1MjE2MzQJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjE1NTUyMTYzNAJfMQQDYklkCAUNJHQwMjE1NTUyMTYzNAJfMgQEYUJhbAgFDSR0MDIxNTU1MjE2MzQCXzMEBGJCYWwIBQ0kdDAyMTU1NTIxNjM0Al80BARscElkCAUNJHQwMjE1NTUyMTYzNAJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgdjbGFpbVd4CQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABD3JlcGxlbmlzaEJ5VHlwZQsFcFR5cGUEcG9vbAdmZWVUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgRMUElkC3N0YWtlTWFya2V0BA9scEJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAMJAAACBQ9scEJhbGFuY2VCZWZvcmUFD2xwQmFsYW5jZUJlZm9yZQQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEDSR0MDIyMjU5MjI2ODEDAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDIyMzI1MjI0NDcJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMJBQVwVHlwZQUIcG9vbEFkZHIFBExQSWQFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAyMjMyNTIyNDQ3Al8xBAZwbXRJbkIIBQ0kdDAyMjMyNTIyNDQ3Al8yBAZjaGFuZ2UIBQ0kdDAyMjMyNTIyNDQ3Al8zBAhjaGFuZ2VJZAgFDSR0MDIyMzI1MjI0NDcCXzQEA2ludgkBGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYFCHBvb2xBZGRyBQVwVHlwZQUGcG10SW5BBQNhSWQFBnBtdEluQgUDYklkAwkAAAIFA2ludgUDaW52CQCUCgIFBmNoYW5nZQUIY2hhbmdlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcG10QQAACQCUCgIFBHBtdEEFA2FJZAMJAGYCBQRwbXRCAAAJAJQKAgUEcG10QgUDYklkCQACAQIQcG10cyBtdXN0IGJlID4gMAQGY2hhbmdlCAUNJHQwMjIyNTkyMjY4MQJfMQQIY2hhbmdlSWQIBQ0kdDAyMjI1OTIyNjgxAl8yBANpbnYDCQBmAgUGY2hhbmdlAAAJARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQFCHBvb2xBZGRyBQVwVHlwZQUGY2hhbmdlBQhjaGFuZ2VJZAUDbmlsAwkAAAIFA2ludgUDaW52BA5scEJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkBAt0b3RhbFN0YWtlZAkAZQIFDmxwQmFsYW5jZUFmdGVyBQ9scEJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBAVpbnZMUAkBB3N0YWtlTFAFBQRwb29sBQVwVHlwZQUETFBJZAURdXNlclNoYXJlRm9yU3Rha2UFC3N0YWtlTWFya2V0AwkAAAIFBWludkxQBQVpbnZMUAkAlAoCBRF1c2VyU2hhcmVGb3JTdGFrZQUNYXhseUZlZUFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQcmVwbGVuaXNoRW50cmllcwkEcG9vbAR1c2VyDHN0YWtlZEFtb3VudA1heGx5RmVlQW1vdW50BnBvc051bQdzaGFyZUlkBHR5cGUId2l0aExvYW4Nc3Rha2VUb01hcmtldAQLdG90YWxBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3RvdGFsQW1vdW50TG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBBF0b3RhbEFtb3VudE1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQVdG90YWxBbW91bnRNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4AAAQScG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABBBwb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAQNJHQwMjQxMzYyNDk2MQMFCHdpdGhMb2FuAwUNc3Rha2VUb01hcmtldAkAlAoCBRZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQJAGQCBRF0b3RhbEFtb3VudE1hcmtldAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuCQBkAgUVdG90YWxBbW91bnRNYXJrZXRMb2FuBQxzdGFrZWRBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAYFA25pbAkAlAoCBRBwb29sSW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUPdG90YWxBbW91bnRMb2FuBQxzdGFrZWRBbW91bnQFA25pbAMFDXN0YWtlVG9NYXJrZXQJAJQKAgUYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQJAGQCBRF0b3RhbEFtb3VudE1hcmtldAUMc3Rha2VkQW1vdW50CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFmtVc2VyUG9zaXRpb25JblBNYXJrZXQGBQNuaWwJAJQKAgUScG9vbEludGVyZXN0Tm9Mb2FuBQNuaWwED2N1clBvb2xJbnRlcmVzdAgFDSR0MDI0MTM2MjQ5NjECXzEEB2FkRW50cnkIBQ0kdDAyNDEzNjI0OTYxAl8yCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFC3RvdGFsQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUNa1VzZXJQb3NpdGlvbgUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFWtVc2VyUG9zaXRpb25JbnRlcmVzdAUPY3VyUG9vbEludGVyZXN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAUEcG9vbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRBrVXNlclBvc2l0aW9uTnVtBQZwb3NOdW0JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlGZWVBbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsBQdhZEVudHJ5AQlsaXN0VG9JbnQCAWEEaXRlbQkAzQgCBQFhCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0BEGRpcmVjdFN3b3BmaUNQTU0CBXJBcmdzB3Rva2VuVG8EBGRBcHAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUFckFyZ3MAAQQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDcG10CQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBCQCRAwIFBHBtdFAAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBHBtdFAAAQUDbmlsBAttaW5Ub1JlY2l2ZQkAkQMCBQVyQXJncwADBANpbnYJAPwHBAUEZEFwcAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgULbWluVG9SZWNpdmUFA25pbAUDbmlsBQNwbXQDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2RpcmVjdFJvdXRpbmdTd29wZmkCBXJBcmdzB3Rva2VuVG8EBGRBcHAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUFckFyZ3MAAQQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQEBHBtdFAJALUJAgkAkQMCBQVyQXJncwACAgF8CQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEBGFyZ3MEBWVBcmdzCQC1CQIJAJEDAgUFckFyZ3MAAwIBfAQKZXhjaGFuZ2VycwkAtQkCCQCRAwIFBWVBcmdzAAACASwEDmV4Y2hhbmdlcnNUeXBlCQC1CQIJAJEDAgUFZUFyZ3MAAQIBLAQFYXJnczEKAAIkbAkAtQkCCQCRAwIFBWVBcmdzAAICASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWxpc3RUb0ludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwQFYXJnczIKAAIkbAkAtQkCCQCRAwIFBWVBcmdzAAMCASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWxpc3RUb0ludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwQRcm91dGluZ0Fzc2V0c0tleXMJALUJAgkAkQMCBQVlQXJncwAEAgEsBAttaW5Ub1JlY2l2ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWVBcmdzAAUJAMwIAgUKZXhjaGFuZ2VycwkAzAgCBQ5leGNoYW5nZXJzVHlwZQkAzAgCBQVhcmdzMQkAzAgCBQVhcmdzMgkAzAgCBRFyb3V0aW5nQXNzZXRzS2V5cwkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBANpbnYJAPwHBAUEZEFwcAIMcm91dGluZ1RyYWRlBQRhcmdzBQNwbXQDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCmNhcGl0YWxpemUEBHBvb2wFcFR5cGUHdG9rZW5JZAt0b2tlbkFtb3VudAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBA0kdDAyNzAxNDI3MDgwCQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA0FJZAgFDSR0MDI3MDE0MjcwODACXzEEA0JJZAgFDSR0MDI3MDE0MjcwODACXzIEBGJhbEEIBQ0kdDAyNzAxNDI3MDgwAl8zBARiYWxCCAUNJHQwMjcwMTQyNzA4MAJfNAQHc2hhcmVJZAgFDSR0MDI3MDE0MjcwODACXzUDAwkBAiE9AgUHdG9rZW5JZAUDQUlkCQECIT0CBQd0b2tlbklkBQNCSWQHCQACAQILV3JvbmcgYXNzZXQEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wDCQAAAgUQdG90YWxTaGFyZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQt0b2tlbkFtb3VudAkA2QQBBQd0b2tlbklkBQNuaWwEGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBAtsb2FuUGVyY2VudAkAawMFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUGU0NBTEU4BRB0b3RhbFNoYXJlQW1vdW50BBB0b2tlbnNGb3JGZWVMb2FuCQBrAwULdG9rZW5BbW91bnQFC2xvYW5QZXJjZW50BQZTQ0FMRTgEEnRva2Vuc0ZvckZlZU5vTG9hbgkAZQIFC3Rva2VuQW1vdW50BRB0b2tlbnNGb3JGZWVMb2FuBAtheGx5RmVlTG9hbgkAawMFEHRva2Vuc0ZvckZlZUxvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUMQ0FQX0ZFRV9MT0FOBQpGRUVfU0NBTEU2BA1heGx5RmVlTm9Mb2FuCQBrAwUSdG9rZW5zRm9yRmVlTm9Mb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFD0NBUF9GRUVfTk9fTE9BTgUKRkVFX1NDQUxFNgQHYXhseUZlZQkAZAIFC2F4bHlGZWVMb2FuBQ1heGx5RmVlTm9Mb2FuBA0kdDAyNzgyNTI3OTI1AwkAAAIFB3Rva2VuSWQFA0FJZAkAlAoCCQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUAAAkAlAoCAAAJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQQEcG10QQgFDSR0MDI3ODI1Mjc5MjUCXzEEBHBtdEIIBQ0kdDAyNzgyNTI3OTI1Al8yBA0kdDAyNzkyODI4MDM5CQEPcmVwbGVuaXNoQnlUeXBlCwUFcFR5cGUFBHBvb2wFBk5PX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQHBAxzdGFrZWRBbW91bnQIBQ0kdDAyNzkyODI4MDM5Al8xBAJuZggFDSR0MDI3OTI4MjgwMzkCXzIEE2N1clBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBVjdXJQb29sSW50ZXJlc3ROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAECnN0YWtlZExvYW4JAGsDBQxzdGFrZWRBbW91bnQFC2xvYW5QZXJjZW50BQZTQ0FMRTgEDHN0YWtlZE5vTG9hbgkAZQIFDHN0YWtlZEFtb3VudAUKc3Rha2VkTG9hbgQPbmV3SW50ZXJlc3RMb2FuAwkAZgIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUTY3VyUG9vbEludGVyZXN0TG9hbgkAawMFCnN0YWtlZExvYW4FB1NDQUxFMTAFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAABBFuZXdJbnRlcmVzdE5vTG9hbgMJAGYCCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRVjdXJQb29sSW50ZXJlc3ROb0xvYW4JAGsDBQxzdGFrZWROb0xvYW4FB1NDQUxFMTAJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuBQ9uZXdJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgURbmV3SW50ZXJlc3ROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFEHRvdGFsU2hhcmVBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZAIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUKc3Rha2VkTG9hbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUHYXhseUZlZQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5JZAUDbmlsCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAUDbmlsARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBHVzZXIEcG9vbAVwb3NJZAhib3Jyb3dlZAQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQMdXNlckludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAQMcG9vbEludGVyZXN0AwUIYm9ycm93ZWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgkAZAIFB3BBbW91bnQJAGsDBQdwQW1vdW50CQBlAgUMcG9vbEludGVyZXN0BQx1c2VySW50ZXJlc3QFB1NDQUxFMTABD2NhbGNTdG9wTG9zc0ZlZQQEcG9vbAppc0JvcnJvd2VkCHN0b3BMb3NzCmxwV2l0aGRyYXcEB2ZlZVR5cGUDBQppc0JvcnJvd2VkBQ1TVE9QTE9TU19MT0FOBRRTVE9QTE9TU19GRUVfTk9fTE9BTgMFCHN0b3BMb3NzCQBrAwUKbHBXaXRoZHJhdwkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2AAABDndpdGhkcmF3VG9Vc2VyBAR1c2VyBHBvb2wFcG9zSWQIc3RvcExvc3MEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24ECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQKaXNCb3Jyb3dlZAkAZgIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAAAAAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBXBvc0lkBQppc0JvcnJvd2VkBA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wECHVzZXJBZGRyCQEHQWRkcmVzcwEJANkEAQUEdXNlcgQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwMzA2ODAzMDc1MgkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAZpZEFTdHIIBQ0kdDAzMDY4MDMwNzUyAl8xBAZpZEJTdHIIBQ0kdDAzMDY4MDMwNzUyAl8yBARiYWxBCAUNJHQwMzA2ODAzMDc1MgJfMwQEYmFsQggFDSR0MDMwNjgwMzA3NTICXzQEB3NoYXJlSWQIBQ0kdDAzMDY4MDMwNzUyAl81BA0kdDAzMDc1NTMwODIyCQCUCgIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQVN0cgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRCU3RyBANpZEEIBQ0kdDAzMDc1NTMwODIyAl8xBANpZEIIBQ0kdDAzMDc1NTMwODIyAl8yBAtzdG9wTG9zc0ZlZQkBD2NhbGNTdG9wTG9zc0ZlZQQFBHBvb2wFCmlzQm9ycm93ZWQFCHN0b3BMb3NzBQ91c2VyQ2FuV2l0aGRyYXcEC2NCYWxBQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MBANpbnYJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAULc3RvcExvc3NGZWUFCmZyb21NYXJrZXQDCQAAAgUDaW52BQNpbnYJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAgh3aXRoZHJhdwkAzAgCCQDMCAIJAKQDAQkAZQIFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUFA25pbAUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkBCXVuc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQBkAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUKZnJvbU1hcmtldAMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDAzMTU1NzMxNjQ2CQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwMzE1NTczMTY0NgJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDMxNTU3MzE2NDYCXzIEDSR0MDMxNjQ5MzI4ODUDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDAzMTY0OTMyODg1Al8xBAd0b1VzZXJCCAUNJHQwMzE2NDkzMjg4NQJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBAdlbnRyaWVzCQDOCAIJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyUG9zaXRpb25Qb29sCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckNhbldpdGhkcmF3CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJBBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFB3RvVXNlckIFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFB3RvVXNlckEJAMwIAgUHdG9Vc2VyQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoEDXN0YWtlVG9NYXJrZXQJAAACCQCRAwIFB3JlcXVlc3QACwIEdHJ1ZQkAngoMBQR1c2VyBQRwb29sBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAUHYndBc3NldAUIYndBbW91bnQFDXN0YWtlVG9NYXJrZXQBEGNhbGNCb3Jyb3dBbW91bnQGBHBtdEEEcG10QgNhSWQDYklkCGxldmVyYWdlCGJvcnJvd0lkAwMJAQIhPQIFCGJvcnJvd0lkBQNhSWQJAQIhPQIFCGJvcnJvd0lkBQNiSWQHCQACAQISV3JvbmcgYm9ycm93IGFzc2V0BAdkUHJpY2VBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYUlkBQ5rUHJpY2VJbk9yYWNsZQQHZFByaWNlQgkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2JJZAUOa1ByaWNlSW5PcmFjbGUEBmRlY1ByQQkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04EBmRlY1ByQgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2JJZAAAAAAFBERPV04EDHBheWRJbkRvbGxhcgkAZAIJAGsDBQdkUHJpY2VBBQRwbXRBBQZkZWNQckEJAGsDBQdkUHJpY2VCBQRwbXRCBQZkZWNQckIEDSR0MDM0OTczMzUwNzADCQAAAgUIYm9ycm93SWQFA2FJZAkAlAoCBQdkUHJpY2VBBQZkZWNQckEJAJQKAgUHZFByaWNlQgUGZGVjUHJCBAtib3Jyb3dQcmljZQgFDSR0MDM0OTczMzUwNzACXzEEC2JvcnJvd0RlY1ByCAUNJHQwMzQ5NzMzNTA3MAJfMgkAawMJAGsDBQxwYXlkSW5Eb2xsYXIJAGUCBQhsZXZlcmFnZQBkAGQFC2JvcnJvd0RlY1ByBQtib3Jyb3dQcmljZQEScGFyc2VSZXBsZW5pc2hQbXRzAwRwbXRzA0FJZANCSWQDCQAAAgkAkAMBBQRwbXRzAAIDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQQMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAEHYXNzZXRJZAUDQklkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBCCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQICQCRAwIFBHBtdHMAAQZhbW91bnQDCQAAAgkAkAMBBQRwbXRzAAEDCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAAAAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQklkCQCUCgIAAAgJAJEDAgUEcG10cwAABmFtb3VudAkAAgECDVdyb25nIHBheW1lbnQJAAIBAhxPbmUgb3IgdHdvIHBheW1lbnRzIGV4cGVjdGVkAQ9jYWxjUHJpY2VJbXBhY3QEBGJhbEEEYmFsQgduZXdCYWxBB25ld0JhbEIEA3ByaQkAaAIJAGUCBQZTQ0FMRTgJAGsDCQBrAwUEYmFsQgUGU0NBTEU4BQRiYWxBBQZTQ0FMRTgJAGsDBQduZXdCYWxCBQZTQ0FMRTgFB25ld0JhbEEAZAMJAGYCAAAFA3ByaQkAaAIFA3ByaQD///////////8BBQNwcmkBEWNsYWltQW5kQ2hlY2tBbW50BQRwb29sBXBUeXBlBWNsYWltBmFtb3VudAZjaGFuZ2UEDSR0MDM2MDcwMzYzMzIDBQVjbGFpbQkBC2NsYWltRmFybWVkAgUFcFR5cGUFBHBvb2wEDGNsYWltZWRBc3NldAMJAAACBQVwVHlwZQUHU0ZfUE9PTAUGU1dPUElEAwkAAAIFBXBUeXBlBQdXWF9QT09MBQRXWElECQEPdW5rbm93blBvb2xUeXBlAAkAlAoCBQZhbW91bnQFDGNsYWltZWRBc3NldAMJAAACBQ0kdDAzNjA3MDM2MzMyBQ0kdDAzNjA3MDM2MzMyBApjbGFpbUFzc2V0CAUNJHQwMzYwNzAzNjMzMgJfMgQLY2xhaW1BbW91bnQIBQ0kdDAzNjA3MDM2MzMyAl8xBANiYWwJAQ5hY2NvdW50QmFsYW5jZQEFCmNsYWltQXNzZXQDCQAAAgUDYmFsBQNiYWwDCQBmAgUGYW1vdW50BQNiYWwJAAIBAhlUbyBiaWcgYW1vdW50IHRvIGV4Y2hhbmdlCQCUCgIFC2NsYWltQW1vdW50BQpjbGFpbUFzc2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuGwFpARNnZXRQb29sSW5mb1JFQURPTkxZAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDM2Njk5MzY3ODkJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzY2OTkzNjc4OQJfMQQDQklkCAUNJHQwMzY2OTkzNjc4OQJfMgQEYmFsQQgFDSR0MDM2Njk5MzY3ODkCXzMEBGJhbEIIBQ0kdDAzNjY5OTM2Nzg5Al80BAdzaGFyZUlkCAUNJHQwMzY2OTkzNjc4OQJfNQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAkAlAoCBQNuaWwJAJgKBgUDQUlkBQNCSWQFB3NoYXJlSWQFBGJhbEEFBGJhbEIFC3NoYXJlU3VwcGx5AWkBGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZAQdzaGFyZUlkBAtzaGFyZVByaWNlcwkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCQCUCgIFA25pbAULc2hhcmVQcmljZXMBaQEiZ2V0VXNlclBvc2l0aW9uU2hhcmVBbW91bnRSRUFET05MWQIEdXNlcgZwb3NOdW0EBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sAhBVbmtub3duIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sBQZwb3NOdW0JAGYCBQxib3Jyb3dBbW91bnQAAAkAlAoCBQNuaWwFD3VzZXJDYW5XaXRoZHJhdwFpARdnZXRVc2VyUG9zaXRpb25SRUFET05MWQMEdXNlcgVwb29scwZwb3NOdW0KAQd1c2VyUG9zAgFhBHBvb2wEDSR0MDM3NjYyMzc3MzIFAWEECXdBbW91bnRzQQgFDSR0MDM3NjYyMzc3MzICXzEECXdBbW91bnRzQggFDSR0MDM3NjYyMzc3MzICXzIEBWRlYnRzCAUNJHQwMzc2NjIzNzczMgJfMwQLZXFXQW1vdW50c0EIBQ0kdDAzNzY2MjM3NzMyAl80BAtlcVdBbW91bnRzQggFDSR0MDM3NjYyMzc3MzICXzUEBWluZGV4CAUNJHQwMzc2NjIzNzczMgJfNgMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUNa1VzZXJQb3NpdGlvbgkAmAoGCQDNCAIFCXdBbW91bnRzQQAACQDNCAIFCXdBbW91bnRzQgAACQDNCAIFBWRlYnRzAAAJAM0IAgULZXFXQW1vdW50c0EAAAkAzQgCBQtlcVdBbW91bnRzQgAACQBkAgUFaW5kZXgAAQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDM4MDExMzgxMDEJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzgwMTEzODEwMQJfMQQDQklkCAUNJHQwMzgwMTEzODEwMQJfMgQEYmFsQQgFDSR0MDM4MDExMzgxMDECXzMEBGJhbEIIBQ0kdDAzODAxMTM4MTAxAl80BAdzaGFyZUlkCAUNJHQwMzgwMTEzODEwMQJfNQQMYm9ycm93QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEWtVc2VyQm9ycm93QW1vdW50AAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wJAJEDAgUGcG9zTnVtBQVpbmRleAkAZgIFDGJvcnJvd0Ftb3VudAAABA0kdDAzODMxNzM4NDM3CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwQId0Ftb3VudEEIBQ0kdDAzODMxNzM4NDM3Al8xBAh3QW1vdW50QggFDSR0MDM4MzE3Mzg0MzcCXzIDCQBmAgUMYm9ycm93QW1vdW50AAAEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4CQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAZgIFBGRlYnQFCHdBbW91bnRBBwkAZQIFBGRlYnQFCHdBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUDQklkCQBmAgUEZGVidAUId0Ftb3VudEIHCQBlAgUEZGVidAUId0Ftb3VudEIAAAQLYW1vdW50VG9QYXkDCQBmAgUNYW1vdW50VG9HZXRFeAAAAwkAAAIFBXBUeXBlBQdTRl9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVNGBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgkBD3Vua25vd25Qb29sVHlwZQAAAAQNJHQwMzkzNDkzOTU2OAMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQCUCgIJAGUCCQBkAgUId0Ftb3VudEEFDWFtb3VudFRvR2V0RXgFBGRlYnQJAGUCBQh3QW1vdW50QgULYW1vdW50VG9QYXkJAJQKAgkAZQIFCHdBbW91bnRBBQthbW91bnRUb1BheQkAZQIJAGQCBQh3QW1vdW50QgUNYW1vdW50VG9HZXRFeAUEZGVidAQKZXFXQW1vdW50QQgFDSR0MDM5MzQ5Mzk1NjgCXzEECmVxV0Ftb3VudEIIBQ0kdDAzOTM0OTM5NTY4Al8yCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQDNCAIFBWRlYnRzBQRkZWJ0CQDNCAIFC2VxV0Ftb3VudHNBBQplcVdBbW91bnRBCQDNCAIFC2VxV0Ftb3VudHNCBQplcVdBbW91bnRCCQBkAgUFaW5kZXgAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgUFZGVidHMJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQBkAgUFaW5kZXgAAQQNJHQwMzk4MjMzOTkzNAoAAiRsBQVwb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJgKBgUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHdXNlclBvcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAl3QW1vdW50c0EIBQ0kdDAzOTgyMzM5OTM0Al8xBAl3QW1vdW50c0IIBQ0kdDAzOTgyMzM5OTM0Al8yBAVkZWJ0cwgFDSR0MDM5ODIzMzk5MzQCXzMEC2VxV0Ftb3VudHNBCAUNJHQwMzk4MjMzOTkzNAJfNAQLZXFXQW1vdW50c0IIBQ0kdDAzOTgyMzM5OTM0Al81CQCUCgIFA25pbAkAlwoFBQl3QW1vdW50c0EFCXdBbW91bnRzQgUFZGVidHMFC2VxV0Ftb3VudHNBBQtlcVdBbW91bnRzQgFpAQlyZXBsZW5pc2gEBHBvb2wIbGV2ZXJhZ2UIYm9ycm93SWQNc3Rha2VUb01hcmtldAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwMJAGYCAGQFCGxldmVyYWdlBgkAZgIFCGxldmVyYWdlAKwCCQACAQIfTGV2ZXJhZ2UgY2FuJ3QgYmUgPDEwMCBhbmQgPjMwMAMDCQEBIQEJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYW5Cb3Jyb3cJAGYCBQhsZXZlcmFnZQBkBwkAAgECHVlvdSBjYW4ndCBib3Jyb3cgaW4gdGhpcyBwb29sAwMFDXN0YWtlVG9NYXJrZXQJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFDGtQb29sUE1BcmtldAcHCQACAQImVGhpcyBwb29sIGNhbid0IHN0YWtlIHRvIHB1enpsZSBtYXJrZXQEDSR0MDQwNjkzNDA3ODMJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNDA2OTM0MDc4MwJfMQQDQklkCAUNJHQwNDA2OTM0MDc4MwJfMgQEYmFsQQgFDSR0MDQwNjkzNDA3ODMCXzMEBGJhbEIIBQ0kdDA0MDY5MzQwNzgzAl80BAdzaGFyZUlkCAUNJHQwNDA2OTM0MDc4MwJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwNDA4NjQ0MDkyMwkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDQwODY0NDA5MjMCXzEEBHBtdEIIBQ0kdDA0MDg2NDQwOTIzAl8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50CQDMCAIJAKUDAQUNc3Rha2VUb01hcmtldAUDbmlsAgEsBAxuZXdSZXF1ZXN0SWQKAAFACQD8BwQFBHRoaXMCEGNyZWF0ZU5ld1JlcXVlc3QJAMwIAgUHcmVxdWVzdAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDG5ld1JlcXVlc3RJZAUMbmV3UmVxdWVzdElkBARhcmdzCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIFDGJvcnJvd0Ftb3VudAkAzAgCCQClCAEFBHRoaXMJAMwIAgIRcmVwbGVuaXNoRnJvbUxhbmQJAMwIAgkApAMBCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDG5ld1JlcXVlc3RJZAIYQ2FuJ3QgY3JlYXRlIG5ldyByZXF1ZXN0BQNuaWwEA2ludgkA/QcECQEOZ2V0TGVuZFNydkFkZHIAAg1mbGFzaFBvc2l0aW9uBQRhcmdzBQNuaWwDCQAAAgUDaW52BQNpbnYECnVzZXJTdGFrZWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQUNa1VzZXJQb3NpdGlvbgQNJHQwNDE5NDY0MjA0MAkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwNDE5NDY0MjA0MAUNJHQwNDE5NDY0MjA0MAQHbmV3QmFsQggFDSR0MDQxOTQ2NDIwNDACXzIEB25ld0JhbEEIBQ0kdDA0MTk0NjQyMDQwAl8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDQyMTEwNDIyMjUJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA0MjExMDQyMjI1Al8xBAh3QW1vdW50QggFDSR0MDQyMTEwNDIyMjUCXzIJAJQKAgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDQyMjc4NDI0MDgJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAULTk9fTE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQ1zdGFrZVRvTWFya2V0AwkAAAIFDSR0MDQyMjc4NDI0MDgFDSR0MDQyMjc4NDI0MDgEB2F4bHlGZWUIBQ0kdDA0MjI3ODQyNDA4Al8yBAp1c2VyU3Rha2VkCAUNJHQwNDIyNzg0MjQwOAJfMQQNJHQwNDI0MTQ0MjUwOAkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwNDI0MTQ0MjUwOAUNJHQwNDI0MTQ0MjUwOAQHbmV3QmFsQggFDSR0MDQyNDE0NDI1MDgCXzIEB25ld0JhbEEIBQ0kdDA0MjQxNDQyNTA4Al8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDQyNTc4NDI2OTMJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA0MjU3ODQyNjkzAl8xBAh3QW1vdW50QggFDSR0MDQyNTc4NDI2OTMCXzIJAJQKAgkAzggCCQEQcmVwbGVuaXNoRW50cmllcwkFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFCW5ld1Bvc051bQUHc2hhcmVJZAUFcFR5cGUHBQ1zdGFrZVRvTWFya2V0CQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AgRwb29sBXBvc0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgQJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwFpARRjcmVhdGVVcGRhdGVTdG9wTG9zcwQFcG9zSWQGcG9vbElkB2Fzc2V0SWQFcHJpY2UJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBnBvb2xJZAIBXwkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAAIBAhpUaGVyZSBhcmUgbm8gdXNlciBwb3NpdGlvbgMJAGcCAAAFBXByaWNlCQACAQIcUHJpY2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCBQVwcmljZQUQdG9rZW5PcmFjbGVQcmljZQkAAgECK1ByaWNlIG11c3QgYmUgbGVzcyB0aGFuIGN1cnJlbnQgdG9rZW4gcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUFcHJpY2UFA25pbAFpAQ5kZWxldGVTdG9wTG9zcwMFcG9zSWQGcG9vbElkB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwkAAgECCE5vIGVudHJ5CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUDbmlsAWkBBGluaXQNDG1vbmV5Qm94QWRkcg1zZkZhcm1pbmdBZGRyCGxlbmRBZGRyD3ByaWNlT3JhY2xlQWRkchBrZWVwZXJFeENvbnRyYWN0Dnd4U3dhcENvbnRyYWN0C3N3b3BBc3NldElkCXd4QXNzZXRJZA5vcGVyYXRvclB1YktleRJncm91cDFBZG1pbjFQdWJLZXkSZ3JvdXAxQWRtaW4yUHViS2V5Emdyb3VwMkFkbWluMVB1YktleRJncm91cDJBZG1pbjJQdWJLZXkJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQlpc0RlZmluZWQBCQCiCAEFD2tPcGVyYXRvckNhbGxQSwkAAgECDkFscmVhZHkgaW5pdGVkAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQxtb25leUJveEFkZHIJAAIBAiNtb25leUJveEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUNc2ZGYXJtaW5nQWRkcgkAAgECJHNmRmFybWluZ0FkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUIbGVuZEFkZHIJAAIBAh9sZW5kQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ9wcmljZU9yYWNsZUFkZHIJAAIBAiZwcmljZU9yYWNsZUFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUQa2VlcGVyRXhDb250cmFjdAkAAgECJ2tlZXBlckV4Q29udHJhY3QgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQtzd29wQXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFCXd4QXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBAiE9AgkAyAEBCQDZBAEFDm9wZXJhdG9yUHViS2V5ACAJAAIBAh1vcGVyYXRvclB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAkAzAgCCQELU3RyaW5nRW50cnkCBQlrTW9uZXlCb3gFDG1vbmV5Qm94QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ5rU0ZGYXJtaW5nQWRkcgUNc2ZGYXJtaW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrTGVuZFNlcnZpY2UFCGxlbmRBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtQcmljZU9yYWNsZQUPcHJpY2VPcmFjbGVBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2tFeENvbnRyYWN0BRBrZWVwZXJFeENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tXeFN3YXBDb250cmFjdAUOd3hTd2FwQ29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1N3b3BJZAULc3dvcEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUFa1d4SWQFCXd4QXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rT3BlcmF0b3JDYWxsUEsFDm9wZXJhdG9yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjFQSwUSZ3JvdXAxQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjJQSwUSZ3JvdXAxQWRtaW4yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjFQSwUSZ3JvdXAyQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjJQSwUSZ3JvdXAyQWRtaW4yUHViS2V5BQNuaWwBaQEQY3JlYXRlTmV3UmVxdWVzdAEGcGFyYW1zCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkEDG5ld1JlcXVlc3RJZAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUMa1JlcXVlc3RJdGVyAAAAAQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkApAMBBQxuZXdSZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFBnBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1JlcXVlc3RJdGVyBQxuZXdSZXF1ZXN0SWQFA25pbAUMbmV3UmVxdWVzdElkAWkBEXJlcGxlbmlzaEZyb21MYW5kAQlyZXF1ZXN0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQQNJHQwNDc1NDc0NzY2NgkBDHBhcnNlUmVxdWVzdAEFCXJlcXVlc3RJZAQEdXNlcggFDSR0MDQ3NTQ3NDc2NjYCXzEEBHBvb2wIBQ0kdDA0NzU0NzQ3NjY2Al8yBARwbXRBCAUNJHQwNDc1NDc0NzY2NgJfMwQDQUlkCAUNJHQwNDc1NDc0NzY2NgJfNAQEcG10QggFDSR0MDQ3NTQ3NDc2NjYCXzUEA0JJZAgFDSR0MDQ3NTQ3NDc2NjYCXzYEBGJhbEEIBQ0kdDA0NzU0NzQ3NjY2Al83BARiYWxCCAUNJHQwNDc1NDc0NzY2NgJfOAQHc2hhcmVJZAgFDSR0MDQ3NTQ3NDc2NjYCXzkEB2J3QXNzZXQIBQ0kdDA0NzU0NzQ3NjY2A18xMAQIYndBbW91bnQIBQ0kdDA0NzU0NzQ3NjY2A18xMQQNc3Rha2VUb01hcmtldAgFDSR0MDQ3NTQ3NDc2NjYDXzEyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDA0Nzg1NjQ3OTU2AwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQUIYndBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFCGJ3QW1vdW50BAdwbXRBbGxBCAUNJHQwNDc4NTY0Nzk1NgJfMQQHcG10QWxsQggFDSR0MDQ3ODU2NDc5NTYCXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA0ODAzODQ4MTY4CQEPcmVwbGVuaXNoQnlUeXBlCwUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAUNc3Rha2VUb01hcmtldAQKdXNlclN0YWtlZAgFDSR0MDQ4MDM4NDgxNjgCXzEEB2F4bHlGZWUIBQ0kdDA0ODAzODQ4MTY4Al8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwkFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGBQ1zdGFrZVRvTWFya2V0BA0kdDA0ODU0MzQ4NjU4CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNDg1NDM0ODY1OAJfMQQId0Ftb3VudEIIBQ0kdDA0ODU0MzQ4NjU4Al8yCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDA0OTI5MTQ5MzgxCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDQ5MjkxNDkzODECXzEEA0JJZAgFDSR0MDQ5MjkxNDkzODECXzIEBGJhbEEIBQ0kdDA0OTI5MTQ5MzgxAl8zBARiYWxCCAUNJHQwNDkyOTE0OTM4MQJfNAQHc2hhcmVJZAgFDSR0MDQ5MjkxNDkzODECXzUEBmFtb3VudAkBCXVuc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ9saXF1aWRhdGVBbW91bnQFCmZyb21NYXJrZXQEDGJvcnJvd0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sBQVwb3NJZAkAZgIFDGJvcnJvd0Ftb3VudAAAAwkAZgIFD2xpcXVpZGF0ZUFtb3VudAUPdXNlckNhbldpdGhkcmF3CQACAQInWW91IGNhbid0IGxpcXVpZGF0ZSBtb3JlIHRoYW4gdXNlciBoYXZlAwkAAAIFDGJvcnJvd0Ftb3VudAAACQACAQIrWW91IGNhbid0IGxpcXVpZGF0ZSBwb3NpdGlvbiB3aXRob3V0IGJvcnJvdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAGUCBQ91c2VyQ2FuV2l0aGRyYXcFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBaQEIc3RvcExvc3MEBHVzZXIFcG9zSWQEcG9vbAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEDXN0b3BMb3NzUHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MCCE5vIGVudHJ5AwkAZgIFEHRva2VuT3JhY2xlUHJpY2UFDXN0b3BMb3NzUHJpY2UJAAIBAiNUb2tlbiBwcmljZSBncmVhdGVyIHN0b3AgbG9zcyBwcmljZQQDcmVzCQEOd2l0aGRyYXdUb1VzZXIEBQR1c2VyBQRwb29sCQCkAwEFBXBvc0lkBgkAlAoCCQDNCAIIBQNyZXMCXzEJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwgFA3JlcwJfMgFpAQxjYXBpdGFsaXplRXgFBHBvb2wFcm91dGUJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABA0kdDA1MTM2MzUxNDY1CQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0FEGFtb3VudFRvRXhjaGFuZ2UFBmNoYW5nZQMJAAACBQ0kdDA1MTM2MzUxNDY1BQ0kdDA1MTM2MzUxNDY1BAxjbGFpbWVkQXNzZXQIBQ0kdDA1MTM2MzUxNDY1Al8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNTEzNjM1MTQ2NQJfMQQFckFyZ3MJALUJAgUFcm91dGUCAl9fBA9leGNoYW5nZWRBbW91bnQDCQAAAgkAkQMCBQVyQXJncwAAAhBkaXJlY3RTd29wZmlDUE1NCQEQZGlyZWN0U3dvcGZpQ1BNTQIFBXJBcmdzBQl0b2tlblRvSWQDCQAAAgkAkQMCBQVyQXJncwAAAg1yb3V0aW5nU3dvcGZpCQETZGlyZWN0Um91dGluZ1N3b3BmaQIFBXJBcmdzBQl0b2tlblRvSWQJAAIBAgtXcm9uZyByb3V0ZQMJAAACBQ9leGNoYW5nZWRBbW91bnQFD2V4Y2hhbmdlZEFtb3VudAQJbmV3Q2hhbmdlCQBlAgkAZAIFDWNsYWltZWRBbW91bnQFBmNoYW5nZQUQYW1vdW50VG9FeGNoYW5nZQQLY2hhbmdlRW50cnkDCQBnAgUJbmV3Q2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UFCW5ld0NoYW5nZQUDbmlsBQNuaWwJAM4IAgkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQUJdG9rZW5Ub0lkBQ9leGNoYW5nZWRBbW91bnQFC2NoYW5nZUVudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNhcGl0YWxpemVOb0V4AwRwb29sBWNsYWltEWFtb3VudEZyb21CYWxhbmNlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQNJHQwNTIxNDk1MjI0NwkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRFhbW91bnRGcm9tQmFsYW5jZQAAAwkAAAIFDSR0MDUyMTQ5NTIyNDcFDSR0MDUyMTQ5NTIyNDcEDGNsYWltZWRBc3NldAgFDSR0MDUyMTQ5NTIyNDcCXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA1MjE0OTUyMjQ3Al8xCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBXBUeXBlCQEMYXNzZXRJZFRvU3RyAQUMY2xhaW1lZEFzc2V0CQBkAgUNY2xhaW1lZEFtb3VudAURYW1vdW50RnJvbUJhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELaW5pdE5ld1Bvb2wLBHR5cGUIcG9vbFR5cGUIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbhFzdG9wbG9zc0ZlZU5vTG9hbhNzdG9wbG9zc0ZlZVdpdGhMb2FuCWNhbkJvcnJvdwpjYW5QTWFya2V0CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwMJAQIhPQIFBHR5cGUFB1NGX1BPT0wJAQIhPQIFBHR5cGUFB1dYX1BPT0wHCQACAQIKV3JvbmcgdHlwZQMDCQECIT0CBQhwb29sVHlwZQUEQ1BNTQkBAiE9AgUIcG9vbFR5cGUFBEZMQVQHCQACAQIPV3JvbmcgcG9vbCB0eXBlBA0kdDA1MjgyMzUyOTE3CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUIcG9vbEFkZHIFBHR5cGUEA2FJZAgFDSR0MDUyODIzNTI5MTcCXzEEA2JJZAgFDSR0MDUyODIzNTI5MTcCXzIEBGFCYWwIBQ0kdDA1MjgyMzUyOTE3Al8zBARiQmFsCAUNJHQwNTI4MjM1MjkxNwJfNAQHc2hhcmVJZAgFDSR0MDUyODIzNTI5MTcCXzUDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtQb29sSW50ZXJlc3RMb2FuAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBWtQb29sBQhwb29sQWRkcgUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHBvb2xBZGRyBQlrUG9vbFR5cGUFCHBvb2xUeXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAUIcG9vbEFkZHIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUIcG9vbEFkZHIFDmtQb29sQ2FuQm9ycm93BQljYW5Cb3Jyb3cJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUIcG9vbEFkZHIFDGtQb29sUE1BcmtldAUKY2FuUE1hcmtldAUDbmlsAWkBDnVwZGF0ZVBvb2xGZWVzBwhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyCQACAQkArAICAhpDYW4ndCBmaW5kIHBvb2wgd2l0aCBhZGRyIAUIcG9vbEFkZHIDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4FA25pbAFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQITZEFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYFA25pbAFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhVkQXBwIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHBQNuaWwBaQEQYWN0aXZhdGVGb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh1kQXBwIGFscmVhZHkgYWN0aXZlIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBgUDbmlsAWkBEHNodXRkb3duRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh9kQXBwIGFscmVhZHkgc2h1dGRvd24gZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMHBQNuaWwBaQEKYWN0aXZhdGVTRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIVU1dPUEZJIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIXU1dPUEZJIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEKYWN0aXZhdGVXWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIRV1ggYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25XWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhNXWCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBDGFjdGl2YXRlUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhNQb29sIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgUDbmlsAWkBDHNodXRkb3duUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECFVBvb2wgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQcFA25pbAECdHgBBnZlcmlmeQAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEBmlzU2VsZgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQQKaXNSaWdodEZlZQMJAAACCAUDaW52A2ZlZQCg9zYJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHBAppc0luaXRDYWxsCQAAAggFA2ludghmdW5jdGlvbgIEaW5pdAQMaXNub1BheW1lbnRzCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAADAwMFCmlzUmlnaHRGZWUFCmlzSW5pdENhbGwHBQZpc1NlbGYHBQxpc25vUGF5bWVudHMHBAxncm91cDFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ5ncm91cDFBZG1pbjFQSwABCQBkAgAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUOZ3JvdXAxQWRtaW4yUEsAAQAABAxncm91cDJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQ5ncm91cDJBZG1pbjFQSwABCQBkAgAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUOZ3JvdXAyQWRtaW4yUEsAAQAACQAAAgkAZAIFDGdyb3VwMVNpZ25lZAUMZ3JvdXAyU2lnbmVkAAJvu9U+", "height": 3898803, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6R8prx8owCGGWoth8UEmBuhSJAsZVSbWbpwcYjvnrYfs Next: HqyheWYHnMZqZz2qtMN426za1WYpT3fW2zvRdB3kch5G Diff:
OldNewDifferences
810810 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
811811 let totalAmountMarket = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
812812 let totalAmountMarketLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
813- let poolInterestNoLoan = valueOrElse(getIntegerValue(this, (pool + kPoolInterestNoLoan)), 0)
814- let poolInterestLoan = valueOrElse(getIntegerValue(this, (pool + kPoolInterestLoan)), 0)
815- let poolInterestMarketNoLoan = valueOrElse(getIntegerValue(this, (pool + kPoolInterestMarketNoLoan)), 0)
816- let poolInterestMarketLoan = valueOrElse(getIntegerValue(this, (pool + kPoolInterestMarketLoan)), 0)
817- let $t02415624981 = if (withLoan)
813+ let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
814+ let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
815+ let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
816+ let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
817+ let $t02413624961 = if (withLoan)
818818 then if (stakeToMarket)
819819 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
820820 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
821821 else if (stakeToMarket)
822822 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
823823 else $Tuple2(poolInterestNoLoan, nil)
824- let curPoolInterest = $t02415624981._1
825- let adEntry = $t02415624981._2
824+ let curPoolInterest = $t02413624961._1
825+ let adEntry = $t02413624961._2
826826 ([IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPosition), stakedAmount), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInterest), curPoolInterest), StringEntry((((user + "_") + toString(posNum)) + kUserPositionPool), pool), IntegerEntry((user + kUserPositionNum), posNum), ScriptTransfer(moneyBox, axlyFeeAmount, fromBase58String(shareId))] ++ adEntry)
827827 }
828828
903903
904904 func capitalize (pool,pType,tokenId,tokenAmount) = {
905905 let poolAddr = Address(fromBase58String(pool))
906- let $t02703427100 = getPoolData(poolAddr, pType)
907- let AId = $t02703427100._1
908- let BId = $t02703427100._2
909- let balA = $t02703427100._3
910- let balB = $t02703427100._4
911- let shareId = $t02703427100._5
906+ let $t02701427080 = getPoolData(poolAddr, pType)
907+ let AId = $t02701427080._1
908+ let BId = $t02701427080._2
909+ let balA = $t02701427080._3
910+ let balB = $t02701427080._4
911+ let shareId = $t02701427080._5
912912 if (if ((tokenId != AId))
913913 then (tokenId != BId)
914914 else false)
925925 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
926926 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
927927 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
928- let $t02784527945 = if ((tokenId == AId))
928+ let $t02782527925 = if ((tokenId == AId))
929929 then $Tuple2((tokenAmount - axlyFee), 0)
930930 else $Tuple2(0, (tokenAmount - axlyFee))
931- let pmtA = $t02784527945._1
932- let pmtB = $t02784527945._2
933- let $t02794828059 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
934- let stakedAmount = $t02794828059._1
935- let nf = $t02794828059._2
931+ let pmtA = $t02782527925._1
932+ let pmtB = $t02782527925._2
933+ let $t02792828039 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
934+ let stakedAmount = $t02792828039._1
935+ let nf = $t02792828039._2
936936 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
937937 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
938938 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
979979 let userAddr = Address(fromBase58String(user))
980980 let poolAddr = Address(fromBase58String(pool))
981981 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
982- let $t03070030772 = getPoolData(poolAddr, pType)
983- let idAStr = $t03070030772._1
984- let idBStr = $t03070030772._2
985- let balA = $t03070030772._3
986- let balB = $t03070030772._4
987- let shareId = $t03070030772._5
988- let $t03077530842 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
989- let idA = $t03077530842._1
990- let idB = $t03077530842._2
982+ let $t03068030752 = getPoolData(poolAddr, pType)
983+ let idAStr = $t03068030752._1
984+ let idBStr = $t03068030752._2
985+ let balA = $t03068030752._3
986+ let balB = $t03068030752._4
987+ let shareId = $t03068030752._5
988+ let $t03075530822 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
989+ let idA = $t03075530822._1
990+ let idB = $t03075530822._2
991991 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
992992 let cBalABefore = accountBalance(idA)
993993 if ((cBalABefore == cBalABefore))
10181018 let cBalBAfter = accountBalance(idB)
10191019 if ((cBalBAfter == cBalBAfter))
10201020 then {
1021- let $t03157731666 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1022- let tokensAmountA = $t03157731666._1
1023- let tokensAmountB = $t03157731666._2
1024- let $t03166932905 = if (isBorrowed)
1021+ let $t03155731646 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1022+ let tokensAmountA = $t03155731646._1
1023+ let tokensAmountB = $t03155731646._2
1024+ let $t03164932885 = if (isBorrowed)
10251025 then {
10261026 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
10271027 let debt = {
10701070 else throw("Strict value is not equal to itself.")
10711071 }
10721072 else $Tuple2(tokensAmountA, tokensAmountB)
1073- let toUserA = $t03166932905._1
1074- let toUserB = $t03166932905._2
1073+ let toUserA = $t03164932885._1
1074+ let toUserB = $t03164932885._2
10751075 let poolTotalLoanEntries = if (isBorrowed)
10761076 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
10771077 else nil
11181118 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
11191119 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
11201120 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1121- let $t03499335090 = if ((borrowId == aId))
1121+ let $t03497335070 = if ((borrowId == aId))
11221122 then $Tuple2(dPriceA, decPrA)
11231123 else $Tuple2(dPriceB, decPrB)
1124- let borrowPrice = $t03499335090._1
1125- let borrowDecPr = $t03499335090._2
1124+ let borrowPrice = $t03497335070._1
1125+ let borrowDecPr = $t03497335070._2
11261126 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
11271127 }
11281128
11511151
11521152
11531153 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1154- let $t03609036352 = if (claim)
1154+ let $t03607036332 = if (claim)
11551155 then claimFarmed(pType, pool)
11561156 else {
11571157 let claimedAsset = if ((pType == SF_POOL))
11611161 else unknownPoolType()
11621162 $Tuple2(amount, claimedAsset)
11631163 }
1164- if (($t03609036352 == $t03609036352))
1164+ if (($t03607036332 == $t03607036332))
11651165 then {
1166- let claimAsset = $t03609036352._2
1167- let claimAmount = $t03609036352._1
1166+ let claimAsset = $t03607036332._2
1167+ let claimAmount = $t03607036332._1
11681168 let bal = accountBalance(claimAsset)
11691169 if ((bal == bal))
11701170 then if ((amount > bal))
11801180 func getPoolInfoREADONLY (pool) = {
11811181 let poolAddr = addressFromStringValue(pool)
11821182 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1183- let $t03671936809 = getPoolData(Address(fromBase58String(pool)), pType)
1184- let AId = $t03671936809._1
1185- let BId = $t03671936809._2
1186- let balA = $t03671936809._3
1187- let balB = $t03671936809._4
1188- let shareId = $t03671936809._5
1183+ let $t03669936789 = getPoolData(Address(fromBase58String(pool)), pType)
1184+ let AId = $t03669936789._1
1185+ let BId = $t03669936789._2
1186+ let balA = $t03669936789._3
1187+ let balB = $t03669936789._4
1188+ let shareId = $t03669936789._5
11891189 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11901190 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11911191 }
12131213 @Callable(i)
12141214 func getUserPositionREADONLY (user,pools,posNum) = {
12151215 func userPos (a,pool) = {
1216- let $t03768237752 = a
1217- let wAmountsA = $t03768237752._1
1218- let wAmountsB = $t03768237752._2
1219- let debts = $t03768237752._3
1220- let eqWAmountsA = $t03768237752._4
1221- let eqWAmountsB = $t03768237752._5
1222- let index = $t03768237752._6
1216+ let $t03766237732 = a
1217+ let wAmountsA = $t03766237732._1
1218+ let wAmountsB = $t03766237732._2
1219+ let debts = $t03766237732._3
1220+ let eqWAmountsA = $t03766237732._4
1221+ let eqWAmountsB = $t03766237732._5
1222+ let index = $t03766237732._6
12231223 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
12241224 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
12251225 else {
12261226 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1227- let $t03803138121 = getPoolData(Address(fromBase58String(pool)), pType)
1228- let AId = $t03803138121._1
1229- let BId = $t03803138121._2
1230- let balA = $t03803138121._3
1231- let balB = $t03803138121._4
1232- let shareId = $t03803138121._5
1227+ let $t03801138101 = getPoolData(Address(fromBase58String(pool)), pType)
1228+ let AId = $t03801138101._1
1229+ let BId = $t03801138101._2
1230+ let balA = $t03801138101._3
1231+ let balB = $t03801138101._4
1232+ let shareId = $t03801138101._5
12331233 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
12341234 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1235- let $t03833738457 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1236- let wAmountA = $t03833738457._1
1237- let wAmountB = $t03833738457._2
1235+ let $t03831738437 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1236+ let wAmountA = $t03831738437._1
1237+ let wAmountB = $t03831738437._2
12381238 if ((borrowAmount > 0))
12391239 then {
12401240 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12681268 }
12691269 else unknownPoolType()
12701270 else 0
1271- let $t03936939588 = if ((borrowAsset == AId))
1271+ let $t03934939568 = if ((borrowAsset == AId))
12721272 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12731273 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1274- let eqWAmountA = $t03936939588._1
1275- let eqWAmountB = $t03936939588._2
1274+ let eqWAmountA = $t03934939568._1
1275+ let eqWAmountB = $t03934939568._2
12761276 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12771277 }
12781278 else throw("Strict value is not equal to itself.")
12811281 }
12821282 }
12831283
1284- let $t03984339954 = {
1284+ let $t03982339934 = {
12851285 let $l = pools
12861286 let $s = size($l)
12871287 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12951295
12961296 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
12971297 }
1298- let wAmountsA = $t03984339954._1
1299- let wAmountsB = $t03984339954._2
1300- let debts = $t03984339954._3
1301- let eqWAmountsA = $t03984339954._4
1302- let eqWAmountsB = $t03984339954._5
1298+ let wAmountsA = $t03982339934._1
1299+ let wAmountsB = $t03982339934._2
1300+ let debts = $t03982339934._3
1301+ let eqWAmountsA = $t03982339934._4
1302+ let eqWAmountsB = $t03982339934._5
13031303 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
13041304 }
13051305
13231323 else false)
13241324 then throw("This pool can't stake to puzzle market")
13251325 else {
1326- let $t04071340803 = getPoolData(Address(fromBase58String(pool)), pType)
1327- let AId = $t04071340803._1
1328- let BId = $t04071340803._2
1329- let balA = $t04071340803._3
1330- let balB = $t04071340803._4
1331- let shareId = $t04071340803._5
1326+ let $t04069340783 = getPoolData(Address(fromBase58String(pool)), pType)
1327+ let AId = $t04069340783._1
1328+ let BId = $t04069340783._2
1329+ let balA = $t04069340783._3
1330+ let balB = $t04069340783._4
1331+ let shareId = $t04069340783._5
13321332 if (if ((borrowId != AId))
13331333 then (borrowId != BId)
13341334 else false)
13351335 then throw("Wrong borrow asset")
13361336 else {
1337- let $t04088440943 = parseReplenishPmts(i.payments, AId, BId)
1338- let pmtA = $t04088440943._1
1339- let pmtB = $t04088440943._2
1337+ let $t04086440923 = parseReplenishPmts(i.payments, AId, BId)
1338+ let pmtA = $t04086440923._1
1339+ let pmtB = $t04086440923._2
13401340 let user = toString(i.caller)
13411341 let newPosNum = getNewUserPositionNumber(user)
13421342 if ((leverage > 100))
13561356 if ((inv == inv))
13571357 then {
13581358 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1359- let $t04196642060 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1360- if (($t04196642060 == $t04196642060))
1359+ let $t04194642040 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1360+ if (($t04194642040 == $t04194642040))
13611361 then {
1362- let newBalB = $t04196642060._2
1363- let newBalA = $t04196642060._1
1362+ let newBalB = $t04194642040._2
1363+ let newBalA = $t04194642040._1
13641364 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1365- let $t04213042245 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1366- let wAmountA = $t04213042245._1
1367- let wAmountB = $t04213042245._2
1365+ let $t04211042225 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1366+ let wAmountA = $t04211042225._1
1367+ let wAmountB = $t04211042225._2
13681368 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13691369 }
13701370 else throw("Strict value is not equal to itself.")
13741374 else throw("Strict value is not equal to itself.")
13751375 }
13761376 else {
1377- let $t04229842428 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1378- if (($t04229842428 == $t04229842428))
1377+ let $t04227842408 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1378+ if (($t04227842408 == $t04227842408))
13791379 then {
1380- let axlyFee = $t04229842428._2
1381- let userStaked = $t04229842428._1
1382- let $t04243442528 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1383- if (($t04243442528 == $t04243442528))
1380+ let axlyFee = $t04227842408._2
1381+ let userStaked = $t04227842408._1
1382+ let $t04241442508 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1383+ if (($t04241442508 == $t04241442508))
13841384 then {
1385- let newBalB = $t04243442528._2
1386- let newBalA = $t04243442528._1
1385+ let newBalB = $t04241442508._2
1386+ let newBalA = $t04241442508._1
13871387 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1388- let $t04259842713 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1389- let wAmountA = $t04259842713._1
1390- let wAmountB = $t04259842713._2
1388+ let $t04257842693 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1389+ let wAmountA = $t04257842693._1
1390+ let wAmountB = $t04257842693._2
13911391 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13921392 }
13931393 else throw("Strict value is not equal to itself.")
14801480
14811481 @Callable(i)
14821482 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1483- let $t04756747686 = parseRequest(requestId)
1484- let user = $t04756747686._1
1485- let pool = $t04756747686._2
1486- let pmtA = $t04756747686._3
1487- let AId = $t04756747686._4
1488- let pmtB = $t04756747686._5
1489- let BId = $t04756747686._6
1490- let balA = $t04756747686._7
1491- let balB = $t04756747686._8
1492- let shareId = $t04756747686._9
1493- let bwAsset = $t04756747686._10
1494- let bwAmount = $t04756747686._11
1495- let stakeToMarket = $t04756747686._12
1483+ let $t04754747666 = parseRequest(requestId)
1484+ let user = $t04754747666._1
1485+ let pool = $t04754747666._2
1486+ let pmtA = $t04754747666._3
1487+ let AId = $t04754747666._4
1488+ let pmtB = $t04754747666._5
1489+ let BId = $t04754747666._6
1490+ let balA = $t04754747666._7
1491+ let balB = $t04754747666._8
1492+ let shareId = $t04754747666._9
1493+ let bwAsset = $t04754747666._10
1494+ let bwAmount = $t04754747666._11
1495+ let stakeToMarket = $t04754747666._12
14961496 if ((size(i.payments) != 1))
14971497 then throw("Wrong payment size")
14981498 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
15001500 else (i.payments[0].amount != bwAmount))
15011501 then throw("Wrong payment")
15021502 else {
1503- let $t04787647976 = if ((AId == bwAsset))
1503+ let $t04785647956 = if ((AId == bwAsset))
15041504 then $Tuple2((pmtA + bwAmount), pmtB)
15051505 else $Tuple2(pmtA, (pmtB + bwAmount))
1506- let pmtAllA = $t04787647976._1
1507- let pmtAllB = $t04787647976._2
1506+ let pmtAllA = $t04785647956._1
1507+ let pmtAllB = $t04785647956._2
15081508 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1509- let $t04805848188 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1510- let userStaked = $t04805848188._1
1511- let axlyFee = $t04805848188._2
1509+ let $t04803848168 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1510+ let userStaked = $t04803848168._1
1511+ let axlyFee = $t04803848168._2
15121512 let posNum = getNewUserPositionNumber(user)
15131513 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
15141514 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1515- let $t04856348678 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1516- let wAmountA = $t04856348678._1
1517- let wAmountB = $t04856348678._2
1515+ let $t04854348658 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1516+ let wAmountA = $t04854348658._1
1517+ let wAmountB = $t04854348658._2
15181518 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
15191519 }
15201520 }))
15261526 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
15271527 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
15281528 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1529- let $t04931149401 = getPoolData(Address(fromBase58String(pool)), pType)
1530- let AId = $t04931149401._1
1531- let BId = $t04931149401._2
1532- let balA = $t04931149401._3
1533- let balB = $t04931149401._4
1534- let shareId = $t04931149401._5
1529+ let $t04929149381 = getPoolData(Address(fromBase58String(pool)), pType)
1530+ let AId = $t04929149381._1
1531+ let BId = $t04929149381._2
1532+ let balA = $t04929149381._3
1533+ let balB = $t04929149381._4
1534+ let shareId = $t04929149381._5
15351535 let amount = unstakeLP(pool, pType, shareId, liquidateAmount, fromMarket)
15361536 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
15371537 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15631563 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15641564 let pType = getStringValue(this, (kPool + pool))
15651565 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1566- let $t05138351485 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1567- if (($t05138351485 == $t05138351485))
1566+ let $t05136351465 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1567+ if (($t05136351465 == $t05136351465))
15681568 then {
1569- let claimedAsset = $t05138351485._2
1570- let claimedAmount = $t05138351485._1
1569+ let claimedAsset = $t05136351465._2
1570+ let claimedAmount = $t05136351465._1
15711571 let rArgs = split(route, "__")
15721572 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15731573 then directSwopfiCPMM(rArgs, tokenToId)
15921592 @Callable(i)
15931593 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15941594 let pType = getStringValue(this, (kPool + pool))
1595- let $t05216952267 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1596- if (($t05216952267 == $t05216952267))
1595+ let $t05214952247 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1596+ if (($t05214952247 == $t05214952247))
15971597 then {
1598- let claimedAsset = $t05216952267._2
1599- let claimedAmount = $t05216952267._1
1598+ let claimedAsset = $t05214952247._2
1599+ let claimedAmount = $t05214952247._1
16001600 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
16011601 }
16021602 else throw("Strict value is not equal to itself.")
16141614 else false)
16151615 then throw("Wrong pool type")
16161616 else {
1617- let $t05284352937 = getPoolData(Address(fromBase58String(poolAddr)), type)
1618- let aId = $t05284352937._1
1619- let bId = $t05284352937._2
1620- let aBal = $t05284352937._3
1621- let bBal = $t05284352937._4
1622- let shareId = $t05284352937._5
1617+ let $t05282352917 = getPoolData(Address(fromBase58String(poolAddr)), type)
1618+ let aId = $t05282352917._1
1619+ let bId = $t05282352917._2
1620+ let aBal = $t05282352917._3
1621+ let bBal = $t05282352917._4
1622+ let shareId = $t05282352917._5
16231623 if ((0 > inFeeNoLoan))
16241624 then throw("inFeeNoLoan must be greater than 0")
16251625 else if ((0 > inFeeLoan))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let CONF = addressFromStringValue(getStringValue(this, "config"))
55
66 let SF_POOL = "SF"
77
88 let WX_POOL = "WX"
99
1010 let CPMM = "cpmm"
1111
1212 let FLAT = "flat"
1313
1414 let CAP_FEE_NO_LOAN = "capNoLoan"
1515
1616 let CAP_FEE_LOAN = "capLoan"
1717
1818 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1919
2020 let STOPLOSS_LOAN = "stopLossLoan"
2121
2222 let LOAN_FEE = "loan"
2323
2424 let NO_LOAN_FEE = "noLoan"
2525
2626 let NO_FEE = "noFee"
2727
2828 let SCALE8 = 100000000
2929
3030 let SCALE10 = 10000000000
3131
3232 let SCALE16 = toBigInt(10000000000000000)
3333
3434 let FEE_SCALE6 = 1000000
3535
3636 let kSFPoolAAssetBalance = "A_asset_balance"
3737
3838 let kSFPoolBAssetBalance = "B_asset_balance"
3939
4040 let kSFPoolAAssetId = "A_asset_id"
4141
4242 let kSFPoolBAssetId = "B_asset_id"
4343
4444 let kSFPoolShareId = "share_asset_id"
4545
4646 let kSFPoolShareSupply = "share_asset_supply"
4747
4848 let kSFPoolFee = "commission"
4949
5050 let kUserPosition = "_userPosition"
5151
5252 let kUserPositionPool = "_userPositionPool"
5353
5454 let kUserBorrowAmount = "_userPositionBorrowAmount"
5555
5656 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5757
5858 let kUserPositionNum = "_userPositionNumber"
5959
6060 let kUserPositionInterest = "_userPositionInterest"
6161
6262 let kUserPositionInPMarket = "_userPositionPMarket"
6363
6464 let kPoolTotal = "_poolTotal"
6565
6666 let kPoolTotalLoan = "_poolTotalLoan"
6767
6868 let kPoolTotalMarket = "_poolTotalMarket"
6969
7070 let kPoolTotalMarketLoan = "_poolTotalMarketLoan"
7171
7272 let kPoolInterestLoan = "_poolInterestLoan"
7373
7474 let kPoolInterestNoLoan = "_poolInterestNoLoan"
7575
7676 let kPoolInterestMarketLoan = "_poolInterestMarketLoan"
7777
7878 let kPoolInterestMarketNoLoan = "_poolInterestMarketNoLoan"
7979
8080 let kPoolCanBorrow = "_poolCanBorrow"
8181
8282 let kPoolPMArket = "_poolPuzzleMarket"
8383
8484 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
8585
8686 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
8787
8888 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
8989
9090 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
9191
9292 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
9393
9494 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
9595
9696 let kRequestId = "_request_id"
9797
9898 let kRequestIter = "requests_iter"
9999
100100 let kPool = "pool_"
101101
102102 let kPoolType = "_poolType"
103103
104104 let kSharePool = "_poolShareId"
105105
106106 let kPoolCapChange = "_poolCapChange"
107107
108108 let kTokenLastPrice = "last_price"
109109
110110 let kPriceInOracle = "_twap5B"
111111
112112 let kActive = "active"
113113
114114 let kActiveUsers = "activeUsers"
115115
116116 let kActiveSFWX = "_active"
117117
118118 let kPoolActive = "_activePool"
119119
120120 let kUserStopLoss = "_stopLoss"
121121
122122 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
123123
124124 let kMoneyBox = "axly_money_box"
125125
126126 let kSFFarmingAddr = "swopfi_farming_addr"
127127
128128 let kLendService = "lend_service_addr"
129129
130130 let kOperatorCallPK = "admin_call_pub_key"
131131
132132 let kPriceOracle = "price_oracle"
133133
134134 let kExContract = "exchange_contract"
135135
136136 let kWxSwapContract = "wx_swap_contract"
137137
138138 let kWxRest = "wx_rest_addr"
139139
140140 let kSwopId = "swop_id"
141141
142142 let kWxId = "wx_id"
143143
144144 let kPMarketAddr = "puzzle_market_address"
145145
146146 let kPMarketRestAddr = "puzzle_market_rest_address"
147147
148148 let kGroup1Admin1PK = "group1_admin1_pub_key"
149149
150150 let kGroup1Admin2PK = "group1_admin2_pub_key"
151151
152152 let kGroup2Admin1PK = "group2_admin1_pub_key"
153153
154154 let kGroup2Admin2PK = "group2_admin2_pub_key"
155155
156156 let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
157157
158158 let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
159159
160160 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
161161
162162 let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
163163
164164 let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
165165
166166 let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
167167
168168 let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
169169
170170 let pMarketAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketAddr), "No puzzle market address"))
171171
172172 let pMarketRestAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketRestAddr), "No puzzle market rest address"))
173173
174174 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
175175
176176 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
177177
178178 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
179179
180180 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
181181
182182 let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
183183
184184 func unknownPoolType () = throw("Wrong pool type")
185185
186186
187187 func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
188188
189189
190190 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
191191 then unit
192192 else throw("Only operator can call this function")
193193
194194
195195 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
196196 then true
197197 else (i.callerPublicKey == group1Admin2PK))
198198 then unit
199199 else throw("Only admin group1 can call this function")
200200
201201
202202 func isSelfCall (i) = if ((i.caller == this))
203203 then unit
204204 else throw("Only contract itself can call this function")
205205
206206
207207 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
208208 then unit
209209 else throw("Only land contract can call this function")
210210
211211
212212 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
213213 then unit
214214 else throw("DApp is inactive at this moment")
215215
216216
217217 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
218218 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
219219 else false)
220220 then unit
221221 else throw("DApp is inactive for users at this moment")
222222
223223
224224 func isPoolActive (pool,type) = {
225225 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
226226 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
227227 if (if (WXSFActive)
228228 then poolActive
229229 else false)
230230 then true
231231 else false
232232 }
233233
234234
235235 func accountBalance (assetId) = match assetId {
236236 case id: ByteVector =>
237237 assetBalance(this, id)
238238 case waves: Unit =>
239239 wavesBalance(this).available
240240 case _ =>
241241 throw("Match error")
242242 }
243243
244244
245245 func getSFPoolBalances (poolAddr) = $Tuple2(valueOrErrorMessage(getInteger(poolAddr, kSFPoolAAssetBalance), "Can't get pool A asset balance"), valueOrErrorMessage(getInteger(poolAddr, kSFPoolBAssetBalance), "Can't get pool B asset balance"))
246246
247247
248248 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
249249 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
250250 if ($isInstanceOf(@, "Int"))
251251 then @
252252 else throw(($getType(@) + " couldn't be cast to Int"))
253253 }, {
254254 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
255255 if ($isInstanceOf(@, "Int"))
256256 then @
257257 else throw(($getType(@) + " couldn't be cast to Int"))
258258 })
259259
260260
261261 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
262262 then getSFPoolBalances(poolAddr)
263263 else if ((type == WX_POOL))
264264 then getWXPoolBalances(poolAddr, aId, bId)
265265 else unknownPoolType()
266266
267267
268268 func getSFPoolData (poolAddr) = {
269269 let $t094239472 = getSFPoolBalances(poolAddr)
270270 if (($t094239472 == $t094239472))
271271 then {
272272 let balB = $t094239472._2
273273 let balA = $t094239472._1
274274 $Tuple5(valueOrErrorMessage(getString(poolAddr, kSFPoolAAssetId), "Can't get pool A asset id"), valueOrErrorMessage(getString(poolAddr, kSFPoolBAssetId), "Can't get pool B asset id"), balA, balB, valueOrErrorMessage(getString(poolAddr, kSFPoolShareId), "Can't get share asset id"))
275275 }
276276 else throw("Strict value is not equal to itself.")
277277 }
278278
279279
280280 func getWXPoolData (poolAddr) = {
281281 let cfg = {
282282 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
283283 if ($isInstanceOf(@, "List[Any]"))
284284 then @
285285 else throw(($getType(@) + " couldn't be cast to List[Any]"))
286286 }
287287 if ((cfg == cfg))
288288 then {
289289 let aId = valueOrErrorMessage({
290290 let @ = cfg[4]
291291 if ($isInstanceOf(@, "String"))
292292 then @
293293 else unit
294294 }, "Can't get pool A asset id")
295295 let bId = valueOrErrorMessage({
296296 let @ = cfg[5]
297297 if ($isInstanceOf(@, "String"))
298298 then @
299299 else unit
300300 }, "Can't get pool B asset id")
301301 let shareId = valueOrErrorMessage({
302302 let @ = cfg[3]
303303 if ($isInstanceOf(@, "String"))
304304 then @
305305 else unit
306306 }, "Can't get pool LP asset id")
307307 let $t01016910228 = getWXPoolBalances(poolAddr, aId, bId)
308308 if (($t01016910228 == $t01016910228))
309309 then {
310310 let balB = $t01016910228._2
311311 let balA = $t01016910228._1
312312 $Tuple5(aId, bId, balA, balB, shareId)
313313 }
314314 else throw("Strict value is not equal to itself.")
315315 }
316316 else throw("Strict value is not equal to itself.")
317317 }
318318
319319
320320 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
321321 then getSFPoolData(poolAddr)
322322 else if ((type == WX_POOL))
323323 then getWXPoolData(poolAddr)
324324 else unknownPoolType()
325325
326326
327327 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
328328 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
329329 else if ((type == WX_POOL))
330330 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
331331 else unknownPoolType()
332332
333333
334334 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
335335
336336
337337 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
338338
339339
340340 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
341341
342342
343343 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
344344 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
345345 else if ((feeType == CAP_FEE_NO_LOAN))
346346 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
347347 else if ((feeType == LOAN_FEE))
348348 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
349349 else if ((feeType == NO_LOAN_FEE))
350350 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
351351 else if ((feeType == NO_FEE))
352352 then 0
353353 else throw("Wrong fee type")
354354
355355
356356 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
357357
358358
359359 func getWXFarmingAddr (poolAddr) = {
360360 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
361361 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
362362 Address(fromBase58String(factroyCfg[1]))
363363 }
364364
365365
366366 func assetIdToStr (assetId) = match assetId {
367367 case id: ByteVector =>
368368 toBase58String(id)
369369 case waves: Unit =>
370370 "WAVES"
371371 case _ =>
372372 throw("Not Asset id")
373373 }
374374
375375
376376 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
377377 then unit
378378 else fromBase58String(assetId)
379379
380380
381381 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
382382 then 8
383383 else match assetInfo(fromBase58String(assetId)) {
384384 case asset: Asset =>
385385 asset.decimals
386386 case _ =>
387387 throw("Can't find asset")
388388 }
389389
390390
391391 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
392392
393393
394394 func getAssetsPrice (assetIds) = {
395395 func getPrices (a,assetId) = {
396396 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
397397 (a :+ assetPrice)
398398 }
399399
400400 let $l = assetIds
401401 let $s = size($l)
402402 let $acc0 = nil
403403 func $f0_1 ($a,$i) = if (($i >= $s))
404404 then $a
405405 else getPrices($a, $l[$i])
406406
407407 func $f0_2 ($a,$i) = if (($i >= $s))
408408 then $a
409409 else throw("List size exceeds 50")
410410
411411 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
412412 }
413413
414414
415415 func getSharePrice (shareId) = {
416416 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
417417 let poolAddr = Address(fromBase58String(pool))
418418 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
419419 let $t01321713282 = getPoolData(poolAddr, pType)
420420 let aId = $t01321713282._1
421421 let bId = $t01321713282._2
422422 let aBalance = $t01321713282._3
423423 let bBalance = $t01321713282._4
424424 let prices = getAssetsPrice([aId, bId])
425425 let dPriceA = prices[0]
426426 let dPriceB = prices[1]
427427 if (if ((0 > dPriceA))
428428 then true
429429 else (0 > dPriceB))
430430 then -1
431431 else {
432432 let shareSupply = getShareSupply(poolAddr, pType, shareId)
433433 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
434434 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
435435 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
436436 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
437437 fraction(sum, sharePrecision, shareSupply)
438438 }
439439 }
440440
441441
442442 func getSharePrices (shareIds) = {
443443 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
444444
445445 let $l = shareIds
446446 let $s = size($l)
447447 let $acc0 = nil
448448 func $f0_1 ($a,$i) = if (($i >= $s))
449449 then $a
450450 else getPrices($a, $l[$i])
451451
452452 func $f0_2 ($a,$i) = if (($i >= $s))
453453 then $a
454454 else throw("List size exceeds 20")
455455
456456 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
457457 }
458458
459459
460460 func getCursEntries (aId,bId,shareId,wAmounts) = {
461461 let assetsPrices = getAssetsPrice([aId, bId])
462462 let sharePrice = getSharePrice(shareId)
463463 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
464464 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
465465 }
466466
467467
468468 func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
469469 then {
470470 let repl = {
471471 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
472472 if ($isInstanceOf(@, "List[Any]"))
473473 then @
474474 else throw(($getType(@) + " couldn't be cast to List[Any]"))
475475 }
476476 if ((repl == repl))
477477 then $Tuple5({
478478 let @ = repl[3]
479479 if ($isInstanceOf(@, "Int"))
480480 then @
481481 else throw(($getType(@) + " couldn't be cast to Int"))
482482 }, {
483483 let @ = repl[4]
484484 if ($isInstanceOf(@, "Int"))
485485 then @
486486 else throw(($getType(@) + " couldn't be cast to Int"))
487487 }, {
488488 let @ = repl[1]
489489 if ($isInstanceOf(@, "Int"))
490490 then @
491491 else throw(($getType(@) + " couldn't be cast to Int"))
492492 }, assetIdToStr(repl[2]), {
493493 let @ = repl[0]
494494 if ($isInstanceOf(@, "Int"))
495495 then @
496496 else throw(($getType(@) + " couldn't be cast to Int"))
497497 })
498498 else throw("Strict value is not equal to itself.")
499499 }
500500 else if ((pType == WX_POOL))
501501 then {
502502 let $t01484015106 = $Tuple2(split({
503503 let @ = invoke(wxRest, "poolEvaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
504504 if ($isInstanceOf(@, "String"))
505505 then @
506506 else throw(($getType(@) + " couldn't be cast to String"))
507507 }, "__"), split({
508508 let @ = invoke(wxRest, "poolEvaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
509509 if ($isInstanceOf(@, "String"))
510510 then @
511511 else throw(($getType(@) + " couldn't be cast to String"))
512512 }, "__"))
513513 if (($t01484015106 == $t01484015106))
514514 then {
515515 let evalPutInB = $t01484015106._2
516516 let evalPutInA = $t01484015106._1
517517 let lpInA = parseIntValue(evalPutInA[1])
518518 let lpInB = parseIntValue(evalPutInB[1])
519519 if ((lpInB > lpInA))
520520 then {
521521 let pmt = parseIntValue(evalPutInA[8])
522522 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
523523 }
524524 else {
525525 let pmt = parseIntValue(evalPutInB[7])
526526 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
527527 }
528528 }
529529 else throw("Strict value is not equal to itself.")
530530 }
531531 else unknownPoolType()
532532
533533
534534 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
535535 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
536536 if ((pType == SF_POOL))
537537 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
538538 else if ((pType == WX_POOL))
539539 then invoke(poolAddr, "put", [1000000, false], payments)
540540 else unknownPoolType()
541541 }
542542
543543
544544 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
545545 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
546546 if ((pType == SF_POOL))
547547 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
548548 else if ((pType == WX_POOL))
549549 then {
550550 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
551551 then "putOneTknV2"
552552 else "putOneTkn"
553553 invoke(poolAddr, fc, [0, false], payments)
554554 }
555555 else unknownPoolType()
556556 }
557557
558558
559559 func stakeLP (pool,pType,shareId,amount,stakeToMarket) = {
560560 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
561561 if (stakeToMarket)
562562 then invoke(pMarketAddr, "supply", nil, payments)
563563 else if ((pType == SF_POOL))
564564 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
565565 else if ((pType == WX_POOL))
566566 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
567567 else unknownPoolType()
568568 }
569569
570570
571571 func unstakeLP (pool,pType,shareId,amount,fromMarket) = {
572572 let $t01700517466 = if (fromMarket)
573573 then $Tuple3(pMarketAddr, "withdraw", [shareId, amount])
574574 else if ((pType == SF_POOL))
575575 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
576576 else if ((pType == WX_POOL))
577577 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
578578 else unknownPoolType()
579579 let farmAddr = $t01700517466._1
580580 let fName = $t01700517466._2
581581 let params = $t01700517466._3
582582 let inv = invoke(farmAddr, fName, params, nil)
583583 if ((inv == inv))
584584 then amount
585585 else throw("Strict value is not equal to itself.")
586586 }
587587
588588
589589 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
590590 let poolAddr = Address(fromBase58String(pool))
591591 let feeScale6 = 1000000
592592 let fee = getIntegerValue(poolAddr, kSFPoolFee)
593593 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
594594 let $t01788818194 = if ((assetTokenToGet == assetIdA))
595595 then {
596596 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
597597 $Tuple2(amountToPay, assetIdB)
598598 }
599599 else {
600600 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
601601 $Tuple2(amountToPay, assetIdA)
602602 }
603603 let amountToPay = $t01788818194._1
604604 let assetToPay = $t01788818194._2
605605 $Tuple2(assetToPay, amountToPay)
606606 }
607607
608608
609609 func getWXSwapFees (pool) = {
610610 let poolAddr = addressFromStringValue(pool)
611611 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
612612 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
613613 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
614614 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
615615 case fees: (Int, Int) =>
616616 $Tuple2(fees._1, fees._2)
617617 case _ =>
618618 $Tuple2(poolFeeDefault, protocolFeeDefault)
619619 }
620620 }
621621
622622
623623 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
624624 let $t01893418973 = getWXSwapFees(pool)
625625 let pFee = $t01893418973._1
626626 let prFee = $t01893418973._2
627627 let feeScale = toBigInt(100000000)
628628 let $t01901319321 = if ((assetTokenToGet == assetIdA))
629629 then {
630630 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
631631 $Tuple2(amountToPay, assetIdB)
632632 }
633633 else {
634634 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
635635 $Tuple2(amountToPay, assetIdA)
636636 }
637637 let amountToPay = $t01901319321._1
638638 let assetToPay = $t01901319321._2
639639 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
640640 $Tuple2(assetToPay, amountToPayWithFee)
641641 }
642642
643643
644644 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
645645 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
646646 if (if ((pType == SF_POOL))
647647 then true
648648 else (poolFB != ""))
649649 then {
650650 let $t01976219974 = if ((poolFB == ""))
651651 then $Tuple3(balA, balB, pool)
652652 else {
653653 let $t01986819941 = getSFPoolBalances(addressFromStringValue(poolFB))
654654 let sfBalA = $t01986819941._1
655655 let sfBalB = $t01986819941._2
656656 $Tuple3(sfBalA, sfBalB, poolFB)
657657 }
658658 let pBalA = $t01976219974._1
659659 let pBalB = $t01976219974._2
660660 let exPool = $t01976219974._3
661661 let $t01997920105 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
662662 let assetToPay = $t01997920105._1
663663 let amountToPay = $t01997920105._2
664664 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
665665 }
666666 else if ((pType == WX_POOL))
667667 then {
668668 let $t02030720429 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
669669 let assetToPay = $t02030720429._1
670670 let amountToPay = $t02030720429._2
671671 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
672672 }
673673 else unknownPoolType()
674674 }
675675
676676
677677 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
678678 let $t02071621187 = if ((pType == SF_POOL))
679679 then {
680680 let inv = {
681681 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
682682 if ($isInstanceOf(@, "List[Any]"))
683683 then @
684684 else throw(($getType(@) + " couldn't be cast to List[Any]"))
685685 }
686686 if ((inv == inv))
687687 then $Tuple2({
688688 let @ = inv[0]
689689 if ($isInstanceOf(@, "Int"))
690690 then @
691691 else throw(($getType(@) + " couldn't be cast to Int"))
692692 }, {
693693 let @ = inv[1]
694694 if ($isInstanceOf(@, "Int"))
695695 then @
696696 else throw(($getType(@) + " couldn't be cast to Int"))
697697 })
698698 else throw("Strict value is not equal to itself.")
699699 }
700700 else if ((pType == WX_POOL))
701701 then {
702702 let inv = split({
703703 let @ = invoke(wxRest, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
704704 if ($isInstanceOf(@, "String"))
705705 then @
706706 else throw(($getType(@) + " couldn't be cast to String"))
707707 }, "__")
708708 if ((inv == inv))
709709 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
710710 else throw("Strict value is not equal to itself.")
711711 }
712712 else unknownPoolType()
713713 let amountA = $t02071621187._1
714714 let amountB = $t02071621187._2
715715 $Tuple2(amountA, amountB)
716716 }
717717
718718
719719 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
720720 then {
721721 let balBefore = accountBalance(SWOPID)
722722 if ((balBefore == balBefore))
723723 then {
724724 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
725725 if ((inv == inv))
726726 then {
727727 let balAfter = accountBalance(SWOPID)
728728 $Tuple2((balAfter - balBefore), SWOPID)
729729 }
730730 else throw("Strict value is not equal to itself.")
731731 }
732732 else throw("Strict value is not equal to itself.")
733733 }
734734 else if ((pType == WX_POOL))
735735 then {
736736 let $t02155521634 = getWXPoolData(addressFromStringValue(pool))
737737 let aId = $t02155521634._1
738738 let bId = $t02155521634._2
739739 let aBal = $t02155521634._3
740740 let bBal = $t02155521634._4
741741 let lpId = $t02155521634._5
742742 let balBefore = accountBalance(WXID)
743743 if ((balBefore == balBefore))
744744 then {
745745 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
746746 if ((inv == inv))
747747 then {
748748 let balAfter = accountBalance(WXID)
749749 $Tuple2((balAfter - balBefore), WXID)
750750 }
751751 else throw("Strict value is not equal to itself.")
752752 }
753753 else throw("Strict value is not equal to itself.")
754754 }
755755 else unknownPoolType()
756756
757757
758758 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId,stakeMarket) = {
759759 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
760760 if ((lpBalanceBefore == lpBalanceBefore))
761761 then {
762762 let poolAddr = addressFromStringValue(pool)
763763 let $t02225922681 = if (if ((pmtA > 0))
764764 then (pmtB > 0)
765765 else false)
766766 then {
767767 let $t02232522447 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
768768 let pmtInA = $t02232522447._1
769769 let pmtInB = $t02232522447._2
770770 let change = $t02232522447._3
771771 let changeId = $t02232522447._4
772772 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
773773 if ((inv == inv))
774774 then $Tuple2(change, changeId)
775775 else throw("Strict value is not equal to itself.")
776776 }
777777 else if ((pmtA > 0))
778778 then $Tuple2(pmtA, aId)
779779 else if ((pmtB > 0))
780780 then $Tuple2(pmtB, bId)
781781 else throw("pmts must be > 0")
782782 let change = $t02225922681._1
783783 let changeId = $t02225922681._2
784784 let inv = if ((change > 0))
785785 then replenishOneTokenByType(poolAddr, pType, change, changeId)
786786 else nil
787787 if ((inv == inv))
788788 then {
789789 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
790790 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
791791 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
792792 let userShareForStake = (totalStaked - axlyFeeAmount)
793793 if ((0 >= userShareForStake))
794794 then throw("amount of staked sharetokens must be > 0")
795795 else {
796796 let invLP = stakeLP(pool, pType, LPId, userShareForStake, stakeMarket)
797797 if ((invLP == invLP))
798798 then $Tuple2(userShareForStake, axlyFeeAmount)
799799 else throw("Strict value is not equal to itself.")
800800 }
801801 }
802802 else throw("Strict value is not equal to itself.")
803803 }
804804 else throw("Strict value is not equal to itself.")
805805 }
806806
807807
808808 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan,stakeToMarket) = {
809809 let totalAmount = getPoolTotalShare(pool)
810810 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
811811 let totalAmountMarket = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
812812 let totalAmountMarketLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
813- let poolInterestNoLoan = valueOrElse(getIntegerValue(this, (pool + kPoolInterestNoLoan)), 0)
814- let poolInterestLoan = valueOrElse(getIntegerValue(this, (pool + kPoolInterestLoan)), 0)
815- let poolInterestMarketNoLoan = valueOrElse(getIntegerValue(this, (pool + kPoolInterestMarketNoLoan)), 0)
816- let poolInterestMarketLoan = valueOrElse(getIntegerValue(this, (pool + kPoolInterestMarketLoan)), 0)
817- let $t02415624981 = if (withLoan)
813+ let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
814+ let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
815+ let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
816+ let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
817+ let $t02413624961 = if (withLoan)
818818 then if (stakeToMarket)
819819 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
820820 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
821821 else if (stakeToMarket)
822822 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
823823 else $Tuple2(poolInterestNoLoan, nil)
824- let curPoolInterest = $t02415624981._1
825- let adEntry = $t02415624981._2
824+ let curPoolInterest = $t02413624961._1
825+ let adEntry = $t02413624961._2
826826 ([IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPosition), stakedAmount), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInterest), curPoolInterest), StringEntry((((user + "_") + toString(posNum)) + kUserPositionPool), pool), IntegerEntry((user + kUserPositionNum), posNum), ScriptTransfer(moneyBox, axlyFeeAmount, fromBase58String(shareId))] ++ adEntry)
827827 }
828828
829829
830830 func listToInt (a,item) = (a :+ parseIntValue(item))
831831
832832
833833 func directSwopfiCPMM (rArgs,tokenTo) = {
834834 let dApp = addressFromStringValue(rArgs[1])
835835 let pmtP = split(rArgs[2], "|")
836836 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
837837 if ((tokenBalanceBefore == tokenBalanceBefore))
838838 then {
839839 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
840840 let minToRecive = rArgs[3]
841841 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
842842 if ((inv == inv))
843843 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
844844 else throw("Strict value is not equal to itself.")
845845 }
846846 else throw("Strict value is not equal to itself.")
847847 }
848848
849849
850850 func directRoutingSwopfi (rArgs,tokenTo) = {
851851 let dApp = addressFromStringValue(rArgs[1])
852852 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
853853 if ((tokenBalanceBefore == tokenBalanceBefore))
854854 then {
855855 let pmt = {
856856 let pmtP = split(rArgs[2], "|")
857857 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
858858 }
859859 let args = {
860860 let eArgs = split(rArgs[3], "|")
861861 let exchangers = split(eArgs[0], ",")
862862 let exchangersType = split(eArgs[1], ",")
863863 let args1 = {
864864 let $l = split(eArgs[2], ",")
865865 let $s = size($l)
866866 let $acc0 = nil
867867 func $f0_1 ($a,$i) = if (($i >= $s))
868868 then $a
869869 else listToInt($a, $l[$i])
870870
871871 func $f0_2 ($a,$i) = if (($i >= $s))
872872 then $a
873873 else throw("List size exceeds 3")
874874
875875 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
876876 }
877877 let args2 = {
878878 let $l = split(eArgs[3], ",")
879879 let $s = size($l)
880880 let $acc0 = nil
881881 func $f1_1 ($a,$i) = if (($i >= $s))
882882 then $a
883883 else listToInt($a, $l[$i])
884884
885885 func $f1_2 ($a,$i) = if (($i >= $s))
886886 then $a
887887 else throw("List size exceeds 3")
888888
889889 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
890890 }
891891 let routingAssetsKeys = split(eArgs[4], ",")
892892 let minToRecive = parseIntValue(eArgs[5])
893893 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
894894 }
895895 let inv = invoke(dApp, "routingTrade", args, pmt)
896896 if ((inv == inv))
897897 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
898898 else throw("Strict value is not equal to itself.")
899899 }
900900 else throw("Strict value is not equal to itself.")
901901 }
902902
903903
904904 func capitalize (pool,pType,tokenId,tokenAmount) = {
905905 let poolAddr = Address(fromBase58String(pool))
906- let $t02703427100 = getPoolData(poolAddr, pType)
907- let AId = $t02703427100._1
908- let BId = $t02703427100._2
909- let balA = $t02703427100._3
910- let balB = $t02703427100._4
911- let shareId = $t02703427100._5
906+ let $t02701427080 = getPoolData(poolAddr, pType)
907+ let AId = $t02701427080._1
908+ let BId = $t02701427080._2
909+ let balA = $t02701427080._3
910+ let balB = $t02701427080._4
911+ let shareId = $t02701427080._5
912912 if (if ((tokenId != AId))
913913 then (tokenId != BId)
914914 else false)
915915 then throw("Wrong asset")
916916 else {
917917 let totalShareAmount = getPoolTotalShare(pool)
918918 if ((totalShareAmount == 0))
919919 then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
920920 else {
921921 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
922922 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
923923 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
924924 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
925925 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
926926 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
927927 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
928- let $t02784527945 = if ((tokenId == AId))
928+ let $t02782527925 = if ((tokenId == AId))
929929 then $Tuple2((tokenAmount - axlyFee), 0)
930930 else $Tuple2(0, (tokenAmount - axlyFee))
931- let pmtA = $t02784527945._1
932- let pmtB = $t02784527945._2
933- let $t02794828059 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
934- let stakedAmount = $t02794828059._1
935- let nf = $t02794828059._2
931+ let pmtA = $t02782527925._1
932+ let pmtB = $t02782527925._2
933+ let $t02792828039 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
934+ let stakedAmount = $t02792828039._1
935+ let nf = $t02792828039._2
936936 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
937937 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
938938 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
939939 let stakedNoLoan = (stakedAmount - stakedLoan)
940940 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
941941 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
942942 else 0
943943 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
944944 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
945945 else 0
946946 ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
947947 }
948948 }
949949 }
950950
951951
952952 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
953953 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
954954 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
955955 let poolInterest = if (borrowed)
956956 then getIntegerValue(this, (pool + kPoolInterestLoan))
957957 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
958958 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
959959 }
960960
961961
962962 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
963963 let feeType = if (isBorrowed)
964964 then STOPLOSS_LOAN
965965 else STOPLOSS_FEE_NO_LOAN
966966 if (stopLoss)
967967 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
968968 else 0
969969 }
970970
971971
972972 func withdrawToUser (user,pool,posId,stopLoss) = {
973973 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
974974 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
975975 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
976976 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
977977 let poolTotalShare = getPoolTotalShare(pool)
978978 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
979979 let userAddr = Address(fromBase58String(user))
980980 let poolAddr = Address(fromBase58String(pool))
981981 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
982- let $t03070030772 = getPoolData(poolAddr, pType)
983- let idAStr = $t03070030772._1
984- let idBStr = $t03070030772._2
985- let balA = $t03070030772._3
986- let balB = $t03070030772._4
987- let shareId = $t03070030772._5
988- let $t03077530842 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
989- let idA = $t03077530842._1
990- let idB = $t03077530842._2
982+ let $t03068030752 = getPoolData(poolAddr, pType)
983+ let idAStr = $t03068030752._1
984+ let idBStr = $t03068030752._2
985+ let balA = $t03068030752._3
986+ let balB = $t03068030752._4
987+ let shareId = $t03068030752._5
988+ let $t03075530822 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
989+ let idA = $t03075530822._1
990+ let idB = $t03075530822._2
991991 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
992992 let cBalABefore = accountBalance(idA)
993993 if ((cBalABefore == cBalABefore))
994994 then {
995995 let cBalBBefore = accountBalance(idB)
996996 if ((cBalBBefore == cBalBBefore))
997997 then {
998998 let inv = if ((pType == SF_POOL))
999999 then {
10001000 let inv = unstakeLP(pool, pType, shareId, stopLossFee, fromMarket)
10011001 if ((inv == inv))
10021002 then invoke(poolAddr, "callFunction", ["withdraw", [toString((userCanWithdraw - stopLossFee))]], nil)
10031003 else throw("Strict value is not equal to itself.")
10041004 }
10051005 else if ((pType == WX_POOL))
10061006 then {
10071007 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee), fromMarket)
10081008 if ((inv == inv))
10091009 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
10101010 else throw("Strict value is not equal to itself.")
10111011 }
10121012 else unknownPoolType()
10131013 if ((inv == inv))
10141014 then {
10151015 let cBalAAfter = accountBalance(idA)
10161016 if ((cBalAAfter == cBalAAfter))
10171017 then {
10181018 let cBalBAfter = accountBalance(idB)
10191019 if ((cBalBAfter == cBalBAfter))
10201020 then {
1021- let $t03157731666 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1022- let tokensAmountA = $t03157731666._1
1023- let tokensAmountB = $t03157731666._2
1024- let $t03166932905 = if (isBorrowed)
1021+ let $t03155731646 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1022+ let tokensAmountA = $t03155731646._1
1023+ let tokensAmountB = $t03155731646._2
1024+ let $t03164932885 = if (isBorrowed)
10251025 then {
10261026 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
10271027 let debt = {
10281028 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
10291029 if ($isInstanceOf(@, "Int"))
10301030 then @
10311031 else throw(($getType(@) + " couldn't be cast to Int"))
10321032 }
10331033 if ((debt == debt))
10341034 then {
10351035 let amountToGetEx = if (if ((borrowAsset == idAStr))
10361036 then (debt > tokensAmountA)
10371037 else false)
10381038 then (debt - tokensAmountA)
10391039 else if (if ((borrowAsset == idBStr))
10401040 then (debt > tokensAmountB)
10411041 else false)
10421042 then (debt - tokensAmountB)
10431043 else 0
10441044 let exInv = if ((amountToGetEx > 0))
10451045 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
10461046 else nil
10471047 if ((exInv == exInv))
10481048 then {
10491049 let cBalAAfterRepay = accountBalance(idA)
10501050 if ((cBalAAfterRepay == cBalAAfterRepay))
10511051 then {
10521052 let cBalBAfterRepay = accountBalance(idB)
10531053 if ((cBalBAfterRepay == cBalBAfterRepay))
10541054 then {
10551055 let closeDbtInv = if ((debt > 0))
10561056 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
10571057 else 0
10581058 if ((closeDbtInv == closeDbtInv))
10591059 then if ((borrowAsset == idAStr))
10601060 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
10611061 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
10621062 else throw("Strict value is not equal to itself.")
10631063 }
10641064 else throw("Strict value is not equal to itself.")
10651065 }
10661066 else throw("Strict value is not equal to itself.")
10671067 }
10681068 else throw("Strict value is not equal to itself.")
10691069 }
10701070 else throw("Strict value is not equal to itself.")
10711071 }
10721072 else $Tuple2(tokensAmountA, tokensAmountB)
1073- let toUserA = $t03166932905._1
1074- let toUserB = $t03166932905._2
1073+ let toUserA = $t03164932885._1
1074+ let toUserB = $t03164932885._2
10751075 let poolTotalLoanEntries = if (isBorrowed)
10761076 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
10771077 else nil
10781078 let entries = (([DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition)), DeleteEntry((((user + "_") + posId) + kUserPositionPool)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), IntegerEntry((pool + kPoolTotal), (poolTotalShare - userCanWithdraw)), ScriptTransfer(userAddr, toUserA, idA), ScriptTransfer(userAddr, toUserB, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
10791079 $Tuple2(entries, [toUserA, toUserB])
10801080 }
10811081 else throw("Strict value is not equal to itself.")
10821082 }
10831083 else throw("Strict value is not equal to itself.")
10841084 }
10851085 else throw("Strict value is not equal to itself.")
10861086 }
10871087 else throw("Strict value is not equal to itself.")
10881088 }
10891089 else throw("Strict value is not equal to itself.")
10901090 }
10911091
10921092
10931093 func parseRequest (requestId) = {
10941094 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
10951095 let user = request[0]
10961096 let pool = request[1]
10971097 let pmtA = parseIntValue(request[2])
10981098 let AId = request[3]
10991099 let pmtB = parseIntValue(request[4])
11001100 let BId = request[5]
11011101 let balA = parseIntValue(request[6])
11021102 let balB = parseIntValue(request[7])
11031103 let shareId = request[8]
11041104 let bwAsset = request[9]
11051105 let bwAmount = parseIntValue(request[10])
11061106 let stakeToMarket = (request[11] == "true")
11071107 $Tuple12(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount, stakeToMarket)
11081108 }
11091109
11101110
11111111 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
11121112 then (borrowId != bId)
11131113 else false)
11141114 then throw("Wrong borrow asset")
11151115 else {
11161116 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
11171117 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
11181118 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
11191119 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
11201120 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1121- let $t03499335090 = if ((borrowId == aId))
1121+ let $t03497335070 = if ((borrowId == aId))
11221122 then $Tuple2(dPriceA, decPrA)
11231123 else $Tuple2(dPriceB, decPrB)
1124- let borrowPrice = $t03499335090._1
1125- let borrowDecPr = $t03499335090._2
1124+ let borrowPrice = $t03497335070._1
1125+ let borrowDecPr = $t03497335070._2
11261126 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
11271127 }
11281128
11291129
11301130 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
11311131 then if ((assetIdToStr(pmts[0].assetId) != AId))
11321132 then throw("Wrong payment asset A")
11331133 else if ((assetIdToStr(pmts[1].assetId) != BId))
11341134 then throw("Wrong payment asset B")
11351135 else $Tuple2(pmts[0].amount, pmts[1].amount)
11361136 else if ((size(pmts) == 1))
11371137 then if ((assetIdToStr(pmts[0].assetId) == AId))
11381138 then $Tuple2(pmts[0].amount, 0)
11391139 else if ((assetIdToStr(pmts[0].assetId) == BId))
11401140 then $Tuple2(0, pmts[0].amount)
11411141 else throw("Wrong payment")
11421142 else throw("One or two payments expected")
11431143
11441144
11451145 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
11461146 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
11471147 if ((0 > pri))
11481148 then (pri * -1)
11491149 else pri
11501150 }
11511151
11521152
11531153 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1154- let $t03609036352 = if (claim)
1154+ let $t03607036332 = if (claim)
11551155 then claimFarmed(pType, pool)
11561156 else {
11571157 let claimedAsset = if ((pType == SF_POOL))
11581158 then SWOPID
11591159 else if ((pType == WX_POOL))
11601160 then WXID
11611161 else unknownPoolType()
11621162 $Tuple2(amount, claimedAsset)
11631163 }
1164- if (($t03609036352 == $t03609036352))
1164+ if (($t03607036332 == $t03607036332))
11651165 then {
1166- let claimAsset = $t03609036352._2
1167- let claimAmount = $t03609036352._1
1166+ let claimAsset = $t03607036332._2
1167+ let claimAmount = $t03607036332._1
11681168 let bal = accountBalance(claimAsset)
11691169 if ((bal == bal))
11701170 then if ((amount > bal))
11711171 then throw("To big amount to exchange")
11721172 else $Tuple2(claimAmount, claimAsset)
11731173 else throw("Strict value is not equal to itself.")
11741174 }
11751175 else throw("Strict value is not equal to itself.")
11761176 }
11771177
11781178
11791179 @Callable(i)
11801180 func getPoolInfoREADONLY (pool) = {
11811181 let poolAddr = addressFromStringValue(pool)
11821182 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1183- let $t03671936809 = getPoolData(Address(fromBase58String(pool)), pType)
1184- let AId = $t03671936809._1
1185- let BId = $t03671936809._2
1186- let balA = $t03671936809._3
1187- let balB = $t03671936809._4
1188- let shareId = $t03671936809._5
1183+ let $t03669936789 = getPoolData(Address(fromBase58String(pool)), pType)
1184+ let AId = $t03669936789._1
1185+ let BId = $t03669936789._2
1186+ let balA = $t03669936789._3
1187+ let balB = $t03669936789._4
1188+ let shareId = $t03669936789._5
11891189 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11901190 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11911191 }
11921192
11931193
11941194
11951195 @Callable(i)
11961196 func getShareAssetPriceREADONLY (shareId) = {
11971197 let sharePrices = getSharePrice(shareId)
11981198 $Tuple2(nil, sharePrices)
11991199 }
12001200
12011201
12021202
12031203 @Callable(i)
12041204 func getUserPositionShareAmountREADONLY (user,posNum) = {
12051205 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
12061206 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
12071207 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
12081208 $Tuple2(nil, userCanWithdraw)
12091209 }
12101210
12111211
12121212
12131213 @Callable(i)
12141214 func getUserPositionREADONLY (user,pools,posNum) = {
12151215 func userPos (a,pool) = {
1216- let $t03768237752 = a
1217- let wAmountsA = $t03768237752._1
1218- let wAmountsB = $t03768237752._2
1219- let debts = $t03768237752._3
1220- let eqWAmountsA = $t03768237752._4
1221- let eqWAmountsB = $t03768237752._5
1222- let index = $t03768237752._6
1216+ let $t03766237732 = a
1217+ let wAmountsA = $t03766237732._1
1218+ let wAmountsB = $t03766237732._2
1219+ let debts = $t03766237732._3
1220+ let eqWAmountsA = $t03766237732._4
1221+ let eqWAmountsB = $t03766237732._5
1222+ let index = $t03766237732._6
12231223 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
12241224 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
12251225 else {
12261226 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1227- let $t03803138121 = getPoolData(Address(fromBase58String(pool)), pType)
1228- let AId = $t03803138121._1
1229- let BId = $t03803138121._2
1230- let balA = $t03803138121._3
1231- let balB = $t03803138121._4
1232- let shareId = $t03803138121._5
1227+ let $t03801138101 = getPoolData(Address(fromBase58String(pool)), pType)
1228+ let AId = $t03801138101._1
1229+ let BId = $t03801138101._2
1230+ let balA = $t03801138101._3
1231+ let balB = $t03801138101._4
1232+ let shareId = $t03801138101._5
12331233 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
12341234 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1235- let $t03833738457 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1236- let wAmountA = $t03833738457._1
1237- let wAmountB = $t03833738457._2
1235+ let $t03831738437 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1236+ let wAmountA = $t03831738437._1
1237+ let wAmountB = $t03831738437._2
12381238 if ((borrowAmount > 0))
12391239 then {
12401240 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12411241 let debt = {
12421242 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
12431243 if ($isInstanceOf(@, "Int"))
12441244 then @
12451245 else throw(($getType(@) + " couldn't be cast to Int"))
12461246 }
12471247 if ((debt == debt))
12481248 then {
12491249 let amountToGetEx = if (if ((borrowAsset == AId))
12501250 then (debt > wAmountA)
12511251 else false)
12521252 then (debt - wAmountA)
12531253 else if (if ((borrowAsset == BId))
12541254 then (debt > wAmountB)
12551255 else false)
12561256 then (debt - wAmountB)
12571257 else 0
12581258 let amountToPay = if ((amountToGetEx > 0))
12591259 then if ((pType == SF_POOL))
12601260 then {
12611261 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12621262 ex._2
12631263 }
12641264 else if ((pType == WX_POOL))
12651265 then {
12661266 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12671267 ex._2
12681268 }
12691269 else unknownPoolType()
12701270 else 0
1271- let $t03936939588 = if ((borrowAsset == AId))
1271+ let $t03934939568 = if ((borrowAsset == AId))
12721272 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12731273 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1274- let eqWAmountA = $t03936939588._1
1275- let eqWAmountB = $t03936939588._2
1274+ let eqWAmountA = $t03934939568._1
1275+ let eqWAmountB = $t03934939568._2
12761276 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12771277 }
12781278 else throw("Strict value is not equal to itself.")
12791279 }
12801280 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
12811281 }
12821282 }
12831283
1284- let $t03984339954 = {
1284+ let $t03982339934 = {
12851285 let $l = pools
12861286 let $s = size($l)
12871287 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12881288 func $f0_1 ($a,$i) = if (($i >= $s))
12891289 then $a
12901290 else userPos($a, $l[$i])
12911291
12921292 func $f0_2 ($a,$i) = if (($i >= $s))
12931293 then $a
12941294 else throw("List size exceeds 20")
12951295
12961296 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
12971297 }
1298- let wAmountsA = $t03984339954._1
1299- let wAmountsB = $t03984339954._2
1300- let debts = $t03984339954._3
1301- let eqWAmountsA = $t03984339954._4
1302- let eqWAmountsB = $t03984339954._5
1298+ let wAmountsA = $t03982339934._1
1299+ let wAmountsB = $t03982339934._2
1300+ let debts = $t03982339934._3
1301+ let eqWAmountsA = $t03982339934._4
1302+ let eqWAmountsB = $t03982339934._5
13031303 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
13041304 }
13051305
13061306
13071307
13081308 @Callable(i)
13091309 func replenish (pool,leverage,borrowId,stakeToMarket) = valueOrElse(isActiveForUsers(), {
13101310 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
13111311 if (!(isPoolActive(pool, pType)))
13121312 then throw("Pool not active at this moment")
13131313 else if (if ((100 > leverage))
13141314 then true
13151315 else (leverage > 300))
13161316 then throw("Leverage can't be <100 and >300")
13171317 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
13181318 then (leverage > 100)
13191319 else false)
13201320 then throw("You can't borrow in this pool")
13211321 else if (if (stakeToMarket)
13221322 then !(valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false))
13231323 else false)
13241324 then throw("This pool can't stake to puzzle market")
13251325 else {
1326- let $t04071340803 = getPoolData(Address(fromBase58String(pool)), pType)
1327- let AId = $t04071340803._1
1328- let BId = $t04071340803._2
1329- let balA = $t04071340803._3
1330- let balB = $t04071340803._4
1331- let shareId = $t04071340803._5
1326+ let $t04069340783 = getPoolData(Address(fromBase58String(pool)), pType)
1327+ let AId = $t04069340783._1
1328+ let BId = $t04069340783._2
1329+ let balA = $t04069340783._3
1330+ let balB = $t04069340783._4
1331+ let shareId = $t04069340783._5
13321332 if (if ((borrowId != AId))
13331333 then (borrowId != BId)
13341334 else false)
13351335 then throw("Wrong borrow asset")
13361336 else {
1337- let $t04088440943 = parseReplenishPmts(i.payments, AId, BId)
1338- let pmtA = $t04088440943._1
1339- let pmtB = $t04088440943._2
1337+ let $t04086440923 = parseReplenishPmts(i.payments, AId, BId)
1338+ let pmtA = $t04086440923._1
1339+ let pmtB = $t04086440923._2
13401340 let user = toString(i.caller)
13411341 let newPosNum = getNewUserPositionNumber(user)
13421342 if ((leverage > 100))
13431343 then {
13441344 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
13451345 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount), toString(stakeToMarket)], ",")
13461346 let newRequestId = {
13471347 let @ = invoke(this, "createNewRequest", [request], nil)
13481348 if ($isInstanceOf(@, "Int"))
13491349 then @
13501350 else throw(($getType(@) + " couldn't be cast to Int"))
13511351 }
13521352 if ((newRequestId == newRequestId))
13531353 then {
13541354 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
13551355 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
13561356 if ((inv == inv))
13571357 then {
13581358 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1359- let $t04196642060 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1360- if (($t04196642060 == $t04196642060))
1359+ let $t04194642040 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1360+ if (($t04194642040 == $t04194642040))
13611361 then {
1362- let newBalB = $t04196642060._2
1363- let newBalA = $t04196642060._1
1362+ let newBalB = $t04194642040._2
1363+ let newBalA = $t04194642040._1
13641364 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1365- let $t04213042245 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1366- let wAmountA = $t04213042245._1
1367- let wAmountB = $t04213042245._2
1365+ let $t04211042225 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1366+ let wAmountA = $t04211042225._1
1367+ let wAmountB = $t04211042225._2
13681368 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13691369 }
13701370 else throw("Strict value is not equal to itself.")
13711371 }
13721372 else throw("Strict value is not equal to itself.")
13731373 }
13741374 else throw("Strict value is not equal to itself.")
13751375 }
13761376 else {
1377- let $t04229842428 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1378- if (($t04229842428 == $t04229842428))
1377+ let $t04227842408 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1378+ if (($t04227842408 == $t04227842408))
13791379 then {
1380- let axlyFee = $t04229842428._2
1381- let userStaked = $t04229842428._1
1382- let $t04243442528 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1383- if (($t04243442528 == $t04243442528))
1380+ let axlyFee = $t04227842408._2
1381+ let userStaked = $t04227842408._1
1382+ let $t04241442508 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1383+ if (($t04241442508 == $t04241442508))
13841384 then {
1385- let newBalB = $t04243442528._2
1386- let newBalA = $t04243442528._1
1385+ let newBalB = $t04241442508._2
1386+ let newBalA = $t04241442508._1
13871387 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1388- let $t04259842713 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1389- let wAmountA = $t04259842713._1
1390- let wAmountB = $t04259842713._2
1388+ let $t04257842693 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1389+ let wAmountA = $t04257842693._1
1390+ let wAmountB = $t04257842693._2
13911391 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13921392 }
13931393 else throw("Strict value is not equal to itself.")
13941394 }
13951395 else throw("Strict value is not equal to itself.")
13961396 }
13971397 }
13981398 }
13991399 })
14001400
14011401
14021402
14031403 @Callable(i)
14041404 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
14051405 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
14061406 if (!(isPoolActive(pool, pType)))
14071407 then throw("Pool not active at this moment")
14081408 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
14091409 })
14101410
14111411
14121412
14131413 @Callable(i)
14141414 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
14151415 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14161416 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
14171417 if (!(isPoolActive(poolId, pType)))
14181418 then throw("Pool not active at this moment")
14191419 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
14201420 then throw("There are no user position")
14211421 else if ((0 >= price))
14221422 then throw("Price must be greater than 0")
14231423 else if ((price > tokenOraclePrice))
14241424 then throw("Price must be less than current token price")
14251425 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
14261426 })
14271427
14281428
14291429
14301430 @Callable(i)
14311431 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
14321432 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
14331433 if (!(isPoolActive(poolId, pType)))
14341434 then throw("Pool not active at this moment")
14351435 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
14361436 then throw("No entry")
14371437 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
14381438 })
14391439
14401440
14411441
14421442 @Callable(i)
14431443 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
14441444 then throw("Already inited")
14451445 else if (!(isDefined(addressFromString(moneyBoxAddr))))
14461446 then throw("moneyBoxAddr is not correct address")
14471447 else if (!(isDefined(addressFromString(sfFarmingAddr))))
14481448 then throw("sfFarmingAddr is not correct address")
14491449 else if (!(isDefined(addressFromString(lendAddr))))
14501450 then throw("lendAddr is not correct address")
14511451 else if (!(isDefined(addressFromString(priceOracleAddr))))
14521452 then throw("priceOracleAddr is not correct address")
14531453 else if (!(isDefined(addressFromString(keeperExContract))))
14541454 then throw("keeperExContract is not correct address")
14551455 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
14561456 then throw("swopAssetId is not correct asset id")
14571457 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
14581458 then throw("swopAssetId is not correct asset id")
14591459 else if ((size(fromBase58String(operatorPubKey)) != 32))
14601460 then throw("operatorPubKey is not correct")
14611461 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
14621462 then throw("group1Admin1PubKey is not correct")
14631463 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
14641464 then throw("group1Admin2PubKey is not correct")
14651465 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
14661466 then throw("group2Admin1PubKey is not correct")
14671467 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
14681468 then throw("group2Admin2PubKey is not correct")
14691469 else [StringEntry(kMoneyBox, moneyBoxAddr), StringEntry(kSFFarmingAddr, sfFarmingAddr), StringEntry(kLendService, lendAddr), StringEntry(kPriceOracle, priceOracleAddr), StringEntry(kExContract, keeperExContract), StringEntry(kWxSwapContract, wxSwapContract), StringEntry(kSwopId, swopAssetId), StringEntry(kWxId, wxAssetId), StringEntry(kOperatorCallPK, operatorPubKey), StringEntry(kGroup1Admin1PK, group1Admin1PubKey), StringEntry(kGroup1Admin2PK, group1Admin2PubKey), StringEntry(kGroup2Admin1PK, group2Admin1PubKey), StringEntry(kGroup2Admin2PK, group2Admin2PubKey)])
14701470
14711471
14721472
14731473 @Callable(i)
14741474 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
14751475 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
14761476 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
14771477 })
14781478
14791479
14801480
14811481 @Callable(i)
14821482 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1483- let $t04756747686 = parseRequest(requestId)
1484- let user = $t04756747686._1
1485- let pool = $t04756747686._2
1486- let pmtA = $t04756747686._3
1487- let AId = $t04756747686._4
1488- let pmtB = $t04756747686._5
1489- let BId = $t04756747686._6
1490- let balA = $t04756747686._7
1491- let balB = $t04756747686._8
1492- let shareId = $t04756747686._9
1493- let bwAsset = $t04756747686._10
1494- let bwAmount = $t04756747686._11
1495- let stakeToMarket = $t04756747686._12
1483+ let $t04754747666 = parseRequest(requestId)
1484+ let user = $t04754747666._1
1485+ let pool = $t04754747666._2
1486+ let pmtA = $t04754747666._3
1487+ let AId = $t04754747666._4
1488+ let pmtB = $t04754747666._5
1489+ let BId = $t04754747666._6
1490+ let balA = $t04754747666._7
1491+ let balB = $t04754747666._8
1492+ let shareId = $t04754747666._9
1493+ let bwAsset = $t04754747666._10
1494+ let bwAmount = $t04754747666._11
1495+ let stakeToMarket = $t04754747666._12
14961496 if ((size(i.payments) != 1))
14971497 then throw("Wrong payment size")
14981498 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14991499 then true
15001500 else (i.payments[0].amount != bwAmount))
15011501 then throw("Wrong payment")
15021502 else {
1503- let $t04787647976 = if ((AId == bwAsset))
1503+ let $t04785647956 = if ((AId == bwAsset))
15041504 then $Tuple2((pmtA + bwAmount), pmtB)
15051505 else $Tuple2(pmtA, (pmtB + bwAmount))
1506- let pmtAllA = $t04787647976._1
1507- let pmtAllB = $t04787647976._2
1506+ let pmtAllA = $t04785647956._1
1507+ let pmtAllB = $t04785647956._2
15081508 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1509- let $t04805848188 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1510- let userStaked = $t04805848188._1
1511- let axlyFee = $t04805848188._2
1509+ let $t04803848168 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1510+ let userStaked = $t04803848168._1
1511+ let axlyFee = $t04803848168._2
15121512 let posNum = getNewUserPositionNumber(user)
15131513 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
15141514 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1515- let $t04856348678 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1516- let wAmountA = $t04856348678._1
1517- let wAmountB = $t04856348678._2
1515+ let $t04854348658 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1516+ let wAmountA = $t04854348658._1
1517+ let wAmountB = $t04854348658._2
15181518 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
15191519 }
15201520 }))
15211521
15221522
15231523
15241524 @Callable(i)
15251525 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
15261526 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
15271527 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
15281528 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1529- let $t04931149401 = getPoolData(Address(fromBase58String(pool)), pType)
1530- let AId = $t04931149401._1
1531- let BId = $t04931149401._2
1532- let balA = $t04931149401._3
1533- let balB = $t04931149401._4
1534- let shareId = $t04931149401._5
1529+ let $t04929149381 = getPoolData(Address(fromBase58String(pool)), pType)
1530+ let AId = $t04929149381._1
1531+ let BId = $t04929149381._2
1532+ let balA = $t04929149381._3
1533+ let balB = $t04929149381._4
1534+ let shareId = $t04929149381._5
15351535 let amount = unstakeLP(pool, pType, shareId, liquidateAmount, fromMarket)
15361536 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
15371537 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15381538 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
15391539 if ((liquidateAmount > userCanWithdraw))
15401540 then throw("You can't liquidate more than user have")
15411541 else if ((borrowAmount == 0))
15421542 then throw("You can't liquidate position without borrow")
15431543 else [IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest), getIntegerValue(this, (pool + kPoolInterestLoan))), IntegerEntry((pool + kPoolTotalLoan), (getPoolTotalShareWithLoan(pool) - liquidateAmount)), IntegerEntry((pool + kPoolTotal), (getPoolTotalShare(pool) - liquidateAmount)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition), (userCanWithdraw - liquidateAmount)), ScriptTransfer(i.caller, amount, fromBase58String(shareId))]
15441544 }))
15451545
15461546
15471547
15481548 @Callable(i)
15491549 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15501550 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
15511551 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
15521552 if ((tokenOraclePrice > stopLossPrice))
15531553 then throw("Token price greater stop loss price")
15541554 else {
15551555 let res = withdrawToUser(user, pool, toString(posId), true)
15561556 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
15571557 }
15581558 }))
15591559
15601560
15611561
15621562 @Callable(i)
15631563 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15641564 let pType = getStringValue(this, (kPool + pool))
15651565 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1566- let $t05138351485 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1567- if (($t05138351485 == $t05138351485))
1566+ let $t05136351465 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1567+ if (($t05136351465 == $t05136351465))
15681568 then {
1569- let claimedAsset = $t05138351485._2
1570- let claimedAmount = $t05138351485._1
1569+ let claimedAsset = $t05136351465._2
1570+ let claimedAmount = $t05136351465._1
15711571 let rArgs = split(route, "__")
15721572 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15731573 then directSwopfiCPMM(rArgs, tokenToId)
15741574 else if ((rArgs[0] == "routingSwopfi"))
15751575 then directRoutingSwopfi(rArgs, tokenToId)
15761576 else throw("Wrong route")
15771577 if ((exchangedAmount == exchangedAmount))
15781578 then {
15791579 let newChange = ((claimedAmount + change) - amountToExchange)
15801580 let changeEntry = if ((newChange >= 0))
15811581 then [IntegerEntry((pool + kPoolCapChange), newChange)]
15821582 else nil
15831583 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
15841584 }
15851585 else throw("Strict value is not equal to itself.")
15861586 }
15871587 else throw("Strict value is not equal to itself.")
15881588 }))
15891589
15901590
15911591
15921592 @Callable(i)
15931593 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15941594 let pType = getStringValue(this, (kPool + pool))
1595- let $t05216952267 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1596- if (($t05216952267 == $t05216952267))
1595+ let $t05214952247 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1596+ if (($t05214952247 == $t05214952247))
15971597 then {
1598- let claimedAsset = $t05216952267._2
1599- let claimedAmount = $t05216952267._1
1598+ let claimedAsset = $t05214952247._2
1599+ let claimedAmount = $t05214952247._1
16001600 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
16011601 }
16021602 else throw("Strict value is not equal to itself.")
16031603 }))
16041604
16051605
16061606
16071607 @Callable(i)
16081608 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow,canPMarket) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
16091609 then (type != WX_POOL)
16101610 else false)
16111611 then throw("Wrong type")
16121612 else if (if ((poolType != CPMM))
16131613 then (poolType != FLAT)
16141614 else false)
16151615 then throw("Wrong pool type")
16161616 else {
1617- let $t05284352937 = getPoolData(Address(fromBase58String(poolAddr)), type)
1618- let aId = $t05284352937._1
1619- let bId = $t05284352937._2
1620- let aBal = $t05284352937._3
1621- let bBal = $t05284352937._4
1622- let shareId = $t05284352937._5
1617+ let $t05282352917 = getPoolData(Address(fromBase58String(poolAddr)), type)
1618+ let aId = $t05282352917._1
1619+ let bId = $t05282352917._2
1620+ let aBal = $t05282352917._3
1621+ let bBal = $t05282352917._4
1622+ let shareId = $t05282352917._5
16231623 if ((0 > inFeeNoLoan))
16241624 then throw("inFeeNoLoan must be greater than 0")
16251625 else if ((0 > inFeeLoan))
16261626 then throw("inFeeLoan must be greater than 0")
16271627 else if ((0 > capFeeNoLoan))
16281628 then throw("capFeeNoLoan must be greater than 0")
16291629 else if ((0 > capFeeWithLoan))
16301630 then throw("capFeeWithLoan must be greater than 0")
16311631 else if ((0 > stoplossFeeNoLoan))
16321632 then throw("stoplossFeeNoLoan must be greater than 0")
16331633 else if ((0 > stoplossFeeWithLoan))
16341634 then throw("stoplossFeeWithLoan must be greater than 0")
16351635 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((poolAddr + kPoolType), poolType), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow), BooleanEntry((poolAddr + kPoolPMArket), canPMarket)]
16361636 }))
16371637
16381638
16391639
16401640 @Callable(i)
16411641 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
16421642 then throw(("Can't find pool with addr " + poolAddr))
16431643 else if ((0 > inFeeNoLoan))
16441644 then throw("inFeeNoLoan must be greater than 0")
16451645 else if ((0 > inFeeLoan))
16461646 then throw("inFeeLoan must be greater than 0")
16471647 else if ((0 > capFeeNoLoan))
16481648 then throw("capFeeNoLoan must be greater than 0")
16491649 else if ((0 > capFeeWithLoan))
16501650 then throw("capFeeWithLoan must be greater than 0")
16511651 else if ((0 > stoplossFeeNoLoan))
16521652 then throw("stoplossFeeNoLoan must be greater than 0")
16531653 else if ((0 > stoplossFeeWithLoan))
16541654 then throw("stoplossFeeWithLoan must be greater than 0")
16551655 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan)]))
16561656
16571657
16581658
16591659 @Callable(i)
16601660 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
16611661 then throw("dApp already active")
16621662 else [BooleanEntry(kActive, true)])
16631663
16641664
16651665
16661666 @Callable(i)
16671667 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
16681668 then throw("dApp already shutdown")
16691669 else [BooleanEntry(kActive, false)])
16701670
16711671
16721672
16731673 @Callable(i)
16741674 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
16751675 then throw("dApp already active for users")
16761676 else [BooleanEntry(kActiveUsers, true)])
16771677
16781678
16791679
16801680 @Callable(i)
16811681 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
16821682 then throw("dApp already shutdown for users")
16831683 else [BooleanEntry(kActiveUsers, false)])
16841684
16851685
16861686
16871687 @Callable(i)
16881688 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
16891689 then throw("SWOPFI already active")
16901690 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
16911691
16921692
16931693
16941694 @Callable(i)
16951695 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
16961696 then throw("SWOPFI already shutdown")
16971697 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
16981698
16991699
17001700
17011701 @Callable(i)
17021702 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
17031703 then throw("WX already active")
17041704 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
17051705
17061706
17071707
17081708 @Callable(i)
17091709 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
17101710 then throw("WX already shutdown")
17111711 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
17121712
17131713
17141714
17151715 @Callable(i)
17161716 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
17171717 then throw("Unknown pool")
17181718 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
17191719 then throw("Pool already active")
17201720 else [BooleanEntry((pool + kPoolActive), true)])
17211721
17221722
17231723
17241724 @Callable(i)
17251725 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
17261726 then throw("Unknown pool")
17271727 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
17281728 then throw("Pool already shutdown")
17291729 else [BooleanEntry((pool + kPoolActive), false)])
17301730
17311731
17321732 @Verifier(tx)
17331733 func verify () = match tx {
17341734 case inv: InvokeScriptTransaction =>
17351735 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
17361736 let isRightFee = if ((inv.fee == 900000))
17371737 then (inv.feeAssetId == unit)
17381738 else false
17391739 let isInitCall = (inv.function == "init")
17401740 let isnoPayments = (size(inv.payments) == 0)
17411741 if (if (if (isRightFee)
17421742 then isInitCall
17431743 else false)
17441744 then isSelf
17451745 else false)
17461746 then isnoPayments
17471747 else false
17481748 case _ =>
17491749 let group1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
17501750 then 1
17511751 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin2PK))
17521752 then 1
17531753 else 0))
17541754 let group2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin1PK))
17551755 then 1
17561756 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin2PK))
17571757 then 1
17581758 else 0))
17591759 ((group1Signed + group2Signed) == 2)
17601760 }
17611761

github/deemru/w8io/3ef1775 
264.20 ms