tx · EmE7pLpydxq8jBZsAEfbVgufsBkXyCvGiHfSXpHvCmQR

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.05800000 Waves

2023.10.20 17:16 [3872880] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "EmE7pLpydxq8jBZsAEfbVgufsBkXyCvGiHfSXpHvCmQR", "fee": 5800000, "feeAssetId": null, "timestamp": 1697811385340, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "32e8kLDgzUUJrXpvNPTqRpAqUv4xTcm35wjrVMkWw8GhgJ4SJrKFEkjbmpBz6FmBgiu5BMUrEybg7gvnvrYQTNsZ", "5MidCu7tUUcPkmtPvp31mX3bFnKfckHEC71nEWePU2itfpvzb6WqH8TZzumTpJ5DLFZgDEfhjqZiTioYykHQRoMP" ], "script": "base64:BgKiAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEgcKBQgICAEEEgUKAwgEARIMCgoICAgBAQEBAQEEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCIgBAARDT05GCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgZjb25maWcAB1NGX1BPT0wCAlNGAAdXWF9QT09MAgJXWAAEQ1BNTQIEY3BtbQAERkxBVAIEZmxhdAAPQ0FQX0ZFRV9OT19MT0FOAgljYXBOb0xvYW4ADENBUF9GRUVfTE9BTgIHY2FwTG9hbgAUU1RPUExPU1NfRkVFX05PX0xPQU4CDnN0b3BMb3NzTm9Mb2FuAA1TVE9QTE9TU19MT0FOAgxzdG9wTG9zc0xvYW4ACExPQU5fRkVFAgRsb2FuAAtOT19MT0FOX0ZFRQIGbm9Mb2FuAAZOT19GRUUCBW5vRmVlAAZTQ0FMRTgAgMLXLwAHU0NBTEUxMACAyK+gJQAHU0NBTEUxNgkAtgIBAICAhP6m3uERAApGRUVfU0NBTEU2AMCEPQAUa1NGUG9vbEFBc3NldEJhbGFuY2UCD0FfYXNzZXRfYmFsYW5jZQAUa1NGUG9vbEJBc3NldEJhbGFuY2UCD0JfYXNzZXRfYmFsYW5jZQAPa1NGUG9vbEFBc3NldElkAgpBX2Fzc2V0X2lkAA9rU0ZQb29sQkFzc2V0SWQCCkJfYXNzZXRfaWQADmtTRlBvb2xTaGFyZUlkAg5zaGFyZV9hc3NldF9pZAASa1NGUG9vbFNoYXJlU3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkACmtTRlBvb2xGZWUCCmNvbW1pc3Npb24ADWtVc2VyUG9zaXRpb24CDV91c2VyUG9zaXRpb24AEWtVc2VyUG9zaXRpb25Qb29sAhFfdXNlclBvc2l0aW9uUG9vbAARa1VzZXJCb3Jyb3dBbW91bnQCGV91c2VyUG9zaXRpb25Cb3Jyb3dBbW91bnQAEmtVc2VyQm9ycm93QXNzZXRJZAIaX3VzZXJQb3NpdGlvbkJvcnJvd0Fzc2V0SWQAEGtVc2VyUG9zaXRpb25OdW0CE191c2VyUG9zaXRpb25OdW1iZXIAFWtVc2VyUG9zaXRpb25JbnRlcmVzdAIVX3VzZXJQb3NpdGlvbkludGVyZXN0AAprUG9vbFRvdGFsAgpfcG9vbFRvdGFsAA5rUG9vbFRvdGFsTG9hbgIOX3Bvb2xUb3RhbExvYW4AEWtQb29sSW50ZXJlc3RMb2FuAhFfcG9vbEludGVyZXN0TG9hbgATa1Bvb2xJbnRlcmVzdE5vTG9hbgITX3Bvb2xJbnRlcmVzdE5vTG9hbgAOa1Bvb2xDYW5Cb3Jyb3cCDl9wb29sQ2FuQm9ycm93ABVrQXhseUluRmVlV2l0aG91dExvYW4CDl9heGx5RmVlTm9Mb2FuABJrQXhseUluRmVlV2l0aExvYW4CEF9heGx5RmVlV2l0aExvYW4AEWtBeGx5Tm9Mb2FuQ2FwRmVlAhFfYXhseUZlZUNhcE5vTG9hbgATa0F4bHlXaXRoTG9hbkNhcEZlZQITX2F4bHlGZWVDYXBXaXRoTG9hbgAWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQIYX2F4bHlGZWVTdG9wbG9zc1dpdGhMb2FuABRrQXhseVN0b3BMb3NzTG9hbkZlZQIWX2F4bHlGZWVTdG9wbG9zc05vTG9hbgAKa1JlcXVlc3RJZAILX3JlcXVlc3RfaWQADGtSZXF1ZXN0SXRlcgINcmVxdWVzdHNfaXRlcgAFa1Bvb2wCBXBvb2xfAAlrUG9vbFR5cGUCCV9wb29sVHlwZQAKa1NoYXJlUG9vbAIMX3Bvb2xTaGFyZUlkAA5rUG9vbENhcENoYW5nZQIOX3Bvb2xDYXBDaGFuZ2UAD2tUb2tlbkxhc3RQcmljZQIKbGFzdF9wcmljZQAOa1ByaWNlSW5PcmFjbGUCB190d2FwNUIAB2tBY3RpdmUCBmFjdGl2ZQAMa0FjdGl2ZVVzZXJzAgthY3RpdmVVc2VycwALa0FjdGl2ZVNGV1gCB19hY3RpdmUAC2tQb29sQWN0aXZlAgtfYWN0aXZlUG9vbAANa1VzZXJTdG9wTG9zcwIJX3N0b3BMb3NzABdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIXX2ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkACWtNb25leUJveAIOYXhseV9tb25leV9ib3gADmtTRkZhcm1pbmdBZGRyAhNzd29wZmlfZmFybWluZ19hZGRyAAxrTGVuZFNlcnZpY2UCEWxlbmRfc2VydmljZV9hZGRyAA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAC2tFeENvbnRyYWN0AhFleGNoYW5nZV9jb250cmFjdAAPa1d4U3dhcENvbnRyYWN0AhB3eF9zd2FwX2NvbnRyYWN0AAdrV3hSZXN0Agx3eF9yZXN0X2FkZHIAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAPa0dyb3VwMUFkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQtrRXhDb250cmFjdAIcTm8gZXhjaGFuZ2UgY29udHJhY3QgYWRkcmVzcwAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGd3hSZXN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUHa1d4UmVzdAISTm8gd3ggcmVzdCBhZGRyZXNzAAZTV09QSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tTd29wSWQCCk5vIHN3b3AgaWQABFdYSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFBWtXeElkAghObyB3eCBpZAAOZ3JvdXAxQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tHcm91cDFBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjFQSwAOZ3JvdXAxQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tHcm91cDFBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjJQSwAOZ3JvdXAyQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAOZ3JvdXAyQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAKb3BlcmF0b3JQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa09wZXJhdG9yQ2FsbFBLAhRDYW4ndCBnZXQgb3BlcmF0b3JQSwEPdW5rbm93blBvb2xUeXBlAAkAAgECD1dyb25nIHBvb2wgdHlwZQEOZ2V0TGVuZFNydkFkZHIACQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa0xlbmRTZXJ2aWNlAhtDYW4ndCBnZXQgbGVuZCBzZXJ2aWNlIGFkZHIBDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBAWkDAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4xUEsGCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjJQSwUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIJAQ5nZXRMZW5kU3J2QWRkcgAFBHVuaXQJAAIBAilPbmx5IGxhbmQgY29udHJhY3QgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEIaXNBY3RpdmUAAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYGBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEQaXNBY3RpdmVGb3JVc2VycwADAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgYHBQR1bml0CQACAQIpREFwcCBpcyBpbmFjdGl2ZSBmb3IgdXNlcnMgYXQgdGhpcyBtb21lbnQBDGlzUG9vbEFjdGl2ZQIEcG9vbAR0eXBlBApXWFNGQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEdHlwZQULa0FjdGl2ZVNGV1gGBApwb29sQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGAwMFCldYU0ZBY3RpdmUFCnBvb2xBY3RpdmUHBgcBDmFjY291bnRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHRoaXMFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yARFnZXRTRlBvb2xCYWxhbmNlcwEIcG9vbEFkZHIJAJQKAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQUFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBiYWxhbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xCQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGJhbGFuY2UBEWdldFdYUG9vbEJhbGFuY2VzAwhwb29sQWRkcgNhSWQDYklkCQCUCgIKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2FJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNiSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAEPZ2V0UG9vbEJhbGFuY2VzBAhwb29sQWRkcgR0eXBlA2FJZANiSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgUEdHlwZQUHV1hfUE9PTAkBEWdldFdYUG9vbEJhbGFuY2VzAwUIcG9vbEFkZHIFA2FJZAUDYklkCQEPdW5rbm93blBvb2xUeXBlAAENZ2V0U0ZQb29sRGF0YQEIcG9vbEFkZHIECyR0MDgyNzM4MzIyCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQskdDA4MjczODMyMgULJHQwODI3MzgzMjIEBGJhbEIIBQskdDA4MjczODMyMgJfMgQEYmFsQQgFCyR0MDgyNzM4MzIyAl8xCQCXCgUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEFBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xCQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAUEYmFsQQUEYmFsQgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ5rU0ZQb29sU2hhcmVJZAIYQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IGlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1nZXRXWFBvb2xEYXRhAQhwb29sQWRkcgQDY2ZnCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2NmZwUDY2ZnBANhSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAQDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkBANiSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAUDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBAdzaGFyZUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwADAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIaQ2FuJ3QgZ2V0IHBvb2wgTFAgYXNzZXQgaWQECyR0MDkwMTk5MDc4CQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgULJHQwOTAxOTkwNzgFCyR0MDkwMTk5MDc4BARiYWxCCAULJHQwOTAxOTkwNzgCXzIEBGJhbEEIBQskdDA5MDE5OTA3OAJfMQkAlwoFBQNhSWQFA2JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELZ2V0UG9vbERhdGECCHBvb2xBZGRyBHR5cGUDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBDWdldFNGUG9vbERhdGEBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQENZ2V0V1hQb29sRGF0YQEFCHBvb2xBZGRyCQEPdW5rbm93blBvb2xUeXBlAAEOZ2V0U2hhcmVTdXBwbHkDCHBvb2xBZGRyBHR5cGUHc2hhcmVJZAMJAAACBQR0eXBlBQdTRl9QT09MCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFEmtTRlBvb2xTaGFyZVN1cHBseQIcQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IHN1cHBseQMJAAACBQR0eXBlBQdXWF9QT09MCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUHc2hhcmVJZAINV3JvbmcgU2hhcmVJZAhxdWFudGl0eQkBD3Vua25vd25Qb29sVHlwZQABEWdldFBvb2xUb3RhbFNoYXJlAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAAAARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4AAAEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQR1c2VyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0AAAABAQpnZXRBeGx5RmVlAgRwb29sB2ZlZVR5cGUDCQAAAgUHZmVlVHlwZQUMQ0FQX0ZFRV9MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tBeGx5V2l0aExvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUPQ0FQX0ZFRV9OT19MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtBeGx5Tm9Mb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFCExPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEmtBeGx5SW5GZWVXaXRoTG9hbgMJAAACBQdmZWVUeXBlBQtOT19MT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRVrQXhseUluRmVlV2l0aG91dExvYW4DCQAAAgUHZmVlVHlwZQUGTk9fRkVFAAAJAAIBAg5Xcm9uZyBmZWUgdHlwZQEQZ2V0U0ZGYXJtaW5nQWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUOa1NGRmFybWluZ0FkZHICHUNhbid0IGdldCBzd29wZmkgZmFybWluZyBhZGRyARBnZXRXWEZhcm1pbmdBZGRyAQhwb29sQWRkcgQJZkNvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBApmYWN0cm95Q2ZnCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlmQ29udHJhY3QCESVzX19mYWN0b3J5Q29uZmlnAhhDYW4ndCBnZXQgV1ggZmFjdG9yeSBjZmcCAl9fCQEHQWRkcmVzcwEJANkEAQkAkQMCBQpmYWN0cm95Q2ZnAAEBDGFzc2V0SWRUb1N0cgEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgxOb3QgQXNzZXQgaWQBDmFzc2V0SWRGcm9tU3RyAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpdGlvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOAQ5nZXRBc3NldHNQcmljZQEIYXNzZXRJZHMKAQlnZXRQcmljZXMCAWEHYXNzZXRJZAQKYXNzZXRQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUA////////////AQkAzQgCBQFhBQphc3NldFByaWNlCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgENZ2V0U2hhcmVQcmljZQEHc2hhcmVJZAQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAIgQ2FuJ3QgZmluZCBwb29sIGFkZHIgYnkgc2hhcmUgaWQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDEyMDY3MTIxMzIJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDYUlkCAUNJHQwMTIwNjcxMjEzMgJfMQQDYklkCAUNJHQwMTIwNjcxMjEzMgJfMgQIYUJhbGFuY2UIBQ0kdDAxMjA2NzEyMTMyAl8zBAhiQmFsYW5jZQgFDSR0MDEyMDY3MTIxMzICXzQEBnByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwEB2RQcmljZUEJAJEDAgUGcHJpY2VzAAAEB2RQcmljZUIJAJEDAgUGcHJpY2VzAAEDAwkAZgIAAAUHZFByaWNlQQYJAGYCAAAFB2RQcmljZUIA////////////AQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ5nZXRTaGFyZVByaWNlcwEIc2hhcmVJZHMKAQlnZXRQcmljZXMCAWEHc2hhcmVJZAkAzQgCBQFhCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQKAAIkbAUIc2hhcmVJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQ5nZXRDdXJzRW50cmllcwQDYUlkA2JJZAdzaGFyZUlkCHdBbW91bnRzBAxhc3NldHNQcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBApzaGFyZVByaWNlCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQEBnByaWNlcwkAzggCCQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAAkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAEJAMwIAgkApAMBBQpzaGFyZVByaWNlBQNuaWwFCHdBbW91bnRzCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tUb2tlbkxhc3RQcmljZQkAuQkCBQZwcmljZXMCASwFA25pbAEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCQVwVHlwZQhwb29sQWRkcgRMUElkBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQEcmVwbAoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAiBjYWxjTFBSZXBsZW5pc2hUd29Ub2tlbnNSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUEcG10QQkAzAgCCQCkAwEFBHBtdEIFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFBHJlcGwFBHJlcGwJAJcKBQoAAUAJAJEDAgUEcmVwbAADAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAAEAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkBDGFzc2V0SWRUb1N0cgEJAJEDAgUEcmVwbAACCgABQAkAkQMCBQRyZXBsAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxMzY5MDEzOTQ4CQCUCgIJALUJAgoAAUAJAPwHBAUGd3hSZXN0AiBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQkAzAgCBQRMUElkCQDMCAIFBHBtdEEFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18JALUJAgoAAUAJAPwHBAUGd3hSZXN0Ah9ldmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxMzY5MDEzOTQ4BQ0kdDAxMzY5MDEzOTQ4BApldmFsUHV0SW5CCAUNJHQwMTM2OTAxMzk0OAJfMgQKZXZhbFB1dEluQQgFDSR0MDEzNjkwMTM5NDgCXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUGCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYUlkBQRwbXRBCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNiSWQFBHBtdEIFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMJAMwIAgkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAUIcG9vbEFkZHICA3B1dAkAzAgCAMCEPQkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBAhwb29sQWRkcgVwVHlwZQNwbXQFcG10SWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQVwbXRJZAUDcG10BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhVyZXBsZW5pc2hXaXRoT25lVG9rZW4JAMwIAgkAzAgCAgEwCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZmMDCQAAAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFCWtQb29sVHlwZQIEY3BtbQUERkxBVAILcHV0T25lVGtuVjICCXB1dE9uZVRrbgkA/AcEBQhwb29sQWRkcgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgVzdGFrZQUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQNJHQwMTU3MjYxNjA3NgMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE1NzI2MTYwNzYCXzEEBWZOYW1lCAUNJHQwMTU3MjYxNjA3NgJfMgQGcGFyYW1zCAUNJHQwMTU3MjYxNjA3NgJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxNjQ5ODE2ODA0AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE2NDk4MTY4MDQCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNjQ5ODE2ODA0Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAxNzU0NDE3NTgzCQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAxNzU0NDE3NTgzAl8xBAVwckZlZQgFDSR0MDE3NTQ0MTc1ODMCXzIECGZlZVNjYWxlCQC2AgEAgMLXLwQNJHQwMTc2MjMxNzkzMQMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEIJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxBCQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTc2MjMxNzkzMQJfMQQKYXNzZXRUb1BheQgFDSR0MDE3NjIzMTc5MzECXzIEEmFtb3VudFRvUGF5V2l0aEZlZQkAoAMBCQC9AgQJALYCAQULYW1vdW50VG9QYXkFCGZlZVNjYWxlCQC4AgIFCGZlZVNjYWxlCQC2AgEJAGQCBQVwckZlZQUEcEZlZQUHQ0VJTElORwkAlAoCBQphc3NldFRvUGF5BRJhbW91bnRUb1BheVdpdGhGZWUBEGV4Y2hhbmdlRGlyZWN0bHkIBXBUeXBlBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAZwb29sRkIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBRdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIAAwMJAAACBQVwVHlwZQUHU0ZfUE9PTAYJAQIhPQIFBnBvb2xGQgIABA0kdDAxODM3MjE4NTg0AwkAAAIFBnBvb2xGQgIACQCVCgMFBGJhbEEFBGJhbEIFBHBvb2wEDSR0MDE4NDc4MTg1NTEJARFnZXRTRlBvb2xCYWxhbmNlcwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBnBvb2xGQgQGc2ZCYWxBCAUNJHQwMTg0NzgxODU1MQJfMQQGc2ZCYWxCCAUNJHQwMTg0NzgxODU1MQJfMgkAlQoDBQZzZkJhbEEFBnNmQmFsQgUGcG9vbEZCBAVwQmFsQQgFDSR0MDE4MzcyMTg1ODQCXzEEBXBCYWxCCAUNJHQwMTgzNzIxODU4NAJfMgQGZXhQb29sCAUNJHQwMTgzNzIxODU4NAJfMwQNJHQwMTg1ODkxODcxNQkBEWNhbGNBbW91bnRUb1BheVNGBwUGZXhQb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBXBCYWxBBQVwQmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTg1ODkxODcxNQJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxODU4OTE4NzE1Al8yCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmV4UG9vbAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW91bnRUb2tlblRvR2V0BQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTg5MTcxOTAzOQkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAxODkxNzE5MDM5Al8xBAthbW91bnRUb1BheQgFDSR0MDE4OTE3MTkwMzkCXzIJAPwHBAUOd3hTd2FwQ29udHJhY3QCBHN3YXAJAMwIAgUQYW1vdW50VG9rZW5Ub0dldAkAzAgCBQ9hc3NldFRva2VuVG9HZXQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwJAQ91bmtub3duUG9vbFR5cGUAARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDE5MzI2MTk3OTcDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUGd3hSZXN0Ahdwb29sRXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAxOTMyNjE5Nzk3Al8xBAdhbW91bnRCCAUNJHQwMTkzMjYxOTc5NwJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDIwMTY1MjAyNDQJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjAxNjUyMDI0NAJfMQQDYklkCAUNJHQwMjAxNjUyMDI0NAJfMgQEYUJhbAgFDSR0MDIwMTY1MjAyNDQCXzMEBGJCYWwIBQ0kdDAyMDE2NTIwMjQ0Al80BARscElkCAUNJHQwMjAxNjUyMDI0NAJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgdjbGFpbVd4CQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABD3JlcGxlbmlzaEJ5VHlwZQoFcFR5cGUEcG9vbAdmZWVUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgRMUElkBA9scEJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAMJAAACBQ9scEJhbGFuY2VCZWZvcmUFD2xwQmFsYW5jZUJlZm9yZQQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEDSR0MDIwODQyMjEyNjQDAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDIwOTA4MjEwMzAJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMJBQVwVHlwZQUIcG9vbEFkZHIFBExQSWQFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAyMDkwODIxMDMwAl8xBAZwbXRJbkIIBQ0kdDAyMDkwODIxMDMwAl8yBAZjaGFuZ2UIBQ0kdDAyMDkwODIxMDMwAl8zBAhjaGFuZ2VJZAgFDSR0MDIwOTA4MjEwMzACXzQEA2ludgkBGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYFCHBvb2xBZGRyBQVwVHlwZQUGcG10SW5BBQNhSWQFBnBtdEluQgUDYklkAwkAAAIFA2ludgUDaW52CQCUCgIFBmNoYW5nZQUIY2hhbmdlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcG10QQAACQCUCgIFBHBtdEEFA2FJZAMJAGYCBQRwbXRCAAAJAJQKAgUEcG10QgUDYklkCQACAQIQcG10cyBtdXN0IGJlID4gMAQGY2hhbmdlCAUNJHQwMjA4NDIyMTI2NAJfMQQIY2hhbmdlSWQIBQ0kdDAyMDg0MjIxMjY0Al8yBANpbnYDCQBmAgUGY2hhbmdlAAAJARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQFCHBvb2xBZGRyBQVwVHlwZQUGY2hhbmdlBQhjaGFuZ2VJZAUDbmlsAwkAAAIFA2ludgUDaW52BA5scEJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkBAt0b3RhbFN0YWtlZAkAZQIFDmxwQmFsYW5jZUFmdGVyBQ9scEJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBAVpbnZMUAkBB3N0YWtlTFAEBQRwb29sBQVwVHlwZQUETFBJZAURdXNlclNoYXJlRm9yU3Rha2UDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCARwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbgQLdG90YWxBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3RvdGFsQW1vdW50TG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBA0kdDAyMjEyMTIyMzU5AwUId2l0aExvYW4JAJQKAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAZAIFD3RvdGFsQW1vdW50TG9hbgUMc3Rha2VkQW1vdW50CQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgUPdG90YWxBbW91bnRMb2FuBA9jdXJQb29sSW50ZXJlc3QIBQ0kdDAyMjEyMTIyMzU5Al8xBBN0b3RhbFN0YWtlZFdpdGhMb2FuCAUNJHQwMjIxMjEyMjM1OQJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgUTdG90YWxTdGFrZWRXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBCWxpc3RUb0ludAIBYQRpdGVtCQDNCAIFAWEJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQEQZGlyZWN0U3dvcGZpQ1BNTQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEC21pblRvUmVjaXZlCQCRAwIFBXJBcmdzAAMEA2ludgkA/AcEBQRkQXBwAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBQNuaWwFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZGlyZWN0Um91dGluZ1N3b3BmaQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQEYXJncwQFZUFyZ3MJALUJAgkAkQMCBQVyQXJncwADAgF8BApleGNoYW5nZXJzCQC1CQIJAJEDAgUFZUFyZ3MAAAIBLAQOZXhjaGFuZ2Vyc1R5cGUJALUJAgkAkQMCBQVlQXJncwABAgEsBAVhcmdzMQoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAgIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAVhcmdzMgoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBBFyb3V0aW5nQXNzZXRzS2V5cwkAtQkCCQCRAwIFBWVBcmdzAAQCASwEC21pblRvUmVjaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFZUFyZ3MABQkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFC21pblRvUmVjaXZlBQNuaWwEA2ludgkA/AcEBQRkQXBwAgxyb3V0aW5nVHJhZGUFBGFyZ3MFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQQEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDI0NDY2MjQ1MzIJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwMjQ0NjYyNDUzMgJfMQQDQklkCAUNJHQwMjQ0NjYyNDUzMgJfMgQEYmFsQQgFDSR0MDI0NDY2MjQ1MzICXzMEBGJhbEIIBQ0kdDAyNDQ2NjI0NTMyAl80BAdzaGFyZUlkCAUNJHQwMjQ0NjYyNDUzMgJfNQMDCQECIT0CBQd0b2tlbklkBQNBSWQJAQIhPQIFB3Rva2VuSWQFA0JJZAcJAAIBAgtXcm9uZyBhc3NldAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAMJAAACBRB0b3RhbFNoYXJlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3Rva2VuQW1vdW50CQDZBAEFB3Rva2VuSWQFA25pbAQYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEC2xvYW5QZXJjZW50CQBrAwUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQZTQ0FMRTgFEHRvdGFsU2hhcmVBbW91bnQEEHRva2Vuc0ZvckZlZUxvYW4JAGsDBQt0b2tlbkFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQSdG9rZW5zRm9yRmVlTm9Mb2FuCQBlAgULdG9rZW5BbW91bnQFEHRva2Vuc0ZvckZlZUxvYW4EC2F4bHlGZWVMb2FuCQBrAwUQdG9rZW5zRm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlGZWVOb0xvYW4JAGsDBRJ0b2tlbnNGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BAdheGx5RmVlCQBkAgULYXhseUZlZUxvYW4FDWF4bHlGZWVOb0xvYW4EDSR0MDI1Mjc3MjUzNzcDCQAAAgUHdG9rZW5JZAUDQUlkCQCUCgIJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQAACQCUCgIAAAkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlBARwbXRBCAUNJHQwMjUyNzcyNTM3NwJfMQQEcG10QggFDSR0MDI1Mjc3MjUzNzcCXzIEDSR0MDI1MzgwMjU0ODQJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQMc3Rha2VkQW1vdW50CAUNJHQwMjUzODAyNTQ4NAJfMQQCbmYIBQ0kdDAyNTM4MDI1NDg0Al8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABApzdGFrZWRMb2FuCQBrAwUMc3Rha2VkQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BAxzdGFrZWROb0xvYW4JAGUCBQxzdGFrZWRBbW91bnQFCnN0YWtlZExvYW4ED25ld0ludGVyZXN0TG9hbgMJAGYCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFE2N1clBvb2xJbnRlcmVzdExvYW4JAGsDBQpzdGFrZWRMb2FuBQdTQ0FMRTEwBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAQRbmV3SW50ZXJlc3ROb0xvYW4DCQBmAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuBQdTQ0FMRTEwCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgUPbmV3SW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FEW5ld0ludGVyZXN0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBRB0b3RhbFNoYXJlQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGQCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4FCnN0YWtlZExvYW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFB2F4bHlGZWUJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuSWQFA25pbAkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQFA25pbAEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ9jYWxjU3RvcExvc3NGZWUEBHBvb2wKaXNCb3Jyb3dlZAhzdG9wTG9zcwpscFdpdGhkcmF3BAdmZWVUeXBlAwUKaXNCb3Jyb3dlZAUNU1RPUExPU1NfTE9BTgUUU1RPUExPU1NfRkVFX05PX0xPQU4DBQhzdG9wTG9zcwkAawMFCmxwV2l0aGRyYXcJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgAAAQ53aXRoZHJhd1RvVXNlcgQEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAyODAxMzI4MDg1CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDI4MDEzMjgwODUCXzEEBmlkQlN0cggFDSR0MDI4MDEzMjgwODUCXzIEBGJhbEEIBQ0kdDAyODAxMzI4MDg1Al8zBARiYWxCCAUNJHQwMjgwMTMyODA4NQJfNAQHc2hhcmVJZAgFDSR0MDI4MDEzMjgwODUCXzUEDSR0MDI4MDg4MjgxNTUJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDI4MDg4MjgxNTUCXzEEA2lkQggFDSR0MDI4MDg4MjgxNTUCXzIEC3N0b3BMb3NzRmVlCQEPY2FsY1N0b3BMb3NzRmVlBAUEcG9vbAUKaXNCb3Jyb3dlZAUIc3RvcExvc3MFD3VzZXJDYW5XaXRoZHJhdwQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQBkAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDAyODg1MDI4OTM5CQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwMjg4NTAyODkzOQJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDI4ODUwMjg5MzkCXzIEDSR0MDI4OTQyMzAxNzgDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDAyODk0MjMwMTc4Al8xBAd0b1VzZXJCCAUNJHQwMjg5NDIzMDE3OAJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkAZQIFEnBvb2xUb3RhbFNoYXJlTG9hbgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUDbmlsBQNuaWwEB2VudHJpZXMJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJBBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFB3RvVXNlckIFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFB3RvVXNlckEJAMwIAgUHdG9Vc2VyQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoJAJ0KCwUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQHZFByaWNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUEB2RQcmljZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDAzMjE2MDMyMjU3AwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDAzMjE2MDMyMjU3Al8xBAtib3Jyb3dEZWNQcggFDSR0MDMyMTYwMzIyNTcCXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UBEnBhcnNlUmVwbGVuaXNoUG10cwMEcG10cwNBSWQDQklkAwkAAAIJAJADAQUEcG10cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEEDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwABB2Fzc2V0SWQFA0JJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQgkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50CAkAkQMCBQRwbXRzAAEGYW1vdW50AwkAAAIJAJADAQUEcG10cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQAAAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0JJZAkAlAoCAAAICQCRAwIFBHBtdHMAAAZhbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAEPY2FsY1ByaWNlSW1wYWN0BARiYWxBBGJhbEIHbmV3QmFsQQduZXdCYWxCBANwcmkJAGgCCQBlAgUGU0NBTEU4CQBrAwkAawMFBGJhbEIFBlNDQUxFOAUEYmFsQQUGU0NBTEU4CQBrAwUHbmV3QmFsQgUGU0NBTEU4BQduZXdCYWxBAGQDCQBmAgAABQNwcmkJAGgCBQNwcmkA////////////AQUDcHJpARFjbGFpbUFuZENoZWNrQW1udAUEcG9vbAVwVHlwZQVjbGFpbQZhbW91bnQGY2hhbmdlBA0kdDAzMzI1NzMzNTE5AwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBXBUeXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wFBlNXT1BJRAMJAAACBQVwVHlwZQUHV1hfUE9PTAUEV1hJRAkBD3Vua25vd25Qb29sVHlwZQAJAJQKAgUGYW1vdW50BQxjbGFpbWVkQXNzZXQDCQAAAgUNJHQwMzMyNTczMzUxOQUNJHQwMzMyNTczMzUxOQQKY2xhaW1Bc3NldAgFDSR0MDMzMjU3MzM1MTkCXzIEC2NsYWltQW1vdW50CAUNJHQwMzMyNTczMzUxOQJfMQQDYmFsCQEOYWNjb3VudEJhbGFuY2UBBQpjbGFpbUFzc2V0AwkAAAIFA2JhbAUDYmFsAwkAZgIFBmFtb3VudAUDYmFsCQACAQIZVG8gYmlnIGFtb3VudCB0byBleGNoYW5nZQkAlAoCBQtjbGFpbUFtb3VudAUKY2xhaW1Bc3NldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhsBaQETZ2V0UG9vbEluZm9SRUFET05MWQEEcG9vbAQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzMzg4NjMzOTc2CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDMzODg2MzM5NzYCXzEEA0JJZAgFDSR0MDMzODg2MzM5NzYCXzIEBGJhbEEIBQ0kdDAzMzg4NjMzOTc2Al8zBARiYWxCCAUNJHQwMzM4ODYzMzk3NgJfNAQHc2hhcmVJZAgFDSR0MDMzODg2MzM5NzYCXzUEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQJAJQKAgUDbmlsCQCYCgYFA0FJZAUDQklkBQdzaGFyZUlkBQRiYWxBBQRiYWxCBQtzaGFyZVN1cHBseQFpARpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQEHc2hhcmVJZAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAkAlAoCBQNuaWwFC3NoYXJlUHJpY2VzAWkBImdldFVzZXJQb3NpdGlvblNoYXJlQW1vdW50UkVBRE9OTFkCBHVzZXIGcG9zTnVtBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAIQVW5rbm93biBwb3NpdGlvbgQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUGcG9zTnVtCQBmAgUMYm9ycm93QW1vdW50AAAJAJQKAgUDbmlsBQ91c2VyQ2FuV2l0aGRyYXcBaQEXZ2V0VXNlclBvc2l0aW9uUkVBRE9OTFkDBHVzZXIFcG9vbHMGcG9zTnVtCgEHdXNlclBvcwIBYQRwb29sBA0kdDAzNDg0OTM0OTE5BQFhBAl3QW1vdW50c0EIBQ0kdDAzNDg0OTM0OTE5Al8xBAl3QW1vdW50c0IIBQ0kdDAzNDg0OTM0OTE5Al8yBAVkZWJ0cwgFDSR0MDM0ODQ5MzQ5MTkCXzMEC2VxV0Ftb3VudHNBCAUNJHQwMzQ4NDkzNDkxOQJfNAQLZXFXQW1vdW50c0IIBQ0kdDAzNDg0OTM0OTE5Al81BAVpbmRleAgFDSR0MDM0ODQ5MzQ5MTkCXzYDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFDWtVc2VyUG9zaXRpb24JAJgKBgkAzQgCBQl3QW1vdW50c0EAAAkAzQgCBQl3QW1vdW50c0IAAAkAzQgCBQVkZWJ0cwAACQDNCAIFC2VxV0Ftb3VudHNBAAAJAM0IAgULZXFXQW1vdW50c0IAAAkAZAIFBWluZGV4AAEEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzNTE5ODM1Mjg4CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM1MTk4MzUyODgCXzEEA0JJZAgFDSR0MDM1MTk4MzUyODgCXzIEBGJhbEEIBQ0kdDAzNTE5ODM1Mjg4Al8zBARiYWxCCAUNJHQwMzUxOTgzNTI4OAJfNAQHc2hhcmVJZAgFDSR0MDM1MTk4MzUyODgCXzUEDGJvcnJvd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRFrVXNlckJvcnJvd0Ftb3VudAAABA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sCQCRAwIFBnBvc051bQUFaW5kZXgJAGYCBQxib3Jyb3dBbW91bnQAAAQNJHQwMzU1MDQzNTYyNAkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcECHdBbW91bnRBCAUNJHQwMzU1MDQzNTYyNAJfMQQId0Ftb3VudEIIBQ0kdDAzNTUwNDM1NjI0Al8yAwkAZgIFDGJvcnJvd0Ftb3VudAAABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAGYCBQRkZWJ0BQh3QW1vdW50QQcJAGUCBQRkZWJ0BQh3QW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFA0JJZAkAZgIFBGRlYnQFCHdBbW91bnRCBwkAZQIFBGRlYnQFCHdBbW91bnRCAAAEC2Ftb3VudFRvUGF5AwkAZgIFDWFtb3VudFRvR2V0RXgAAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlTRgcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yAwkAAAIFBXBUeXBlBQdXWF9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIJAQ91bmtub3duUG9vbFR5cGUAAAAEDSR0MDM2NTM2MzY3NTUDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAlAoCCQBlAgkAZAIFCHdBbW91bnRBBQ1hbW91bnRUb0dldEV4BQRkZWJ0CQBlAgUId0Ftb3VudEIFC2Ftb3VudFRvUGF5CQCUCgIJAGUCBQh3QW1vdW50QQULYW1vdW50VG9QYXkJAGUCCQBkAgUId0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFBGRlYnQECmVxV0Ftb3VudEEIBQ0kdDAzNjUzNjM2NzU1Al8xBAplcVdBbW91bnRCCAUNJHQwMzY1MzYzNjc1NQJfMgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAzQgCBQVkZWJ0cwUEZGVidAkAzQgCBQtlcVdBbW91bnRzQQUKZXFXQW1vdW50QQkAzQgCBQtlcVdBbW91bnRzQgUKZXFXQW1vdW50QgkAZAIFBWluZGV4AAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIFBWRlYnRzCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAZAIFBWluZGV4AAEEDSR0MDM3MDEwMzcxMjEKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3VzZXJQb3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQJd0Ftb3VudHNBCAUNJHQwMzcwMTAzNzEyMQJfMQQJd0Ftb3VudHNCCAUNJHQwMzcwMTAzNzEyMQJfMgQFZGVidHMIBQ0kdDAzNzAxMDM3MTIxAl8zBAtlcVdBbW91bnRzQQgFDSR0MDM3MDEwMzcxMjECXzQEC2VxV0Ftb3VudHNCCAUNJHQwMzcwMTAzNzEyMQJfNQkAlAoCBQNuaWwJAJcKBQUJd0Ftb3VudHNBBQl3QW1vdW50c0IFBWRlYnRzBQtlcVdBbW91bnRzQQULZXFXQW1vdW50c0IBaQEJcmVwbGVuaXNoAwRwb29sCGxldmVyYWdlCGJvcnJvd0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAZgIAZAUIbGV2ZXJhZ2UGCQBmAgUIbGV2ZXJhZ2UArAIJAAIBAh9MZXZlcmFnZSBjYW4ndCBiZSA8MTAwIGFuZCA+MzAwAwMJAQEhAQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhbkJvcnJvdwkAZgIFCGxldmVyYWdlAGQHCQACAQIdWW91IGNhbid0IGJvcnJvdyBpbiB0aGlzIHBvb2wEDSR0MDM3NzE5Mzc4MDkJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzc3MTkzNzgwOQJfMQQDQklkCAUNJHQwMzc3MTkzNzgwOQJfMgQEYmFsQQgFDSR0MDM3NzE5Mzc4MDkCXzMEBGJhbEIIBQ0kdDAzNzcxOTM3ODA5Al80BAdzaGFyZUlkCAUNJHQwMzc3MTkzNzgwOQJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwMzc4OTAzNzk0OQkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDM3ODkwMzc5NDkCXzEEBHBtdEIIBQ0kdDAzNzg5MDM3OTQ5Al8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50BQNuaWwCASwEDG5ld1JlcXVlc3RJZAoAAUAJAPwHBAUEdGhpcwIQY3JlYXRlTmV3UmVxdWVzdAkAzAgCBQdyZXF1ZXN0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUMbmV3UmVxdWVzdElkBQxuZXdSZXF1ZXN0SWQEBGFyZ3MJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgUMYm9ycm93QW1vdW50CQDMCAIJAKUIAQUEdGhpcwkAzAgCAhFyZXBsZW5pc2hGcm9tTGFuZAkAzAgCCQCkAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUMbmV3UmVxdWVzdElkAhhDYW4ndCBjcmVhdGUgbmV3IHJlcXVlc3QFA25pbAQDaW52CQD9BwQJAQ5nZXRMZW5kU3J2QWRkcgACDWZsYXNoUG9zaXRpb24FBGFyZ3MFA25pbAMJAAACBQNpbnYFA2ludgQKdXNlclN0YWtlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtBQ1rVXNlclBvc2l0aW9uBA0kdDAzODkzODM5MDMyCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzODkzODM5MDMyBQ0kdDAzODkzODM5MDMyBAduZXdCYWxCCAUNJHQwMzg5MzgzOTAzMgJfMgQHbmV3QmFsQQgFDSR0MDM4OTM4MzkwMzICXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwMzkxMDIzOTIxNwkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDM5MTAyMzkyMTcCXzEECHdBbW91bnRCCAUNJHQwMzkxMDIzOTIxNwJfMgkAlAoCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzkyNzAzOTM4NQkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQtOT19MT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQDCQAAAgUNJHQwMzkyNzAzOTM4NQUNJHQwMzkyNzAzOTM4NQQHYXhseUZlZQgFDSR0MDM5MjcwMzkzODUCXzIECnVzZXJTdGFrZWQIBQ0kdDAzOTI3MDM5Mzg1Al8xBA0kdDAzOTM5MTM5NDg1CQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzOTM5MTM5NDg1BQ0kdDAzOTM5MTM5NDg1BAduZXdCYWxCCAUNJHQwMzkzOTEzOTQ4NQJfMgQHbmV3QmFsQQgFDSR0MDM5MzkxMzk0ODUCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwMzk1NTUzOTY3MAkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDM5NTU1Mzk2NzACXzEECHdBbW91bnRCCAUNJHQwMzk1NTUzOTY3MAJfMgkAlAoCCQDOCAIJARByZXBsZW5pc2hFbnRyaWVzCAUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCBHBvb2wFcG9zSWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAkBDndpdGhkcmF3VG9Vc2VyBAkApQgBCAUBaQZjYWxsZXIFBHBvb2wJAKQDAQUFcG9zSWQHAWkBFGNyZWF0ZVVwZGF0ZVN0b3BMb3NzBAVwb3NJZAZwb29sSWQHYXNzZXRJZAVwcmljZQkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGcG9vbElkAgFfCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAAgECGlRoZXJlIGFyZSBubyB1c2VyIHBvc2l0aW9uAwkAZwIAAAUFcHJpY2UJAAIBAhxQcmljZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIFBXByaWNlBRB0b2tlbk9yYWNsZVByaWNlCQACAQIrUHJpY2UgbXVzdCBiZSBsZXNzIHRoYW4gY3VycmVudCB0b2tlbiBwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQVwcmljZQUDbmlsAWkBDmRlbGV0ZVN0b3BMb3NzAwVwb3NJZAZwb29sSWQHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCQACAQIITm8gZW50cnkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQNuaWwBaQEEaW5pdA0MbW9uZXlCb3hBZGRyDXNmRmFybWluZ0FkZHIIbGVuZEFkZHIPcHJpY2VPcmFjbGVBZGRyEGtlZXBlckV4Q29udHJhY3QOd3hTd2FwQ29udHJhY3QLc3dvcEFzc2V0SWQJd3hBc3NldElkDm9wZXJhdG9yUHViS2V5Emdyb3VwMUFkbWluMVB1YktleRJncm91cDFBZG1pbjJQdWJLZXkSZ3JvdXAyQWRtaW4xUHViS2V5Emdyb3VwMkFkbWluMlB1YktleQkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAKIIAQUPa09wZXJhdG9yQ2FsbFBLCQACAQIOQWxyZWFkeSBpbml0ZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDG1vbmV5Qm94QWRkcgkAAgECI21vbmV5Qm94QWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ1zZkZhcm1pbmdBZGRyCQACAQIkc2ZGYXJtaW5nQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQhsZW5kQWRkcgkAAgECH2xlbmRBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFD3ByaWNlT3JhY2xlQWRkcgkAAgECJnByaWNlT3JhY2xlQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRBrZWVwZXJFeENvbnRyYWN0CQACAQIna2VlcGVyRXhDb250cmFjdCBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFC3N3b3BBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQUJd3hBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQECIT0CCQDIAQEJANkEAQUOb3BlcmF0b3JQdWJLZXkAIAkAAgECHW9wZXJhdG9yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtNb25leUJveAUMbW9uZXlCb3hBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtTRkZhcm1pbmdBZGRyBQ1zZkZhcm1pbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtMZW5kU2VydmljZQUIbGVuZEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa1ByaWNlT3JhY2xlBQ9wcmljZU9yYWNsZUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa0V4Q29udHJhY3QFEGtlZXBlckV4Q29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1d4U3dhcENvbnRyYWN0BQ53eFN3YXBDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQdrU3dvcElkBQtzd29wQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQVrV3hJZAUJd3hBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tPcGVyYXRvckNhbGxQSwUOb3BlcmF0b3JQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMVBLBRJncm91cDFBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMlBLBRJncm91cDFBZG1pbjJQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMVBLBRJncm91cDJBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMlBLBRJncm91cDJBZG1pbjJQdWJLZXkFA25pbAFpARBjcmVhdGVOZXdSZXF1ZXN0AQZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQMbmV3UmVxdWVzdElkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxrUmVxdWVzdEl0ZXIAAAABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFDG5ld1JlcXVlc3RJZAUKa1JlcXVlc3RJZAUGcGFyYW1zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrUmVxdWVzdEl0ZXIFDG5ld1JlcXVlc3RJZAUDbmlsBQxuZXdSZXF1ZXN0SWQBaQERcmVwbGVuaXNoRnJvbUxhbmQBCXJlcXVlc3RJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBA0kdDA0NDUwOTQ0NjEzCQEMcGFyc2VSZXF1ZXN0AQUJcmVxdWVzdElkBAR1c2VyCAUNJHQwNDQ1MDk0NDYxMwJfMQQEcG9vbAgFDSR0MDQ0NTA5NDQ2MTMCXzIEBHBtdEEIBQ0kdDA0NDUwOTQ0NjEzAl8zBANBSWQIBQ0kdDA0NDUwOTQ0NjEzAl80BARwbXRCCAUNJHQwNDQ1MDk0NDYxMwJfNQQDQklkCAUNJHQwNDQ1MDk0NDYxMwJfNgQEYmFsQQgFDSR0MDQ0NTA5NDQ2MTMCXzcEBGJhbEIIBQ0kdDA0NDUwOTQ0NjEzAl84BAdzaGFyZUlkCAUNJHQwNDQ1MDk0NDYxMwJfOQQHYndBc3NldAgFDSR0MDQ0NTA5NDQ2MTMDXzEwBAhid0Ftb3VudAgFDSR0MDQ0NTA5NDQ2MTMDXzExAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDA0NDgwMzQ0OTAzAwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQUIYndBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFCGJ3QW1vdW50BAdwbXRBbGxBCAUNJHQwNDQ4MDM0NDkwMwJfMQQHcG10QWxsQggFDSR0MDQ0ODAzNDQ5MDMCXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA0NDk4NTQ1MTAwCQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQKdXNlclN0YWtlZAgFDSR0MDQ0OTg1NDUxMDACXzEEB2F4bHlGZWUIBQ0kdDA0NDk4NTQ1MTAwAl8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGBA0kdDA0NTQ2MDQ1NTc1CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNDU0NjA0NTU3NQJfMQQId0Ftb3VudEIIBQ0kdDA0NTQ2MDQ1NTc1Al8yCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNDYwOTY0NjE4NgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA0NjA5NjQ2MTg2Al8xBANCSWQIBQ0kdDA0NjA5NjQ2MTg2Al8yBARiYWxBCAUNJHQwNDYwOTY0NjE4NgJfMwQEYmFsQggFDSR0MDQ2MDk2NDYxODYCXzQEB3NoYXJlSWQIBQ0kdDA0NjA5NjQ2MTg2Al81BAZhbW91bnQJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPbGlxdWlkYXRlQW1vdW50BAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQJAGYCBQxib3Jyb3dBbW91bnQAAAMJAGYCBQ9saXF1aWRhdGVBbW91bnQFD3VzZXJDYW5XaXRoZHJhdwkAAgECJ1lvdSBjYW4ndCBsaXF1aWRhdGUgbW9yZSB0aGFuIHVzZXIgaGF2ZQMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQBlAgUPdXNlckNhbldpdGhkcmF3BQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBAUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYJAJQKAgkAzQgCCAUDcmVzAl8xCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MIBQNyZXMCXzIBaQEMY2FwaXRhbGl6ZUV4BQRwb29sBXJvdXRlCXRva2VuVG9JZBBhbW91bnRUb0V4Y2hhbmdlBWNsYWltCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAQNJHQwNDgxNTY0ODI1OAkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlBQZjaGFuZ2UDCQAAAgUNJHQwNDgxNTY0ODI1OAUNJHQwNDgxNTY0ODI1OAQMY2xhaW1lZEFzc2V0CAUNJHQwNDgxNTY0ODI1OAJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDQ4MTU2NDgyNTgCXzEEBXJBcmdzCQC1CQIFBXJvdXRlAgJfXwQPZXhjaGFuZ2VkQW1vdW50AwkAAAIJAJEDAgUFckFyZ3MAAAIQZGlyZWN0U3dvcGZpQ1BNTQkBEGRpcmVjdFN3b3BmaUNQTU0CBQVyQXJncwUJdG9rZW5Ub0lkAwkAAAIJAJEDAgUFckFyZ3MAAAINcm91dGluZ1N3b3BmaQkBE2RpcmVjdFJvdXRpbmdTd29wZmkCBQVyQXJncwUJdG9rZW5Ub0lkCQACAQILV3Jvbmcgcm91dGUDCQAAAgUPZXhjaGFuZ2VkQW1vdW50BQ9leGNoYW5nZWRBbW91bnQECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAUDbmlsCQDOCAIJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jYXBpdGFsaXplTm9FeAMEcG9vbAVjbGFpbRFhbW91bnRGcm9tQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEDSR0MDQ4OTQyNDkwNDAJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQURYW1vdW50RnJvbUJhbGFuY2UAAAMJAAACBQ0kdDA0ODk0MjQ5MDQwBQ0kdDA0ODk0MjQ5MDQwBAxjbGFpbWVkQXNzZXQIBQ0kdDA0ODk0MjQ5MDQwAl8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNDg5NDI0OTA0MAJfMQkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAkAZAIFDWNsYWltZWRBbW91bnQFEWFtb3VudEZyb21CYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2luaXROZXdQb29sCgR0eXBlCHBvb2xUeXBlCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgljYW5Cb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDAwkBAiE9AgUEdHlwZQUHU0ZfUE9PTAkBAiE9AgUEdHlwZQUHV1hfUE9PTAcJAAIBAgpXcm9uZyB0eXBlAwMJAQIhPQIFCHBvb2xUeXBlBQRDUE1NCQECIT0CBQhwb29sVHlwZQUERkxBVAcJAAIBAg9Xcm9uZyBwb29sIHR5cGUEDSR0MDQ5NTYxNDk2NTUJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQhwb29sQWRkcgUEdHlwZQQDYUlkCAUNJHQwNDk1NjE0OTY1NQJfMQQDYklkCAUNJHQwNDk1NjE0OTY1NQJfMgQEYUJhbAgFDSR0MDQ5NTYxNDk2NTUCXzMEBGJCYWwIBQ0kdDA0OTU2MTQ5NjU1Al80BAdzaGFyZUlkCAUNJHQwNDk1NjE0OTY1NQJfNQMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa1Bvb2xJbnRlcmVzdExvYW4AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIcG9vbEFkZHIFCWtQb29sVHlwZQUIcG9vbFR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sBQhwb29sQWRkcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQhwb29sQWRkcgUOa1Bvb2xDYW5Cb3Jyb3cFCWNhbkJvcnJvdwUDbmlsAWkBDnVwZGF0ZVBvb2xGZWVzBwhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyCQACAQkArAICAhpDYW4ndCBmaW5kIHBvb2wgd2l0aCBhZGRyIAUIcG9vbEFkZHIDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4FA25pbAFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQITZEFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYFA25pbAFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhVkQXBwIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHBQNuaWwBaQEQYWN0aXZhdGVGb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh1kQXBwIGFscmVhZHkgYWN0aXZlIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBgUDbmlsAWkBEHNodXRkb3duRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh9kQXBwIGFscmVhZHkgc2h1dGRvd24gZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMHBQNuaWwBaQEKYWN0aXZhdGVTRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIVU1dPUEZJIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIXU1dPUEZJIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEKYWN0aXZhdGVXWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIRV1ggYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25XWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhNXWCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBDGFjdGl2YXRlUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhNQb29sIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgUDbmlsAWkBDHNodXRkb3duUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECFVBvb2wgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQcFA25pbAECdHgBBnZlcmlmeQAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEBmlzU2VsZgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQQKaXNSaWdodEZlZQMJAAACCAUDaW52A2ZlZQCg9zYJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHBAppc0luaXRDYWxsCQAAAggFA2ludghmdW5jdGlvbgIEaW5pdAQMaXNub1BheW1lbnRzCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAADAwMFCmlzUmlnaHRGZWUFCmlzSW5pdENhbGwHBQZpc1NlbGYHBQxpc25vUGF5bWVudHMHBAxncm91cDFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ5ncm91cDFBZG1pbjFQSwABCQBkAgAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUOZ3JvdXAxQWRtaW4yUEsAAQAABAxncm91cDJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQ5ncm91cDJBZG1pbjFQSwABCQBkAgAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUOZ3JvdXAyQWRtaW4yUEsAAQAACQAAAgkAZAIFDGdyb3VwMVNpZ25lZAUMZ3JvdXAyU2lnbmVkAAJNnIUY", "height": 3872880, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: F1JWJ2u6uhj7KE3KKod1zGeNfyzhmUYML1C3CYkUNMfb Next: 8jREW5rfgESLfqmP8c6CxF6eJieg4FWs5PPr6FmoAuEs 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
448448 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 {
482482 let $t01369013948 = $Tuple2(split({
483483 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({
488488 let @ = invoke(wxRest, "evaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
489489 if ($isInstanceOf(@, "String"))
490490 then @
491491 else throw(($getType(@) + " couldn't be cast to String"))
492492 }, "__"))
493493 if (($t01369013948 == $t01369013948))
494494 then {
495495 let evalPutInB = $t01369013948._2
496496 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) = {
550550 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()
555555 let farmAddr = $t01572616076._1
556556 let fName = $t01572616076._2
557557 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)
570570 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 }
579579 let amountToPay = $t01649816804._1
580580 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) = {
600600 let $t01754417583 = getWXSwapFees(pool)
601601 let pFee = $t01754417583._1
602602 let prFee = $t01754417583._2
603603 let feeScale = toBigInt(100000000)
604604 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 }
613613 let amountToPay = $t01762317931._1
614614 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 {
626626 let $t01837218584 = if ((poolFB == ""))
627627 then $Tuple3(balA, balB, pool)
628628 else {
629629 let $t01847818551 = getSFPoolBalances(addressFromStringValue(poolFB))
630630 let sfBalA = $t01847818551._1
631631 let sfBalB = $t01847818551._2
632632 $Tuple3(sfBalA, sfBalB, poolFB)
633633 }
634634 let pBalA = $t01837218584._1
635635 let pBalB = $t01837218584._2
636636 let exPool = $t01837218584._3
637637 let $t01858918715 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
638638 let assetToPay = $t01858918715._1
639639 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 {
644644 let $t01891719039 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
645645 let assetToPay = $t01891719039._1
646646 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) = {
654654 let $t01932619797 = 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))
677677 then {
678678 let inv = split({
679679 let @ = invoke(wxRest, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
680680 if ($isInstanceOf(@, "String"))
681681 then @
682682 else throw(($getType(@) + " couldn't be cast to String"))
683683 }, "__")
684684 if ((inv == inv))
685685 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
686686 else throw("Strict value is not equal to itself.")
687687 }
688688 else unknownPoolType()
689689 let amountA = $t01932619797._1
690690 let amountB = $t01932619797._2
691691 $Tuple2(amountA, amountB)
692692 }
693693
694694
695695 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
696696 then {
697697 let balBefore = accountBalance(SWOPID)
698698 if ((balBefore == balBefore))
699699 then {
700700 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
701701 if ((inv == inv))
702702 then {
703703 let balAfter = accountBalance(SWOPID)
704704 $Tuple2((balAfter - balBefore), SWOPID)
705705 }
706706 else throw("Strict value is not equal to itself.")
707707 }
708708 else throw("Strict value is not equal to itself.")
709709 }
710710 else if ((pType == WX_POOL))
711711 then {
712712 let $t02016520244 = getWXPoolData(addressFromStringValue(pool))
713713 let aId = $t02016520244._1
714714 let bId = $t02016520244._2
715715 let aBal = $t02016520244._3
716716 let bBal = $t02016520244._4
717717 let lpId = $t02016520244._5
718718 let balBefore = accountBalance(WXID)
719719 if ((balBefore == balBefore))
720720 then {
721721 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
722722 if ((inv == inv))
723723 then {
724724 let balAfter = accountBalance(WXID)
725725 $Tuple2((balAfter - balBefore), WXID)
726726 }
727727 else throw("Strict value is not equal to itself.")
728728 }
729729 else throw("Strict value is not equal to itself.")
730730 }
731731 else unknownPoolType()
732732
733733
734734 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
735735 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
736736 if ((lpBalanceBefore == lpBalanceBefore))
737737 then {
738738 let poolAddr = addressFromStringValue(pool)
739739 let $t02084221264 = if (if ((pmtA > 0))
740740 then (pmtB > 0)
741741 else false)
742742 then {
743743 let $t02090821030 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
744744 let pmtInA = $t02090821030._1
745745 let pmtInB = $t02090821030._2
746746 let change = $t02090821030._3
747747 let changeId = $t02090821030._4
748748 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
749749 if ((inv == inv))
750750 then $Tuple2(change, changeId)
751751 else throw("Strict value is not equal to itself.")
752752 }
753753 else if ((pmtA > 0))
754754 then $Tuple2(pmtA, aId)
755755 else if ((pmtB > 0))
756756 then $Tuple2(pmtB, bId)
757757 else throw("pmts must be > 0")
758758 let change = $t02084221264._1
759759 let changeId = $t02084221264._2
760760 let inv = if ((change > 0))
761761 then replenishOneTokenByType(poolAddr, pType, change, changeId)
762762 else nil
763763 if ((inv == inv))
764764 then {
765765 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
766766 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
767767 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
768768 let userShareForStake = (totalStaked - axlyFeeAmount)
769769 if ((0 >= userShareForStake))
770770 then throw("amount of staked sharetokens must be > 0")
771771 else {
772772 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
773773 if ((invLP == invLP))
774774 then $Tuple2(userShareForStake, axlyFeeAmount)
775775 else throw("Strict value is not equal to itself.")
776776 }
777777 }
778778 else throw("Strict value is not equal to itself.")
779779 }
780780 else throw("Strict value is not equal to itself.")
781781 }
782782
783783
784784 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
785785 let totalAmount = getPoolTotalShare(pool)
786786 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
787787 let $t02212122359 = if (withLoan)
788788 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
789789 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
790790 let curPoolInterest = $t02212122359._1
791791 let totalStakedWithLoan = $t02212122359._2
792792 [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))]
793793 }
794794
795795
796796 func listToInt (a,item) = (a :+ parseIntValue(item))
797797
798798
799799 func directSwopfiCPMM (rArgs,tokenTo) = {
800800 let dApp = addressFromStringValue(rArgs[1])
801801 let pmtP = split(rArgs[2], "|")
802802 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
803803 if ((tokenBalanceBefore == tokenBalanceBefore))
804804 then {
805805 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
806806 let minToRecive = rArgs[3]
807807 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
808808 if ((inv == inv))
809809 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
810810 else throw("Strict value is not equal to itself.")
811811 }
812812 else throw("Strict value is not equal to itself.")
813813 }
814814
815815
816816 func directRoutingSwopfi (rArgs,tokenTo) = {
817817 let dApp = addressFromStringValue(rArgs[1])
818818 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
819819 if ((tokenBalanceBefore == tokenBalanceBefore))
820820 then {
821821 let pmt = {
822822 let pmtP = split(rArgs[2], "|")
823823 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
824824 }
825825 let args = {
826826 let eArgs = split(rArgs[3], "|")
827827 let exchangers = split(eArgs[0], ",")
828828 let exchangersType = split(eArgs[1], ",")
829829 let args1 = {
830830 let $l = split(eArgs[2], ",")
831831 let $s = size($l)
832832 let $acc0 = nil
833833 func $f0_1 ($a,$i) = if (($i >= $s))
834834 then $a
835835 else listToInt($a, $l[$i])
836836
837837 func $f0_2 ($a,$i) = if (($i >= $s))
838838 then $a
839839 else throw("List size exceeds 3")
840840
841841 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
842842 }
843843 let args2 = {
844844 let $l = split(eArgs[3], ",")
845845 let $s = size($l)
846846 let $acc0 = nil
847847 func $f1_1 ($a,$i) = if (($i >= $s))
848848 then $a
849849 else listToInt($a, $l[$i])
850850
851851 func $f1_2 ($a,$i) = if (($i >= $s))
852852 then $a
853853 else throw("List size exceeds 3")
854854
855855 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
856856 }
857857 let routingAssetsKeys = split(eArgs[4], ",")
858858 let minToRecive = parseIntValue(eArgs[5])
859859 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
860860 }
861861 let inv = invoke(dApp, "routingTrade", args, pmt)
862862 if ((inv == inv))
863863 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
864864 else throw("Strict value is not equal to itself.")
865865 }
866866 else throw("Strict value is not equal to itself.")
867867 }
868868
869869
870870 func capitalize (pool,pType,tokenId,tokenAmount) = {
871871 let poolAddr = Address(fromBase58String(pool))
872872 let $t02446624532 = getPoolData(poolAddr, pType)
873873 let AId = $t02446624532._1
874874 let BId = $t02446624532._2
875875 let balA = $t02446624532._3
876876 let balB = $t02446624532._4
877877 let shareId = $t02446624532._5
878878 if (if ((tokenId != AId))
879879 then (tokenId != BId)
880880 else false)
881881 then throw("Wrong asset")
882882 else {
883883 let totalShareAmount = getPoolTotalShare(pool)
884884 if ((totalShareAmount == 0))
885885 then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
886886 else {
887887 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
888888 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
889889 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
890890 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
891891 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
892892 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
893893 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
894894 let $t02527725377 = if ((tokenId == AId))
895895 then $Tuple2((tokenAmount - axlyFee), 0)
896896 else $Tuple2(0, (tokenAmount - axlyFee))
897897 let pmtA = $t02527725377._1
898898 let pmtB = $t02527725377._2
899899 let $t02538025484 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
900900 let stakedAmount = $t02538025484._1
901901 let nf = $t02538025484._2
902902 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
903903 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
904904 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
905905 let stakedNoLoan = (stakedAmount - stakedLoan)
906906 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
907907 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
908908 else 0
909909 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
910910 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
911911 else 0
912912 ([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))
913913 }
914914 }
915915 }
916916
917917
918918 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
919919 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
920920 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
921921 let poolInterest = if (borrowed)
922922 then getIntegerValue(this, (pool + kPoolInterestLoan))
923923 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
924924 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
925925 }
926926
927927
928928 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
929929 let feeType = if (isBorrowed)
930930 then STOPLOSS_LOAN
931931 else STOPLOSS_FEE_NO_LOAN
932932 if (stopLoss)
933933 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
934934 else 0
935935 }
936936
937937
938938 func withdrawToUser (user,pool,posId,stopLoss) = {
939939 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
940940 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
941941 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
942942 let poolTotalShare = getPoolTotalShare(pool)
943943 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
944944 let userAddr = Address(fromBase58String(user))
945945 let poolAddr = Address(fromBase58String(pool))
946946 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
947947 let $t02801328085 = getPoolData(poolAddr, pType)
948948 let idAStr = $t02801328085._1
949949 let idBStr = $t02801328085._2
950950 let balA = $t02801328085._3
951951 let balB = $t02801328085._4
952952 let shareId = $t02801328085._5
953953 let $t02808828155 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
954954 let idA = $t02808828155._1
955955 let idB = $t02808828155._2
956956 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
957957 let cBalABefore = accountBalance(idA)
958958 if ((cBalABefore == cBalABefore))
959959 then {
960960 let cBalBBefore = accountBalance(idB)
961961 if ((cBalBBefore == cBalBBefore))
962962 then {
963963 let inv = if ((pType == SF_POOL))
964964 then {
965965 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
966966 if ((inv == inv))
967967 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
968968 else throw("Strict value is not equal to itself.")
969969 }
970970 else if ((pType == WX_POOL))
971971 then {
972972 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
973973 if ((inv == inv))
974974 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
975975 else throw("Strict value is not equal to itself.")
976976 }
977977 else unknownPoolType()
978978 if ((inv == inv))
979979 then {
980980 let cBalAAfter = accountBalance(idA)
981981 if ((cBalAAfter == cBalAAfter))
982982 then {
983983 let cBalBAfter = accountBalance(idB)
984984 if ((cBalBAfter == cBalBAfter))
985985 then {
986986 let $t02885028939 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
987987 let tokensAmountA = $t02885028939._1
988988 let tokensAmountB = $t02885028939._2
989989 let $t02894230178 = if (isBorrowed)
990990 then {
991991 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
992992 let debt = {
993993 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
994994 if ($isInstanceOf(@, "Int"))
995995 then @
996996 else throw(($getType(@) + " couldn't be cast to Int"))
997997 }
998998 if ((debt == debt))
999999 then {
10001000 let amountToGetEx = if (if ((borrowAsset == idAStr))
10011001 then (debt > tokensAmountA)
10021002 else false)
10031003 then (debt - tokensAmountA)
10041004 else if (if ((borrowAsset == idBStr))
10051005 then (debt > tokensAmountB)
10061006 else false)
10071007 then (debt - tokensAmountB)
10081008 else 0
10091009 let exInv = if ((amountToGetEx > 0))
10101010 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
10111011 else nil
10121012 if ((exInv == exInv))
10131013 then {
10141014 let cBalAAfterRepay = accountBalance(idA)
10151015 if ((cBalAAfterRepay == cBalAAfterRepay))
10161016 then {
10171017 let cBalBAfterRepay = accountBalance(idB)
10181018 if ((cBalBAfterRepay == cBalBAfterRepay))
10191019 then {
10201020 let closeDbtInv = if ((debt > 0))
10211021 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
10221022 else 0
10231023 if ((closeDbtInv == closeDbtInv))
10241024 then if ((borrowAsset == idAStr))
10251025 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
10261026 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
10271027 else throw("Strict value is not equal to itself.")
10281028 }
10291029 else throw("Strict value is not equal to itself.")
10301030 }
10311031 else throw("Strict value is not equal to itself.")
10321032 }
10331033 else throw("Strict value is not equal to itself.")
10341034 }
10351035 else throw("Strict value is not equal to itself.")
10361036 }
10371037 else $Tuple2(tokensAmountA, tokensAmountB)
10381038 let toUserA = $t02894230178._1
10391039 let toUserB = $t02894230178._2
10401040 let poolTotalLoanEntries = if (isBorrowed)
10411041 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10421042 else nil
10431043 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))
10441044 $Tuple2(entries, [toUserA, toUserB])
10451045 }
10461046 else throw("Strict value is not equal to itself.")
10471047 }
10481048 else throw("Strict value is not equal to itself.")
10491049 }
10501050 else throw("Strict value is not equal to itself.")
10511051 }
10521052 else throw("Strict value is not equal to itself.")
10531053 }
10541054 else throw("Strict value is not equal to itself.")
10551055 }
10561056
10571057
10581058 func parseRequest (requestId) = {
10591059 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
10601060 let user = request[0]
10611061 let pool = request[1]
10621062 let pmtA = parseIntValue(request[2])
10631063 let AId = request[3]
10641064 let pmtB = parseIntValue(request[4])
10651065 let BId = request[5]
10661066 let balA = parseIntValue(request[6])
10671067 let balB = parseIntValue(request[7])
10681068 let shareId = request[8]
10691069 let bwAsset = request[9]
10701070 let bwAmount = parseIntValue(request[10])
10711071 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
10721072 }
10731073
10741074
10751075 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
10761076 then (borrowId != bId)
10771077 else false)
10781078 then throw("Wrong borrow asset")
10791079 else {
10801080 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
10811081 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
10821082 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10831083 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10841084 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
10851085 let $t03216032257 = if ((borrowId == aId))
10861086 then $Tuple2(dPriceA, decPrA)
10871087 else $Tuple2(dPriceB, decPrB)
10881088 let borrowPrice = $t03216032257._1
10891089 let borrowDecPr = $t03216032257._2
10901090 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10911091 }
10921092
10931093
10941094 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
10951095 then if ((assetIdToStr(pmts[0].assetId) != AId))
10961096 then throw("Wrong payment asset A")
10971097 else if ((assetIdToStr(pmts[1].assetId) != BId))
10981098 then throw("Wrong payment asset B")
10991099 else $Tuple2(pmts[0].amount, pmts[1].amount)
11001100 else if ((size(pmts) == 1))
11011101 then if ((assetIdToStr(pmts[0].assetId) == AId))
11021102 then $Tuple2(pmts[0].amount, 0)
11031103 else if ((assetIdToStr(pmts[0].assetId) == BId))
11041104 then $Tuple2(0, pmts[0].amount)
11051105 else throw("Wrong payment")
11061106 else throw("One or two payments expected")
11071107
11081108
11091109 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
11101110 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
11111111 if ((0 > pri))
11121112 then (pri * -1)
11131113 else pri
11141114 }
11151115
11161116
11171117 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
11181118 let $t03325733519 = if (claim)
11191119 then claimFarmed(pType, pool)
11201120 else {
11211121 let claimedAsset = if ((pType == SF_POOL))
11221122 then SWOPID
11231123 else if ((pType == WX_POOL))
11241124 then WXID
11251125 else unknownPoolType()
11261126 $Tuple2(amount, claimedAsset)
11271127 }
11281128 if (($t03325733519 == $t03325733519))
11291129 then {
11301130 let claimAsset = $t03325733519._2
11311131 let claimAmount = $t03325733519._1
11321132 let bal = accountBalance(claimAsset)
11331133 if ((bal == bal))
11341134 then if ((amount > bal))
11351135 then throw("To big amount to exchange")
11361136 else $Tuple2(claimAmount, claimAsset)
11371137 else throw("Strict value is not equal to itself.")
11381138 }
11391139 else throw("Strict value is not equal to itself.")
11401140 }
11411141
11421142
11431143 @Callable(i)
11441144 func getPoolInfoREADONLY (pool) = {
11451145 let poolAddr = addressFromStringValue(pool)
11461146 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
11471147 let $t03388633976 = getPoolData(Address(fromBase58String(pool)), pType)
11481148 let AId = $t03388633976._1
11491149 let BId = $t03388633976._2
11501150 let balA = $t03388633976._3
11511151 let balB = $t03388633976._4
11521152 let shareId = $t03388633976._5
11531153 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11541154 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11551155 }
11561156
11571157
11581158
11591159 @Callable(i)
11601160 func getShareAssetPriceREADONLY (shareId) = {
11611161 let sharePrices = getSharePrice(shareId)
11621162 $Tuple2(nil, sharePrices)
11631163 }
11641164
11651165
11661166
11671167 @Callable(i)
11681168 func getUserPositionShareAmountREADONLY (user,posNum) = {
11691169 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
11701170 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
11711171 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
11721172 $Tuple2(nil, userCanWithdraw)
11731173 }
11741174
11751175
11761176
11771177 @Callable(i)
11781178 func getUserPositionREADONLY (user,pools,posNum) = {
11791179 func userPos (a,pool) = {
11801180 let $t03484934919 = a
11811181 let wAmountsA = $t03484934919._1
11821182 let wAmountsB = $t03484934919._2
11831183 let debts = $t03484934919._3
11841184 let eqWAmountsA = $t03484934919._4
11851185 let eqWAmountsB = $t03484934919._5
11861186 let index = $t03484934919._6
11871187 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
11881188 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
11891189 else {
11901190 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
11911191 let $t03519835288 = getPoolData(Address(fromBase58String(pool)), pType)
11921192 let AId = $t03519835288._1
11931193 let BId = $t03519835288._2
11941194 let balA = $t03519835288._3
11951195 let balB = $t03519835288._4
11961196 let shareId = $t03519835288._5
11971197 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
11981198 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
11991199 let $t03550435624 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
12001200 let wAmountA = $t03550435624._1
12011201 let wAmountB = $t03550435624._2
12021202 if ((borrowAmount > 0))
12031203 then {
12041204 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12051205 let debt = {
12061206 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
12071207 if ($isInstanceOf(@, "Int"))
12081208 then @
12091209 else throw(($getType(@) + " couldn't be cast to Int"))
12101210 }
12111211 if ((debt == debt))
12121212 then {
12131213 let amountToGetEx = if (if ((borrowAsset == AId))
12141214 then (debt > wAmountA)
12151215 else false)
12161216 then (debt - wAmountA)
12171217 else if (if ((borrowAsset == BId))
12181218 then (debt > wAmountB)
12191219 else false)
12201220 then (debt - wAmountB)
12211221 else 0
12221222 let amountToPay = if ((amountToGetEx > 0))
12231223 then if ((pType == SF_POOL))
12241224 then {
12251225 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12261226 ex._2
12271227 }
12281228 else if ((pType == WX_POOL))
12291229 then {
12301230 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12311231 ex._2
12321232 }
12331233 else unknownPoolType()
12341234 else 0
12351235 let $t03653636755 = if ((borrowAsset == AId))
12361236 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12371237 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
12381238 let eqWAmountA = $t03653636755._1
12391239 let eqWAmountB = $t03653636755._2
12401240 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12411241 }
12421242 else throw("Strict value is not equal to itself.")
12431243 }
12441244 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
12451245 }
12461246 }
12471247
12481248 let $t03701037121 = {
12491249 let $l = pools
12501250 let $s = size($l)
12511251 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12521252 func $f0_1 ($a,$i) = if (($i >= $s))
12531253 then $a
12541254 else userPos($a, $l[$i])
12551255
12561256 func $f0_2 ($a,$i) = if (($i >= $s))
12571257 then $a
12581258 else throw("List size exceeds 20")
12591259
12601260 $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)
12611261 }
12621262 let wAmountsA = $t03701037121._1
12631263 let wAmountsB = $t03701037121._2
12641264 let debts = $t03701037121._3
12651265 let eqWAmountsA = $t03701037121._4
12661266 let eqWAmountsB = $t03701037121._5
12671267 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
12681268 }
12691269
12701270
12711271
12721272 @Callable(i)
12731273 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
12741274 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
12751275 if (!(isPoolActive(pool, pType)))
12761276 then throw("Pool not active at this moment")
12771277 else if (if ((100 > leverage))
12781278 then true
12791279 else (leverage > 300))
12801280 then throw("Leverage can't be <100 and >300")
12811281 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
12821282 then (leverage > 100)
12831283 else false)
12841284 then throw("You can't borrow in this pool")
12851285 else {
12861286 let $t03771937809 = getPoolData(Address(fromBase58String(pool)), pType)
12871287 let AId = $t03771937809._1
12881288 let BId = $t03771937809._2
12891289 let balA = $t03771937809._3
12901290 let balB = $t03771937809._4
12911291 let shareId = $t03771937809._5
12921292 if (if ((borrowId != AId))
12931293 then (borrowId != BId)
12941294 else false)
12951295 then throw("Wrong borrow asset")
12961296 else {
12971297 let $t03789037949 = parseReplenishPmts(i.payments, AId, BId)
12981298 let pmtA = $t03789037949._1
12991299 let pmtB = $t03789037949._2
13001300 let user = toString(i.caller)
13011301 let newPosNum = getNewUserPositionNumber(user)
13021302 if ((leverage > 100))
13031303 then {
13041304 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
13051305 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
13061306 let newRequestId = {
13071307 let @ = invoke(this, "createNewRequest", [request], nil)
13081308 if ($isInstanceOf(@, "Int"))
13091309 then @
13101310 else throw(($getType(@) + " couldn't be cast to Int"))
13111311 }
13121312 if ((newRequestId == newRequestId))
13131313 then {
13141314 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
13151315 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
13161316 if ((inv == inv))
13171317 then {
13181318 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
13191319 let $t03893839032 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
13201320 if (($t03893839032 == $t03893839032))
13211321 then {
13221322 let newBalB = $t03893839032._2
13231323 let newBalA = $t03893839032._1
13241324 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
13251325 let $t03910239217 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
13261326 let wAmountA = $t03910239217._1
13271327 let wAmountB = $t03910239217._2
13281328 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13291329 }
13301330 else throw("Strict value is not equal to itself.")
13311331 }
13321332 else throw("Strict value is not equal to itself.")
13331333 }
13341334 else throw("Strict value is not equal to itself.")
13351335 }
13361336 else {
13371337 let $t03927039385 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
13381338 if (($t03927039385 == $t03927039385))
13391339 then {
13401340 let axlyFee = $t03927039385._2
13411341 let userStaked = $t03927039385._1
13421342 let $t03939139485 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
13431343 if (($t03939139485 == $t03939139485))
13441344 then {
13451345 let newBalB = $t03939139485._2
13461346 let newBalA = $t03939139485._1
13471347 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
13481348 let $t03955539670 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
13491349 let wAmountA = $t03955539670._1
13501350 let wAmountB = $t03955539670._2
13511351 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13521352 }
13531353 else throw("Strict value is not equal to itself.")
13541354 }
13551355 else throw("Strict value is not equal to itself.")
13561356 }
13571357 }
13581358 }
13591359 })
13601360
13611361
13621362
13631363 @Callable(i)
13641364 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
13651365 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
13661366 if (!(isPoolActive(pool, pType)))
13671367 then throw("Pool not active at this moment")
13681368 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
13691369 })
13701370
13711371
13721372
13731373 @Callable(i)
13741374 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
13751375 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
13761376 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
13771377 if (!(isPoolActive(poolId, pType)))
13781378 then throw("Pool not active at this moment")
13791379 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
13801380 then throw("There are no user position")
13811381 else if ((0 >= price))
13821382 then throw("Price must be greater than 0")
13831383 else if ((price > tokenOraclePrice))
13841384 then throw("Price must be less than current token price")
13851385 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
13861386 })
13871387
13881388
13891389
13901390 @Callable(i)
13911391 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
13921392 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
13931393 if (!(isPoolActive(poolId, pType)))
13941394 then throw("Pool not active at this moment")
13951395 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
13961396 then throw("No entry")
13971397 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
13981398 })
13991399
14001400
14011401
14021402 @Callable(i)
14031403 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
14041404 then throw("Already inited")
14051405 else if (!(isDefined(addressFromString(moneyBoxAddr))))
14061406 then throw("moneyBoxAddr is not correct address")
14071407 else if (!(isDefined(addressFromString(sfFarmingAddr))))
14081408 then throw("sfFarmingAddr is not correct address")
14091409 else if (!(isDefined(addressFromString(lendAddr))))
14101410 then throw("lendAddr is not correct address")
14111411 else if (!(isDefined(addressFromString(priceOracleAddr))))
14121412 then throw("priceOracleAddr is not correct address")
14131413 else if (!(isDefined(addressFromString(keeperExContract))))
14141414 then throw("keeperExContract is not correct address")
14151415 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
14161416 then throw("swopAssetId is not correct asset id")
14171417 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
14181418 then throw("swopAssetId is not correct asset id")
14191419 else if ((size(fromBase58String(operatorPubKey)) != 32))
14201420 then throw("operatorPubKey is not correct")
14211421 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
14221422 then throw("group1Admin1PubKey is not correct")
14231423 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
14241424 then throw("group1Admin2PubKey is not correct")
14251425 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
14261426 then throw("group2Admin1PubKey is not correct")
14271427 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
14281428 then throw("group2Admin2PubKey is not correct")
14291429 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)])
14301430
14311431
14321432
14331433 @Callable(i)
14341434 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
14351435 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
14361436 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
14371437 })
14381438
14391439
14401440
14411441 @Callable(i)
14421442 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14431443 let $t04450944613 = parseRequest(requestId)
14441444 let user = $t04450944613._1
14451445 let pool = $t04450944613._2
14461446 let pmtA = $t04450944613._3
14471447 let AId = $t04450944613._4
14481448 let pmtB = $t04450944613._5
14491449 let BId = $t04450944613._6
14501450 let balA = $t04450944613._7
14511451 let balB = $t04450944613._8
14521452 let shareId = $t04450944613._9
14531453 let bwAsset = $t04450944613._10
14541454 let bwAmount = $t04450944613._11
14551455 if ((size(i.payments) != 1))
14561456 then throw("Wrong payment size")
14571457 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14581458 then true
14591459 else (i.payments[0].amount != bwAmount))
14601460 then throw("Wrong payment")
14611461 else {
14621462 let $t04480344903 = if ((AId == bwAsset))
14631463 then $Tuple2((pmtA + bwAmount), pmtB)
14641464 else $Tuple2(pmtA, (pmtB + bwAmount))
14651465 let pmtAllA = $t04480344903._1
14661466 let pmtAllB = $t04480344903._2
14671467 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
14681468 let $t04498545100 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
14691469 let userStaked = $t04498545100._1
14701470 let axlyFee = $t04498545100._2
14711471 let posNum = getNewUserPositionNumber(user)
14721472 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
14731473 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
14741474 let $t04546045575 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
14751475 let wAmountA = $t04546045575._1
14761476 let wAmountB = $t04546045575._2
14771477 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
14781478 }
14791479 }))
14801480
14811481
14821482
14831483 @Callable(i)
14841484 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14851485 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
14861486 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
14871487 let $t04609646186 = getPoolData(Address(fromBase58String(pool)), pType)
14881488 let AId = $t04609646186._1
14891489 let BId = $t04609646186._2
14901490 let balA = $t04609646186._3
14911491 let balB = $t04609646186._4
14921492 let shareId = $t04609646186._5
14931493 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
14941494 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
14951495 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
14961496 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
14971497 if ((liquidateAmount > userCanWithdraw))
14981498 then throw("You can't liquidate more than user have")
14991499 else if ((borrowAmount == 0))
15001500 then throw("You can't liquidate position without borrow")
15011501 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))]
15021502 }))
15031503
15041504
15051505
15061506 @Callable(i)
15071507 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15081508 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
15091509 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
15101510 if ((tokenOraclePrice > stopLossPrice))
15111511 then throw("Token price greater stop loss price")
15121512 else {
15131513 let res = withdrawToUser(user, pool, toString(posId), true)
15141514 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
15151515 }
15161516 }))
15171517
15181518
15191519
15201520 @Callable(i)
15211521 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15221522 let pType = getStringValue(this, (kPool + pool))
15231523 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
15241524 let $t04815648258 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
15251525 if (($t04815648258 == $t04815648258))
15261526 then {
15271527 let claimedAsset = $t04815648258._2
15281528 let claimedAmount = $t04815648258._1
15291529 let rArgs = split(route, "__")
15301530 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15311531 then directSwopfiCPMM(rArgs, tokenToId)
15321532 else if ((rArgs[0] == "routingSwopfi"))
15331533 then directRoutingSwopfi(rArgs, tokenToId)
15341534 else throw("Wrong route")
15351535 if ((exchangedAmount == exchangedAmount))
15361536 then {
15371537 let newChange = ((claimedAmount + change) - amountToExchange)
15381538 let changeEntry = if ((newChange >= 0))
15391539 then [IntegerEntry((pool + kPoolCapChange), newChange)]
15401540 else nil
15411541 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
15421542 }
15431543 else throw("Strict value is not equal to itself.")
15441544 }
15451545 else throw("Strict value is not equal to itself.")
15461546 }))
15471547
15481548
15491549
15501550 @Callable(i)
15511551 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15521552 let pType = getStringValue(this, (kPool + pool))
15531553 let $t04894249040 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
15541554 if (($t04894249040 == $t04894249040))
15551555 then {
15561556 let claimedAsset = $t04894249040._2
15571557 let claimedAmount = $t04894249040._1
15581558 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15591559 }
15601560 else throw("Strict value is not equal to itself.")
15611561 }))
15621562
15631563
15641564
15651565 @Callable(i)
15661566 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
15671567 then (type != WX_POOL)
15681568 else false)
15691569 then throw("Wrong type")
15701570 else if (if ((poolType != CPMM))
15711571 then (poolType != FLAT)
15721572 else false)
15731573 then throw("Wrong pool type")
15741574 else {
15751575 let $t04956149655 = getPoolData(Address(fromBase58String(poolAddr)), type)
15761576 let aId = $t04956149655._1
15771577 let bId = $t04956149655._2
15781578 let aBal = $t04956149655._3
15791579 let bBal = $t04956149655._4
15801580 let shareId = $t04956149655._5
15811581 if ((0 > inFeeNoLoan))
15821582 then throw("inFeeNoLoan must be greater than 0")
15831583 else if ((0 > inFeeLoan))
15841584 then throw("inFeeLoan must be greater than 0")
15851585 else if ((0 > capFeeNoLoan))
15861586 then throw("capFeeNoLoan must be greater than 0")
15871587 else if ((0 > capFeeWithLoan))
15881588 then throw("capFeeWithLoan must be greater than 0")
15891589 else if ((0 > stoplossFeeNoLoan))
15901590 then throw("stoplossFeeNoLoan must be greater than 0")
15911591 else if ((0 > stoplossFeeWithLoan))
15921592 then throw("stoplossFeeWithLoan must be greater than 0")
15931593 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)]
15941594 }))
15951595
15961596
15971597
15981598 @Callable(i)
15991599 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
16001600 then throw(("Can't find pool with addr " + poolAddr))
16011601 else if ((0 > inFeeNoLoan))
16021602 then throw("inFeeNoLoan must be greater than 0")
16031603 else if ((0 > inFeeLoan))
16041604 then throw("inFeeLoan must be greater than 0")
16051605 else if ((0 > capFeeNoLoan))
16061606 then throw("capFeeNoLoan must be greater than 0")
16071607 else if ((0 > capFeeWithLoan))
16081608 then throw("capFeeWithLoan must be greater than 0")
16091609 else if ((0 > stoplossFeeNoLoan))
16101610 then throw("stoplossFeeNoLoan must be greater than 0")
16111611 else if ((0 > stoplossFeeWithLoan))
16121612 then throw("stoplossFeeWithLoan must be greater than 0")
16131613 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)]))
16141614
16151615
16161616
16171617 @Callable(i)
16181618 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
16191619 then throw("dApp already active")
16201620 else [BooleanEntry(kActive, true)])
16211621
16221622
16231623
16241624 @Callable(i)
16251625 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
16261626 then throw("dApp already shutdown")
16271627 else [BooleanEntry(kActive, false)])
16281628
16291629
16301630
16311631 @Callable(i)
16321632 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
16331633 then throw("dApp already active for users")
16341634 else [BooleanEntry(kActiveUsers, true)])
16351635
16361636
16371637
16381638 @Callable(i)
16391639 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
16401640 then throw("dApp already shutdown for users")
16411641 else [BooleanEntry(kActiveUsers, false)])
16421642
16431643
16441644
16451645 @Callable(i)
16461646 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
16471647 then throw("SWOPFI already active")
16481648 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
16491649
16501650
16511651
16521652 @Callable(i)
16531653 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
16541654 then throw("SWOPFI already shutdown")
16551655 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
16561656
16571657
16581658
16591659 @Callable(i)
16601660 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
16611661 then throw("WX already active")
16621662 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
16631663
16641664
16651665
16661666 @Callable(i)
16671667 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
16681668 then throw("WX already shutdown")
16691669 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
16701670
16711671
16721672
16731673 @Callable(i)
16741674 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16751675 then throw("Unknown pool")
16761676 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
16771677 then throw("Pool already active")
16781678 else [BooleanEntry((pool + kPoolActive), true)])
16791679
16801680
16811681
16821682 @Callable(i)
16831683 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16841684 then throw("Unknown pool")
16851685 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
16861686 then throw("Pool already shutdown")
16871687 else [BooleanEntry((pool + kPoolActive), false)])
16881688
16891689
16901690 @Verifier(tx)
16911691 func verify () = match tx {
16921692 case inv: InvokeScriptTransaction =>
16931693 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
16941694 let isRightFee = if ((inv.fee == 900000))
16951695 then (inv.feeAssetId == unit)
16961696 else false
16971697 let isInitCall = (inv.function == "init")
16981698 let isnoPayments = (size(inv.payments) == 0)
16991699 if (if (if (isRightFee)
17001700 then isInitCall
17011701 else false)
17021702 then isSelf
17031703 else false)
17041704 then isnoPayments
17051705 else false
17061706 case _ =>
17071707 let group1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
17081708 then 1
17091709 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin2PK))
17101710 then 1
17111711 else 0))
17121712 let group2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin1PK))
17131713 then 1
17141714 else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin2PK))
17151715 then 1
17161716 else 0))
17171717 ((group1Signed + group2Signed) == 2)
17181718 }
17191719

github/deemru/w8io/3ef1775 
133.59 ms