tx · 9xen3XhdXaU3SrhxQvgjmu2C2FMfQ4mick9keM1Ce2N4

3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS:  -0.54000000 Waves

2023.10.20 15:24 [2806897] smart account 3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS > SELF 0.00000000 Waves

{ "type": 13, "id": "9xen3XhdXaU3SrhxQvgjmu2C2FMfQ4mick9keM1Ce2N4", "fee": 54000000, "feeAssetId": null, "timestamp": 1697804708150, "version": 2, "chainId": 84, "sender": "3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS", "senderPublicKey": "HP8sssVq1866F7CaPQJwgFrt6fsqhQjKwM84cL1wjD2a", "proofs": [ "5hRJTuunkcEj7ZgYihehgdMuz4avNswBkZRjKpQwJt6mvyzgsCUWX1iXUda4R2fAnAKmNsMzMoqTiMXzu3TdzaE4", "5NDtNC7n4gEqr6oXqhK9GzcrVrQL19Txnx3u2KoSaqys5GSzyjtvCFWW9E1134S6xQn3UhGWgkx1En7o1118QfAb" ], "script": "base64:BgKiAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEgcKBQgICAEEEgUKAwgEARIMCgoICAgBAQEBAQEEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCIgBAARDT05GCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgZjb25maWcAB1NGX1BPT0wCAlNGAAdXWF9QT09MAgJXWAAEQ1BNTQIEY3BtbQAERkxBVAIEZmxhdAAPQ0FQX0ZFRV9OT19MT0FOAgljYXBOb0xvYW4ADENBUF9GRUVfTE9BTgIHY2FwTG9hbgAUU1RPUExPU1NfRkVFX05PX0xPQU4CDnN0b3BMb3NzTm9Mb2FuAA1TVE9QTE9TU19MT0FOAgxzdG9wTG9zc0xvYW4ACExPQU5fRkVFAgRsb2FuAAtOT19MT0FOX0ZFRQIGbm9Mb2FuAAZOT19GRUUCBW5vRmVlAAZTQ0FMRTgAgMLXLwAHU0NBTEUxMACAyK+gJQAHU0NBTEUxNgkAtgIBAICAhP6m3uERAApGRUVfU0NBTEU2AMCEPQAUa1NGUG9vbEFBc3NldEJhbGFuY2UCD0FfYXNzZXRfYmFsYW5jZQAUa1NGUG9vbEJBc3NldEJhbGFuY2UCD0JfYXNzZXRfYmFsYW5jZQAPa1NGUG9vbEFBc3NldElkAgpBX2Fzc2V0X2lkAA9rU0ZQb29sQkFzc2V0SWQCCkJfYXNzZXRfaWQADmtTRlBvb2xTaGFyZUlkAg5zaGFyZV9hc3NldF9pZAASa1NGUG9vbFNoYXJlU3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkACmtTRlBvb2xGZWUCCmNvbW1pc3Npb24ADWtVc2VyUG9zaXRpb24CDV91c2VyUG9zaXRpb24AEWtVc2VyUG9zaXRpb25Qb29sAhFfdXNlclBvc2l0aW9uUG9vbAARa1VzZXJCb3Jyb3dBbW91bnQCGV91c2VyUG9zaXRpb25Cb3Jyb3dBbW91bnQAEmtVc2VyQm9ycm93QXNzZXRJZAIaX3VzZXJQb3NpdGlvbkJvcnJvd0Fzc2V0SWQAEGtVc2VyUG9zaXRpb25OdW0CE191c2VyUG9zaXRpb25OdW1iZXIAFWtVc2VyUG9zaXRpb25JbnRlcmVzdAIVX3VzZXJQb3NpdGlvbkludGVyZXN0AAprUG9vbFRvdGFsAgpfcG9vbFRvdGFsAA5rUG9vbFRvdGFsTG9hbgIOX3Bvb2xUb3RhbExvYW4AEWtQb29sSW50ZXJlc3RMb2FuAhFfcG9vbEludGVyZXN0TG9hbgATa1Bvb2xJbnRlcmVzdE5vTG9hbgITX3Bvb2xJbnRlcmVzdE5vTG9hbgAOa1Bvb2xDYW5Cb3Jyb3cCDl9wb29sQ2FuQm9ycm93ABVrQXhseUluRmVlV2l0aG91dExvYW4CDl9heGx5RmVlTm9Mb2FuABJrQXhseUluRmVlV2l0aExvYW4CEF9heGx5RmVlV2l0aExvYW4AEWtBeGx5Tm9Mb2FuQ2FwRmVlAhFfYXhseUZlZUNhcE5vTG9hbgATa0F4bHlXaXRoTG9hbkNhcEZlZQITX2F4bHlGZWVDYXBXaXRoTG9hbgAWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQIYX2F4bHlGZWVTdG9wbG9zc1dpdGhMb2FuABRrQXhseVN0b3BMb3NzTG9hbkZlZQIWX2F4bHlGZWVTdG9wbG9zc05vTG9hbgAKa1JlcXVlc3RJZAILX3JlcXVlc3RfaWQADGtSZXF1ZXN0SXRlcgINcmVxdWVzdHNfaXRlcgAFa1Bvb2wCBXBvb2xfAAlrUG9vbFR5cGUCCV9wb29sVHlwZQAKa1NoYXJlUG9vbAIMX3Bvb2xTaGFyZUlkAA5rUG9vbENhcENoYW5nZQIOX3Bvb2xDYXBDaGFuZ2UAD2tUb2tlbkxhc3RQcmljZQIKbGFzdF9wcmljZQAOa1ByaWNlSW5PcmFjbGUCB190d2FwNUIAB2tBY3RpdmUCBmFjdGl2ZQAMa0FjdGl2ZVVzZXJzAgthY3RpdmVVc2VycwALa0FjdGl2ZVNGV1gCB19hY3RpdmUAC2tQb29sQWN0aXZlAgtfYWN0aXZlUG9vbAANa1VzZXJTdG9wTG9zcwIJX3N0b3BMb3NzABdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIXX2ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkACWtNb25leUJveAIOYXhseV9tb25leV9ib3gADmtTRkZhcm1pbmdBZGRyAhNzd29wZmlfZmFybWluZ19hZGRyAAxrTGVuZFNlcnZpY2UCEWxlbmRfc2VydmljZV9hZGRyAA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAC2tFeENvbnRyYWN0AhFleGNoYW5nZV9jb250cmFjdAAPa1d4U3dhcENvbnRyYWN0AhB3eF9zd2FwX2NvbnRyYWN0AAdrV3hSZXN0Agx3eF9yZXN0X2FkZHIAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAPa0dyb3VwMUFkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQtrRXhDb250cmFjdAIcTm8gZXhjaGFuZ2UgY29udHJhY3QgYWRkcmVzcwAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGd3hSZXN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUHa1d4UmVzdAISTm8gd3ggcmVzdCBhZGRyZXNzAAZTV09QSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tTd29wSWQCCk5vIHN3b3AgaWQABFdYSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFBWtXeElkAghObyB3eCBpZAAOZ3JvdXAxQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tHcm91cDFBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjFQSwAOZ3JvdXAxQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tHcm91cDFBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjJQSwAOZ3JvdXAyQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAOZ3JvdXAyQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAKb3BlcmF0b3JQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa09wZXJhdG9yQ2FsbFBLAhRDYW4ndCBnZXQgb3BlcmF0b3JQSwEPdW5rbm93blBvb2xUeXBlAAkAAgECD1dyb25nIHBvb2wgdHlwZQEOZ2V0TGVuZFNydkFkZHIACQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa0xlbmRTZXJ2aWNlAhtDYW4ndCBnZXQgbGVuZCBzZXJ2aWNlIGFkZHIBDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBAWkDAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4xUEsGCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjJQSwUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIJAQ5nZXRMZW5kU3J2QWRkcgAFBHVuaXQJAAIBAilPbmx5IGxhbmQgY29udHJhY3QgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEIaXNBY3RpdmUAAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYGBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEQaXNBY3RpdmVGb3JVc2VycwADAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgYHBQR1bml0CQACAQIpREFwcCBpcyBpbmFjdGl2ZSBmb3IgdXNlcnMgYXQgdGhpcyBtb21lbnQBDGlzUG9vbEFjdGl2ZQIEcG9vbAR0eXBlBApXWFNGQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEdHlwZQULa0FjdGl2ZVNGV1gGBApwb29sQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGAwMFCldYU0ZBY3RpdmUFCnBvb2xBY3RpdmUHBgcBDmFjY291bnRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHRoaXMFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yARFnZXRTRlBvb2xCYWxhbmNlcwEIcG9vbEFkZHIJAJQKAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQUFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBiYWxhbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xCQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGJhbGFuY2UBEWdldFdYUG9vbEJhbGFuY2VzAwhwb29sQWRkcgNhSWQDYklkCQCUCgIKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2FJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNiSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAEPZ2V0UG9vbEJhbGFuY2VzBAhwb29sQWRkcgR0eXBlA2FJZANiSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgUEdHlwZQUHV1hfUE9PTAkBEWdldFdYUG9vbEJhbGFuY2VzAwUIcG9vbEFkZHIFA2FJZAUDYklkCQEPdW5rbm93blBvb2xUeXBlAAENZ2V0U0ZQb29sRGF0YQEIcG9vbEFkZHIECyR0MDgyNzM4MzIyCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQskdDA4MjczODMyMgULJHQwODI3MzgzMjIEBGJhbEIIBQskdDA4MjczODMyMgJfMgQEYmFsQQgFCyR0MDgyNzM4MzIyAl8xCQCXCgUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEFBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xCQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAUEYmFsQQUEYmFsQgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ5rU0ZQb29sU2hhcmVJZAIYQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IGlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1nZXRXWFBvb2xEYXRhAQhwb29sQWRkcgQDY2ZnCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2NmZwUDY2ZnBANhSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAQDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkBANiSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAUDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBAdzaGFyZUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwADAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIaQ2FuJ3QgZ2V0IHBvb2wgTFAgYXNzZXQgaWQECyR0MDkwMTk5MDc4CQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgULJHQwOTAxOTkwNzgFCyR0MDkwMTk5MDc4BARiYWxCCAULJHQwOTAxOTkwNzgCXzIEBGJhbEEIBQskdDA5MDE5OTA3OAJfMQkAlwoFBQNhSWQFA2JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELZ2V0UG9vbERhdGECCHBvb2xBZGRyBHR5cGUDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBDWdldFNGUG9vbERhdGEBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQENZ2V0V1hQb29sRGF0YQEFCHBvb2xBZGRyCQEPdW5rbm93blBvb2xUeXBlAAEOZ2V0U2hhcmVTdXBwbHkDCHBvb2xBZGRyBHR5cGUHc2hhcmVJZAMJAAACBQR0eXBlBQdTRl9QT09MCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFEmtTRlBvb2xTaGFyZVN1cHBseQIcQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IHN1cHBseQMJAAACBQR0eXBlBQdXWF9QT09MCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUHc2hhcmVJZAINV3JvbmcgU2hhcmVJZAhxdWFudGl0eQkBD3Vua25vd25Qb29sVHlwZQABEWdldFBvb2xUb3RhbFNoYXJlAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAAAARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4AAAEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQR1c2VyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0AAAABAQpnZXRBeGx5RmVlAgRwb29sB2ZlZVR5cGUDCQAAAgUHZmVlVHlwZQUMQ0FQX0ZFRV9MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tBeGx5V2l0aExvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUPQ0FQX0ZFRV9OT19MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtBeGx5Tm9Mb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFCExPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEmtBeGx5SW5GZWVXaXRoTG9hbgMJAAACBQdmZWVUeXBlBQtOT19MT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRVrQXhseUluRmVlV2l0aG91dExvYW4DCQAAAgUHZmVlVHlwZQUGTk9fRkVFAAAJAAIBAg5Xcm9uZyBmZWUgdHlwZQEQZ2V0U0ZGYXJtaW5nQWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUOa1NGRmFybWluZ0FkZHICHUNhbid0IGdldCBzd29wZmkgZmFybWluZyBhZGRyARBnZXRXWEZhcm1pbmdBZGRyAQhwb29sQWRkcgQJZkNvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBApmYWN0cm95Q2ZnCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlmQ29udHJhY3QCESVzX19mYWN0b3J5Q29uZmlnAhhDYW4ndCBnZXQgV1ggZmFjdG9yeSBjZmcCAl9fCQEHQWRkcmVzcwEJANkEAQkAkQMCBQpmYWN0cm95Q2ZnAAEBDGFzc2V0SWRUb1N0cgEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgxOb3QgQXNzZXQgaWQBDmFzc2V0SWRGcm9tU3RyAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpdGlvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOAQ5nZXRBc3NldHNQcmljZQEIYXNzZXRJZHMKAQlnZXRQcmljZXMCAWEHYXNzZXRJZAQKYXNzZXRQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUA////////////AQkAzQgCBQFhBQphc3NldFByaWNlCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgENZ2V0U2hhcmVQcmljZQEHc2hhcmVJZAQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAIgQ2FuJ3QgZmluZCBwb29sIGFkZHIgYnkgc2hhcmUgaWQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDEyMDY3MTIxMzIJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDYUlkCAUNJHQwMTIwNjcxMjEzMgJfMQQDYklkCAUNJHQwMTIwNjcxMjEzMgJfMgQIYUJhbGFuY2UIBQ0kdDAxMjA2NzEyMTMyAl8zBAhiQmFsYW5jZQgFDSR0MDEyMDY3MTIxMzICXzQEBnByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwEB2RQcmljZUEJAJEDAgUGcHJpY2VzAAAEB2RQcmljZUIJAJEDAgUGcHJpY2VzAAEDAwkAZgIAAAUHZFByaWNlQQYJAGYCAAAFB2RQcmljZUIA////////////AQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ5nZXRTaGFyZVByaWNlcwEIc2hhcmVJZHMKAQlnZXRQcmljZXMCAWEHc2hhcmVJZAkAzQgCBQFhCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQKAAIkbAUIc2hhcmVJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQ5nZXRDdXJzRW50cmllcwQDYUlkA2JJZAdzaGFyZUlkCHdBbW91bnRzBAxhc3NldHNQcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBApzaGFyZVByaWNlCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQEBnByaWNlcwkAzggCCQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAAkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAEJAMwIAgkApAMBBQpzaGFyZVByaWNlBQNuaWwFCHdBbW91bnRzCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tUb2tlbkxhc3RQcmljZQkAuQkCBQZwcmljZXMCASwFA25pbAEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCQVwVHlwZQhwb29sQWRkcgRMUElkBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQEcmVwbAoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAiBjYWxjTFBSZXBsZW5pc2hUd29Ub2tlbnNSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUEcG10QQkAzAgCCQCkAwEFBHBtdEIFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFBHJlcGwFBHJlcGwJAJcKBQoAAUAJAJEDAgUEcmVwbAADAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAAEAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkBDGFzc2V0SWRUb1N0cgEJAJEDAgUEcmVwbAACCgABQAkAkQMCBQRyZXBsAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxMzY5MDEzOTQ4CQCUCgIJALUJAgoAAUAJAPwHBAUGd3hSZXN0AiBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQkAzAgCBQRMUElkCQDMCAIFBHBtdEEFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18JALUJAgoAAUAJAPwHBAUGd3hSZXN0Ah9ldmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxMzY5MDEzOTQ4BQ0kdDAxMzY5MDEzOTQ4BApldmFsUHV0SW5CCAUNJHQwMTM2OTAxMzk0OAJfMgQKZXZhbFB1dEluQQgFDSR0MDEzNjkwMTM5NDgCXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUGCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYUlkBQRwbXRBCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNiSWQFBHBtdEIFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMJAMwIAgkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAUIcG9vbEFkZHICA3B1dAkAzAgCAMCEPQkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBAhwb29sQWRkcgVwVHlwZQNwbXQFcG10SWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQVwbXRJZAUDcG10BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhVyZXBsZW5pc2hXaXRoT25lVG9rZW4JAMwIAgkAzAgCAgEwCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZmMDCQAAAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFCWtQb29sVHlwZQIEY3BtbQUERkxBVAILcHV0T25lVGtuVjICCXB1dE9uZVRrbgkA/AcEBQhwb29sQWRkcgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgVzdGFrZQUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQNJHQwMTU3MjYxNjA3NgMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE1NzI2MTYwNzYCXzEEBWZOYW1lCAUNJHQwMTU3MjYxNjA3NgJfMgQGcGFyYW1zCAUNJHQwMTU3MjYxNjA3NgJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxNjQ5ODE2ODA0AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE2NDk4MTY4MDQCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNjQ5ODE2ODA0Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAxNzU0NDE3NTgzCQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAxNzU0NDE3NTgzAl8xBAVwckZlZQgFDSR0MDE3NTQ0MTc1ODMCXzIECGZlZVNjYWxlCQC2AgEAgMLXLwQNJHQwMTc2MjMxNzkzMQMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEIJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxBCQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTc2MjMxNzkzMQJfMQQKYXNzZXRUb1BheQgFDSR0MDE3NjIzMTc5MzECXzIEEmFtb3VudFRvUGF5V2l0aEZlZQkAoAMBCQC9AgQJALYCAQULYW1vdW50VG9QYXkFCGZlZVNjYWxlCQC4AgIFCGZlZVNjYWxlCQC2AgEJAGQCBQVwckZlZQUEcEZlZQUHQ0VJTElORwkAlAoCBQphc3NldFRvUGF5BRJhbW91bnRUb1BheVdpdGhGZWUBEGV4Y2hhbmdlRGlyZWN0bHkIBXBUeXBlBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAZwb29sRkIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBRdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIAAwMJAAACBQVwVHlwZQUHU0ZfUE9PTAYJAQIhPQIFBnBvb2xGQgIABA0kdDAxODM3MjE4NTg0AwkAAAIFBnBvb2xGQgIACQCVCgMFBGJhbEEFBGJhbEIFBHBvb2wEDSR0MDE4NDc4MTg1NTEJARFnZXRTRlBvb2xCYWxhbmNlcwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBnBvb2xGQgQGc2ZCYWxBCAUNJHQwMTg0NzgxODU1MQJfMQQGc2ZCYWxCCAUNJHQwMTg0NzgxODU1MQJfMgkAlQoDBQZzZkJhbEEFBnNmQmFsQgUGcG9vbEZCBAVwQmFsQQgFDSR0MDE4MzcyMTg1ODQCXzEEBXBCYWxCCAUNJHQwMTgzNzIxODU4NAJfMgQGZXhQb29sCAUNJHQwMTgzNzIxODU4NAJfMwQNJHQwMTg1ODkxODcxNQkBEWNhbGNBbW91bnRUb1BheVNGBwUGZXhQb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBXBCYWxBBQVwQmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTg1ODkxODcxNQJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxODU4OTE4NzE1Al8yCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmV4UG9vbAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW91bnRUb2tlblRvR2V0BQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTg5MTcxOTAzOQkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAxODkxNzE5MDM5Al8xBAthbW91bnRUb1BheQgFDSR0MDE4OTE3MTkwMzkCXzIJAPwHBAUOd3hTd2FwQ29udHJhY3QCBHN3YXAJAMwIAgUQYW1vdW50VG9rZW5Ub0dldAkAzAgCBQ9hc3NldFRva2VuVG9HZXQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwJAQ91bmtub3duUG9vbFR5cGUAARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDE5MzI2MTk3OTkDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICF3Bvb2xFdmFsdWF0ZUdldFJFQURPTkxZCQDMCAIFB3NoYXJlSWQJAMwIAgUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFA2ludgUDaW52CQCUCgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2ludgACCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAQHYW1vdW50QQgFDSR0MDE5MzI2MTk3OTkCXzEEB2Ftb3VudEIIBQ0kdDAxOTMyNjE5Nzk5Al8yCQCUCgIFB2Ftb3VudEEFB2Ftb3VudEIBC2NsYWltRmFybWVkAgVwVHlwZQRwb29sAwkAAAIFBXBUeXBlBQdTRl9QT09MBAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFBlNXT1BJRAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQDaW52CQD8BwQJARBnZXRTRkZhcm1pbmdBZGRyAAIFY2xhaW0JAMwIAgUEcG9vbAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQJAJQKAgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUFBlNXT1BJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMjAxNjcyMDI0NgkBDWdldFdYUG9vbERhdGEBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBANhSWQIBQ0kdDAyMDE2NzIwMjQ2Al8xBANiSWQIBQ0kdDAyMDE2NzIwMjQ2Al8yBARhQmFsCAUNJHQwMjAxNjcyMDI0NgJfMwQEYkJhbAgFDSR0MDIwMTY3MjAyNDYCXzQEBGxwSWQIBQ0kdDAyMDE2NzIwMjQ2Al81BAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFBFdYSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wCB2NsYWltV3gJAMwIAgUEbHBJZAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQRXWElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEPcmVwbGVuaXNoQnlUeXBlCgVwVHlwZQRwb29sB2ZlZVR5cGUEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCBExQSWQED2xwQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkAwkAAAIFD2xwQmFsYW5jZUJlZm9yZQUPbHBCYWxhbmNlQmVmb3JlBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQNJHQwMjA4NDQyMTI2NgMDCQBmAgUEcG10QQAACQBmAgUEcG10QgAABwQNJHQwMjA5MTAyMTAzMgkBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFBXBUeXBlBQhwb29sQWRkcgUETFBJZAUEcG10QQUDYUlkBQRwbXRCBQNiSWQFBGJhbEEFBGJhbEIEBnBtdEluQQgFDSR0MDIwOTEwMjEwMzICXzEEBnBtdEluQggFDSR0MDIwOTEwMjEwMzICXzIEBmNoYW5nZQgFDSR0MDIwOTEwMjEwMzICXzMECGNoYW5nZUlkCAUNJHQwMjA5MTAyMTAzMgJfNAQDaW52CQEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBgUIcG9vbEFkZHIFBXBUeXBlBQZwbXRJbkEFA2FJZAUGcG10SW5CBQNiSWQDCQAAAgUDaW52BQNpbnYJAJQKAgUGY2hhbmdlBQhjaGFuZ2VJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAGYCBQRwbXRBAAAJAJQKAgUEcG10QQUDYUlkAwkAZgIFBHBtdEIAAAkAlAoCBQRwbXRCBQNiSWQJAAIBAhBwbXRzIG11c3QgYmUgPiAwBAZjaGFuZ2UIBQ0kdDAyMDg0NDIxMjY2Al8xBAhjaGFuZ2VJZAgFDSR0MDIwODQ0MjEyNjYCXzIEA2ludgMJAGYCBQZjaGFuZ2UAAAkBF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBAUIcG9vbEFkZHIFBXBUeXBlBQZjaGFuZ2UFCGNoYW5nZUlkBQNuaWwDCQAAAgUDaW52BQNpbnYEDmxwQmFsYW5jZUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQEC3RvdGFsU3Rha2VkCQBlAgUObHBCYWxhbmNlQWZ0ZXIFD2xwQmFsYW5jZUJlZm9yZQQNYXhseUZlZUFtb3VudAkAawMFC3RvdGFsU3Rha2VkCQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYEEXVzZXJTaGFyZUZvclN0YWtlCQBlAgULdG90YWxTdGFrZWQFDWF4bHlGZWVBbW91bnQDCQBnAgAABRF1c2VyU2hhcmVGb3JTdGFrZQkAAgECKGFtb3VudCBvZiBzdGFrZWQgc2hhcmV0b2tlbnMgbXVzdCBiZSA+IDAEBWludkxQCQEHc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQRMUElkBRF1c2VyU2hhcmVGb3JTdGFrZQMJAAACBQVpbnZMUAUFaW52TFAJAJQKAgURdXNlclNoYXJlRm9yU3Rha2UFDWF4bHlGZWVBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEHJlcGxlbmlzaEVudHJpZXMIBHBvb2wEdXNlcgxzdGFrZWRBbW91bnQNYXhseUZlZUFtb3VudAZwb3NOdW0Hc2hhcmVJZAR0eXBlCHdpdGhMb2FuBAt0b3RhbEFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQPdG90YWxBbW91bnRMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEDSR0MDIyMTIzMjIzNjEDBQh3aXRoTG9hbgkAlAoCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQBkAgUPdG90YWxBbW91bnRMb2FuBQxzdGFrZWRBbW91bnQJAJQKAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuBQ90b3RhbEFtb3VudExvYW4ED2N1clBvb2xJbnRlcmVzdAgFDSR0MDIyMTIzMjIzNjECXzEEE3RvdGFsU3Rha2VkV2l0aExvYW4IBQ0kdDAyMjEyMzIyMzYxAl8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBQt0b3RhbEFtb3VudAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuBRN0b3RhbFN0YWtlZFdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FDWtVc2VyUG9zaXRpb24FDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QFD2N1clBvb2xJbnRlcmVzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBnBvc051bQURa1VzZXJQb3NpdGlvblBvb2wFBHBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQUGcG9zTnVtCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ1heGx5RmVlQW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAEJbGlzdFRvSW50AgFhBGl0ZW0JAM0IAgUBYQkBDXBhcnNlSW50VmFsdWUBBQRpdGVtARBkaXJlY3RTd29wZmlDUE1NAgVyQXJncwd0b2tlblRvBARkQXBwCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBXJBcmdzAAEEBHBtdFAJALUJAgkAkQMCBQVyQXJncwACAgF8BBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQLbWluVG9SZWNpdmUJAJEDAgUFckFyZ3MAAwQDaW52CQD8BwQFBGRBcHACDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIFC21pblRvUmVjaXZlBQNuaWwFA25pbAUDcG10AwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARNkaXJlY3RSb3V0aW5nU3dvcGZpAgVyQXJncwd0b2tlblRvBARkQXBwCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBXJBcmdzAAEEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDcG10BARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBCQCRAwIFBHBtdFAAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBHBtdFAAAQUDbmlsBARhcmdzBAVlQXJncwkAtQkCCQCRAwIFBXJBcmdzAAMCAXwECmV4Y2hhbmdlcnMJALUJAgkAkQMCBQVlQXJncwAAAgEsBA5leGNoYW5nZXJzVHlwZQkAtQkCCQCRAwIFBWVBcmdzAAECASwEBWFyZ3MxCgACJGwJALUJAgkAkQMCBQVlQXJncwACAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlsaXN0VG9JbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMEBWFyZ3MyCgACJGwJALUJAgkAkQMCBQVlQXJncwADAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlsaXN0VG9JbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMEEXJvdXRpbmdBc3NldHNLZXlzCQC1CQIJAJEDAgUFZUFyZ3MABAIBLAQLbWluVG9SZWNpdmUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVlQXJncwAFCQDMCAIFCmV4Y2hhbmdlcnMJAMwIAgUOZXhjaGFuZ2Vyc1R5cGUJAMwIAgUFYXJnczEJAMwIAgUFYXJnczIJAMwIAgURcm91dGluZ0Fzc2V0c0tleXMJAMwIAgULbWluVG9SZWNpdmUFA25pbAQDaW52CQD8BwQFBGRBcHACDHJvdXRpbmdUcmFkZQUEYXJncwUDcG10AwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQpjYXBpdGFsaXplBARwb29sBXBUeXBlB3Rva2VuSWQLdG9rZW5BbW91bnQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQNJHQwMjQ0NjgyNDUzNAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANBSWQIBQ0kdDAyNDQ2ODI0NTM0Al8xBANCSWQIBQ0kdDAyNDQ2ODI0NTM0Al8yBARiYWxBCAUNJHQwMjQ0NjgyNDUzNAJfMwQEYmFsQggFDSR0MDI0NDY4MjQ1MzQCXzQEB3NoYXJlSWQIBQ0kdDAyNDQ2ODI0NTM0Al81AwMJAQIhPQIFB3Rva2VuSWQFA0FJZAkBAiE9AgUHdG9rZW5JZAUDQklkBwkAAgECC1dyb25nIGFzc2V0BBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sAwkAAAIFEHRvdGFsU2hhcmVBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULdG9rZW5BbW91bnQJANkEAQUHdG9rZW5JZAUDbmlsBBh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQLbG9hblBlcmNlbnQJAGsDBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4FBlNDQUxFOAUQdG90YWxTaGFyZUFtb3VudAQQdG9rZW5zRm9yRmVlTG9hbgkAawMFC3Rva2VuQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BBJ0b2tlbnNGb3JGZWVOb0xvYW4JAGUCBQt0b2tlbkFtb3VudAUQdG9rZW5zRm9yRmVlTG9hbgQLYXhseUZlZUxvYW4JAGsDBRB0b2tlbnNGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQNYXhseUZlZU5vTG9hbgkAawMFEnRva2Vuc0ZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEB2F4bHlGZWUJAGQCBQtheGx5RmVlTG9hbgUNYXhseUZlZU5vTG9hbgQNJHQwMjUyNzkyNTM3OQMJAAACBQd0b2tlbklkBQNBSWQJAJQKAgkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlAAAJAJQKAgAACQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUEBHBtdEEIBQ0kdDAyNTI3OTI1Mzc5Al8xBARwbXRCCAUNJHQwMjUyNzkyNTM3OQJfMgQNJHQwMjUzODIyNTQ4NgkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQZOT19GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAxzdGFrZWRBbW91bnQIBQ0kdDAyNTM4MjI1NDg2Al8xBAJuZggFDSR0MDI1MzgyMjU0ODYCXzIEE2N1clBvb2xJbnRlcmVzdExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgAABBVjdXJQb29sSW50ZXJlc3ROb0xvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAECnN0YWtlZExvYW4JAGsDBQxzdGFrZWRBbW91bnQFC2xvYW5QZXJjZW50BQZTQ0FMRTgEDHN0YWtlZE5vTG9hbgkAZQIFDHN0YWtlZEFtb3VudAUKc3Rha2VkTG9hbgQPbmV3SW50ZXJlc3RMb2FuAwkAZgIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUTY3VyUG9vbEludGVyZXN0TG9hbgkAawMFCnN0YWtlZExvYW4FB1NDQUxFMTAFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAABBFuZXdJbnRlcmVzdE5vTG9hbgMJAGYCCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRVjdXJQb29sSW50ZXJlc3ROb0xvYW4JAGsDBQxzdGFrZWROb0xvYW4FB1NDQUxFMTAJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuBQ9uZXdJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgURbmV3SW50ZXJlc3ROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFEHRvdGFsU2hhcmVBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZAIFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUKc3Rha2VkTG9hbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUHYXhseUZlZQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5JZAUDbmlsCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAUDbmlsARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBHVzZXIEcG9vbAVwb3NJZAhib3Jyb3dlZAQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQMdXNlckludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAQMcG9vbEludGVyZXN0AwUIYm9ycm93ZWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgkAZAIFB3BBbW91bnQJAGsDBQdwQW1vdW50CQBlAgUMcG9vbEludGVyZXN0BQx1c2VySW50ZXJlc3QFB1NDQUxFMTABD2NhbGNTdG9wTG9zc0ZlZQQEcG9vbAppc0JvcnJvd2VkCHN0b3BMb3NzCmxwV2l0aGRyYXcEB2ZlZVR5cGUDBQppc0JvcnJvd2VkBQ1TVE9QTE9TU19MT0FOBRRTVE9QTE9TU19GRUVfTk9fTE9BTgMFCHN0b3BMb3NzCQBrAwUKbHBXaXRoZHJhdwkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2AAABDndpdGhkcmF3VG9Vc2VyBAR1c2VyBHBvb2wFcG9zSWQIc3RvcExvc3MEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24ECmlzQm9ycm93ZWQJAGYCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQAAAAABA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sBQVwb3NJZAUKaXNCb3Jyb3dlZAQOcG9vbFRvdGFsU2hhcmUJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEEnBvb2xUb3RhbFNoYXJlTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBAh1c2VyQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHVzZXIECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAgxVbmtub3duIHBvb2wEDSR0MDI4MDE1MjgwODcJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQGaWRBU3RyCAUNJHQwMjgwMTUyODA4NwJfMQQGaWRCU3RyCAUNJHQwMjgwMTUyODA4NwJfMgQEYmFsQQgFDSR0MDI4MDE1MjgwODcCXzMEBGJhbEIIBQ0kdDAyODAxNTI4MDg3Al80BAdzaGFyZUlkCAUNJHQwMjgwMTUyODA4NwJfNQQNJHQwMjgwOTAyODE1NwkAlAoCCQEOYXNzZXRJZEZyb21TdHIBBQZpZEFTdHIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQlN0cgQDaWRBCAUNJHQwMjgwOTAyODE1NwJfMQQDaWRCCAUNJHQwMjgwOTAyODE1NwJfMgQLc3RvcExvc3NGZWUJAQ9jYWxjU3RvcExvc3NGZWUEBQRwb29sBQppc0JvcnJvd2VkBQhzdG9wTG9zcwUPdXNlckNhbldpdGhkcmF3BAtjQmFsQUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFC2NCYWxBQmVmb3JlBQtjQmFsQUJlZm9yZQQLY0JhbEJCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQtjQmFsQkJlZm9yZQULY0JhbEJCZWZvcmUEA2ludgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CQEJdW5zdGFrZUxQBAUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFC3N0b3BMb3NzRmVlAwkAAAIFA2ludgUDaW52CQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQDaW52CQEJdW5zdGFrZUxQBAUEcG9vbAUFcFR5cGUFB3NoYXJlSWQJAGQCBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlAwkAAAIFA2ludgUDaW52CQD8BwQFCHBvb2xBZGRyAgNnZXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAwkAAAIFA2ludgUDaW52BApjQmFsQUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgUKY0JhbEFBZnRlcgUKY0JhbEFBZnRlcgQKY0JhbEJBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFCmNCYWxCQWZ0ZXIFCmNCYWxCQWZ0ZXIEDSR0MDI4ODUyMjg5NDEJAJQKAgkAZQIFCmNCYWxBQWZ0ZXIFC2NCYWxBQmVmb3JlCQBlAgUKY0JhbEJBZnRlcgULY0JhbEJCZWZvcmUEDXRva2Vuc0Ftb3VudEEIBQ0kdDAyODg1MjI4OTQxAl8xBA10b2tlbnNBbW91bnRCCAUNJHQwMjg4NTIyODk0MQJfMgQNJHQwMjg5NDQzMDE4MAMFCmlzQm9ycm93ZWQEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQEZGVidAoAAUAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIMZ2V0QXNzZXREZWJ0CQDMCAIHCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAGYCBQRkZWJ0BQ10b2tlbnNBbW91bnRBBwkAZQIFBGRlYnQFDXRva2Vuc0Ftb3VudEEDAwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEJTdHIJAGYCBQRkZWJ0BQ10b2tlbnNBbW91bnRCBwkAZQIFBGRlYnQFDXRva2Vuc0Ftb3VudEIAAAQFZXhJbnYDCQBmAgUNYW1vdW50VG9HZXRFeAAACQEQZXhjaGFuZ2VEaXJlY3RseQgFBXBUeXBlBQRwb29sBQZpZEFTdHIFBmlkQlN0cgkAZQIFBGJhbEEFDXRva2Vuc0Ftb3VudEEJAGUCBQRiYWxCBQ10b2tlbnNBbW91bnRCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAUDbmlsAwkAAAIFBWV4SW52BQVleEludgQPY0JhbEFBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgUPY0JhbEFBZnRlclJlcGF5BQ9jQmFsQUFmdGVyUmVwYXkED2NCYWxCQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFD2NCYWxCQWZ0ZXJSZXBheQUPY0JhbEJBZnRlclJlcGF5BAtjbG9zZURidEludgMJAGYCBQRkZWJ0AAAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIIcmVwYXlGb3IJAMwIAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFC2JvcnJvd0Fzc2V0BQRkZWJ0BQNuaWwAAAMJAAACBQtjbG9zZURidEludgULY2xvc2VEYnRJbnYDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAlAoCCQBlAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUFBGRlYnQJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlCQCUCgIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlCQBlAgkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUFBGRlYnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUNdG9rZW5zQW1vdW50QQUNdG9rZW5zQW1vdW50QgQHdG9Vc2VyQQgFDSR0MDI4OTQ0MzAxODACXzEEB3RvVXNlckIIBQ0kdDAyODk0NDMwMTgwAl8yBBRwb29sVG90YWxMb2FuRW50cmllcwMFCmlzQm9ycm93ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCCQBlAgUScG9vbFRvdGFsU2hhcmVMb2FuBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlBQNuaWwFA25pbAQHZW50cmllcwkAzggCCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBRFrVXNlclBvc2l0aW9uUG9vbAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCCQBlAgUOcG9vbFRvdGFsU2hhcmUFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFB3RvVXNlckEFA2lkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgUHdG9Vc2VyQgUDaWRCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQtzdG9wTG9zc0ZlZQkA2QQBBQdzaGFyZUlkBQNuaWwFFHBvb2xUb3RhbExvYW5FbnRyaWVzCQEOZ2V0Q3Vyc0VudHJpZXMEBQZpZEFTdHIFBmlkQlN0cgUHc2hhcmVJZAUDbmlsCQCUCgIFB2VudHJpZXMJAMwIAgUHdG9Vc2VyQQkAzAgCBQd0b1VzZXJCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDHBhcnNlUmVxdWVzdAEJcmVxdWVzdElkBAdyZXF1ZXN0CQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAkArAICAhNObyByZXF1ZXN0IHdpdGggaWQgBQlyZXF1ZXN0SWQCASwEBHVzZXIJAJEDAgUHcmVxdWVzdAAABARwb29sCQCRAwIFB3JlcXVlc3QAAQQEcG10QQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QAAgQDQUlkCQCRAwIFB3JlcXVlc3QAAwQEcG10QgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QABAQDQklkCQCRAwIFB3JlcXVlc3QABQQEYmFsQQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QABgQEYmFsQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QABwQHc2hhcmVJZAkAkQMCBQdyZXF1ZXN0AAgEB2J3QXNzZXQJAJEDAgUHcmVxdWVzdAAJBAhid0Ftb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3JlcXVlc3QACgkAnQoLBQR1c2VyBQRwb29sBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAUHYndBc3NldAUIYndBbW91bnQBEGNhbGNCb3Jyb3dBbW91bnQGBHBtdEEEcG10QgNhSWQDYklkCGxldmVyYWdlCGJvcnJvd0lkAwMJAQIhPQIFCGJvcnJvd0lkBQNhSWQJAQIhPQIFCGJvcnJvd0lkBQNiSWQHCQACAQISV3JvbmcgYm9ycm93IGFzc2V0BAdkUHJpY2VBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYUlkBQ5rUHJpY2VJbk9yYWNsZQQHZFByaWNlQgkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2JJZAUOa1ByaWNlSW5PcmFjbGUEBmRlY1ByQQkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04EBmRlY1ByQgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2JJZAAAAAAFBERPV04EDHBheWRJbkRvbGxhcgkAZAIJAGsDBQdkUHJpY2VBBQRwbXRBBQZkZWNQckEJAGsDBQdkUHJpY2VCBQRwbXRCBQZkZWNQckIEDSR0MDMyMTYyMzIyNTkDCQAAAgUIYm9ycm93SWQFA2FJZAkAlAoCBQdkUHJpY2VBBQZkZWNQckEJAJQKAgUHZFByaWNlQgUGZGVjUHJCBAtib3Jyb3dQcmljZQgFDSR0MDMyMTYyMzIyNTkCXzEEC2JvcnJvd0RlY1ByCAUNJHQwMzIxNjIzMjI1OQJfMgkAawMJAGsDBQxwYXlkSW5Eb2xsYXIJAGUCBQhsZXZlcmFnZQBkAGQFC2JvcnJvd0RlY1ByBQtib3Jyb3dQcmljZQEScGFyc2VSZXBsZW5pc2hQbXRzAwRwbXRzA0FJZANCSWQDCQAAAgkAkAMBBQRwbXRzAAIDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQQMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAEHYXNzZXRJZAUDQklkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBCCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQICQCRAwIFBHBtdHMAAQZhbW91bnQDCQAAAgkAkAMBBQRwbXRzAAEDCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAAAAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQklkCQCUCgIAAAgJAJEDAgUEcG10cwAABmFtb3VudAkAAgECDVdyb25nIHBheW1lbnQJAAIBAhxPbmUgb3IgdHdvIHBheW1lbnRzIGV4cGVjdGVkAQ9jYWxjUHJpY2VJbXBhY3QEBGJhbEEEYmFsQgduZXdCYWxBB25ld0JhbEIEA3ByaQkAaAIJAGUCBQZTQ0FMRTgJAGsDCQBrAwUEYmFsQgUGU0NBTEU4BQRiYWxBBQZTQ0FMRTgJAGsDBQduZXdCYWxCBQZTQ0FMRTgFB25ld0JhbEEAZAMJAGYCAAAFA3ByaQkAaAIFA3ByaQD///////////8BBQNwcmkBEWNsYWltQW5kQ2hlY2tBbW50BQRwb29sBXBUeXBlBWNsYWltBmFtb3VudAZjaGFuZ2UEDSR0MDMzMjU5MzM1MjEDBQVjbGFpbQkBC2NsYWltRmFybWVkAgUFcFR5cGUFBHBvb2wEDGNsYWltZWRBc3NldAMJAAACBQVwVHlwZQUHU0ZfUE9PTAUGU1dPUElEAwkAAAIFBXBUeXBlBQdXWF9QT09MBQRXWElECQEPdW5rbm93blBvb2xUeXBlAAkAlAoCBQZhbW91bnQFDGNsYWltZWRBc3NldAMJAAACBQ0kdDAzMzI1OTMzNTIxBQ0kdDAzMzI1OTMzNTIxBApjbGFpbUFzc2V0CAUNJHQwMzMyNTkzMzUyMQJfMgQLY2xhaW1BbW91bnQIBQ0kdDAzMzI1OTMzNTIxAl8xBANiYWwJAQ5hY2NvdW50QmFsYW5jZQEFCmNsYWltQXNzZXQDCQAAAgUDYmFsBQNiYWwDCQBmAgUGYW1vdW50BQNiYWwJAAIBAhlUbyBiaWcgYW1vdW50IHRvIGV4Y2hhbmdlCQCUCgIFC2NsYWltQW1vdW50BQpjbGFpbUFzc2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuGwFpARNnZXRQb29sSW5mb1JFQURPTkxZAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDMzODg4MzM5NzgJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzM4ODgzMzk3OAJfMQQDQklkCAUNJHQwMzM4ODgzMzk3OAJfMgQEYmFsQQgFDSR0MDMzODg4MzM5NzgCXzMEBGJhbEIIBQ0kdDAzMzg4ODMzOTc4Al80BAdzaGFyZUlkCAUNJHQwMzM4ODgzMzk3OAJfNQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAkAlAoCBQNuaWwJAJgKBgUDQUlkBQNCSWQFB3NoYXJlSWQFBGJhbEEFBGJhbEIFC3NoYXJlU3VwcGx5AWkBGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZAQdzaGFyZUlkBAtzaGFyZVByaWNlcwkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCQCUCgIFA25pbAULc2hhcmVQcmljZXMBaQEiZ2V0VXNlclBvc2l0aW9uU2hhcmVBbW91bnRSRUFET05MWQIEdXNlcgZwb3NOdW0EBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sAhBVbmtub3duIHBvc2l0aW9uBAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sBQZwb3NOdW0JAGYCBQxib3Jyb3dBbW91bnQAAAkAlAoCBQNuaWwFD3VzZXJDYW5XaXRoZHJhdwFpARdnZXRVc2VyUG9zaXRpb25SRUFET05MWQMEdXNlcgVwb29scwZwb3NOdW0KAQd1c2VyUG9zAgFhBHBvb2wEDSR0MDM0ODUxMzQ5MjEFAWEECXdBbW91bnRzQQgFDSR0MDM0ODUxMzQ5MjECXzEECXdBbW91bnRzQggFDSR0MDM0ODUxMzQ5MjECXzIEBWRlYnRzCAUNJHQwMzQ4NTEzNDkyMQJfMwQLZXFXQW1vdW50c0EIBQ0kdDAzNDg1MTM0OTIxAl80BAtlcVdBbW91bnRzQggFDSR0MDM0ODUxMzQ5MjECXzUEBWluZGV4CAUNJHQwMzQ4NTEzNDkyMQJfNgMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUNa1VzZXJQb3NpdGlvbgkAmAoGCQDNCAIFCXdBbW91bnRzQQAACQDNCAIFCXdBbW91bnRzQgAACQDNCAIFBWRlYnRzAAAJAM0IAgULZXFXQW1vdW50c0EAAAkAzQgCBQtlcVdBbW91bnRzQgAACQBkAgUFaW5kZXgAAQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDM1MjAwMzUyOTAJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzUyMDAzNTI5MAJfMQQDQklkCAUNJHQwMzUyMDAzNTI5MAJfMgQEYmFsQQgFDSR0MDM1MjAwMzUyOTACXzMEBGJhbEIIBQ0kdDAzNTIwMDM1MjkwAl80BAdzaGFyZUlkCAUNJHQwMzUyMDAzNTI5MAJfNQQMYm9ycm93QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEWtVc2VyQm9ycm93QW1vdW50AAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wJAJEDAgUGcG9zTnVtBQVpbmRleAkAZgIFDGJvcnJvd0Ftb3VudAAABA0kdDAzNTUwNjM1NjI2CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwQId0Ftb3VudEEIBQ0kdDAzNTUwNjM1NjI2Al8xBAh3QW1vdW50QggFDSR0MDM1NTA2MzU2MjYCXzIDCQBmAgUMYm9ycm93QW1vdW50AAAEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4CQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAZgIFBGRlYnQFCHdBbW91bnRBBwkAZQIFBGRlYnQFCHdBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUDQklkCQBmAgUEZGVidAUId0Ftb3VudEIHCQBlAgUEZGVidAUId0Ftb3VudEIAAAQLYW1vdW50VG9QYXkDCQBmAgUNYW1vdW50VG9HZXRFeAAAAwkAAAIFBXBUeXBlBQdTRl9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVNGBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5V1gHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgkBD3Vua25vd25Qb29sVHlwZQAAAAQNJHQwMzY1MzgzNjc1NwMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQCUCgIJAGUCCQBkAgUId0Ftb3VudEEFDWFtb3VudFRvR2V0RXgFBGRlYnQJAGUCBQh3QW1vdW50QgULYW1vdW50VG9QYXkJAJQKAgkAZQIFCHdBbW91bnRBBQthbW91bnRUb1BheQkAZQIJAGQCBQh3QW1vdW50QgUNYW1vdW50VG9HZXRFeAUEZGVidAQKZXFXQW1vdW50QQgFDSR0MDM2NTM4MzY3NTcCXzEECmVxV0Ftb3VudEIIBQ0kdDAzNjUzODM2NzU3Al8yCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQDNCAIFBWRlYnRzBQRkZWJ0CQDNCAIFC2VxV0Ftb3VudHNBBQplcVdBbW91bnRBCQDNCAIFC2VxV0Ftb3VudHNCBQplcVdBbW91bnRCCQBkAgUFaW5kZXgAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgUFZGVidHMJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCCQBkAgUFaW5kZXgAAQQNJHQwMzcwMTIzNzEyMwoAAiRsBQVwb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJgKBgUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHdXNlclBvcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAl3QW1vdW50c0EIBQ0kdDAzNzAxMjM3MTIzAl8xBAl3QW1vdW50c0IIBQ0kdDAzNzAxMjM3MTIzAl8yBAVkZWJ0cwgFDSR0MDM3MDEyMzcxMjMCXzMEC2VxV0Ftb3VudHNBCAUNJHQwMzcwMTIzNzEyMwJfNAQLZXFXQW1vdW50c0IIBQ0kdDAzNzAxMjM3MTIzAl81CQCUCgIFA25pbAkAlwoFBQl3QW1vdW50c0EFCXdBbW91bnRzQgUFZGVidHMFC2VxV0Ftb3VudHNBBQtlcVdBbW91bnRzQgFpAQlyZXBsZW5pc2gDBHBvb2wIbGV2ZXJhZ2UIYm9ycm93SWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQBmAgBkBQhsZXZlcmFnZQYJAGYCBQhsZXZlcmFnZQCsAgkAAgECH0xldmVyYWdlIGNhbid0IGJlIDwxMDAgYW5kID4zMDADAwkBASEBCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FuQm9ycm93CQBmAgUIbGV2ZXJhZ2UAZAcJAAIBAh1Zb3UgY2FuJ3QgYm9ycm93IGluIHRoaXMgcG9vbAQNJHQwMzc3MjEzNzgxMQkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAzNzcyMTM3ODExAl8xBANCSWQIBQ0kdDAzNzcyMTM3ODExAl8yBARiYWxBCAUNJHQwMzc3MjEzNzgxMQJfMwQEYmFsQggFDSR0MDM3NzIxMzc4MTECXzQEB3NoYXJlSWQIBQ0kdDAzNzcyMTM3ODExAl81AwMJAQIhPQIFCGJvcnJvd0lkBQNBSWQJAQIhPQIFCGJvcnJvd0lkBQNCSWQHCQACAQISV3JvbmcgYm9ycm93IGFzc2V0BA0kdDAzNzg5MjM3OTUxCQEScGFyc2VSZXBsZW5pc2hQbXRzAwgFAWkIcGF5bWVudHMFA0FJZAUDQklkBARwbXRBCAUNJHQwMzc4OTIzNzk1MQJfMQQEcG10QggFDSR0MDM3ODkyMzc5NTECXzIEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAluZXdQb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyAwkAZgIFCGxldmVyYWdlAGQEDGJvcnJvd0Ftb3VudAkBEGNhbGNCb3Jyb3dBbW91bnQGBQRwbXRBBQRwbXRCBQNBSWQFA0JJZAUIbGV2ZXJhZ2UFCGJvcnJvd0lkBAdyZXF1ZXN0CQC5CQIJAMwIAgUEdXNlcgkAzAgCBQRwb29sCQDMCAIJAKQDAQUEcG10QQkAzAgCBQNBSWQJAMwIAgkApAMBBQRwbXRCCQDMCAIFA0JJZAkAzAgCCQCkAwEFBGJhbEEJAMwIAgkApAMBBQRiYWxCCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgkApAMBBQxib3Jyb3dBbW91bnQFA25pbAIBLAQMbmV3UmVxdWVzdElkCgABQAkA/AcEBQR0aGlzAhBjcmVhdGVOZXdSZXF1ZXN0CQDMCAIFB3JlcXVlc3QFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQxuZXdSZXF1ZXN0SWQFDG5ld1JlcXVlc3RJZAQEYXJncwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQluZXdQb3NOdW0JAMwIAgUHc2hhcmVJZAkAzAgCBQhib3Jyb3dJZAkAzAgCBQxib3Jyb3dBbW91bnQJAMwIAgkApQgBBQR0aGlzCQDMCAICEXJlcGxlbmlzaEZyb21MYW5kCQDMCAIJAKQDAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQxuZXdSZXF1ZXN0SWQCGENhbid0IGNyZWF0ZSBuZXcgcmVxdWVzdAUDbmlsBANpbnYJAP0HBAkBDmdldExlbmRTcnZBZGRyAAINZmxhc2hQb3NpdGlvbgUEYXJncwUDbmlsAwkAAAIFA2ludgUDaW52BAp1c2VyU3Rha2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQluZXdQb3NOdW0FDWtVc2VyUG9zaXRpb24EDSR0MDM4OTQwMzkwMzQJAQ9nZXRQb29sQmFsYW5jZXMECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFA0FJZAUDQklkAwkAAAIFDSR0MDM4OTQwMzkwMzQFDSR0MDM4OTQwMzkwMzQEB25ld0JhbEIIBQ0kdDAzODk0MDM5MDM0Al8yBAduZXdCYWxBCAUNJHQwMzg5NDAzOTAzNAJfMQQIcHJJbXBhY3QJAQ9jYWxjUHJpY2VJbXBhY3QEBQRiYWxBBQRiYWxCBQduZXdCYWxBBQduZXdCYWxCBA0kdDAzOTEwNDM5MjE5CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwMzkxMDQzOTIxOQJfMQQId0Ftb3VudEIIBQ0kdDAzOTEwNDM5MjE5Al8yCQCUCgIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAzOTI3MjM5Mzg3CQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFC05PX0xPQU5fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAMJAAACBQ0kdDAzOTI3MjM5Mzg3BQ0kdDAzOTI3MjM5Mzg3BAdheGx5RmVlCAUNJHQwMzkyNzIzOTM4NwJfMgQKdXNlclN0YWtlZAgFDSR0MDM5MjcyMzkzODcCXzEEDSR0MDM5MzkzMzk0ODcJAQ9nZXRQb29sQmFsYW5jZXMECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFA0FJZAUDQklkAwkAAAIFDSR0MDM5MzkzMzk0ODcFDSR0MDM5MzkzMzk0ODcEB25ld0JhbEIIBQ0kdDAzOTM5MzM5NDg3Al8yBAduZXdCYWxBCAUNJHQwMzkzOTMzOTQ4NwJfMQQIcHJJbXBhY3QJAQ9jYWxjUHJpY2VJbXBhY3QEBQRiYWxBBQRiYWxCBQduZXdCYWxBBQduZXdCYWxCBA0kdDAzOTU1NzM5NjcyCQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwMzk1NTczOTY3MgJfMQQId0Ftb3VudEIIBQ0kdDAzOTU1NzM5NjcyAl8yCQCUCgIJAM4IAgkBEHJlcGxlbmlzaEVudHJpZXMIBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQluZXdQb3NOdW0FB3NoYXJlSWQFBXBUeXBlBwkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQJAMwIAgkApAMBBQh3QW1vdW50QQkAzAgCCQCkAwEFCHdBbW91bnRCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwIEcG9vbAVwb3NJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50CQEOd2l0aGRyYXdUb1VzZXIECQClCAEIBQFpBmNhbGxlcgUEcG9vbAkApAMBBQVwb3NJZAcBaQEUY3JlYXRlVXBkYXRlU3RvcExvc3MEBXBvc0lkBnBvb2xJZAdhc3NldElkBXByaWNlCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZwb29sSWQCAV8JAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQACAQIaVGhlcmUgYXJlIG5vIHVzZXIgcG9zaXRpb24DCQBnAgAABQVwcmljZQkAAgECHFByaWNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgUFcHJpY2UFEHRva2VuT3JhY2xlUHJpY2UJAAIBAitQcmljZSBtdXN0IGJlIGxlc3MgdGhhbiBjdXJyZW50IHRva2VuIHByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFBXByaWNlBQNuaWwBaQEOZGVsZXRlU3RvcExvc3MDBXBvc0lkBnBvb2xJZAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MJAAIBAghObyBlbnRyeQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFA25pbAFpAQRpbml0DQxtb25leUJveEFkZHINc2ZGYXJtaW5nQWRkcghsZW5kQWRkcg9wcmljZU9yYWNsZUFkZHIQa2VlcGVyRXhDb250cmFjdA53eFN3YXBDb250cmFjdAtzd29wQXNzZXRJZAl3eEFzc2V0SWQOb3BlcmF0b3JQdWJLZXkSZ3JvdXAxQWRtaW4xUHViS2V5Emdyb3VwMUFkbWluMlB1YktleRJncm91cDJBZG1pbjFQdWJLZXkSZ3JvdXAyQWRtaW4yUHViS2V5CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAoggBBQ9rT3BlcmF0b3JDYWxsUEsJAAIBAg5BbHJlYWR5IGluaXRlZAMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUMbW9uZXlCb3hBZGRyCQACAQIjbW9uZXlCb3hBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDXNmRmFybWluZ0FkZHIJAAIBAiRzZkZhcm1pbmdBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFCGxlbmRBZGRyCQACAQIfbGVuZEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUPcHJpY2VPcmFjbGVBZGRyCQACAQImcHJpY2VPcmFjbGVBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFEGtlZXBlckV4Q29udHJhY3QJAAIBAidrZWVwZXJFeENvbnRyYWN0IGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQULc3dvcEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQl3eEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQIhPQIJAMgBAQkA2QQBBQ5vcGVyYXRvclB1YktleQAgCQACAQIdb3BlcmF0b3JQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa01vbmV5Qm94BQxtb25leUJveEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa1NGRmFybWluZ0FkZHIFDXNmRmFybWluZ0FkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa0xlbmRTZXJ2aWNlBQhsZW5kQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrUHJpY2VPcmFjbGUFD3ByaWNlT3JhY2xlQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQtrRXhDb250cmFjdAUQa2VlcGVyRXhDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rV3hTd2FwQ29udHJhY3QFDnd4U3dhcENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tTd29wSWQFC3N3b3BBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWtXeElkBQl3eEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa09wZXJhdG9yQ2FsbFBLBQ5vcGVyYXRvclB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4xUEsFEmdyb3VwMUFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4yUEsFEmdyb3VwMUFkbWluMlB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4xUEsFEmdyb3VwMkFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4yUEsFEmdyb3VwMkFkbWluMlB1YktleQUDbmlsAWkBEGNyZWF0ZU5ld1JlcXVlc3QBBnBhcmFtcwkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpBAxuZXdSZXF1ZXN0SWQJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtSZXF1ZXN0SXRlcgAAAAEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQUMbmV3UmVxdWVzdElkBQprUmVxdWVzdElkBQZwYXJhbXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtSZXF1ZXN0SXRlcgUMbmV3UmVxdWVzdElkBQNuaWwFDG5ld1JlcXVlc3RJZAFpARFyZXBsZW5pc2hGcm9tTGFuZAEJcmVxdWVzdElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEDSR0MDQ0NTExNDQ2MTUJAQxwYXJzZVJlcXVlc3QBBQlyZXF1ZXN0SWQEBHVzZXIIBQ0kdDA0NDUxMTQ0NjE1Al8xBARwb29sCAUNJHQwNDQ1MTE0NDYxNQJfMgQEcG10QQgFDSR0MDQ0NTExNDQ2MTUCXzMEA0FJZAgFDSR0MDQ0NTExNDQ2MTUCXzQEBHBtdEIIBQ0kdDA0NDUxMTQ0NjE1Al81BANCSWQIBQ0kdDA0NDUxMTQ0NjE1Al82BARiYWxBCAUNJHQwNDQ1MTE0NDYxNQJfNwQEYmFsQggFDSR0MDQ0NTExNDQ2MTUCXzgEB3NoYXJlSWQIBQ0kdDA0NDUxMTQ0NjE1Al85BAdid0Fzc2V0CAUNJHQwNDQ1MTE0NDYxNQNfMTAECGJ3QW1vdW50CAUNJHQwNDQ1MTE0NDYxNQNfMTEDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhJXcm9uZyBwYXltZW50IHNpemUDAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUHYndBc3NldAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQhid0Ftb3VudAkAAgECDVdyb25nIHBheW1lbnQEDSR0MDQ0ODA1NDQ5MDUDCQAAAgUDQUlkBQdid0Fzc2V0CQCUCgIJAGQCBQRwbXRBBQhid0Ftb3VudAUEcG10QgkAlAoCBQRwbXRBCQBkAgUEcG10QgUIYndBbW91bnQEB3BtdEFsbEEIBQ0kdDA0NDgwNTQ0OTA1Al8xBAdwbXRBbGxCCAUNJHQwNDQ4MDU0NDkwNQJfMgQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAgxVbmtub3duIHBvb2wEDSR0MDQ0OTg3NDUxMDIJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUITE9BTl9GRUUFB3BtdEFsbEEFA0FJZAUHcG10QWxsQgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAp1c2VyU3Rha2VkCAUNJHQwNDQ5ODc0NTEwMgJfMQQHYXhseUZlZQgFDSR0MDQ0OTg3NDUxMDICXzIEBnBvc051bQkBGGdldE5ld1VzZXJQb3NpdGlvbk51bWJlcgEFBHVzZXIEDWJvcnJvd0VudHJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQURa1VzZXJCb3Jyb3dBbW91bnQFCGJ3QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUSa1VzZXJCb3Jyb3dBc3NldElkBQdid0Fzc2V0BQNuaWwEB2VudHJpZXMJARByZXBsZW5pc2hFbnRyaWVzCAUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUGcG9zTnVtBQdzaGFyZUlkBQVwVHlwZQYEDSR0MDQ1NDYyNDU1NzcJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDA0NTQ2MjQ1NTc3Al8xBAh3QW1vdW50QggFDSR0MDQ1NDYyNDU1NzcCXzIJAJQKAgkAzQgCCQDOCAIJAM4IAgUHZW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQJAMwIAgkApAMBBQh3QW1vdW50QQkAzAgCCQCkAwEFCHdBbW91bnRCBQNuaWwFDWJvcnJvd0VudHJpZXMJAQtEZWxldGVFbnRyeQEJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkBQp1c2VyU3Rha2VkAWkBCWxpcXVpZGF0ZQMEdXNlcgVwb3NJZA9saXF1aWRhdGVBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBRFrVXNlclBvc2l0aW9uUG9vbAILbm8gcG9zaXRpb24EBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDA0NjA5ODQ2MTg4CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDQ2MDk4NDYxODgCXzEEA0JJZAgFDSR0MDQ2MDk4NDYxODgCXzIEBGJhbEEIBQ0kdDA0NjA5ODQ2MTg4Al8zBARiYWxCCAUNJHQwNDYwOTg0NjE4OAJfNAQHc2hhcmVJZAgFDSR0MDQ2MDk4NDYxODgCXzUEBmFtb3VudAkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ9saXF1aWRhdGVBbW91bnQEDGJvcnJvd0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sBQVwb3NJZAkAZgIFDGJvcnJvd0Ftb3VudAAAAwkAZgIFD2xpcXVpZGF0ZUFtb3VudAUPdXNlckNhbldpdGhkcmF3CQACAQInWW91IGNhbid0IGxpcXVpZGF0ZSBtb3JlIHRoYW4gdXNlciBoYXZlAwkAAAIFDGJvcnJvd0Ftb3VudAAACQACAQIrWW91IGNhbid0IGxpcXVpZGF0ZSBwb3NpdGlvbiB3aXRob3V0IGJvcnJvdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAGUCBQ91c2VyQ2FuV2l0aGRyYXcFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBaQEIc3RvcExvc3MEBHVzZXIFcG9zSWQEcG9vbAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEDXN0b3BMb3NzUHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MCCE5vIGVudHJ5AwkAZgIFEHRva2VuT3JhY2xlUHJpY2UFDXN0b3BMb3NzUHJpY2UJAAIBAiNUb2tlbiBwcmljZSBncmVhdGVyIHN0b3AgbG9zcyBwcmljZQQDcmVzCQEOd2l0aGRyYXdUb1VzZXIEBQR1c2VyBQRwb29sCQCkAwEFBXBvc0lkBgkAlAoCCQDNCAIIBQNyZXMCXzEJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwgFA3JlcwJfMgFpAQxjYXBpdGFsaXplRXgFBHBvb2wFcm91dGUJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABA0kdDA0ODE1ODQ4MjYwCQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0FEGFtb3VudFRvRXhjaGFuZ2UFBmNoYW5nZQMJAAACBQ0kdDA0ODE1ODQ4MjYwBQ0kdDA0ODE1ODQ4MjYwBAxjbGFpbWVkQXNzZXQIBQ0kdDA0ODE1ODQ4MjYwAl8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNDgxNTg0ODI2MAJfMQQFckFyZ3MJALUJAgUFcm91dGUCAl9fBA9leGNoYW5nZWRBbW91bnQDCQAAAgkAkQMCBQVyQXJncwAAAhBkaXJlY3RTd29wZmlDUE1NCQEQZGlyZWN0U3dvcGZpQ1BNTQIFBXJBcmdzBQl0b2tlblRvSWQDCQAAAgkAkQMCBQVyQXJncwAAAg1yb3V0aW5nU3dvcGZpCQETZGlyZWN0Um91dGluZ1N3b3BmaQIFBXJBcmdzBQl0b2tlblRvSWQJAAIBAgtXcm9uZyByb3V0ZQMJAAACBQ9leGNoYW5nZWRBbW91bnQFD2V4Y2hhbmdlZEFtb3VudAQJbmV3Q2hhbmdlCQBlAgkAZAIFDWNsYWltZWRBbW91bnQFBmNoYW5nZQUQYW1vdW50VG9FeGNoYW5nZQQLY2hhbmdlRW50cnkDCQBnAgUJbmV3Q2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UFCW5ld0NoYW5nZQUDbmlsBQNuaWwJAM4IAgkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQUJdG9rZW5Ub0lkBQ9leGNoYW5nZWRBbW91bnQFC2NoYW5nZUVudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNhcGl0YWxpemVOb0V4AwRwb29sBWNsYWltEWFtb3VudEZyb21CYWxhbmNlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQNJHQwNDg5NDQ0OTA0MgkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRFhbW91bnRGcm9tQmFsYW5jZQAAAwkAAAIFDSR0MDQ4OTQ0NDkwNDIFDSR0MDQ4OTQ0NDkwNDIEDGNsYWltZWRBc3NldAgFDSR0MDQ4OTQ0NDkwNDICXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA0ODk0NDQ5MDQyAl8xCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBXBUeXBlCQEMYXNzZXRJZFRvU3RyAQUMY2xhaW1lZEFzc2V0CQBkAgUNY2xhaW1lZEFtb3VudAURYW1vdW50RnJvbUJhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELaW5pdE5ld1Bvb2wKBHR5cGUIcG9vbFR5cGUIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbhFzdG9wbG9zc0ZlZU5vTG9hbhNzdG9wbG9zc0ZlZVdpdGhMb2FuCWNhbkJvcnJvdwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMDCQECIT0CBQR0eXBlBQdTRl9QT09MCQECIT0CBQR0eXBlBQdXWF9QT09MBwkAAgECCldyb25nIHR5cGUDAwkBAiE9AgUIcG9vbFR5cGUFBENQTU0JAQIhPQIFCHBvb2xUeXBlBQRGTEFUBwkAAgECD1dyb25nIHBvb2wgdHlwZQQNJHQwNDk1NjM0OTY1NwkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFCHBvb2xBZGRyBQR0eXBlBANhSWQIBQ0kdDA0OTU2MzQ5NjU3Al8xBANiSWQIBQ0kdDA0OTU2MzQ5NjU3Al8yBARhQmFsCAUNJHQwNDk1NjM0OTY1NwJfMwQEYkJhbAgFDSR0MDQ5NTYzNDk2NTcCXzQEB3NoYXJlSWQIBQ0kdDA0OTU2MzQ5NjU3Al81AwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrUG9vbEludGVyZXN0TG9hbgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQVrUG9vbAUIcG9vbEFkZHIFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhwb29sQWRkcgUJa1Bvb2xUeXBlBQhwb29sVHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wFCHBvb2xBZGRyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQ5rUG9vbENhbkJvcnJvdwUJY2FuQm9ycm93BQNuaWwBaQEOdXBkYXRlUG9vbEZlZXMHCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUIcG9vbEFkZHIJAAIBCQCsAgICGkNhbid0IGZpbmQgcG9vbCB3aXRoIGFkZHIgBQhwb29sQWRkcgMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgUDbmlsAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhNkQXBwIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgUDbmlsAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECFWRBcHAgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcFA25pbAFpARBhY3RpdmF0ZUZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECHWRBcHAgYWxyZWFkeSBhY3RpdmUgZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMGBQNuaWwBaQEQc2h1dGRvd25Gb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgkAAgECH2RBcHAgYWxyZWFkeSBzaHV0ZG93biBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwcFA25pbAFpAQphY3RpdmF0ZVNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhVTV09QRkkgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25TRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhdTV09QRkkgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQphY3RpdmF0ZVdYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhFXWCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93bldYAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECE1dYIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEMYWN0aXZhdGVQb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECE1Bvb2wgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGBQNuaWwBaQEMc2h1dGRvd25Qb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sCQACAQIMVW5rbm93biBwb29sAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQIVUG9vbCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBwUDbmlsAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQGaXNTZWxmCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAppc1JpZ2h0RmVlAwkAAAIIBQNpbnYDZmVlAKD3NgkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcECmlzSW5pdENhbGwJAAACCAUDaW52CGZ1bmN0aW9uAgRpbml0BAxpc25vUGF5bWVudHMJAAACCQCQAwEIBQNpbnYIcGF5bWVudHMAAAMDAwUKaXNSaWdodEZlZQUKaXNJbml0Q2FsbAcFBmlzU2VsZgcFDGlzbm9QYXltZW50cwcEDGdyb3VwMVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDmdyb3VwMUFkbWluMVBLAAEJAGQCAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ5ncm91cDFBZG1pbjJQSwABAAAEDGdyb3VwMlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDmdyb3VwMkFkbWluMVBLAAEJAGQCAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQ5ncm91cDJBZG1pbjJQSwABAAAJAAACCQBkAgUMZ3JvdXAxU2lnbmVkBQxncm91cDJTaWduZWQAAtE6S7w=", "height": 2806897, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5XNh4ePEYR6x3AQF8QDp4tz7AbM2fQ28sfL9JeKAfE2C Next: none Diff:
OldNewDifferences
445445 }
446446
447447
448-func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
448+func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
449449 then {
450450 let repl = {
451451 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
479479 }
480480 else if ((pType == WX_POOL))
481481 then {
482- let $t01367613926 = $Tuple2(split({
483- let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
482+ let $t01369013948 = $Tuple2(split({
483+ let @ = invoke(wxRest, "evaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
484484 if ($isInstanceOf(@, "String"))
485485 then @
486486 else throw(($getType(@) + " couldn't be cast to String"))
487487 }, "__"), split({
488- let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
488+ let @ = invoke(wxRest, "evaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
489489 if ($isInstanceOf(@, "String"))
490490 then @
491491 else throw(($getType(@) + " couldn't be cast to String"))
492492 }, "__"))
493- if (($t01367613926 == $t01367613926))
493+ if (($t01369013948 == $t01369013948))
494494 then {
495- let evalPutInB = $t01367613926._2
496- let evalPutInA = $t01367613926._1
495+ let evalPutInB = $t01369013948._2
496+ let evalPutInA = $t01369013948._1
497497 let lpInA = parseIntValue(evalPutInA[1])
498498 let lpInB = parseIntValue(evalPutInB[1])
499499 if ((lpInB > lpInA))
547547
548548
549549 func unstakeLP (pool,pType,shareId,amount) = {
550- let $t01570416054 = if ((pType == SF_POOL))
550+ let $t01572616076 = if ((pType == SF_POOL))
551551 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
552552 else if ((pType == WX_POOL))
553553 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
554554 else unknownPoolType()
555- let farmAddr = $t01570416054._1
556- let fName = $t01570416054._2
557- let params = $t01570416054._3
555+ let farmAddr = $t01572616076._1
556+ let fName = $t01572616076._2
557+ let params = $t01572616076._3
558558 let inv = invoke(farmAddr, fName, params, nil)
559559 if ((inv == inv))
560560 then amount
567567 let feeScale6 = 1000000
568568 let fee = getIntegerValue(poolAddr, kSFPoolFee)
569569 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
570- let $t01647616782 = if ((assetTokenToGet == assetIdA))
570+ let $t01649816804 = if ((assetTokenToGet == assetIdA))
571571 then {
572572 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
573573 $Tuple2(amountToPay, assetIdB)
576576 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
577577 $Tuple2(amountToPay, assetIdA)
578578 }
579- let amountToPay = $t01647616782._1
580- let assetToPay = $t01647616782._2
579+ let amountToPay = $t01649816804._1
580+ let assetToPay = $t01649816804._2
581581 $Tuple2(assetToPay, amountToPay)
582582 }
583583
597597
598598
599599 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
600- let $t01752217561 = getWXSwapFees(pool)
601- let pFee = $t01752217561._1
602- let prFee = $t01752217561._2
600+ let $t01754417583 = getWXSwapFees(pool)
601+ let pFee = $t01754417583._1
602+ let prFee = $t01754417583._2
603603 let feeScale = toBigInt(100000000)
604- let $t01760117909 = if ((assetTokenToGet == assetIdA))
604+ let $t01762317931 = if ((assetTokenToGet == assetIdA))
605605 then {
606606 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
607607 $Tuple2(amountToPay, assetIdB)
610610 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
611611 $Tuple2(amountToPay, assetIdA)
612612 }
613- let amountToPay = $t01760117909._1
614- let assetToPay = $t01760117909._2
613+ let amountToPay = $t01762317931._1
614+ let assetToPay = $t01762317931._2
615615 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
616616 $Tuple2(assetToPay, amountToPayWithFee)
617617 }
623623 then true
624624 else (poolFB != ""))
625625 then {
626- let $t01835018562 = if ((poolFB == ""))
626+ let $t01837218584 = if ((poolFB == ""))
627627 then $Tuple3(balA, balB, pool)
628628 else {
629- let $t01845618529 = getSFPoolBalances(addressFromStringValue(poolFB))
630- let sfBalA = $t01845618529._1
631- let sfBalB = $t01845618529._2
629+ let $t01847818551 = getSFPoolBalances(addressFromStringValue(poolFB))
630+ let sfBalA = $t01847818551._1
631+ let sfBalB = $t01847818551._2
632632 $Tuple3(sfBalA, sfBalB, poolFB)
633633 }
634- let pBalA = $t01835018562._1
635- let pBalB = $t01835018562._2
636- let exPool = $t01835018562._3
637- let $t01856718693 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
638- let assetToPay = $t01856718693._1
639- let amountToPay = $t01856718693._2
634+ let pBalA = $t01837218584._1
635+ let pBalB = $t01837218584._2
636+ let exPool = $t01837218584._3
637+ let $t01858918715 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
638+ let assetToPay = $t01858918715._1
639+ let amountToPay = $t01858918715._2
640640 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
641641 }
642642 else if ((pType == WX_POOL))
643643 then {
644- let $t01889519017 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
645- let assetToPay = $t01889519017._1
646- let amountToPay = $t01889519017._2
644+ let $t01891719039 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
645+ let assetToPay = $t01891719039._1
646+ let amountToPay = $t01891719039._2
647647 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
648648 }
649649 else unknownPoolType()
651651
652652
653653 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
654- let $t01930420539 = if ((pType == SF_POOL))
654+ let $t01932619799 = if ((pType == SF_POOL))
655655 then {
656656 let inv = {
657657 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
674674 else throw("Strict value is not equal to itself.")
675675 }
676676 else if ((pType == WX_POOL))
677- then if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
678- then {
679- let inv = invoke(poolAddr, "estimateGetOperationWrapperREADONLY", ["", shareId, userCanWithdraw, toString(this)], nil)
680- if ((inv == inv))
681- then {
682- let $t01979720294 = match inv {
683- case _ =>
684- if (if (if ($isInstanceOf($match0._1, "Int"))
685- then if ($isInstanceOf($match0._2, "Int"))
686- then if ($isInstanceOf($match0._5, "Int"))
687- then if ($isInstanceOf($match0._6, "Int"))
688- then if ($isInstanceOf($match0._7, "Int"))
689- then if ($isInstanceOf($match0._8, "String"))
690- then $isInstanceOf($match0._9, "String")
691- else false
692- else false
693- else false
694- else false
695- else false
696- else false)
697- then (size($match0) == 10)
698- else false)
699- then {
700- let outAmAmt = $match0._1
701- let outPrAmt = $match0._2
702- let amBalance = $match0._5
703- let prBalance = $match0._6
704- let lpEmission = $match0._7
705- let curPrice = $match0._8
706- let poolStatus = $match0._9
707- $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
708- }
709- else throw("Couldn't cast types")
710- }
711- let outAmAmt = $t01979720294._1
712- let outPrAmt = $t01979720294._2
713- let amBalance = $t01979720294._3
714- let prBalance = $t01979720294._4
715- let lpEmission = $t01979720294._5
716- let curPrice = $t01979720294._6
717- let poolStatus = $t01979720294._7
718- $Tuple2(outAmAmt, outPrAmt)
719- }
720- else throw("Strict value is not equal to itself.")
721- }
722- else {
723- let inv = split({
724- let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
725- if ($isInstanceOf(@, "String"))
726- then @
727- else throw(($getType(@) + " couldn't be cast to String"))
728- }, "__")
729- if ((inv == inv))
730- then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
731- else throw("Strict value is not equal to itself.")
732- }
677+ then {
678+ let inv = split({
679+ let @ = invoke(poolAddr, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
680+ if ($isInstanceOf(@, "String"))
681+ then @
682+ else throw(($getType(@) + " couldn't be cast to String"))
683+ }, "__")
684+ if ((inv == inv))
685+ then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
686+ else throw("Strict value is not equal to itself.")
687+ }
733688 else unknownPoolType()
734- let amountA = $t01930420539._1
735- let amountB = $t01930420539._2
689+ let amountA = $t01932619799._1
690+ let amountB = $t01932619799._2
736691 $Tuple2(amountA, amountB)
737692 }
738693
754709 }
755710 else if ((pType == WX_POOL))
756711 then {
757- let $t02090720986 = getWXPoolData(addressFromStringValue(pool))
758- let aId = $t02090720986._1
759- let bId = $t02090720986._2
760- let aBal = $t02090720986._3
761- let bBal = $t02090720986._4
762- let lpId = $t02090720986._5
712+ let $t02016720246 = getWXPoolData(addressFromStringValue(pool))
713+ let aId = $t02016720246._1
714+ let bId = $t02016720246._2
715+ let aBal = $t02016720246._3
716+ let bBal = $t02016720246._4
717+ let lpId = $t02016720246._5
763718 let balBefore = accountBalance(WXID)
764719 if ((balBefore == balBefore))
765720 then {
781736 if ((lpBalanceBefore == lpBalanceBefore))
782737 then {
783738 let poolAddr = addressFromStringValue(pool)
784- let $t02158422000 = if (if ((pmtA > 0))
739+ let $t02084421266 = if (if ((pmtA > 0))
785740 then (pmtB > 0)
786741 else false)
787742 then {
788- let $t02165021766 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
789- let pmtInA = $t02165021766._1
790- let pmtInB = $t02165021766._2
791- let change = $t02165021766._3
792- let changeId = $t02165021766._4
743+ let $t02091021032 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
744+ let pmtInA = $t02091021032._1
745+ let pmtInB = $t02091021032._2
746+ let change = $t02091021032._3
747+ let changeId = $t02091021032._4
793748 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
794749 if ((inv == inv))
795750 then $Tuple2(change, changeId)
800755 else if ((pmtB > 0))
801756 then $Tuple2(pmtB, bId)
802757 else throw("pmts must be > 0")
803- let change = $t02158422000._1
804- let changeId = $t02158422000._2
758+ let change = $t02084421266._1
759+ let changeId = $t02084421266._2
805760 let inv = if ((change > 0))
806761 then replenishOneTokenByType(poolAddr, pType, change, changeId)
807762 else nil
829784 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
830785 let totalAmount = getPoolTotalShare(pool)
831786 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
832- let $t02285723095 = if (withLoan)
787+ let $t02212322361 = if (withLoan)
833788 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
834789 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
835- let curPoolInterest = $t02285723095._1
836- let totalStakedWithLoan = $t02285723095._2
790+ let curPoolInterest = $t02212322361._1
791+ let totalStakedWithLoan = $t02212322361._2
837792 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), totalStakedWithLoan), 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))]
838793 }
839794
914869
915870 func capitalize (pool,pType,tokenId,tokenAmount) = {
916871 let poolAddr = Address(fromBase58String(pool))
917- let $t02520225268 = getPoolData(poolAddr, pType)
918- let AId = $t02520225268._1
919- let BId = $t02520225268._2
920- let balA = $t02520225268._3
921- let balB = $t02520225268._4
922- let shareId = $t02520225268._5
872+ let $t02446824534 = getPoolData(poolAddr, pType)
873+ let AId = $t02446824534._1
874+ let BId = $t02446824534._2
875+ let balA = $t02446824534._3
876+ let balB = $t02446824534._4
877+ let shareId = $t02446824534._5
923878 if (if ((tokenId != AId))
924879 then (tokenId != BId)
925880 else false)
936891 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
937892 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
938893 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
939- let $t02601326113 = if ((tokenId == AId))
894+ let $t02527925379 = if ((tokenId == AId))
940895 then $Tuple2((tokenAmount - axlyFee), 0)
941896 else $Tuple2(0, (tokenAmount - axlyFee))
942- let pmtA = $t02601326113._1
943- let pmtB = $t02601326113._2
944- let $t02611626220 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
945- let stakedAmount = $t02611626220._1
946- let nf = $t02611626220._2
897+ let pmtA = $t02527925379._1
898+ let pmtB = $t02527925379._2
899+ let $t02538225486 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
900+ let stakedAmount = $t02538225486._1
901+ let nf = $t02538225486._2
947902 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
948903 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
949904 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
989944 let userAddr = Address(fromBase58String(user))
990945 let poolAddr = Address(fromBase58String(pool))
991946 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
992- let $t02874928821 = getPoolData(poolAddr, pType)
993- let idAStr = $t02874928821._1
994- let idBStr = $t02874928821._2
995- let balA = $t02874928821._3
996- let balB = $t02874928821._4
997- let shareId = $t02874928821._5
998- let $t02882428891 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
999- let idA = $t02882428891._1
1000- let idB = $t02882428891._2
947+ let $t02801528087 = getPoolData(poolAddr, pType)
948+ let idAStr = $t02801528087._1
949+ let idBStr = $t02801528087._2
950+ let balA = $t02801528087._3
951+ let balB = $t02801528087._4
952+ let shareId = $t02801528087._5
953+ let $t02809028157 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
954+ let idA = $t02809028157._1
955+ let idB = $t02809028157._2
1001956 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
1002957 let cBalABefore = accountBalance(idA)
1003958 if ((cBalABefore == cBalABefore))
1028983 let cBalBAfter = accountBalance(idB)
1029984 if ((cBalBAfter == cBalBAfter))
1030985 then {
1031- let $t02958629675 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1032- let tokensAmountA = $t02958629675._1
1033- let tokensAmountB = $t02958629675._2
1034- let $t02967830914 = if (isBorrowed)
986+ let $t02885228941 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
987+ let tokensAmountA = $t02885228941._1
988+ let tokensAmountB = $t02885228941._2
989+ let $t02894430180 = if (isBorrowed)
1035990 then {
1036991 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
1037992 let debt = {
10801035 else throw("Strict value is not equal to itself.")
10811036 }
10821037 else $Tuple2(tokensAmountA, tokensAmountB)
1083- let toUserA = $t02967830914._1
1084- let toUserB = $t02967830914._2
1038+ let toUserA = $t02894430180._1
1039+ let toUserB = $t02894430180._2
10851040 let poolTotalLoanEntries = if (isBorrowed)
10861041 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10871042 else nil
11271082 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
11281083 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
11291084 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1130- let $t03289632993 = if ((borrowId == aId))
1085+ let $t03216232259 = if ((borrowId == aId))
11311086 then $Tuple2(dPriceA, decPrA)
11321087 else $Tuple2(dPriceB, decPrB)
1133- let borrowPrice = $t03289632993._1
1134- let borrowDecPr = $t03289632993._2
1088+ let borrowPrice = $t03216232259._1
1089+ let borrowDecPr = $t03216232259._2
11351090 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
11361091 }
11371092
11601115
11611116
11621117 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1163- let $t03399334255 = if (claim)
1118+ let $t03325933521 = if (claim)
11641119 then claimFarmed(pType, pool)
11651120 else {
11661121 let claimedAsset = if ((pType == SF_POOL))
11701125 else unknownPoolType()
11711126 $Tuple2(amount, claimedAsset)
11721127 }
1173- if (($t03399334255 == $t03399334255))
1128+ if (($t03325933521 == $t03325933521))
11741129 then {
1175- let claimAsset = $t03399334255._2
1176- let claimAmount = $t03399334255._1
1130+ let claimAsset = $t03325933521._2
1131+ let claimAmount = $t03325933521._1
11771132 let bal = accountBalance(claimAsset)
11781133 if ((bal == bal))
11791134 then if ((amount > bal))
11891144 func getPoolInfoREADONLY (pool) = {
11901145 let poolAddr = addressFromStringValue(pool)
11911146 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1192- let $t03462234712 = getPoolData(Address(fromBase58String(pool)), pType)
1193- let AId = $t03462234712._1
1194- let BId = $t03462234712._2
1195- let balA = $t03462234712._3
1196- let balB = $t03462234712._4
1197- let shareId = $t03462234712._5
1147+ let $t03388833978 = getPoolData(Address(fromBase58String(pool)), pType)
1148+ let AId = $t03388833978._1
1149+ let BId = $t03388833978._2
1150+ let balA = $t03388833978._3
1151+ let balB = $t03388833978._4
1152+ let shareId = $t03388833978._5
11981153 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11991154 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
12001155 }
12221177 @Callable(i)
12231178 func getUserPositionREADONLY (user,pools,posNum) = {
12241179 func userPos (a,pool) = {
1225- let $t03558535655 = a
1226- let wAmountsA = $t03558535655._1
1227- let wAmountsB = $t03558535655._2
1228- let debts = $t03558535655._3
1229- let eqWAmountsA = $t03558535655._4
1230- let eqWAmountsB = $t03558535655._5
1231- let index = $t03558535655._6
1180+ let $t03485134921 = a
1181+ let wAmountsA = $t03485134921._1
1182+ let wAmountsB = $t03485134921._2
1183+ let debts = $t03485134921._3
1184+ let eqWAmountsA = $t03485134921._4
1185+ let eqWAmountsB = $t03485134921._5
1186+ let index = $t03485134921._6
12321187 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
12331188 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
12341189 else {
12351190 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1236- let $t03593436024 = getPoolData(Address(fromBase58String(pool)), pType)
1237- let AId = $t03593436024._1
1238- let BId = $t03593436024._2
1239- let balA = $t03593436024._3
1240- let balB = $t03593436024._4
1241- let shareId = $t03593436024._5
1191+ let $t03520035290 = getPoolData(Address(fromBase58String(pool)), pType)
1192+ let AId = $t03520035290._1
1193+ let BId = $t03520035290._2
1194+ let balA = $t03520035290._3
1195+ let balB = $t03520035290._4
1196+ let shareId = $t03520035290._5
12421197 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
12431198 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1244- let $t03624036360 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1245- let wAmountA = $t03624036360._1
1246- let wAmountB = $t03624036360._2
1199+ let $t03550635626 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1200+ let wAmountA = $t03550635626._1
1201+ let wAmountB = $t03550635626._2
12471202 if ((borrowAmount > 0))
12481203 then {
12491204 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12771232 }
12781233 else unknownPoolType()
12791234 else 0
1280- let $t03727237491 = if ((borrowAsset == AId))
1235+ let $t03653836757 = if ((borrowAsset == AId))
12811236 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12821237 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1283- let eqWAmountA = $t03727237491._1
1284- let eqWAmountB = $t03727237491._2
1238+ let eqWAmountA = $t03653836757._1
1239+ let eqWAmountB = $t03653836757._2
12851240 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12861241 }
12871242 else throw("Strict value is not equal to itself.")
12901245 }
12911246 }
12921247
1293- let $t03774637857 = {
1248+ let $t03701237123 = {
12941249 let $l = pools
12951250 let $s = size($l)
12961251 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
13041259
13051260 $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)
13061261 }
1307- let wAmountsA = $t03774637857._1
1308- let wAmountsB = $t03774637857._2
1309- let debts = $t03774637857._3
1310- let eqWAmountsA = $t03774637857._4
1311- let eqWAmountsB = $t03774637857._5
1262+ let wAmountsA = $t03701237123._1
1263+ let wAmountsB = $t03701237123._2
1264+ let debts = $t03701237123._3
1265+ let eqWAmountsA = $t03701237123._4
1266+ let eqWAmountsB = $t03701237123._5
13121267 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
13131268 }
13141269
13281283 else false)
13291284 then throw("You can't borrow in this pool")
13301285 else {
1331- let $t03845538545 = getPoolData(Address(fromBase58String(pool)), pType)
1332- let AId = $t03845538545._1
1333- let BId = $t03845538545._2
1334- let balA = $t03845538545._3
1335- let balB = $t03845538545._4
1336- let shareId = $t03845538545._5
1286+ let $t03772137811 = getPoolData(Address(fromBase58String(pool)), pType)
1287+ let AId = $t03772137811._1
1288+ let BId = $t03772137811._2
1289+ let balA = $t03772137811._3
1290+ let balB = $t03772137811._4
1291+ let shareId = $t03772137811._5
13371292 if (if ((borrowId != AId))
13381293 then (borrowId != BId)
13391294 else false)
13401295 then throw("Wrong borrow asset")
13411296 else {
1342- let $t03862638685 = parseReplenishPmts(i.payments, AId, BId)
1343- let pmtA = $t03862638685._1
1344- let pmtB = $t03862638685._2
1297+ let $t03789237951 = parseReplenishPmts(i.payments, AId, BId)
1298+ let pmtA = $t03789237951._1
1299+ let pmtB = $t03789237951._2
13451300 let user = toString(i.caller)
13461301 let newPosNum = getNewUserPositionNumber(user)
13471302 if ((leverage > 100))
13611316 if ((inv == inv))
13621317 then {
13631318 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1364- let $t03967439768 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1365- if (($t03967439768 == $t03967439768))
1319+ let $t03894039034 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1320+ if (($t03894039034 == $t03894039034))
13661321 then {
1367- let newBalB = $t03967439768._2
1368- let newBalA = $t03967439768._1
1322+ let newBalB = $t03894039034._2
1323+ let newBalA = $t03894039034._1
13691324 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1370- let $t03983839953 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1371- let wAmountA = $t03983839953._1
1372- let wAmountB = $t03983839953._2
1325+ let $t03910439219 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1326+ let wAmountA = $t03910439219._1
1327+ let wAmountB = $t03910439219._2
13731328 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13741329 }
13751330 else throw("Strict value is not equal to itself.")
13791334 else throw("Strict value is not equal to itself.")
13801335 }
13811336 else {
1382- let $t04000640121 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1383- if (($t04000640121 == $t04000640121))
1337+ let $t03927239387 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1338+ if (($t03927239387 == $t03927239387))
13841339 then {
1385- let axlyFee = $t04000640121._2
1386- let userStaked = $t04000640121._1
1387- let $t04012740221 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1388- if (($t04012740221 == $t04012740221))
1340+ let axlyFee = $t03927239387._2
1341+ let userStaked = $t03927239387._1
1342+ let $t03939339487 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1343+ if (($t03939339487 == $t03939339487))
13891344 then {
1390- let newBalB = $t04012740221._2
1391- let newBalA = $t04012740221._1
1345+ let newBalB = $t03939339487._2
1346+ let newBalA = $t03939339487._1
13921347 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1393- let $t04029140406 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1394- let wAmountA = $t04029140406._1
1395- let wAmountB = $t04029140406._2
1348+ let $t03955739672 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1349+ let wAmountA = $t03955739672._1
1350+ let wAmountB = $t03955739672._2
13961351 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13971352 }
13981353 else throw("Strict value is not equal to itself.")
14851440
14861441 @Callable(i)
14871442 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1488- let $t04524545349 = parseRequest(requestId)
1489- let user = $t04524545349._1
1490- let pool = $t04524545349._2
1491- let pmtA = $t04524545349._3
1492- let AId = $t04524545349._4
1493- let pmtB = $t04524545349._5
1494- let BId = $t04524545349._6
1495- let balA = $t04524545349._7
1496- let balB = $t04524545349._8
1497- let shareId = $t04524545349._9
1498- let bwAsset = $t04524545349._10
1499- let bwAmount = $t04524545349._11
1443+ let $t04451144615 = parseRequest(requestId)
1444+ let user = $t04451144615._1
1445+ let pool = $t04451144615._2
1446+ let pmtA = $t04451144615._3
1447+ let AId = $t04451144615._4
1448+ let pmtB = $t04451144615._5
1449+ let BId = $t04451144615._6
1450+ let balA = $t04451144615._7
1451+ let balB = $t04451144615._8
1452+ let shareId = $t04451144615._9
1453+ let bwAsset = $t04451144615._10
1454+ let bwAmount = $t04451144615._11
15001455 if ((size(i.payments) != 1))
15011456 then throw("Wrong payment size")
15021457 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
15041459 else (i.payments[0].amount != bwAmount))
15051460 then throw("Wrong payment")
15061461 else {
1507- let $t04553945639 = if ((AId == bwAsset))
1462+ let $t04480544905 = if ((AId == bwAsset))
15081463 then $Tuple2((pmtA + bwAmount), pmtB)
15091464 else $Tuple2(pmtA, (pmtB + bwAmount))
1510- let pmtAllA = $t04553945639._1
1511- let pmtAllB = $t04553945639._2
1465+ let pmtAllA = $t04480544905._1
1466+ let pmtAllB = $t04480544905._2
15121467 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1513- let $t04572145836 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1514- let userStaked = $t04572145836._1
1515- let axlyFee = $t04572145836._2
1468+ let $t04498745102 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1469+ let userStaked = $t04498745102._1
1470+ let axlyFee = $t04498745102._2
15161471 let posNum = getNewUserPositionNumber(user)
15171472 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
15181473 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1519- let $t04619646311 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1520- let wAmountA = $t04619646311._1
1521- let wAmountB = $t04619646311._2
1474+ let $t04546245577 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1475+ let wAmountA = $t04546245577._1
1476+ let wAmountB = $t04546245577._2
15221477 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
15231478 }
15241479 }))
15291484 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
15301485 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
15311486 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1532- let $t04683246922 = getPoolData(Address(fromBase58String(pool)), pType)
1533- let AId = $t04683246922._1
1534- let BId = $t04683246922._2
1535- let balA = $t04683246922._3
1536- let balB = $t04683246922._4
1537- let shareId = $t04683246922._5
1487+ let $t04609846188 = getPoolData(Address(fromBase58String(pool)), pType)
1488+ let AId = $t04609846188._1
1489+ let BId = $t04609846188._2
1490+ let balA = $t04609846188._3
1491+ let balB = $t04609846188._4
1492+ let shareId = $t04609846188._5
15381493 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
15391494 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
15401495 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15661521 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15671522 let pType = getStringValue(this, (kPool + pool))
15681523 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1569- let $t04889248994 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1570- if (($t04889248994 == $t04889248994))
1524+ let $t04815848260 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1525+ if (($t04815848260 == $t04815848260))
15711526 then {
1572- let claimedAsset = $t04889248994._2
1573- let claimedAmount = $t04889248994._1
1527+ let claimedAsset = $t04815848260._2
1528+ let claimedAmount = $t04815848260._1
15741529 let rArgs = split(route, "__")
15751530 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15761531 then directSwopfiCPMM(rArgs, tokenToId)
15951550 @Callable(i)
15961551 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15971552 let pType = getStringValue(this, (kPool + pool))
1598- let $t04967849776 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1599- if (($t04967849776 == $t04967849776))
1553+ let $t04894449042 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1554+ if (($t04894449042 == $t04894449042))
16001555 then {
1601- let claimedAsset = $t04967849776._2
1602- let claimedAmount = $t04967849776._1
1556+ let claimedAsset = $t04894449042._2
1557+ let claimedAmount = $t04894449042._1
16031558 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
16041559 }
16051560 else throw("Strict value is not equal to itself.")
16171572 else false)
16181573 then throw("Wrong pool type")
16191574 else {
1620- let $t05029750391 = getPoolData(Address(fromBase58String(poolAddr)), type)
1621- let aId = $t05029750391._1
1622- let bId = $t05029750391._2
1623- let aBal = $t05029750391._3
1624- let bBal = $t05029750391._4
1625- let shareId = $t05029750391._5
1575+ let $t04956349657 = getPoolData(Address(fromBase58String(poolAddr)), type)
1576+ let aId = $t04956349657._1
1577+ let bId = $t04956349657._2
1578+ let aBal = $t04956349657._3
1579+ let bBal = $t04956349657._4
1580+ let shareId = $t04956349657._5
16261581 if ((0 > inFeeNoLoan))
16271582 then throw("inFeeNoLoan must be greater than 0")
16281583 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 kPoolTotal = "_poolTotal"
6363
6464 let kPoolTotalLoan = "_poolTotalLoan"
6565
6666 let kPoolInterestLoan = "_poolInterestLoan"
6767
6868 let kPoolInterestNoLoan = "_poolInterestNoLoan"
6969
7070 let kPoolCanBorrow = "_poolCanBorrow"
7171
7272 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
7373
7474 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
7575
7676 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7777
7878 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7979
8080 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
8181
8282 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
8383
8484 let kRequestId = "_request_id"
8585
8686 let kRequestIter = "requests_iter"
8787
8888 let kPool = "pool_"
8989
9090 let kPoolType = "_poolType"
9191
9292 let kSharePool = "_poolShareId"
9393
9494 let kPoolCapChange = "_poolCapChange"
9595
9696 let kTokenLastPrice = "last_price"
9797
9898 let kPriceInOracle = "_twap5B"
9999
100100 let kActive = "active"
101101
102102 let kActiveUsers = "activeUsers"
103103
104104 let kActiveSFWX = "_active"
105105
106106 let kPoolActive = "_activePool"
107107
108108 let kUserStopLoss = "_stopLoss"
109109
110110 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
111111
112112 let kMoneyBox = "axly_money_box"
113113
114114 let kSFFarmingAddr = "swopfi_farming_addr"
115115
116116 let kLendService = "lend_service_addr"
117117
118118 let kOperatorCallPK = "admin_call_pub_key"
119119
120120 let kPriceOracle = "price_oracle"
121121
122122 let kExContract = "exchange_contract"
123123
124124 let kWxSwapContract = "wx_swap_contract"
125125
126126 let kWxRest = "wx_rest_addr"
127127
128128 let kSwopId = "swop_id"
129129
130130 let kWxId = "wx_id"
131131
132132 let kGroup1Admin1PK = "group1_admin1_pub_key"
133133
134134 let kGroup1Admin2PK = "group1_admin2_pub_key"
135135
136136 let kGroup2Admin1PK = "group2_admin1_pub_key"
137137
138138 let kGroup2Admin2PK = "group2_admin2_pub_key"
139139
140140 let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
141141
142142 let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
143143
144144 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
145145
146146 let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
147147
148148 let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
149149
150150 let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
151151
152152 let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
153153
154154 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
155155
156156 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
157157
158158 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
159159
160160 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
161161
162162 let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
163163
164164 func unknownPoolType () = throw("Wrong pool type")
165165
166166
167167 func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
168168
169169
170170 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
171171 then unit
172172 else throw("Only operator can call this function")
173173
174174
175175 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
176176 then true
177177 else (i.callerPublicKey == group1Admin2PK))
178178 then unit
179179 else throw("Only admin group1 can call this function")
180180
181181
182182 func isSelfCall (i) = if ((i.caller == this))
183183 then unit
184184 else throw("Only contract itself can call this function")
185185
186186
187187 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
188188 then unit
189189 else throw("Only land contract can call this function")
190190
191191
192192 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
193193 then unit
194194 else throw("DApp is inactive at this moment")
195195
196196
197197 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
198198 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
199199 else false)
200200 then unit
201201 else throw("DApp is inactive for users at this moment")
202202
203203
204204 func isPoolActive (pool,type) = {
205205 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
206206 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
207207 if (if (WXSFActive)
208208 then poolActive
209209 else false)
210210 then true
211211 else false
212212 }
213213
214214
215215 func accountBalance (assetId) = match assetId {
216216 case id: ByteVector =>
217217 assetBalance(this, id)
218218 case waves: Unit =>
219219 wavesBalance(this).available
220220 case _ =>
221221 throw("Match error")
222222 }
223223
224224
225225 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"))
226226
227227
228228 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
229229 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
230230 if ($isInstanceOf(@, "Int"))
231231 then @
232232 else throw(($getType(@) + " couldn't be cast to Int"))
233233 }, {
234234 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
235235 if ($isInstanceOf(@, "Int"))
236236 then @
237237 else throw(($getType(@) + " couldn't be cast to Int"))
238238 })
239239
240240
241241 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
242242 then getSFPoolBalances(poolAddr)
243243 else if ((type == WX_POOL))
244244 then getWXPoolBalances(poolAddr, aId, bId)
245245 else unknownPoolType()
246246
247247
248248 func getSFPoolData (poolAddr) = {
249249 let $t082738322 = getSFPoolBalances(poolAddr)
250250 if (($t082738322 == $t082738322))
251251 then {
252252 let balB = $t082738322._2
253253 let balA = $t082738322._1
254254 $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"))
255255 }
256256 else throw("Strict value is not equal to itself.")
257257 }
258258
259259
260260 func getWXPoolData (poolAddr) = {
261261 let cfg = {
262262 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
263263 if ($isInstanceOf(@, "List[Any]"))
264264 then @
265265 else throw(($getType(@) + " couldn't be cast to List[Any]"))
266266 }
267267 if ((cfg == cfg))
268268 then {
269269 let aId = valueOrErrorMessage({
270270 let @ = cfg[4]
271271 if ($isInstanceOf(@, "String"))
272272 then @
273273 else unit
274274 }, "Can't get pool A asset id")
275275 let bId = valueOrErrorMessage({
276276 let @ = cfg[5]
277277 if ($isInstanceOf(@, "String"))
278278 then @
279279 else unit
280280 }, "Can't get pool B asset id")
281281 let shareId = valueOrErrorMessage({
282282 let @ = cfg[3]
283283 if ($isInstanceOf(@, "String"))
284284 then @
285285 else unit
286286 }, "Can't get pool LP asset id")
287287 let $t090199078 = getWXPoolBalances(poolAddr, aId, bId)
288288 if (($t090199078 == $t090199078))
289289 then {
290290 let balB = $t090199078._2
291291 let balA = $t090199078._1
292292 $Tuple5(aId, bId, balA, balB, shareId)
293293 }
294294 else throw("Strict value is not equal to itself.")
295295 }
296296 else throw("Strict value is not equal to itself.")
297297 }
298298
299299
300300 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
301301 then getSFPoolData(poolAddr)
302302 else if ((type == WX_POOL))
303303 then getWXPoolData(poolAddr)
304304 else unknownPoolType()
305305
306306
307307 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
308308 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
309309 else if ((type == WX_POOL))
310310 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
311311 else unknownPoolType()
312312
313313
314314 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
315315
316316
317317 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
318318
319319
320320 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
321321
322322
323323 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
324324 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
325325 else if ((feeType == CAP_FEE_NO_LOAN))
326326 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
327327 else if ((feeType == LOAN_FEE))
328328 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
329329 else if ((feeType == NO_LOAN_FEE))
330330 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
331331 else if ((feeType == NO_FEE))
332332 then 0
333333 else throw("Wrong fee type")
334334
335335
336336 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
337337
338338
339339 func getWXFarmingAddr (poolAddr) = {
340340 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
341341 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
342342 Address(fromBase58String(factroyCfg[1]))
343343 }
344344
345345
346346 func assetIdToStr (assetId) = match assetId {
347347 case id: ByteVector =>
348348 toBase58String(id)
349349 case waves: Unit =>
350350 "WAVES"
351351 case _ =>
352352 throw("Not Asset id")
353353 }
354354
355355
356356 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
357357 then unit
358358 else fromBase58String(assetId)
359359
360360
361361 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
362362 then 8
363363 else match assetInfo(fromBase58String(assetId)) {
364364 case asset: Asset =>
365365 asset.decimals
366366 case _ =>
367367 throw("Can't find asset")
368368 }
369369
370370
371371 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
372372
373373
374374 func getAssetsPrice (assetIds) = {
375375 func getPrices (a,assetId) = {
376376 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
377377 (a :+ assetPrice)
378378 }
379379
380380 let $l = assetIds
381381 let $s = size($l)
382382 let $acc0 = nil
383383 func $f0_1 ($a,$i) = if (($i >= $s))
384384 then $a
385385 else getPrices($a, $l[$i])
386386
387387 func $f0_2 ($a,$i) = if (($i >= $s))
388388 then $a
389389 else throw("List size exceeds 50")
390390
391391 $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)
392392 }
393393
394394
395395 func getSharePrice (shareId) = {
396396 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
397397 let poolAddr = Address(fromBase58String(pool))
398398 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
399399 let $t01206712132 = getPoolData(poolAddr, pType)
400400 let aId = $t01206712132._1
401401 let bId = $t01206712132._2
402402 let aBalance = $t01206712132._3
403403 let bBalance = $t01206712132._4
404404 let prices = getAssetsPrice([aId, bId])
405405 let dPriceA = prices[0]
406406 let dPriceB = prices[1]
407407 if (if ((0 > dPriceA))
408408 then true
409409 else (0 > dPriceB))
410410 then -1
411411 else {
412412 let shareSupply = getShareSupply(poolAddr, pType, shareId)
413413 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
414414 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
415415 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
416416 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
417417 fraction(sum, sharePrecision, shareSupply)
418418 }
419419 }
420420
421421
422422 func getSharePrices (shareIds) = {
423423 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
424424
425425 let $l = shareIds
426426 let $s = size($l)
427427 let $acc0 = nil
428428 func $f0_1 ($a,$i) = if (($i >= $s))
429429 then $a
430430 else getPrices($a, $l[$i])
431431
432432 func $f0_2 ($a,$i) = if (($i >= $s))
433433 then $a
434434 else throw("List size exceeds 20")
435435
436436 $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)
437437 }
438438
439439
440440 func getCursEntries (aId,bId,shareId,wAmounts) = {
441441 let assetsPrices = getAssetsPrice([aId, bId])
442442 let sharePrice = getSharePrice(shareId)
443443 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
444444 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
445445 }
446446
447447
448-func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
448+func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
449449 then {
450450 let repl = {
451451 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
452452 if ($isInstanceOf(@, "List[Any]"))
453453 then @
454454 else throw(($getType(@) + " couldn't be cast to List[Any]"))
455455 }
456456 if ((repl == repl))
457457 then $Tuple5({
458458 let @ = repl[3]
459459 if ($isInstanceOf(@, "Int"))
460460 then @
461461 else throw(($getType(@) + " couldn't be cast to Int"))
462462 }, {
463463 let @ = repl[4]
464464 if ($isInstanceOf(@, "Int"))
465465 then @
466466 else throw(($getType(@) + " couldn't be cast to Int"))
467467 }, {
468468 let @ = repl[1]
469469 if ($isInstanceOf(@, "Int"))
470470 then @
471471 else throw(($getType(@) + " couldn't be cast to Int"))
472472 }, assetIdToStr(repl[2]), {
473473 let @ = repl[0]
474474 if ($isInstanceOf(@, "Int"))
475475 then @
476476 else throw(($getType(@) + " couldn't be cast to Int"))
477477 })
478478 else throw("Strict value is not equal to itself.")
479479 }
480480 else if ((pType == WX_POOL))
481481 then {
482- let $t01367613926 = $Tuple2(split({
483- let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
482+ let $t01369013948 = $Tuple2(split({
483+ let @ = invoke(wxRest, "evaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
484484 if ($isInstanceOf(@, "String"))
485485 then @
486486 else throw(($getType(@) + " couldn't be cast to String"))
487487 }, "__"), split({
488- let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
488+ let @ = invoke(wxRest, "evaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
489489 if ($isInstanceOf(@, "String"))
490490 then @
491491 else throw(($getType(@) + " couldn't be cast to String"))
492492 }, "__"))
493- if (($t01367613926 == $t01367613926))
493+ if (($t01369013948 == $t01369013948))
494494 then {
495- let evalPutInB = $t01367613926._2
496- let evalPutInA = $t01367613926._1
495+ let evalPutInB = $t01369013948._2
496+ let evalPutInA = $t01369013948._1
497497 let lpInA = parseIntValue(evalPutInA[1])
498498 let lpInB = parseIntValue(evalPutInB[1])
499499 if ((lpInB > lpInA))
500500 then {
501501 let pmt = parseIntValue(evalPutInA[8])
502502 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
503503 }
504504 else {
505505 let pmt = parseIntValue(evalPutInB[7])
506506 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
507507 }
508508 }
509509 else throw("Strict value is not equal to itself.")
510510 }
511511 else unknownPoolType()
512512
513513
514514 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
515515 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
516516 if ((pType == SF_POOL))
517517 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
518518 else if ((pType == WX_POOL))
519519 then invoke(poolAddr, "put", [1000000, false], payments)
520520 else unknownPoolType()
521521 }
522522
523523
524524 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
525525 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
526526 if ((pType == SF_POOL))
527527 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
528528 else if ((pType == WX_POOL))
529529 then {
530530 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
531531 then "putOneTknV2"
532532 else "putOneTkn"
533533 invoke(poolAddr, fc, [0, false], payments)
534534 }
535535 else unknownPoolType()
536536 }
537537
538538
539539 func stakeLP (pool,pType,shareId,amount) = {
540540 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
541541 if ((pType == SF_POOL))
542542 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
543543 else if ((pType == WX_POOL))
544544 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
545545 else unknownPoolType()
546546 }
547547
548548
549549 func unstakeLP (pool,pType,shareId,amount) = {
550- let $t01570416054 = if ((pType == SF_POOL))
550+ let $t01572616076 = if ((pType == SF_POOL))
551551 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
552552 else if ((pType == WX_POOL))
553553 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
554554 else unknownPoolType()
555- let farmAddr = $t01570416054._1
556- let fName = $t01570416054._2
557- let params = $t01570416054._3
555+ let farmAddr = $t01572616076._1
556+ let fName = $t01572616076._2
557+ let params = $t01572616076._3
558558 let inv = invoke(farmAddr, fName, params, nil)
559559 if ((inv == inv))
560560 then amount
561561 else throw("Strict value is not equal to itself.")
562562 }
563563
564564
565565 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
566566 let poolAddr = Address(fromBase58String(pool))
567567 let feeScale6 = 1000000
568568 let fee = getIntegerValue(poolAddr, kSFPoolFee)
569569 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
570- let $t01647616782 = if ((assetTokenToGet == assetIdA))
570+ let $t01649816804 = if ((assetTokenToGet == assetIdA))
571571 then {
572572 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
573573 $Tuple2(amountToPay, assetIdB)
574574 }
575575 else {
576576 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
577577 $Tuple2(amountToPay, assetIdA)
578578 }
579- let amountToPay = $t01647616782._1
580- let assetToPay = $t01647616782._2
579+ let amountToPay = $t01649816804._1
580+ let assetToPay = $t01649816804._2
581581 $Tuple2(assetToPay, amountToPay)
582582 }
583583
584584
585585 func getWXSwapFees (pool) = {
586586 let poolAddr = addressFromStringValue(pool)
587587 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
588588 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
589589 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
590590 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
591591 case fees: (Int, Int) =>
592592 $Tuple2(fees._1, fees._2)
593593 case _ =>
594594 $Tuple2(poolFeeDefault, protocolFeeDefault)
595595 }
596596 }
597597
598598
599599 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
600- let $t01752217561 = getWXSwapFees(pool)
601- let pFee = $t01752217561._1
602- let prFee = $t01752217561._2
600+ let $t01754417583 = getWXSwapFees(pool)
601+ let pFee = $t01754417583._1
602+ let prFee = $t01754417583._2
603603 let feeScale = toBigInt(100000000)
604- let $t01760117909 = if ((assetTokenToGet == assetIdA))
604+ let $t01762317931 = if ((assetTokenToGet == assetIdA))
605605 then {
606606 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
607607 $Tuple2(amountToPay, assetIdB)
608608 }
609609 else {
610610 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
611611 $Tuple2(amountToPay, assetIdA)
612612 }
613- let amountToPay = $t01760117909._1
614- let assetToPay = $t01760117909._2
613+ let amountToPay = $t01762317931._1
614+ let assetToPay = $t01762317931._2
615615 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
616616 $Tuple2(assetToPay, amountToPayWithFee)
617617 }
618618
619619
620620 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
621621 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
622622 if (if ((pType == SF_POOL))
623623 then true
624624 else (poolFB != ""))
625625 then {
626- let $t01835018562 = if ((poolFB == ""))
626+ let $t01837218584 = if ((poolFB == ""))
627627 then $Tuple3(balA, balB, pool)
628628 else {
629- let $t01845618529 = getSFPoolBalances(addressFromStringValue(poolFB))
630- let sfBalA = $t01845618529._1
631- let sfBalB = $t01845618529._2
629+ let $t01847818551 = getSFPoolBalances(addressFromStringValue(poolFB))
630+ let sfBalA = $t01847818551._1
631+ let sfBalB = $t01847818551._2
632632 $Tuple3(sfBalA, sfBalB, poolFB)
633633 }
634- let pBalA = $t01835018562._1
635- let pBalB = $t01835018562._2
636- let exPool = $t01835018562._3
637- let $t01856718693 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
638- let assetToPay = $t01856718693._1
639- let amountToPay = $t01856718693._2
634+ let pBalA = $t01837218584._1
635+ let pBalB = $t01837218584._2
636+ let exPool = $t01837218584._3
637+ let $t01858918715 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
638+ let assetToPay = $t01858918715._1
639+ let amountToPay = $t01858918715._2
640640 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
641641 }
642642 else if ((pType == WX_POOL))
643643 then {
644- let $t01889519017 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
645- let assetToPay = $t01889519017._1
646- let amountToPay = $t01889519017._2
644+ let $t01891719039 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
645+ let assetToPay = $t01891719039._1
646+ let amountToPay = $t01891719039._2
647647 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
648648 }
649649 else unknownPoolType()
650650 }
651651
652652
653653 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
654- let $t01930420539 = if ((pType == SF_POOL))
654+ let $t01932619799 = if ((pType == SF_POOL))
655655 then {
656656 let inv = {
657657 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
658658 if ($isInstanceOf(@, "List[Any]"))
659659 then @
660660 else throw(($getType(@) + " couldn't be cast to List[Any]"))
661661 }
662662 if ((inv == inv))
663663 then $Tuple2({
664664 let @ = inv[0]
665665 if ($isInstanceOf(@, "Int"))
666666 then @
667667 else throw(($getType(@) + " couldn't be cast to Int"))
668668 }, {
669669 let @ = inv[1]
670670 if ($isInstanceOf(@, "Int"))
671671 then @
672672 else throw(($getType(@) + " couldn't be cast to Int"))
673673 })
674674 else throw("Strict value is not equal to itself.")
675675 }
676676 else if ((pType == WX_POOL))
677- then if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
678- then {
679- let inv = invoke(poolAddr, "estimateGetOperationWrapperREADONLY", ["", shareId, userCanWithdraw, toString(this)], nil)
680- if ((inv == inv))
681- then {
682- let $t01979720294 = match inv {
683- case _ =>
684- if (if (if ($isInstanceOf($match0._1, "Int"))
685- then if ($isInstanceOf($match0._2, "Int"))
686- then if ($isInstanceOf($match0._5, "Int"))
687- then if ($isInstanceOf($match0._6, "Int"))
688- then if ($isInstanceOf($match0._7, "Int"))
689- then if ($isInstanceOf($match0._8, "String"))
690- then $isInstanceOf($match0._9, "String")
691- else false
692- else false
693- else false
694- else false
695- else false
696- else false)
697- then (size($match0) == 10)
698- else false)
699- then {
700- let outAmAmt = $match0._1
701- let outPrAmt = $match0._2
702- let amBalance = $match0._5
703- let prBalance = $match0._6
704- let lpEmission = $match0._7
705- let curPrice = $match0._8
706- let poolStatus = $match0._9
707- $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
708- }
709- else throw("Couldn't cast types")
710- }
711- let outAmAmt = $t01979720294._1
712- let outPrAmt = $t01979720294._2
713- let amBalance = $t01979720294._3
714- let prBalance = $t01979720294._4
715- let lpEmission = $t01979720294._5
716- let curPrice = $t01979720294._6
717- let poolStatus = $t01979720294._7
718- $Tuple2(outAmAmt, outPrAmt)
719- }
720- else throw("Strict value is not equal to itself.")
721- }
722- else {
723- let inv = split({
724- let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
725- if ($isInstanceOf(@, "String"))
726- then @
727- else throw(($getType(@) + " couldn't be cast to String"))
728- }, "__")
729- if ((inv == inv))
730- then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
731- else throw("Strict value is not equal to itself.")
732- }
677+ then {
678+ let inv = split({
679+ let @ = invoke(poolAddr, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
680+ if ($isInstanceOf(@, "String"))
681+ then @
682+ else throw(($getType(@) + " couldn't be cast to String"))
683+ }, "__")
684+ if ((inv == inv))
685+ then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
686+ else throw("Strict value is not equal to itself.")
687+ }
733688 else unknownPoolType()
734- let amountA = $t01930420539._1
735- let amountB = $t01930420539._2
689+ let amountA = $t01932619799._1
690+ let amountB = $t01932619799._2
736691 $Tuple2(amountA, amountB)
737692 }
738693
739694
740695 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
741696 then {
742697 let balBefore = accountBalance(SWOPID)
743698 if ((balBefore == balBefore))
744699 then {
745700 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
746701 if ((inv == inv))
747702 then {
748703 let balAfter = accountBalance(SWOPID)
749704 $Tuple2((balAfter - balBefore), SWOPID)
750705 }
751706 else throw("Strict value is not equal to itself.")
752707 }
753708 else throw("Strict value is not equal to itself.")
754709 }
755710 else if ((pType == WX_POOL))
756711 then {
757- let $t02090720986 = getWXPoolData(addressFromStringValue(pool))
758- let aId = $t02090720986._1
759- let bId = $t02090720986._2
760- let aBal = $t02090720986._3
761- let bBal = $t02090720986._4
762- let lpId = $t02090720986._5
712+ let $t02016720246 = getWXPoolData(addressFromStringValue(pool))
713+ let aId = $t02016720246._1
714+ let bId = $t02016720246._2
715+ let aBal = $t02016720246._3
716+ let bBal = $t02016720246._4
717+ let lpId = $t02016720246._5
763718 let balBefore = accountBalance(WXID)
764719 if ((balBefore == balBefore))
765720 then {
766721 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
767722 if ((inv == inv))
768723 then {
769724 let balAfter = accountBalance(WXID)
770725 $Tuple2((balAfter - balBefore), WXID)
771726 }
772727 else throw("Strict value is not equal to itself.")
773728 }
774729 else throw("Strict value is not equal to itself.")
775730 }
776731 else unknownPoolType()
777732
778733
779734 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
780735 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
781736 if ((lpBalanceBefore == lpBalanceBefore))
782737 then {
783738 let poolAddr = addressFromStringValue(pool)
784- let $t02158422000 = if (if ((pmtA > 0))
739+ let $t02084421266 = if (if ((pmtA > 0))
785740 then (pmtB > 0)
786741 else false)
787742 then {
788- let $t02165021766 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
789- let pmtInA = $t02165021766._1
790- let pmtInB = $t02165021766._2
791- let change = $t02165021766._3
792- let changeId = $t02165021766._4
743+ let $t02091021032 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
744+ let pmtInA = $t02091021032._1
745+ let pmtInB = $t02091021032._2
746+ let change = $t02091021032._3
747+ let changeId = $t02091021032._4
793748 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
794749 if ((inv == inv))
795750 then $Tuple2(change, changeId)
796751 else throw("Strict value is not equal to itself.")
797752 }
798753 else if ((pmtA > 0))
799754 then $Tuple2(pmtA, aId)
800755 else if ((pmtB > 0))
801756 then $Tuple2(pmtB, bId)
802757 else throw("pmts must be > 0")
803- let change = $t02158422000._1
804- let changeId = $t02158422000._2
758+ let change = $t02084421266._1
759+ let changeId = $t02084421266._2
805760 let inv = if ((change > 0))
806761 then replenishOneTokenByType(poolAddr, pType, change, changeId)
807762 else nil
808763 if ((inv == inv))
809764 then {
810765 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
811766 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
812767 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
813768 let userShareForStake = (totalStaked - axlyFeeAmount)
814769 if ((0 >= userShareForStake))
815770 then throw("amount of staked sharetokens must be > 0")
816771 else {
817772 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
818773 if ((invLP == invLP))
819774 then $Tuple2(userShareForStake, axlyFeeAmount)
820775 else throw("Strict value is not equal to itself.")
821776 }
822777 }
823778 else throw("Strict value is not equal to itself.")
824779 }
825780 else throw("Strict value is not equal to itself.")
826781 }
827782
828783
829784 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
830785 let totalAmount = getPoolTotalShare(pool)
831786 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
832- let $t02285723095 = if (withLoan)
787+ let $t02212322361 = if (withLoan)
833788 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
834789 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
835- let curPoolInterest = $t02285723095._1
836- let totalStakedWithLoan = $t02285723095._2
790+ let curPoolInterest = $t02212322361._1
791+ let totalStakedWithLoan = $t02212322361._2
837792 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), totalStakedWithLoan), 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))]
838793 }
839794
840795
841796 func listToInt (a,item) = (a :+ parseIntValue(item))
842797
843798
844799 func directSwopfiCPMM (rArgs,tokenTo) = {
845800 let dApp = addressFromStringValue(rArgs[1])
846801 let pmtP = split(rArgs[2], "|")
847802 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
848803 if ((tokenBalanceBefore == tokenBalanceBefore))
849804 then {
850805 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
851806 let minToRecive = rArgs[3]
852807 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
853808 if ((inv == inv))
854809 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
855810 else throw("Strict value is not equal to itself.")
856811 }
857812 else throw("Strict value is not equal to itself.")
858813 }
859814
860815
861816 func directRoutingSwopfi (rArgs,tokenTo) = {
862817 let dApp = addressFromStringValue(rArgs[1])
863818 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
864819 if ((tokenBalanceBefore == tokenBalanceBefore))
865820 then {
866821 let pmt = {
867822 let pmtP = split(rArgs[2], "|")
868823 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
869824 }
870825 let args = {
871826 let eArgs = split(rArgs[3], "|")
872827 let exchangers = split(eArgs[0], ",")
873828 let exchangersType = split(eArgs[1], ",")
874829 let args1 = {
875830 let $l = split(eArgs[2], ",")
876831 let $s = size($l)
877832 let $acc0 = nil
878833 func $f0_1 ($a,$i) = if (($i >= $s))
879834 then $a
880835 else listToInt($a, $l[$i])
881836
882837 func $f0_2 ($a,$i) = if (($i >= $s))
883838 then $a
884839 else throw("List size exceeds 3")
885840
886841 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
887842 }
888843 let args2 = {
889844 let $l = split(eArgs[3], ",")
890845 let $s = size($l)
891846 let $acc0 = nil
892847 func $f1_1 ($a,$i) = if (($i >= $s))
893848 then $a
894849 else listToInt($a, $l[$i])
895850
896851 func $f1_2 ($a,$i) = if (($i >= $s))
897852 then $a
898853 else throw("List size exceeds 3")
899854
900855 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
901856 }
902857 let routingAssetsKeys = split(eArgs[4], ",")
903858 let minToRecive = parseIntValue(eArgs[5])
904859 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
905860 }
906861 let inv = invoke(dApp, "routingTrade", args, pmt)
907862 if ((inv == inv))
908863 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
909864 else throw("Strict value is not equal to itself.")
910865 }
911866 else throw("Strict value is not equal to itself.")
912867 }
913868
914869
915870 func capitalize (pool,pType,tokenId,tokenAmount) = {
916871 let poolAddr = Address(fromBase58String(pool))
917- let $t02520225268 = getPoolData(poolAddr, pType)
918- let AId = $t02520225268._1
919- let BId = $t02520225268._2
920- let balA = $t02520225268._3
921- let balB = $t02520225268._4
922- let shareId = $t02520225268._5
872+ let $t02446824534 = getPoolData(poolAddr, pType)
873+ let AId = $t02446824534._1
874+ let BId = $t02446824534._2
875+ let balA = $t02446824534._3
876+ let balB = $t02446824534._4
877+ let shareId = $t02446824534._5
923878 if (if ((tokenId != AId))
924879 then (tokenId != BId)
925880 else false)
926881 then throw("Wrong asset")
927882 else {
928883 let totalShareAmount = getPoolTotalShare(pool)
929884 if ((totalShareAmount == 0))
930885 then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
931886 else {
932887 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
933888 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
934889 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
935890 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
936891 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
937892 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
938893 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
939- let $t02601326113 = if ((tokenId == AId))
894+ let $t02527925379 = if ((tokenId == AId))
940895 then $Tuple2((tokenAmount - axlyFee), 0)
941896 else $Tuple2(0, (tokenAmount - axlyFee))
942- let pmtA = $t02601326113._1
943- let pmtB = $t02601326113._2
944- let $t02611626220 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
945- let stakedAmount = $t02611626220._1
946- let nf = $t02611626220._2
897+ let pmtA = $t02527925379._1
898+ let pmtB = $t02527925379._2
899+ let $t02538225486 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
900+ let stakedAmount = $t02538225486._1
901+ let nf = $t02538225486._2
947902 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
948903 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
949904 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
950905 let stakedNoLoan = (stakedAmount - stakedLoan)
951906 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
952907 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
953908 else 0
954909 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
955910 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
956911 else 0
957912 ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
958913 }
959914 }
960915 }
961916
962917
963918 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
964919 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
965920 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
966921 let poolInterest = if (borrowed)
967922 then getIntegerValue(this, (pool + kPoolInterestLoan))
968923 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
969924 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
970925 }
971926
972927
973928 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
974929 let feeType = if (isBorrowed)
975930 then STOPLOSS_LOAN
976931 else STOPLOSS_FEE_NO_LOAN
977932 if (stopLoss)
978933 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
979934 else 0
980935 }
981936
982937
983938 func withdrawToUser (user,pool,posId,stopLoss) = {
984939 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
985940 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
986941 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
987942 let poolTotalShare = getPoolTotalShare(pool)
988943 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
989944 let userAddr = Address(fromBase58String(user))
990945 let poolAddr = Address(fromBase58String(pool))
991946 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
992- let $t02874928821 = getPoolData(poolAddr, pType)
993- let idAStr = $t02874928821._1
994- let idBStr = $t02874928821._2
995- let balA = $t02874928821._3
996- let balB = $t02874928821._4
997- let shareId = $t02874928821._5
998- let $t02882428891 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
999- let idA = $t02882428891._1
1000- let idB = $t02882428891._2
947+ let $t02801528087 = getPoolData(poolAddr, pType)
948+ let idAStr = $t02801528087._1
949+ let idBStr = $t02801528087._2
950+ let balA = $t02801528087._3
951+ let balB = $t02801528087._4
952+ let shareId = $t02801528087._5
953+ let $t02809028157 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
954+ let idA = $t02809028157._1
955+ let idB = $t02809028157._2
1001956 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
1002957 let cBalABefore = accountBalance(idA)
1003958 if ((cBalABefore == cBalABefore))
1004959 then {
1005960 let cBalBBefore = accountBalance(idB)
1006961 if ((cBalBBefore == cBalBBefore))
1007962 then {
1008963 let inv = if ((pType == SF_POOL))
1009964 then {
1010965 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
1011966 if ((inv == inv))
1012967 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
1013968 else throw("Strict value is not equal to itself.")
1014969 }
1015970 else if ((pType == WX_POOL))
1016971 then {
1017972 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
1018973 if ((inv == inv))
1019974 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
1020975 else throw("Strict value is not equal to itself.")
1021976 }
1022977 else unknownPoolType()
1023978 if ((inv == inv))
1024979 then {
1025980 let cBalAAfter = accountBalance(idA)
1026981 if ((cBalAAfter == cBalAAfter))
1027982 then {
1028983 let cBalBAfter = accountBalance(idB)
1029984 if ((cBalBAfter == cBalBAfter))
1030985 then {
1031- let $t02958629675 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1032- let tokensAmountA = $t02958629675._1
1033- let tokensAmountB = $t02958629675._2
1034- let $t02967830914 = if (isBorrowed)
986+ let $t02885228941 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
987+ let tokensAmountA = $t02885228941._1
988+ let tokensAmountB = $t02885228941._2
989+ let $t02894430180 = if (isBorrowed)
1035990 then {
1036991 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
1037992 let debt = {
1038993 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
1039994 if ($isInstanceOf(@, "Int"))
1040995 then @
1041996 else throw(($getType(@) + " couldn't be cast to Int"))
1042997 }
1043998 if ((debt == debt))
1044999 then {
10451000 let amountToGetEx = if (if ((borrowAsset == idAStr))
10461001 then (debt > tokensAmountA)
10471002 else false)
10481003 then (debt - tokensAmountA)
10491004 else if (if ((borrowAsset == idBStr))
10501005 then (debt > tokensAmountB)
10511006 else false)
10521007 then (debt - tokensAmountB)
10531008 else 0
10541009 let exInv = if ((amountToGetEx > 0))
10551010 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
10561011 else nil
10571012 if ((exInv == exInv))
10581013 then {
10591014 let cBalAAfterRepay = accountBalance(idA)
10601015 if ((cBalAAfterRepay == cBalAAfterRepay))
10611016 then {
10621017 let cBalBAfterRepay = accountBalance(idB)
10631018 if ((cBalBAfterRepay == cBalBAfterRepay))
10641019 then {
10651020 let closeDbtInv = if ((debt > 0))
10661021 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
10671022 else 0
10681023 if ((closeDbtInv == closeDbtInv))
10691024 then if ((borrowAsset == idAStr))
10701025 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
10711026 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
10721027 else throw("Strict value is not equal to itself.")
10731028 }
10741029 else throw("Strict value is not equal to itself.")
10751030 }
10761031 else throw("Strict value is not equal to itself.")
10771032 }
10781033 else throw("Strict value is not equal to itself.")
10791034 }
10801035 else throw("Strict value is not equal to itself.")
10811036 }
10821037 else $Tuple2(tokensAmountA, tokensAmountB)
1083- let toUserA = $t02967830914._1
1084- let toUserB = $t02967830914._2
1038+ let toUserA = $t02894430180._1
1039+ let toUserB = $t02894430180._2
10851040 let poolTotalLoanEntries = if (isBorrowed)
10861041 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10871042 else nil
10881043 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)), IntegerEntry((pool + kPoolTotal), ((poolTotalShare - userCanWithdraw) - stopLossFee)), ScriptTransfer(userAddr, toUserA, idA), ScriptTransfer(userAddr, toUserB, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
10891044 $Tuple2(entries, [toUserA, toUserB])
10901045 }
10911046 else throw("Strict value is not equal to itself.")
10921047 }
10931048 else throw("Strict value is not equal to itself.")
10941049 }
10951050 else throw("Strict value is not equal to itself.")
10961051 }
10971052 else throw("Strict value is not equal to itself.")
10981053 }
10991054 else throw("Strict value is not equal to itself.")
11001055 }
11011056
11021057
11031058 func parseRequest (requestId) = {
11041059 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
11051060 let user = request[0]
11061061 let pool = request[1]
11071062 let pmtA = parseIntValue(request[2])
11081063 let AId = request[3]
11091064 let pmtB = parseIntValue(request[4])
11101065 let BId = request[5]
11111066 let balA = parseIntValue(request[6])
11121067 let balB = parseIntValue(request[7])
11131068 let shareId = request[8]
11141069 let bwAsset = request[9]
11151070 let bwAmount = parseIntValue(request[10])
11161071 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
11171072 }
11181073
11191074
11201075 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
11211076 then (borrowId != bId)
11221077 else false)
11231078 then throw("Wrong borrow asset")
11241079 else {
11251080 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
11261081 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
11271082 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
11281083 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
11291084 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1130- let $t03289632993 = if ((borrowId == aId))
1085+ let $t03216232259 = if ((borrowId == aId))
11311086 then $Tuple2(dPriceA, decPrA)
11321087 else $Tuple2(dPriceB, decPrB)
1133- let borrowPrice = $t03289632993._1
1134- let borrowDecPr = $t03289632993._2
1088+ let borrowPrice = $t03216232259._1
1089+ let borrowDecPr = $t03216232259._2
11351090 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
11361091 }
11371092
11381093
11391094 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
11401095 then if ((assetIdToStr(pmts[0].assetId) != AId))
11411096 then throw("Wrong payment asset A")
11421097 else if ((assetIdToStr(pmts[1].assetId) != BId))
11431098 then throw("Wrong payment asset B")
11441099 else $Tuple2(pmts[0].amount, pmts[1].amount)
11451100 else if ((size(pmts) == 1))
11461101 then if ((assetIdToStr(pmts[0].assetId) == AId))
11471102 then $Tuple2(pmts[0].amount, 0)
11481103 else if ((assetIdToStr(pmts[0].assetId) == BId))
11491104 then $Tuple2(0, pmts[0].amount)
11501105 else throw("Wrong payment")
11511106 else throw("One or two payments expected")
11521107
11531108
11541109 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
11551110 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
11561111 if ((0 > pri))
11571112 then (pri * -1)
11581113 else pri
11591114 }
11601115
11611116
11621117 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1163- let $t03399334255 = if (claim)
1118+ let $t03325933521 = if (claim)
11641119 then claimFarmed(pType, pool)
11651120 else {
11661121 let claimedAsset = if ((pType == SF_POOL))
11671122 then SWOPID
11681123 else if ((pType == WX_POOL))
11691124 then WXID
11701125 else unknownPoolType()
11711126 $Tuple2(amount, claimedAsset)
11721127 }
1173- if (($t03399334255 == $t03399334255))
1128+ if (($t03325933521 == $t03325933521))
11741129 then {
1175- let claimAsset = $t03399334255._2
1176- let claimAmount = $t03399334255._1
1130+ let claimAsset = $t03325933521._2
1131+ let claimAmount = $t03325933521._1
11771132 let bal = accountBalance(claimAsset)
11781133 if ((bal == bal))
11791134 then if ((amount > bal))
11801135 then throw("To big amount to exchange")
11811136 else $Tuple2(claimAmount, claimAsset)
11821137 else throw("Strict value is not equal to itself.")
11831138 }
11841139 else throw("Strict value is not equal to itself.")
11851140 }
11861141
11871142
11881143 @Callable(i)
11891144 func getPoolInfoREADONLY (pool) = {
11901145 let poolAddr = addressFromStringValue(pool)
11911146 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1192- let $t03462234712 = getPoolData(Address(fromBase58String(pool)), pType)
1193- let AId = $t03462234712._1
1194- let BId = $t03462234712._2
1195- let balA = $t03462234712._3
1196- let balB = $t03462234712._4
1197- let shareId = $t03462234712._5
1147+ let $t03388833978 = getPoolData(Address(fromBase58String(pool)), pType)
1148+ let AId = $t03388833978._1
1149+ let BId = $t03388833978._2
1150+ let balA = $t03388833978._3
1151+ let balB = $t03388833978._4
1152+ let shareId = $t03388833978._5
11981153 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11991154 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
12001155 }
12011156
12021157
12031158
12041159 @Callable(i)
12051160 func getShareAssetPriceREADONLY (shareId) = {
12061161 let sharePrices = getSharePrice(shareId)
12071162 $Tuple2(nil, sharePrices)
12081163 }
12091164
12101165
12111166
12121167 @Callable(i)
12131168 func getUserPositionShareAmountREADONLY (user,posNum) = {
12141169 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
12151170 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
12161171 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
12171172 $Tuple2(nil, userCanWithdraw)
12181173 }
12191174
12201175
12211176
12221177 @Callable(i)
12231178 func getUserPositionREADONLY (user,pools,posNum) = {
12241179 func userPos (a,pool) = {
1225- let $t03558535655 = a
1226- let wAmountsA = $t03558535655._1
1227- let wAmountsB = $t03558535655._2
1228- let debts = $t03558535655._3
1229- let eqWAmountsA = $t03558535655._4
1230- let eqWAmountsB = $t03558535655._5
1231- let index = $t03558535655._6
1180+ let $t03485134921 = a
1181+ let wAmountsA = $t03485134921._1
1182+ let wAmountsB = $t03485134921._2
1183+ let debts = $t03485134921._3
1184+ let eqWAmountsA = $t03485134921._4
1185+ let eqWAmountsB = $t03485134921._5
1186+ let index = $t03485134921._6
12321187 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
12331188 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
12341189 else {
12351190 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1236- let $t03593436024 = getPoolData(Address(fromBase58String(pool)), pType)
1237- let AId = $t03593436024._1
1238- let BId = $t03593436024._2
1239- let balA = $t03593436024._3
1240- let balB = $t03593436024._4
1241- let shareId = $t03593436024._5
1191+ let $t03520035290 = getPoolData(Address(fromBase58String(pool)), pType)
1192+ let AId = $t03520035290._1
1193+ let BId = $t03520035290._2
1194+ let balA = $t03520035290._3
1195+ let balB = $t03520035290._4
1196+ let shareId = $t03520035290._5
12421197 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
12431198 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1244- let $t03624036360 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1245- let wAmountA = $t03624036360._1
1246- let wAmountB = $t03624036360._2
1199+ let $t03550635626 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1200+ let wAmountA = $t03550635626._1
1201+ let wAmountB = $t03550635626._2
12471202 if ((borrowAmount > 0))
12481203 then {
12491204 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12501205 let debt = {
12511206 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
12521207 if ($isInstanceOf(@, "Int"))
12531208 then @
12541209 else throw(($getType(@) + " couldn't be cast to Int"))
12551210 }
12561211 if ((debt == debt))
12571212 then {
12581213 let amountToGetEx = if (if ((borrowAsset == AId))
12591214 then (debt > wAmountA)
12601215 else false)
12611216 then (debt - wAmountA)
12621217 else if (if ((borrowAsset == BId))
12631218 then (debt > wAmountB)
12641219 else false)
12651220 then (debt - wAmountB)
12661221 else 0
12671222 let amountToPay = if ((amountToGetEx > 0))
12681223 then if ((pType == SF_POOL))
12691224 then {
12701225 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12711226 ex._2
12721227 }
12731228 else if ((pType == WX_POOL))
12741229 then {
12751230 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12761231 ex._2
12771232 }
12781233 else unknownPoolType()
12791234 else 0
1280- let $t03727237491 = if ((borrowAsset == AId))
1235+ let $t03653836757 = if ((borrowAsset == AId))
12811236 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12821237 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1283- let eqWAmountA = $t03727237491._1
1284- let eqWAmountB = $t03727237491._2
1238+ let eqWAmountA = $t03653836757._1
1239+ let eqWAmountB = $t03653836757._2
12851240 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12861241 }
12871242 else throw("Strict value is not equal to itself.")
12881243 }
12891244 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
12901245 }
12911246 }
12921247
1293- let $t03774637857 = {
1248+ let $t03701237123 = {
12941249 let $l = pools
12951250 let $s = size($l)
12961251 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12971252 func $f0_1 ($a,$i) = if (($i >= $s))
12981253 then $a
12991254 else userPos($a, $l[$i])
13001255
13011256 func $f0_2 ($a,$i) = if (($i >= $s))
13021257 then $a
13031258 else throw("List size exceeds 20")
13041259
13051260 $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)
13061261 }
1307- let wAmountsA = $t03774637857._1
1308- let wAmountsB = $t03774637857._2
1309- let debts = $t03774637857._3
1310- let eqWAmountsA = $t03774637857._4
1311- let eqWAmountsB = $t03774637857._5
1262+ let wAmountsA = $t03701237123._1
1263+ let wAmountsB = $t03701237123._2
1264+ let debts = $t03701237123._3
1265+ let eqWAmountsA = $t03701237123._4
1266+ let eqWAmountsB = $t03701237123._5
13121267 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
13131268 }
13141269
13151270
13161271
13171272 @Callable(i)
13181273 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
13191274 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
13201275 if (!(isPoolActive(pool, pType)))
13211276 then throw("Pool not active at this moment")
13221277 else if (if ((100 > leverage))
13231278 then true
13241279 else (leverage > 300))
13251280 then throw("Leverage can't be <100 and >300")
13261281 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
13271282 then (leverage > 100)
13281283 else false)
13291284 then throw("You can't borrow in this pool")
13301285 else {
1331- let $t03845538545 = getPoolData(Address(fromBase58String(pool)), pType)
1332- let AId = $t03845538545._1
1333- let BId = $t03845538545._2
1334- let balA = $t03845538545._3
1335- let balB = $t03845538545._4
1336- let shareId = $t03845538545._5
1286+ let $t03772137811 = getPoolData(Address(fromBase58String(pool)), pType)
1287+ let AId = $t03772137811._1
1288+ let BId = $t03772137811._2
1289+ let balA = $t03772137811._3
1290+ let balB = $t03772137811._4
1291+ let shareId = $t03772137811._5
13371292 if (if ((borrowId != AId))
13381293 then (borrowId != BId)
13391294 else false)
13401295 then throw("Wrong borrow asset")
13411296 else {
1342- let $t03862638685 = parseReplenishPmts(i.payments, AId, BId)
1343- let pmtA = $t03862638685._1
1344- let pmtB = $t03862638685._2
1297+ let $t03789237951 = parseReplenishPmts(i.payments, AId, BId)
1298+ let pmtA = $t03789237951._1
1299+ let pmtB = $t03789237951._2
13451300 let user = toString(i.caller)
13461301 let newPosNum = getNewUserPositionNumber(user)
13471302 if ((leverage > 100))
13481303 then {
13491304 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
13501305 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
13511306 let newRequestId = {
13521307 let @ = invoke(this, "createNewRequest", [request], nil)
13531308 if ($isInstanceOf(@, "Int"))
13541309 then @
13551310 else throw(($getType(@) + " couldn't be cast to Int"))
13561311 }
13571312 if ((newRequestId == newRequestId))
13581313 then {
13591314 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
13601315 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
13611316 if ((inv == inv))
13621317 then {
13631318 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1364- let $t03967439768 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1365- if (($t03967439768 == $t03967439768))
1319+ let $t03894039034 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1320+ if (($t03894039034 == $t03894039034))
13661321 then {
1367- let newBalB = $t03967439768._2
1368- let newBalA = $t03967439768._1
1322+ let newBalB = $t03894039034._2
1323+ let newBalA = $t03894039034._1
13691324 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1370- let $t03983839953 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1371- let wAmountA = $t03983839953._1
1372- let wAmountB = $t03983839953._2
1325+ let $t03910439219 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1326+ let wAmountA = $t03910439219._1
1327+ let wAmountB = $t03910439219._2
13731328 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13741329 }
13751330 else throw("Strict value is not equal to itself.")
13761331 }
13771332 else throw("Strict value is not equal to itself.")
13781333 }
13791334 else throw("Strict value is not equal to itself.")
13801335 }
13811336 else {
1382- let $t04000640121 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1383- if (($t04000640121 == $t04000640121))
1337+ let $t03927239387 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1338+ if (($t03927239387 == $t03927239387))
13841339 then {
1385- let axlyFee = $t04000640121._2
1386- let userStaked = $t04000640121._1
1387- let $t04012740221 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1388- if (($t04012740221 == $t04012740221))
1340+ let axlyFee = $t03927239387._2
1341+ let userStaked = $t03927239387._1
1342+ let $t03939339487 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1343+ if (($t03939339487 == $t03939339487))
13891344 then {
1390- let newBalB = $t04012740221._2
1391- let newBalA = $t04012740221._1
1345+ let newBalB = $t03939339487._2
1346+ let newBalA = $t03939339487._1
13921347 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1393- let $t04029140406 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1394- let wAmountA = $t04029140406._1
1395- let wAmountB = $t04029140406._2
1348+ let $t03955739672 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1349+ let wAmountA = $t03955739672._1
1350+ let wAmountB = $t03955739672._2
13961351 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13971352 }
13981353 else throw("Strict value is not equal to itself.")
13991354 }
14001355 else throw("Strict value is not equal to itself.")
14011356 }
14021357 }
14031358 }
14041359 })
14051360
14061361
14071362
14081363 @Callable(i)
14091364 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
14101365 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
14111366 if (!(isPoolActive(pool, pType)))
14121367 then throw("Pool not active at this moment")
14131368 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
14141369 })
14151370
14161371
14171372
14181373 @Callable(i)
14191374 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
14201375 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14211376 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
14221377 if (!(isPoolActive(poolId, pType)))
14231378 then throw("Pool not active at this moment")
14241379 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
14251380 then throw("There are no user position")
14261381 else if ((0 >= price))
14271382 then throw("Price must be greater than 0")
14281383 else if ((price > tokenOraclePrice))
14291384 then throw("Price must be less than current token price")
14301385 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
14311386 })
14321387
14331388
14341389
14351390 @Callable(i)
14361391 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
14371392 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
14381393 if (!(isPoolActive(poolId, pType)))
14391394 then throw("Pool not active at this moment")
14401395 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
14411396 then throw("No entry")
14421397 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
14431398 })
14441399
14451400
14461401
14471402 @Callable(i)
14481403 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
14491404 then throw("Already inited")
14501405 else if (!(isDefined(addressFromString(moneyBoxAddr))))
14511406 then throw("moneyBoxAddr is not correct address")
14521407 else if (!(isDefined(addressFromString(sfFarmingAddr))))
14531408 then throw("sfFarmingAddr is not correct address")
14541409 else if (!(isDefined(addressFromString(lendAddr))))
14551410 then throw("lendAddr is not correct address")
14561411 else if (!(isDefined(addressFromString(priceOracleAddr))))
14571412 then throw("priceOracleAddr is not correct address")
14581413 else if (!(isDefined(addressFromString(keeperExContract))))
14591414 then throw("keeperExContract is not correct address")
14601415 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
14611416 then throw("swopAssetId is not correct asset id")
14621417 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
14631418 then throw("swopAssetId is not correct asset id")
14641419 else if ((size(fromBase58String(operatorPubKey)) != 32))
14651420 then throw("operatorPubKey is not correct")
14661421 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
14671422 then throw("group1Admin1PubKey is not correct")
14681423 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
14691424 then throw("group1Admin2PubKey is not correct")
14701425 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
14711426 then throw("group2Admin1PubKey is not correct")
14721427 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
14731428 then throw("group2Admin2PubKey is not correct")
14741429 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)])
14751430
14761431
14771432
14781433 @Callable(i)
14791434 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
14801435 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
14811436 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
14821437 })
14831438
14841439
14851440
14861441 @Callable(i)
14871442 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1488- let $t04524545349 = parseRequest(requestId)
1489- let user = $t04524545349._1
1490- let pool = $t04524545349._2
1491- let pmtA = $t04524545349._3
1492- let AId = $t04524545349._4
1493- let pmtB = $t04524545349._5
1494- let BId = $t04524545349._6
1495- let balA = $t04524545349._7
1496- let balB = $t04524545349._8
1497- let shareId = $t04524545349._9
1498- let bwAsset = $t04524545349._10
1499- let bwAmount = $t04524545349._11
1443+ let $t04451144615 = parseRequest(requestId)
1444+ let user = $t04451144615._1
1445+ let pool = $t04451144615._2
1446+ let pmtA = $t04451144615._3
1447+ let AId = $t04451144615._4
1448+ let pmtB = $t04451144615._5
1449+ let BId = $t04451144615._6
1450+ let balA = $t04451144615._7
1451+ let balB = $t04451144615._8
1452+ let shareId = $t04451144615._9
1453+ let bwAsset = $t04451144615._10
1454+ let bwAmount = $t04451144615._11
15001455 if ((size(i.payments) != 1))
15011456 then throw("Wrong payment size")
15021457 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
15031458 then true
15041459 else (i.payments[0].amount != bwAmount))
15051460 then throw("Wrong payment")
15061461 else {
1507- let $t04553945639 = if ((AId == bwAsset))
1462+ let $t04480544905 = if ((AId == bwAsset))
15081463 then $Tuple2((pmtA + bwAmount), pmtB)
15091464 else $Tuple2(pmtA, (pmtB + bwAmount))
1510- let pmtAllA = $t04553945639._1
1511- let pmtAllB = $t04553945639._2
1465+ let pmtAllA = $t04480544905._1
1466+ let pmtAllB = $t04480544905._2
15121467 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1513- let $t04572145836 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1514- let userStaked = $t04572145836._1
1515- let axlyFee = $t04572145836._2
1468+ let $t04498745102 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1469+ let userStaked = $t04498745102._1
1470+ let axlyFee = $t04498745102._2
15161471 let posNum = getNewUserPositionNumber(user)
15171472 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
15181473 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1519- let $t04619646311 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1520- let wAmountA = $t04619646311._1
1521- let wAmountB = $t04619646311._2
1474+ let $t04546245577 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1475+ let wAmountA = $t04546245577._1
1476+ let wAmountB = $t04546245577._2
15221477 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
15231478 }
15241479 }))
15251480
15261481
15271482
15281483 @Callable(i)
15291484 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
15301485 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
15311486 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1532- let $t04683246922 = getPoolData(Address(fromBase58String(pool)), pType)
1533- let AId = $t04683246922._1
1534- let BId = $t04683246922._2
1535- let balA = $t04683246922._3
1536- let balB = $t04683246922._4
1537- let shareId = $t04683246922._5
1487+ let $t04609846188 = getPoolData(Address(fromBase58String(pool)), pType)
1488+ let AId = $t04609846188._1
1489+ let BId = $t04609846188._2
1490+ let balA = $t04609846188._3
1491+ let balB = $t04609846188._4
1492+ let shareId = $t04609846188._5
15381493 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
15391494 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
15401495 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15411496 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
15421497 if ((liquidateAmount > userCanWithdraw))
15431498 then throw("You can't liquidate more than user have")
15441499 else if ((borrowAmount == 0))
15451500 then throw("You can't liquidate position without borrow")
15461501 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))]
15471502 }))
15481503
15491504
15501505
15511506 @Callable(i)
15521507 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15531508 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
15541509 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
15551510 if ((tokenOraclePrice > stopLossPrice))
15561511 then throw("Token price greater stop loss price")
15571512 else {
15581513 let res = withdrawToUser(user, pool, toString(posId), true)
15591514 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
15601515 }
15611516 }))
15621517
15631518
15641519
15651520 @Callable(i)
15661521 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15671522 let pType = getStringValue(this, (kPool + pool))
15681523 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1569- let $t04889248994 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1570- if (($t04889248994 == $t04889248994))
1524+ let $t04815848260 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1525+ if (($t04815848260 == $t04815848260))
15711526 then {
1572- let claimedAsset = $t04889248994._2
1573- let claimedAmount = $t04889248994._1
1527+ let claimedAsset = $t04815848260._2
1528+ let claimedAmount = $t04815848260._1
15741529 let rArgs = split(route, "__")
15751530 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15761531 then directSwopfiCPMM(rArgs, tokenToId)
15771532 else if ((rArgs[0] == "routingSwopfi"))
15781533 then directRoutingSwopfi(rArgs, tokenToId)
15791534 else throw("Wrong route")
15801535 if ((exchangedAmount == exchangedAmount))
15811536 then {
15821537 let newChange = ((claimedAmount + change) - amountToExchange)
15831538 let changeEntry = if ((newChange >= 0))
15841539 then [IntegerEntry((pool + kPoolCapChange), newChange)]
15851540 else nil
15861541 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
15871542 }
15881543 else throw("Strict value is not equal to itself.")
15891544 }
15901545 else throw("Strict value is not equal to itself.")
15911546 }))
15921547
15931548
15941549
15951550 @Callable(i)
15961551 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15971552 let pType = getStringValue(this, (kPool + pool))
1598- let $t04967849776 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1599- if (($t04967849776 == $t04967849776))
1553+ let $t04894449042 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1554+ if (($t04894449042 == $t04894449042))
16001555 then {
1601- let claimedAsset = $t04967849776._2
1602- let claimedAmount = $t04967849776._1
1556+ let claimedAsset = $t04894449042._2
1557+ let claimedAmount = $t04894449042._1
16031558 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
16041559 }
16051560 else throw("Strict value is not equal to itself.")
16061561 }))
16071562
16081563
16091564
16101565 @Callable(i)
16111566 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
16121567 then (type != WX_POOL)
16131568 else false)
16141569 then throw("Wrong type")
16151570 else if (if ((poolType != CPMM))
16161571 then (poolType != FLAT)
16171572 else false)
16181573 then throw("Wrong pool type")
16191574 else {
1620- let $t05029750391 = getPoolData(Address(fromBase58String(poolAddr)), type)
1621- let aId = $t05029750391._1
1622- let bId = $t05029750391._2
1623- let aBal = $t05029750391._3
1624- let bBal = $t05029750391._4
1625- let shareId = $t05029750391._5
1575+ let $t04956349657 = getPoolData(Address(fromBase58String(poolAddr)), type)
1576+ let aId = $t04956349657._1
1577+ let bId = $t04956349657._2
1578+ let aBal = $t04956349657._3
1579+ let bBal = $t04956349657._4
1580+ let shareId = $t04956349657._5
16261581 if ((0 > inFeeNoLoan))
16271582 then throw("inFeeNoLoan must be greater than 0")
16281583 else if ((0 > inFeeLoan))
16291584 then throw("inFeeLoan must be greater than 0")
16301585 else if ((0 > capFeeNoLoan))
16311586 then throw("capFeeNoLoan must be greater than 0")
16321587 else if ((0 > capFeeWithLoan))
16331588 then throw("capFeeWithLoan must be greater than 0")
16341589 else if ((0 > stoplossFeeNoLoan))
16351590 then throw("stoplossFeeNoLoan must be greater than 0")
16361591 else if ((0 > stoplossFeeWithLoan))
16371592 then throw("stoplossFeeWithLoan must be greater than 0")
16381593 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)]
16391594 }))
16401595
16411596
16421597
16431598 @Callable(i)
16441599 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
16451600 then throw(("Can't find pool with addr " + poolAddr))
16461601 else if ((0 > inFeeNoLoan))
16471602 then throw("inFeeNoLoan must be greater than 0")
16481603 else if ((0 > inFeeLoan))
16491604 then throw("inFeeLoan must be greater than 0")
16501605 else if ((0 > capFeeNoLoan))
16511606 then throw("capFeeNoLoan must be greater than 0")
16521607 else if ((0 > capFeeWithLoan))
16531608 then throw("capFeeWithLoan must be greater than 0")
16541609 else if ((0 > stoplossFeeNoLoan))
16551610 then throw("stoplossFeeNoLoan must be greater than 0")
16561611 else if ((0 > stoplossFeeWithLoan))
16571612 then throw("stoplossFeeWithLoan must be greater than 0")
16581613 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)]))
16591614
16601615
16611616
16621617 @Callable(i)
16631618 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
16641619 then throw("dApp already active")
16651620 else [BooleanEntry(kActive, true)])
16661621
16671622
16681623
16691624 @Callable(i)
16701625 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
16711626 then throw("dApp already shutdown")
16721627 else [BooleanEntry(kActive, false)])
16731628
16741629
16751630
16761631 @Callable(i)
16771632 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
16781633 then throw("dApp already active for users")
16791634 else [BooleanEntry(kActiveUsers, true)])
16801635
16811636
16821637
16831638 @Callable(i)
16841639 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
16851640 then throw("dApp already shutdown for users")
16861641 else [BooleanEntry(kActiveUsers, false)])
16871642
16881643
16891644
16901645 @Callable(i)
16911646 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
16921647 then throw("SWOPFI already active")
16931648 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
16941649
16951650
16961651
16971652 @Callable(i)
16981653 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
16991654 then throw("SWOPFI already shutdown")
17001655 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
17011656
17021657
17031658
17041659 @Callable(i)
17051660 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
17061661 then throw("WX already active")
17071662 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
17081663
17091664
17101665
17111666 @Callable(i)
17121667 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
17131668 then throw("WX already shutdown")
17141669 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
17151670
17161671
17171672
17181673 @Callable(i)
17191674 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
17201675 then throw("Unknown pool")
17211676 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
17221677 then throw("Pool already active")
17231678 else [BooleanEntry((pool + kPoolActive), true)])
17241679
17251680
17261681
17271682 @Callable(i)
17281683 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
17291684 then throw("Unknown pool")
17301685 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
17311686 then throw("Pool already shutdown")
17321687 else [BooleanEntry((pool + kPoolActive), false)])
17331688
17341689
17351690 @Verifier(tx)
17361691 func verify () = match tx {
17371692 case inv: InvokeScriptTransaction =>
17381693 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
17391694 let isRightFee = if ((inv.fee == 900000))
17401695 then (inv.feeAssetId == unit)
17411696 else false
17421697 let isInitCall = (inv.function == "init")
17431698 let isnoPayments = (size(inv.payments) == 0)
17441699 if (if (if (isRightFee)
17451700 then isInitCall
17461701 else false)
17471702 then isSelf
17481703 else false)
17491704 then isnoPayments
17501705 else false
17511706 case _ =>
17521707 let group1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
17531708 then 1
17541709 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin2PK))
17551710 then 1
17561711 else 0))
17571712 let group2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin1PK))
17581713 then 1
17591714 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin2PK))
17601715 then 1
17611716 else 0))
17621717 ((group1Signed + group2Signed) == 2)
17631718 }
17641719

github/deemru/w8io/026f985 
274.96 ms