tx · CQXSiJxsT71sBjmexKYiVDmBidTvRF4C1VwETrjPigYE

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.06600000 Waves

2023.12.08 16:35 [3943631] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "CQXSiJxsT71sBjmexKYiVDmBidTvRF4C1VwETrjPigYE", "fee": 6600000, "feeAssetId": null, "timestamp": 1702042419593, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "", "Ji1cThkyLpNgTcJs2sBE3NZ3ufX8mmxyjpDi8HGV7Grah5NtR8wuskiPtCRfLvnEwXDQhWHF75r5WYZEkaL6p82", "vMePdPn41UcVeDFS7phCEcABJWvjcAxdoo6Nr3w7aYGV5eaTZ6fwzWhAws5SeZpTfJKNPYpsyrpV5LS9fberLtS" ], "script": "base64:BgKrAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBgoECAEIBBIECgIIARIFCgMIAQgSBgoEAQgIARIFCgMBCAgSDwoNCAgICAgICAgICAgICBIDCgEIEgMKAQgSBQoDCAgBEgYKBAgBCAgSBwoFCAgIAQQSBQoDCAQBEg0KCwgICAEBAQEBAQQEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCJYBAARDT05GCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgZjb25maWcAB1NGX1BPT0wCAlNGAAdXWF9QT09MAgJXWAAEQ1BNTQIEY3BtbQAERkxBVAIEZmxhdAAPQ0FQX0ZFRV9OT19MT0FOAgljYXBOb0xvYW4ADENBUF9GRUVfTE9BTgIHY2FwTG9hbgAUU1RPUExPU1NfRkVFX05PX0xPQU4CDnN0b3BMb3NzTm9Mb2FuAA1TVE9QTE9TU19MT0FOAgxzdG9wTG9zc0xvYW4ACExPQU5fRkVFAgRsb2FuAAtOT19MT0FOX0ZFRQIGbm9Mb2FuAAZOT19GRUUCBW5vRmVlAAZTQ0FMRTgAgMLXLwAHU0NBTEUxMACAyK+gJQAHU0NBTEUxNgkAtgIBAICAhP6m3uERAApGRUVfU0NBTEU2AMCEPQAUa1NGUG9vbEFBc3NldEJhbGFuY2UCD0FfYXNzZXRfYmFsYW5jZQAUa1NGUG9vbEJBc3NldEJhbGFuY2UCD0JfYXNzZXRfYmFsYW5jZQAPa1NGUG9vbEFBc3NldElkAgpBX2Fzc2V0X2lkAA9rU0ZQb29sQkFzc2V0SWQCCkJfYXNzZXRfaWQADmtTRlBvb2xTaGFyZUlkAg5zaGFyZV9hc3NldF9pZAASa1NGUG9vbFNoYXJlU3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkACmtTRlBvb2xGZWUCCmNvbW1pc3Npb24ADWtVc2VyUG9zaXRpb24CDV91c2VyUG9zaXRpb24AEWtVc2VyUG9zaXRpb25Qb29sAhFfdXNlclBvc2l0aW9uUG9vbAARa1VzZXJCb3Jyb3dBbW91bnQCGV91c2VyUG9zaXRpb25Cb3Jyb3dBbW91bnQAEmtVc2VyQm9ycm93QXNzZXRJZAIaX3VzZXJQb3NpdGlvbkJvcnJvd0Fzc2V0SWQAEGtVc2VyUG9zaXRpb25OdW0CE191c2VyUG9zaXRpb25OdW1iZXIAFWtVc2VyUG9zaXRpb25JbnRlcmVzdAIVX3VzZXJQb3NpdGlvbkludGVyZXN0ABZrVXNlclBvc2l0aW9uSW5QTWFya2V0AhRfdXNlclBvc2l0aW9uUE1hcmtldAAKa1Bvb2xUb3RhbAIKX3Bvb2xUb3RhbAAOa1Bvb2xUb3RhbExvYW4CDl9wb29sVG90YWxMb2FuABBrUG9vbFRvdGFsTWFya2V0AhBfcG9vbFRvdGFsTWFya2V0ABRrUG9vbFRvdGFsTWFya2V0TG9hbgIUX3Bvb2xUb3RhbE1hcmtldExvYW4AEWtQb29sSW50ZXJlc3RMb2FuAhFfcG9vbEludGVyZXN0TG9hbgATa1Bvb2xJbnRlcmVzdE5vTG9hbgITX3Bvb2xJbnRlcmVzdE5vTG9hbgAXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4CF19wb29sSW50ZXJlc3RNYXJrZXRMb2FuABlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAhlfcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAA5rUG9vbENhbkJvcnJvdwIOX3Bvb2xDYW5Cb3Jyb3cADGtQb29sUE1BcmtldAIRX3Bvb2xQdXp6bGVNYXJrZXQAFWtBeGx5SW5GZWVXaXRob3V0TG9hbgIOX2F4bHlGZWVOb0xvYW4AEmtBeGx5SW5GZWVXaXRoTG9hbgIQX2F4bHlGZWVXaXRoTG9hbgARa0F4bHlOb0xvYW5DYXBGZWUCEV9heGx5RmVlQ2FwTm9Mb2FuABNrQXhseVdpdGhMb2FuQ2FwRmVlAhNfYXhseUZlZUNhcFdpdGhMb2FuABZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlAhhfYXhseUZlZVN0b3Bsb3NzV2l0aExvYW4AFGtBeGx5U3RvcExvc3NMb2FuRmVlAhZfYXhseUZlZVN0b3Bsb3NzTm9Mb2FuAAprUmVxdWVzdElkAgtfcmVxdWVzdF9pZAAMa1JlcXVlc3RJdGVyAg1yZXF1ZXN0c19pdGVyAAVrUG9vbAIFcG9vbF8ACWtQb29sVHlwZQIJX3Bvb2xUeXBlAAprU2hhcmVQb29sAgxfcG9vbFNoYXJlSWQADmtQb29sQ2FwQ2hhbmdlAg5fcG9vbENhcENoYW5nZQAPa1Rva2VuTGFzdFByaWNlAgpsYXN0X3ByaWNlAA5rUHJpY2VJbk9yYWNsZQIHX3R3YXA1QgAHa0FjdGl2ZQIGYWN0aXZlAAxrQWN0aXZlVXNlcnMCC2FjdGl2ZVVzZXJzAAtrQWN0aXZlU0ZXWAIHX2FjdGl2ZQALa1Bvb2xBY3RpdmUCC19hY3RpdmVQb29sAA1rVXNlclN0b3BMb3NzAglfc3RvcExvc3MAF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAhdfZmFsbGJhY2tFeGNoYW5nZVN3b3BmaQAJa01vbmV5Qm94Ag5heGx5X21vbmV5X2JveAAOa1NGRmFybWluZ0FkZHICE3N3b3BmaV9mYXJtaW5nX2FkZHIADGtMZW5kU2VydmljZQIRbGVuZF9zZXJ2aWNlX2FkZHIAD2tPcGVyYXRvckNhbGxQSwISYWRtaW5fY2FsbF9wdWJfa2V5AAxrUHJpY2VPcmFjbGUCDHByaWNlX29yYWNsZQALa0V4Q29udHJhY3QCEWV4Y2hhbmdlX2NvbnRyYWN0AA9rV3hTd2FwQ29udHJhY3QCEHd4X3N3YXBfY29udHJhY3QAB2tXeFJlc3QCDHd4X3Jlc3RfYWRkcgAHa1N3b3BJZAIHc3dvcF9pZAAFa1d4SWQCBXd4X2lkAAxrUE1hcmtldEFkZHICFXB1enpsZV9tYXJrZXRfYWRkcmVzcwAQa1BNYXJrZXRSZXN0QWRkcgIacHV6emxlX21hcmtldF9yZXN0X2FkZHJlc3MAD2tHcm91cDFBZG1pbjFQSwIVZ3JvdXAxX2FkbWluMV9wdWJfa2V5AA9rR3JvdXAxQWRtaW4yUEsCFWdyb3VwMV9hZG1pbjJfcHViX2tleQAPa0dyb3VwMUFkbWluM1BLAhVncm91cDFfYWRtaW4zX3B1Yl9rZXkAD2tHcm91cDJBZG1pbjFQSwIVZ3JvdXAyX2FkbWluMV9wdWJfa2V5AA9rR3JvdXAyQWRtaW4yUEsCFWdyb3VwMl9hZG1pbjJfcHViX2tleQAIbW9uZXlCb3gJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQlrTW9uZXlCb3gCGE5vIGF4bHkgbW9uZXlCb3ggYWRkcmVzcwAKZXhDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFC2tFeENvbnRyYWN0AhxObyBleGNoYW5nZSBjb250cmFjdCBhZGRyZXNzAA9wcmljZU9yYWNsZUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQxrUHJpY2VPcmFjbGUCF05vIHByaWNlIG9yYWNsZSBhZGRyZXNzAA53eFN3YXBDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tXeFN3YXBDb250cmFjdAISTm8gd3ggc3dhcCBhZGRyZXNzAAZ3eFJlc3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQdrV3hSZXN0AhJObyB3eCByZXN0IGFkZHJlc3MABlNXT1BJRAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUHa1N3b3BJZAIKTm8gc3dvcCBpZAAEV1hJRAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUFa1d4SWQCCE5vIHd4IGlkAAtwTWFya2V0QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFDGtQTWFya2V0QWRkcgIYTm8gcHV6emxlIG1hcmtldCBhZGRyZXNzAA9wTWFya2V0UmVzdEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBRBrUE1hcmtldFJlc3RBZGRyAh1ObyBwdXp6bGUgbWFya2V0IHJlc3QgYWRkcmVzcwAOZ3JvdXAxQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tHcm91cDFBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjFQSwAOZ3JvdXAxQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tHcm91cDFBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjJQSwAOZ3JvdXAxQWRtaW4zUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tHcm91cDFBZG1pbjNQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjNQSwAOZ3JvdXAyQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAOZ3JvdXAyQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAKb3BlcmF0b3JQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa09wZXJhdG9yQ2FsbFBLAhRDYW4ndCBnZXQgb3BlcmF0b3JQSwEPdW5rbm93blBvb2xUeXBlAAkAAgECD1dyb25nIHBvb2wgdHlwZQEOZ2V0TGVuZFNydkFkZHIACQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa0xlbmRTZXJ2aWNlAhtDYW4ndCBnZXQgbGVuZCBzZXJ2aWNlIGFkZHIBDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBAWkDAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4xUEsGCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjJQSwUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIJAQ5nZXRMZW5kU3J2QWRkcgAFBHVuaXQJAAIBAilPbmx5IGxhbmQgY29udHJhY3QgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEIaXNBY3RpdmUAAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYGBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEQaXNBY3RpdmVGb3JVc2VycwADAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgYHBQR1bml0CQACAQIpREFwcCBpcyBpbmFjdGl2ZSBmb3IgdXNlcnMgYXQgdGhpcyBtb21lbnQBDGlzUG9vbEFjdGl2ZQIEcG9vbAR0eXBlBApXWFNGQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEdHlwZQULa0FjdGl2ZVNGV1gGBApwb29sQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGAwMFCldYU0ZBY3RpdmUFCnBvb2xBY3RpdmUHBgcBDmFjY291bnRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHRoaXMFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yARFnZXRTRlBvb2xCYWxhbmNlcwEIcG9vbEFkZHIJAJQKAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQUFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBiYWxhbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xCQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGJhbGFuY2UBEWdldFdYUG9vbEJhbGFuY2VzAwhwb29sQWRkcgNhSWQDYklkCQCUCgIKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2FJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNiSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAEPZ2V0UG9vbEJhbGFuY2VzBAhwb29sQWRkcgR0eXBlA2FJZANiSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgUEdHlwZQUHV1hfUE9PTAkBEWdldFdYUG9vbEJhbGFuY2VzAwUIcG9vbEFkZHIFA2FJZAUDYklkCQEPdW5rbm93blBvb2xUeXBlAAENZ2V0U0ZQb29sRGF0YQEIcG9vbEFkZHIECyR0MDk1OTA5NjM5CQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQskdDA5NTkwOTYzOQULJHQwOTU5MDk2MzkEBGJhbEIIBQskdDA5NTkwOTYzOQJfMgQEYmFsQQgFCyR0MDk1OTA5NjM5Al8xCQCXCgUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEFBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xCQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAUEYmFsQQUEYmFsQgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ5rU0ZQb29sU2hhcmVJZAIYQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IGlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1nZXRXWFBvb2xEYXRhAQhwb29sQWRkcgQDY2ZnCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2NmZwUDY2ZnBANhSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAQDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkBANiSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAUDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBAdzaGFyZUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwADAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIaQ2FuJ3QgZ2V0IHBvb2wgTFAgYXNzZXQgaWQEDSR0MDEwMzM2MTAzOTUJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAMJAAACBQ0kdDAxMDMzNjEwMzk1BQ0kdDAxMDMzNjEwMzk1BARiYWxCCAUNJHQwMTAzMzYxMDM5NQJfMgQEYmFsQQgFDSR0MDEwMzM2MTAzOTUCXzEJAJcKBQUDYUlkBQNiSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC2dldFBvb2xEYXRhAghwb29sQWRkcgR0eXBlAwkAAAIFBHR5cGUFB1NGX1BPT0wJAQ1nZXRTRlBvb2xEYXRhAQUIcG9vbEFkZHIDCQAAAgUEdHlwZQUHV1hfUE9PTAkBDWdldFdYUG9vbERhdGEBBQhwb29sQWRkcgkBD3Vua25vd25Qb29sVHlwZQABDmdldFNoYXJlU3VwcGx5Awhwb29sQWRkcgR0eXBlB3NoYXJlSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRJrU0ZQb29sU2hhcmVTdXBwbHkCHENhbid0IGdldCBzaGFyZSBhc3NldCBzdXBwbHkDCQAAAgUEdHlwZQUHV1hfUE9PTAgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFB3NoYXJlSWQCDVdyb25nIFNoYXJlSWQIcXVhbnRpdHkJAQ91bmtub3duUG9vbFR5cGUAARFnZXRQb29sVG90YWxTaGFyZQEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFCmtQb29sVG90YWwAAAEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuAAABGGdldE5ld1VzZXJQb3NpdGlvbk51bWJlcgEEdXNlcgkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBRBrVXNlclBvc2l0aW9uTnVtAAAAAQEKZ2V0QXhseUZlZQIEcG9vbAdmZWVUeXBlAwkAAAIFB2ZlZVR5cGUFDENBUF9GRUVfTE9BTgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRNrQXhseVdpdGhMb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFD0NBUF9GRUVfTk9fTE9BTgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrQXhseU5vTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQhMT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRJrQXhseUluRmVlV2l0aExvYW4DCQAAAgUHZmVlVHlwZQULTk9fTE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAwkAAAIFB2ZlZVR5cGUFBk5PX0ZFRQAACQACAQIOV3JvbmcgZmVlIHR5cGUBEGdldFNGRmFybWluZ0FkZHIACQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFDmtTRkZhcm1pbmdBZGRyAh1DYW4ndCBnZXQgc3dvcGZpIGZhcm1pbmcgYWRkcgEQZ2V0V1hGYXJtaW5nQWRkcgEIcG9vbEFkZHIECWZDb250cmFjdAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgITJXNfX2ZhY3RvcnlDb250cmFjdAIiQ2FuJ3QgZ2V0IFdYIGZhY3RvcnkgY29udHJhY3QgYWRkcgQKZmFjdHJveUNmZwkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUJZkNvbnRyYWN0AhElc19fZmFjdG9yeUNvbmZpZwIYQ2FuJ3QgZ2V0IFdYIGZhY3RvcnkgY2ZnAgJfXwkBB0FkZHJlc3MBCQDZBAEJAJEDAgUKZmFjdHJveUNmZwABAQxhc3NldElkVG9TdHIBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJANgEAQUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQIMTm90IEFzc2V0IGlkAQ5hc3NldElkRnJvbVN0cgEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARBnZXRBc3NldERlY2ltYWxzAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTAAgEByRtYXRjaDAJAOwHAQkA2QQBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CGRlY2ltYWxzCQACAQIQQ2FuJ3QgZmluZCBhc3NldAERZ2V0QXNzZXRQcmVjaXRpb24BB2Fzc2V0SWQJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQdhc3NldElkAAAAAAUERE9XTgEOZ2V0QXNzZXRzUHJpY2UBCGFzc2V0SWRzCgEJZ2V0UHJpY2VzAgFhB2Fzc2V0SWQECmFzc2V0UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlAP///////////wEJAM0IAgUBYQUKYXNzZXRQcmljZQoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZ2V0UHJpY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIBDWdldFNoYXJlUHJpY2UBB3NoYXJlSWQEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wCIENhbid0IGZpbmQgcG9vbCBhZGRyIGJ5IHNoYXJlIGlkBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAxMzM4NDEzNDQ5CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA2FJZAgFDSR0MDEzMzg0MTM0NDkCXzEEA2JJZAgFDSR0MDEzMzg0MTM0NDkCXzIECGFCYWxhbmNlCAUNJHQwMTMzODQxMzQ0OQJfMwQIYkJhbGFuY2UIBQ0kdDAxMzM4NDEzNDQ5Al80BAZwcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBAdkUHJpY2VBCQCRAwIFBnByaWNlcwAABAdkUHJpY2VCCQCRAwIFBnByaWNlcwABAwMJAGYCAAAFB2RQcmljZUEGCQBmAgAABQdkUHJpY2VCAP///////////wEEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQECkFQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBApCUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQOc2hhcmVQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQdzaGFyZUlkAAAAAAUERE9XTgQDc3VtCQBkAgkAawMFCGFCYWxhbmNlBQdkUHJpY2VBBQpBUHJlY2lzaW9uCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24JAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQEOZ2V0U2hhcmVQcmljZXMBCHNoYXJlSWRzCgEJZ2V0UHJpY2VzAgFhB3NoYXJlSWQJAM0IAgUBYQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCgACJGwFCHNoYXJlSWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEOZ2V0Q3Vyc0VudHJpZXMEA2FJZANiSWQHc2hhcmVJZAh3QW1vdW50cwQMYXNzZXRzUHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQKc2hhcmVQcmljZQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkBAZwcmljZXMJAM4IAgkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAAJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwABCQDMCAIJAKQDAQUKc2hhcmVQcmljZQUDbmlsBQh3QW1vdW50cwkAzAgCCQELU3RyaW5nRW50cnkCBQ9rVG9rZW5MYXN0UHJpY2UJALkJAgUGcHJpY2VzAgEsBQNuaWwBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFcFR5cGUIcG9vbEFkZHIETFBJZARwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEBHJlcGwKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIgY2FsY0xQUmVwbGVuaXNoVHdvVG9rZW5zUkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFBHBtdEEJAMwIAgkApAMBBQRwbXRCBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQRyZXBsBQRyZXBsCQCXCgUKAAFACQCRAwIFBHJlcGwAAwMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwABAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQxhc3NldElkVG9TdHIBCQCRAwIFBHJlcGwAAgoAAUAJAJEDAgUEcmVwbAAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTUwMDcxNTI3MwkAlAoCCQC1CQIKAAFACQD8BwQFBnd4UmVzdAIkcG9vbEV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwkAtQkCCgABQAkA/AcEBQZ3eFJlc3QCI3Bvb2xFdmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxNTAwNzE1MjczBQ0kdDAxNTAwNzE1MjczBApldmFsUHV0SW5CCAUNJHQwMTUwMDcxNTI3MwJfMgQKZXZhbFB1dEluQQgFDSR0MDE1MDA3MTUyNzMCXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUGCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYUlkBQRwbXRBCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNiSWQFBHBtdEIFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMJAMwIAgkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAUIcG9vbEFkZHICA3B1dAkAzAgCAMCEPQkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBAhwb29sQWRkcgVwVHlwZQNwbXQFcG10SWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQVwbXRJZAUDcG10BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhVyZXBsZW5pc2hXaXRoT25lVG9rZW4JAMwIAgkAzAgCAgEwCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZmMDCQAAAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFCWtQb29sVHlwZQIEY3BtbQUERkxBVAILcHV0T25lVGtuVjICCXB1dE9uZVRrbgkA/AcEBQhwb29sQWRkcgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAUEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudA1zdGFrZVRvTWFya2V0BAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQdzaGFyZUlkBQZhbW91bnQFA25pbAMFDXN0YWtlVG9NYXJrZXQJAPwHBAULcE1hcmtldEFkZHICBnN1cHBseQUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACD2xvY2tTaGFyZVRva2VucwkAzAgCBQRwb29sCQDMCAIAAAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcECQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wCBXN0YWtlBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEJdW5zdGFrZUxQBQRwb29sBXBUeXBlB3NoYXJlSWQGYW1vdW50CmZyb21NYXJrZXQEDSR0MDE3MTcyMTc2MzMDBQpmcm9tTWFya2V0CQCVCgMFC3BNYXJrZXRBZGRyAgh3aXRoZHJhdwkAzAgCBQdzaGFyZUlkCQDMCAIFBmFtb3VudAUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQCVCgMJARBnZXRTRkZhcm1pbmdBZGRyAAITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCBQRwb29sCQDMCAIFBmFtb3VudAUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MCQCVCgMJARBnZXRXWEZhcm1pbmdBZGRyAQkBB0FkZHJlc3MBCQDZBAEFBHBvb2wCB3Vuc3Rha2UJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAkBD3Vua25vd25Qb29sVHlwZQAECGZhcm1BZGRyCAUNJHQwMTcxNzIxNzYzMwJfMQQFZk5hbWUIBQ0kdDAxNzE3MjE3NjMzAl8yBAZwYXJhbXMIBQ0kdDAxNzE3MjE3NjMzAl8zBANpbnYJAPwHBAUIZmFybUFkZHIFBWZOYW1lBQZwYXJhbXMFA25pbAMJAAACBQNpbnYFA2ludgUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFjYWxjQW1vdW50VG9QYXlTRgcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQJZmVlU2NhbGU2AMCEPQQDZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQhwb29sQWRkcgUKa1NGUG9vbEZlZQQMYW1udEdldE5vRmVlCQBuBAUQYW1vdW50VG9rZW5Ub0dldAUJZmVlU2NhbGU2CQBlAgUJZmVlU2NhbGU2BQNmZWUFB0NFSUxJTkcEDSR0MDE4MDU1MTgzNjEDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEIJAGUCBQRiYWxBBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAbgQFDGFtbnRHZXROb0ZlZQUEYmFsQQkAZQIFBGJhbEIFDGFtbnRHZXROb0ZlZQUHQ0VJTElORwkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTgwNTUxODM2MQJfMQQKYXNzZXRUb1BheQgFDSR0MDE4MDU1MTgzNjECXzIJAJQKAgUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkBDWdldFdYU3dhcEZlZXMBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAlmQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgITJXNfX2ZhY3RvcnlDb250cmFjdAIiQ2FuJ3QgZ2V0IFdYIGZhY3RvcnkgY29udHJhY3QgYWRkcgQOcG9vbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCCyVzX19wb29sRmVlBBJwcm90b2NvbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCDyVzX19wcm90b2NvbEZlZQQHJG1hdGNoMAkA/AcEBQlmQ29udHJhY3QCEmdldFN3YXBGZWVSRUFET05MWQkAzAgCCQClCAEFCHBvb2xBZGRyBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBARmZWVzBQckbWF0Y2gwCQCUCgIIBQRmZWVzAl8xCAUEZmVlcwJfMgkAlAoCBQ5wb29sRmVlRGVmYXVsdAUScHJvdG9jb2xGZWVEZWZhdWx0ARFjYWxjQW1vdW50VG9QYXlXWAcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEDSR0MDE5MTAxMTkxNDAJAQ1nZXRXWFN3YXBGZWVzAQUEcG9vbAQEcEZlZQgFDSR0MDE5MTAxMTkxNDACXzEEBXByRmVlCAUNJHQwMTkxMDExOTE0MAJfMgQIZmVlU2NhbGUJALYCAQCAwtcvBA0kdDAxOTE4MDE5NDg4AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQgkAZQIFBGJhbEEFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEEJAGUCBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQQQLYW1vdW50VG9QYXkIBQ0kdDAxOTE4MDE5NDg4Al8xBAphc3NldFRvUGF5CAUNJHQwMTkxODAxOTQ4OAJfMgQSYW1vdW50VG9QYXlXaXRoRmVlCQCgAwEJAL0CBAkAtgIBBQthbW91bnRUb1BheQUIZmVlU2NhbGUJALgCAgUIZmVlU2NhbGUJALYCAQkAZAIFBXByRmVlBQRwRmVlBQdDRUlMSU5HCQCUCgIFCmFzc2V0VG9QYXkFEmFtb3VudFRvUGF5V2l0aEZlZQEQZXhjaGFuZ2VEaXJlY3RseQgFcFR5cGUEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgADAwkAAAIFBXBUeXBlBQdTRl9QT09MBgkBAiE9AgUGcG9vbEZCAgAEDSR0MDE5OTI5MjAxNDEDCQAAAgUGcG9vbEZCAgAJAJUKAwUEYmFsQQUEYmFsQgUEcG9vbAQNJHQwMjAwMzUyMDEwOAkBEWdldFNGUG9vbEJhbGFuY2VzAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUGcG9vbEZCBAZzZkJhbEEIBQ0kdDAyMDAzNTIwMTA4Al8xBAZzZkJhbEIIBQ0kdDAyMDAzNTIwMTA4Al8yCQCVCgMFBnNmQmFsQQUGc2ZCYWxCBQZwb29sRkIEBXBCYWxBCAUNJHQwMTk5MjkyMDE0MQJfMQQFcEJhbEIIBQ0kdDAxOTkyOTIwMTQxAl8yBAZleFBvb2wIBQ0kdDAxOTkyOTIwMTQxAl8zBA0kdDAyMDE0NjIwMjcyCQERY2FsY0Ftb3VudFRvUGF5U0YHBQZleFBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUFcEJhbEEFBXBCYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAyMDE0NjIwMjcyAl8xBAthbW91bnRUb1BheQgFDSR0MDIwMTQ2MjAyNzICXzIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtb3VudFRva2VuVG9HZXQFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAyMDQ3NDIwNTk2CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDIwNDc0MjA1OTYCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMjA0NzQyMDU5NgJfMgkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCBRBhbW91bnRUb2tlblRvR2V0CQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAkBD3Vua25vd25Qb29sVHlwZQABFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFcFR5cGUEcG9vbA1hbW91bnRUb2tlbkV4DmFzc2V0VG9rZW5Ub0V4D2Fzc2V0VG9rZW5Ub0dldAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQ9hc3NldFRva2VuVG9HZXQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEBnBvb2xGQgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFF2tGYWxsYmFja0V4Y2hhbmdlU3dvcGZpAgAEA2ludgMDCQAAAgUFcFR5cGUFB1NGX1BPT0wGCQECIT0CBQZwb29sRkICAAQGZXhQb29sAwkAAAIFBnBvb2xGQgIABQRwb29sBQZwb29sRkIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUGZXhQb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCAgExBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUOYXNzZXRUb2tlblRvRXgFDWFtb3VudFRva2VuRXgFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcEBQ53eFN3YXBDb250cmFjdAIEc3dhcAkAzAgCAAEJAMwIAgUPYXNzZXRUb2tlblRvR2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQ5hc3NldFRva2VuVG9FeAUNYW1vdW50VG9rZW5FeAUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFD2Fzc2V0VG9rZW5Ub0dldAMJAAACBQhiYWxBZnRlcgUIYmFsQWZ0ZXIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDIxNzI1MjIxOTYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUGd3hSZXN0Ahdwb29sRXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAyMTcyNTIyMTk2Al8xBAdhbW91bnRCCAUNJHQwMjE3MjUyMjE5NgJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDIyNTY0MjI2NDMJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjI1NjQyMjY0MwJfMQQDYklkCAUNJHQwMjI1NjQyMjY0MwJfMgQEYUJhbAgFDSR0MDIyNTY0MjI2NDMCXzMEBGJCYWwIBQ0kdDAyMjU2NDIyNjQzAl80BARscElkCAUNJHQwMjI1NjQyMjY0MwJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgdjbGFpbVd4CQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABD3JlcGxlbmlzaEJ5VHlwZQsFcFR5cGUEcG9vbAdmZWVUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgRMUElkC3N0YWtlTWFya2V0BA9scEJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAMJAAACBQ9scEJhbGFuY2VCZWZvcmUFD2xwQmFsYW5jZUJlZm9yZQQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEDSR0MDIzMjY4MjM2OTADAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDIzMzM0MjM0NTYJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMJBQVwVHlwZQUIcG9vbEFkZHIFBExQSWQFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAyMzMzNDIzNDU2Al8xBAZwbXRJbkIIBQ0kdDAyMzMzNDIzNDU2Al8yBAZjaGFuZ2UIBQ0kdDAyMzMzNDIzNDU2Al8zBAhjaGFuZ2VJZAgFDSR0MDIzMzM0MjM0NTYCXzQEA2ludgkBGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYFCHBvb2xBZGRyBQVwVHlwZQUGcG10SW5BBQNhSWQFBnBtdEluQgUDYklkAwkAAAIFA2ludgUDaW52CQCUCgIFBmNoYW5nZQUIY2hhbmdlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcG10QQAACQCUCgIFBHBtdEEFA2FJZAMJAGYCBQRwbXRCAAAJAJQKAgUEcG10QgUDYklkCQACAQIQcG10cyBtdXN0IGJlID4gMAQGY2hhbmdlCAUNJHQwMjMyNjgyMzY5MAJfMQQIY2hhbmdlSWQIBQ0kdDAyMzI2ODIzNjkwAl8yBANpbnYDCQBmAgUGY2hhbmdlAAAJARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQFCHBvb2xBZGRyBQVwVHlwZQUGY2hhbmdlBQhjaGFuZ2VJZAUDbmlsAwkAAAIFA2ludgUDaW52BA5scEJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkBAt0b3RhbFN0YWtlZAkAZQIFDmxwQmFsYW5jZUFmdGVyBQ9scEJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBAVpbnZMUAkBB3N0YWtlTFAFBQRwb29sBQVwVHlwZQUETFBJZAURdXNlclNoYXJlRm9yU3Rha2UFC3N0YWtlTWFya2V0AwkAAAIFBWludkxQBQVpbnZMUAkAlAoCBRF1c2VyU2hhcmVGb3JTdGFrZQUNYXhseUZlZUFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQcmVwbGVuaXNoRW50cmllcwkEcG9vbAR1c2VyDHN0YWtlZEFtb3VudA1heGx5RmVlQW1vdW50BnBvc051bQdzaGFyZUlkBHR5cGUId2l0aExvYW4Nc3Rha2VUb01hcmtldAQLdG90YWxBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3RvdGFsQW1vdW50TG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBBF0b3RhbEFtb3VudE1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQVdG90YWxBbW91bnRNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4AAAQScG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABBBwb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAQNJHQwMjUxNDUyNTk3MAMFCHdpdGhMb2FuAwUNc3Rha2VUb01hcmtldAkAlAoCBRZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQJAGQCBRF0b3RhbEFtb3VudE1hcmtldAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuCQBkAgUVdG90YWxBbW91bnRNYXJrZXRMb2FuBQxzdGFrZWRBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAYFA25pbAkAlAoCBRBwb29sSW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUPdG90YWxBbW91bnRMb2FuBQxzdGFrZWRBbW91bnQFA25pbAMFDXN0YWtlVG9NYXJrZXQJAJQKAgUYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQJAGQCBRF0b3RhbEFtb3VudE1hcmtldAUMc3Rha2VkQW1vdW50CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFmtVc2VyUG9zaXRpb25JblBNYXJrZXQGBQNuaWwJAJQKAgUScG9vbEludGVyZXN0Tm9Mb2FuBQNuaWwED2N1clBvb2xJbnRlcmVzdAgFDSR0MDI1MTQ1MjU5NzACXzEEB2FkRW50cnkIBQ0kdDAyNTE0NTI1OTcwAl8yCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFC3RvdGFsQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUNa1VzZXJQb3NpdGlvbgUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFWtVc2VyUG9zaXRpb25JbnRlcmVzdAUPY3VyUG9vbEludGVyZXN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAUEcG9vbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRBrVXNlclBvc2l0aW9uTnVtBQZwb3NOdW0JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlGZWVBbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsBQdhZEVudHJ5AQlsaXN0VG9JbnQCAWEEaXRlbQkAzQgCBQFhCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0BEGRpcmVjdFN3b3BmaUNQTU0CBXJBcmdzB3Rva2VuVG8EBGRBcHAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUFckFyZ3MAAQQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDcG10CQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBCQCRAwIFBHBtdFAAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBHBtdFAAAQUDbmlsBAttaW5Ub1JlY2l2ZQkAkQMCBQVyQXJncwADBANpbnYJAPwHBAUEZEFwcAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgULbWluVG9SZWNpdmUFA25pbAUDbmlsBQNwbXQDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2RpcmVjdFJvdXRpbmdTd29wZmkCBXJBcmdzB3Rva2VuVG8EBGRBcHAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUFckFyZ3MAAQQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQEBHBtdFAJALUJAgkAkQMCBQVyQXJncwACAgF8CQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEBGFyZ3MEBWVBcmdzCQC1CQIJAJEDAgUFckFyZ3MAAwIBfAQKZXhjaGFuZ2VycwkAtQkCCQCRAwIFBWVBcmdzAAACASwEDmV4Y2hhbmdlcnNUeXBlCQC1CQIJAJEDAgUFZUFyZ3MAAQIBLAQFYXJnczEKAAIkbAkAtQkCCQCRAwIFBWVBcmdzAAICASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWxpc3RUb0ludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwQFYXJnczIKAAIkbAkAtQkCCQCRAwIFBWVBcmdzAAMCASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWxpc3RUb0ludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwQRcm91dGluZ0Fzc2V0c0tleXMJALUJAgkAkQMCBQVlQXJncwAEAgEsBAttaW5Ub1JlY2l2ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWVBcmdzAAUJAMwIAgUKZXhjaGFuZ2VycwkAzAgCBQ5leGNoYW5nZXJzVHlwZQkAzAgCBQVhcmdzMQkAzAgCBQVhcmdzMgkAzAgCBRFyb3V0aW5nQXNzZXRzS2V5cwkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBANpbnYJAPwHBAUEZEFwcAIMcm91dGluZ1RyYWRlBQRhcmdzBQNwbXQDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCmNhcGl0YWxpemUJBHBvb2wFcFR5cGUHdG9rZW5JZAt0b2tlbkFtb3VudANBSWQDQklkBGJhbEEEYmFsQgdzaGFyZUlkAwMJAQIhPQIFB3Rva2VuSWQFA0FJZAkBAiE9AgUHdG9rZW5JZAUDQklkBwkAAgECC1dyb25nIGFzc2V0BBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sAwkAAAIFEHRvdGFsU2hhcmVBbW91bnQAAAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQt0b2tlbkFtb3VudAkA2QQBBQd0b2tlbklkBQNuaWwAAAQYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsTWFya2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABAtsb2FuUGVyY2VudAkAawMFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUGU0NBTEU4CQBlAgUQdG90YWxTaGFyZUFtb3VudAURdG90YWxNYXJrZXRBbW91bnQEEHRva2Vuc0ZvckZlZUxvYW4JAGsDBQt0b2tlbkFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQSdG9rZW5zRm9yRmVlTm9Mb2FuCQBlAgULdG9rZW5BbW91bnQFEHRva2Vuc0ZvckZlZUxvYW4EC2F4bHlGZWVMb2FuCQBrAwUQdG9rZW5zRm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlGZWVOb0xvYW4JAGsDBRJ0b2tlbnNGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BAdheGx5RmVlCQBkAgULYXhseUZlZUxvYW4FDWF4bHlGZWVOb0xvYW4EDSR0MDI4ODg3Mjg5ODcDCQAAAgUHdG9rZW5JZAUDQUlkCQCUCgIJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQAACQCUCgIAAAkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlBARwbXRBCAUNJHQwMjg4ODcyODk4NwJfMQQEcG10QggFDSR0MDI4ODg3Mjg5ODcCXzIEDSR0MDI4OTkwMjkxMDEJAQ9yZXBsZW5pc2hCeVR5cGULBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAcEDHN0YWtlZEFtb3VudAgFDSR0MDI4OTkwMjkxMDECXzEEAm5mCAUNJHQwMjg5OTAyOTEwMQJfMgQTY3VyUG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQKc3Rha2VkTG9hbgkAawMFDHN0YWtlZEFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQMc3Rha2VkTm9Mb2FuCQBlAgUMc3Rha2VkQW1vdW50BQpzdGFrZWRMb2FuBA9uZXdJbnRlcmVzdExvYW4DCQBmAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRNjdXJQb29sSW50ZXJlc3RMb2FuCQBrAwUKc3Rha2VkTG9hbgUHU0NBTEUxMAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAEEW5ld0ludGVyZXN0Tm9Mb2FuAwkAZgIJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkAawMFDHN0YWtlZE5vTG9hbgUHU0NBTEUxMAkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4FD25ld0ludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuBRFuZXdJbnRlcmVzdE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZAIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUKc3Rha2VkTG9hbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUHYXhseUZlZQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5JZAUDbmlsBQxzdGFrZWRBbW91bnQBFmNhcGl0YWxpemVQdXp6bGVNYXJrZXQDBHBvb2wFcFR5cGUHc2hhcmVJZAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQNbWFya2V0QmFsYW5jZQkA8AcCBQtwTWFya2V0QWRkcgkA2QQBBQdzaGFyZUlkAwkAAAIFDW1hcmtldEJhbGFuY2UFDW1hcmtldEJhbGFuY2UED21hcmtldEF2YWlsYWJsZQoAAUAJAPwHBAUPcE1hcmtldFJlc3RBZGRyAhxhc3NldFN1cHBseUJ5QWRkcmVzc1JFQURPTkxZCQDMCAIJAKUIAQULcE1hcmtldEFkZHIJAMwIAgUHc2hhcmVJZAkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQ9tYXJrZXRBdmFpbGFibGUFD21hcmtldEF2YWlsYWJsZQQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAAAwMJAAACBRF0b3RhbE1hcmtldEFtb3VudAAACQBmAgUPbWFya2V0QXZhaWxhYmxlAAAHBA51bnN0YWtlZEFtb3VudAkBCXVuc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ9tYXJrZXRBdmFpbGFibGUGAwkAAAIFDnVuc3Rha2VkQW1vdW50BQ51bnN0YWtlZEFtb3VudAMJAGYCBQ1tYXJrZXRCYWxhbmNlBQ51bnN0YWtlZEFtb3VudAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ51bnN0YWtlZEFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwAAAkAlAoCBQNuaWwAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQJY2FwQW1vdW50CQBlAgUPbWFya2V0QXZhaWxhYmxlBRF0b3RhbE1hcmtldEFtb3VudAMJAGcCAAAFCWNhcEFtb3VudAkAlAoCBQNuaWwAAAQRbWFya2V0TG9hblBlcmNlbnQJAGsDBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQZTQ0FMRTgFEXRvdGFsTWFya2V0QW1vdW50BBZ0b2tlbnNNYXJrZXRGb3JGZWVMb2FuCQBrAwUJY2FwQW1vdW50BRFtYXJrZXRMb2FuUGVyY2VudAUGU0NBTEU4BBt0b2tlbnNNYXJrZXRGb3JGb3JGZWVOb0xvYW4JAGUCBQljYXBBbW91bnQFFnRva2Vuc01hcmtldEZvckZlZUxvYW4EEWF4bHlNYXJrZXRGZWVMb2FuCQBrAwUWdG9rZW5zTWFya2V0Rm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEE2F4bHlNYXJrZXRGZWVOb0xvYW4JAGsDBRt0b2tlbnNNYXJrZXRGb3JGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BA1heGx5TWFya2V0RmVlCQBkAgURYXhseU1hcmtldEZlZUxvYW4FE2F4bHlNYXJrZXRGZWVOb0xvYW4DCQBmAgUNYXhseU1hcmtldEZlZQUNbWFya2V0QmFsYW5jZQkAlAoCBQNuaWwAAAQSc3Rha2VkTWFya2V0QW1vdW50CQBlAgUJY2FwQW1vdW50BQ1heGx5TWFya2V0RmVlBBBzdGFrZWRNYXJrZXRMb2FuCQBrAwUSc3Rha2VkTWFya2V0QW1vdW50BRFtYXJrZXRMb2FuUGVyY2VudAUGU0NBTEU4BBJzdGFrZWRNYXJrZXROb0xvYW4JAGUCBRJzdGFrZWRNYXJrZXRBbW91bnQFEHN0YWtlZE1hcmtldExvYW4EGWN1clBvb2xJbnRlcmVzdE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRdrUG9vbEludGVyZXN0TWFya2V0TG9hbgAABBtjdXJQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuAAAEFW5ld0ludGVyZXN0TWFya2V0TG9hbgMJAGYCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAJAGQCBRljdXJQb29sSW50ZXJlc3RNYXJrZXRMb2FuCQBrAwUQc3Rha2VkTWFya2V0TG9hbgUHU0NBTEUxMAUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgAABBduZXdJbnRlcmVzdE1hcmtldE5vTG9hbgMJAGYCCQBlAgURdG90YWxNYXJrZXRBbW91bnQFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAkAZAIFG2N1clBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkAawMFEnN0YWtlZE1hcmtldE5vTG9hbgUHU0NBTEUxMAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAEDnVuc3Rha2VkQW1vdW50CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFDWF4bHlNYXJrZXRGZWUGAwkAAAIFDnVuc3Rha2VkQW1vdW50BQ51bnN0YWtlZEFtb3VudAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuBRVuZXdJbnRlcmVzdE1hcmtldExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgUXbmV3SW50ZXJlc3RNYXJrZXROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZAIFEXRvdGFsTWFya2V0QW1vdW50BRJzdGFrZWRNYXJrZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGQCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBRBzdGFrZWRNYXJrZXRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ1heGx5TWFya2V0RmVlCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQNuaWwFEnN0YWtlZE1hcmtldEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQLaXNNYXJrZXRQb3MEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEEnBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQQcG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEGHBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4AAAQWcG9vbEludGVyZXN0TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAAAEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkAwULaXNNYXJrZXRQb3MFFnBvb2xJbnRlcmVzdE1hcmtldExvYW4FEHBvb2xJbnRlcmVzdExvYW4DBQtpc01hcmtldFBvcwUYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuBRJwb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ9jYWxjU3RvcExvc3NGZWUEBHBvb2wKaXNCb3Jyb3dlZAhzdG9wTG9zcwpscFdpdGhkcmF3BAdmZWVUeXBlAwUKaXNCb3Jyb3dlZAUNU1RPUExPU1NfTE9BTgUUU1RPUExPU1NfRkVFX05PX0xPQU4DBQhzdG9wTG9zcwkAawMFCmxwV2l0aGRyYXcJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgAAAQ53aXRoZHJhd1RvVXNlcgUEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzDXdpdGhkcmF3VG9rZW4EB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24ECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQKaXNCb3Jyb3dlZAkAZgIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAAAAAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wFBXBvc0lkBQppc0JvcnJvd2VkBQpmcm9tTWFya2V0BA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsTWFya2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABBl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4AAAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAzNTE1MjM1MjI0CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDM1MTUyMzUyMjQCXzEEBmlkQlN0cggFDSR0MDM1MTUyMzUyMjQCXzIEBGJhbEEIBQ0kdDAzNTE1MjM1MjI0Al8zBARiYWxCCAUNJHQwMzUxNTIzNTIyNAJfNAQHc2hhcmVJZAgFDSR0MDM1MTUyMzUyMjQCXzUEDSR0MDM1MjI3MzUyOTQJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDM1MjI3MzUyOTQCXzEEA2lkQggFDSR0MDM1MjI3MzUyOTQCXzIEC3N0b3BMb3NzRmVlCQEPY2FsY1N0b3BMb3NzRmVlBAUEcG9vbAUKaXNCb3Jyb3dlZAUIc3RvcExvc3MFD3VzZXJDYW5XaXRoZHJhdwQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgkBCXVuc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQtzdG9wTG9zc0ZlZQUKZnJvbU1hcmtldAMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBCQBlAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUDbmlsBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQJAGQCBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlBQpmcm9tTWFya2V0AwkAAAIFA2ludgUDaW52CQD8BwQFCHBvb2xBZGRyAgNnZXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAwkAAAIFA2ludgUDaW52BApjQmFsQUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgUKY0JhbEFBZnRlcgUKY0JhbEFBZnRlcgQKY0JhbEJBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFCmNCYWxCQWZ0ZXIFCmNCYWxCQWZ0ZXIEDSR0MDM2MDI5MzYxMTgJAJQKAgkAZQIFCmNCYWxBQWZ0ZXIFC2NCYWxBQmVmb3JlCQBlAgUKY0JhbEJBZnRlcgULY0JhbEJCZWZvcmUEDXRva2Vuc0Ftb3VudEEIBQ0kdDAzNjAyOTM2MTE4Al8xBA10b2tlbnNBbW91bnRCCAUNJHQwMzYwMjkzNjExOAJfMgQNJHQwMzYxMjEzNzM1NwMFCmlzQm9ycm93ZWQEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQEZGVidAoAAUAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIMZ2V0QXNzZXREZWJ0CQDMCAIHCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAGYCBQRkZWJ0BQ10b2tlbnNBbW91bnRBBwkAZQIFBGRlYnQFDXRva2Vuc0Ftb3VudEEDAwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEJTdHIJAGYCBQRkZWJ0BQ10b2tlbnNBbW91bnRCBwkAZQIFBGRlYnQFDXRva2Vuc0Ftb3VudEIAAAQFZXhJbnYDCQBmAgUNYW1vdW50VG9HZXRFeAAACQEQZXhjaGFuZ2VEaXJlY3RseQgFBXBUeXBlBQRwb29sBQZpZEFTdHIFBmlkQlN0cgkAZQIFBGJhbEEFDXRva2Vuc0Ftb3VudEEJAGUCBQRiYWxCBQ10b2tlbnNBbW91bnRCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAUDbmlsAwkAAAIFBWV4SW52BQVleEludgQPY0JhbEFBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgUPY0JhbEFBZnRlclJlcGF5BQ9jQmFsQUFmdGVyUmVwYXkED2NCYWxCQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFD2NCYWxCQWZ0ZXJSZXBheQUPY0JhbEJBZnRlclJlcGF5BAtjbG9zZURidEludgMJAGYCBQRkZWJ0AAAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIIcmVwYXlGb3IJAMwIAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFC2JvcnJvd0Fzc2V0BQRkZWJ0BQNuaWwAAAMJAAACBQtjbG9zZURidEludgULY2xvc2VEYnRJbnYDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAlAoCCQBlAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUFBGRlYnQJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlCQCUCgIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlCQBlAgkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUFBGRlYnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUNdG9rZW5zQW1vdW50QQUNdG9rZW5zQW1vdW50QgQHdG9Vc2VyQQgFDSR0MDM2MTIxMzczNTcCXzEEB3RvVXNlckIIBQ0kdDAzNjEyMTM3MzU3Al8yBBRwb29sVG90YWxMb2FuRW50cmllcwMFCmlzQm9ycm93ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCBRJwb29sVG90YWxTaGFyZUxvYW4FD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwEFnBvb2xUb3RhbE1hcmtldEVudHJpZXMDBQpmcm9tTWFya2V0CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BQ91c2VyQ2FuV2l0aGRyYXcFA25pbAMFCmlzQm9ycm93ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGUCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwEDSR0MDM3NzcwMzgxNjUDAwkAAAIFDXdpdGhkcmF3VG9rZW4FBmlkQVN0cgkAZgIFB3RvVXNlckIAAAcEBmFtdEdldAkBFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFBXBUeXBlBQRwb29sBQd0b1VzZXJCBQZpZEJTdHIFBmlkQVN0cgMJAAACBQZhbXRHZXQFBmFtdEdldAkAlAoCCQBkAgUHdG9Vc2VyQQUGYW10R2V0AAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DAwkAAAIFDXdpdGhkcmF3VG9rZW4FBmlkQlN0cgkAZgIFB3RvVXNlckEAAAcEBmFtdEdldAkBFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFBXBUeXBlBQRwb29sBQd0b1VzZXJBBQZpZEFTdHIFBmlkQlN0cgMJAAACBQZhbXRHZXQFBmFtdEdldAkAlAoCAAAJAGQCBQd0b1VzZXJCBQZhbXRHZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUHdG9Vc2VyQQUHdG9Vc2VyQgQLdG9Vc2VyQUNhbGMIBQ0kdDAzNzc3MDM4MTY1Al8xBAt0b1VzZXJCQ2FsYwgFDSR0MDM3NzcwMzgxNjUCXzIEB2VudHJpZXMJAM4IAgkAzggCCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBRFrVXNlclBvc2l0aW9uUG9vbAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgUOcG9vbFRvdGFsU2hhcmUFD3VzZXJDYW5XaXRoZHJhdwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgULdG9Vc2VyQUNhbGMFA2lkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgULdG9Vc2VyQkNhbGMFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwUWcG9vbFRvdGFsTWFya2V0RW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFC3RvVXNlckFDYWxjCQDMCAIFC3RvVXNlckJDYWxjBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDHBhcnNlUmVxdWVzdAEJcmVxdWVzdElkBAdyZXF1ZXN0CQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAkArAICAhNObyByZXF1ZXN0IHdpdGggaWQgBQlyZXF1ZXN0SWQCASwEBHVzZXIJAJEDAgUHcmVxdWVzdAAABARwb29sCQCRAwIFB3JlcXVlc3QAAQQEcG10QQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QAAgQDQUlkCQCRAwIFB3JlcXVlc3QAAwQEcG10QgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QABAQDQklkCQCRAwIFB3JlcXVlc3QABQQEYmFsQQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QABgQEYmFsQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QABwQHc2hhcmVJZAkAkQMCBQdyZXF1ZXN0AAgEB2J3QXNzZXQJAJEDAgUHcmVxdWVzdAAJBAhid0Ftb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QACgQNc3Rha2VUb01hcmtldAkAAAIJAJEDAgUHcmVxdWVzdAALAgR0cnVlCQCeCgwFBHVzZXIFBHBvb2wFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQdid0Fzc2V0BQhid0Ftb3VudAUNc3Rha2VUb01hcmtldAEQY2FsY0JvcnJvd0Ftb3VudAYEcG10QQRwbXRCA2FJZANiSWQIbGV2ZXJhZ2UIYm9ycm93SWQDAwkBAiE9AgUIYm9ycm93SWQFA2FJZAkBAiE9AgUIYm9ycm93SWQFA2JJZAcJAAIBAhJXcm9uZyBib3Jyb3cgYXNzZXQEB2RQcmljZUEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNhSWQFDmtQcmljZUluT3JhY2xlBAdkUHJpY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYklkBQ5rUHJpY2VJbk9yYWNsZQQGZGVjUHJBCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQGZGVjUHJCCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQMcGF5ZEluRG9sbGFyCQBkAgkAawMFB2RQcmljZUEFBHBtdEEFBmRlY1ByQQkAawMFB2RQcmljZUIFBHBtdEIFBmRlY1ByQgQNJHQwNDAxNjU0MDI2MgMJAAACBQhib3Jyb3dJZAUDYUlkCQCUCgIFB2RQcmljZUEFBmRlY1ByQQkAlAoCBQdkUHJpY2VCBQZkZWNQckIEC2JvcnJvd1ByaWNlCAUNJHQwNDAxNjU0MDI2MgJfMQQLYm9ycm93RGVjUHIIBQ0kdDA0MDE2NTQwMjYyAl8yCQBrAwkAawMFDHBheWRJbkRvbGxhcgkAZQIFCGxldmVyYWdlAGQAZAULYm9ycm93RGVjUHIFC2JvcnJvd1ByaWNlARJwYXJzZVJlcGxlbmlzaFBtdHMDBHBtdHMDQUlkA0JJZAMJAAACCQCQAwEFBHBtdHMAAgMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBBAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAQdhc3NldElkBQNCSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEIJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAgJAJEDAgUEcG10cwABBmFtb3VudAMJAAACCQCQAwEFBHBtdHMAAQMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50AAADCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNCSWQJAJQKAgAACAkAkQMCBQRwbXRzAAAGYW1vdW50CQACAQINV3JvbmcgcGF5bWVudAkAAgECHE9uZSBvciB0d28gcGF5bWVudHMgZXhwZWN0ZWQBD2NhbGNQcmljZUltcGFjdAQEYmFsQQRiYWxCB25ld0JhbEEHbmV3QmFsQgQDcHJpCQBoAgkAZQIFBlNDQUxFOAkAawMJAGsDBQRiYWxCBQZTQ0FMRTgFBGJhbEEFBlNDQUxFOAkAawMFB25ld0JhbEIFBlNDQUxFOAUHbmV3QmFsQQBkAwkAZgIAAAUDcHJpCQBoAgUDcHJpAP///////////wEFA3ByaQERY2xhaW1BbmRDaGVja0FtbnQFBHBvb2wFcFR5cGUFY2xhaW0GYW1vdW50BmNoYW5nZQQNJHQwNDEyNjI0MTUyNAMFBWNsYWltCQELY2xhaW1GYXJtZWQCBQVwVHlwZQUEcG9vbAQMY2xhaW1lZEFzc2V0AwkAAAIFBXBUeXBlBQdTRl9QT09MBQZTV09QSUQDCQAAAgUFcFR5cGUFB1dYX1BPT0wFBFdYSUQJAQ91bmtub3duUG9vbFR5cGUACQCUCgIFBmFtb3VudAUMY2xhaW1lZEFzc2V0AwkAAAIFDSR0MDQxMjYyNDE1MjQFDSR0MDQxMjYyNDE1MjQECmNsYWltQXNzZXQIBQ0kdDA0MTI2MjQxNTI0Al8yBAtjbGFpbUFtb3VudAgFDSR0MDQxMjYyNDE1MjQCXzEEA2JhbAkBDmFjY291bnRCYWxhbmNlAQUKY2xhaW1Bc3NldAMJAAACBQNiYWwFA2JhbAMJAGYCBQZhbW91bnQFA2JhbAkAAgECGVRvIGJpZyBhbW91bnQgdG8gZXhjaGFuZ2UJAJQKAgULY2xhaW1BbW91bnQFCmNsYWltQXNzZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4cAWkBE2dldFBvb2xJbmZvUkVBRE9OTFkBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNDE4OTE0MTk4MQkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA0MTg5MTQxOTgxAl8xBANCSWQIBQ0kdDA0MTg5MTQxOTgxAl8yBARiYWxBCAUNJHQwNDE4OTE0MTk4MQJfMwQEYmFsQggFDSR0MDQxODkxNDE5ODECXzQEB3NoYXJlSWQIBQ0kdDA0MTg5MTQxOTgxAl81BAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkCQCUCgIFA25pbAkAmAoGBQNBSWQFA0JJZAUHc2hhcmVJZAUEYmFsQQUEYmFsQgULc2hhcmVTdXBwbHkBaQEaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkBB3NoYXJlSWQEC3NoYXJlUHJpY2VzCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQJAJQKAgUDbmlsBQtzaGFyZVByaWNlcwFpASJnZXRVc2VyUG9zaXRpb25TaGFyZUFtb3VudFJFQURPTkxZAgR1c2VyBnBvc051bQQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBnBvc051bQURa1VzZXJQb3NpdGlvblBvb2wCEFVua25vd24gcG9zaXRpb24EDGJvcnJvd0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBnBvc051bQURa1VzZXJCb3Jyb3dBbW91bnQECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBnBvc051bQUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwUFBHVzZXIFBHBvb2wFBnBvc051bQkAZgIFDGJvcnJvd0Ftb3VudAAABQpmcm9tTWFya2V0CQCUCgIFA25pbAUPdXNlckNhbldpdGhkcmF3AWkBF2dldFVzZXJQb3NpdGlvblJFQURPTkxZAwR1c2VyBXBvb2xzBnBvc051bQoBB3VzZXJQb3MCAWEEcG9vbAQNJHQwNDI5Nzk0MzA0OQUBYQQJd0Ftb3VudHNBCAUNJHQwNDI5Nzk0MzA0OQJfMQQJd0Ftb3VudHNCCAUNJHQwNDI5Nzk0MzA0OQJfMgQFZGVidHMIBQ0kdDA0Mjk3OTQzMDQ5Al8zBAtlcVdBbW91bnRzQQgFDSR0MDQyOTc5NDMwNDkCXzQEC2VxV0Ftb3VudHNCCAUNJHQwNDI5Nzk0MzA0OQJfNQQFaW5kZXgIBQ0kdDA0Mjk3OTQzMDQ5Al82AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BQ1rVXNlclBvc2l0aW9uCQCYCgYJAM0IAgUJd0Ftb3VudHNBAAAJAM0IAgUJd0Ftb3VudHNCAAAJAM0IAgUFZGVidHMAAAkAzQgCBQtlcVdBbW91bnRzQQAACQDNCAIFC2VxV0Ftb3VudHNCAAAJAGQCBQVpbmRleAABBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNDMzMjg0MzQxOAkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA0MzMyODQzNDE4Al8xBANCSWQIBQ0kdDA0MzMyODQzNDE4Al8yBARiYWxBCAUNJHQwNDMzMjg0MzQxOAJfMwQEYmFsQggFDSR0MDQzMzI4NDM0MTgCXzQEB3NoYXJlSWQIBQ0kdDA0MzMyODQzNDE4Al81BAxib3Jyb3dBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAURa1VzZXJCb3Jyb3dBbW91bnQAAAQKZnJvbU1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAkAkQMCBQZwb3NOdW0FBWluZGV4CQBmAgUMYm9ycm93QW1vdW50AAAFCmZyb21NYXJrZXQEDSR0MDQzNzY4NDM4ODgJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BAh3QW1vdW50QQgFDSR0MDQzNzY4NDM4ODgCXzEECHdBbW91bnRCCAUNJHQwNDM3Njg0Mzg4OAJfMgMJAGYCBQxib3Jyb3dBbW91bnQAAAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEmtVc2VyQm9ycm93QXNzZXRJZAQEZGVidAoAAUAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIMZ2V0QXNzZXREZWJ0CQDMCAIHCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQBmAgUEZGVidAUId0Ftb3VudEEHCQBlAgUEZGVidAUId0Ftb3VudEEDAwkAAAIFC2JvcnJvd0Fzc2V0BQNCSWQJAGYCBQRkZWJ0BQh3QW1vdW50QgcJAGUCBQRkZWJ0BQh3QW1vdW50QgAABAthbW91bnRUb1BheQMJAGYCBQ1hbW91bnRUb0dldEV4AAADCQAAAgUFcFR5cGUFB1NGX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5U0YHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlXWAcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yCQEPdW5rbm93blBvb2xUeXBlAAAABA0kdDA0NDgwMDQ1MDE5AwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAJQKAgkAZQIJAGQCBQh3QW1vdW50QQUNYW1vdW50VG9HZXRFeAUEZGVidAkAZQIFCHdBbW91bnRCBQthbW91bnRUb1BheQkAlAoCCQBlAgUId0Ftb3VudEEFC2Ftb3VudFRvUGF5CQBlAgkAZAIFCHdBbW91bnRCBQ1hbW91bnRUb0dldEV4BQRkZWJ0BAplcVdBbW91bnRBCAUNJHQwNDQ4MDA0NTAxOQJfMQQKZXFXQW1vdW50QggFDSR0MDQ0ODAwNDUwMTkCXzIJAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAM0IAgUFZGVidHMFBGRlYnQJAM0IAgULZXFXQW1vdW50c0EFCmVxV0Ftb3VudEEJAM0IAgULZXFXQW1vdW50c0IFCmVxV0Ftb3VudEIJAGQCBQVpbmRleAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCBQVkZWJ0cwkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAGQCBQVpbmRleAABBA0kdDA0NTI3NDQ1Mzg1CgACJGwFBXBvb2xzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAmAoGBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQd1c2VyUG9zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQECXdBbW91bnRzQQgFDSR0MDQ1Mjc0NDUzODUCXzEECXdBbW91bnRzQggFDSR0MDQ1Mjc0NDUzODUCXzIEBWRlYnRzCAUNJHQwNDUyNzQ0NTM4NQJfMwQLZXFXQW1vdW50c0EIBQ0kdDA0NTI3NDQ1Mzg1Al80BAtlcVdBbW91bnRzQggFDSR0MDQ1Mjc0NDUzODUCXzUJAJQKAgUDbmlsCQCXCgUFCXdBbW91bnRzQQUJd0Ftb3VudHNCBQVkZWJ0cwULZXFXQW1vdW50c0EFC2VxV0Ftb3VudHNCAWkBCXJlcGxlbmlzaAQEcG9vbAhsZXZlcmFnZQhib3Jyb3dJZA1zdGFrZVRvTWFya2V0CQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAZgIAZAUIbGV2ZXJhZ2UGCQBmAgUIbGV2ZXJhZ2UArAIJAAIBAh9MZXZlcmFnZSBjYW4ndCBiZSA8MTAwIGFuZCA+MzAwAwMJAQEhAQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhbkJvcnJvdwkAZgIFCGxldmVyYWdlAGQHCQACAQIdWW91IGNhbid0IGJvcnJvdyBpbiB0aGlzIHBvb2wDAwUNc3Rha2VUb01hcmtldAkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAUMa1Bvb2xQTUFya2V0BwcJAAIBAiZUaGlzIHBvb2wgY2FuJ3Qgc3Rha2UgdG8gcHV6emxlIG1hcmtldAQNJHQwNDYxNDQ0NjIzNAkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA0NjE0NDQ2MjM0Al8xBANCSWQIBQ0kdDA0NjE0NDQ2MjM0Al8yBARiYWxBCAUNJHQwNDYxNDQ0NjIzNAJfMwQEYmFsQggFDSR0MDQ2MTQ0NDYyMzQCXzQEB3NoYXJlSWQIBQ0kdDA0NjE0NDQ2MjM0Al81AwMJAQIhPQIFCGJvcnJvd0lkBQNBSWQJAQIhPQIFCGJvcnJvd0lkBQNCSWQHCQACAQISV3JvbmcgYm9ycm93IGFzc2V0BA0kdDA0NjMxNTQ2Mzc0CQEScGFyc2VSZXBsZW5pc2hQbXRzAwgFAWkIcGF5bWVudHMFA0FJZAUDQklkBARwbXRBCAUNJHQwNDYzMTU0NjM3NAJfMQQEcG10QggFDSR0MDQ2MzE1NDYzNzQCXzIEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAluZXdQb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyAwkAZgIFCGxldmVyYWdlAGQEDGJvcnJvd0Ftb3VudAkBEGNhbGNCb3Jyb3dBbW91bnQGBQRwbXRBBQRwbXRCBQNBSWQFA0JJZAUIbGV2ZXJhZ2UFCGJvcnJvd0lkBAdyZXF1ZXN0CQC5CQIJAMwIAgUEdXNlcgkAzAgCBQRwb29sCQDMCAIJAKQDAQUEcG10QQkAzAgCBQNBSWQJAMwIAgkApAMBBQRwbXRCCQDMCAIFA0JJZAkAzAgCCQCkAwEFBGJhbEEJAMwIAgkApAMBBQRiYWxCCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgkApAMBBQxib3Jyb3dBbW91bnQJAMwIAgkApQMBBQ1zdGFrZVRvTWFya2V0BQNuaWwCASwEDG5ld1JlcXVlc3RJZAoAAUAJAPwHBAUEdGhpcwIQY3JlYXRlTmV3UmVxdWVzdAkAzAgCBQdyZXF1ZXN0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUMbmV3UmVxdWVzdElkBQxuZXdSZXF1ZXN0SWQEBGFyZ3MJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgUMYm9ycm93QW1vdW50CQDMCAIJAKUIAQUEdGhpcwkAzAgCAhFyZXBsZW5pc2hGcm9tTGFuZAkAzAgCCQCkAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUMbmV3UmVxdWVzdElkAhhDYW4ndCBjcmVhdGUgbmV3IHJlcXVlc3QFA25pbAQDaW52CQD9BwQJAQ5nZXRMZW5kU3J2QWRkcgACDWZsYXNoUG9zaXRpb24FBGFyZ3MFA25pbAMJAAACBQNpbnYFA2ludgQKdXNlclN0YWtlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtBQ1rVXNlclBvc2l0aW9uBA0kdDA0NzM5NzQ3NDkxCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDA0NzM5NzQ3NDkxBQ0kdDA0NzM5NzQ3NDkxBAduZXdCYWxCCAUNJHQwNDczOTc0NzQ5MQJfMgQHbmV3QmFsQQgFDSR0MDQ3Mzk3NDc0OTECXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwNDc1NjE0NzY3NgkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDQ3NTYxNDc2NzYCXzEECHdBbW91bnRCCAUNJHQwNDc1NjE0NzY3NgJfMgkAlAoCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNDc3Mjk0Nzg1OQkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQtOT19MT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFDXN0YWtlVG9NYXJrZXQDCQAAAgUNJHQwNDc3Mjk0Nzg1OQUNJHQwNDc3Mjk0Nzg1OQQHYXhseUZlZQgFDSR0MDQ3NzI5NDc4NTkCXzIECnVzZXJTdGFrZWQIBQ0kdDA0NzcyOTQ3ODU5Al8xBA0kdDA0Nzg2NTQ3OTU5CQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDA0Nzg2NTQ3OTU5BQ0kdDA0Nzg2NTQ3OTU5BAduZXdCYWxCCAUNJHQwNDc4NjU0Nzk1OQJfMgQHbmV3QmFsQQgFDSR0MDQ3ODY1NDc5NTkCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwNDgwMjk0ODE0NAkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDQ4MDI5NDgxNDQCXzEECHdBbW91bnRCCAUNJHQwNDgwMjk0ODE0NAJfMgkAlAoCCQDOCAIJARByZXBsZW5pc2hFbnRyaWVzCQUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcFDXN0YWtlVG9NYXJrZXQJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCBHBvb2wFcG9zSWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAkBDndpdGhkcmF3VG9Vc2VyBQkApQgBCAUBaQZjYWxsZXIFBHBvb2wJAKQDAQUFcG9zSWQHAgABaQEQd2l0aGRyYXdPbmVUb2tlbgMEcG9vbAVwb3NJZAd0b2tlbklkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgUJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwUHdG9rZW5JZAFpARRjcmVhdGVVcGRhdGVTdG9wTG9zcwQFcG9zSWQGcG9vbElkB2Fzc2V0SWQFcHJpY2UJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBnBvb2xJZAIBXwkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAAIBAhpUaGVyZSBhcmUgbm8gdXNlciBwb3NpdGlvbgMJAGcCAAAFBXByaWNlCQACAQIcUHJpY2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCBQVwcmljZQUQdG9rZW5PcmFjbGVQcmljZQkAAgECK1ByaWNlIG11c3QgYmUgbGVzcyB0aGFuIGN1cnJlbnQgdG9rZW4gcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUFcHJpY2UFA25pbAFpAQ5kZWxldGVTdG9wTG9zcwMFcG9zSWQGcG9vbElkB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwkAAgECCE5vIGVudHJ5CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUDbmlsAWkBBGluaXQNDG1vbmV5Qm94QWRkcg1zZkZhcm1pbmdBZGRyCGxlbmRBZGRyD3ByaWNlT3JhY2xlQWRkchBrZWVwZXJFeENvbnRyYWN0Dnd4U3dhcENvbnRyYWN0C3N3b3BBc3NldElkCXd4QXNzZXRJZA5vcGVyYXRvclB1YktleRJncm91cDFBZG1pbjFQdWJLZXkSZ3JvdXAxQWRtaW4yUHViS2V5Emdyb3VwMkFkbWluMVB1YktleRJncm91cDJBZG1pbjJQdWJLZXkJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQlpc0RlZmluZWQBCQCiCAEFD2tPcGVyYXRvckNhbGxQSwkAAgECDkFscmVhZHkgaW5pdGVkAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQxtb25leUJveEFkZHIJAAIBAiNtb25leUJveEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUNc2ZGYXJtaW5nQWRkcgkAAgECJHNmRmFybWluZ0FkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUIbGVuZEFkZHIJAAIBAh9sZW5kQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ9wcmljZU9yYWNsZUFkZHIJAAIBAiZwcmljZU9yYWNsZUFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUQa2VlcGVyRXhDb250cmFjdAkAAgECJ2tlZXBlckV4Q29udHJhY3QgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQtzd29wQXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFCXd4QXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBAiE9AgkAyAEBCQDZBAEFDm9wZXJhdG9yUHViS2V5ACAJAAIBAh1vcGVyYXRvclB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAkAzAgCCQELU3RyaW5nRW50cnkCBQlrTW9uZXlCb3gFDG1vbmV5Qm94QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ5rU0ZGYXJtaW5nQWRkcgUNc2ZGYXJtaW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrTGVuZFNlcnZpY2UFCGxlbmRBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtQcmljZU9yYWNsZQUPcHJpY2VPcmFjbGVBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2tFeENvbnRyYWN0BRBrZWVwZXJFeENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tXeFN3YXBDb250cmFjdAUOd3hTd2FwQ29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1N3b3BJZAULc3dvcEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUFa1d4SWQFCXd4QXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rT3BlcmF0b3JDYWxsUEsFDm9wZXJhdG9yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjFQSwUSZ3JvdXAxQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjJQSwUSZ3JvdXAxQWRtaW4yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjFQSwUSZ3JvdXAyQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjJQSwUSZ3JvdXAyQWRtaW4yUHViS2V5BQNuaWwBaQEQY3JlYXRlTmV3UmVxdWVzdAEGcGFyYW1zCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkEDG5ld1JlcXVlc3RJZAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUMa1JlcXVlc3RJdGVyAAAAAQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkApAMBBQxuZXdSZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFBnBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1JlcXVlc3RJdGVyBQxuZXdSZXF1ZXN0SWQFA25pbAUMbmV3UmVxdWVzdElkAWkBEXJlcGxlbmlzaEZyb21MYW5kAQlyZXF1ZXN0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQQNJHQwNTMzNjQ1MzQ4MwkBDHBhcnNlUmVxdWVzdAEFCXJlcXVlc3RJZAQEdXNlcggFDSR0MDUzMzY0NTM0ODMCXzEEBHBvb2wIBQ0kdDA1MzM2NDUzNDgzAl8yBARwbXRBCAUNJHQwNTMzNjQ1MzQ4MwJfMwQDQUlkCAUNJHQwNTMzNjQ1MzQ4MwJfNAQEcG10QggFDSR0MDUzMzY0NTM0ODMCXzUEA0JJZAgFDSR0MDUzMzY0NTM0ODMCXzYEBGJhbEEIBQ0kdDA1MzM2NDUzNDgzAl83BARiYWxCCAUNJHQwNTMzNjQ1MzQ4MwJfOAQHc2hhcmVJZAgFDSR0MDUzMzY0NTM0ODMCXzkEB2J3QXNzZXQIBQ0kdDA1MzM2NDUzNDgzA18xMAQIYndBbW91bnQIBQ0kdDA1MzM2NDUzNDgzA18xMQQNc3Rha2VUb01hcmtldAgFDSR0MDUzMzY0NTM0ODMDXzEyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDA1MzY3MzUzNzczAwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQUIYndBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFCGJ3QW1vdW50BAdwbXRBbGxBCAUNJHQwNTM2NzM1Mzc3MwJfMQQHcG10QWxsQggFDSR0MDUzNjczNTM3NzMCXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA1Mzg1NTUzOTg1CQEPcmVwbGVuaXNoQnlUeXBlCwUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAUNc3Rha2VUb01hcmtldAQKdXNlclN0YWtlZAgFDSR0MDUzODU1NTM5ODUCXzEEB2F4bHlGZWUIBQ0kdDA1Mzg1NTUzOTg1Al8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwkFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGBQ1zdGFrZVRvTWFya2V0BA0kdDA1NDM2MDU0NDc1CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNTQzNjA1NDQ3NQJfMQQId0Ftb3VudEIIBQ0kdDA1NDM2MDU0NDc1Al8yCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAcEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDA1NTEwODU1MTk4CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDU1MTA4NTUxOTgCXzEEA0JJZAgFDSR0MDU1MTA4NTUxOTgCXzIEBGJhbEEIBQ0kdDA1NTEwODU1MTk4Al8zBARiYWxCCAUNJHQwNTUxMDg1NTE5OAJfNAQHc2hhcmVJZAgFDSR0MDU1MTA4NTUxOTgCXzUEBmFtb3VudAkBCXVuc3Rha2VMUAUFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ9saXF1aWRhdGVBbW91bnQFCmZyb21NYXJrZXQEDGJvcnJvd0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBQR1c2VyBQRwb29sBQVwb3NJZAkAZgIFDGJvcnJvd0Ftb3VudAAABQpmcm9tTWFya2V0AwkAZgIFD2xpcXVpZGF0ZUFtb3VudAUPdXNlckNhbldpdGhkcmF3CQACAQInWW91IGNhbid0IGxpcXVpZGF0ZSBtb3JlIHRoYW4gdXNlciBoYXZlAwkAAAIFDGJvcnJvd0Ftb3VudAAACQACAQIrWW91IGNhbid0IGxpcXVpZGF0ZSBwb3NpdGlvbiB3aXRob3V0IGJvcnJvdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAGUCBQ91c2VyQ2FuV2l0aGRyYXcFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBaQEIc3RvcExvc3MEBHVzZXIFcG9zSWQEcG9vbAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEDXN0b3BMb3NzUHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MCCE5vIGVudHJ5AwkAZgIFEHRva2VuT3JhY2xlUHJpY2UFDXN0b3BMb3NzUHJpY2UJAAIBAiNUb2tlbiBwcmljZSBncmVhdGVyIHN0b3AgbG9zcyBwcmljZQQDcmVzCQEOd2l0aGRyYXdUb1VzZXIFBQR1c2VyBQRwb29sCQCkAwEFBXBvc0lkBgIACQCUCgIJAM0IAggFA3JlcwJfMQkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCAUDcmVzAl8yAWkBDGNhcGl0YWxpemVFeAUEcG9vbAVyb3V0ZQl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEBmNoYW5nZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlAAAECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQNJHQwNTcyNDc1NzMxMwkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANBSWQIBQ0kdDA1NzI0NzU3MzEzAl8xBANCSWQIBQ0kdDA1NzI0NzU3MzEzAl8yBARiYWxBCAUNJHQwNTcyNDc1NzMxMwJfMwQEYmFsQggFDSR0MDU3MjQ3NTczMTMCXzQEB3NoYXJlSWQIBQ0kdDA1NzI0NzU3MzEzAl81BBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBAxpc01hcmtldFBvb2wJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQxrUG9vbFBNQXJrZXQHBA0kdDA1NzQ0MjU4MjczAwkAZgIFEGFtb3VudFRvRXhjaGFuZ2UAAAQNJHQwNTc1MDQ1NzYwNgkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlBQZjaGFuZ2UDCQAAAgUNJHQwNTc1MDQ1NzYwNgUNJHQwNTc1MDQ1NzYwNgQMY2xhaW1lZEFzc2V0CAUNJHQwNTc1MDQ1NzYwNgJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDU3NTA0NTc2MDYCXzEEBXJBcmdzCQC1CQIFBXJvdXRlAgJfXwQPZXhjaGFuZ2VkQW1vdW50AwkAZgIFEGFtb3VudFRvRXhjaGFuZ2UAAAMJAAACCQCRAwIFBXJBcmdzAAACEGRpcmVjdFN3b3BmaUNQTU0JARBkaXJlY3RTd29wZmlDUE1NAgUFckFyZ3MFCXRva2VuVG9JZAMJAAACCQCRAwIFBXJBcmdzAAACDXJvdXRpbmdTd29wZmkJARNkaXJlY3RSb3V0aW5nU3dvcGZpAgUFckFyZ3MFCXRva2VuVG9JZAkAAgECC1dyb25nIHJvdXRlAAADCQAAAgUPZXhjaGFuZ2VkQW1vdW50BQ9leGNoYW5nZWRBbW91bnQECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAUDbmlsBA0kdDA1ODEwMzU4MjEzCQEKY2FwaXRhbGl6ZQkFBHBvb2wFBXBUeXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQEC2NhcEVudGVyaXNlCAUNJHQwNTgxMDM1ODIxMwJfMQQGc3Rha2VkCAUNJHQwNTgxMDM1ODIxMwJfMgkAlAoCCQDOCAIFC2NhcEVudGVyaXNlBQtjaGFuZ2VFbnRyeQUGc3Rha2VkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFA25pbAAABAtjYXBFbnRlcmlzZQgFDSR0MDU3NDQyNTgyNzMCXzEEBnN0YWtlZAgFDSR0MDU3NDQyNTgyNzMCXzIEDSR0MDU4Mjc2NTgzOTMDBQxpc01hcmtldFBvb2wJARZjYXBpdGFsaXplUHV6emxlTWFya2V0AwUEcG9vbAUFcFR5cGUFB3NoYXJlSWQJAJQKAgUDbmlsAAAEEG1hcmtldENhcEVudGVyaXMIBQ0kdDA1ODI3NjU4MzkzAl8xBAxzdGFrZWRNYXJrZXQIBQ0kdDA1ODI3NjU4MzkzAl8yCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCCQBkAgUQdG90YWxTaGFyZUFtb3VudAUGc3Rha2VkBQxzdGFrZWRNYXJrZXQFA25pbAULY2FwRW50ZXJpc2UFEG1hcmtldENhcEVudGVyaXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkBQNuaWwBaQEOY2FwaXRhbGl6ZU5vRXgDBHBvb2wFY2xhaW0RYW1vdW50RnJvbUJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDU4ODI4NTg4OTQJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwNTg4Mjg1ODg5NAJfMQQDQklkCAUNJHQwNTg4Mjg1ODg5NAJfMgQEYmFsQQgFDSR0MDU4ODI4NTg4OTQCXzMEBGJhbEIIBQ0kdDA1ODgyODU4ODk0Al80BAdzaGFyZUlkCAUNJHQwNTg4Mjg1ODg5NAJfNQQNJHQwNTg4OTc1ODk5NQkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRFhbW91bnRGcm9tQmFsYW5jZQAAAwkAAAIFDSR0MDU4ODk3NTg5OTUFDSR0MDU4ODk3NTg5OTUEDGNsYWltZWRBc3NldAgFDSR0MDU4ODk3NTg5OTUCXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA1ODg5NzU4OTk1Al8xCQEKY2FwaXRhbGl6ZQkFBHBvb2wFBXBUeXBlCQEMYXNzZXRJZFRvU3RyAQUMY2xhaW1lZEFzc2V0CQBkAgUNY2xhaW1lZEFtb3VudAURYW1vdW50RnJvbUJhbGFuY2UFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2luaXROZXdQb29sCwR0eXBlCHBvb2xUeXBlCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgljYW5Cb3Jyb3cKY2FuUE1hcmtldAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMDCQECIT0CBQR0eXBlBQdTRl9QT09MCQECIT0CBQR0eXBlBQdXWF9QT09MBwkAAgECCldyb25nIHR5cGUDAwkBAiE9AgUIcG9vbFR5cGUFBENQTU0JAQIhPQIFCHBvb2xUeXBlBQRGTEFUBwkAAgECD1dyb25nIHBvb2wgdHlwZQQNJHQwNTk2MDI1OTY5NgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFCHBvb2xBZGRyBQR0eXBlBANhSWQIBQ0kdDA1OTYwMjU5Njk2Al8xBANiSWQIBQ0kdDA1OTYwMjU5Njk2Al8yBARhQmFsCAUNJHQwNTk2MDI1OTY5NgJfMwQEYkJhbAgFDSR0MDU5NjAyNTk2OTYCXzQEB3NoYXJlSWQIBQ0kdDA1OTYwMjU5Njk2Al81AwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrUG9vbEludGVyZXN0TG9hbgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQVrUG9vbAUIcG9vbEFkZHIFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhwb29sQWRkcgUJa1Bvb2xUeXBlBQhwb29sVHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wFCHBvb2xBZGRyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQ5rUG9vbENhbkJvcnJvdwUJY2FuQm9ycm93CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQxrUG9vbFBNQXJrZXQFCmNhblBNYXJrZXQFA25pbAFpAQ51cGRhdGVQb29sRmVlcwcIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbhFzdG9wbG9zc0ZlZU5vTG9hbhNzdG9wbG9zc0ZlZVdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQhwb29sQWRkcgkAAgEJAKwCAgIaQ2FuJ3QgZmluZCBwb29sIHdpdGggYWRkciAFCHBvb2xBZGRyAwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuBQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECE2RBcHAgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGBQNuaWwBaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQIVZEFwcCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwUDbmlsAWkBEGFjdGl2YXRlRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIdZEFwcCBhbHJlYWR5IGFjdGl2ZSBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwYFA25pbAFpARBzaHV0ZG93bkZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIfZEFwcCBhbHJlYWR5IHNodXRkb3duIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBwUDbmlsAWkBCmFjdGl2YXRlU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECFVNXT1BGSSBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93blNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECF1NXT1BGSSBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBCmFjdGl2YXRlV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECEVdYIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQITV1ggYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQxhY3RpdmF0ZVBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQITUG9vbCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYFA25pbAFpAQxzaHV0ZG93blBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhVQb29sIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUHBQNuaWwBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ5ncm91cDFBZG1pbjFQSwABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDmdyb3VwMUFkbWluMlBLAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUOZ3JvdXAxQWRtaW4zUEsAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIFE211bHRpU2lnbmVkQnlBZG1pbnPq0Ytj", "height": 3943631, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EU48FEJsK45tkmUA5YAEwB3nwPjPC4wzsKuf2XbTgJcf Next: J3cE8U8k2UTkoeoHMDma9UGtMQFwcCkTKGWNsE7MbLZA Diff:
OldNewDifferences
690690 let exPool = if ((poolFB == ""))
691691 then pool
692692 else poolFB
693- invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [1]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
693+ invoke(addressFromStringValue(exPool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
694694 }
695695 else if ((pType == WX_POOL))
696696 then invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
709709
710710
711711 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
712- let $t02172322194 = if ((pType == SF_POOL))
712+ let $t02172522196 = if ((pType == SF_POOL))
713713 then {
714714 let inv = {
715715 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
744744 else throw("Strict value is not equal to itself.")
745745 }
746746 else unknownPoolType()
747- let amountA = $t02172322194._1
748- let amountB = $t02172322194._2
747+ let amountA = $t02172522196._1
748+ let amountB = $t02172522196._2
749749 $Tuple2(amountA, amountB)
750750 }
751751
767767 }
768768 else if ((pType == WX_POOL))
769769 then {
770- let $t02256222641 = getWXPoolData(addressFromStringValue(pool))
771- let aId = $t02256222641._1
772- let bId = $t02256222641._2
773- let aBal = $t02256222641._3
774- let bBal = $t02256222641._4
775- let lpId = $t02256222641._5
770+ let $t02256422643 = getWXPoolData(addressFromStringValue(pool))
771+ let aId = $t02256422643._1
772+ let bId = $t02256422643._2
773+ let aBal = $t02256422643._3
774+ let bBal = $t02256422643._4
775+ let lpId = $t02256422643._5
776776 let balBefore = accountBalance(WXID)
777777 if ((balBefore == balBefore))
778778 then {
794794 if ((lpBalanceBefore == lpBalanceBefore))
795795 then {
796796 let poolAddr = addressFromStringValue(pool)
797- let $t02326623688 = if (if ((pmtA > 0))
797+ let $t02326823690 = if (if ((pmtA > 0))
798798 then (pmtB > 0)
799799 else false)
800800 then {
801- let $t02333223454 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
802- let pmtInA = $t02333223454._1
803- let pmtInB = $t02333223454._2
804- let change = $t02333223454._3
805- let changeId = $t02333223454._4
801+ let $t02333423456 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
802+ let pmtInA = $t02333423456._1
803+ let pmtInB = $t02333423456._2
804+ let change = $t02333423456._3
805+ let changeId = $t02333423456._4
806806 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
807807 if ((inv == inv))
808808 then $Tuple2(change, changeId)
813813 else if ((pmtB > 0))
814814 then $Tuple2(pmtB, bId)
815815 else throw("pmts must be > 0")
816- let change = $t02326623688._1
817- let changeId = $t02326623688._2
816+ let change = $t02326823690._1
817+ let changeId = $t02326823690._2
818818 let inv = if ((change > 0))
819819 then replenishOneTokenByType(poolAddr, pType, change, changeId)
820820 else nil
848848 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
849849 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
850850 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
851- let $t02514325968 = if (withLoan)
851+ let $t02514525970 = if (withLoan)
852852 then if (stakeToMarket)
853853 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
854854 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
855855 else if (stakeToMarket)
856856 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
857857 else $Tuple2(poolInterestNoLoan, nil)
858- let curPoolInterest = $t02514325968._1
859- let adEntry = $t02514325968._2
858+ let curPoolInterest = $t02514525970._1
859+ let adEntry = $t02514525970._2
860860 ([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)
861861 }
862862
952952 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
953953 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
954954 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
955- let $t02888528985 = if ((tokenId == AId))
955+ let $t02888728987 = if ((tokenId == AId))
956956 then $Tuple2((tokenAmount - axlyFee), 0)
957957 else $Tuple2(0, (tokenAmount - axlyFee))
958- let pmtA = $t02888528985._1
959- let pmtB = $t02888528985._2
960- let $t02898829099 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
961- let stakedAmount = $t02898829099._1
962- let nf = $t02898829099._2
958+ let pmtA = $t02888728987._1
959+ let pmtB = $t02888728987._2
960+ let $t02899029101 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
961+ let stakedAmount = $t02899029101._1
962+ let nf = $t02899029101._2
963963 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
964964 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
965965 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
10801080 let userAddr = Address(fromBase58String(user))
10811081 let poolAddr = Address(fromBase58String(pool))
10821082 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1083- let $t03515035222 = getPoolData(poolAddr, pType)
1084- let idAStr = $t03515035222._1
1085- let idBStr = $t03515035222._2
1086- let balA = $t03515035222._3
1087- let balB = $t03515035222._4
1088- let shareId = $t03515035222._5
1089- let $t03522535292 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1090- let idA = $t03522535292._1
1091- let idB = $t03522535292._2
1083+ let $t03515235224 = getPoolData(poolAddr, pType)
1084+ let idAStr = $t03515235224._1
1085+ let idBStr = $t03515235224._2
1086+ let balA = $t03515235224._3
1087+ let balB = $t03515235224._4
1088+ let shareId = $t03515235224._5
1089+ let $t03522735294 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1090+ let idA = $t03522735294._1
1091+ let idB = $t03522735294._2
10921092 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
10931093 let cBalABefore = accountBalance(idA)
10941094 if ((cBalABefore == cBalABefore))
11191119 let cBalBAfter = accountBalance(idB)
11201120 if ((cBalBAfter == cBalBAfter))
11211121 then {
1122- let $t03602736116 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1123- let tokensAmountA = $t03602736116._1
1124- let tokensAmountB = $t03602736116._2
1125- let $t03611937355 = if (isBorrowed)
1122+ let $t03602936118 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1123+ let tokensAmountA = $t03602936118._1
1124+ let tokensAmountB = $t03602936118._2
1125+ let $t03612137357 = if (isBorrowed)
11261126 then {
11271127 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
11281128 let debt = {
11711171 else throw("Strict value is not equal to itself.")
11721172 }
11731173 else $Tuple2(tokensAmountA, tokensAmountB)
1174- let toUserA = $t03611937355._1
1175- let toUserB = $t03611937355._2
1174+ let toUserA = $t03612137357._1
1175+ let toUserB = $t03612137357._2
11761176 let poolTotalLoanEntries = if (isBorrowed)
11771177 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
11781178 else nil
11811181 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
11821182 else nil))
11831183 else nil
1184- let $t03776838163 = if (if ((withdrawToken == idAStr))
1184+ let $t03777038165 = if (if ((withdrawToken == idAStr))
11851185 then (toUserB > 0)
11861186 else false)
11871187 then {
12001200 else throw("Strict value is not equal to itself.")
12011201 }
12021202 else $Tuple2(toUserA, toUserB)
1203- let toUserACalc = $t03776838163._1
1204- let toUserBCalc = $t03776838163._2
1203+ let toUserACalc = $t03777038165._1
1204+ let toUserBCalc = $t03777038165._2
12051205 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, toUserACalc, idA), ScriptTransfer(userAddr, toUserBCalc, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
12061206 $Tuple2(entries, [toUserACalc, toUserBCalc])
12071207 }
12451245 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
12461246 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
12471247 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1248- let $t04016340260 = if ((borrowId == aId))
1248+ let $t04016540262 = if ((borrowId == aId))
12491249 then $Tuple2(dPriceA, decPrA)
12501250 else $Tuple2(dPriceB, decPrB)
1251- let borrowPrice = $t04016340260._1
1252- let borrowDecPr = $t04016340260._2
1251+ let borrowPrice = $t04016540262._1
1252+ let borrowDecPr = $t04016540262._2
12531253 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
12541254 }
12551255
12781278
12791279
12801280 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1281- let $t04126041522 = if (claim)
1281+ let $t04126241524 = if (claim)
12821282 then claimFarmed(pType, pool)
12831283 else {
12841284 let claimedAsset = if ((pType == SF_POOL))
12881288 else unknownPoolType()
12891289 $Tuple2(amount, claimedAsset)
12901290 }
1291- if (($t04126041522 == $t04126041522))
1291+ if (($t04126241524 == $t04126241524))
12921292 then {
1293- let claimAsset = $t04126041522._2
1294- let claimAmount = $t04126041522._1
1293+ let claimAsset = $t04126241524._2
1294+ let claimAmount = $t04126241524._1
12951295 let bal = accountBalance(claimAsset)
12961296 if ((bal == bal))
12971297 then if ((amount > bal))
13071307 func getPoolInfoREADONLY (pool) = {
13081308 let poolAddr = addressFromStringValue(pool)
13091309 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1310- let $t04188941979 = getPoolData(Address(fromBase58String(pool)), pType)
1311- let AId = $t04188941979._1
1312- let BId = $t04188941979._2
1313- let balA = $t04188941979._3
1314- let balB = $t04188941979._4
1315- let shareId = $t04188941979._5
1310+ let $t04189141981 = getPoolData(Address(fromBase58String(pool)), pType)
1311+ let AId = $t04189141981._1
1312+ let BId = $t04189141981._2
1313+ let balA = $t04189141981._3
1314+ let balB = $t04189141981._4
1315+ let shareId = $t04189141981._5
13161316 let shareSupply = getShareSupply(poolAddr, pType, shareId)
13171317 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
13181318 }
13411341 @Callable(i)
13421342 func getUserPositionREADONLY (user,pools,posNum) = {
13431343 func userPos (a,pool) = {
1344- let $t04297743047 = a
1345- let wAmountsA = $t04297743047._1
1346- let wAmountsB = $t04297743047._2
1347- let debts = $t04297743047._3
1348- let eqWAmountsA = $t04297743047._4
1349- let eqWAmountsB = $t04297743047._5
1350- let index = $t04297743047._6
1344+ let $t04297943049 = a
1345+ let wAmountsA = $t04297943049._1
1346+ let wAmountsB = $t04297943049._2
1347+ let debts = $t04297943049._3
1348+ let eqWAmountsA = $t04297943049._4
1349+ let eqWAmountsB = $t04297943049._5
1350+ let index = $t04297943049._6
13511351 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
13521352 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
13531353 else {
13541354 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1355- let $t04332643416 = getPoolData(Address(fromBase58String(pool)), pType)
1356- let AId = $t04332643416._1
1357- let BId = $t04332643416._2
1358- let balA = $t04332643416._3
1359- let balB = $t04332643416._4
1360- let shareId = $t04332643416._5
1355+ let $t04332843418 = getPoolData(Address(fromBase58String(pool)), pType)
1356+ let AId = $t04332843418._1
1357+ let BId = $t04332843418._2
1358+ let balA = $t04332843418._3
1359+ let balB = $t04332843418._4
1360+ let shareId = $t04332843418._5
13611361 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
13621362 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
13631363 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1364- let $t04376643886 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1365- let wAmountA = $t04376643886._1
1366- let wAmountB = $t04376643886._2
1364+ let $t04376843888 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1365+ let wAmountA = $t04376843888._1
1366+ let wAmountB = $t04376843888._2
13671367 if ((borrowAmount > 0))
13681368 then {
13691369 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
13971397 }
13981398 else unknownPoolType()
13991399 else 0
1400- let $t04479845017 = if ((borrowAsset == AId))
1400+ let $t04480045019 = if ((borrowAsset == AId))
14011401 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
14021402 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1403- let eqWAmountA = $t04479845017._1
1404- let eqWAmountB = $t04479845017._2
1403+ let eqWAmountA = $t04480045019._1
1404+ let eqWAmountB = $t04480045019._2
14051405 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
14061406 }
14071407 else throw("Strict value is not equal to itself.")
14101410 }
14111411 }
14121412
1413- let $t04527245383 = {
1413+ let $t04527445385 = {
14141414 let $l = pools
14151415 let $s = size($l)
14161416 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
14241424
14251425 $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)
14261426 }
1427- let wAmountsA = $t04527245383._1
1428- let wAmountsB = $t04527245383._2
1429- let debts = $t04527245383._3
1430- let eqWAmountsA = $t04527245383._4
1431- let eqWAmountsB = $t04527245383._5
1427+ let wAmountsA = $t04527445385._1
1428+ let wAmountsB = $t04527445385._2
1429+ let debts = $t04527445385._3
1430+ let eqWAmountsA = $t04527445385._4
1431+ let eqWAmountsB = $t04527445385._5
14321432 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
14331433 }
14341434
14521452 else false)
14531453 then throw("This pool can't stake to puzzle market")
14541454 else {
1455- let $t04614246232 = getPoolData(Address(fromBase58String(pool)), pType)
1456- let AId = $t04614246232._1
1457- let BId = $t04614246232._2
1458- let balA = $t04614246232._3
1459- let balB = $t04614246232._4
1460- let shareId = $t04614246232._5
1455+ let $t04614446234 = getPoolData(Address(fromBase58String(pool)), pType)
1456+ let AId = $t04614446234._1
1457+ let BId = $t04614446234._2
1458+ let balA = $t04614446234._3
1459+ let balB = $t04614446234._4
1460+ let shareId = $t04614446234._5
14611461 if (if ((borrowId != AId))
14621462 then (borrowId != BId)
14631463 else false)
14641464 then throw("Wrong borrow asset")
14651465 else {
1466- let $t04631346372 = parseReplenishPmts(i.payments, AId, BId)
1467- let pmtA = $t04631346372._1
1468- let pmtB = $t04631346372._2
1466+ let $t04631546374 = parseReplenishPmts(i.payments, AId, BId)
1467+ let pmtA = $t04631546374._1
1468+ let pmtB = $t04631546374._2
14691469 let user = toString(i.caller)
14701470 let newPosNum = getNewUserPositionNumber(user)
14711471 if ((leverage > 100))
14851485 if ((inv == inv))
14861486 then {
14871487 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1488- let $t04739547489 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1489- if (($t04739547489 == $t04739547489))
1488+ let $t04739747491 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1489+ if (($t04739747491 == $t04739747491))
14901490 then {
1491- let newBalB = $t04739547489._2
1492- let newBalA = $t04739547489._1
1491+ let newBalB = $t04739747491._2
1492+ let newBalA = $t04739747491._1
14931493 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1494- let $t04755947674 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1495- let wAmountA = $t04755947674._1
1496- let wAmountB = $t04755947674._2
1494+ let $t04756147676 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1495+ let wAmountA = $t04756147676._1
1496+ let wAmountB = $t04756147676._2
14971497 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
14981498 }
14991499 else throw("Strict value is not equal to itself.")
15031503 else throw("Strict value is not equal to itself.")
15041504 }
15051505 else {
1506- let $t04772747857 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1507- if (($t04772747857 == $t04772747857))
1506+ let $t04772947859 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1507+ if (($t04772947859 == $t04772947859))
15081508 then {
1509- let axlyFee = $t04772747857._2
1510- let userStaked = $t04772747857._1
1511- let $t04786347957 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1512- if (($t04786347957 == $t04786347957))
1509+ let axlyFee = $t04772947859._2
1510+ let userStaked = $t04772947859._1
1511+ let $t04786547959 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1512+ if (($t04786547959 == $t04786547959))
15131513 then {
1514- let newBalB = $t04786347957._2
1515- let newBalA = $t04786347957._1
1514+ let newBalB = $t04786547959._2
1515+ let newBalA = $t04786547959._1
15161516 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1517- let $t04802748142 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1518- let wAmountA = $t04802748142._1
1519- let wAmountB = $t04802748142._2
1517+ let $t04802948144 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1518+ let wAmountA = $t04802948144._1
1519+ let wAmountB = $t04802948144._2
15201520 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
15211521 }
15221522 else throw("Strict value is not equal to itself.")
16191619
16201620 @Callable(i)
16211621 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1622- let $t05336253481 = parseRequest(requestId)
1623- let user = $t05336253481._1
1624- let pool = $t05336253481._2
1625- let pmtA = $t05336253481._3
1626- let AId = $t05336253481._4
1627- let pmtB = $t05336253481._5
1628- let BId = $t05336253481._6
1629- let balA = $t05336253481._7
1630- let balB = $t05336253481._8
1631- let shareId = $t05336253481._9
1632- let bwAsset = $t05336253481._10
1633- let bwAmount = $t05336253481._11
1634- let stakeToMarket = $t05336253481._12
1622+ let $t05336453483 = parseRequest(requestId)
1623+ let user = $t05336453483._1
1624+ let pool = $t05336453483._2
1625+ let pmtA = $t05336453483._3
1626+ let AId = $t05336453483._4
1627+ let pmtB = $t05336453483._5
1628+ let BId = $t05336453483._6
1629+ let balA = $t05336453483._7
1630+ let balB = $t05336453483._8
1631+ let shareId = $t05336453483._9
1632+ let bwAsset = $t05336453483._10
1633+ let bwAmount = $t05336453483._11
1634+ let stakeToMarket = $t05336453483._12
16351635 if ((size(i.payments) != 1))
16361636 then throw("Wrong payment size")
16371637 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
16391639 else (i.payments[0].amount != bwAmount))
16401640 then throw("Wrong payment")
16411641 else {
1642- let $t05367153771 = if ((AId == bwAsset))
1642+ let $t05367353773 = if ((AId == bwAsset))
16431643 then $Tuple2((pmtA + bwAmount), pmtB)
16441644 else $Tuple2(pmtA, (pmtB + bwAmount))
1645- let pmtAllA = $t05367153771._1
1646- let pmtAllB = $t05367153771._2
1645+ let pmtAllA = $t05367353773._1
1646+ let pmtAllB = $t05367353773._2
16471647 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1648- let $t05385353983 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1649- let userStaked = $t05385353983._1
1650- let axlyFee = $t05385353983._2
1648+ let $t05385553985 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1649+ let userStaked = $t05385553985._1
1650+ let axlyFee = $t05385553985._2
16511651 let posNum = getNewUserPositionNumber(user)
16521652 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
16531653 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1654- let $t05435854473 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1655- let wAmountA = $t05435854473._1
1656- let wAmountB = $t05435854473._2
1654+ let $t05436054475 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1655+ let wAmountA = $t05436054475._1
1656+ let wAmountB = $t05436054475._2
16571657 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
16581658 }
16591659 }))
16651665 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
16661666 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
16671667 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1668- let $t05510655196 = getPoolData(Address(fromBase58String(pool)), pType)
1669- let AId = $t05510655196._1
1670- let BId = $t05510655196._2
1671- let balA = $t05510655196._3
1672- let balB = $t05510655196._4
1673- let shareId = $t05510655196._5
1668+ let $t05510855198 = getPoolData(Address(fromBase58String(pool)), pType)
1669+ let AId = $t05510855198._1
1670+ let BId = $t05510855198._2
1671+ let balA = $t05510855198._3
1672+ let balB = $t05510855198._4
1673+ let shareId = $t05510855198._5
16741674 let amount = unstakeLP(pool, pType, shareId, liquidateAmount, fromMarket)
16751675 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
16761676 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
17031703 let pType = getStringValue(this, (kPool + pool))
17041704 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
17051705 let poolAddr = Address(fromBase58String(pool))
1706- let $t05724557311 = getPoolData(poolAddr, pType)
1707- let AId = $t05724557311._1
1708- let BId = $t05724557311._2
1709- let balA = $t05724557311._3
1710- let balB = $t05724557311._4
1711- let shareId = $t05724557311._5
1706+ let $t05724757313 = getPoolData(poolAddr, pType)
1707+ let AId = $t05724757313._1
1708+ let BId = $t05724757313._2
1709+ let balA = $t05724757313._3
1710+ let balB = $t05724757313._4
1711+ let shareId = $t05724757313._5
17121712 let totalShareAmount = getPoolTotalShare(pool)
17131713 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1714- let $t05744058271 = if ((amountToExchange > 0))
1714+ let $t05744258273 = if ((amountToExchange > 0))
17151715 then {
1716- let $t05750257604 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1717- if (($t05750257604 == $t05750257604))
1716+ let $t05750457606 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1717+ if (($t05750457606 == $t05750457606))
17181718 then {
1719- let claimedAsset = $t05750257604._2
1720- let claimedAmount = $t05750257604._1
1719+ let claimedAsset = $t05750457606._2
1720+ let claimedAmount = $t05750457606._1
17211721 let rArgs = split(route, "__")
17221722 let exchangedAmount = if ((amountToExchange > 0))
17231723 then if ((rArgs[0] == "directSwopfiCPMM"))
17321732 let changeEntry = if ((newChange >= 0))
17331733 then [IntegerEntry((pool + kPoolCapChange), newChange)]
17341734 else nil
1735- let $t05810158211 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1736- let capEnterise = $t05810158211._1
1737- let staked = $t05810158211._2
1735+ let $t05810358213 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1736+ let capEnterise = $t05810358213._1
1737+ let staked = $t05810358213._2
17381738 $Tuple2((capEnterise ++ changeEntry), staked)
17391739 }
17401740 else throw("Strict value is not equal to itself.")
17421742 else throw("Strict value is not equal to itself.")
17431743 }
17441744 else $Tuple2(nil, 0)
1745- let capEnterise = $t05744058271._1
1746- let staked = $t05744058271._2
1747- let $t05827458391 = if (isMarketPool)
1745+ let capEnterise = $t05744258273._1
1746+ let staked = $t05744258273._2
1747+ let $t05827658393 = if (isMarketPool)
17481748 then capitalizePuzzleMarket(pool, pType, shareId)
17491749 else $Tuple2(nil, 0)
1750- let marketCapEnteris = $t05827458391._1
1751- let stakedMarket = $t05827458391._2
1750+ let marketCapEnteris = $t05827658393._1
1751+ let stakedMarket = $t05827658393._2
17521752 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
17531753 }))
17541754
17581758 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
17591759 let pType = getStringValue(this, (kPool + pool))
17601760 let poolAddr = Address(fromBase58String(pool))
1761- let $t05882658892 = getPoolData(poolAddr, pType)
1762- let AId = $t05882658892._1
1763- let BId = $t05882658892._2
1764- let balA = $t05882658892._3
1765- let balB = $t05882658892._4
1766- let shareId = $t05882658892._5
1767- let $t05889558993 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1768- if (($t05889558993 == $t05889558993))
1761+ let $t05882858894 = getPoolData(poolAddr, pType)
1762+ let AId = $t05882858894._1
1763+ let BId = $t05882858894._2
1764+ let balA = $t05882858894._3
1765+ let balB = $t05882858894._4
1766+ let shareId = $t05882858894._5
1767+ let $t05889758995 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1768+ if (($t05889758995 == $t05889758995))
17691769 then {
1770- let claimedAsset = $t05889558993._2
1771- let claimedAmount = $t05889558993._1
1770+ let claimedAsset = $t05889758995._2
1771+ let claimedAmount = $t05889758995._1
17721772 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance), AId, BId, balA, balB, shareId)
17731773 }
17741774 else throw("Strict value is not equal to itself.")
17861786 else false)
17871787 then throw("Wrong pool type")
17881788 else {
1789- let $t05960059694 = getPoolData(Address(fromBase58String(poolAddr)), type)
1790- let aId = $t05960059694._1
1791- let bId = $t05960059694._2
1792- let aBal = $t05960059694._3
1793- let bBal = $t05960059694._4
1794- let shareId = $t05960059694._5
1789+ let $t05960259696 = getPoolData(Address(fromBase58String(poolAddr)), type)
1790+ let aId = $t05960259696._1
1791+ let bId = $t05960259696._2
1792+ let aBal = $t05960259696._3
1793+ let bBal = $t05960259696._4
1794+ let shareId = $t05960259696._5
17951795 if ((0 > inFeeNoLoan))
17961796 then throw("inFeeNoLoan must be greater than 0")
17971797 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 kGroup1Admin3PK = "group1_admin3_pub_key"
153153
154154 let kGroup2Admin1PK = "group2_admin1_pub_key"
155155
156156 let kGroup2Admin2PK = "group2_admin2_pub_key"
157157
158158 let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
159159
160160 let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
161161
162162 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
163163
164164 let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
165165
166166 let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
167167
168168 let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
169169
170170 let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
171171
172172 let pMarketAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketAddr), "No puzzle market address"))
173173
174174 let pMarketRestAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketRestAddr), "No puzzle market rest address"))
175175
176176 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
177177
178178 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
179179
180180 let group1Admin3PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin3PK), "Can't get kGroup1Admin3PK"))
181181
182182 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
183183
184184 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
185185
186186 let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
187187
188188 func unknownPoolType () = throw("Wrong pool type")
189189
190190
191191 func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
192192
193193
194194 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
195195 then unit
196196 else throw("Only operator can call this function")
197197
198198
199199 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
200200 then true
201201 else (i.callerPublicKey == group1Admin2PK))
202202 then unit
203203 else throw("Only admin group1 can call this function")
204204
205205
206206 func isSelfCall (i) = if ((i.caller == this))
207207 then unit
208208 else throw("Only contract itself can call this function")
209209
210210
211211 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
212212 then unit
213213 else throw("Only land contract can call this function")
214214
215215
216216 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
217217 then unit
218218 else throw("DApp is inactive at this moment")
219219
220220
221221 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
222222 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
223223 else false)
224224 then unit
225225 else throw("DApp is inactive for users at this moment")
226226
227227
228228 func isPoolActive (pool,type) = {
229229 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
230230 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
231231 if (if (WXSFActive)
232232 then poolActive
233233 else false)
234234 then true
235235 else false
236236 }
237237
238238
239239 func accountBalance (assetId) = match assetId {
240240 case id: ByteVector =>
241241 assetBalance(this, id)
242242 case waves: Unit =>
243243 wavesBalance(this).available
244244 case _ =>
245245 throw("Match error")
246246 }
247247
248248
249249 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"))
250250
251251
252252 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
253253 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
254254 if ($isInstanceOf(@, "Int"))
255255 then @
256256 else throw(($getType(@) + " couldn't be cast to Int"))
257257 }, {
258258 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
259259 if ($isInstanceOf(@, "Int"))
260260 then @
261261 else throw(($getType(@) + " couldn't be cast to Int"))
262262 })
263263
264264
265265 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
266266 then getSFPoolBalances(poolAddr)
267267 else if ((type == WX_POOL))
268268 then getWXPoolBalances(poolAddr, aId, bId)
269269 else unknownPoolType()
270270
271271
272272 func getSFPoolData (poolAddr) = {
273273 let $t095909639 = getSFPoolBalances(poolAddr)
274274 if (($t095909639 == $t095909639))
275275 then {
276276 let balB = $t095909639._2
277277 let balA = $t095909639._1
278278 $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"))
279279 }
280280 else throw("Strict value is not equal to itself.")
281281 }
282282
283283
284284 func getWXPoolData (poolAddr) = {
285285 let cfg = {
286286 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
287287 if ($isInstanceOf(@, "List[Any]"))
288288 then @
289289 else throw(($getType(@) + " couldn't be cast to List[Any]"))
290290 }
291291 if ((cfg == cfg))
292292 then {
293293 let aId = valueOrErrorMessage({
294294 let @ = cfg[4]
295295 if ($isInstanceOf(@, "String"))
296296 then @
297297 else unit
298298 }, "Can't get pool A asset id")
299299 let bId = valueOrErrorMessage({
300300 let @ = cfg[5]
301301 if ($isInstanceOf(@, "String"))
302302 then @
303303 else unit
304304 }, "Can't get pool B asset id")
305305 let shareId = valueOrErrorMessage({
306306 let @ = cfg[3]
307307 if ($isInstanceOf(@, "String"))
308308 then @
309309 else unit
310310 }, "Can't get pool LP asset id")
311311 let $t01033610395 = getWXPoolBalances(poolAddr, aId, bId)
312312 if (($t01033610395 == $t01033610395))
313313 then {
314314 let balB = $t01033610395._2
315315 let balA = $t01033610395._1
316316 $Tuple5(aId, bId, balA, balB, shareId)
317317 }
318318 else throw("Strict value is not equal to itself.")
319319 }
320320 else throw("Strict value is not equal to itself.")
321321 }
322322
323323
324324 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
325325 then getSFPoolData(poolAddr)
326326 else if ((type == WX_POOL))
327327 then getWXPoolData(poolAddr)
328328 else unknownPoolType()
329329
330330
331331 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
332332 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
333333 else if ((type == WX_POOL))
334334 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
335335 else unknownPoolType()
336336
337337
338338 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
339339
340340
341341 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
342342
343343
344344 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
345345
346346
347347 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
348348 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
349349 else if ((feeType == CAP_FEE_NO_LOAN))
350350 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
351351 else if ((feeType == LOAN_FEE))
352352 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
353353 else if ((feeType == NO_LOAN_FEE))
354354 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
355355 else if ((feeType == NO_FEE))
356356 then 0
357357 else throw("Wrong fee type")
358358
359359
360360 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(CONF, kSFFarmingAddr), "Can't get swopfi farming addr")))
361361
362362
363363 func getWXFarmingAddr (poolAddr) = {
364364 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
365365 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
366366 Address(fromBase58String(factroyCfg[1]))
367367 }
368368
369369
370370 func assetIdToStr (assetId) = match assetId {
371371 case id: ByteVector =>
372372 toBase58String(id)
373373 case waves: Unit =>
374374 "WAVES"
375375 case _ =>
376376 throw("Not Asset id")
377377 }
378378
379379
380380 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
381381 then unit
382382 else fromBase58String(assetId)
383383
384384
385385 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
386386 then 8
387387 else match assetInfo(fromBase58String(assetId)) {
388388 case asset: Asset =>
389389 asset.decimals
390390 case _ =>
391391 throw("Can't find asset")
392392 }
393393
394394
395395 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
396396
397397
398398 func getAssetsPrice (assetIds) = {
399399 func getPrices (a,assetId) = {
400400 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
401401 (a :+ assetPrice)
402402 }
403403
404404 let $l = assetIds
405405 let $s = size($l)
406406 let $acc0 = nil
407407 func $f0_1 ($a,$i) = if (($i >= $s))
408408 then $a
409409 else getPrices($a, $l[$i])
410410
411411 func $f0_2 ($a,$i) = if (($i >= $s))
412412 then $a
413413 else throw("List size exceeds 50")
414414
415415 $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)
416416 }
417417
418418
419419 func getSharePrice (shareId) = {
420420 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
421421 let poolAddr = Address(fromBase58String(pool))
422422 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
423423 let $t01338413449 = getPoolData(poolAddr, pType)
424424 let aId = $t01338413449._1
425425 let bId = $t01338413449._2
426426 let aBalance = $t01338413449._3
427427 let bBalance = $t01338413449._4
428428 let prices = getAssetsPrice([aId, bId])
429429 let dPriceA = prices[0]
430430 let dPriceB = prices[1]
431431 if (if ((0 > dPriceA))
432432 then true
433433 else (0 > dPriceB))
434434 then -1
435435 else {
436436 let shareSupply = getShareSupply(poolAddr, pType, shareId)
437437 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
438438 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
439439 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
440440 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
441441 fraction(sum, sharePrecision, shareSupply)
442442 }
443443 }
444444
445445
446446 func getSharePrices (shareIds) = {
447447 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
448448
449449 let $l = shareIds
450450 let $s = size($l)
451451 let $acc0 = nil
452452 func $f0_1 ($a,$i) = if (($i >= $s))
453453 then $a
454454 else getPrices($a, $l[$i])
455455
456456 func $f0_2 ($a,$i) = if (($i >= $s))
457457 then $a
458458 else throw("List size exceeds 20")
459459
460460 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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)
461461 }
462462
463463
464464 func getCursEntries (aId,bId,shareId,wAmounts) = {
465465 let assetsPrices = getAssetsPrice([aId, bId])
466466 let sharePrice = getSharePrice(shareId)
467467 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
468468 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
469469 }
470470
471471
472472 func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
473473 then {
474474 let repl = {
475475 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
476476 if ($isInstanceOf(@, "List[Any]"))
477477 then @
478478 else throw(($getType(@) + " couldn't be cast to List[Any]"))
479479 }
480480 if ((repl == repl))
481481 then $Tuple5({
482482 let @ = repl[3]
483483 if ($isInstanceOf(@, "Int"))
484484 then @
485485 else throw(($getType(@) + " couldn't be cast to Int"))
486486 }, {
487487 let @ = repl[4]
488488 if ($isInstanceOf(@, "Int"))
489489 then @
490490 else throw(($getType(@) + " couldn't be cast to Int"))
491491 }, {
492492 let @ = repl[1]
493493 if ($isInstanceOf(@, "Int"))
494494 then @
495495 else throw(($getType(@) + " couldn't be cast to Int"))
496496 }, assetIdToStr(repl[2]), {
497497 let @ = repl[0]
498498 if ($isInstanceOf(@, "Int"))
499499 then @
500500 else throw(($getType(@) + " couldn't be cast to Int"))
501501 })
502502 else throw("Strict value is not equal to itself.")
503503 }
504504 else if ((pType == WX_POOL))
505505 then {
506506 let $t01500715273 = $Tuple2(split({
507507 let @ = invoke(wxRest, "poolEvaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
508508 if ($isInstanceOf(@, "String"))
509509 then @
510510 else throw(($getType(@) + " couldn't be cast to String"))
511511 }, "__"), split({
512512 let @ = invoke(wxRest, "poolEvaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
513513 if ($isInstanceOf(@, "String"))
514514 then @
515515 else throw(($getType(@) + " couldn't be cast to String"))
516516 }, "__"))
517517 if (($t01500715273 == $t01500715273))
518518 then {
519519 let evalPutInB = $t01500715273._2
520520 let evalPutInA = $t01500715273._1
521521 let lpInA = parseIntValue(evalPutInA[1])
522522 let lpInB = parseIntValue(evalPutInB[1])
523523 if ((lpInB > lpInA))
524524 then {
525525 let pmt = parseIntValue(evalPutInA[8])
526526 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
527527 }
528528 else {
529529 let pmt = parseIntValue(evalPutInB[7])
530530 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
531531 }
532532 }
533533 else throw("Strict value is not equal to itself.")
534534 }
535535 else unknownPoolType()
536536
537537
538538 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
539539 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
540540 if ((pType == SF_POOL))
541541 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
542542 else if ((pType == WX_POOL))
543543 then invoke(poolAddr, "put", [1000000, false], payments)
544544 else unknownPoolType()
545545 }
546546
547547
548548 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
549549 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
550550 if ((pType == SF_POOL))
551551 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
552552 else if ((pType == WX_POOL))
553553 then {
554554 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
555555 then "putOneTknV2"
556556 else "putOneTkn"
557557 invoke(poolAddr, fc, [0, false], payments)
558558 }
559559 else unknownPoolType()
560560 }
561561
562562
563563 func stakeLP (pool,pType,shareId,amount,stakeToMarket) = {
564564 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
565565 if (stakeToMarket)
566566 then invoke(pMarketAddr, "supply", nil, payments)
567567 else if ((pType == SF_POOL))
568568 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
569569 else if ((pType == WX_POOL))
570570 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
571571 else unknownPoolType()
572572 }
573573
574574
575575 func unstakeLP (pool,pType,shareId,amount,fromMarket) = {
576576 let $t01717217633 = if (fromMarket)
577577 then $Tuple3(pMarketAddr, "withdraw", [shareId, amount])
578578 else if ((pType == SF_POOL))
579579 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
580580 else if ((pType == WX_POOL))
581581 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
582582 else unknownPoolType()
583583 let farmAddr = $t01717217633._1
584584 let fName = $t01717217633._2
585585 let params = $t01717217633._3
586586 let inv = invoke(farmAddr, fName, params, nil)
587587 if ((inv == inv))
588588 then amount
589589 else throw("Strict value is not equal to itself.")
590590 }
591591
592592
593593 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
594594 let poolAddr = Address(fromBase58String(pool))
595595 let feeScale6 = 1000000
596596 let fee = getIntegerValue(poolAddr, kSFPoolFee)
597597 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
598598 let $t01805518361 = if ((assetTokenToGet == assetIdA))
599599 then {
600600 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
601601 $Tuple2(amountToPay, assetIdB)
602602 }
603603 else {
604604 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
605605 $Tuple2(amountToPay, assetIdA)
606606 }
607607 let amountToPay = $t01805518361._1
608608 let assetToPay = $t01805518361._2
609609 $Tuple2(assetToPay, amountToPay)
610610 }
611611
612612
613613 func getWXSwapFees (pool) = {
614614 let poolAddr = addressFromStringValue(pool)
615615 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
616616 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
617617 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
618618 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
619619 case fees: (Int, Int) =>
620620 $Tuple2(fees._1, fees._2)
621621 case _ =>
622622 $Tuple2(poolFeeDefault, protocolFeeDefault)
623623 }
624624 }
625625
626626
627627 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
628628 let $t01910119140 = getWXSwapFees(pool)
629629 let pFee = $t01910119140._1
630630 let prFee = $t01910119140._2
631631 let feeScale = toBigInt(100000000)
632632 let $t01918019488 = if ((assetTokenToGet == assetIdA))
633633 then {
634634 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
635635 $Tuple2(amountToPay, assetIdB)
636636 }
637637 else {
638638 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
639639 $Tuple2(amountToPay, assetIdA)
640640 }
641641 let amountToPay = $t01918019488._1
642642 let assetToPay = $t01918019488._2
643643 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
644644 $Tuple2(assetToPay, amountToPayWithFee)
645645 }
646646
647647
648648 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
649649 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
650650 if (if ((pType == SF_POOL))
651651 then true
652652 else (poolFB != ""))
653653 then {
654654 let $t01992920141 = if ((poolFB == ""))
655655 then $Tuple3(balA, balB, pool)
656656 else {
657657 let $t02003520108 = getSFPoolBalances(addressFromStringValue(poolFB))
658658 let sfBalA = $t02003520108._1
659659 let sfBalB = $t02003520108._2
660660 $Tuple3(sfBalA, sfBalB, poolFB)
661661 }
662662 let pBalA = $t01992920141._1
663663 let pBalB = $t01992920141._2
664664 let exPool = $t01992920141._3
665665 let $t02014620272 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
666666 let assetToPay = $t02014620272._1
667667 let amountToPay = $t02014620272._2
668668 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
669669 }
670670 else if ((pType == WX_POOL))
671671 then {
672672 let $t02047420596 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
673673 let assetToPay = $t02047420596._1
674674 let amountToPay = $t02047420596._2
675675 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
676676 }
677677 else unknownPoolType()
678678 }
679679
680680
681681 func exchangeDirectlyNoLim (pType,pool,amountTokenEx,assetTokenToEx,assetTokenToGet) = {
682682 let balBefore = accountBalance(assetIdFromStr(assetTokenToGet))
683683 if ((balBefore == balBefore))
684684 then {
685685 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
686686 let inv = if (if ((pType == SF_POOL))
687687 then true
688688 else (poolFB != ""))
689689 then {
690690 let exPool = if ((poolFB == ""))
691691 then pool
692692 else poolFB
693- invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [1]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
693+ invoke(addressFromStringValue(exPool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
694694 }
695695 else if ((pType == WX_POOL))
696696 then invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
697697 else unknownPoolType()
698698 if ((inv == inv))
699699 then {
700700 let balAfter = accountBalance(assetIdFromStr(assetTokenToGet))
701701 if ((balAfter == balAfter))
702702 then (balAfter - balBefore)
703703 else throw("Strict value is not equal to itself.")
704704 }
705705 else throw("Strict value is not equal to itself.")
706706 }
707707 else throw("Strict value is not equal to itself.")
708708 }
709709
710710
711711 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
712- let $t02172322194 = if ((pType == SF_POOL))
712+ let $t02172522196 = if ((pType == SF_POOL))
713713 then {
714714 let inv = {
715715 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
716716 if ($isInstanceOf(@, "List[Any]"))
717717 then @
718718 else throw(($getType(@) + " couldn't be cast to List[Any]"))
719719 }
720720 if ((inv == inv))
721721 then $Tuple2({
722722 let @ = inv[0]
723723 if ($isInstanceOf(@, "Int"))
724724 then @
725725 else throw(($getType(@) + " couldn't be cast to Int"))
726726 }, {
727727 let @ = inv[1]
728728 if ($isInstanceOf(@, "Int"))
729729 then @
730730 else throw(($getType(@) + " couldn't be cast to Int"))
731731 })
732732 else throw("Strict value is not equal to itself.")
733733 }
734734 else if ((pType == WX_POOL))
735735 then {
736736 let inv = split({
737737 let @ = invoke(wxRest, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
738738 if ($isInstanceOf(@, "String"))
739739 then @
740740 else throw(($getType(@) + " couldn't be cast to String"))
741741 }, "__")
742742 if ((inv == inv))
743743 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
744744 else throw("Strict value is not equal to itself.")
745745 }
746746 else unknownPoolType()
747- let amountA = $t02172322194._1
748- let amountB = $t02172322194._2
747+ let amountA = $t02172522196._1
748+ let amountB = $t02172522196._2
749749 $Tuple2(amountA, amountB)
750750 }
751751
752752
753753 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
754754 then {
755755 let balBefore = accountBalance(SWOPID)
756756 if ((balBefore == balBefore))
757757 then {
758758 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
759759 if ((inv == inv))
760760 then {
761761 let balAfter = accountBalance(SWOPID)
762762 $Tuple2((balAfter - balBefore), SWOPID)
763763 }
764764 else throw("Strict value is not equal to itself.")
765765 }
766766 else throw("Strict value is not equal to itself.")
767767 }
768768 else if ((pType == WX_POOL))
769769 then {
770- let $t02256222641 = getWXPoolData(addressFromStringValue(pool))
771- let aId = $t02256222641._1
772- let bId = $t02256222641._2
773- let aBal = $t02256222641._3
774- let bBal = $t02256222641._4
775- let lpId = $t02256222641._5
770+ let $t02256422643 = getWXPoolData(addressFromStringValue(pool))
771+ let aId = $t02256422643._1
772+ let bId = $t02256422643._2
773+ let aBal = $t02256422643._3
774+ let bBal = $t02256422643._4
775+ let lpId = $t02256422643._5
776776 let balBefore = accountBalance(WXID)
777777 if ((balBefore == balBefore))
778778 then {
779779 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
780780 if ((inv == inv))
781781 then {
782782 let balAfter = accountBalance(WXID)
783783 $Tuple2((balAfter - balBefore), WXID)
784784 }
785785 else throw("Strict value is not equal to itself.")
786786 }
787787 else throw("Strict value is not equal to itself.")
788788 }
789789 else unknownPoolType()
790790
791791
792792 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId,stakeMarket) = {
793793 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
794794 if ((lpBalanceBefore == lpBalanceBefore))
795795 then {
796796 let poolAddr = addressFromStringValue(pool)
797- let $t02326623688 = if (if ((pmtA > 0))
797+ let $t02326823690 = if (if ((pmtA > 0))
798798 then (pmtB > 0)
799799 else false)
800800 then {
801- let $t02333223454 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
802- let pmtInA = $t02333223454._1
803- let pmtInB = $t02333223454._2
804- let change = $t02333223454._3
805- let changeId = $t02333223454._4
801+ let $t02333423456 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
802+ let pmtInA = $t02333423456._1
803+ let pmtInB = $t02333423456._2
804+ let change = $t02333423456._3
805+ let changeId = $t02333423456._4
806806 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
807807 if ((inv == inv))
808808 then $Tuple2(change, changeId)
809809 else throw("Strict value is not equal to itself.")
810810 }
811811 else if ((pmtA > 0))
812812 then $Tuple2(pmtA, aId)
813813 else if ((pmtB > 0))
814814 then $Tuple2(pmtB, bId)
815815 else throw("pmts must be > 0")
816- let change = $t02326623688._1
817- let changeId = $t02326623688._2
816+ let change = $t02326823690._1
817+ let changeId = $t02326823690._2
818818 let inv = if ((change > 0))
819819 then replenishOneTokenByType(poolAddr, pType, change, changeId)
820820 else nil
821821 if ((inv == inv))
822822 then {
823823 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
824824 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
825825 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
826826 let userShareForStake = (totalStaked - axlyFeeAmount)
827827 if ((0 >= userShareForStake))
828828 then throw("amount of staked sharetokens must be > 0")
829829 else {
830830 let invLP = stakeLP(pool, pType, LPId, userShareForStake, stakeMarket)
831831 if ((invLP == invLP))
832832 then $Tuple2(userShareForStake, axlyFeeAmount)
833833 else throw("Strict value is not equal to itself.")
834834 }
835835 }
836836 else throw("Strict value is not equal to itself.")
837837 }
838838 else throw("Strict value is not equal to itself.")
839839 }
840840
841841
842842 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan,stakeToMarket) = {
843843 let totalAmount = getPoolTotalShare(pool)
844844 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
845845 let totalAmountMarket = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
846846 let totalAmountMarketLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
847847 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
848848 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
849849 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
850850 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
851- let $t02514325968 = if (withLoan)
851+ let $t02514525970 = if (withLoan)
852852 then if (stakeToMarket)
853853 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
854854 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
855855 else if (stakeToMarket)
856856 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
857857 else $Tuple2(poolInterestNoLoan, nil)
858- let curPoolInterest = $t02514325968._1
859- let adEntry = $t02514325968._2
858+ let curPoolInterest = $t02514525970._1
859+ let adEntry = $t02514525970._2
860860 ([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)
861861 }
862862
863863
864864 func listToInt (a,item) = (a :+ parseIntValue(item))
865865
866866
867867 func directSwopfiCPMM (rArgs,tokenTo) = {
868868 let dApp = addressFromStringValue(rArgs[1])
869869 let pmtP = split(rArgs[2], "|")
870870 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
871871 if ((tokenBalanceBefore == tokenBalanceBefore))
872872 then {
873873 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
874874 let minToRecive = rArgs[3]
875875 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
876876 if ((inv == inv))
877877 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
878878 else throw("Strict value is not equal to itself.")
879879 }
880880 else throw("Strict value is not equal to itself.")
881881 }
882882
883883
884884 func directRoutingSwopfi (rArgs,tokenTo) = {
885885 let dApp = addressFromStringValue(rArgs[1])
886886 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
887887 if ((tokenBalanceBefore == tokenBalanceBefore))
888888 then {
889889 let pmt = {
890890 let pmtP = split(rArgs[2], "|")
891891 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
892892 }
893893 let args = {
894894 let eArgs = split(rArgs[3], "|")
895895 let exchangers = split(eArgs[0], ",")
896896 let exchangersType = split(eArgs[1], ",")
897897 let args1 = {
898898 let $l = split(eArgs[2], ",")
899899 let $s = size($l)
900900 let $acc0 = nil
901901 func $f0_1 ($a,$i) = if (($i >= $s))
902902 then $a
903903 else listToInt($a, $l[$i])
904904
905905 func $f0_2 ($a,$i) = if (($i >= $s))
906906 then $a
907907 else throw("List size exceeds 3")
908908
909909 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
910910 }
911911 let args2 = {
912912 let $l = split(eArgs[3], ",")
913913 let $s = size($l)
914914 let $acc0 = nil
915915 func $f1_1 ($a,$i) = if (($i >= $s))
916916 then $a
917917 else listToInt($a, $l[$i])
918918
919919 func $f1_2 ($a,$i) = if (($i >= $s))
920920 then $a
921921 else throw("List size exceeds 3")
922922
923923 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
924924 }
925925 let routingAssetsKeys = split(eArgs[4], ",")
926926 let minToRecive = parseIntValue(eArgs[5])
927927 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
928928 }
929929 let inv = invoke(dApp, "routingTrade", args, pmt)
930930 if ((inv == inv))
931931 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
932932 else throw("Strict value is not equal to itself.")
933933 }
934934 else throw("Strict value is not equal to itself.")
935935 }
936936
937937
938938 func capitalize (pool,pType,tokenId,tokenAmount,AId,BId,balA,balB,shareId) = if (if ((tokenId != AId))
939939 then (tokenId != BId)
940940 else false)
941941 then throw("Wrong asset")
942942 else {
943943 let totalShareAmount = getPoolTotalShare(pool)
944944 if ((totalShareAmount == 0))
945945 then $Tuple2([ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))], 0)
946946 else {
947947 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
948948 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
949949 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, (totalShareAmount - totalMarketAmount))
950950 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
951951 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
952952 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
953953 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
954954 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
955- let $t02888528985 = if ((tokenId == AId))
955+ let $t02888728987 = if ((tokenId == AId))
956956 then $Tuple2((tokenAmount - axlyFee), 0)
957957 else $Tuple2(0, (tokenAmount - axlyFee))
958- let pmtA = $t02888528985._1
959- let pmtB = $t02888528985._2
960- let $t02898829099 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
961- let stakedAmount = $t02898829099._1
962- let nf = $t02898829099._2
958+ let pmtA = $t02888728987._1
959+ let pmtB = $t02888728987._2
960+ let $t02899029101 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
961+ let stakedAmount = $t02899029101._1
962+ let nf = $t02899029101._2
963963 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
964964 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
965965 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
966966 let stakedNoLoan = (stakedAmount - stakedLoan)
967967 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
968968 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
969969 else 0
970970 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
971971 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
972972 else 0
973973 $Tuple2([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))], stakedAmount)
974974 }
975975 }
976976
977977
978978 func capitalizePuzzleMarket (pool,pType,shareId) = {
979979 let totalShareAmount = getPoolTotalShare(pool)
980980 let marketBalance = assetBalance(pMarketAddr, fromBase58String(shareId))
981981 if ((marketBalance == marketBalance))
982982 then {
983983 let marketAvailable = {
984984 let @ = invoke(pMarketRestAddr, "assetSupplyByAddressREADONLY", [toString(pMarketAddr), shareId, toString(this)], nil)
985985 if ($isInstanceOf(@, "Int"))
986986 then @
987987 else throw(($getType(@) + " couldn't be cast to Int"))
988988 }
989989 if ((marketAvailable == marketAvailable))
990990 then {
991991 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
992992 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
993993 if (if ((totalMarketAmount == 0))
994994 then (marketAvailable > 0)
995995 else false)
996996 then {
997997 let unstakedAmount = unstakeLP(pool, pType, shareId, marketAvailable, true)
998998 if ((unstakedAmount == unstakedAmount))
999999 then if ((marketBalance > unstakedAmount))
10001000 then $Tuple2([ScriptTransfer(moneyBox, unstakedAmount, fromBase58String(shareId))], 0)
10011001 else $Tuple2(nil, 0)
10021002 else throw("Strict value is not equal to itself.")
10031003 }
10041004 else {
10051005 let capAmount = (marketAvailable - totalMarketAmount)
10061006 if ((0 >= capAmount))
10071007 then $Tuple2(nil, 0)
10081008 else {
10091009 let marketLoanPercent = fraction(totalMarketAmountWithLoan, SCALE8, totalMarketAmount)
10101010 let tokensMarketForFeeLoan = fraction(capAmount, marketLoanPercent, SCALE8)
10111011 let tokensMarketForForFeeNoLoan = (capAmount - tokensMarketForFeeLoan)
10121012 let axlyMarketFeeLoan = fraction(tokensMarketForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10131013 let axlyMarketFeeNoLoan = fraction(tokensMarketForForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10141014 let axlyMarketFee = (axlyMarketFeeLoan + axlyMarketFeeNoLoan)
10151015 if ((axlyMarketFee > marketBalance))
10161016 then $Tuple2(nil, 0)
10171017 else {
10181018 let stakedMarketAmount = (capAmount - axlyMarketFee)
10191019 let stakedMarketLoan = fraction(stakedMarketAmount, marketLoanPercent, SCALE8)
10201020 let stakedMarketNoLoan = (stakedMarketAmount - stakedMarketLoan)
10211021 let curPoolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
10221022 let curPoolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
10231023 let newInterestMarketLoan = if ((totalMarketAmountWithLoan > 0))
10241024 then (curPoolInterestMarketLoan + fraction(stakedMarketLoan, SCALE10, totalMarketAmountWithLoan))
10251025 else 0
10261026 let newInterestMarketNoLoan = if (((totalMarketAmount - totalMarketAmountWithLoan) > 0))
10271027 then (curPoolInterestMarketNoLoan + fraction(stakedMarketNoLoan, SCALE10, (totalMarketAmount - totalMarketAmountWithLoan)))
10281028 else 0
10291029 let unstakedAmount = unstakeLP(pool, pType, shareId, axlyMarketFee, true)
10301030 if ((unstakedAmount == unstakedAmount))
10311031 then $Tuple2([IntegerEntry((pool + kPoolInterestMarketLoan), newInterestMarketLoan), IntegerEntry((pool + kPoolInterestMarketNoLoan), newInterestMarketNoLoan), IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount + stakedMarketAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan + stakedMarketLoan)), ScriptTransfer(moneyBox, axlyMarketFee, assetIdFromStr(shareId))], stakedMarketAmount)
10321032 else throw("Strict value is not equal to itself.")
10331033 }
10341034 }
10351035 }
10361036 }
10371037 else throw("Strict value is not equal to itself.")
10381038 }
10391039 else throw("Strict value is not equal to itself.")
10401040 }
10411041
10421042
10431043 func userCanWithdrawShareCalc (user,pool,posId,borrowed,isMarketPos) = {
10441044 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
10451045 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
10461046 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
10471047 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
10481048 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
10491049 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
10501050 let poolInterest = if (borrowed)
10511051 then if (isMarketPos)
10521052 then poolInterestMarketLoan
10531053 else poolInterestLoan
10541054 else if (isMarketPos)
10551055 then poolInterestMarketNoLoan
10561056 else poolInterestNoLoan
10571057 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
10581058 }
10591059
10601060
10611061 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
10621062 let feeType = if (isBorrowed)
10631063 then STOPLOSS_LOAN
10641064 else STOPLOSS_FEE_NO_LOAN
10651065 if (stopLoss)
10661066 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
10671067 else 0
10681068 }
10691069
10701070
10711071 func withdrawToUser (user,pool,posId,stopLoss,withdrawToken) = {
10721072 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
10731073 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
10741074 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
10751075 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed, fromMarket)
10761076 let poolTotalShare = getPoolTotalShare(pool)
10771077 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
10781078 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
10791079 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
10801080 let userAddr = Address(fromBase58String(user))
10811081 let poolAddr = Address(fromBase58String(pool))
10821082 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1083- let $t03515035222 = getPoolData(poolAddr, pType)
1084- let idAStr = $t03515035222._1
1085- let idBStr = $t03515035222._2
1086- let balA = $t03515035222._3
1087- let balB = $t03515035222._4
1088- let shareId = $t03515035222._5
1089- let $t03522535292 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1090- let idA = $t03522535292._1
1091- let idB = $t03522535292._2
1083+ let $t03515235224 = getPoolData(poolAddr, pType)
1084+ let idAStr = $t03515235224._1
1085+ let idBStr = $t03515235224._2
1086+ let balA = $t03515235224._3
1087+ let balB = $t03515235224._4
1088+ let shareId = $t03515235224._5
1089+ let $t03522735294 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1090+ let idA = $t03522735294._1
1091+ let idB = $t03522735294._2
10921092 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
10931093 let cBalABefore = accountBalance(idA)
10941094 if ((cBalABefore == cBalABefore))
10951095 then {
10961096 let cBalBBefore = accountBalance(idB)
10971097 if ((cBalBBefore == cBalBBefore))
10981098 then {
10991099 let inv = if ((pType == SF_POOL))
11001100 then {
11011101 let inv = unstakeLP(pool, pType, shareId, stopLossFee, fromMarket)
11021102 if ((inv == inv))
11031103 then invoke(poolAddr, "callFunction", ["withdraw", [toString((userCanWithdraw - stopLossFee))]], nil)
11041104 else throw("Strict value is not equal to itself.")
11051105 }
11061106 else if ((pType == WX_POOL))
11071107 then {
11081108 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee), fromMarket)
11091109 if ((inv == inv))
11101110 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
11111111 else throw("Strict value is not equal to itself.")
11121112 }
11131113 else unknownPoolType()
11141114 if ((inv == inv))
11151115 then {
11161116 let cBalAAfter = accountBalance(idA)
11171117 if ((cBalAAfter == cBalAAfter))
11181118 then {
11191119 let cBalBAfter = accountBalance(idB)
11201120 if ((cBalBAfter == cBalBAfter))
11211121 then {
1122- let $t03602736116 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1123- let tokensAmountA = $t03602736116._1
1124- let tokensAmountB = $t03602736116._2
1125- let $t03611937355 = if (isBorrowed)
1122+ let $t03602936118 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1123+ let tokensAmountA = $t03602936118._1
1124+ let tokensAmountB = $t03602936118._2
1125+ let $t03612137357 = if (isBorrowed)
11261126 then {
11271127 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
11281128 let debt = {
11291129 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
11301130 if ($isInstanceOf(@, "Int"))
11311131 then @
11321132 else throw(($getType(@) + " couldn't be cast to Int"))
11331133 }
11341134 if ((debt == debt))
11351135 then {
11361136 let amountToGetEx = if (if ((borrowAsset == idAStr))
11371137 then (debt > tokensAmountA)
11381138 else false)
11391139 then (debt - tokensAmountA)
11401140 else if (if ((borrowAsset == idBStr))
11411141 then (debt > tokensAmountB)
11421142 else false)
11431143 then (debt - tokensAmountB)
11441144 else 0
11451145 let exInv = if ((amountToGetEx > 0))
11461146 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
11471147 else nil
11481148 if ((exInv == exInv))
11491149 then {
11501150 let cBalAAfterRepay = accountBalance(idA)
11511151 if ((cBalAAfterRepay == cBalAAfterRepay))
11521152 then {
11531153 let cBalBAfterRepay = accountBalance(idB)
11541154 if ((cBalBAfterRepay == cBalBAfterRepay))
11551155 then {
11561156 let closeDbtInv = if ((debt > 0))
11571157 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
11581158 else 0
11591159 if ((closeDbtInv == closeDbtInv))
11601160 then if ((borrowAsset == idAStr))
11611161 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
11621162 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
11631163 else throw("Strict value is not equal to itself.")
11641164 }
11651165 else throw("Strict value is not equal to itself.")
11661166 }
11671167 else throw("Strict value is not equal to itself.")
11681168 }
11691169 else throw("Strict value is not equal to itself.")
11701170 }
11711171 else throw("Strict value is not equal to itself.")
11721172 }
11731173 else $Tuple2(tokensAmountA, tokensAmountB)
1174- let toUserA = $t03611937355._1
1175- let toUserB = $t03611937355._2
1174+ let toUserA = $t03612137357._1
1175+ let toUserB = $t03612137357._2
11761176 let poolTotalLoanEntries = if (isBorrowed)
11771177 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
11781178 else nil
11791179 let poolTotalMarketEntries = if (fromMarket)
11801180 then ([IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userCanWithdraw))] ++ (if (isBorrowed)
11811181 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
11821182 else nil))
11831183 else nil
1184- let $t03776838163 = if (if ((withdrawToken == idAStr))
1184+ let $t03777038165 = if (if ((withdrawToken == idAStr))
11851185 then (toUserB > 0)
11861186 else false)
11871187 then {
11881188 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserB, idBStr, idAStr)
11891189 if ((amtGet == amtGet))
11901190 then $Tuple2((toUserA + amtGet), 0)
11911191 else throw("Strict value is not equal to itself.")
11921192 }
11931193 else if (if ((withdrawToken == idBStr))
11941194 then (toUserA > 0)
11951195 else false)
11961196 then {
11971197 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserA, idAStr, idBStr)
11981198 if ((amtGet == amtGet))
11991199 then $Tuple2(0, (toUserB + amtGet))
12001200 else throw("Strict value is not equal to itself.")
12011201 }
12021202 else $Tuple2(toUserA, toUserB)
1203- let toUserACalc = $t03776838163._1
1204- let toUserBCalc = $t03776838163._2
1203+ let toUserACalc = $t03777038165._1
1204+ let toUserBCalc = $t03777038165._2
12051205 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, toUserACalc, idA), ScriptTransfer(userAddr, toUserBCalc, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
12061206 $Tuple2(entries, [toUserACalc, toUserBCalc])
12071207 }
12081208 else throw("Strict value is not equal to itself.")
12091209 }
12101210 else throw("Strict value is not equal to itself.")
12111211 }
12121212 else throw("Strict value is not equal to itself.")
12131213 }
12141214 else throw("Strict value is not equal to itself.")
12151215 }
12161216 else throw("Strict value is not equal to itself.")
12171217 }
12181218
12191219
12201220 func parseRequest (requestId) = {
12211221 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
12221222 let user = request[0]
12231223 let pool = request[1]
12241224 let pmtA = parseIntValue(request[2])
12251225 let AId = request[3]
12261226 let pmtB = parseIntValue(request[4])
12271227 let BId = request[5]
12281228 let balA = parseIntValue(request[6])
12291229 let balB = parseIntValue(request[7])
12301230 let shareId = request[8]
12311231 let bwAsset = request[9]
12321232 let bwAmount = parseIntValue(request[10])
12331233 let stakeToMarket = (request[11] == "true")
12341234 $Tuple12(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount, stakeToMarket)
12351235 }
12361236
12371237
12381238 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
12391239 then (borrowId != bId)
12401240 else false)
12411241 then throw("Wrong borrow asset")
12421242 else {
12431243 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
12441244 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
12451245 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
12461246 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
12471247 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1248- let $t04016340260 = if ((borrowId == aId))
1248+ let $t04016540262 = if ((borrowId == aId))
12491249 then $Tuple2(dPriceA, decPrA)
12501250 else $Tuple2(dPriceB, decPrB)
1251- let borrowPrice = $t04016340260._1
1252- let borrowDecPr = $t04016340260._2
1251+ let borrowPrice = $t04016540262._1
1252+ let borrowDecPr = $t04016540262._2
12531253 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
12541254 }
12551255
12561256
12571257 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
12581258 then if ((assetIdToStr(pmts[0].assetId) != AId))
12591259 then throw("Wrong payment asset A")
12601260 else if ((assetIdToStr(pmts[1].assetId) != BId))
12611261 then throw("Wrong payment asset B")
12621262 else $Tuple2(pmts[0].amount, pmts[1].amount)
12631263 else if ((size(pmts) == 1))
12641264 then if ((assetIdToStr(pmts[0].assetId) == AId))
12651265 then $Tuple2(pmts[0].amount, 0)
12661266 else if ((assetIdToStr(pmts[0].assetId) == BId))
12671267 then $Tuple2(0, pmts[0].amount)
12681268 else throw("Wrong payment")
12691269 else throw("One or two payments expected")
12701270
12711271
12721272 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
12731273 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
12741274 if ((0 > pri))
12751275 then (pri * -1)
12761276 else pri
12771277 }
12781278
12791279
12801280 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1281- let $t04126041522 = if (claim)
1281+ let $t04126241524 = if (claim)
12821282 then claimFarmed(pType, pool)
12831283 else {
12841284 let claimedAsset = if ((pType == SF_POOL))
12851285 then SWOPID
12861286 else if ((pType == WX_POOL))
12871287 then WXID
12881288 else unknownPoolType()
12891289 $Tuple2(amount, claimedAsset)
12901290 }
1291- if (($t04126041522 == $t04126041522))
1291+ if (($t04126241524 == $t04126241524))
12921292 then {
1293- let claimAsset = $t04126041522._2
1294- let claimAmount = $t04126041522._1
1293+ let claimAsset = $t04126241524._2
1294+ let claimAmount = $t04126241524._1
12951295 let bal = accountBalance(claimAsset)
12961296 if ((bal == bal))
12971297 then if ((amount > bal))
12981298 then throw("To big amount to exchange")
12991299 else $Tuple2(claimAmount, claimAsset)
13001300 else throw("Strict value is not equal to itself.")
13011301 }
13021302 else throw("Strict value is not equal to itself.")
13031303 }
13041304
13051305
13061306 @Callable(i)
13071307 func getPoolInfoREADONLY (pool) = {
13081308 let poolAddr = addressFromStringValue(pool)
13091309 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1310- let $t04188941979 = getPoolData(Address(fromBase58String(pool)), pType)
1311- let AId = $t04188941979._1
1312- let BId = $t04188941979._2
1313- let balA = $t04188941979._3
1314- let balB = $t04188941979._4
1315- let shareId = $t04188941979._5
1310+ let $t04189141981 = getPoolData(Address(fromBase58String(pool)), pType)
1311+ let AId = $t04189141981._1
1312+ let BId = $t04189141981._2
1313+ let balA = $t04189141981._3
1314+ let balB = $t04189141981._4
1315+ let shareId = $t04189141981._5
13161316 let shareSupply = getShareSupply(poolAddr, pType, shareId)
13171317 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
13181318 }
13191319
13201320
13211321
13221322 @Callable(i)
13231323 func getShareAssetPriceREADONLY (shareId) = {
13241324 let sharePrices = getSharePrice(shareId)
13251325 $Tuple2(nil, sharePrices)
13261326 }
13271327
13281328
13291329
13301330 @Callable(i)
13311331 func getUserPositionShareAmountREADONLY (user,posNum) = {
13321332 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
13331333 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
13341334 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum) + kUserPositionInPMarket)), false)
13351335 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0), fromMarket)
13361336 $Tuple2(nil, userCanWithdraw)
13371337 }
13381338
13391339
13401340
13411341 @Callable(i)
13421342 func getUserPositionREADONLY (user,pools,posNum) = {
13431343 func userPos (a,pool) = {
1344- let $t04297743047 = a
1345- let wAmountsA = $t04297743047._1
1346- let wAmountsB = $t04297743047._2
1347- let debts = $t04297743047._3
1348- let eqWAmountsA = $t04297743047._4
1349- let eqWAmountsB = $t04297743047._5
1350- let index = $t04297743047._6
1344+ let $t04297943049 = a
1345+ let wAmountsA = $t04297943049._1
1346+ let wAmountsB = $t04297943049._2
1347+ let debts = $t04297943049._3
1348+ let eqWAmountsA = $t04297943049._4
1349+ let eqWAmountsB = $t04297943049._5
1350+ let index = $t04297943049._6
13511351 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
13521352 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
13531353 else {
13541354 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1355- let $t04332643416 = getPoolData(Address(fromBase58String(pool)), pType)
1356- let AId = $t04332643416._1
1357- let BId = $t04332643416._2
1358- let balA = $t04332643416._3
1359- let balB = $t04332643416._4
1360- let shareId = $t04332643416._5
1355+ let $t04332843418 = getPoolData(Address(fromBase58String(pool)), pType)
1356+ let AId = $t04332843418._1
1357+ let BId = $t04332843418._2
1358+ let balA = $t04332843418._3
1359+ let balB = $t04332843418._4
1360+ let shareId = $t04332843418._5
13611361 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
13621362 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
13631363 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1364- let $t04376643886 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1365- let wAmountA = $t04376643886._1
1366- let wAmountB = $t04376643886._2
1364+ let $t04376843888 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1365+ let wAmountA = $t04376843888._1
1366+ let wAmountB = $t04376843888._2
13671367 if ((borrowAmount > 0))
13681368 then {
13691369 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
13701370 let debt = {
13711371 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
13721372 if ($isInstanceOf(@, "Int"))
13731373 then @
13741374 else throw(($getType(@) + " couldn't be cast to Int"))
13751375 }
13761376 if ((debt == debt))
13771377 then {
13781378 let amountToGetEx = if (if ((borrowAsset == AId))
13791379 then (debt > wAmountA)
13801380 else false)
13811381 then (debt - wAmountA)
13821382 else if (if ((borrowAsset == BId))
13831383 then (debt > wAmountB)
13841384 else false)
13851385 then (debt - wAmountB)
13861386 else 0
13871387 let amountToPay = if ((amountToGetEx > 0))
13881388 then if ((pType == SF_POOL))
13891389 then {
13901390 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
13911391 ex._2
13921392 }
13931393 else if ((pType == WX_POOL))
13941394 then {
13951395 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
13961396 ex._2
13971397 }
13981398 else unknownPoolType()
13991399 else 0
1400- let $t04479845017 = if ((borrowAsset == AId))
1400+ let $t04480045019 = if ((borrowAsset == AId))
14011401 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
14021402 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1403- let eqWAmountA = $t04479845017._1
1404- let eqWAmountB = $t04479845017._2
1403+ let eqWAmountA = $t04480045019._1
1404+ let eqWAmountB = $t04480045019._2
14051405 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
14061406 }
14071407 else throw("Strict value is not equal to itself.")
14081408 }
14091409 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
14101410 }
14111411 }
14121412
1413- let $t04527245383 = {
1413+ let $t04527445385 = {
14141414 let $l = pools
14151415 let $s = size($l)
14161416 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
14171417 func $f0_1 ($a,$i) = if (($i >= $s))
14181418 then $a
14191419 else userPos($a, $l[$i])
14201420
14211421 func $f0_2 ($a,$i) = if (($i >= $s))
14221422 then $a
14231423 else throw("List size exceeds 20")
14241424
14251425 $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)
14261426 }
1427- let wAmountsA = $t04527245383._1
1428- let wAmountsB = $t04527245383._2
1429- let debts = $t04527245383._3
1430- let eqWAmountsA = $t04527245383._4
1431- let eqWAmountsB = $t04527245383._5
1427+ let wAmountsA = $t04527445385._1
1428+ let wAmountsB = $t04527445385._2
1429+ let debts = $t04527445385._3
1430+ let eqWAmountsA = $t04527445385._4
1431+ let eqWAmountsB = $t04527445385._5
14321432 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
14331433 }
14341434
14351435
14361436
14371437 @Callable(i)
14381438 func replenish (pool,leverage,borrowId,stakeToMarket) = valueOrElse(isActiveForUsers(), {
14391439 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
14401440 if (!(isPoolActive(pool, pType)))
14411441 then throw("Pool not active at this moment")
14421442 else if (if ((100 > leverage))
14431443 then true
14441444 else (leverage > 300))
14451445 then throw("Leverage can't be <100 and >300")
14461446 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
14471447 then (leverage > 100)
14481448 else false)
14491449 then throw("You can't borrow in this pool")
14501450 else if (if (stakeToMarket)
14511451 then !(valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false))
14521452 else false)
14531453 then throw("This pool can't stake to puzzle market")
14541454 else {
1455- let $t04614246232 = getPoolData(Address(fromBase58String(pool)), pType)
1456- let AId = $t04614246232._1
1457- let BId = $t04614246232._2
1458- let balA = $t04614246232._3
1459- let balB = $t04614246232._4
1460- let shareId = $t04614246232._5
1455+ let $t04614446234 = getPoolData(Address(fromBase58String(pool)), pType)
1456+ let AId = $t04614446234._1
1457+ let BId = $t04614446234._2
1458+ let balA = $t04614446234._3
1459+ let balB = $t04614446234._4
1460+ let shareId = $t04614446234._5
14611461 if (if ((borrowId != AId))
14621462 then (borrowId != BId)
14631463 else false)
14641464 then throw("Wrong borrow asset")
14651465 else {
1466- let $t04631346372 = parseReplenishPmts(i.payments, AId, BId)
1467- let pmtA = $t04631346372._1
1468- let pmtB = $t04631346372._2
1466+ let $t04631546374 = parseReplenishPmts(i.payments, AId, BId)
1467+ let pmtA = $t04631546374._1
1468+ let pmtB = $t04631546374._2
14691469 let user = toString(i.caller)
14701470 let newPosNum = getNewUserPositionNumber(user)
14711471 if ((leverage > 100))
14721472 then {
14731473 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
14741474 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount), toString(stakeToMarket)], ",")
14751475 let newRequestId = {
14761476 let @ = invoke(this, "createNewRequest", [request], nil)
14771477 if ($isInstanceOf(@, "Int"))
14781478 then @
14791479 else throw(($getType(@) + " couldn't be cast to Int"))
14801480 }
14811481 if ((newRequestId == newRequestId))
14821482 then {
14831483 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
14841484 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
14851485 if ((inv == inv))
14861486 then {
14871487 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1488- let $t04739547489 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1489- if (($t04739547489 == $t04739547489))
1488+ let $t04739747491 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1489+ if (($t04739747491 == $t04739747491))
14901490 then {
1491- let newBalB = $t04739547489._2
1492- let newBalA = $t04739547489._1
1491+ let newBalB = $t04739747491._2
1492+ let newBalA = $t04739747491._1
14931493 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1494- let $t04755947674 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1495- let wAmountA = $t04755947674._1
1496- let wAmountB = $t04755947674._2
1494+ let $t04756147676 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1495+ let wAmountA = $t04756147676._1
1496+ let wAmountB = $t04756147676._2
14971497 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
14981498 }
14991499 else throw("Strict value is not equal to itself.")
15001500 }
15011501 else throw("Strict value is not equal to itself.")
15021502 }
15031503 else throw("Strict value is not equal to itself.")
15041504 }
15051505 else {
1506- let $t04772747857 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1507- if (($t04772747857 == $t04772747857))
1506+ let $t04772947859 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1507+ if (($t04772947859 == $t04772947859))
15081508 then {
1509- let axlyFee = $t04772747857._2
1510- let userStaked = $t04772747857._1
1511- let $t04786347957 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1512- if (($t04786347957 == $t04786347957))
1509+ let axlyFee = $t04772947859._2
1510+ let userStaked = $t04772947859._1
1511+ let $t04786547959 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1512+ if (($t04786547959 == $t04786547959))
15131513 then {
1514- let newBalB = $t04786347957._2
1515- let newBalA = $t04786347957._1
1514+ let newBalB = $t04786547959._2
1515+ let newBalA = $t04786547959._1
15161516 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1517- let $t04802748142 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1518- let wAmountA = $t04802748142._1
1519- let wAmountB = $t04802748142._2
1517+ let $t04802948144 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1518+ let wAmountA = $t04802948144._1
1519+ let wAmountB = $t04802948144._2
15201520 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
15211521 }
15221522 else throw("Strict value is not equal to itself.")
15231523 }
15241524 else throw("Strict value is not equal to itself.")
15251525 }
15261526 }
15271527 }
15281528 })
15291529
15301530
15311531
15321532 @Callable(i)
15331533 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
15341534 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
15351535 if (!(isPoolActive(pool, pType)))
15361536 then throw("Pool not active at this moment")
15371537 else withdrawToUser(toString(i.caller), pool, toString(posId), false, "")
15381538 })
15391539
15401540
15411541
15421542 @Callable(i)
15431543 func withdrawOneToken (pool,posId,tokenId) = valueOrElse(isActiveForUsers(), {
15441544 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
15451545 if (!(isPoolActive(pool, pType)))
15461546 then throw("Pool not active at this moment")
15471547 else withdrawToUser(toString(i.caller), pool, toString(posId), false, tokenId)
15481548 })
15491549
15501550
15511551
15521552 @Callable(i)
15531553 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
15541554 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
15551555 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
15561556 if (!(isPoolActive(poolId, pType)))
15571557 then throw("Pool not active at this moment")
15581558 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
15591559 then throw("There are no user position")
15601560 else if ((0 >= price))
15611561 then throw("Price must be greater than 0")
15621562 else if ((price > tokenOraclePrice))
15631563 then throw("Price must be less than current token price")
15641564 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
15651565 })
15661566
15671567
15681568
15691569 @Callable(i)
15701570 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
15711571 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
15721572 if (!(isPoolActive(poolId, pType)))
15731573 then throw("Pool not active at this moment")
15741574 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
15751575 then throw("No entry")
15761576 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
15771577 })
15781578
15791579
15801580
15811581 @Callable(i)
15821582 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
15831583 then throw("Already inited")
15841584 else if (!(isDefined(addressFromString(moneyBoxAddr))))
15851585 then throw("moneyBoxAddr is not correct address")
15861586 else if (!(isDefined(addressFromString(sfFarmingAddr))))
15871587 then throw("sfFarmingAddr is not correct address")
15881588 else if (!(isDefined(addressFromString(lendAddr))))
15891589 then throw("lendAddr is not correct address")
15901590 else if (!(isDefined(addressFromString(priceOracleAddr))))
15911591 then throw("priceOracleAddr is not correct address")
15921592 else if (!(isDefined(addressFromString(keeperExContract))))
15931593 then throw("keeperExContract is not correct address")
15941594 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
15951595 then throw("swopAssetId is not correct asset id")
15961596 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
15971597 then throw("swopAssetId is not correct asset id")
15981598 else if ((size(fromBase58String(operatorPubKey)) != 32))
15991599 then throw("operatorPubKey is not correct")
16001600 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
16011601 then throw("group1Admin1PubKey is not correct")
16021602 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
16031603 then throw("group1Admin2PubKey is not correct")
16041604 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
16051605 then throw("group2Admin1PubKey is not correct")
16061606 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
16071607 then throw("group2Admin2PubKey is not correct")
16081608 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)])
16091609
16101610
16111611
16121612 @Callable(i)
16131613 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
16141614 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
16151615 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
16161616 })
16171617
16181618
16191619
16201620 @Callable(i)
16211621 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1622- let $t05336253481 = parseRequest(requestId)
1623- let user = $t05336253481._1
1624- let pool = $t05336253481._2
1625- let pmtA = $t05336253481._3
1626- let AId = $t05336253481._4
1627- let pmtB = $t05336253481._5
1628- let BId = $t05336253481._6
1629- let balA = $t05336253481._7
1630- let balB = $t05336253481._8
1631- let shareId = $t05336253481._9
1632- let bwAsset = $t05336253481._10
1633- let bwAmount = $t05336253481._11
1634- let stakeToMarket = $t05336253481._12
1622+ let $t05336453483 = parseRequest(requestId)
1623+ let user = $t05336453483._1
1624+ let pool = $t05336453483._2
1625+ let pmtA = $t05336453483._3
1626+ let AId = $t05336453483._4
1627+ let pmtB = $t05336453483._5
1628+ let BId = $t05336453483._6
1629+ let balA = $t05336453483._7
1630+ let balB = $t05336453483._8
1631+ let shareId = $t05336453483._9
1632+ let bwAsset = $t05336453483._10
1633+ let bwAmount = $t05336453483._11
1634+ let stakeToMarket = $t05336453483._12
16351635 if ((size(i.payments) != 1))
16361636 then throw("Wrong payment size")
16371637 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
16381638 then true
16391639 else (i.payments[0].amount != bwAmount))
16401640 then throw("Wrong payment")
16411641 else {
1642- let $t05367153771 = if ((AId == bwAsset))
1642+ let $t05367353773 = if ((AId == bwAsset))
16431643 then $Tuple2((pmtA + bwAmount), pmtB)
16441644 else $Tuple2(pmtA, (pmtB + bwAmount))
1645- let pmtAllA = $t05367153771._1
1646- let pmtAllB = $t05367153771._2
1645+ let pmtAllA = $t05367353773._1
1646+ let pmtAllB = $t05367353773._2
16471647 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1648- let $t05385353983 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1649- let userStaked = $t05385353983._1
1650- let axlyFee = $t05385353983._2
1648+ let $t05385553985 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1649+ let userStaked = $t05385553985._1
1650+ let axlyFee = $t05385553985._2
16511651 let posNum = getNewUserPositionNumber(user)
16521652 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
16531653 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1654- let $t05435854473 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1655- let wAmountA = $t05435854473._1
1656- let wAmountB = $t05435854473._2
1654+ let $t05436054475 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1655+ let wAmountA = $t05436054475._1
1656+ let wAmountB = $t05436054475._2
16571657 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
16581658 }
16591659 }))
16601660
16611661
16621662
16631663 @Callable(i)
16641664 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
16651665 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
16661666 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
16671667 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1668- let $t05510655196 = getPoolData(Address(fromBase58String(pool)), pType)
1669- let AId = $t05510655196._1
1670- let BId = $t05510655196._2
1671- let balA = $t05510655196._3
1672- let balB = $t05510655196._4
1673- let shareId = $t05510655196._5
1668+ let $t05510855198 = getPoolData(Address(fromBase58String(pool)), pType)
1669+ let AId = $t05510855198._1
1670+ let BId = $t05510855198._2
1671+ let balA = $t05510855198._3
1672+ let balB = $t05510855198._4
1673+ let shareId = $t05510855198._5
16741674 let amount = unstakeLP(pool, pType, shareId, liquidateAmount, fromMarket)
16751675 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
16761676 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
16771677 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0), fromMarket)
16781678 if ((liquidateAmount > userCanWithdraw))
16791679 then throw("You can't liquidate more than user have")
16801680 else if ((borrowAmount == 0))
16811681 then throw("You can't liquidate position without borrow")
16821682 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))]
16831683 }))
16841684
16851685
16861686
16871687 @Callable(i)
16881688 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
16891689 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
16901690 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
16911691 if ((tokenOraclePrice > stopLossPrice))
16921692 then throw("Token price greater stop loss price")
16931693 else {
16941694 let res = withdrawToUser(user, pool, toString(posId), true, "")
16951695 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
16961696 }
16971697 }))
16981698
16991699
17001700
17011701 @Callable(i)
17021702 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
17031703 let pType = getStringValue(this, (kPool + pool))
17041704 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
17051705 let poolAddr = Address(fromBase58String(pool))
1706- let $t05724557311 = getPoolData(poolAddr, pType)
1707- let AId = $t05724557311._1
1708- let BId = $t05724557311._2
1709- let balA = $t05724557311._3
1710- let balB = $t05724557311._4
1711- let shareId = $t05724557311._5
1706+ let $t05724757313 = getPoolData(poolAddr, pType)
1707+ let AId = $t05724757313._1
1708+ let BId = $t05724757313._2
1709+ let balA = $t05724757313._3
1710+ let balB = $t05724757313._4
1711+ let shareId = $t05724757313._5
17121712 let totalShareAmount = getPoolTotalShare(pool)
17131713 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1714- let $t05744058271 = if ((amountToExchange > 0))
1714+ let $t05744258273 = if ((amountToExchange > 0))
17151715 then {
1716- let $t05750257604 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1717- if (($t05750257604 == $t05750257604))
1716+ let $t05750457606 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1717+ if (($t05750457606 == $t05750457606))
17181718 then {
1719- let claimedAsset = $t05750257604._2
1720- let claimedAmount = $t05750257604._1
1719+ let claimedAsset = $t05750457606._2
1720+ let claimedAmount = $t05750457606._1
17211721 let rArgs = split(route, "__")
17221722 let exchangedAmount = if ((amountToExchange > 0))
17231723 then if ((rArgs[0] == "directSwopfiCPMM"))
17241724 then directSwopfiCPMM(rArgs, tokenToId)
17251725 else if ((rArgs[0] == "routingSwopfi"))
17261726 then directRoutingSwopfi(rArgs, tokenToId)
17271727 else throw("Wrong route")
17281728 else 0
17291729 if ((exchangedAmount == exchangedAmount))
17301730 then {
17311731 let newChange = ((claimedAmount + change) - amountToExchange)
17321732 let changeEntry = if ((newChange >= 0))
17331733 then [IntegerEntry((pool + kPoolCapChange), newChange)]
17341734 else nil
1735- let $t05810158211 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1736- let capEnterise = $t05810158211._1
1737- let staked = $t05810158211._2
1735+ let $t05810358213 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1736+ let capEnterise = $t05810358213._1
1737+ let staked = $t05810358213._2
17381738 $Tuple2((capEnterise ++ changeEntry), staked)
17391739 }
17401740 else throw("Strict value is not equal to itself.")
17411741 }
17421742 else throw("Strict value is not equal to itself.")
17431743 }
17441744 else $Tuple2(nil, 0)
1745- let capEnterise = $t05744058271._1
1746- let staked = $t05744058271._2
1747- let $t05827458391 = if (isMarketPool)
1745+ let capEnterise = $t05744258273._1
1746+ let staked = $t05744258273._2
1747+ let $t05827658393 = if (isMarketPool)
17481748 then capitalizePuzzleMarket(pool, pType, shareId)
17491749 else $Tuple2(nil, 0)
1750- let marketCapEnteris = $t05827458391._1
1751- let stakedMarket = $t05827458391._2
1750+ let marketCapEnteris = $t05827658393._1
1751+ let stakedMarket = $t05827658393._2
17521752 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
17531753 }))
17541754
17551755
17561756
17571757 @Callable(i)
17581758 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
17591759 let pType = getStringValue(this, (kPool + pool))
17601760 let poolAddr = Address(fromBase58String(pool))
1761- let $t05882658892 = getPoolData(poolAddr, pType)
1762- let AId = $t05882658892._1
1763- let BId = $t05882658892._2
1764- let balA = $t05882658892._3
1765- let balB = $t05882658892._4
1766- let shareId = $t05882658892._5
1767- let $t05889558993 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1768- if (($t05889558993 == $t05889558993))
1761+ let $t05882858894 = getPoolData(poolAddr, pType)
1762+ let AId = $t05882858894._1
1763+ let BId = $t05882858894._2
1764+ let balA = $t05882858894._3
1765+ let balB = $t05882858894._4
1766+ let shareId = $t05882858894._5
1767+ let $t05889758995 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1768+ if (($t05889758995 == $t05889758995))
17691769 then {
1770- let claimedAsset = $t05889558993._2
1771- let claimedAmount = $t05889558993._1
1770+ let claimedAsset = $t05889758995._2
1771+ let claimedAmount = $t05889758995._1
17721772 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance), AId, BId, balA, balB, shareId)
17731773 }
17741774 else throw("Strict value is not equal to itself.")
17751775 }))
17761776
17771777
17781778
17791779 @Callable(i)
17801780 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow,canPMarket) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
17811781 then (type != WX_POOL)
17821782 else false)
17831783 then throw("Wrong type")
17841784 else if (if ((poolType != CPMM))
17851785 then (poolType != FLAT)
17861786 else false)
17871787 then throw("Wrong pool type")
17881788 else {
1789- let $t05960059694 = getPoolData(Address(fromBase58String(poolAddr)), type)
1790- let aId = $t05960059694._1
1791- let bId = $t05960059694._2
1792- let aBal = $t05960059694._3
1793- let bBal = $t05960059694._4
1794- let shareId = $t05960059694._5
1789+ let $t05960259696 = getPoolData(Address(fromBase58String(poolAddr)), type)
1790+ let aId = $t05960259696._1
1791+ let bId = $t05960259696._2
1792+ let aBal = $t05960259696._3
1793+ let bBal = $t05960259696._4
1794+ let shareId = $t05960259696._5
17951795 if ((0 > inFeeNoLoan))
17961796 then throw("inFeeNoLoan must be greater than 0")
17971797 else if ((0 > inFeeLoan))
17981798 then throw("inFeeLoan must be greater than 0")
17991799 else if ((0 > capFeeNoLoan))
18001800 then throw("capFeeNoLoan must be greater than 0")
18011801 else if ((0 > capFeeWithLoan))
18021802 then throw("capFeeWithLoan must be greater than 0")
18031803 else if ((0 > stoplossFeeNoLoan))
18041804 then throw("stoplossFeeNoLoan must be greater than 0")
18051805 else if ((0 > stoplossFeeWithLoan))
18061806 then throw("stoplossFeeWithLoan must be greater than 0")
18071807 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)]
18081808 }))
18091809
18101810
18111811
18121812 @Callable(i)
18131813 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
18141814 then throw(("Can't find pool with addr " + poolAddr))
18151815 else if ((0 > inFeeNoLoan))
18161816 then throw("inFeeNoLoan must be greater than 0")
18171817 else if ((0 > inFeeLoan))
18181818 then throw("inFeeLoan must be greater than 0")
18191819 else if ((0 > capFeeNoLoan))
18201820 then throw("capFeeNoLoan must be greater than 0")
18211821 else if ((0 > capFeeWithLoan))
18221822 then throw("capFeeWithLoan must be greater than 0")
18231823 else if ((0 > stoplossFeeNoLoan))
18241824 then throw("stoplossFeeNoLoan must be greater than 0")
18251825 else if ((0 > stoplossFeeWithLoan))
18261826 then throw("stoplossFeeWithLoan must be greater than 0")
18271827 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)]))
18281828
18291829
18301830
18311831 @Callable(i)
18321832 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
18331833 then throw("dApp already active")
18341834 else [BooleanEntry(kActive, true)])
18351835
18361836
18371837
18381838 @Callable(i)
18391839 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
18401840 then throw("dApp already shutdown")
18411841 else [BooleanEntry(kActive, false)])
18421842
18431843
18441844
18451845 @Callable(i)
18461846 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
18471847 then throw("dApp already active for users")
18481848 else [BooleanEntry(kActiveUsers, true)])
18491849
18501850
18511851
18521852 @Callable(i)
18531853 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
18541854 then throw("dApp already shutdown for users")
18551855 else [BooleanEntry(kActiveUsers, false)])
18561856
18571857
18581858
18591859 @Callable(i)
18601860 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
18611861 then throw("SWOPFI already active")
18621862 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
18631863
18641864
18651865
18661866 @Callable(i)
18671867 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
18681868 then throw("SWOPFI already shutdown")
18691869 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
18701870
18711871
18721872
18731873 @Callable(i)
18741874 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
18751875 then throw("WX already active")
18761876 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
18771877
18781878
18791879
18801880 @Callable(i)
18811881 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
18821882 then throw("WX already shutdown")
18831883 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
18841884
18851885
18861886
18871887 @Callable(i)
18881888 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
18891889 then throw("Unknown pool")
18901890 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
18911891 then throw("Pool already active")
18921892 else [BooleanEntry((pool + kPoolActive), true)])
18931893
18941894
18951895
18961896 @Callable(i)
18971897 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
18981898 then throw("Unknown pool")
18991899 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
19001900 then throw("Pool already shutdown")
19011901 else [BooleanEntry((pool + kPoolActive), false)])
19021902
19031903
19041904 @Verifier(tx)
19051905 func verify () = {
19061906 let multiSignedByAdmins = {
19071907 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
19081908 then 1
19091909 else 0
19101910 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group1Admin2PK))
19111911 then 1
19121912 else 0
19131913 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], group1Admin3PK))
19141914 then 1
19151915 else 0
19161916 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
19171917 }
19181918 multiSignedByAdmins
19191919 }
19201920

github/deemru/w8io/3ef1775 
320.07 ms