tx · DSF66GStJe5vyjV8emZZXmJMmJsMeG52mGBqK5ABjmrd

3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS:  -0.53000000 Waves

2023.10.18 13:04 [2803901] smart account 3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS > SELF 0.00000000 Waves

{ "type": 13, "id": "DSF66GStJe5vyjV8emZZXmJMmJsMeG52mGBqK5ABjmrd", "fee": 53000000, "feeAssetId": null, "timestamp": 1697623455911, "version": 2, "chainId": 84, "sender": "3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS", "senderPublicKey": "HP8sssVq1866F7CaPQJwgFrt6fsqhQjKwM84cL1wjD2a", "proofs": [ "4jsMDm9zvRXXNQdNXNztabkUP4bJ5C1MLWwLbj9JQFMg1jqEVKaDuz71nhnVh6rHLMXxsU5Q3BMQ47j98QUHe6Bf" ], "script": "base64:BgKiAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEgcKBQgICAEEEgUKAwgEARIMCgoICAgBAQEBAQEEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCIUBAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gABENQTU0CBGNwbW0ABEZMQVQCBGZsYXQAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4AFFNUT1BMT1NTX0ZFRV9OT19MT0FOAg5zdG9wTG9zc05vTG9hbgANU1RPUExPU1NfTE9BTgIMc3RvcExvc3NMb2FuAAhMT0FOX0ZFRQIEbG9hbgALTk9fTE9BTl9GRUUCBm5vTG9hbgAGTk9fRkVFAgVub0ZlZQAGU0NBTEU4AIDC1y8AB1NDQUxFMTAAgMivoCUAB1NDQUxFMTYJALYCAQCAgIT+pt7hEQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQAEmtTRlBvb2xTaGFyZVN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AAprU0ZQb29sRmVlAgpjb21taXNzaW9uAA1rVXNlclBvc2l0aW9uAg1fdXNlclBvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAIRX3VzZXJQb3NpdGlvblBvb2wAEWtVc2VyQm9ycm93QW1vdW50AhlfdXNlclBvc2l0aW9uQm9ycm93QW1vdW50ABJrVXNlckJvcnJvd0Fzc2V0SWQCGl91c2VyUG9zaXRpb25Cb3Jyb3dBc3NldElkABBrVXNlclBvc2l0aW9uTnVtAhNfdXNlclBvc2l0aW9uTnVtYmVyABVrVXNlclBvc2l0aW9uSW50ZXJlc3QCFV91c2VyUG9zaXRpb25JbnRlcmVzdAAKa1Bvb2xUb3RhbAIKX3Bvb2xUb3RhbAAOa1Bvb2xUb3RhbExvYW4CDl9wb29sVG90YWxMb2FuABFrUG9vbEludGVyZXN0TG9hbgIRX3Bvb2xJbnRlcmVzdExvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CE19wb29sSW50ZXJlc3ROb0xvYW4ADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAJa1Bvb2xUeXBlAglfcG9vbFR5cGUACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCF19mYWxsYmFja0V4Y2hhbmdlU3dvcGZpAAlrTW9uZXlCb3gCDmF4bHlfbW9uZXlfYm94AA5rU0ZGYXJtaW5nQWRkcgITc3dvcGZpX2Zhcm1pbmdfYWRkcgAMa0xlbmRTZXJ2aWNlAhFsZW5kX3NlcnZpY2VfYWRkcgAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlAAtrRXhDb250cmFjdAIRZXhjaGFuZ2VfY29udHJhY3QAD2tXeFN3YXBDb250cmFjdAIQd3hfc3dhcF9jb250cmFjdAAHa1N3b3BJZAIHc3dvcF9pZAAFa1d4SWQCBXd4X2lkAA9rR3JvdXAxQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAPa0dyb3VwMUFkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkAD2tHcm91cDJBZG1pbjFQSwIVZ3JvdXAyX2FkbWluMV9wdWJfa2V5AA9rR3JvdXAyQWRtaW4yUEsCFWdyb3VwMl9hZG1pbjJfcHViX2tleQAIbW9uZXlCb3gJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwULa0V4Q29udHJhY3QCHE5vIGV4Y2hhbmdlIGNvbnRyYWN0IGFkZHJlc3MAD3ByaWNlT3JhY2xlQWRkcgkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrUHJpY2VPcmFjbGUCF05vIHByaWNlIG9yYWNsZSBhZGRyZXNzAA53eFN3YXBDb250cmFjdAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGU1dPUElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQdrU3dvcElkAgpObyBzd29wIGlkAARXWElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQVrV3hJZAIITm8gd3ggaWQADmdyb3VwMUFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAxQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4xUEsADmdyb3VwMUFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAxQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4yUEsADmdyb3VwMkFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsADmdyb3VwMkFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsBD3Vua25vd25Qb29sVHlwZQAJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldExlbmRTcnZBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrTGVuZFNlcnZpY2UCG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgEOaXNPcGVyYXRvckNhbGwBAWkDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBQR1bml0CQACAQIkT25seSBvcGVyYXRvciBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQtpc0FkbWluQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjFQSwYJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMlBLBQR1bml0CQACAQIoT25seSBhZG1pbiBncm91cDEgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgkBDmdldExlbmRTcnZBZGRyAAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQhpc0FjdGl2ZQADCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgYFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50ARBpc0FjdGl2ZUZvclVzZXJzAAMDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGBgcFBHVuaXQJAAIBAilEQXBwIGlzIGluYWN0aXZlIGZvciB1c2VycyBhdCB0aGlzIG1vbWVudAEMaXNQb29sQWN0aXZlAgRwb29sBHR5cGUECldYU0ZBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQR0eXBlBQtrQWN0aXZlU0ZXWAYECnBvb2xBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYDAwUKV1hTRkFjdGl2ZQUKcG9vbEFjdGl2ZQcGBwEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBEWdldFNGUG9vbEJhbGFuY2VzAQhwb29sQWRkcgkAlAoCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xBQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEJBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEIgYXNzZXQgYmFsYW5jZQERZ2V0V1hQb29sQmFsYW5jZXMDCHBvb2xBZGRyA2FJZANiSWQJAJQKAgoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYUlkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2JJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQ9nZXRQb29sQmFsYW5jZXMECHBvb2xBZGRyBHR5cGUDYUlkA2JJZAMJAAACBQR0eXBlBQdTRl9QT09MCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQJAQ91bmtub3duUG9vbFR5cGUAAQ1nZXRTRlBvb2xEYXRhAQhwb29sQWRkcgQLJHQwODA4OTgxMzgJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFCyR0MDgwODk4MTM4BQskdDA4MDg5ODEzOAQEYmFsQggFCyR0MDgwODk4MTM4Al8yBARiYWxBCAULJHQwODA4OTgxMzgCXzEJAJcKBQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQUFzc2V0SWQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEJBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBQRiYWxBBQRiYWxCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFDmtTRlBvb2xTaGFyZUlkAhhDYW4ndCBnZXQgc2hhcmUgYXNzZXQgaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldFdYUG9vbERhdGEBCHBvb2xBZGRyBANjZmcKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDY2ZnBQNjZmcEA2FJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQEA2JJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABQMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQEB3NoYXJlSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAMDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhpDYW4ndCBnZXQgcG9vbCBMUCBhc3NldCBpZAQLJHQwODgzNTg4OTQJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAMJAAACBQskdDA4ODM1ODg5NAULJHQwODgzNTg4OTQEBGJhbEIIBQskdDA4ODM1ODg5NAJfMgQEYmFsQQgFCyR0MDg4MzU4ODk0Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BCQDNCAIFAWEFCmFzc2V0UHJpY2UKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sAiBDYW4ndCBmaW5kIHBvb2wgYWRkciBieSBzaGFyZSBpZAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMTE4ODMxMTk0OAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQ0kdDAxMTg4MzExOTQ4Al8xBANiSWQIBQ0kdDAxMTg4MzExOTQ4Al8yBAhhQmFsYW5jZQgFDSR0MDExODgzMTE5NDgCXzMECGJCYWxhbmNlCAUNJHQwMTE4ODMxMTk0OAJfNAQGcHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQHZFByaWNlQQkAkQMCBQZwcmljZXMAAAQHZFByaWNlQgkAkQMCBQZwcmljZXMAAQMDCQBmAgAABQdkUHJpY2VBBgkAZgIAAAUHZFByaWNlQgD///////////8BBAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkBApBUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQKQlByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2JJZAAAAAAFBERPV04EDnNoYXJlUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHc2hhcmVJZAAAAAAFBERPV04EA3N1bQkAZAIJAGsDBQhhQmFsYW5jZQUHZFByaWNlQQUKQVByZWNpc2lvbgkAawMFCGJCYWxhbmNlBQdkUHJpY2VCBQpCUHJlY2lzaW9uCQBrAwUDc3VtBQ5zaGFyZVByZWNpc2lvbgULc2hhcmVTdXBwbHkBDmdldFNoYXJlUHJpY2VzAQhzaGFyZUlkcwoBCWdldFByaWNlcwIBYQdzaGFyZUlkCQDNCAIFAWEJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAoAAiRsBQhzaGFyZUlkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZ2V0UHJpY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQBDmdldEN1cnNFbnRyaWVzBANhSWQDYklkB3NoYXJlSWQId0Ftb3VudHMEDGFzc2V0c1ByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwECnNoYXJlUHJpY2UJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAQGcHJpY2VzCQDOCAIJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwAACQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAQkAzAgCCQCkAwEFCnNoYXJlUHJpY2UFA25pbAUId0Ftb3VudHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1Rva2VuTGFzdFByaWNlCQC5CQIFBnByaWNlcwIBLAUDbmlsARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBXBUeXBlCHBvb2xBZGRyBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQEcmVwbAoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAiBjYWxjTFBSZXBsZW5pc2hUd29Ub2tlbnNSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUEcG10QQkAzAgCCQCkAwEFBHBtdEIFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFBHJlcGwFBHJlcGwJAJcKBQoAAUAJAJEDAgUEcmVwbAADAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAAEAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkBDGFzc2V0SWRUb1N0cgEJAJEDAgUEcmVwbAACCgABQAkAkQMCBQRyZXBsAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxMzQ5MjEzNzQyCQCUCgIJALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICIGV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBHBtdEEFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18JALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICH2V2YWx1YXRlUHV0QnlQcmljZUFzc2V0UkVBRE9OTFkJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxMzQ5MjEzNzQyBQ0kdDAxMzQ5MjEzNzQyBApldmFsUHV0SW5CCAUNJHQwMTM0OTIxMzc0MgJfMgQKZXZhbFB1dEluQQgFDSR0MDEzNDkyMTM3NDICXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUGCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYUlkBQRwbXRBCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNiSWQFBHBtdEIFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMJAMwIAgkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAUIcG9vbEFkZHICA3B1dAkAzAgCAMCEPQkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBAhwb29sQWRkcgVwVHlwZQNwbXQFcG10SWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQVwbXRJZAUDcG10BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhVyZXBsZW5pc2hXaXRoT25lVG9rZW4JAMwIAgkAzAgCAgEwCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZmMDCQAAAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFCWtQb29sVHlwZQIEY3BtbQUERkxBVAILcHV0T25lVGtuVjICCXB1dE9uZVRrbgkA/AcEBQhwb29sQWRkcgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgVzdGFrZQUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQNJHQwMTU1MjAxNTg3MAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE1NTIwMTU4NzACXzEEBWZOYW1lCAUNJHQwMTU1MjAxNTg3MAJfMgQGcGFyYW1zCAUNJHQwMTU1MjAxNTg3MAJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxNjI5MjE2NTk4AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE2MjkyMTY1OTgCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNjI5MjE2NTk4Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAxNzMzODE3Mzc3CQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAxNzMzODE3Mzc3Al8xBAVwckZlZQgFDSR0MDE3MzM4MTczNzcCXzIECGZlZVNjYWxlCQC2AgEAgMLXLwQNJHQwMTc0MTcxNzcyNQMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEIJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxBCQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTc0MTcxNzcyNQJfMQQKYXNzZXRUb1BheQgFDSR0MDE3NDE3MTc3MjUCXzIEEmFtb3VudFRvUGF5V2l0aEZlZQkAoAMBCQC9AgQJALYCAQULYW1vdW50VG9QYXkFCGZlZVNjYWxlCQC4AgIFCGZlZVNjYWxlCQC2AgEJAGQCBQVwckZlZQUEcEZlZQUHQ0VJTElORwkAlAoCBQphc3NldFRvUGF5BRJhbW91bnRUb1BheVdpdGhGZWUBEGV4Y2hhbmdlRGlyZWN0bHkIBXBUeXBlBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAZwb29sRkIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBRdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIAAwMJAAACBQVwVHlwZQUHU0ZfUE9PTAYJAQIhPQIFBnBvb2xGQgIABA0kdDAxODE2NjE4Mzc4AwkAAAIFBnBvb2xGQgIACQCVCgMFBGJhbEEFBGJhbEIFBHBvb2wEDSR0MDE4MjcyMTgzNDUJARFnZXRTRlBvb2xCYWxhbmNlcwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBnBvb2xGQgQGc2ZCYWxBCAUNJHQwMTgyNzIxODM0NQJfMQQGc2ZCYWxCCAUNJHQwMTgyNzIxODM0NQJfMgkAlQoDBQZzZkJhbEEFBnNmQmFsQgUGcG9vbEZCBAVwQmFsQQgFDSR0MDE4MTY2MTgzNzgCXzEEBXBCYWxCCAUNJHQwMTgxNjYxODM3OAJfMgQGZXhQb29sCAUNJHQwMTgxNjYxODM3OAJfMwQNJHQwMTgzODMxODUwOQkBEWNhbGNBbW91bnRUb1BheVNGBwUGZXhQb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBXBCYWxBBQVwQmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTgzODMxODUwOQJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxODM4MzE4NTA5Al8yCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmV4UG9vbAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW91bnRUb2tlblRvR2V0BQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTg3MTExODgzMwkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAxODcxMTE4ODMzAl8xBAthbW91bnRUb1BheQgFDSR0MDE4NzExMTg4MzMCXzIJAPwHBAUOd3hTd2FwQ29udHJhY3QCBHN3YXAJAMwIAgUQYW1vdW50VG9rZW5Ub0dldAkAzAgCBQ9hc3NldFRva2VuVG9HZXQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwJAQ91bmtub3duUG9vbFR5cGUAARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDE5MTIwMTk1ODQDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICE2V2YWx1YXRlR2V0UkVBRE9OTFkJAMwIAgUHc2hhcmVJZAkAzAgCBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18DCQAAAgUDaW52BQNpbnYJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2ludgABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUABAdhbW91bnRBCAUNJHQwMTkxMjAxOTU4NAJfMQQHYW1vdW50QggFDSR0MDE5MTIwMTk1ODQCXzIJAJQKAgUHYW1vdW50QQUHYW1vdW50QgELY2xhaW1GYXJtZWQCBXBUeXBlBHBvb2wDCQAAAgUFcFR5cGUFB1NGX1BPT0wECWJhbEJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAgVjbGFpbQkAzAgCBQRwb29sBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFBlNXT1BJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUGU1dPUElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxOTk1MjIwMDMxCQENZ2V0V1hQb29sRGF0YQEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEA2FJZAgFDSR0MDE5OTUyMjAwMzECXzEEA2JJZAgFDSR0MDE5OTUyMjAwMzECXzIEBGFCYWwIBQ0kdDAxOTk1MjIwMDMxAl8zBARiQmFsCAUNJHQwMTk5NTIyMDAzMQJfNAQEbHBJZAgFDSR0MDE5OTUyMjAwMzECXzUECWJhbEJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQDaW52CQD8BwQJARBnZXRXWEZhcm1pbmdBZGRyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAIHY2xhaW1XeAkAzAgCBQRscElkBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFBFdYSUQJAJQKAgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUFBFdYSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAQ9yZXBsZW5pc2hCeVR5cGUKBXBUeXBlBHBvb2wHZmVlVHlwZQRwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIETFBJZAQPbHBCYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQDCQAAAgUPbHBCYWxhbmNlQmVmb3JlBQ9scEJhbGFuY2VCZWZvcmUECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBA0kdDAyMDYyOTIxMDQ1AwMJAGYCBQRwbXRBAAAJAGYCBQRwbXRCAAAHBA0kdDAyMDY5NTIwODExCQEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCAUFcFR5cGUFCHBvb2xBZGRyBQRwbXRBBQNhSWQFBHBtdEIFA2JJZAUEYmFsQQUEYmFsQgQGcG10SW5BCAUNJHQwMjA2OTUyMDgxMQJfMQQGcG10SW5CCAUNJHQwMjA2OTUyMDgxMQJfMgQGY2hhbmdlCAUNJHQwMjA2OTUyMDgxMQJfMwQIY2hhbmdlSWQIBQ0kdDAyMDY5NTIwODExAl80BANpbnYJARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUGBQhwb29sQWRkcgUFcFR5cGUFBnBtdEluQQUDYUlkBQZwbXRJbkIFA2JJZAMJAAACBQNpbnYFA2ludgkAlAoCBQZjaGFuZ2UFCGNoYW5nZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAZgIFBHBtdEEAAAkAlAoCBQRwbXRBBQNhSWQDCQBmAgUEcG10QgAACQCUCgIFBHBtdEIFA2JJZAkAAgECEHBtdHMgbXVzdCBiZSA+IDAEBmNoYW5nZQgFDSR0MDIwNjI5MjEwNDUCXzEECGNoYW5nZUlkCAUNJHQwMjA2MjkyMTA0NQJfMgQDaW52AwkAZgIFBmNoYW5nZQAACQEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUEBQhwb29sQWRkcgUFcFR5cGUFBmNoYW5nZQUIY2hhbmdlSWQFA25pbAMJAAACBQNpbnYFA2ludgQObHBCYWxhbmNlQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAQLdG90YWxTdGFrZWQJAGUCBQ5scEJhbGFuY2VBZnRlcgUPbHBCYWxhbmNlQmVmb3JlBA1heGx5RmVlQW1vdW50CQBrAwULdG90YWxTdGFrZWQJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgQRdXNlclNoYXJlRm9yU3Rha2UJAGUCBQt0b3RhbFN0YWtlZAUNYXhseUZlZUFtb3VudAMJAGcCAAAFEXVzZXJTaGFyZUZvclN0YWtlCQACAQIoYW1vdW50IG9mIHN0YWtlZCBzaGFyZXRva2VucyBtdXN0IGJlID4gMAQFaW52TFAJAQdzdGFrZUxQBAUEcG9vbAUFcFR5cGUFBExQSWQFEXVzZXJTaGFyZUZvclN0YWtlAwkAAAIFBWludkxQBQVpbnZMUAkAlAoCBRF1c2VyU2hhcmVGb3JTdGFrZQUNYXhseUZlZUFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQcmVwbGVuaXNoRW50cmllcwgEcG9vbAR1c2VyDHN0YWtlZEFtb3VudA1heGx5RmVlQW1vdW50BnBvc051bQdzaGFyZUlkBHR5cGUId2l0aExvYW4EC3RvdGFsQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA90b3RhbEFtb3VudExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQNJHQwMjE5MDIyMjE0MAMFCHdpdGhMb2FuCQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4JAGQCBQ90b3RhbEFtb3VudExvYW4FDHN0YWtlZEFtb3VudAkAlAoCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FD3RvdGFsQW1vdW50TG9hbgQPY3VyUG9vbEludGVyZXN0CAUNJHQwMjE5MDIyMjE0MAJfMQQTdG90YWxTdGFrZWRXaXRoTG9hbggFDSR0MDIxOTAyMjIxNDACXzIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFC3RvdGFsQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4FE3RvdGFsU3Rha2VkV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUNa1VzZXJQb3NpdGlvbgUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFWtVc2VyUG9zaXRpb25JbnRlcmVzdAUPY3VyUG9vbEludGVyZXN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAUEcG9vbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRBrVXNlclBvc2l0aW9uTnVtBQZwb3NOdW0JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlGZWVBbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAQlsaXN0VG9JbnQCAWEEaXRlbQkAzQgCBQFhCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0BEGRpcmVjdFN3b3BmaUNQTU0CBXJBcmdzB3Rva2VuVG8EBGRBcHAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUFckFyZ3MAAQQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDcG10CQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBCQCRAwIFBHBtdFAAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBHBtdFAAAQUDbmlsBAttaW5Ub1JlY2l2ZQkAkQMCBQVyQXJncwADBANpbnYJAPwHBAUEZEFwcAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgULbWluVG9SZWNpdmUFA25pbAUDbmlsBQNwbXQDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2RpcmVjdFJvdXRpbmdTd29wZmkCBXJBcmdzB3Rva2VuVG8EBGRBcHAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUFckFyZ3MAAQQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQEBHBtdFAJALUJAgkAkQMCBQVyQXJncwACAgF8CQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEBGFyZ3MEBWVBcmdzCQC1CQIJAJEDAgUFckFyZ3MAAwIBfAQKZXhjaGFuZ2VycwkAtQkCCQCRAwIFBWVBcmdzAAACASwEDmV4Y2hhbmdlcnNUeXBlCQC1CQIJAJEDAgUFZUFyZ3MAAQIBLAQFYXJnczEKAAIkbAkAtQkCCQCRAwIFBWVBcmdzAAICASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWxpc3RUb0ludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwQFYXJnczIKAAIkbAkAtQkCCQCRAwIFBWVBcmdzAAMCASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWxpc3RUb0ludAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwQRcm91dGluZ0Fzc2V0c0tleXMJALUJAgkAkQMCBQVlQXJncwAEAgEsBAttaW5Ub1JlY2l2ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWVBcmdzAAUJAMwIAgUKZXhjaGFuZ2VycwkAzAgCBQ5leGNoYW5nZXJzVHlwZQkAzAgCBQVhcmdzMQkAzAgCBQVhcmdzMgkAzAgCBRFyb3V0aW5nQXNzZXRzS2V5cwkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBANpbnYJAPwHBAUEZEFwcAIMcm91dGluZ1RyYWRlBQRhcmdzBQNwbXQDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCmNhcGl0YWxpemUEBHBvb2wFcFR5cGUHdG9rZW5JZAt0b2tlbkFtb3VudAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBA0kdDAyNDI0NzI0MzEzCQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA0FJZAgFDSR0MDI0MjQ3MjQzMTMCXzEEA0JJZAgFDSR0MDI0MjQ3MjQzMTMCXzIEBGJhbEEIBQ0kdDAyNDI0NzI0MzEzAl8zBARiYWxCCAUNJHQwMjQyNDcyNDMxMwJfNAQHc2hhcmVJZAgFDSR0MDI0MjQ3MjQzMTMCXzUDAwkBAiE9AgUHdG9rZW5JZAUDQUlkCQECIT0CBQd0b2tlbklkBQNCSWQHCQACAQILV3JvbmcgYXNzZXQEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wDCQAAAgUQdG90YWxTaGFyZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQt0b2tlbkFtb3VudAkA2QQBBQd0b2tlbklkBQNuaWwEGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBAtsb2FuUGVyY2VudAkAawMFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUGU0NBTEU4BRB0b3RhbFNoYXJlQW1vdW50BBB0b2tlbnNGb3JGZWVMb2FuCQBrAwULdG9rZW5BbW91bnQFC2xvYW5QZXJjZW50BQZTQ0FMRTgEEnRva2Vuc0ZvckZlZU5vTG9hbgkAZQIFC3Rva2VuQW1vdW50BRB0b2tlbnNGb3JGZWVMb2FuBAtheGx5RmVlTG9hbgkAawMFEHRva2Vuc0ZvckZlZUxvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUMQ0FQX0ZFRV9MT0FOBQpGRUVfU0NBTEU2BA1heGx5RmVlTm9Mb2FuCQBrAwUSdG9rZW5zRm9yRmVlTm9Mb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFD0NBUF9GRUVfTk9fTE9BTgUKRkVFX1NDQUxFNgQHYXhseUZlZQkAZAIFC2F4bHlGZWVMb2FuBQ1heGx5RmVlTm9Mb2FuBA0kdDAyNTA1ODI1MTU4AwkAAAIFB3Rva2VuSWQFA0FJZAkAlAoCCQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUAAAkAlAoCAAAJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQQEcG10QQgFDSR0MDI1MDU4MjUxNTgCXzEEBHBtdEIIBQ0kdDAyNTA1ODI1MTU4Al8yBA0kdDAyNTE2MTI1MjY1CQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFBk5PX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQEDHN0YWtlZEFtb3VudAgFDSR0MDI1MTYxMjUyNjUCXzEEAm5mCAUNJHQwMjUxNjEyNTI2NQJfMgQTY3VyUG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQKc3Rha2VkTG9hbgkAawMFDHN0YWtlZEFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQMc3Rha2VkTm9Mb2FuCQBlAgUMc3Rha2VkQW1vdW50BQpzdGFrZWRMb2FuBA9uZXdJbnRlcmVzdExvYW4DCQBmAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRNjdXJQb29sSW50ZXJlc3RMb2FuCQBrAwUKc3Rha2VkTG9hbgUHU0NBTEUxMAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAEEW5ld0ludGVyZXN0Tm9Mb2FuAwkAZgIJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkAawMFDHN0YWtlZE5vTG9hbgUHU0NBTEUxMAkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4FD25ld0ludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuBRFuZXdJbnRlcmVzdE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgUQdG90YWxTaGFyZUFtb3VudAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQpzdGFrZWRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQdheGx5RmVlCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlbklkBQNuaWwJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkBQNuaWwBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQEdXNlcgRwb29sBXBvc0lkCGJvcnJvd2VkBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAx1c2VySW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0BAxwb29sSW50ZXJlc3QDBQhib3Jyb3dlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuCQBkAgUHcEFtb3VudAkAawMFB3BBbW91bnQJAGUCBQxwb29sSW50ZXJlc3QFDHVzZXJJbnRlcmVzdAUHU0NBTEUxMAEPY2FsY1N0b3BMb3NzRmVlBARwb29sCmlzQm9ycm93ZWQIc3RvcExvc3MKbHBXaXRoZHJhdwQHZmVlVHlwZQMFCmlzQm9ycm93ZWQFDVNUT1BMT1NTX0xPQU4FFFNUT1BMT1NTX0ZFRV9OT19MT0FOAwUIc3RvcExvc3MJAGsDBQpscFdpdGhkcmF3CQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYAAAEOd2l0aGRyYXdUb1VzZXIEBHVzZXIEcG9vbAVwb3NJZAhzdG9wTG9zcwQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQKaXNCb3Jyb3dlZAkAZgIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAAAAAAED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBXBvc0lkBQppc0JvcnJvd2VkBA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wECHVzZXJBZGRyCQEHQWRkcmVzcwEJANkEAQUEdXNlcgQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwMjc3OTQyNzg2NgkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAZpZEFTdHIIBQ0kdDAyNzc5NDI3ODY2Al8xBAZpZEJTdHIIBQ0kdDAyNzc5NDI3ODY2Al8yBARiYWxBCAUNJHQwMjc3OTQyNzg2NgJfMwQEYmFsQggFDSR0MDI3Nzk0Mjc4NjYCXzQEB3NoYXJlSWQIBQ0kdDAyNzc5NDI3ODY2Al81BA0kdDAyNzg2OTI3OTM2CQCUCgIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQVN0cgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRCU3RyBANpZEEIBQ0kdDAyNzg2OTI3OTM2Al8xBANpZEIIBQ0kdDAyNzg2OTI3OTM2Al8yBAtzdG9wTG9zc0ZlZQkBD2NhbGNTdG9wTG9zc0ZlZQQFBHBvb2wFCmlzQm9ycm93ZWQFCHN0b3BMb3NzBQ91c2VyQ2FuV2l0aGRyYXcEC2NCYWxBQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MBANpbnYJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAULc3RvcExvc3NGZWUDCQAAAgUDaW52BQNpbnYJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAgh3aXRoZHJhdwkAzAgCCQDMCAIJAKQDAQUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAkAZAIFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUDCQAAAgUDaW52BQNpbnYJAPwHBAUIcG9vbEFkZHICA2dldAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQADCQAAAgUDaW52BQNpbnYECmNCYWxBQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQpjQmFsQUFmdGVyBQpjQmFsQUFmdGVyBApjQmFsQkFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUKY0JhbEJBZnRlcgUKY0JhbEJBZnRlcgQNJHQwMjg2MzEyODcyMAkAlAoCCQBlAgUKY0JhbEFBZnRlcgULY0JhbEFCZWZvcmUJAGUCBQpjQmFsQkFmdGVyBQtjQmFsQkJlZm9yZQQNdG9rZW5zQW1vdW50QQgFDSR0MDI4NjMxMjg3MjACXzEEDXRva2Vuc0Ftb3VudEIIBQ0kdDAyODYzMTI4NzIwAl8yBA0kdDAyODcyMzI5OTU5AwUKaXNCb3Jyb3dlZAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkCQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUEZGVidAUEZGVidAQNYW1vdW50VG9HZXRFeAMDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFBmlkQlN0cgkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEIHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QgAABAVleEludgMJAGYCBQ1hbW91bnRUb0dldEV4AAAJARBleGNoYW5nZURpcmVjdGx5CAUFcFR5cGUFBHBvb2wFBmlkQVN0cgUGaWRCU3RyCQBlAgUEYmFsQQUNdG9rZW5zQW1vdW50QQkAZQIFBGJhbEIFDXRva2Vuc0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0BQNuaWwDCQAAAgUFZXhJbnYFBWV4SW52BA9jQmFsQUFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQ9jQmFsQUFmdGVyUmVwYXkFD2NCYWxBQWZ0ZXJSZXBheQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUPY0JhbEJBZnRlclJlcGF5BQ9jQmFsQkFmdGVyUmVwYXkEC2Nsb3NlRGJ0SW52AwkAZgIFBGRlYnQAAAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAghyZXBheUZvcgkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQULYm9ycm93QXNzZXQFBGRlYnQFA25pbAAAAwkAAAIFC2Nsb3NlRGJ0SW52BQtjbG9zZURidEludgMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQCUCgIJAGUCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQUEZGVidAkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUJAJQKAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUJAGUCCQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQUEZGVidAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQ10b2tlbnNBbW91bnRBBQ10b2tlbnNBbW91bnRCBAd0b1VzZXJBCAUNJHQwMjg3MjMyOTk1OQJfMQQHdG9Vc2VyQggFDSR0MDI4NzIzMjk5NTkCXzIEFHBvb2xUb3RhbExvYW5FbnRyaWVzAwUKaXNCb3Jyb3dlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZQIJAGUCBRJwb29sVG90YWxTaGFyZUxvYW4FD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUFA25pbAUDbmlsBAdlbnRyaWVzCQDOCAIJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyUG9zaXRpb25Qb29sCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgUHdG9Vc2VyQQUDaWRBCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJCBQNpZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3N0b3BMb3NzRmVlCQDZBAEFB3NoYXJlSWQFA25pbAUUcG9vbFRvdGFsTG9hbkVudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFBmlkQVN0cgUGaWRCU3RyBQdzaGFyZUlkBQNuaWwJAJQKAgUHZW50cmllcwkAzAgCBQd0b1VzZXJBCQDMCAIFB3RvVXNlckIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMcGFyc2VSZXF1ZXN0AQlyZXF1ZXN0SWQEB3JlcXVlc3QJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkCQCsAgICE05vIHJlcXVlc3Qgd2l0aCBpZCAFCXJlcXVlc3RJZAIBLAQEdXNlcgkAkQMCBQdyZXF1ZXN0AAAEBHBvb2wJAJEDAgUHcmVxdWVzdAABBARwbXRBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAACBANBSWQJAJEDAgUHcmVxdWVzdAADBARwbXRCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAEBANCSWQJAJEDAgUHcmVxdWVzdAAFBARiYWxBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAGBARiYWxCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAHBAdzaGFyZUlkCQCRAwIFB3JlcXVlc3QACAQHYndBc3NldAkAkQMCBQdyZXF1ZXN0AAkECGJ3QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAKCQCdCgsFBHVzZXIFBHBvb2wFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQdid0Fzc2V0BQhid0Ftb3VudAEQY2FsY0JvcnJvd0Ftb3VudAYEcG10QQRwbXRCA2FJZANiSWQIbGV2ZXJhZ2UIYm9ycm93SWQDAwkBAiE9AgUIYm9ycm93SWQFA2FJZAkBAiE9AgUIYm9ycm93SWQFA2JJZAcJAAIBAhJXcm9uZyBib3Jyb3cgYXNzZXQEB2RQcmljZUEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNhSWQFDmtQcmljZUluT3JhY2xlBAdkUHJpY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYklkBQ5rUHJpY2VJbk9yYWNsZQQGZGVjUHJBCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQGZGVjUHJCCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQMcGF5ZEluRG9sbGFyCQBkAgkAawMFB2RQcmljZUEFBHBtdEEFBmRlY1ByQQkAawMFB2RQcmljZUIFBHBtdEIFBmRlY1ByQgQNJHQwMzE5NDEzMjAzOAMJAAACBQhib3Jyb3dJZAUDYUlkCQCUCgIFB2RQcmljZUEFBmRlY1ByQQkAlAoCBQdkUHJpY2VCBQZkZWNQckIEC2JvcnJvd1ByaWNlCAUNJHQwMzE5NDEzMjAzOAJfMQQLYm9ycm93RGVjUHIIBQ0kdDAzMTk0MTMyMDM4Al8yCQBrAwkAawMFDHBheWRJbkRvbGxhcgkAZQIFCGxldmVyYWdlAGQAZAULYm9ycm93RGVjUHIFC2JvcnJvd1ByaWNlARJwYXJzZVJlcGxlbmlzaFBtdHMDBHBtdHMDQUlkA0JJZAMJAAACCQCQAwEFBHBtdHMAAgMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBBAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAQdhc3NldElkBQNCSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEIJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAgJAJEDAgUEcG10cwABBmFtb3VudAMJAAACCQCQAwEFBHBtdHMAAQMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50AAADCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNCSWQJAJQKAgAACAkAkQMCBQRwbXRzAAAGYW1vdW50CQACAQINV3JvbmcgcGF5bWVudAkAAgECHE9uZSBvciB0d28gcGF5bWVudHMgZXhwZWN0ZWQBD2NhbGNQcmljZUltcGFjdAQEYmFsQQRiYWxCB25ld0JhbEEHbmV3QmFsQgQDcHJpCQBoAgkAZQIFBlNDQUxFOAkAawMJAGsDBQRiYWxCBQZTQ0FMRTgFBGJhbEEFBlNDQUxFOAkAawMFB25ld0JhbEIFBlNDQUxFOAUHbmV3QmFsQQBkAwkAZgIAAAUDcHJpCQBoAgUDcHJpAP///////////wEFA3ByaQERY2xhaW1BbmRDaGVja0FtbnQFBHBvb2wFcFR5cGUFY2xhaW0GYW1vdW50BmNoYW5nZQQNJHQwMzMwMzgzMzMwMAMFBWNsYWltCQELY2xhaW1GYXJtZWQCBQVwVHlwZQUEcG9vbAQMY2xhaW1lZEFzc2V0AwkAAAIFBXBUeXBlBQdTRl9QT09MBQZTV09QSUQDCQAAAgUFcFR5cGUFB1dYX1BPT0wFBFdYSUQJAQ91bmtub3duUG9vbFR5cGUACQCUCgIFBmFtb3VudAUMY2xhaW1lZEFzc2V0AwkAAAIFDSR0MDMzMDM4MzMzMDAFDSR0MDMzMDM4MzMzMDAECmNsYWltQXNzZXQIBQ0kdDAzMzAzODMzMzAwAl8yBAtjbGFpbUFtb3VudAgFDSR0MDMzMDM4MzMzMDACXzEEA2JhbAkBDmFjY291bnRCYWxhbmNlAQUKY2xhaW1Bc3NldAMJAAACBQNiYWwFA2JhbAMJAGYCBQZhbW91bnQFA2JhbAkAAgECGVRvIGJpZyBhbW91bnQgdG8gZXhjaGFuZ2UJAJQKAgULY2xhaW1BbW91bnQFCmNsYWltQXNzZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4bAWkBE2dldFBvb2xJbmZvUkVBRE9OTFkBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMzM2NjczMzc1NwkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAzMzY2NzMzNzU3Al8xBANCSWQIBQ0kdDAzMzY2NzMzNzU3Al8yBARiYWxBCAUNJHQwMzM2NjczMzc1NwJfMwQEYmFsQggFDSR0MDMzNjY3MzM3NTcCXzQEB3NoYXJlSWQIBQ0kdDAzMzY2NzMzNzU3Al81BAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkCQCUCgIFA25pbAkAmAoGBQNBSWQFA0JJZAUHc2hhcmVJZAUEYmFsQQUEYmFsQgULc2hhcmVTdXBwbHkBaQEaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkBB3NoYXJlSWQEC3NoYXJlUHJpY2VzCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQJAJQKAgUDbmlsBQtzaGFyZVByaWNlcwFpASJnZXRVc2VyUG9zaXRpb25TaGFyZUFtb3VudFJFQURPTkxZAgR1c2VyBnBvc051bQQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBnBvc051bQURa1VzZXJQb3NpdGlvblBvb2wCEFVua25vd24gcG9zaXRpb24EDGJvcnJvd0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBnBvc051bQURa1VzZXJCb3Jyb3dBbW91bnQED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBnBvc051bQkAZgIFDGJvcnJvd0Ftb3VudAAACQCUCgIFA25pbAUPdXNlckNhbldpdGhkcmF3AWkBF2dldFVzZXJQb3NpdGlvblJFQURPTkxZAwR1c2VyBXBvb2xzBnBvc051bQoBB3VzZXJQb3MCAWEEcG9vbAQNJHQwMzQ2MzAzNDcwMAUBYQQJd0Ftb3VudHNBCAUNJHQwMzQ2MzAzNDcwMAJfMQQJd0Ftb3VudHNCCAUNJHQwMzQ2MzAzNDcwMAJfMgQFZGVidHMIBQ0kdDAzNDYzMDM0NzAwAl8zBAtlcVdBbW91bnRzQQgFDSR0MDM0NjMwMzQ3MDACXzQEC2VxV0Ftb3VudHNCCAUNJHQwMzQ2MzAzNDcwMAJfNQQFaW5kZXgIBQ0kdDAzNDYzMDM0NzAwAl82AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BQ1rVXNlclBvc2l0aW9uCQCYCgYJAM0IAgUJd0Ftb3VudHNBAAAJAM0IAgUJd0Ftb3VudHNCAAAJAM0IAgUFZGVidHMAAAkAzQgCBQtlcVdBbW91bnRzQQAACQDNCAIFC2VxV0Ftb3VudHNCAAAJAGQCBQVpbmRleAABBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMzQ5NzkzNTA2OQkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAzNDk3OTM1MDY5Al8xBANCSWQIBQ0kdDAzNDk3OTM1MDY5Al8yBARiYWxBCAUNJHQwMzQ5NzkzNTA2OQJfMwQEYmFsQggFDSR0MDM0OTc5MzUwNjkCXzQEB3NoYXJlSWQIBQ0kdDAzNDk3OTM1MDY5Al81BAxib3Jyb3dBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAURa1VzZXJCb3Jyb3dBbW91bnQAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAkAkQMCBQZwb3NOdW0FBWluZGV4CQBmAgUMYm9ycm93QW1vdW50AAAEDSR0MDM1Mjg1MzU0MDUJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BAh3QW1vdW50QQgFDSR0MDM1Mjg1MzU0MDUCXzEECHdBbW91bnRCCAUNJHQwMzUyODUzNTQwNQJfMgMJAGYCBQxib3Jyb3dBbW91bnQAAAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEmtVc2VyQm9ycm93QXNzZXRJZAQEZGVidAoAAUAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIMZ2V0QXNzZXREZWJ0CQDMCAIHCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQBmAgUEZGVidAUId0Ftb3VudEEHCQBlAgUEZGVidAUId0Ftb3VudEEDAwkAAAIFC2JvcnJvd0Fzc2V0BQNCSWQJAGYCBQRkZWJ0BQh3QW1vdW50QgcJAGUCBQRkZWJ0BQh3QW1vdW50QgAABAthbW91bnRUb1BheQMJAGYCBQ1hbW91bnRUb0dldEV4AAADCQAAAgUFcFR5cGUFB1NGX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5U0YHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlXWAcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yCQEPdW5rbm93blBvb2xUeXBlAAAABA0kdDAzNjMxNzM2NTM2AwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAJQKAgkAZQIJAGQCBQh3QW1vdW50QQUNYW1vdW50VG9HZXRFeAUEZGVidAkAZQIFCHdBbW91bnRCBQthbW91bnRUb1BheQkAlAoCCQBlAgUId0Ftb3VudEEFC2Ftb3VudFRvUGF5CQBlAgkAZAIFCHdBbW91bnRCBQ1hbW91bnRUb0dldEV4BQRkZWJ0BAplcVdBbW91bnRBCAUNJHQwMzYzMTczNjUzNgJfMQQKZXFXQW1vdW50QggFDSR0MDM2MzE3MzY1MzYCXzIJAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAM0IAgUFZGVidHMFBGRlYnQJAM0IAgULZXFXQW1vdW50c0EFCmVxV0Ftb3VudEEJAM0IAgULZXFXQW1vdW50c0IFCmVxV0Ftb3VudEIJAGQCBQVpbmRleAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCBQVkZWJ0cwkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAGQCBQVpbmRleAABBA0kdDAzNjc5MTM2OTAyCgACJGwFBXBvb2xzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAmAoGBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQd1c2VyUG9zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQECXdBbW91bnRzQQgFDSR0MDM2NzkxMzY5MDICXzEECXdBbW91bnRzQggFDSR0MDM2NzkxMzY5MDICXzIEBWRlYnRzCAUNJHQwMzY3OTEzNjkwMgJfMwQLZXFXQW1vdW50c0EIBQ0kdDAzNjc5MTM2OTAyAl80BAtlcVdBbW91bnRzQggFDSR0MDM2NzkxMzY5MDICXzUJAJQKAgUDbmlsCQCXCgUFCXdBbW91bnRzQQUJd0Ftb3VudHNCBQVkZWJ0cwULZXFXQW1vdW50c0EFC2VxV0Ftb3VudHNCAWkBCXJlcGxlbmlzaAMEcG9vbAhsZXZlcmFnZQhib3Jyb3dJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwMJAGYCAGQFCGxldmVyYWdlBgkAZgIFCGxldmVyYWdlAKwCCQACAQIfTGV2ZXJhZ2UgY2FuJ3QgYmUgPDEwMCBhbmQgPjMwMAMDCQEBIQEJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYW5Cb3Jyb3cJAGYCBQhsZXZlcmFnZQBkBwkAAgECHVlvdSBjYW4ndCBib3Jyb3cgaW4gdGhpcyBwb29sBA0kdDAzNzUwMDM3NTkwCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM3NTAwMzc1OTACXzEEA0JJZAgFDSR0MDM3NTAwMzc1OTACXzIEBGJhbEEIBQ0kdDAzNzUwMDM3NTkwAl8zBARiYWxCCAUNJHQwMzc1MDAzNzU5MAJfNAQHc2hhcmVJZAgFDSR0MDM3NTAwMzc1OTACXzUDAwkBAiE9AgUIYm9ycm93SWQFA0FJZAkBAiE9AgUIYm9ycm93SWQFA0JJZAcJAAIBAhJXcm9uZyBib3Jyb3cgYXNzZXQEDSR0MDM3NjcxMzc3MzAJARJwYXJzZVJlcGxlbmlzaFBtdHMDCAUBaQhwYXltZW50cwUDQUlkBQNCSWQEBHBtdEEIBQ0kdDAzNzY3MTM3NzMwAl8xBARwbXRCCAUNJHQwMzc2NzEzNzczMAJfMgQEdXNlcgkApQgBCAUBaQZjYWxsZXIECW5ld1Bvc051bQkBGGdldE5ld1VzZXJQb3NpdGlvbk51bWJlcgEFBHVzZXIDCQBmAgUIbGV2ZXJhZ2UAZAQMYm9ycm93QW1vdW50CQEQY2FsY0JvcnJvd0Ftb3VudAYFBHBtdEEFBHBtdEIFA0FJZAUDQklkBQhsZXZlcmFnZQUIYm9ycm93SWQEB3JlcXVlc3QJALkJAgkAzAgCBQR1c2VyCQDMCAIFBHBvb2wJAMwIAgkApAMBBQRwbXRBCQDMCAIFA0FJZAkAzAgCCQCkAwEFBHBtdEIJAMwIAgUDQklkCQDMCAIJAKQDAQUEYmFsQQkAzAgCCQCkAwEFBGJhbEIJAMwIAgUHc2hhcmVJZAkAzAgCBQhib3Jyb3dJZAkAzAgCCQCkAwEFDGJvcnJvd0Ftb3VudAUDbmlsAgEsBAxuZXdSZXF1ZXN0SWQKAAFACQD8BwQFBHRoaXMCEGNyZWF0ZU5ld1JlcXVlc3QJAMwIAgUHcmVxdWVzdAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDG5ld1JlcXVlc3RJZAUMbmV3UmVxdWVzdElkBARhcmdzCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIFDGJvcnJvd0Ftb3VudAkAzAgCCQClCAEFBHRoaXMJAMwIAgIRcmVwbGVuaXNoRnJvbUxhbmQJAMwIAgkApAMBCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDG5ld1JlcXVlc3RJZAIYQ2FuJ3QgY3JlYXRlIG5ldyByZXF1ZXN0BQNuaWwEA2ludgkA/QcECQEOZ2V0TGVuZFNydkFkZHIAAg1mbGFzaFBvc2l0aW9uBQRhcmdzBQNuaWwDCQAAAgUDaW52BQNpbnYECnVzZXJTdGFrZWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQUNa1VzZXJQb3NpdGlvbgQNJHQwMzg3MTkzODgxMwkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwMzg3MTkzODgxMwUNJHQwMzg3MTkzODgxMwQHbmV3QmFsQggFDSR0MDM4NzE5Mzg4MTMCXzIEB25ld0JhbEEIBQ0kdDAzODcxOTM4ODEzAl8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDM4ODgzMzg5OTgJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDAzODg4MzM4OTk4Al8xBAh3QW1vdW50QggFDSR0MDM4ODgzMzg5OTgCXzIJAJQKAgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDM5MDUxMzkxNjYJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAULTk9fTE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkAwkAAAIFDSR0MDM5MDUxMzkxNjYFDSR0MDM5MDUxMzkxNjYEB2F4bHlGZWUIBQ0kdDAzOTA1MTM5MTY2Al8yBAp1c2VyU3Rha2VkCAUNJHQwMzkwNTEzOTE2NgJfMQQNJHQwMzkxNzIzOTI2NgkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwMzkxNzIzOTI2NgUNJHQwMzkxNzIzOTI2NgQHbmV3QmFsQggFDSR0MDM5MTcyMzkyNjYCXzIEB25ld0JhbEEIBQ0kdDAzOTE3MjM5MjY2Al8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDM5MzM2Mzk0NTEJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDAzOTMzNjM5NDUxAl8xBAh3QW1vdW50QggFDSR0MDM5MzM2Mzk0NTECXzIJAJQKAgkAzggCCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFCW5ld1Bvc051bQUHc2hhcmVJZAUFcFR5cGUHCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AgRwb29sBXBvc0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgQJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwFpARRjcmVhdGVVcGRhdGVTdG9wTG9zcwQFcG9zSWQGcG9vbElkB2Fzc2V0SWQFcHJpY2UJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBnBvb2xJZAIBXwkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAAIBAhpUaGVyZSBhcmUgbm8gdXNlciBwb3NpdGlvbgMJAGcCAAAFBXByaWNlCQACAQIcUHJpY2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCBQVwcmljZQUQdG9rZW5PcmFjbGVQcmljZQkAAgECK1ByaWNlIG11c3QgYmUgbGVzcyB0aGFuIGN1cnJlbnQgdG9rZW4gcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUFcHJpY2UFA25pbAFpAQ5kZWxldGVTdG9wTG9zcwMFcG9zSWQGcG9vbElkB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwkAAgECCE5vIGVudHJ5CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUDbmlsAWkBBGluaXQNDG1vbmV5Qm94QWRkcg1zZkZhcm1pbmdBZGRyCGxlbmRBZGRyD3ByaWNlT3JhY2xlQWRkchBrZWVwZXJFeENvbnRyYWN0Dnd4U3dhcENvbnRyYWN0C3N3b3BBc3NldElkCXd4QXNzZXRJZA5vcGVyYXRvclB1YktleRJncm91cDFBZG1pbjFQdWJLZXkSZ3JvdXAxQWRtaW4yUHViS2V5Emdyb3VwMkFkbWluMVB1YktleRJncm91cDJBZG1pbjJQdWJLZXkJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQlpc0RlZmluZWQBCQCiCAEFD2tPcGVyYXRvckNhbGxQSwkAAgECDkFscmVhZHkgaW5pdGVkAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQxtb25leUJveEFkZHIJAAIBAiNtb25leUJveEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUNc2ZGYXJtaW5nQWRkcgkAAgECJHNmRmFybWluZ0FkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUIbGVuZEFkZHIJAAIBAh9sZW5kQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ9wcmljZU9yYWNsZUFkZHIJAAIBAiZwcmljZU9yYWNsZUFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUQa2VlcGVyRXhDb250cmFjdAkAAgECJ2tlZXBlckV4Q29udHJhY3QgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQtzd29wQXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFCXd4QXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBAiE9AgkAyAEBCQDZBAEFDm9wZXJhdG9yUHViS2V5ACAJAAIBAh1vcGVyYXRvclB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAkAzAgCCQELU3RyaW5nRW50cnkCBQlrTW9uZXlCb3gFDG1vbmV5Qm94QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ5rU0ZGYXJtaW5nQWRkcgUNc2ZGYXJtaW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrTGVuZFNlcnZpY2UFCGxlbmRBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtQcmljZU9yYWNsZQUPcHJpY2VPcmFjbGVBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2tFeENvbnRyYWN0BRBrZWVwZXJFeENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tXeFN3YXBDb250cmFjdAUOd3hTd2FwQ29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1N3b3BJZAULc3dvcEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUFa1d4SWQFCXd4QXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rT3BlcmF0b3JDYWxsUEsFDm9wZXJhdG9yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjFQSwUSZ3JvdXAxQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjJQSwUSZ3JvdXAxQWRtaW4yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjFQSwUSZ3JvdXAyQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjJQSwUSZ3JvdXAyQWRtaW4yUHViS2V5BQNuaWwBaQEQY3JlYXRlTmV3UmVxdWVzdAEGcGFyYW1zCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkEDG5ld1JlcXVlc3RJZAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUMa1JlcXVlc3RJdGVyAAAAAQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkApAMBBQxuZXdSZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFBnBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1JlcXVlc3RJdGVyBQxuZXdSZXF1ZXN0SWQFA25pbAUMbmV3UmVxdWVzdElkAWkBEXJlcGxlbmlzaEZyb21MYW5kAQlyZXF1ZXN0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQQNJHQwNDQyOTA0NDM5NAkBDHBhcnNlUmVxdWVzdAEFCXJlcXVlc3RJZAQEdXNlcggFDSR0MDQ0MjkwNDQzOTQCXzEEBHBvb2wIBQ0kdDA0NDI5MDQ0Mzk0Al8yBARwbXRBCAUNJHQwNDQyOTA0NDM5NAJfMwQDQUlkCAUNJHQwNDQyOTA0NDM5NAJfNAQEcG10QggFDSR0MDQ0MjkwNDQzOTQCXzUEA0JJZAgFDSR0MDQ0MjkwNDQzOTQCXzYEBGJhbEEIBQ0kdDA0NDI5MDQ0Mzk0Al83BARiYWxCCAUNJHQwNDQyOTA0NDM5NAJfOAQHc2hhcmVJZAgFDSR0MDQ0MjkwNDQzOTQCXzkEB2J3QXNzZXQIBQ0kdDA0NDI5MDQ0Mzk0A18xMAQIYndBbW91bnQIBQ0kdDA0NDI5MDQ0Mzk0A18xMQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECEldyb25nIHBheW1lbnQgc2l6ZQMDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdid0Fzc2V0BgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFCGJ3QW1vdW50CQACAQINV3JvbmcgcGF5bWVudAQNJHQwNDQ1ODQ0NDY4NAMJAAACBQNBSWQFB2J3QXNzZXQJAJQKAgkAZAIFBHBtdEEFCGJ3QW1vdW50BQRwbXRCCQCUCgIFBHBtdEEJAGQCBQRwbXRCBQhid0Ftb3VudAQHcG10QWxsQQgFDSR0MDQ0NTg0NDQ2ODQCXzEEB3BtdEFsbEIIBQ0kdDA0NDU4NDQ0Njg0Al8yBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNDQ3NjY0NDg4MQkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQhMT0FOX0ZFRQUHcG10QWxsQQUDQUlkBQdwbXRBbGxCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQECnVzZXJTdGFrZWQIBQ0kdDA0NDc2NjQ0ODgxAl8xBAdheGx5RmVlCAUNJHQwNDQ3NjY0NDg4MQJfMgQGcG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgQNYm9ycm93RW50cmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAUIYndBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRJrVXNlckJvcnJvd0Fzc2V0SWQFB2J3QXNzZXQFA25pbAQHZW50cmllcwkBEHJlcGxlbmlzaEVudHJpZXMIBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQZwb3NOdW0FB3NoYXJlSWQFBXBUeXBlBgQNJHQwNDUyNDE0NTM1NgkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDQ1MjQxNDUzNTYCXzEECHdBbW91bnRCCAUNJHQwNDUyNDE0NTM1NgJfMgkAlAoCCQDNCAIJAM4IAgkAzggCBQdlbnRyaWVzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAUNYm9ycm93RW50cmllcwkBC0RlbGV0ZUVudHJ5AQkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFCnVzZXJTdGFrZWQBaQEJbGlxdWlkYXRlAwR1c2VyBXBvc0lkD2xpcXVpZGF0ZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyUG9zaXRpb25Qb29sAgtubyBwb3NpdGlvbgQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDQ1ODc3NDU5NjcJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNDU4Nzc0NTk2NwJfMQQDQklkCAUNJHQwNDU4Nzc0NTk2NwJfMgQEYmFsQQgFDSR0MDQ1ODc3NDU5NjcCXzMEBGJhbEIIBQ0kdDA0NTg3NzQ1OTY3Al80BAdzaGFyZUlkCAUNJHQwNDU4Nzc0NTk2NwJfNQQGYW1vdW50CQEJdW5zdGFrZUxQBAUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD2xpcXVpZGF0ZUFtb3VudAQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50BAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBXBvc0lkCQBmAgUMYm9ycm93QW1vdW50AAADCQBmAgUPbGlxdWlkYXRlQW1vdW50BQ91c2VyQ2FuV2l0aGRyYXcJAAIBAidZb3UgY2FuJ3QgbGlxdWlkYXRlIG1vcmUgdGhhbiB1c2VyIGhhdmUDCQAAAgUMYm9ycm93QW1vdW50AAAJAAIBAitZb3UgY2FuJ3QgbGlxdWlkYXRlIHBvc2l0aW9uIHdpdGhvdXQgYm9ycm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZQIJARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAZQIFD3VzZXJDYW5XaXRoZHJhdwUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAFpAQhzdG9wTG9zcwQEdXNlcgVwb3NJZARwb29sB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQNc3RvcExvc3NQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwIITm8gZW50cnkDCQBmAgUQdG9rZW5PcmFjbGVQcmljZQUNc3RvcExvc3NQcmljZQkAAgECI1Rva2VuIHByaWNlIGdyZWF0ZXIgc3RvcCBsb3NzIHByaWNlBANyZXMJAQ53aXRoZHJhd1RvVXNlcgQFBHVzZXIFBHBvb2wJAKQDAQUFcG9zSWQGCQCUCgIJAM0IAggFA3JlcwJfMQkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCAUDcmVzAl8yAWkBDGNhcGl0YWxpemVFeAUEcG9vbAVyb3V0ZQl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEBmNoYW5nZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlAAAEDSR0MDQ3OTM3NDgwMzkJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQUQYW1vdW50VG9FeGNoYW5nZQUGY2hhbmdlAwkAAAIFDSR0MDQ3OTM3NDgwMzkFDSR0MDQ3OTM3NDgwMzkEDGNsYWltZWRBc3NldAgFDSR0MDQ3OTM3NDgwMzkCXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA0NzkzNzQ4MDM5Al8xBAVyQXJncwkAtQkCBQVyb3V0ZQICX18ED2V4Y2hhbmdlZEFtb3VudAMJAAACCQCRAwIFBXJBcmdzAAACEGRpcmVjdFN3b3BmaUNQTU0JARBkaXJlY3RTd29wZmlDUE1NAgUFckFyZ3MFCXRva2VuVG9JZAMJAAACCQCRAwIFBXJBcmdzAAACDXJvdXRpbmdTd29wZmkJARNkaXJlY3RSb3V0aW5nU3dvcGZpAgUFckFyZ3MFCXRva2VuVG9JZAkAAgECC1dyb25nIHJvdXRlAwkAAAIFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50BAluZXdDaGFuZ2UJAGUCCQBkAgUNY2xhaW1lZEFtb3VudAUGY2hhbmdlBRBhbW91bnRUb0V4Y2hhbmdlBAtjaGFuZ2VFbnRyeQMJAGcCBQluZXdDaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQUJbmV3Q2hhbmdlBQNuaWwFA25pbAkAzggCCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBXBUeXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAULY2hhbmdlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY2FwaXRhbGl6ZU5vRXgDBHBvb2wFY2xhaW0RYW1vdW50RnJvbUJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBA0kdDA0ODcyMzQ4ODIxCQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0FEWFtb3VudEZyb21CYWxhbmNlAAADCQAAAgUNJHQwNDg3MjM0ODgyMQUNJHQwNDg3MjM0ODgyMQQMY2xhaW1lZEFzc2V0CAUNJHQwNDg3MjM0ODgyMQJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDQ4NzIzNDg4MjECXzEJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUJAQxhc3NldElkVG9TdHIBBQxjbGFpbWVkQXNzZXQJAGQCBQ1jbGFpbWVkQW1vdW50BRFhbW91bnRGcm9tQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtpbml0TmV3UG9vbAoEdHlwZQhwb29sVHlwZQhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JY2FuQm9ycm93CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwMJAQIhPQIFBHR5cGUFB1NGX1BPT0wJAQIhPQIFBHR5cGUFB1dYX1BPT0wHCQACAQIKV3JvbmcgdHlwZQMDCQECIT0CBQhwb29sVHlwZQUEQ1BNTQkBAiE9AgUIcG9vbFR5cGUFBEZMQVQHCQACAQIPV3JvbmcgcG9vbCB0eXBlBA0kdDA0OTM0MjQ5NDM2CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUIcG9vbEFkZHIFBHR5cGUEA2FJZAgFDSR0MDQ5MzQyNDk0MzYCXzEEA2JJZAgFDSR0MDQ5MzQyNDk0MzYCXzIEBGFCYWwIBQ0kdDA0OTM0MjQ5NDM2Al8zBARiQmFsCAUNJHQwNDkzNDI0OTQzNgJfNAQHc2hhcmVJZAgFDSR0MDQ5MzQyNDk0MzYCXzUDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtQb29sSW50ZXJlc3RMb2FuAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBWtQb29sBQhwb29sQWRkcgUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHBvb2xBZGRyBQlrUG9vbFR5cGUFCHBvb2xUeXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAUIcG9vbEFkZHIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUIcG9vbEFkZHIFDmtQb29sQ2FuQm9ycm93BQljYW5Cb3Jyb3cFA25pbAFpAQ51cGRhdGVQb29sRmVlcwcIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbhFzdG9wbG9zc0ZlZU5vTG9hbhNzdG9wbG9zc0ZlZVdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQhwb29sQWRkcgkAAgEJAKwCAgIaQ2FuJ3QgZmluZCBwb29sIHdpdGggYWRkciAFCHBvb2xBZGRyAwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuBQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECE2RBcHAgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGBQNuaWwBaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQIVZEFwcCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwUDbmlsAWkBEGFjdGl2YXRlRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIdZEFwcCBhbHJlYWR5IGFjdGl2ZSBmb3IgdXNlcnMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtBY3RpdmVVc2VycwYFA25pbAFpARBzaHV0ZG93bkZvclVzZXJzAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGCQACAQIfZEFwcCBhbHJlYWR5IHNodXRkb3duIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBwUDbmlsAWkBCmFjdGl2YXRlU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECFVNXT1BGSSBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdTRl9QT09MBQtrQWN0aXZlU0ZXWAYFA25pbAFpAQpzaHV0ZG93blNGAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECF1NXT1BGSSBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBCmFjdGl2YXRlV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgkAAgECEVdYIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duV1gACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQITV1ggYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAcFA25pbAFpAQxhY3RpdmF0ZVBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGCQACAQITUG9vbCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYFA25pbAFpAQxzaHV0ZG93blBvb2wBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wJAAIBAgxVbmtub3duIHBvb2wDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhVQb29sIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUHBQNuaWwAG1VqsA==", "height": 2803901, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CUiARNrn5WceECGMy34NycbZ3AfeBxHLYWXWzM8bYR5u Next: 4M2PVDWnzvVtmNfFftF8nMZfRvKBHCoeedabQqmhBELP Diff:
OldNewDifferences
8484 let kRequestIter = "requests_iter"
8585
8686 let kPool = "pool_"
87+
88+let kPoolType = "_poolType"
8789
8890 let kSharePool = "_poolShareId"
8991
238240
239241
240242 func getSFPoolData (poolAddr) = {
241- let $t080238072 = getSFPoolBalances(poolAddr)
242- if (($t080238072 == $t080238072))
243+ let $t080898138 = getSFPoolBalances(poolAddr)
244+ if (($t080898138 == $t080898138))
243245 then {
244- let balB = $t080238072._2
245- let balA = $t080238072._1
246+ let balB = $t080898138._2
247+ let balA = $t080898138._1
246248 $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"))
247249 }
248250 else throw("Strict value is not equal to itself.")
276278 then @
277279 else unit
278280 }, "Can't get pool LP asset id")
279- let $t087698828 = getWXPoolBalances(poolAddr, aId, bId)
280- if (($t087698828 == $t087698828))
281+ let $t088358894 = getWXPoolBalances(poolAddr, aId, bId)
282+ if (($t088358894 == $t088358894))
281283 then {
282- let balB = $t087698828._2
283- let balA = $t087698828._1
284+ let balB = $t088358894._2
285+ let balA = $t088358894._1
284286 $Tuple5(aId, bId, balA, balB, shareId)
285287 }
286288 else throw("Strict value is not equal to itself.")
388390 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
389391 let poolAddr = Address(fromBase58String(pool))
390392 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
391- let $t01181711882 = getPoolData(poolAddr, pType)
392- let aId = $t01181711882._1
393- let bId = $t01181711882._2
394- let aBalance = $t01181711882._3
395- let bBalance = $t01181711882._4
393+ let $t01188311948 = getPoolData(poolAddr, pType)
394+ let aId = $t01188311948._1
395+ let bId = $t01188311948._2
396+ let aBalance = $t01188311948._3
397+ let bBalance = $t01188311948._4
396398 let prices = getAssetsPrice([aId, bId])
397399 let dPriceA = prices[0]
398400 let dPriceB = prices[1]
471473 }
472474 else if ((pType == WX_POOL))
473475 then {
474- let $t01342613676 = $Tuple2(split({
476+ let $t01349213742 = $Tuple2(split({
475477 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
476478 if ($isInstanceOf(@, "String"))
477479 then @
482484 then @
483485 else throw(($getType(@) + " couldn't be cast to String"))
484486 }, "__"))
485- if (($t01342613676 == $t01342613676))
487+ if (($t01349213742 == $t01349213742))
486488 then {
487- let evalPutInB = $t01342613676._2
488- let evalPutInA = $t01342613676._1
489+ let evalPutInB = $t01349213742._2
490+ let evalPutInA = $t01349213742._1
489491 let lpInA = parseIntValue(evalPutInA[1])
490492 let lpInB = parseIntValue(evalPutInB[1])
491493 if ((lpInB > lpInA))
518520 if ((pType == SF_POOL))
519521 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
520522 else if ((pType == WX_POOL))
521- then invoke(poolAddr, "putOneTkn", [0, false], payments)
523+ then {
524+ let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
525+ then "putOneTknV2"
526+ else "putOneTkn"
527+ invoke(poolAddr, fc, [0, false], payments)
528+ }
522529 else unknownPoolType()
523530 }
524531
534541
535542
536543 func unstakeLP (pool,pType,shareId,amount) = {
537- let $t01533515685 = if ((pType == SF_POOL))
544+ let $t01552015870 = if ((pType == SF_POOL))
538545 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
539546 else if ((pType == WX_POOL))
540547 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
541548 else unknownPoolType()
542- let farmAddr = $t01533515685._1
543- let fName = $t01533515685._2
544- let params = $t01533515685._3
549+ let farmAddr = $t01552015870._1
550+ let fName = $t01552015870._2
551+ let params = $t01552015870._3
545552 let inv = invoke(farmAddr, fName, params, nil)
546553 if ((inv == inv))
547554 then amount
554561 let feeScale6 = 1000000
555562 let fee = getIntegerValue(poolAddr, kSFPoolFee)
556563 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
557- let $t01610716413 = if ((assetTokenToGet == assetIdA))
564+ let $t01629216598 = if ((assetTokenToGet == assetIdA))
558565 then {
559566 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
560567 $Tuple2(amountToPay, assetIdB)
563570 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
564571 $Tuple2(amountToPay, assetIdA)
565572 }
566- let amountToPay = $t01610716413._1
567- let assetToPay = $t01610716413._2
573+ let amountToPay = $t01629216598._1
574+ let assetToPay = $t01629216598._2
568575 $Tuple2(assetToPay, amountToPay)
569576 }
570577
584591
585592
586593 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
587- let $t01715317192 = getWXSwapFees(pool)
588- let pFee = $t01715317192._1
589- let prFee = $t01715317192._2
594+ let $t01733817377 = getWXSwapFees(pool)
595+ let pFee = $t01733817377._1
596+ let prFee = $t01733817377._2
590597 let feeScale = toBigInt(100000000)
591- let $t01723217540 = if ((assetTokenToGet == assetIdA))
598+ let $t01741717725 = if ((assetTokenToGet == assetIdA))
592599 then {
593600 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
594601 $Tuple2(amountToPay, assetIdB)
597604 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
598605 $Tuple2(amountToPay, assetIdA)
599606 }
600- let amountToPay = $t01723217540._1
601- let assetToPay = $t01723217540._2
607+ let amountToPay = $t01741717725._1
608+ let assetToPay = $t01741717725._2
602609 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
603610 $Tuple2(assetToPay, amountToPayWithFee)
604611 }
610617 then true
611618 else (poolFB != ""))
612619 then {
613- let $t01798118193 = if ((poolFB == ""))
620+ let $t01816618378 = if ((poolFB == ""))
614621 then $Tuple3(balA, balB, pool)
615622 else {
616- let $t01808718160 = getSFPoolBalances(addressFromStringValue(poolFB))
617- let sfBalA = $t01808718160._1
618- let sfBalB = $t01808718160._2
623+ let $t01827218345 = getSFPoolBalances(addressFromStringValue(poolFB))
624+ let sfBalA = $t01827218345._1
625+ let sfBalB = $t01827218345._2
619626 $Tuple3(sfBalA, sfBalB, poolFB)
620627 }
621- let pBalA = $t01798118193._1
622- let pBalB = $t01798118193._2
623- let exPool = $t01798118193._3
624- let $t01819818324 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
625- let assetToPay = $t01819818324._1
626- let amountToPay = $t01819818324._2
628+ let pBalA = $t01816618378._1
629+ let pBalB = $t01816618378._2
630+ let exPool = $t01816618378._3
631+ let $t01838318509 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
632+ let assetToPay = $t01838318509._1
633+ let amountToPay = $t01838318509._2
627634 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
628635 }
629636 else if ((pType == WX_POOL))
630637 then {
631- let $t01852618648 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
632- let assetToPay = $t01852618648._1
633- let amountToPay = $t01852618648._2
638+ let $t01871118833 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
639+ let assetToPay = $t01871118833._1
640+ let amountToPay = $t01871118833._2
634641 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
635642 }
636643 else unknownPoolType()
638645
639646
640647 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
641- let $t01893519399 = if ((pType == SF_POOL))
648+ let $t01912019584 = if ((pType == SF_POOL))
642649 then {
643650 let inv = {
644651 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
673680 else throw("Strict value is not equal to itself.")
674681 }
675682 else unknownPoolType()
676- let amountA = $t01893519399._1
677- let amountB = $t01893519399._2
683+ let amountA = $t01912019584._1
684+ let amountB = $t01912019584._2
678685 $Tuple2(amountA, amountB)
679686 }
680687
696703 }
697704 else if ((pType == WX_POOL))
698705 then {
699- let $t01976719846 = getWXPoolData(addressFromStringValue(pool))
700- let aId = $t01976719846._1
701- let bId = $t01976719846._2
702- let aBal = $t01976719846._3
703- let bBal = $t01976719846._4
704- let lpId = $t01976719846._5
706+ let $t01995220031 = getWXPoolData(addressFromStringValue(pool))
707+ let aId = $t01995220031._1
708+ let bId = $t01995220031._2
709+ let aBal = $t01995220031._3
710+ let bBal = $t01995220031._4
711+ let lpId = $t01995220031._5
705712 let balBefore = accountBalance(WXID)
706713 if ((balBefore == balBefore))
707714 then {
723730 if ((lpBalanceBefore == lpBalanceBefore))
724731 then {
725732 let poolAddr = addressFromStringValue(pool)
726- let $t02044420860 = if (if ((pmtA > 0))
733+ let $t02062921045 = if (if ((pmtA > 0))
727734 then (pmtB > 0)
728735 else false)
729736 then {
730- let $t02051020626 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
731- let pmtInA = $t02051020626._1
732- let pmtInB = $t02051020626._2
733- let change = $t02051020626._3
734- let changeId = $t02051020626._4
737+ let $t02069520811 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
738+ let pmtInA = $t02069520811._1
739+ let pmtInB = $t02069520811._2
740+ let change = $t02069520811._3
741+ let changeId = $t02069520811._4
735742 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
736743 if ((inv == inv))
737744 then $Tuple2(change, changeId)
742749 else if ((pmtB > 0))
743750 then $Tuple2(pmtB, bId)
744751 else throw("pmts must be > 0")
745- let change = $t02044420860._1
746- let changeId = $t02044420860._2
752+ let change = $t02062921045._1
753+ let changeId = $t02062921045._2
747754 let inv = if ((change > 0))
748755 then replenishOneTokenByType(poolAddr, pType, change, changeId)
749756 else nil
771778 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
772779 let totalAmount = getPoolTotalShare(pool)
773780 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
774- let $t02171721955 = if (withLoan)
781+ let $t02190222140 = if (withLoan)
775782 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
776783 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
777- let curPoolInterest = $t02171721955._1
778- let totalStakedWithLoan = $t02171721955._2
784+ let curPoolInterest = $t02190222140._1
785+ let totalStakedWithLoan = $t02190222140._2
779786 [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))]
780787 }
781788
856863
857864 func capitalize (pool,pType,tokenId,tokenAmount) = {
858865 let poolAddr = Address(fromBase58String(pool))
859- let $t02406224128 = getPoolData(poolAddr, pType)
860- let AId = $t02406224128._1
861- let BId = $t02406224128._2
862- let balA = $t02406224128._3
863- let balB = $t02406224128._4
864- let shareId = $t02406224128._5
866+ let $t02424724313 = getPoolData(poolAddr, pType)
867+ let AId = $t02424724313._1
868+ let BId = $t02424724313._2
869+ let balA = $t02424724313._3
870+ let balB = $t02424724313._4
871+ let shareId = $t02424724313._5
865872 if (if ((tokenId != AId))
866873 then (tokenId != BId)
867874 else false)
878885 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
879886 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
880887 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
881- let $t02487324973 = if ((tokenId == AId))
888+ let $t02505825158 = if ((tokenId == AId))
882889 then $Tuple2((tokenAmount - axlyFee), 0)
883890 else $Tuple2(0, (tokenAmount - axlyFee))
884- let pmtA = $t02487324973._1
885- let pmtB = $t02487324973._2
886- let $t02497625080 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
887- let stakedAmount = $t02497625080._1
888- let nf = $t02497625080._2
891+ let pmtA = $t02505825158._1
892+ let pmtB = $t02505825158._2
893+ let $t02516125265 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
894+ let stakedAmount = $t02516125265._1
895+ let nf = $t02516125265._2
889896 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
890897 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
891898 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
931938 let userAddr = Address(fromBase58String(user))
932939 let poolAddr = Address(fromBase58String(pool))
933940 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
934- let $t02760927681 = getPoolData(poolAddr, pType)
935- let idAStr = $t02760927681._1
936- let idBStr = $t02760927681._2
937- let balA = $t02760927681._3
938- let balB = $t02760927681._4
939- let shareId = $t02760927681._5
940- let $t02768427751 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
941- let idA = $t02768427751._1
942- let idB = $t02768427751._2
941+ let $t02779427866 = getPoolData(poolAddr, pType)
942+ let idAStr = $t02779427866._1
943+ let idBStr = $t02779427866._2
944+ let balA = $t02779427866._3
945+ let balB = $t02779427866._4
946+ let shareId = $t02779427866._5
947+ let $t02786927936 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
948+ let idA = $t02786927936._1
949+ let idB = $t02786927936._2
943950 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
944951 let cBalABefore = accountBalance(idA)
945952 if ((cBalABefore == cBalABefore))
970977 let cBalBAfter = accountBalance(idB)
971978 if ((cBalBAfter == cBalBAfter))
972979 then {
973- let $t02844628535 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
974- let tokensAmountA = $t02844628535._1
975- let tokensAmountB = $t02844628535._2
976- let $t02853829774 = if (isBorrowed)
980+ let $t02863128720 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
981+ let tokensAmountA = $t02863128720._1
982+ let tokensAmountB = $t02863128720._2
983+ let $t02872329959 = if (isBorrowed)
977984 then {
978985 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
979986 let debt = {
10221029 else throw("Strict value is not equal to itself.")
10231030 }
10241031 else $Tuple2(tokensAmountA, tokensAmountB)
1025- let toUserA = $t02853829774._1
1026- let toUserB = $t02853829774._2
1032+ let toUserA = $t02872329959._1
1033+ let toUserB = $t02872329959._2
10271034 let poolTotalLoanEntries = if (isBorrowed)
10281035 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10291036 else nil
10691076 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10701077 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10711078 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1072- let $t03175631853 = if ((borrowId == aId))
1079+ let $t03194132038 = if ((borrowId == aId))
10731080 then $Tuple2(dPriceA, decPrA)
10741081 else $Tuple2(dPriceB, decPrB)
1075- let borrowPrice = $t03175631853._1
1076- let borrowDecPr = $t03175631853._2
1082+ let borrowPrice = $t03194132038._1
1083+ let borrowDecPr = $t03194132038._2
10771084 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10781085 }
10791086
11021109
11031110
11041111 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1105- let $t03285333115 = if (claim)
1112+ let $t03303833300 = if (claim)
11061113 then claimFarmed(pType, pool)
11071114 else {
11081115 let claimedAsset = if ((pType == SF_POOL))
11121119 else unknownPoolType()
11131120 $Tuple2(amount, claimedAsset)
11141121 }
1115- if (($t03285333115 == $t03285333115))
1122+ if (($t03303833300 == $t03303833300))
11161123 then {
1117- let claimAsset = $t03285333115._2
1118- let claimAmount = $t03285333115._1
1124+ let claimAsset = $t03303833300._2
1125+ let claimAmount = $t03303833300._1
11191126 let bal = accountBalance(claimAsset)
11201127 if ((bal == bal))
11211128 then if ((amount > bal))
11311138 func getPoolInfoREADONLY (pool) = {
11321139 let poolAddr = addressFromStringValue(pool)
11331140 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1134- let $t03348233572 = getPoolData(Address(fromBase58String(pool)), pType)
1135- let AId = $t03348233572._1
1136- let BId = $t03348233572._2
1137- let balA = $t03348233572._3
1138- let balB = $t03348233572._4
1139- let shareId = $t03348233572._5
1141+ let $t03366733757 = getPoolData(Address(fromBase58String(pool)), pType)
1142+ let AId = $t03366733757._1
1143+ let BId = $t03366733757._2
1144+ let balA = $t03366733757._3
1145+ let balB = $t03366733757._4
1146+ let shareId = $t03366733757._5
11401147 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11411148 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11421149 }
11641171 @Callable(i)
11651172 func getUserPositionREADONLY (user,pools,posNum) = {
11661173 func userPos (a,pool) = {
1167- let $t03444534515 = a
1168- let wAmountsA = $t03444534515._1
1169- let wAmountsB = $t03444534515._2
1170- let debts = $t03444534515._3
1171- let eqWAmountsA = $t03444534515._4
1172- let eqWAmountsB = $t03444534515._5
1173- let index = $t03444534515._6
1174+ let $t03463034700 = a
1175+ let wAmountsA = $t03463034700._1
1176+ let wAmountsB = $t03463034700._2
1177+ let debts = $t03463034700._3
1178+ let eqWAmountsA = $t03463034700._4
1179+ let eqWAmountsB = $t03463034700._5
1180+ let index = $t03463034700._6
11741181 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
11751182 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
11761183 else {
11771184 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1178- let $t03479434884 = getPoolData(Address(fromBase58String(pool)), pType)
1179- let AId = $t03479434884._1
1180- let BId = $t03479434884._2
1181- let balA = $t03479434884._3
1182- let balB = $t03479434884._4
1183- let shareId = $t03479434884._5
1185+ let $t03497935069 = getPoolData(Address(fromBase58String(pool)), pType)
1186+ let AId = $t03497935069._1
1187+ let BId = $t03497935069._2
1188+ let balA = $t03497935069._3
1189+ let balB = $t03497935069._4
1190+ let shareId = $t03497935069._5
11841191 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
11851192 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1186- let $t03510035220 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1187- let wAmountA = $t03510035220._1
1188- let wAmountB = $t03510035220._2
1193+ let $t03528535405 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1194+ let wAmountA = $t03528535405._1
1195+ let wAmountB = $t03528535405._2
11891196 if ((borrowAmount > 0))
11901197 then {
11911198 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12191226 }
12201227 else unknownPoolType()
12211228 else 0
1222- let $t03613236351 = if ((borrowAsset == AId))
1229+ let $t03631736536 = if ((borrowAsset == AId))
12231230 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12241231 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1225- let eqWAmountA = $t03613236351._1
1226- let eqWAmountB = $t03613236351._2
1232+ let eqWAmountA = $t03631736536._1
1233+ let eqWAmountB = $t03631736536._2
12271234 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12281235 }
12291236 else throw("Strict value is not equal to itself.")
12321239 }
12331240 }
12341241
1235- let $t03660636717 = {
1242+ let $t03679136902 = {
12361243 let $l = pools
12371244 let $s = size($l)
12381245 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12461253
12471254 $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)
12481255 }
1249- let wAmountsA = $t03660636717._1
1250- let wAmountsB = $t03660636717._2
1251- let debts = $t03660636717._3
1252- let eqWAmountsA = $t03660636717._4
1253- let eqWAmountsB = $t03660636717._5
1256+ let wAmountsA = $t03679136902._1
1257+ let wAmountsB = $t03679136902._2
1258+ let debts = $t03679136902._3
1259+ let eqWAmountsA = $t03679136902._4
1260+ let eqWAmountsB = $t03679136902._5
12541261 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
12551262 }
12561263
12701277 else false)
12711278 then throw("You can't borrow in this pool")
12721279 else {
1273- let $t03731537405 = getPoolData(Address(fromBase58String(pool)), pType)
1274- let AId = $t03731537405._1
1275- let BId = $t03731537405._2
1276- let balA = $t03731537405._3
1277- let balB = $t03731537405._4
1278- let shareId = $t03731537405._5
1280+ let $t03750037590 = getPoolData(Address(fromBase58String(pool)), pType)
1281+ let AId = $t03750037590._1
1282+ let BId = $t03750037590._2
1283+ let balA = $t03750037590._3
1284+ let balB = $t03750037590._4
1285+ let shareId = $t03750037590._5
12791286 if (if ((borrowId != AId))
12801287 then (borrowId != BId)
12811288 else false)
12821289 then throw("Wrong borrow asset")
12831290 else {
1284- let $t03748637545 = parseReplenishPmts(i.payments, AId, BId)
1285- let pmtA = $t03748637545._1
1286- let pmtB = $t03748637545._2
1291+ let $t03767137730 = parseReplenishPmts(i.payments, AId, BId)
1292+ let pmtA = $t03767137730._1
1293+ let pmtB = $t03767137730._2
12871294 let user = toString(i.caller)
12881295 let newPosNum = getNewUserPositionNumber(user)
12891296 if ((leverage > 100))
13031310 if ((inv == inv))
13041311 then {
13051312 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1306- let $t03853438628 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1307- if (($t03853438628 == $t03853438628))
1313+ let $t03871938813 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1314+ if (($t03871938813 == $t03871938813))
13081315 then {
1309- let newBalB = $t03853438628._2
1310- let newBalA = $t03853438628._1
1316+ let newBalB = $t03871938813._2
1317+ let newBalA = $t03871938813._1
13111318 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1312- let $t03869838813 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1313- let wAmountA = $t03869838813._1
1314- let wAmountB = $t03869838813._2
1319+ let $t03888338998 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1320+ let wAmountA = $t03888338998._1
1321+ let wAmountB = $t03888338998._2
13151322 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13161323 }
13171324 else throw("Strict value is not equal to itself.")
13211328 else throw("Strict value is not equal to itself.")
13221329 }
13231330 else {
1324- let $t03886638981 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1325- if (($t03886638981 == $t03886638981))
1331+ let $t03905139166 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1332+ if (($t03905139166 == $t03905139166))
13261333 then {
1327- let axlyFee = $t03886638981._2
1328- let userStaked = $t03886638981._1
1329- let $t03898739081 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1330- if (($t03898739081 == $t03898739081))
1334+ let axlyFee = $t03905139166._2
1335+ let userStaked = $t03905139166._1
1336+ let $t03917239266 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1337+ if (($t03917239266 == $t03917239266))
13311338 then {
1332- let newBalB = $t03898739081._2
1333- let newBalA = $t03898739081._1
1339+ let newBalB = $t03917239266._2
1340+ let newBalA = $t03917239266._1
13341341 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1335- let $t03915139266 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1336- let wAmountA = $t03915139266._1
1337- let wAmountB = $t03915139266._2
1342+ let $t03933639451 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1343+ let wAmountA = $t03933639451._1
1344+ let wAmountB = $t03933639451._2
13381345 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13391346 }
13401347 else throw("Strict value is not equal to itself.")
14271434
14281435 @Callable(i)
14291436 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1430- let $t04410544209 = parseRequest(requestId)
1431- let user = $t04410544209._1
1432- let pool = $t04410544209._2
1433- let pmtA = $t04410544209._3
1434- let AId = $t04410544209._4
1435- let pmtB = $t04410544209._5
1436- let BId = $t04410544209._6
1437- let balA = $t04410544209._7
1438- let balB = $t04410544209._8
1439- let shareId = $t04410544209._9
1440- let bwAsset = $t04410544209._10
1441- let bwAmount = $t04410544209._11
1437+ let $t04429044394 = parseRequest(requestId)
1438+ let user = $t04429044394._1
1439+ let pool = $t04429044394._2
1440+ let pmtA = $t04429044394._3
1441+ let AId = $t04429044394._4
1442+ let pmtB = $t04429044394._5
1443+ let BId = $t04429044394._6
1444+ let balA = $t04429044394._7
1445+ let balB = $t04429044394._8
1446+ let shareId = $t04429044394._9
1447+ let bwAsset = $t04429044394._10
1448+ let bwAmount = $t04429044394._11
14421449 if ((size(i.payments) != 1))
14431450 then throw("Wrong payment size")
14441451 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14461453 else (i.payments[0].amount != bwAmount))
14471454 then throw("Wrong payment")
14481455 else {
1449- let $t04439944499 = if ((AId == bwAsset))
1456+ let $t04458444684 = if ((AId == bwAsset))
14501457 then $Tuple2((pmtA + bwAmount), pmtB)
14511458 else $Tuple2(pmtA, (pmtB + bwAmount))
1452- let pmtAllA = $t04439944499._1
1453- let pmtAllB = $t04439944499._2
1459+ let pmtAllA = $t04458444684._1
1460+ let pmtAllB = $t04458444684._2
14541461 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1455- let $t04458144696 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1456- let userStaked = $t04458144696._1
1457- let axlyFee = $t04458144696._2
1462+ let $t04476644881 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1463+ let userStaked = $t04476644881._1
1464+ let axlyFee = $t04476644881._2
14581465 let posNum = getNewUserPositionNumber(user)
14591466 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
14601467 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1461- let $t04505645171 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1462- let wAmountA = $t04505645171._1
1463- let wAmountB = $t04505645171._2
1468+ let $t04524145356 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1469+ let wAmountA = $t04524145356._1
1470+ let wAmountB = $t04524145356._2
14641471 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
14651472 }
14661473 }))
14711478 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14721479 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
14731480 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1474- let $t04569245782 = getPoolData(Address(fromBase58String(pool)), pType)
1475- let AId = $t04569245782._1
1476- let BId = $t04569245782._2
1477- let balA = $t04569245782._3
1478- let balB = $t04569245782._4
1479- let shareId = $t04569245782._5
1481+ let $t04587745967 = getPoolData(Address(fromBase58String(pool)), pType)
1482+ let AId = $t04587745967._1
1483+ let BId = $t04587745967._2
1484+ let balA = $t04587745967._3
1485+ let balB = $t04587745967._4
1486+ let shareId = $t04587745967._5
14801487 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
14811488 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
14821489 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15081515 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15091516 let pType = getStringValue(this, (kPool + pool))
15101517 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1511- let $t04775247854 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1512- if (($t04775247854 == $t04775247854))
1518+ let $t04793748039 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1519+ if (($t04793748039 == $t04793748039))
15131520 then {
1514- let claimedAsset = $t04775247854._2
1515- let claimedAmount = $t04775247854._1
1521+ let claimedAsset = $t04793748039._2
1522+ let claimedAmount = $t04793748039._1
15161523 let rArgs = split(route, "__")
15171524 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15181525 then directSwopfiCPMM(rArgs, tokenToId)
15371544 @Callable(i)
15381545 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15391546 let pType = getStringValue(this, (kPool + pool))
1540- let $t04853848636 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1541- if (($t04853848636 == $t04853848636))
1547+ let $t04872348821 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1548+ if (($t04872348821 == $t04872348821))
15421549 then {
1543- let claimedAsset = $t04853848636._2
1544- let claimedAmount = $t04853848636._1
1550+ let claimedAsset = $t04872348821._2
1551+ let claimedAmount = $t04872348821._1
15451552 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15461553 }
15471554 else throw("Strict value is not equal to itself.")
15591566 else false)
15601567 then throw("Wrong pool type")
15611568 else {
1562- let $t04915749251 = getPoolData(Address(fromBase58String(poolAddr)), type)
1563- let aId = $t04915749251._1
1564- let bId = $t04915749251._2
1565- let aBal = $t04915749251._3
1566- let bBal = $t04915749251._4
1567- let shareId = $t04915749251._5
1569+ let $t04934249436 = getPoolData(Address(fromBase58String(poolAddr)), type)
1570+ let aId = $t04934249436._1
1571+ let bId = $t04934249436._2
1572+ let aBal = $t04934249436._3
1573+ let bBal = $t04934249436._4
1574+ let shareId = $t04934249436._5
15681575 if ((0 > inFeeNoLoan))
15691576 then throw("inFeeNoLoan must be greater than 0")
15701577 else if ((0 > inFeeLoan))
15771584 then throw("stoplossFeeNoLoan must be greater than 0")
15781585 else if ((0 > stoplossFeeWithLoan))
15791586 then throw("stoplossFeeWithLoan must be greater than 0")
1580- 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((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
1587+ 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)]
15811588 }))
15821589
15831590
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SF_POOL = "SF"
55
66 let WX_POOL = "WX"
77
88 let CPMM = "cpmm"
99
1010 let FLAT = "flat"
1111
1212 let CAP_FEE_NO_LOAN = "capNoLoan"
1313
1414 let CAP_FEE_LOAN = "capLoan"
1515
1616 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1717
1818 let STOPLOSS_LOAN = "stopLossLoan"
1919
2020 let LOAN_FEE = "loan"
2121
2222 let NO_LOAN_FEE = "noLoan"
2323
2424 let NO_FEE = "noFee"
2525
2626 let SCALE8 = 100000000
2727
2828 let SCALE10 = 10000000000
2929
3030 let SCALE16 = toBigInt(10000000000000000)
3131
3232 let FEE_SCALE6 = 1000000
3333
3434 let kSFPoolAAssetBalance = "A_asset_balance"
3535
3636 let kSFPoolBAssetBalance = "B_asset_balance"
3737
3838 let kSFPoolAAssetId = "A_asset_id"
3939
4040 let kSFPoolBAssetId = "B_asset_id"
4141
4242 let kSFPoolShareId = "share_asset_id"
4343
4444 let kSFPoolShareSupply = "share_asset_supply"
4545
4646 let kSFPoolFee = "commission"
4747
4848 let kUserPosition = "_userPosition"
4949
5050 let kUserPositionPool = "_userPositionPool"
5151
5252 let kUserBorrowAmount = "_userPositionBorrowAmount"
5353
5454 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5555
5656 let kUserPositionNum = "_userPositionNumber"
5757
5858 let kUserPositionInterest = "_userPositionInterest"
5959
6060 let kPoolTotal = "_poolTotal"
6161
6262 let kPoolTotalLoan = "_poolTotalLoan"
6363
6464 let kPoolInterestLoan = "_poolInterestLoan"
6565
6666 let kPoolInterestNoLoan = "_poolInterestNoLoan"
6767
6868 let kPoolCanBorrow = "_poolCanBorrow"
6969
7070 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
7171
7272 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
7373
7474 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7575
7676 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7777
7878 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
7979
8080 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
8181
8282 let kRequestId = "_request_id"
8383
8484 let kRequestIter = "requests_iter"
8585
8686 let kPool = "pool_"
87+
88+let kPoolType = "_poolType"
8789
8890 let kSharePool = "_poolShareId"
8991
9092 let kPoolCapChange = "_poolCapChange"
9193
9294 let kTokenLastPrice = "last_price"
9395
9496 let kPriceInOracle = "_twap5B"
9597
9698 let kActive = "active"
9799
98100 let kActiveUsers = "activeUsers"
99101
100102 let kActiveSFWX = "_active"
101103
102104 let kPoolActive = "_activePool"
103105
104106 let kUserStopLoss = "_stopLoss"
105107
106108 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
107109
108110 let kMoneyBox = "axly_money_box"
109111
110112 let kSFFarmingAddr = "swopfi_farming_addr"
111113
112114 let kLendService = "lend_service_addr"
113115
114116 let kOperatorCallPK = "admin_call_pub_key"
115117
116118 let kPriceOracle = "price_oracle"
117119
118120 let kExContract = "exchange_contract"
119121
120122 let kWxSwapContract = "wx_swap_contract"
121123
122124 let kSwopId = "swop_id"
123125
124126 let kWxId = "wx_id"
125127
126128 let kGroup1Admin1PK = "group1_admin1_pub_key"
127129
128130 let kGroup1Admin2PK = "group1_admin2_pub_key"
129131
130132 let kGroup2Admin1PK = "group2_admin1_pub_key"
131133
132134 let kGroup2Admin2PK = "group2_admin2_pub_key"
133135
134136 let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
135137
136138 let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
137139
138140 let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
139141
140142 let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
141143
142144 let SWOPID = fromBase58String(valueOrErrorMessage(getString(this, kSwopId), "No swop id"))
143145
144146 let WXID = fromBase58String(valueOrErrorMessage(getString(this, kWxId), "No wx id"))
145147
146148 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
147149
148150 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
149151
150152 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
151153
152154 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
153155
154156 let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
155157
156158 func unknownPoolType () = throw("Wrong pool type")
157159
158160
159161 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
160162
161163
162164 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
163165 then unit
164166 else throw("Only operator can call this function")
165167
166168
167169 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
168170 then true
169171 else (i.callerPublicKey == group1Admin2PK))
170172 then unit
171173 else throw("Only admin group1 can call this function")
172174
173175
174176 func isSelfCall (i) = if ((i.caller == this))
175177 then unit
176178 else throw("Only contract itself can call this function")
177179
178180
179181 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
180182 then unit
181183 else throw("Only land contract can call this function")
182184
183185
184186 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
185187 then unit
186188 else throw("DApp is inactive at this moment")
187189
188190
189191 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
190192 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
191193 else false)
192194 then unit
193195 else throw("DApp is inactive for users at this moment")
194196
195197
196198 func isPoolActive (pool,type) = {
197199 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
198200 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
199201 if (if (WXSFActive)
200202 then poolActive
201203 else false)
202204 then true
203205 else false
204206 }
205207
206208
207209 func accountBalance (assetId) = match assetId {
208210 case id: ByteVector =>
209211 assetBalance(this, id)
210212 case waves: Unit =>
211213 wavesBalance(this).available
212214 case _ =>
213215 throw("Match error")
214216 }
215217
216218
217219 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"))
218220
219221
220222 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
221223 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
222224 if ($isInstanceOf(@, "Int"))
223225 then @
224226 else throw(($getType(@) + " couldn't be cast to Int"))
225227 }, {
226228 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
227229 if ($isInstanceOf(@, "Int"))
228230 then @
229231 else throw(($getType(@) + " couldn't be cast to Int"))
230232 })
231233
232234
233235 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
234236 then getSFPoolBalances(poolAddr)
235237 else if ((type == WX_POOL))
236238 then getWXPoolBalances(poolAddr, aId, bId)
237239 else unknownPoolType()
238240
239241
240242 func getSFPoolData (poolAddr) = {
241- let $t080238072 = getSFPoolBalances(poolAddr)
242- if (($t080238072 == $t080238072))
243+ let $t080898138 = getSFPoolBalances(poolAddr)
244+ if (($t080898138 == $t080898138))
243245 then {
244- let balB = $t080238072._2
245- let balA = $t080238072._1
246+ let balB = $t080898138._2
247+ let balA = $t080898138._1
246248 $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"))
247249 }
248250 else throw("Strict value is not equal to itself.")
249251 }
250252
251253
252254 func getWXPoolData (poolAddr) = {
253255 let cfg = {
254256 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
255257 if ($isInstanceOf(@, "List[Any]"))
256258 then @
257259 else throw(($getType(@) + " couldn't be cast to List[Any]"))
258260 }
259261 if ((cfg == cfg))
260262 then {
261263 let aId = valueOrErrorMessage({
262264 let @ = cfg[4]
263265 if ($isInstanceOf(@, "String"))
264266 then @
265267 else unit
266268 }, "Can't get pool A asset id")
267269 let bId = valueOrErrorMessage({
268270 let @ = cfg[5]
269271 if ($isInstanceOf(@, "String"))
270272 then @
271273 else unit
272274 }, "Can't get pool B asset id")
273275 let shareId = valueOrErrorMessage({
274276 let @ = cfg[3]
275277 if ($isInstanceOf(@, "String"))
276278 then @
277279 else unit
278280 }, "Can't get pool LP asset id")
279- let $t087698828 = getWXPoolBalances(poolAddr, aId, bId)
280- if (($t087698828 == $t087698828))
281+ let $t088358894 = getWXPoolBalances(poolAddr, aId, bId)
282+ if (($t088358894 == $t088358894))
281283 then {
282- let balB = $t087698828._2
283- let balA = $t087698828._1
284+ let balB = $t088358894._2
285+ let balA = $t088358894._1
284286 $Tuple5(aId, bId, balA, balB, shareId)
285287 }
286288 else throw("Strict value is not equal to itself.")
287289 }
288290 else throw("Strict value is not equal to itself.")
289291 }
290292
291293
292294 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
293295 then getSFPoolData(poolAddr)
294296 else if ((type == WX_POOL))
295297 then getWXPoolData(poolAddr)
296298 else unknownPoolType()
297299
298300
299301 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
300302 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
301303 else if ((type == WX_POOL))
302304 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
303305 else unknownPoolType()
304306
305307
306308 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
307309
308310
309311 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
310312
311313
312314 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
313315
314316
315317 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
316318 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
317319 else if ((feeType == CAP_FEE_NO_LOAN))
318320 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
319321 else if ((feeType == LOAN_FEE))
320322 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
321323 else if ((feeType == NO_LOAN_FEE))
322324 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
323325 else if ((feeType == NO_FEE))
324326 then 0
325327 else throw("Wrong fee type")
326328
327329
328330 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
329331
330332
331333 func getWXFarmingAddr (poolAddr) = {
332334 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
333335 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
334336 Address(fromBase58String(factroyCfg[1]))
335337 }
336338
337339
338340 func assetIdToStr (assetId) = match assetId {
339341 case id: ByteVector =>
340342 toBase58String(id)
341343 case waves: Unit =>
342344 "WAVES"
343345 case _ =>
344346 throw("Not Asset id")
345347 }
346348
347349
348350 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
349351 then unit
350352 else fromBase58String(assetId)
351353
352354
353355 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
354356 then 8
355357 else match assetInfo(fromBase58String(assetId)) {
356358 case asset: Asset =>
357359 asset.decimals
358360 case _ =>
359361 throw("Can't find asset")
360362 }
361363
362364
363365 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
364366
365367
366368 func getAssetsPrice (assetIds) = {
367369 func getPrices (a,assetId) = {
368370 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
369371 (a :+ assetPrice)
370372 }
371373
372374 let $l = assetIds
373375 let $s = size($l)
374376 let $acc0 = nil
375377 func $f0_1 ($a,$i) = if (($i >= $s))
376378 then $a
377379 else getPrices($a, $l[$i])
378380
379381 func $f0_2 ($a,$i) = if (($i >= $s))
380382 then $a
381383 else throw("List size exceeds 50")
382384
383385 $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)
384386 }
385387
386388
387389 func getSharePrice (shareId) = {
388390 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
389391 let poolAddr = Address(fromBase58String(pool))
390392 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
391- let $t01181711882 = getPoolData(poolAddr, pType)
392- let aId = $t01181711882._1
393- let bId = $t01181711882._2
394- let aBalance = $t01181711882._3
395- let bBalance = $t01181711882._4
393+ let $t01188311948 = getPoolData(poolAddr, pType)
394+ let aId = $t01188311948._1
395+ let bId = $t01188311948._2
396+ let aBalance = $t01188311948._3
397+ let bBalance = $t01188311948._4
396398 let prices = getAssetsPrice([aId, bId])
397399 let dPriceA = prices[0]
398400 let dPriceB = prices[1]
399401 if (if ((0 > dPriceA))
400402 then true
401403 else (0 > dPriceB))
402404 then -1
403405 else {
404406 let shareSupply = getShareSupply(poolAddr, pType, shareId)
405407 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
406408 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
407409 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
408410 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
409411 fraction(sum, sharePrecision, shareSupply)
410412 }
411413 }
412414
413415
414416 func getSharePrices (shareIds) = {
415417 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
416418
417419 let $l = shareIds
418420 let $s = size($l)
419421 let $acc0 = nil
420422 func $f0_1 ($a,$i) = if (($i >= $s))
421423 then $a
422424 else getPrices($a, $l[$i])
423425
424426 func $f0_2 ($a,$i) = if (($i >= $s))
425427 then $a
426428 else throw("List size exceeds 20")
427429
428430 $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)
429431 }
430432
431433
432434 func getCursEntries (aId,bId,shareId,wAmounts) = {
433435 let assetsPrices = getAssetsPrice([aId, bId])
434436 let sharePrice = getSharePrice(shareId)
435437 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
436438 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
437439 }
438440
439441
440442 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
441443 then {
442444 let repl = {
443445 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
444446 if ($isInstanceOf(@, "List[Any]"))
445447 then @
446448 else throw(($getType(@) + " couldn't be cast to List[Any]"))
447449 }
448450 if ((repl == repl))
449451 then $Tuple5({
450452 let @ = repl[3]
451453 if ($isInstanceOf(@, "Int"))
452454 then @
453455 else throw(($getType(@) + " couldn't be cast to Int"))
454456 }, {
455457 let @ = repl[4]
456458 if ($isInstanceOf(@, "Int"))
457459 then @
458460 else throw(($getType(@) + " couldn't be cast to Int"))
459461 }, {
460462 let @ = repl[1]
461463 if ($isInstanceOf(@, "Int"))
462464 then @
463465 else throw(($getType(@) + " couldn't be cast to Int"))
464466 }, assetIdToStr(repl[2]), {
465467 let @ = repl[0]
466468 if ($isInstanceOf(@, "Int"))
467469 then @
468470 else throw(($getType(@) + " couldn't be cast to Int"))
469471 })
470472 else throw("Strict value is not equal to itself.")
471473 }
472474 else if ((pType == WX_POOL))
473475 then {
474- let $t01342613676 = $Tuple2(split({
476+ let $t01349213742 = $Tuple2(split({
475477 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
476478 if ($isInstanceOf(@, "String"))
477479 then @
478480 else throw(($getType(@) + " couldn't be cast to String"))
479481 }, "__"), split({
480482 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
481483 if ($isInstanceOf(@, "String"))
482484 then @
483485 else throw(($getType(@) + " couldn't be cast to String"))
484486 }, "__"))
485- if (($t01342613676 == $t01342613676))
487+ if (($t01349213742 == $t01349213742))
486488 then {
487- let evalPutInB = $t01342613676._2
488- let evalPutInA = $t01342613676._1
489+ let evalPutInB = $t01349213742._2
490+ let evalPutInA = $t01349213742._1
489491 let lpInA = parseIntValue(evalPutInA[1])
490492 let lpInB = parseIntValue(evalPutInB[1])
491493 if ((lpInB > lpInA))
492494 then {
493495 let pmt = parseIntValue(evalPutInA[8])
494496 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
495497 }
496498 else {
497499 let pmt = parseIntValue(evalPutInB[7])
498500 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
499501 }
500502 }
501503 else throw("Strict value is not equal to itself.")
502504 }
503505 else unknownPoolType()
504506
505507
506508 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
507509 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
508510 if ((pType == SF_POOL))
509511 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
510512 else if ((pType == WX_POOL))
511513 then invoke(poolAddr, "put", [1000000, false], payments)
512514 else unknownPoolType()
513515 }
514516
515517
516518 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
517519 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
518520 if ((pType == SF_POOL))
519521 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
520522 else if ((pType == WX_POOL))
521- then invoke(poolAddr, "putOneTkn", [0, false], payments)
523+ then {
524+ let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
525+ then "putOneTknV2"
526+ else "putOneTkn"
527+ invoke(poolAddr, fc, [0, false], payments)
528+ }
522529 else unknownPoolType()
523530 }
524531
525532
526533 func stakeLP (pool,pType,shareId,amount) = {
527534 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
528535 if ((pType == SF_POOL))
529536 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
530537 else if ((pType == WX_POOL))
531538 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
532539 else unknownPoolType()
533540 }
534541
535542
536543 func unstakeLP (pool,pType,shareId,amount) = {
537- let $t01533515685 = if ((pType == SF_POOL))
544+ let $t01552015870 = if ((pType == SF_POOL))
538545 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
539546 else if ((pType == WX_POOL))
540547 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
541548 else unknownPoolType()
542- let farmAddr = $t01533515685._1
543- let fName = $t01533515685._2
544- let params = $t01533515685._3
549+ let farmAddr = $t01552015870._1
550+ let fName = $t01552015870._2
551+ let params = $t01552015870._3
545552 let inv = invoke(farmAddr, fName, params, nil)
546553 if ((inv == inv))
547554 then amount
548555 else throw("Strict value is not equal to itself.")
549556 }
550557
551558
552559 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
553560 let poolAddr = Address(fromBase58String(pool))
554561 let feeScale6 = 1000000
555562 let fee = getIntegerValue(poolAddr, kSFPoolFee)
556563 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
557- let $t01610716413 = if ((assetTokenToGet == assetIdA))
564+ let $t01629216598 = if ((assetTokenToGet == assetIdA))
558565 then {
559566 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
560567 $Tuple2(amountToPay, assetIdB)
561568 }
562569 else {
563570 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
564571 $Tuple2(amountToPay, assetIdA)
565572 }
566- let amountToPay = $t01610716413._1
567- let assetToPay = $t01610716413._2
573+ let amountToPay = $t01629216598._1
574+ let assetToPay = $t01629216598._2
568575 $Tuple2(assetToPay, amountToPay)
569576 }
570577
571578
572579 func getWXSwapFees (pool) = {
573580 let poolAddr = addressFromStringValue(pool)
574581 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
575582 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
576583 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
577584 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
578585 case fees: (Int, Int) =>
579586 $Tuple2(fees._1, fees._2)
580587 case _ =>
581588 $Tuple2(poolFeeDefault, protocolFeeDefault)
582589 }
583590 }
584591
585592
586593 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
587- let $t01715317192 = getWXSwapFees(pool)
588- let pFee = $t01715317192._1
589- let prFee = $t01715317192._2
594+ let $t01733817377 = getWXSwapFees(pool)
595+ let pFee = $t01733817377._1
596+ let prFee = $t01733817377._2
590597 let feeScale = toBigInt(100000000)
591- let $t01723217540 = if ((assetTokenToGet == assetIdA))
598+ let $t01741717725 = if ((assetTokenToGet == assetIdA))
592599 then {
593600 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
594601 $Tuple2(amountToPay, assetIdB)
595602 }
596603 else {
597604 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
598605 $Tuple2(amountToPay, assetIdA)
599606 }
600- let amountToPay = $t01723217540._1
601- let assetToPay = $t01723217540._2
607+ let amountToPay = $t01741717725._1
608+ let assetToPay = $t01741717725._2
602609 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
603610 $Tuple2(assetToPay, amountToPayWithFee)
604611 }
605612
606613
607614 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
608615 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
609616 if (if ((pType == SF_POOL))
610617 then true
611618 else (poolFB != ""))
612619 then {
613- let $t01798118193 = if ((poolFB == ""))
620+ let $t01816618378 = if ((poolFB == ""))
614621 then $Tuple3(balA, balB, pool)
615622 else {
616- let $t01808718160 = getSFPoolBalances(addressFromStringValue(poolFB))
617- let sfBalA = $t01808718160._1
618- let sfBalB = $t01808718160._2
623+ let $t01827218345 = getSFPoolBalances(addressFromStringValue(poolFB))
624+ let sfBalA = $t01827218345._1
625+ let sfBalB = $t01827218345._2
619626 $Tuple3(sfBalA, sfBalB, poolFB)
620627 }
621- let pBalA = $t01798118193._1
622- let pBalB = $t01798118193._2
623- let exPool = $t01798118193._3
624- let $t01819818324 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
625- let assetToPay = $t01819818324._1
626- let amountToPay = $t01819818324._2
628+ let pBalA = $t01816618378._1
629+ let pBalB = $t01816618378._2
630+ let exPool = $t01816618378._3
631+ let $t01838318509 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
632+ let assetToPay = $t01838318509._1
633+ let amountToPay = $t01838318509._2
627634 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
628635 }
629636 else if ((pType == WX_POOL))
630637 then {
631- let $t01852618648 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
632- let assetToPay = $t01852618648._1
633- let amountToPay = $t01852618648._2
638+ let $t01871118833 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
639+ let assetToPay = $t01871118833._1
640+ let amountToPay = $t01871118833._2
634641 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
635642 }
636643 else unknownPoolType()
637644 }
638645
639646
640647 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
641- let $t01893519399 = if ((pType == SF_POOL))
648+ let $t01912019584 = if ((pType == SF_POOL))
642649 then {
643650 let inv = {
644651 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
645652 if ($isInstanceOf(@, "List[Any]"))
646653 then @
647654 else throw(($getType(@) + " couldn't be cast to List[Any]"))
648655 }
649656 if ((inv == inv))
650657 then $Tuple2({
651658 let @ = inv[0]
652659 if ($isInstanceOf(@, "Int"))
653660 then @
654661 else throw(($getType(@) + " couldn't be cast to Int"))
655662 }, {
656663 let @ = inv[1]
657664 if ($isInstanceOf(@, "Int"))
658665 then @
659666 else throw(($getType(@) + " couldn't be cast to Int"))
660667 })
661668 else throw("Strict value is not equal to itself.")
662669 }
663670 else if ((pType == WX_POOL))
664671 then {
665672 let inv = split({
666673 let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
667674 if ($isInstanceOf(@, "String"))
668675 then @
669676 else throw(($getType(@) + " couldn't be cast to String"))
670677 }, "__")
671678 if ((inv == inv))
672679 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
673680 else throw("Strict value is not equal to itself.")
674681 }
675682 else unknownPoolType()
676- let amountA = $t01893519399._1
677- let amountB = $t01893519399._2
683+ let amountA = $t01912019584._1
684+ let amountB = $t01912019584._2
678685 $Tuple2(amountA, amountB)
679686 }
680687
681688
682689 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
683690 then {
684691 let balBefore = accountBalance(SWOPID)
685692 if ((balBefore == balBefore))
686693 then {
687694 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
688695 if ((inv == inv))
689696 then {
690697 let balAfter = accountBalance(SWOPID)
691698 $Tuple2((balAfter - balBefore), SWOPID)
692699 }
693700 else throw("Strict value is not equal to itself.")
694701 }
695702 else throw("Strict value is not equal to itself.")
696703 }
697704 else if ((pType == WX_POOL))
698705 then {
699- let $t01976719846 = getWXPoolData(addressFromStringValue(pool))
700- let aId = $t01976719846._1
701- let bId = $t01976719846._2
702- let aBal = $t01976719846._3
703- let bBal = $t01976719846._4
704- let lpId = $t01976719846._5
706+ let $t01995220031 = getWXPoolData(addressFromStringValue(pool))
707+ let aId = $t01995220031._1
708+ let bId = $t01995220031._2
709+ let aBal = $t01995220031._3
710+ let bBal = $t01995220031._4
711+ let lpId = $t01995220031._5
705712 let balBefore = accountBalance(WXID)
706713 if ((balBefore == balBefore))
707714 then {
708715 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
709716 if ((inv == inv))
710717 then {
711718 let balAfter = accountBalance(WXID)
712719 $Tuple2((balAfter - balBefore), WXID)
713720 }
714721 else throw("Strict value is not equal to itself.")
715722 }
716723 else throw("Strict value is not equal to itself.")
717724 }
718725 else unknownPoolType()
719726
720727
721728 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
722729 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
723730 if ((lpBalanceBefore == lpBalanceBefore))
724731 then {
725732 let poolAddr = addressFromStringValue(pool)
726- let $t02044420860 = if (if ((pmtA > 0))
733+ let $t02062921045 = if (if ((pmtA > 0))
727734 then (pmtB > 0)
728735 else false)
729736 then {
730- let $t02051020626 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
731- let pmtInA = $t02051020626._1
732- let pmtInB = $t02051020626._2
733- let change = $t02051020626._3
734- let changeId = $t02051020626._4
737+ let $t02069520811 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
738+ let pmtInA = $t02069520811._1
739+ let pmtInB = $t02069520811._2
740+ let change = $t02069520811._3
741+ let changeId = $t02069520811._4
735742 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
736743 if ((inv == inv))
737744 then $Tuple2(change, changeId)
738745 else throw("Strict value is not equal to itself.")
739746 }
740747 else if ((pmtA > 0))
741748 then $Tuple2(pmtA, aId)
742749 else if ((pmtB > 0))
743750 then $Tuple2(pmtB, bId)
744751 else throw("pmts must be > 0")
745- let change = $t02044420860._1
746- let changeId = $t02044420860._2
752+ let change = $t02062921045._1
753+ let changeId = $t02062921045._2
747754 let inv = if ((change > 0))
748755 then replenishOneTokenByType(poolAddr, pType, change, changeId)
749756 else nil
750757 if ((inv == inv))
751758 then {
752759 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
753760 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
754761 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
755762 let userShareForStake = (totalStaked - axlyFeeAmount)
756763 if ((0 >= userShareForStake))
757764 then throw("amount of staked sharetokens must be > 0")
758765 else {
759766 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
760767 if ((invLP == invLP))
761768 then $Tuple2(userShareForStake, axlyFeeAmount)
762769 else throw("Strict value is not equal to itself.")
763770 }
764771 }
765772 else throw("Strict value is not equal to itself.")
766773 }
767774 else throw("Strict value is not equal to itself.")
768775 }
769776
770777
771778 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
772779 let totalAmount = getPoolTotalShare(pool)
773780 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
774- let $t02171721955 = if (withLoan)
781+ let $t02190222140 = if (withLoan)
775782 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
776783 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
777- let curPoolInterest = $t02171721955._1
778- let totalStakedWithLoan = $t02171721955._2
784+ let curPoolInterest = $t02190222140._1
785+ let totalStakedWithLoan = $t02190222140._2
779786 [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))]
780787 }
781788
782789
783790 func listToInt (a,item) = (a :+ parseIntValue(item))
784791
785792
786793 func directSwopfiCPMM (rArgs,tokenTo) = {
787794 let dApp = addressFromStringValue(rArgs[1])
788795 let pmtP = split(rArgs[2], "|")
789796 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
790797 if ((tokenBalanceBefore == tokenBalanceBefore))
791798 then {
792799 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
793800 let minToRecive = rArgs[3]
794801 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
795802 if ((inv == inv))
796803 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
797804 else throw("Strict value is not equal to itself.")
798805 }
799806 else throw("Strict value is not equal to itself.")
800807 }
801808
802809
803810 func directRoutingSwopfi (rArgs,tokenTo) = {
804811 let dApp = addressFromStringValue(rArgs[1])
805812 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
806813 if ((tokenBalanceBefore == tokenBalanceBefore))
807814 then {
808815 let pmt = {
809816 let pmtP = split(rArgs[2], "|")
810817 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
811818 }
812819 let args = {
813820 let eArgs = split(rArgs[3], "|")
814821 let exchangers = split(eArgs[0], ",")
815822 let exchangersType = split(eArgs[1], ",")
816823 let args1 = {
817824 let $l = split(eArgs[2], ",")
818825 let $s = size($l)
819826 let $acc0 = nil
820827 func $f0_1 ($a,$i) = if (($i >= $s))
821828 then $a
822829 else listToInt($a, $l[$i])
823830
824831 func $f0_2 ($a,$i) = if (($i >= $s))
825832 then $a
826833 else throw("List size exceeds 3")
827834
828835 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
829836 }
830837 let args2 = {
831838 let $l = split(eArgs[3], ",")
832839 let $s = size($l)
833840 let $acc0 = nil
834841 func $f1_1 ($a,$i) = if (($i >= $s))
835842 then $a
836843 else listToInt($a, $l[$i])
837844
838845 func $f1_2 ($a,$i) = if (($i >= $s))
839846 then $a
840847 else throw("List size exceeds 3")
841848
842849 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
843850 }
844851 let routingAssetsKeys = split(eArgs[4], ",")
845852 let minToRecive = parseIntValue(eArgs[5])
846853 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
847854 }
848855 let inv = invoke(dApp, "routingTrade", args, pmt)
849856 if ((inv == inv))
850857 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
851858 else throw("Strict value is not equal to itself.")
852859 }
853860 else throw("Strict value is not equal to itself.")
854861 }
855862
856863
857864 func capitalize (pool,pType,tokenId,tokenAmount) = {
858865 let poolAddr = Address(fromBase58String(pool))
859- let $t02406224128 = getPoolData(poolAddr, pType)
860- let AId = $t02406224128._1
861- let BId = $t02406224128._2
862- let balA = $t02406224128._3
863- let balB = $t02406224128._4
864- let shareId = $t02406224128._5
866+ let $t02424724313 = getPoolData(poolAddr, pType)
867+ let AId = $t02424724313._1
868+ let BId = $t02424724313._2
869+ let balA = $t02424724313._3
870+ let balB = $t02424724313._4
871+ let shareId = $t02424724313._5
865872 if (if ((tokenId != AId))
866873 then (tokenId != BId)
867874 else false)
868875 then throw("Wrong asset")
869876 else {
870877 let totalShareAmount = getPoolTotalShare(pool)
871878 if ((totalShareAmount == 0))
872879 then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
873880 else {
874881 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
875882 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
876883 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
877884 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
878885 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
879886 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
880887 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
881- let $t02487324973 = if ((tokenId == AId))
888+ let $t02505825158 = if ((tokenId == AId))
882889 then $Tuple2((tokenAmount - axlyFee), 0)
883890 else $Tuple2(0, (tokenAmount - axlyFee))
884- let pmtA = $t02487324973._1
885- let pmtB = $t02487324973._2
886- let $t02497625080 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
887- let stakedAmount = $t02497625080._1
888- let nf = $t02497625080._2
891+ let pmtA = $t02505825158._1
892+ let pmtB = $t02505825158._2
893+ let $t02516125265 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
894+ let stakedAmount = $t02516125265._1
895+ let nf = $t02516125265._2
889896 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
890897 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
891898 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
892899 let stakedNoLoan = (stakedAmount - stakedLoan)
893900 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
894901 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
895902 else 0
896903 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
897904 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
898905 else 0
899906 ([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))
900907 }
901908 }
902909 }
903910
904911
905912 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
906913 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
907914 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
908915 let poolInterest = if (borrowed)
909916 then getIntegerValue(this, (pool + kPoolInterestLoan))
910917 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
911918 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
912919 }
913920
914921
915922 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
916923 let feeType = if (isBorrowed)
917924 then STOPLOSS_LOAN
918925 else STOPLOSS_FEE_NO_LOAN
919926 if (stopLoss)
920927 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
921928 else 0
922929 }
923930
924931
925932 func withdrawToUser (user,pool,posId,stopLoss) = {
926933 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
927934 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
928935 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
929936 let poolTotalShare = getPoolTotalShare(pool)
930937 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
931938 let userAddr = Address(fromBase58String(user))
932939 let poolAddr = Address(fromBase58String(pool))
933940 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
934- let $t02760927681 = getPoolData(poolAddr, pType)
935- let idAStr = $t02760927681._1
936- let idBStr = $t02760927681._2
937- let balA = $t02760927681._3
938- let balB = $t02760927681._4
939- let shareId = $t02760927681._5
940- let $t02768427751 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
941- let idA = $t02768427751._1
942- let idB = $t02768427751._2
941+ let $t02779427866 = getPoolData(poolAddr, pType)
942+ let idAStr = $t02779427866._1
943+ let idBStr = $t02779427866._2
944+ let balA = $t02779427866._3
945+ let balB = $t02779427866._4
946+ let shareId = $t02779427866._5
947+ let $t02786927936 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
948+ let idA = $t02786927936._1
949+ let idB = $t02786927936._2
943950 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
944951 let cBalABefore = accountBalance(idA)
945952 if ((cBalABefore == cBalABefore))
946953 then {
947954 let cBalBBefore = accountBalance(idB)
948955 if ((cBalBBefore == cBalBBefore))
949956 then {
950957 let inv = if ((pType == SF_POOL))
951958 then {
952959 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
953960 if ((inv == inv))
954961 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
955962 else throw("Strict value is not equal to itself.")
956963 }
957964 else if ((pType == WX_POOL))
958965 then {
959966 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
960967 if ((inv == inv))
961968 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
962969 else throw("Strict value is not equal to itself.")
963970 }
964971 else unknownPoolType()
965972 if ((inv == inv))
966973 then {
967974 let cBalAAfter = accountBalance(idA)
968975 if ((cBalAAfter == cBalAAfter))
969976 then {
970977 let cBalBAfter = accountBalance(idB)
971978 if ((cBalBAfter == cBalBAfter))
972979 then {
973- let $t02844628535 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
974- let tokensAmountA = $t02844628535._1
975- let tokensAmountB = $t02844628535._2
976- let $t02853829774 = if (isBorrowed)
980+ let $t02863128720 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
981+ let tokensAmountA = $t02863128720._1
982+ let tokensAmountB = $t02863128720._2
983+ let $t02872329959 = if (isBorrowed)
977984 then {
978985 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
979986 let debt = {
980987 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
981988 if ($isInstanceOf(@, "Int"))
982989 then @
983990 else throw(($getType(@) + " couldn't be cast to Int"))
984991 }
985992 if ((debt == debt))
986993 then {
987994 let amountToGetEx = if (if ((borrowAsset == idAStr))
988995 then (debt > tokensAmountA)
989996 else false)
990997 then (debt - tokensAmountA)
991998 else if (if ((borrowAsset == idBStr))
992999 then (debt > tokensAmountB)
9931000 else false)
9941001 then (debt - tokensAmountB)
9951002 else 0
9961003 let exInv = if ((amountToGetEx > 0))
9971004 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
9981005 else nil
9991006 if ((exInv == exInv))
10001007 then {
10011008 let cBalAAfterRepay = accountBalance(idA)
10021009 if ((cBalAAfterRepay == cBalAAfterRepay))
10031010 then {
10041011 let cBalBAfterRepay = accountBalance(idB)
10051012 if ((cBalBAfterRepay == cBalBAfterRepay))
10061013 then {
10071014 let closeDbtInv = if ((debt > 0))
10081015 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
10091016 else 0
10101017 if ((closeDbtInv == closeDbtInv))
10111018 then if ((borrowAsset == idAStr))
10121019 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
10131020 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
10141021 else throw("Strict value is not equal to itself.")
10151022 }
10161023 else throw("Strict value is not equal to itself.")
10171024 }
10181025 else throw("Strict value is not equal to itself.")
10191026 }
10201027 else throw("Strict value is not equal to itself.")
10211028 }
10221029 else throw("Strict value is not equal to itself.")
10231030 }
10241031 else $Tuple2(tokensAmountA, tokensAmountB)
1025- let toUserA = $t02853829774._1
1026- let toUserB = $t02853829774._2
1032+ let toUserA = $t02872329959._1
1033+ let toUserB = $t02872329959._2
10271034 let poolTotalLoanEntries = if (isBorrowed)
10281035 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10291036 else nil
10301037 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))
10311038 $Tuple2(entries, [toUserA, toUserB])
10321039 }
10331040 else throw("Strict value is not equal to itself.")
10341041 }
10351042 else throw("Strict value is not equal to itself.")
10361043 }
10371044 else throw("Strict value is not equal to itself.")
10381045 }
10391046 else throw("Strict value is not equal to itself.")
10401047 }
10411048 else throw("Strict value is not equal to itself.")
10421049 }
10431050
10441051
10451052 func parseRequest (requestId) = {
10461053 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
10471054 let user = request[0]
10481055 let pool = request[1]
10491056 let pmtA = parseIntValue(request[2])
10501057 let AId = request[3]
10511058 let pmtB = parseIntValue(request[4])
10521059 let BId = request[5]
10531060 let balA = parseIntValue(request[6])
10541061 let balB = parseIntValue(request[7])
10551062 let shareId = request[8]
10561063 let bwAsset = request[9]
10571064 let bwAmount = parseIntValue(request[10])
10581065 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
10591066 }
10601067
10611068
10621069 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
10631070 then (borrowId != bId)
10641071 else false)
10651072 then throw("Wrong borrow asset")
10661073 else {
10671074 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
10681075 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
10691076 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10701077 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10711078 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1072- let $t03175631853 = if ((borrowId == aId))
1079+ let $t03194132038 = if ((borrowId == aId))
10731080 then $Tuple2(dPriceA, decPrA)
10741081 else $Tuple2(dPriceB, decPrB)
1075- let borrowPrice = $t03175631853._1
1076- let borrowDecPr = $t03175631853._2
1082+ let borrowPrice = $t03194132038._1
1083+ let borrowDecPr = $t03194132038._2
10771084 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10781085 }
10791086
10801087
10811088 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
10821089 then if ((assetIdToStr(pmts[0].assetId) != AId))
10831090 then throw("Wrong payment asset A")
10841091 else if ((assetIdToStr(pmts[1].assetId) != BId))
10851092 then throw("Wrong payment asset B")
10861093 else $Tuple2(pmts[0].amount, pmts[1].amount)
10871094 else if ((size(pmts) == 1))
10881095 then if ((assetIdToStr(pmts[0].assetId) == AId))
10891096 then $Tuple2(pmts[0].amount, 0)
10901097 else if ((assetIdToStr(pmts[0].assetId) == BId))
10911098 then $Tuple2(0, pmts[0].amount)
10921099 else throw("Wrong payment")
10931100 else throw("One or two payments expected")
10941101
10951102
10961103 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
10971104 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
10981105 if ((0 > pri))
10991106 then (pri * -1)
11001107 else pri
11011108 }
11021109
11031110
11041111 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1105- let $t03285333115 = if (claim)
1112+ let $t03303833300 = if (claim)
11061113 then claimFarmed(pType, pool)
11071114 else {
11081115 let claimedAsset = if ((pType == SF_POOL))
11091116 then SWOPID
11101117 else if ((pType == WX_POOL))
11111118 then WXID
11121119 else unknownPoolType()
11131120 $Tuple2(amount, claimedAsset)
11141121 }
1115- if (($t03285333115 == $t03285333115))
1122+ if (($t03303833300 == $t03303833300))
11161123 then {
1117- let claimAsset = $t03285333115._2
1118- let claimAmount = $t03285333115._1
1124+ let claimAsset = $t03303833300._2
1125+ let claimAmount = $t03303833300._1
11191126 let bal = accountBalance(claimAsset)
11201127 if ((bal == bal))
11211128 then if ((amount > bal))
11221129 then throw("To big amount to exchange")
11231130 else $Tuple2(claimAmount, claimAsset)
11241131 else throw("Strict value is not equal to itself.")
11251132 }
11261133 else throw("Strict value is not equal to itself.")
11271134 }
11281135
11291136
11301137 @Callable(i)
11311138 func getPoolInfoREADONLY (pool) = {
11321139 let poolAddr = addressFromStringValue(pool)
11331140 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1134- let $t03348233572 = getPoolData(Address(fromBase58String(pool)), pType)
1135- let AId = $t03348233572._1
1136- let BId = $t03348233572._2
1137- let balA = $t03348233572._3
1138- let balB = $t03348233572._4
1139- let shareId = $t03348233572._5
1141+ let $t03366733757 = getPoolData(Address(fromBase58String(pool)), pType)
1142+ let AId = $t03366733757._1
1143+ let BId = $t03366733757._2
1144+ let balA = $t03366733757._3
1145+ let balB = $t03366733757._4
1146+ let shareId = $t03366733757._5
11401147 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11411148 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11421149 }
11431150
11441151
11451152
11461153 @Callable(i)
11471154 func getShareAssetPriceREADONLY (shareId) = {
11481155 let sharePrices = getSharePrice(shareId)
11491156 $Tuple2(nil, sharePrices)
11501157 }
11511158
11521159
11531160
11541161 @Callable(i)
11551162 func getUserPositionShareAmountREADONLY (user,posNum) = {
11561163 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
11571164 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
11581165 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
11591166 $Tuple2(nil, userCanWithdraw)
11601167 }
11611168
11621169
11631170
11641171 @Callable(i)
11651172 func getUserPositionREADONLY (user,pools,posNum) = {
11661173 func userPos (a,pool) = {
1167- let $t03444534515 = a
1168- let wAmountsA = $t03444534515._1
1169- let wAmountsB = $t03444534515._2
1170- let debts = $t03444534515._3
1171- let eqWAmountsA = $t03444534515._4
1172- let eqWAmountsB = $t03444534515._5
1173- let index = $t03444534515._6
1174+ let $t03463034700 = a
1175+ let wAmountsA = $t03463034700._1
1176+ let wAmountsB = $t03463034700._2
1177+ let debts = $t03463034700._3
1178+ let eqWAmountsA = $t03463034700._4
1179+ let eqWAmountsB = $t03463034700._5
1180+ let index = $t03463034700._6
11741181 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
11751182 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
11761183 else {
11771184 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1178- let $t03479434884 = getPoolData(Address(fromBase58String(pool)), pType)
1179- let AId = $t03479434884._1
1180- let BId = $t03479434884._2
1181- let balA = $t03479434884._3
1182- let balB = $t03479434884._4
1183- let shareId = $t03479434884._5
1185+ let $t03497935069 = getPoolData(Address(fromBase58String(pool)), pType)
1186+ let AId = $t03497935069._1
1187+ let BId = $t03497935069._2
1188+ let balA = $t03497935069._3
1189+ let balB = $t03497935069._4
1190+ let shareId = $t03497935069._5
11841191 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
11851192 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1186- let $t03510035220 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1187- let wAmountA = $t03510035220._1
1188- let wAmountB = $t03510035220._2
1193+ let $t03528535405 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1194+ let wAmountA = $t03528535405._1
1195+ let wAmountB = $t03528535405._2
11891196 if ((borrowAmount > 0))
11901197 then {
11911198 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11921199 let debt = {
11931200 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
11941201 if ($isInstanceOf(@, "Int"))
11951202 then @
11961203 else throw(($getType(@) + " couldn't be cast to Int"))
11971204 }
11981205 if ((debt == debt))
11991206 then {
12001207 let amountToGetEx = if (if ((borrowAsset == AId))
12011208 then (debt > wAmountA)
12021209 else false)
12031210 then (debt - wAmountA)
12041211 else if (if ((borrowAsset == BId))
12051212 then (debt > wAmountB)
12061213 else false)
12071214 then (debt - wAmountB)
12081215 else 0
12091216 let amountToPay = if ((amountToGetEx > 0))
12101217 then if ((pType == SF_POOL))
12111218 then {
12121219 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12131220 ex._2
12141221 }
12151222 else if ((pType == WX_POOL))
12161223 then {
12171224 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12181225 ex._2
12191226 }
12201227 else unknownPoolType()
12211228 else 0
1222- let $t03613236351 = if ((borrowAsset == AId))
1229+ let $t03631736536 = if ((borrowAsset == AId))
12231230 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12241231 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1225- let eqWAmountA = $t03613236351._1
1226- let eqWAmountB = $t03613236351._2
1232+ let eqWAmountA = $t03631736536._1
1233+ let eqWAmountB = $t03631736536._2
12271234 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12281235 }
12291236 else throw("Strict value is not equal to itself.")
12301237 }
12311238 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
12321239 }
12331240 }
12341241
1235- let $t03660636717 = {
1242+ let $t03679136902 = {
12361243 let $l = pools
12371244 let $s = size($l)
12381245 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12391246 func $f0_1 ($a,$i) = if (($i >= $s))
12401247 then $a
12411248 else userPos($a, $l[$i])
12421249
12431250 func $f0_2 ($a,$i) = if (($i >= $s))
12441251 then $a
12451252 else throw("List size exceeds 20")
12461253
12471254 $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)
12481255 }
1249- let wAmountsA = $t03660636717._1
1250- let wAmountsB = $t03660636717._2
1251- let debts = $t03660636717._3
1252- let eqWAmountsA = $t03660636717._4
1253- let eqWAmountsB = $t03660636717._5
1256+ let wAmountsA = $t03679136902._1
1257+ let wAmountsB = $t03679136902._2
1258+ let debts = $t03679136902._3
1259+ let eqWAmountsA = $t03679136902._4
1260+ let eqWAmountsB = $t03679136902._5
12541261 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
12551262 }
12561263
12571264
12581265
12591266 @Callable(i)
12601267 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
12611268 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
12621269 if (!(isPoolActive(pool, pType)))
12631270 then throw("Pool not active at this moment")
12641271 else if (if ((100 > leverage))
12651272 then true
12661273 else (leverage > 300))
12671274 then throw("Leverage can't be <100 and >300")
12681275 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
12691276 then (leverage > 100)
12701277 else false)
12711278 then throw("You can't borrow in this pool")
12721279 else {
1273- let $t03731537405 = getPoolData(Address(fromBase58String(pool)), pType)
1274- let AId = $t03731537405._1
1275- let BId = $t03731537405._2
1276- let balA = $t03731537405._3
1277- let balB = $t03731537405._4
1278- let shareId = $t03731537405._5
1280+ let $t03750037590 = getPoolData(Address(fromBase58String(pool)), pType)
1281+ let AId = $t03750037590._1
1282+ let BId = $t03750037590._2
1283+ let balA = $t03750037590._3
1284+ let balB = $t03750037590._4
1285+ let shareId = $t03750037590._5
12791286 if (if ((borrowId != AId))
12801287 then (borrowId != BId)
12811288 else false)
12821289 then throw("Wrong borrow asset")
12831290 else {
1284- let $t03748637545 = parseReplenishPmts(i.payments, AId, BId)
1285- let pmtA = $t03748637545._1
1286- let pmtB = $t03748637545._2
1291+ let $t03767137730 = parseReplenishPmts(i.payments, AId, BId)
1292+ let pmtA = $t03767137730._1
1293+ let pmtB = $t03767137730._2
12871294 let user = toString(i.caller)
12881295 let newPosNum = getNewUserPositionNumber(user)
12891296 if ((leverage > 100))
12901297 then {
12911298 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
12921299 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
12931300 let newRequestId = {
12941301 let @ = invoke(this, "createNewRequest", [request], nil)
12951302 if ($isInstanceOf(@, "Int"))
12961303 then @
12971304 else throw(($getType(@) + " couldn't be cast to Int"))
12981305 }
12991306 if ((newRequestId == newRequestId))
13001307 then {
13011308 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
13021309 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
13031310 if ((inv == inv))
13041311 then {
13051312 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1306- let $t03853438628 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1307- if (($t03853438628 == $t03853438628))
1313+ let $t03871938813 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1314+ if (($t03871938813 == $t03871938813))
13081315 then {
1309- let newBalB = $t03853438628._2
1310- let newBalA = $t03853438628._1
1316+ let newBalB = $t03871938813._2
1317+ let newBalA = $t03871938813._1
13111318 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1312- let $t03869838813 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1313- let wAmountA = $t03869838813._1
1314- let wAmountB = $t03869838813._2
1319+ let $t03888338998 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1320+ let wAmountA = $t03888338998._1
1321+ let wAmountB = $t03888338998._2
13151322 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13161323 }
13171324 else throw("Strict value is not equal to itself.")
13181325 }
13191326 else throw("Strict value is not equal to itself.")
13201327 }
13211328 else throw("Strict value is not equal to itself.")
13221329 }
13231330 else {
1324- let $t03886638981 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1325- if (($t03886638981 == $t03886638981))
1331+ let $t03905139166 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1332+ if (($t03905139166 == $t03905139166))
13261333 then {
1327- let axlyFee = $t03886638981._2
1328- let userStaked = $t03886638981._1
1329- let $t03898739081 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1330- if (($t03898739081 == $t03898739081))
1334+ let axlyFee = $t03905139166._2
1335+ let userStaked = $t03905139166._1
1336+ let $t03917239266 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1337+ if (($t03917239266 == $t03917239266))
13311338 then {
1332- let newBalB = $t03898739081._2
1333- let newBalA = $t03898739081._1
1339+ let newBalB = $t03917239266._2
1340+ let newBalA = $t03917239266._1
13341341 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1335- let $t03915139266 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1336- let wAmountA = $t03915139266._1
1337- let wAmountB = $t03915139266._2
1342+ let $t03933639451 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1343+ let wAmountA = $t03933639451._1
1344+ let wAmountB = $t03933639451._2
13381345 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13391346 }
13401347 else throw("Strict value is not equal to itself.")
13411348 }
13421349 else throw("Strict value is not equal to itself.")
13431350 }
13441351 }
13451352 }
13461353 })
13471354
13481355
13491356
13501357 @Callable(i)
13511358 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
13521359 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
13531360 if (!(isPoolActive(pool, pType)))
13541361 then throw("Pool not active at this moment")
13551362 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
13561363 })
13571364
13581365
13591366
13601367 @Callable(i)
13611368 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
13621369 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
13631370 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
13641371 if (!(isPoolActive(poolId, pType)))
13651372 then throw("Pool not active at this moment")
13661373 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
13671374 then throw("There are no user position")
13681375 else if ((0 >= price))
13691376 then throw("Price must be greater than 0")
13701377 else if ((price > tokenOraclePrice))
13711378 then throw("Price must be less than current token price")
13721379 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
13731380 })
13741381
13751382
13761383
13771384 @Callable(i)
13781385 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
13791386 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
13801387 if (!(isPoolActive(poolId, pType)))
13811388 then throw("Pool not active at this moment")
13821389 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
13831390 then throw("No entry")
13841391 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
13851392 })
13861393
13871394
13881395
13891396 @Callable(i)
13901397 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
13911398 then throw("Already inited")
13921399 else if (!(isDefined(addressFromString(moneyBoxAddr))))
13931400 then throw("moneyBoxAddr is not correct address")
13941401 else if (!(isDefined(addressFromString(sfFarmingAddr))))
13951402 then throw("sfFarmingAddr is not correct address")
13961403 else if (!(isDefined(addressFromString(lendAddr))))
13971404 then throw("lendAddr is not correct address")
13981405 else if (!(isDefined(addressFromString(priceOracleAddr))))
13991406 then throw("priceOracleAddr is not correct address")
14001407 else if (!(isDefined(addressFromString(keeperExContract))))
14011408 then throw("keeperExContract is not correct address")
14021409 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
14031410 then throw("swopAssetId is not correct asset id")
14041411 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
14051412 then throw("swopAssetId is not correct asset id")
14061413 else if ((size(fromBase58String(operatorPubKey)) != 32))
14071414 then throw("operatorPubKey is not correct")
14081415 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
14091416 then throw("group1Admin1PubKey is not correct")
14101417 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
14111418 then throw("group1Admin2PubKey is not correct")
14121419 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
14131420 then throw("group2Admin1PubKey is not correct")
14141421 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
14151422 then throw("group2Admin2PubKey is not correct")
14161423 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)])
14171424
14181425
14191426
14201427 @Callable(i)
14211428 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
14221429 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
14231430 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
14241431 })
14251432
14261433
14271434
14281435 @Callable(i)
14291436 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1430- let $t04410544209 = parseRequest(requestId)
1431- let user = $t04410544209._1
1432- let pool = $t04410544209._2
1433- let pmtA = $t04410544209._3
1434- let AId = $t04410544209._4
1435- let pmtB = $t04410544209._5
1436- let BId = $t04410544209._6
1437- let balA = $t04410544209._7
1438- let balB = $t04410544209._8
1439- let shareId = $t04410544209._9
1440- let bwAsset = $t04410544209._10
1441- let bwAmount = $t04410544209._11
1437+ let $t04429044394 = parseRequest(requestId)
1438+ let user = $t04429044394._1
1439+ let pool = $t04429044394._2
1440+ let pmtA = $t04429044394._3
1441+ let AId = $t04429044394._4
1442+ let pmtB = $t04429044394._5
1443+ let BId = $t04429044394._6
1444+ let balA = $t04429044394._7
1445+ let balB = $t04429044394._8
1446+ let shareId = $t04429044394._9
1447+ let bwAsset = $t04429044394._10
1448+ let bwAmount = $t04429044394._11
14421449 if ((size(i.payments) != 1))
14431450 then throw("Wrong payment size")
14441451 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14451452 then true
14461453 else (i.payments[0].amount != bwAmount))
14471454 then throw("Wrong payment")
14481455 else {
1449- let $t04439944499 = if ((AId == bwAsset))
1456+ let $t04458444684 = if ((AId == bwAsset))
14501457 then $Tuple2((pmtA + bwAmount), pmtB)
14511458 else $Tuple2(pmtA, (pmtB + bwAmount))
1452- let pmtAllA = $t04439944499._1
1453- let pmtAllB = $t04439944499._2
1459+ let pmtAllA = $t04458444684._1
1460+ let pmtAllB = $t04458444684._2
14541461 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1455- let $t04458144696 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1456- let userStaked = $t04458144696._1
1457- let axlyFee = $t04458144696._2
1462+ let $t04476644881 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1463+ let userStaked = $t04476644881._1
1464+ let axlyFee = $t04476644881._2
14581465 let posNum = getNewUserPositionNumber(user)
14591466 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
14601467 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1461- let $t04505645171 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1462- let wAmountA = $t04505645171._1
1463- let wAmountB = $t04505645171._2
1468+ let $t04524145356 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1469+ let wAmountA = $t04524145356._1
1470+ let wAmountB = $t04524145356._2
14641471 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
14651472 }
14661473 }))
14671474
14681475
14691476
14701477 @Callable(i)
14711478 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
14721479 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
14731480 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1474- let $t04569245782 = getPoolData(Address(fromBase58String(pool)), pType)
1475- let AId = $t04569245782._1
1476- let BId = $t04569245782._2
1477- let balA = $t04569245782._3
1478- let balB = $t04569245782._4
1479- let shareId = $t04569245782._5
1481+ let $t04587745967 = getPoolData(Address(fromBase58String(pool)), pType)
1482+ let AId = $t04587745967._1
1483+ let BId = $t04587745967._2
1484+ let balA = $t04587745967._3
1485+ let balB = $t04587745967._4
1486+ let shareId = $t04587745967._5
14801487 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
14811488 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
14821489 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
14831490 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
14841491 if ((liquidateAmount > userCanWithdraw))
14851492 then throw("You can't liquidate more than user have")
14861493 else if ((borrowAmount == 0))
14871494 then throw("You can't liquidate position without borrow")
14881495 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))]
14891496 }))
14901497
14911498
14921499
14931500 @Callable(i)
14941501 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14951502 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14961503 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
14971504 if ((tokenOraclePrice > stopLossPrice))
14981505 then throw("Token price greater stop loss price")
14991506 else {
15001507 let res = withdrawToUser(user, pool, toString(posId), true)
15011508 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
15021509 }
15031510 }))
15041511
15051512
15061513
15071514 @Callable(i)
15081515 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15091516 let pType = getStringValue(this, (kPool + pool))
15101517 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1511- let $t04775247854 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1512- if (($t04775247854 == $t04775247854))
1518+ let $t04793748039 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1519+ if (($t04793748039 == $t04793748039))
15131520 then {
1514- let claimedAsset = $t04775247854._2
1515- let claimedAmount = $t04775247854._1
1521+ let claimedAsset = $t04793748039._2
1522+ let claimedAmount = $t04793748039._1
15161523 let rArgs = split(route, "__")
15171524 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15181525 then directSwopfiCPMM(rArgs, tokenToId)
15191526 else if ((rArgs[0] == "routingSwopfi"))
15201527 then directRoutingSwopfi(rArgs, tokenToId)
15211528 else throw("Wrong route")
15221529 if ((exchangedAmount == exchangedAmount))
15231530 then {
15241531 let newChange = ((claimedAmount + change) - amountToExchange)
15251532 let changeEntry = if ((newChange >= 0))
15261533 then [IntegerEntry((pool + kPoolCapChange), newChange)]
15271534 else nil
15281535 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
15291536 }
15301537 else throw("Strict value is not equal to itself.")
15311538 }
15321539 else throw("Strict value is not equal to itself.")
15331540 }))
15341541
15351542
15361543
15371544 @Callable(i)
15381545 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15391546 let pType = getStringValue(this, (kPool + pool))
1540- let $t04853848636 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1541- if (($t04853848636 == $t04853848636))
1547+ let $t04872348821 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1548+ if (($t04872348821 == $t04872348821))
15421549 then {
1543- let claimedAsset = $t04853848636._2
1544- let claimedAmount = $t04853848636._1
1550+ let claimedAsset = $t04872348821._2
1551+ let claimedAmount = $t04872348821._1
15451552 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15461553 }
15471554 else throw("Strict value is not equal to itself.")
15481555 }))
15491556
15501557
15511558
15521559 @Callable(i)
15531560 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
15541561 then (type != WX_POOL)
15551562 else false)
15561563 then throw("Wrong type")
15571564 else if (if ((poolType != CPMM))
15581565 then (poolType != FLAT)
15591566 else false)
15601567 then throw("Wrong pool type")
15611568 else {
1562- let $t04915749251 = getPoolData(Address(fromBase58String(poolAddr)), type)
1563- let aId = $t04915749251._1
1564- let bId = $t04915749251._2
1565- let aBal = $t04915749251._3
1566- let bBal = $t04915749251._4
1567- let shareId = $t04915749251._5
1569+ let $t04934249436 = getPoolData(Address(fromBase58String(poolAddr)), type)
1570+ let aId = $t04934249436._1
1571+ let bId = $t04934249436._2
1572+ let aBal = $t04934249436._3
1573+ let bBal = $t04934249436._4
1574+ let shareId = $t04934249436._5
15681575 if ((0 > inFeeNoLoan))
15691576 then throw("inFeeNoLoan must be greater than 0")
15701577 else if ((0 > inFeeLoan))
15711578 then throw("inFeeLoan must be greater than 0")
15721579 else if ((0 > capFeeNoLoan))
15731580 then throw("capFeeNoLoan must be greater than 0")
15741581 else if ((0 > capFeeWithLoan))
15751582 then throw("capFeeWithLoan must be greater than 0")
15761583 else if ((0 > stoplossFeeNoLoan))
15771584 then throw("stoplossFeeNoLoan must be greater than 0")
15781585 else if ((0 > stoplossFeeWithLoan))
15791586 then throw("stoplossFeeWithLoan must be greater than 0")
1580- 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((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
1587+ 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)]
15811588 }))
15821589
15831590
15841591
15851592 @Callable(i)
15861593 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
15871594 then throw(("Can't find pool with addr " + poolAddr))
15881595 else if ((0 > inFeeNoLoan))
15891596 then throw("inFeeNoLoan must be greater than 0")
15901597 else if ((0 > inFeeLoan))
15911598 then throw("inFeeLoan must be greater than 0")
15921599 else if ((0 > capFeeNoLoan))
15931600 then throw("capFeeNoLoan must be greater than 0")
15941601 else if ((0 > capFeeWithLoan))
15951602 then throw("capFeeWithLoan must be greater than 0")
15961603 else if ((0 > stoplossFeeNoLoan))
15971604 then throw("stoplossFeeNoLoan must be greater than 0")
15981605 else if ((0 > stoplossFeeWithLoan))
15991606 then throw("stoplossFeeWithLoan must be greater than 0")
16001607 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)]))
16011608
16021609
16031610
16041611 @Callable(i)
16051612 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
16061613 then throw("dApp already active")
16071614 else [BooleanEntry(kActive, true)])
16081615
16091616
16101617
16111618 @Callable(i)
16121619 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
16131620 then throw("dApp already shutdown")
16141621 else [BooleanEntry(kActive, false)])
16151622
16161623
16171624
16181625 @Callable(i)
16191626 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
16201627 then throw("dApp already active for users")
16211628 else [BooleanEntry(kActiveUsers, true)])
16221629
16231630
16241631
16251632 @Callable(i)
16261633 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
16271634 then throw("dApp already shutdown for users")
16281635 else [BooleanEntry(kActiveUsers, false)])
16291636
16301637
16311638
16321639 @Callable(i)
16331640 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
16341641 then throw("SWOPFI already active")
16351642 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
16361643
16371644
16381645
16391646 @Callable(i)
16401647 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
16411648 then throw("SWOPFI already shutdown")
16421649 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
16431650
16441651
16451652
16461653 @Callable(i)
16471654 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
16481655 then throw("WX already active")
16491656 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
16501657
16511658
16521659
16531660 @Callable(i)
16541661 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
16551662 then throw("WX already shutdown")
16561663 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
16571664
16581665
16591666
16601667 @Callable(i)
16611668 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16621669 then throw("Unknown pool")
16631670 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
16641671 then throw("Pool already active")
16651672 else [BooleanEntry((pool + kPoolActive), true)])
16661673
16671674
16681675
16691676 @Callable(i)
16701677 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
16711678 then throw("Unknown pool")
16721679 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
16731680 then throw("Pool already shutdown")
16741681 else [BooleanEntry((pool + kPoolActive), false)])
16751682
16761683

github/deemru/w8io/026f985 
293.83 ms