tx · 4UTFAedCYskK15BEPCtDcX6UhYyJtqYyvd5fe3NAzfPH

3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS:  -0.54000000 Waves

2023.10.19 11:00 [2805184] smart account 3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS > SELF 0.00000000 Waves

{ "type": 13, "id": "4UTFAedCYskK15BEPCtDcX6UhYyJtqYyvd5fe3NAzfPH", "fee": 54000000, "feeAssetId": null, "timestamp": 1697702449947, "version": 2, "chainId": 84, "sender": "3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS", "senderPublicKey": "HP8sssVq1866F7CaPQJwgFrt6fsqhQjKwM84cL1wjD2a", "proofs": [ "4FctnhhHeUuooEF79MvFHhx2MPNoSKEzkRfgVjDfLtddJL58kkzqE9Lmo9RwBUhqPX9JqxNExcbnHN586P98iLM4" ], "script": "base64:BgKiAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEgcKBQgICAEEEgUKAwgEARIMCgoICAgBAQEBAQEEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCIUBAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gABENQTU0CBGNwbW0ABEZMQVQCBGZsYXQAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4AFFNUT1BMT1NTX0ZFRV9OT19MT0FOAg5zdG9wTG9zc05vTG9hbgANU1RPUExPU1NfTE9BTgIMc3RvcExvc3NMb2FuAAhMT0FOX0ZFRQIEbG9hbgALTk9fTE9BTl9GRUUCBm5vTG9hbgAGTk9fRkVFAgVub0ZlZQAGU0NBTEU4AIDC1y8AB1NDQUxFMTAAgMivoCUAB1NDQUxFMTYJALYCAQCAgIT+pt7hEQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQAEmtTRlBvb2xTaGFyZVN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AAprU0ZQb29sRmVlAgpjb21taXNzaW9uAA1rVXNlclBvc2l0aW9uAg1fdXNlclBvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAIRX3VzZXJQb3NpdGlvblBvb2wAEWtVc2VyQm9ycm93QW1vdW50AhlfdXNlclBvc2l0aW9uQm9ycm93QW1vdW50ABJrVXNlckJvcnJvd0Fzc2V0SWQCGl91c2VyUG9zaXRpb25Cb3Jyb3dBc3NldElkABBrVXNlclBvc2l0aW9uTnVtAhNfdXNlclBvc2l0aW9uTnVtYmVyABVrVXNlclBvc2l0aW9uSW50ZXJlc3QCFV91c2VyUG9zaXRpb25JbnRlcmVzdAAKa1Bvb2xUb3RhbAIKX3Bvb2xUb3RhbAAOa1Bvb2xUb3RhbExvYW4CDl9wb29sVG90YWxMb2FuABFrUG9vbEludGVyZXN0TG9hbgIRX3Bvb2xJbnRlcmVzdExvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CE19wb29sSW50ZXJlc3ROb0xvYW4ADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAJa1Bvb2xUeXBlAglfcG9vbFR5cGUACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCF19mYWxsYmFja0V4Y2hhbmdlU3dvcGZpAAlrTW9uZXlCb3gCDmF4bHlfbW9uZXlfYm94AA5rU0ZGYXJtaW5nQWRkcgITc3dvcGZpX2Zhcm1pbmdfYWRkcgAMa0xlbmRTZXJ2aWNlAhFsZW5kX3NlcnZpY2VfYWRkcgAPa09wZXJhdG9yQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlAAtrRXhDb250cmFjdAIRZXhjaGFuZ2VfY29udHJhY3QAD2tXeFN3YXBDb250cmFjdAIQd3hfc3dhcF9jb250cmFjdAAHa1N3b3BJZAIHc3dvcF9pZAAFa1d4SWQCBXd4X2lkAA9rR3JvdXAxQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAPa0dyb3VwMUFkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkAD2tHcm91cDJBZG1pbjFQSwIVZ3JvdXAyX2FkbWluMV9wdWJfa2V5AA9rR3JvdXAyQWRtaW4yUEsCFWdyb3VwMl9hZG1pbjJfcHViX2tleQAIbW9uZXlCb3gJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwULa0V4Q29udHJhY3QCHE5vIGV4Y2hhbmdlIGNvbnRyYWN0IGFkZHJlc3MAD3ByaWNlT3JhY2xlQWRkcgkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrUHJpY2VPcmFjbGUCF05vIHByaWNlIG9yYWNsZSBhZGRyZXNzAA53eFN3YXBDb250cmFjdAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGU1dPUElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQdrU3dvcElkAgpObyBzd29wIGlkAARXWElECQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQVrV3hJZAIITm8gd3ggaWQADmdyb3VwMUFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAxQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4xUEsADmdyb3VwMUFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAxQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4yUEsADmdyb3VwMkFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsADmdyb3VwMkFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsBD3Vua25vd25Qb29sVHlwZQAJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldExlbmRTcnZBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrTGVuZFNlcnZpY2UCG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgEOaXNPcGVyYXRvckNhbGwBAWkDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBQR1bml0CQACAQIkT25seSBvcGVyYXRvciBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQtpc0FkbWluQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjFQSwYJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMlBLBQR1bml0CQACAQIoT25seSBhZG1pbiBncm91cDEgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgkBDmdldExlbmRTcnZBZGRyAAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQhpc0FjdGl2ZQADCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgYFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50ARBpc0FjdGl2ZUZvclVzZXJzAAMDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGBgcFBHVuaXQJAAIBAilEQXBwIGlzIGluYWN0aXZlIGZvciB1c2VycyBhdCB0aGlzIG1vbWVudAEMaXNQb29sQWN0aXZlAgRwb29sBHR5cGUECldYU0ZBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQR0eXBlBQtrQWN0aXZlU0ZXWAYECnBvb2xBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYDAwUKV1hTRkFjdGl2ZQUKcG9vbEFjdGl2ZQcGBwEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBEWdldFNGUG9vbEJhbGFuY2VzAQhwb29sQWRkcgkAlAoCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xBQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEJBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEIgYXNzZXQgYmFsYW5jZQERZ2V0V1hQb29sQmFsYW5jZXMDCHBvb2xBZGRyA2FJZANiSWQJAJQKAgoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYUlkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2JJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQ9nZXRQb29sQmFsYW5jZXMECHBvb2xBZGRyBHR5cGUDYUlkA2JJZAMJAAACBQR0eXBlBQdTRl9QT09MCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQJAQ91bmtub3duUG9vbFR5cGUAAQ1nZXRTRlBvb2xEYXRhAQhwb29sQWRkcgQLJHQwODA4OTgxMzgJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFCyR0MDgwODk4MTM4BQskdDA4MDg5ODEzOAQEYmFsQggFCyR0MDgwODk4MTM4Al8yBARiYWxBCAULJHQwODA4OTgxMzgCXzEJAJcKBQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQUFzc2V0SWQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEJBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBQRiYWxBBQRiYWxCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFDmtTRlBvb2xTaGFyZUlkAhhDYW4ndCBnZXQgc2hhcmUgYXNzZXQgaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldFdYUG9vbERhdGEBCHBvb2xBZGRyBANjZmcKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDY2ZnBQNjZmcEA2FJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQEA2JJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABQMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQEB3NoYXJlSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAMDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhpDYW4ndCBnZXQgcG9vbCBMUCBhc3NldCBpZAQLJHQwODgzNTg4OTQJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAMJAAACBQskdDA4ODM1ODg5NAULJHQwODgzNTg4OTQEBGJhbEIIBQskdDA4ODM1ODg5NAJfMgQEYmFsQQgFCyR0MDg4MzU4ODk0Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BCQDNCAIFAWEFCmFzc2V0UHJpY2UKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sAiBDYW4ndCBmaW5kIHBvb2wgYWRkciBieSBzaGFyZSBpZAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMTE4ODMxMTk0OAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQ0kdDAxMTg4MzExOTQ4Al8xBANiSWQIBQ0kdDAxMTg4MzExOTQ4Al8yBAhhQmFsYW5jZQgFDSR0MDExODgzMTE5NDgCXzMECGJCYWxhbmNlCAUNJHQwMTE4ODMxMTk0OAJfNAQGcHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQHZFByaWNlQQkAkQMCBQZwcmljZXMAAAQHZFByaWNlQgkAkQMCBQZwcmljZXMAAQMDCQBmAgAABQdkUHJpY2VBBgkAZgIAAAUHZFByaWNlQgD///////////8BBAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkBApBUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQKQlByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2JJZAAAAAAFBERPV04EDnNoYXJlUHJlY2lzaW9uCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHc2hhcmVJZAAAAAAFBERPV04EA3N1bQkAZAIJAGsDBQhhQmFsYW5jZQUHZFByaWNlQQUKQVByZWNpc2lvbgkAawMFCGJCYWxhbmNlBQdkUHJpY2VCBQpCUHJlY2lzaW9uCQBrAwUDc3VtBQ5zaGFyZVByZWNpc2lvbgULc2hhcmVTdXBwbHkBDmdldFNoYXJlUHJpY2VzAQhzaGFyZUlkcwoBCWdldFByaWNlcwIBYQdzaGFyZUlkCQDNCAIFAWEJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAoAAiRsBQhzaGFyZUlkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZ2V0UHJpY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQBDmdldEN1cnNFbnRyaWVzBANhSWQDYklkB3NoYXJlSWQId0Ftb3VudHMEDGFzc2V0c1ByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwECnNoYXJlUHJpY2UJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAQGcHJpY2VzCQDOCAIJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwAACQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAQkAzAgCCQCkAwEFCnNoYXJlUHJpY2UFA25pbAUId0Ftb3VudHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1Rva2VuTGFzdFByaWNlCQC5CQIFBnByaWNlcwIBLAUDbmlsARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBXBUeXBlCHBvb2xBZGRyBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQEcmVwbAoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAiBjYWxjTFBSZXBsZW5pc2hUd29Ub2tlbnNSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUEcG10QQkAzAgCCQCkAwEFBHBtdEIFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFBHJlcGwFBHJlcGwJAJcKBQoAAUAJAJEDAgUEcmVwbAADAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAAEAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUEcmVwbAABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkBDGFzc2V0SWRUb1N0cgEJAJEDAgUEcmVwbAACCgABQAkAkQMCBQRyZXBsAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBA0kdDAxMzQ5MjEzNzQyCQCUCgIJALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICIGV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBHBtdEEFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18JALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICH2V2YWx1YXRlUHV0QnlQcmljZUFzc2V0UkVBRE9OTFkJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxMzQ5MjEzNzQyBQ0kdDAxMzQ5MjEzNzQyBApldmFsUHV0SW5CCAUNJHQwMTM0OTIxMzc0MgJfMgQKZXZhbFB1dEluQQgFDSR0MDEzNDkyMTM3NDICXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUGCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYUlkBQRwbXRBCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNiSWQFBHBtdEIFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMJAMwIAgkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAUIcG9vbEFkZHICA3B1dAkAzAgCAMCEPQkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBAhwb29sQWRkcgVwVHlwZQNwbXQFcG10SWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQVwbXRJZAUDcG10BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhVyZXBsZW5pc2hXaXRoT25lVG9rZW4JAMwIAgkAzAgCAgEwCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZmMDCQAAAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKUIAQUIcG9vbEFkZHIFCWtQb29sVHlwZQIEY3BtbQUERkxBVAILcHV0T25lVGtuVjICCXB1dE9uZVRrbgkA/AcEBQhwb29sQWRkcgUCZmMJAMwIAgAACQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEHc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgVzdGFrZQUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABCXVuc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQNJHQwMTU1MjAxNTg3MAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE1NTIwMTU4NzACXzEEBWZOYW1lCAUNJHQwMTU1MjAxNTg3MAJfMgQGcGFyYW1zCAUNJHQwMTU1MjAxNTg3MAJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxNjI5MjE2NTk4AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE2MjkyMTY1OTgCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNjI5MjE2NTk4Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAxNzMzODE3Mzc3CQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAxNzMzODE3Mzc3Al8xBAVwckZlZQgFDSR0MDE3MzM4MTczNzcCXzIECGZlZVNjYWxlCQC2AgEAgMLXLwQNJHQwMTc0MTcxNzcyNQMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEIJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxBCQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTc0MTcxNzcyNQJfMQQKYXNzZXRUb1BheQgFDSR0MDE3NDE3MTc3MjUCXzIEEmFtb3VudFRvUGF5V2l0aEZlZQkAoAMBCQC9AgQJALYCAQULYW1vdW50VG9QYXkFCGZlZVNjYWxlCQC4AgIFCGZlZVNjYWxlCQC2AgEJAGQCBQVwckZlZQUEcEZlZQUHQ0VJTElORwkAlAoCBQphc3NldFRvUGF5BRJhbW91bnRUb1BheVdpdGhGZWUBEGV4Y2hhbmdlRGlyZWN0bHkIBXBUeXBlBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAZwb29sRkIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBRdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIAAwMJAAACBQVwVHlwZQUHU0ZfUE9PTAYJAQIhPQIFBnBvb2xGQgIABA0kdDAxODE2NjE4Mzc4AwkAAAIFBnBvb2xGQgIACQCVCgMFBGJhbEEFBGJhbEIFBHBvb2wEDSR0MDE4MjcyMTgzNDUJARFnZXRTRlBvb2xCYWxhbmNlcwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBnBvb2xGQgQGc2ZCYWxBCAUNJHQwMTgyNzIxODM0NQJfMQQGc2ZCYWxCCAUNJHQwMTgyNzIxODM0NQJfMgkAlQoDBQZzZkJhbEEFBnNmQmFsQgUGcG9vbEZCBAVwQmFsQQgFDSR0MDE4MTY2MTgzNzgCXzEEBXBCYWxCCAUNJHQwMTgxNjYxODM3OAJfMgQGZXhQb29sCAUNJHQwMTgxNjYxODM3OAJfMwQNJHQwMTgzODMxODUwOQkBEWNhbGNBbW91bnRUb1BheVNGBwUGZXhQb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBXBCYWxBBQVwQmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTgzODMxODUwOQJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxODM4MzE4NTA5Al8yCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmV4UG9vbAIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgkApAMBBRBhbW91bnRUb2tlblRvR2V0BQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTg3MTExODgzMwkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAxODcxMTE4ODMzAl8xBAthbW91bnRUb1BheQgFDSR0MDE4NzExMTg4MzMCXzIJAPwHBAUOd3hTd2FwQ29udHJhY3QCBHN3YXAJAMwIAgUQYW1vdW50VG9rZW5Ub0dldAkAzAgCBQ9hc3NldFRva2VuVG9HZXQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwJAQ91bmtub3duUG9vbFR5cGUAARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQIcG9vbEFkZHIFcFR5cGUHc2hhcmVJZA91c2VyQ2FuV2l0aGRyYXcEDSR0MDE5MTIwMjAzMzQDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgoAAUAJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhB3aXRoZHJhd1JFQURPTkxZCQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQlrUG9vbFR5cGUCBGNwbW0FBEZMQVQEA2ludgkA/AcEBQhwb29sQWRkcgIjZXN0aW1hdGVHZXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJAMwIAgUHc2hhcmVJZAkAzAgCBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BA0kdDAxOTU5MjIwMDg5BAckbWF0Y2gwBQNpbnYDAwMJAAECCAUHJG1hdGNoMAJfMQIDSW50AwkAAQIIBQckbWF0Y2gwAl8yAgNJbnQDCQABAggFByRtYXRjaDACXzUCA0ludAMJAAECCAUHJG1hdGNoMAJfNgIDSW50AwkAAQIIBQckbWF0Y2gwAl83AgNJbnQDCQABAggFByRtYXRjaDACXzgCBlN0cmluZwkAAQIIBQckbWF0Y2gwAl85AgZTdHJpbmcHBwcHBwcJAAACCQDGCgEFByRtYXRjaDAACgcECG91dEFtQW10CAUHJG1hdGNoMAJfMQQIb3V0UHJBbXQIBQckbWF0Y2gwAl8yBAlhbUJhbGFuY2UIBQckbWF0Y2gwAl81BAlwckJhbGFuY2UIBQckbWF0Y2gwAl82BApscEVtaXNzaW9uCAUHJG1hdGNoMAJfNwQIY3VyUHJpY2UIBQckbWF0Y2gwAl84BApwb29sU3RhdHVzCAUHJG1hdGNoMAJfOQkAmQoHBQhvdXRBbUFtdAUIb3V0UHJBbXQFCWFtQmFsYW5jZQUJcHJCYWxhbmNlBQpscEVtaXNzaW9uBQhjdXJQcmljZQUKcG9vbFN0YXR1cwkAAgECE0NvdWxkbid0IGNhc3QgdHlwZXMECG91dEFtQW10CAUNJHQwMTk1OTIyMDA4OQJfMQQIb3V0UHJBbXQIBQ0kdDAxOTU5MjIwMDg5Al8yBAlhbUJhbGFuY2UIBQ0kdDAxOTU5MjIwMDg5Al8zBAlwckJhbGFuY2UIBQ0kdDAxOTU5MjIwMDg5Al80BApscEVtaXNzaW9uCAUNJHQwMTk1OTIyMDA4OQJfNQQIY3VyUHJpY2UIBQ0kdDAxOTU5MjIwMDg5Al82BApwb29sU3RhdHVzCAUNJHQwMTk1OTIyMDA4OQJfNwkAlAoCBQhvdXRBbUFtdAUIb3V0UHJBbXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EA2ludgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgITZXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAxOTEyMDIwMzM0Al8xBAdhbW91bnRCCAUNJHQwMTkxMjAyMDMzNAJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDIwNzAyMjA3ODEJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjA3MDIyMDc4MQJfMQQDYklkCAUNJHQwMjA3MDIyMDc4MQJfMgQEYUJhbAgFDSR0MDIwNzAyMjA3ODECXzMEBGJCYWwIBQ0kdDAyMDcwMjIwNzgxAl80BARscElkCAUNJHQwMjA3MDIyMDc4MQJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgdjbGFpbVd4CQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABD3JlcGxlbmlzaEJ5VHlwZQoFcFR5cGUEcG9vbAdmZWVUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgRMUElkBA9scEJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAMJAAACBQ9scEJhbGFuY2VCZWZvcmUFD2xwQmFsYW5jZUJlZm9yZQQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEDSR0MDIxMzc5MjE3OTUDAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDIxNDQ1MjE1NjEJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBQVwVHlwZQUIcG9vbEFkZHIFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAyMTQ0NTIxNTYxAl8xBAZwbXRJbkIIBQ0kdDAyMTQ0NTIxNTYxAl8yBAZjaGFuZ2UIBQ0kdDAyMTQ0NTIxNTYxAl8zBAhjaGFuZ2VJZAgFDSR0MDIxNDQ1MjE1NjECXzQEA2ludgkBGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYFCHBvb2xBZGRyBQVwVHlwZQUGcG10SW5BBQNhSWQFBnBtdEluQgUDYklkAwkAAAIFA2ludgUDaW52CQCUCgIFBmNoYW5nZQUIY2hhbmdlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcG10QQAACQCUCgIFBHBtdEEFA2FJZAMJAGYCBQRwbXRCAAAJAJQKAgUEcG10QgUDYklkCQACAQIQcG10cyBtdXN0IGJlID4gMAQGY2hhbmdlCAUNJHQwMjEzNzkyMTc5NQJfMQQIY2hhbmdlSWQIBQ0kdDAyMTM3OTIxNzk1Al8yBANpbnYDCQBmAgUGY2hhbmdlAAAJARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQFCHBvb2xBZGRyBQVwVHlwZQUGY2hhbmdlBQhjaGFuZ2VJZAUDbmlsAwkAAAIFA2ludgUDaW52BA5scEJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkBAt0b3RhbFN0YWtlZAkAZQIFDmxwQmFsYW5jZUFmdGVyBQ9scEJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBAVpbnZMUAkBB3N0YWtlTFAEBQRwb29sBQVwVHlwZQUETFBJZAURdXNlclNoYXJlRm9yU3Rha2UDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCARwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbgQLdG90YWxBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3RvdGFsQW1vdW50TG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBA0kdDAyMjY1MjIyODkwAwUId2l0aExvYW4JAJQKAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAZAIFD3RvdGFsQW1vdW50TG9hbgUMc3Rha2VkQW1vdW50CQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgUPdG90YWxBbW91bnRMb2FuBA9jdXJQb29sSW50ZXJlc3QIBQ0kdDAyMjY1MjIyODkwAl8xBBN0b3RhbFN0YWtlZFdpdGhMb2FuCAUNJHQwMjI2NTIyMjg5MAJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgUTdG90YWxTdGFrZWRXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBCWxpc3RUb0ludAIBYQRpdGVtCQDNCAIFAWEJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQEQZGlyZWN0U3dvcGZpQ1BNTQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEC21pblRvUmVjaXZlCQCRAwIFBXJBcmdzAAMEA2ludgkA/AcEBQRkQXBwAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBQNuaWwFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZGlyZWN0Um91dGluZ1N3b3BmaQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQEYXJncwQFZUFyZ3MJALUJAgkAkQMCBQVyQXJncwADAgF8BApleGNoYW5nZXJzCQC1CQIJAJEDAgUFZUFyZ3MAAAIBLAQOZXhjaGFuZ2Vyc1R5cGUJALUJAgkAkQMCBQVlQXJncwABAgEsBAVhcmdzMQoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAgIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAVhcmdzMgoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBBFyb3V0aW5nQXNzZXRzS2V5cwkAtQkCCQCRAwIFBWVBcmdzAAQCASwEC21pblRvUmVjaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFZUFyZ3MABQkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFC21pblRvUmVjaXZlBQNuaWwEA2ludgkA/AcEBQRkQXBwAgxyb3V0aW5nVHJhZGUFBGFyZ3MFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQQEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDI0OTk3MjUwNjMJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwMjQ5OTcyNTA2MwJfMQQDQklkCAUNJHQwMjQ5OTcyNTA2MwJfMgQEYmFsQQgFDSR0MDI0OTk3MjUwNjMCXzMEBGJhbEIIBQ0kdDAyNDk5NzI1MDYzAl80BAdzaGFyZUlkCAUNJHQwMjQ5OTcyNTA2MwJfNQMDCQECIT0CBQd0b2tlbklkBQNBSWQJAQIhPQIFB3Rva2VuSWQFA0JJZAcJAAIBAgtXcm9uZyBhc3NldAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAMJAAACBRB0b3RhbFNoYXJlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3Rva2VuQW1vdW50CQDZBAEFB3Rva2VuSWQFA25pbAQYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEC2xvYW5QZXJjZW50CQBrAwUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQZTQ0FMRTgFEHRvdGFsU2hhcmVBbW91bnQEEHRva2Vuc0ZvckZlZUxvYW4JAGsDBQt0b2tlbkFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQSdG9rZW5zRm9yRmVlTm9Mb2FuCQBlAgULdG9rZW5BbW91bnQFEHRva2Vuc0ZvckZlZUxvYW4EC2F4bHlGZWVMb2FuCQBrAwUQdG9rZW5zRm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlGZWVOb0xvYW4JAGsDBRJ0b2tlbnNGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BAdheGx5RmVlCQBkAgULYXhseUZlZUxvYW4FDWF4bHlGZWVOb0xvYW4EDSR0MDI1ODA4MjU5MDgDCQAAAgUHdG9rZW5JZAUDQUlkCQCUCgIJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQAACQCUCgIAAAkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlBARwbXRBCAUNJHQwMjU4MDgyNTkwOAJfMQQEcG10QggFDSR0MDI1ODA4MjU5MDgCXzIEDSR0MDI1OTExMjYwMTUJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQMc3Rha2VkQW1vdW50CAUNJHQwMjU5MTEyNjAxNQJfMQQCbmYIBQ0kdDAyNTkxMTI2MDE1Al8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABApzdGFrZWRMb2FuCQBrAwUMc3Rha2VkQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BAxzdGFrZWROb0xvYW4JAGUCBQxzdGFrZWRBbW91bnQFCnN0YWtlZExvYW4ED25ld0ludGVyZXN0TG9hbgMJAGYCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFE2N1clBvb2xJbnRlcmVzdExvYW4JAGsDBQpzdGFrZWRMb2FuBQdTQ0FMRTEwBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAQRbmV3SW50ZXJlc3ROb0xvYW4DCQBmAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuBQdTQ0FMRTEwCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgUPbmV3SW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FEW5ld0ludGVyZXN0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBRB0b3RhbFNoYXJlQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGQCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4FCnN0YWtlZExvYW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFB2F4bHlGZWUJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuSWQFA25pbAkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQFA25pbAEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ9jYWxjU3RvcExvc3NGZWUEBHBvb2wKaXNCb3Jyb3dlZAhzdG9wTG9zcwpscFdpdGhkcmF3BAdmZWVUeXBlAwUKaXNCb3Jyb3dlZAUNU1RPUExPU1NfTE9BTgUUU1RPUExPU1NfRkVFX05PX0xPQU4DBQhzdG9wTG9zcwkAawMFCmxwV2l0aGRyYXcJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgAAAQ53aXRoZHJhd1RvVXNlcgQEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAyODU0NDI4NjE2CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDI4NTQ0Mjg2MTYCXzEEBmlkQlN0cggFDSR0MDI4NTQ0Mjg2MTYCXzIEBGJhbEEIBQ0kdDAyODU0NDI4NjE2Al8zBARiYWxCCAUNJHQwMjg1NDQyODYxNgJfNAQHc2hhcmVJZAgFDSR0MDI4NTQ0Mjg2MTYCXzUEDSR0MDI4NjE5Mjg2ODYJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDI4NjE5Mjg2ODYCXzEEA2lkQggFDSR0MDI4NjE5Mjg2ODYCXzIEC3N0b3BMb3NzRmVlCQEPY2FsY1N0b3BMb3NzRmVlBAUEcG9vbAUKaXNCb3Jyb3dlZAUIc3RvcExvc3MFD3VzZXJDYW5XaXRoZHJhdwQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQBkAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDAyOTM4MTI5NDcwCQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwMjkzODEyOTQ3MAJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDI5MzgxMjk0NzACXzIEDSR0MDI5NDczMzA3MDkDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDAyOTQ3MzMwNzA5Al8xBAd0b1VzZXJCCAUNJHQwMjk0NzMzMDcwOQJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkAZQIFEnBvb2xUb3RhbFNoYXJlTG9hbgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUDbmlsBQNuaWwEB2VudHJpZXMJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJBBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFB3RvVXNlckIFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFB3RvVXNlckEJAMwIAgUHdG9Vc2VyQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoJAJ0KCwUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQHZFByaWNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUEB2RQcmljZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDAzMjY5MTMyNzg4AwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDAzMjY5MTMyNzg4Al8xBAtib3Jyb3dEZWNQcggFDSR0MDMyNjkxMzI3ODgCXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UBEnBhcnNlUmVwbGVuaXNoUG10cwMEcG10cwNBSWQDQklkAwkAAAIJAJADAQUEcG10cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEEDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwABB2Fzc2V0SWQFA0JJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQgkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50CAkAkQMCBQRwbXRzAAEGYW1vdW50AwkAAAIJAJADAQUEcG10cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQAAAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0JJZAkAlAoCAAAICQCRAwIFBHBtdHMAAAZhbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAEPY2FsY1ByaWNlSW1wYWN0BARiYWxBBGJhbEIHbmV3QmFsQQduZXdCYWxCBANwcmkJAGgCCQBlAgUGU0NBTEU4CQBrAwkAawMFBGJhbEIFBlNDQUxFOAUEYmFsQQUGU0NBTEU4CQBrAwUHbmV3QmFsQgUGU0NBTEU4BQduZXdCYWxBAGQDCQBmAgAABQNwcmkJAGgCBQNwcmkA////////////AQUDcHJpARFjbGFpbUFuZENoZWNrQW1udAUEcG9vbAVwVHlwZQVjbGFpbQZhbW91bnQGY2hhbmdlBA0kdDAzMzc4ODM0MDUwAwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBXBUeXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wFBlNXT1BJRAMJAAACBQVwVHlwZQUHV1hfUE9PTAUEV1hJRAkBD3Vua25vd25Qb29sVHlwZQAJAJQKAgUGYW1vdW50BQxjbGFpbWVkQXNzZXQDCQAAAgUNJHQwMzM3ODgzNDA1MAUNJHQwMzM3ODgzNDA1MAQKY2xhaW1Bc3NldAgFDSR0MDMzNzg4MzQwNTACXzIEC2NsYWltQW1vdW50CAUNJHQwMzM3ODgzNDA1MAJfMQQDYmFsCQEOYWNjb3VudEJhbGFuY2UBBQpjbGFpbUFzc2V0AwkAAAIFA2JhbAUDYmFsAwkAZgIFBmFtb3VudAUDYmFsCQACAQIZVG8gYmlnIGFtb3VudCB0byBleGNoYW5nZQkAlAoCBQtjbGFpbUFtb3VudAUKY2xhaW1Bc3NldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhsBaQETZ2V0UG9vbEluZm9SRUFET05MWQEEcG9vbAQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzNDQxNzM0NTA3CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM0NDE3MzQ1MDcCXzEEA0JJZAgFDSR0MDM0NDE3MzQ1MDcCXzIEBGJhbEEIBQ0kdDAzNDQxNzM0NTA3Al8zBARiYWxCCAUNJHQwMzQ0MTczNDUwNwJfNAQHc2hhcmVJZAgFDSR0MDM0NDE3MzQ1MDcCXzUEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQJAJQKAgUDbmlsCQCYCgYFA0FJZAUDQklkBQdzaGFyZUlkBQRiYWxBBQRiYWxCBQtzaGFyZVN1cHBseQFpARpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQEHc2hhcmVJZAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAkAlAoCBQNuaWwFC3NoYXJlUHJpY2VzAWkBImdldFVzZXJQb3NpdGlvblNoYXJlQW1vdW50UkVBRE9OTFkCBHVzZXIGcG9zTnVtBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAIQVW5rbm93biBwb3NpdGlvbgQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUGcG9zTnVtCQBmAgUMYm9ycm93QW1vdW50AAAJAJQKAgUDbmlsBQ91c2VyQ2FuV2l0aGRyYXcBaQEXZ2V0VXNlclBvc2l0aW9uUkVBRE9OTFkDBHVzZXIFcG9vbHMGcG9zTnVtCgEHdXNlclBvcwIBYQRwb29sBA0kdDAzNTM4MDM1NDUwBQFhBAl3QW1vdW50c0EIBQ0kdDAzNTM4MDM1NDUwAl8xBAl3QW1vdW50c0IIBQ0kdDAzNTM4MDM1NDUwAl8yBAVkZWJ0cwgFDSR0MDM1MzgwMzU0NTACXzMEC2VxV0Ftb3VudHNBCAUNJHQwMzUzODAzNTQ1MAJfNAQLZXFXQW1vdW50c0IIBQ0kdDAzNTM4MDM1NDUwAl81BAVpbmRleAgFDSR0MDM1MzgwMzU0NTACXzYDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFDWtVc2VyUG9zaXRpb24JAJgKBgkAzQgCBQl3QW1vdW50c0EAAAkAzQgCBQl3QW1vdW50c0IAAAkAzQgCBQVkZWJ0cwAACQDNCAIFC2VxV0Ftb3VudHNBAAAJAM0IAgULZXFXQW1vdW50c0IAAAkAZAIFBWluZGV4AAEEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzNTcyOTM1ODE5CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM1NzI5MzU4MTkCXzEEA0JJZAgFDSR0MDM1NzI5MzU4MTkCXzIEBGJhbEEIBQ0kdDAzNTcyOTM1ODE5Al8zBARiYWxCCAUNJHQwMzU3MjkzNTgxOQJfNAQHc2hhcmVJZAgFDSR0MDM1NzI5MzU4MTkCXzUEDGJvcnJvd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRFrVXNlckJvcnJvd0Ftb3VudAAABA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sCQCRAwIFBnBvc051bQUFaW5kZXgJAGYCBQxib3Jyb3dBbW91bnQAAAQNJHQwMzYwMzUzNjE1NQkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcECHdBbW91bnRBCAUNJHQwMzYwMzUzNjE1NQJfMQQId0Ftb3VudEIIBQ0kdDAzNjAzNTM2MTU1Al8yAwkAZgIFDGJvcnJvd0Ftb3VudAAABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAGYCBQRkZWJ0BQh3QW1vdW50QQcJAGUCBQRkZWJ0BQh3QW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFA0JJZAkAZgIFBGRlYnQFCHdBbW91bnRCBwkAZQIFBGRlYnQFCHdBbW91bnRCAAAEC2Ftb3VudFRvUGF5AwkAZgIFDWFtb3VudFRvR2V0RXgAAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlTRgcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yAwkAAAIFBXBUeXBlBQdXWF9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIJAQ91bmtub3duUG9vbFR5cGUAAAAEDSR0MDM3MDY3MzcyODYDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAlAoCCQBlAgkAZAIFCHdBbW91bnRBBQ1hbW91bnRUb0dldEV4BQRkZWJ0CQBlAgUId0Ftb3VudEIFC2Ftb3VudFRvUGF5CQCUCgIJAGUCBQh3QW1vdW50QQULYW1vdW50VG9QYXkJAGUCCQBkAgUId0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFBGRlYnQECmVxV0Ftb3VudEEIBQ0kdDAzNzA2NzM3Mjg2Al8xBAplcVdBbW91bnRCCAUNJHQwMzcwNjczNzI4NgJfMgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAzQgCBQVkZWJ0cwUEZGVidAkAzQgCBQtlcVdBbW91bnRzQQUKZXFXQW1vdW50QQkAzQgCBQtlcVdBbW91bnRzQgUKZXFXQW1vdW50QgkAZAIFBWluZGV4AAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIFBWRlYnRzCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAZAIFBWluZGV4AAEEDSR0MDM3NTQxMzc2NTIKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3VzZXJQb3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQJd0Ftb3VudHNBCAUNJHQwMzc1NDEzNzY1MgJfMQQJd0Ftb3VudHNCCAUNJHQwMzc1NDEzNzY1MgJfMgQFZGVidHMIBQ0kdDAzNzU0MTM3NjUyAl8zBAtlcVdBbW91bnRzQQgFDSR0MDM3NTQxMzc2NTICXzQEC2VxV0Ftb3VudHNCCAUNJHQwMzc1NDEzNzY1MgJfNQkAlAoCBQNuaWwJAJcKBQUJd0Ftb3VudHNBBQl3QW1vdW50c0IFBWRlYnRzBQtlcVdBbW91bnRzQQULZXFXQW1vdW50c0IBaQEJcmVwbGVuaXNoAwRwb29sCGxldmVyYWdlCGJvcnJvd0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAZgIAZAUIbGV2ZXJhZ2UGCQBmAgUIbGV2ZXJhZ2UArAIJAAIBAh9MZXZlcmFnZSBjYW4ndCBiZSA8MTAwIGFuZCA+MzAwAwMJAQEhAQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhbkJvcnJvdwkAZgIFCGxldmVyYWdlAGQHCQACAQIdWW91IGNhbid0IGJvcnJvdyBpbiB0aGlzIHBvb2wEDSR0MDM4MjUwMzgzNDAJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzgyNTAzODM0MAJfMQQDQklkCAUNJHQwMzgyNTAzODM0MAJfMgQEYmFsQQgFDSR0MDM4MjUwMzgzNDACXzMEBGJhbEIIBQ0kdDAzODI1MDM4MzQwAl80BAdzaGFyZUlkCAUNJHQwMzgyNTAzODM0MAJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwMzg0MjEzODQ4MAkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDM4NDIxMzg0ODACXzEEBHBtdEIIBQ0kdDAzODQyMTM4NDgwAl8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50BQNuaWwCASwEDG5ld1JlcXVlc3RJZAoAAUAJAPwHBAUEdGhpcwIQY3JlYXRlTmV3UmVxdWVzdAkAzAgCBQdyZXF1ZXN0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUMbmV3UmVxdWVzdElkBQxuZXdSZXF1ZXN0SWQEBGFyZ3MJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgUMYm9ycm93QW1vdW50CQDMCAIJAKUIAQUEdGhpcwkAzAgCAhFyZXBsZW5pc2hGcm9tTGFuZAkAzAgCCQCkAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUMbmV3UmVxdWVzdElkAhhDYW4ndCBjcmVhdGUgbmV3IHJlcXVlc3QFA25pbAQDaW52CQD9BwQJAQ5nZXRMZW5kU3J2QWRkcgACDWZsYXNoUG9zaXRpb24FBGFyZ3MFA25pbAMJAAACBQNpbnYFA2ludgQKdXNlclN0YWtlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtBQ1rVXNlclBvc2l0aW9uBA0kdDAzOTQ2OTM5NTYzCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzOTQ2OTM5NTYzBQ0kdDAzOTQ2OTM5NTYzBAduZXdCYWxCCAUNJHQwMzk0NjkzOTU2MwJfMgQHbmV3QmFsQQgFDSR0MDM5NDY5Mzk1NjMCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwMzk2MzMzOTc0OAkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDM5NjMzMzk3NDgCXzEECHdBbW91bnRCCAUNJHQwMzk2MzMzOTc0OAJfMgkAlAoCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzk4MDEzOTkxNgkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQtOT19MT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQDCQAAAgUNJHQwMzk4MDEzOTkxNgUNJHQwMzk4MDEzOTkxNgQHYXhseUZlZQgFDSR0MDM5ODAxMzk5MTYCXzIECnVzZXJTdGFrZWQIBQ0kdDAzOTgwMTM5OTE2Al8xBA0kdDAzOTkyMjQwMDE2CQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzOTkyMjQwMDE2BQ0kdDAzOTkyMjQwMDE2BAduZXdCYWxCCAUNJHQwMzk5MjI0MDAxNgJfMgQHbmV3QmFsQQgFDSR0MDM5OTIyNDAwMTYCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwNDAwODY0MDIwMQkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDQwMDg2NDAyMDECXzEECHdBbW91bnRCCAUNJHQwNDAwODY0MDIwMQJfMgkAlAoCCQDOCAIJARByZXBsZW5pc2hFbnRyaWVzCAUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCBHBvb2wFcG9zSWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAkBDndpdGhkcmF3VG9Vc2VyBAkApQgBCAUBaQZjYWxsZXIFBHBvb2wJAKQDAQUFcG9zSWQHAWkBFGNyZWF0ZVVwZGF0ZVN0b3BMb3NzBAVwb3NJZAZwb29sSWQHYXNzZXRJZAVwcmljZQkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGcG9vbElkAgFfCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAAgECGlRoZXJlIGFyZSBubyB1c2VyIHBvc2l0aW9uAwkAZwIAAAUFcHJpY2UJAAIBAhxQcmljZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIFBXByaWNlBRB0b2tlbk9yYWNsZVByaWNlCQACAQIrUHJpY2UgbXVzdCBiZSBsZXNzIHRoYW4gY3VycmVudCB0b2tlbiBwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQVwcmljZQUDbmlsAWkBDmRlbGV0ZVN0b3BMb3NzAwVwb3NJZAZwb29sSWQHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCQACAQIITm8gZW50cnkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQNuaWwBaQEEaW5pdA0MbW9uZXlCb3hBZGRyDXNmRmFybWluZ0FkZHIIbGVuZEFkZHIPcHJpY2VPcmFjbGVBZGRyEGtlZXBlckV4Q29udHJhY3QOd3hTd2FwQ29udHJhY3QLc3dvcEFzc2V0SWQJd3hBc3NldElkDm9wZXJhdG9yUHViS2V5Emdyb3VwMUFkbWluMVB1YktleRJncm91cDFBZG1pbjJQdWJLZXkSZ3JvdXAyQWRtaW4xUHViS2V5Emdyb3VwMkFkbWluMlB1YktleQkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAKIIAQUPa09wZXJhdG9yQ2FsbFBLCQACAQIOQWxyZWFkeSBpbml0ZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDG1vbmV5Qm94QWRkcgkAAgECI21vbmV5Qm94QWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ1zZkZhcm1pbmdBZGRyCQACAQIkc2ZGYXJtaW5nQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQhsZW5kQWRkcgkAAgECH2xlbmRBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFD3ByaWNlT3JhY2xlQWRkcgkAAgECJnByaWNlT3JhY2xlQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRBrZWVwZXJFeENvbnRyYWN0CQACAQIna2VlcGVyRXhDb250cmFjdCBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFC3N3b3BBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQUJd3hBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQECIT0CCQDIAQEJANkEAQUOb3BlcmF0b3JQdWJLZXkAIAkAAgECHW9wZXJhdG9yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtNb25leUJveAUMbW9uZXlCb3hBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtTRkZhcm1pbmdBZGRyBQ1zZkZhcm1pbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtMZW5kU2VydmljZQUIbGVuZEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa1ByaWNlT3JhY2xlBQ9wcmljZU9yYWNsZUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa0V4Q29udHJhY3QFEGtlZXBlckV4Q29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1d4U3dhcENvbnRyYWN0BQ53eFN3YXBDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQdrU3dvcElkBQtzd29wQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQVrV3hJZAUJd3hBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tPcGVyYXRvckNhbGxQSwUOb3BlcmF0b3JQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMVBLBRJncm91cDFBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMlBLBRJncm91cDFBZG1pbjJQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMVBLBRJncm91cDJBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMlBLBRJncm91cDJBZG1pbjJQdWJLZXkFA25pbAFpARBjcmVhdGVOZXdSZXF1ZXN0AQZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQMbmV3UmVxdWVzdElkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxrUmVxdWVzdEl0ZXIAAAABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFDG5ld1JlcXVlc3RJZAUKa1JlcXVlc3RJZAUGcGFyYW1zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrUmVxdWVzdEl0ZXIFDG5ld1JlcXVlc3RJZAUDbmlsBQxuZXdSZXF1ZXN0SWQBaQERcmVwbGVuaXNoRnJvbUxhbmQBCXJlcXVlc3RJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBA0kdDA0NTA0MDQ1MTQ0CQEMcGFyc2VSZXF1ZXN0AQUJcmVxdWVzdElkBAR1c2VyCAUNJHQwNDUwNDA0NTE0NAJfMQQEcG9vbAgFDSR0MDQ1MDQwNDUxNDQCXzIEBHBtdEEIBQ0kdDA0NTA0MDQ1MTQ0Al8zBANBSWQIBQ0kdDA0NTA0MDQ1MTQ0Al80BARwbXRCCAUNJHQwNDUwNDA0NTE0NAJfNQQDQklkCAUNJHQwNDUwNDA0NTE0NAJfNgQEYmFsQQgFDSR0MDQ1MDQwNDUxNDQCXzcEBGJhbEIIBQ0kdDA0NTA0MDQ1MTQ0Al84BAdzaGFyZUlkCAUNJHQwNDUwNDA0NTE0NAJfOQQHYndBc3NldAgFDSR0MDQ1MDQwNDUxNDQDXzEwBAhid0Ftb3VudAgFDSR0MDQ1MDQwNDUxNDQDXzExAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDA0NTMzNDQ1NDM0AwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQUIYndBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFCGJ3QW1vdW50BAdwbXRBbGxBCAUNJHQwNDUzMzQ0NTQzNAJfMQQHcG10QWxsQggFDSR0MDQ1MzM0NDU0MzQCXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA0NTUxNjQ1NjMxCQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQKdXNlclN0YWtlZAgFDSR0MDQ1NTE2NDU2MzECXzEEB2F4bHlGZWUIBQ0kdDA0NTUxNjQ1NjMxAl8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGBA0kdDA0NTk5MTQ2MTA2CQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNDU5OTE0NjEwNgJfMQQId0Ftb3VudEIIBQ0kdDA0NTk5MTQ2MTA2Al8yCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNDY2Mjc0NjcxNwkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA0NjYyNzQ2NzE3Al8xBANCSWQIBQ0kdDA0NjYyNzQ2NzE3Al8yBARiYWxBCAUNJHQwNDY2Mjc0NjcxNwJfMwQEYmFsQggFDSR0MDQ2NjI3NDY3MTcCXzQEB3NoYXJlSWQIBQ0kdDA0NjYyNzQ2NzE3Al81BAZhbW91bnQJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPbGlxdWlkYXRlQW1vdW50BAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQJAGYCBQxib3Jyb3dBbW91bnQAAAMJAGYCBQ9saXF1aWRhdGVBbW91bnQFD3VzZXJDYW5XaXRoZHJhdwkAAgECJ1lvdSBjYW4ndCBsaXF1aWRhdGUgbW9yZSB0aGFuIHVzZXIgaGF2ZQMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQBlAgUPdXNlckNhbldpdGhkcmF3BQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBAUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYJAJQKAgkAzQgCCAUDcmVzAl8xCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MIBQNyZXMCXzIBaQEMY2FwaXRhbGl6ZUV4BQRwb29sBXJvdXRlCXRva2VuVG9JZBBhbW91bnRUb0V4Y2hhbmdlBWNsYWltCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAQNJHQwNDg2ODc0ODc4OQkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlBQZjaGFuZ2UDCQAAAgUNJHQwNDg2ODc0ODc4OQUNJHQwNDg2ODc0ODc4OQQMY2xhaW1lZEFzc2V0CAUNJHQwNDg2ODc0ODc4OQJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDQ4Njg3NDg3ODkCXzEEBXJBcmdzCQC1CQIFBXJvdXRlAgJfXwQPZXhjaGFuZ2VkQW1vdW50AwkAAAIJAJEDAgUFckFyZ3MAAAIQZGlyZWN0U3dvcGZpQ1BNTQkBEGRpcmVjdFN3b3BmaUNQTU0CBQVyQXJncwUJdG9rZW5Ub0lkAwkAAAIJAJEDAgUFckFyZ3MAAAINcm91dGluZ1N3b3BmaQkBE2RpcmVjdFJvdXRpbmdTd29wZmkCBQVyQXJncwUJdG9rZW5Ub0lkCQACAQILV3Jvbmcgcm91dGUDCQAAAgUPZXhjaGFuZ2VkQW1vdW50BQ9leGNoYW5nZWRBbW91bnQECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAUDbmlsCQDOCAIJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jYXBpdGFsaXplTm9FeAMEcG9vbAVjbGFpbRFhbW91bnRGcm9tQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEDSR0MDQ5NDczNDk1NzEJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQURYW1vdW50RnJvbUJhbGFuY2UAAAMJAAACBQ0kdDA0OTQ3MzQ5NTcxBQ0kdDA0OTQ3MzQ5NTcxBAxjbGFpbWVkQXNzZXQIBQ0kdDA0OTQ3MzQ5NTcxAl8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNDk0NzM0OTU3MQJfMQkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAkAZAIFDWNsYWltZWRBbW91bnQFEWFtb3VudEZyb21CYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2luaXROZXdQb29sCgR0eXBlCHBvb2xUeXBlCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgljYW5Cb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDAwkBAiE9AgUEdHlwZQUHU0ZfUE9PTAkBAiE9AgUEdHlwZQUHV1hfUE9PTAcJAAIBAgpXcm9uZyB0eXBlAwMJAQIhPQIFCHBvb2xUeXBlBQRDUE1NCQECIT0CBQhwb29sVHlwZQUERkxBVAcJAAIBAg9Xcm9uZyBwb29sIHR5cGUEDSR0MDUwMDkyNTAxODYJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQhwb29sQWRkcgUEdHlwZQQDYUlkCAUNJHQwNTAwOTI1MDE4NgJfMQQDYklkCAUNJHQwNTAwOTI1MDE4NgJfMgQEYUJhbAgFDSR0MDUwMDkyNTAxODYCXzMEBGJCYWwIBQ0kdDA1MDA5MjUwMTg2Al80BAdzaGFyZUlkCAUNJHQwNTAwOTI1MDE4NgJfNQMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa1Bvb2xJbnRlcmVzdExvYW4AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIcG9vbEFkZHIFCWtQb29sVHlwZQUIcG9vbFR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sBQhwb29sQWRkcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQhwb29sQWRkcgUOa1Bvb2xDYW5Cb3Jyb3cFCWNhbkJvcnJvdwUDbmlsAWkBDnVwZGF0ZVBvb2xGZWVzBwhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyCQACAQkArAICAhpDYW4ndCBmaW5kIHBvb2wgd2l0aCBhZGRyIAUIcG9vbEFkZHIDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4FA25pbAFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQITZEFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYFA25pbAFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhVkQXBwIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHBQNuaWwBaQEQYWN0aXZhdGVGb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh1kQXBwIGFscmVhZHkgYWN0aXZlIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBgUDbmlsAWkBEHNodXRkb3duRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh9kQXBwIGFscmVhZHkgc2h1dGRvd24gZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMHBQNuaWwBaQEKYWN0aXZhdGVTRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIVU1dPUEZJIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIXU1dPUEZJIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEKYWN0aXZhdGVXWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIRV1ggYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25XWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhNXWCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBDGFjdGl2YXRlUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhNQb29sIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgUDbmlsAWkBDHNodXRkb3duUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECFVBvb2wgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQcFA25pbABnL5a2", "height": 2805184, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4M2PVDWnzvVtmNfFftF8nMZfRvKBHCoeedabQqmhBELP Next: 71ZBgz93Z1nyQaB7fPCbPmjCrZzSAjAeDTumkK46pxSz Diff:
OldNewDifferences
645645
646646
647647 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
648- let $t01912020322 = if ((pType == SF_POOL))
648+ let $t01912020334 = if ((pType == SF_POOL))
649649 then {
650650 let inv = {
651651 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
670670 else if ((pType == WX_POOL))
671671 then if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
672672 then {
673- let inv = invoke(poolAddr, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
673+ let inv = invoke(poolAddr, "estimateGetOperationWrapperREADONLY", [shareId, userCanWithdraw], nil)
674674 if ((inv == inv))
675675 then {
676- let $t01958020077 = match inv {
676+ let $t01959220089 = match inv {
677677 case _ =>
678678 if (if (if ($isInstanceOf($match0._1, "Int"))
679679 then if ($isInstanceOf($match0._2, "Int"))
702702 }
703703 else throw("Couldn't cast types")
704704 }
705- let outAmAmt = $t01958020077._1
706- let outPrAmt = $t01958020077._2
707- let amBalance = $t01958020077._3
708- let prBalance = $t01958020077._4
709- let lpEmission = $t01958020077._5
710- let curPrice = $t01958020077._6
711- let poolStatus = $t01958020077._7
705+ let outAmAmt = $t01959220089._1
706+ let outPrAmt = $t01959220089._2
707+ let amBalance = $t01959220089._3
708+ let prBalance = $t01959220089._4
709+ let lpEmission = $t01959220089._5
710+ let curPrice = $t01959220089._6
711+ let poolStatus = $t01959220089._7
712712 $Tuple2(outAmAmt, outPrAmt)
713713 }
714714 else throw("Strict value is not equal to itself.")
725725 else throw("Strict value is not equal to itself.")
726726 }
727727 else unknownPoolType()
728- let amountA = $t01912020322._1
729- let amountB = $t01912020322._2
728+ let amountA = $t01912020334._1
729+ let amountB = $t01912020334._2
730730 $Tuple2(amountA, amountB)
731731 }
732732
748748 }
749749 else if ((pType == WX_POOL))
750750 then {
751- let $t02069020769 = getWXPoolData(addressFromStringValue(pool))
752- let aId = $t02069020769._1
753- let bId = $t02069020769._2
754- let aBal = $t02069020769._3
755- let bBal = $t02069020769._4
756- let lpId = $t02069020769._5
751+ let $t02070220781 = getWXPoolData(addressFromStringValue(pool))
752+ let aId = $t02070220781._1
753+ let bId = $t02070220781._2
754+ let aBal = $t02070220781._3
755+ let bBal = $t02070220781._4
756+ let lpId = $t02070220781._5
757757 let balBefore = accountBalance(WXID)
758758 if ((balBefore == balBefore))
759759 then {
775775 if ((lpBalanceBefore == lpBalanceBefore))
776776 then {
777777 let poolAddr = addressFromStringValue(pool)
778- let $t02136721783 = if (if ((pmtA > 0))
778+ let $t02137921795 = if (if ((pmtA > 0))
779779 then (pmtB > 0)
780780 else false)
781781 then {
782- let $t02143321549 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
783- let pmtInA = $t02143321549._1
784- let pmtInB = $t02143321549._2
785- let change = $t02143321549._3
786- let changeId = $t02143321549._4
782+ let $t02144521561 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
783+ let pmtInA = $t02144521561._1
784+ let pmtInB = $t02144521561._2
785+ let change = $t02144521561._3
786+ let changeId = $t02144521561._4
787787 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
788788 if ((inv == inv))
789789 then $Tuple2(change, changeId)
794794 else if ((pmtB > 0))
795795 then $Tuple2(pmtB, bId)
796796 else throw("pmts must be > 0")
797- let change = $t02136721783._1
798- let changeId = $t02136721783._2
797+ let change = $t02137921795._1
798+ let changeId = $t02137921795._2
799799 let inv = if ((change > 0))
800800 then replenishOneTokenByType(poolAddr, pType, change, changeId)
801801 else nil
823823 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
824824 let totalAmount = getPoolTotalShare(pool)
825825 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
826- let $t02264022878 = if (withLoan)
826+ let $t02265222890 = if (withLoan)
827827 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
828828 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
829- let curPoolInterest = $t02264022878._1
830- let totalStakedWithLoan = $t02264022878._2
829+ let curPoolInterest = $t02265222890._1
830+ let totalStakedWithLoan = $t02265222890._2
831831 [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))]
832832 }
833833
908908
909909 func capitalize (pool,pType,tokenId,tokenAmount) = {
910910 let poolAddr = Address(fromBase58String(pool))
911- let $t02498525051 = getPoolData(poolAddr, pType)
912- let AId = $t02498525051._1
913- let BId = $t02498525051._2
914- let balA = $t02498525051._3
915- let balB = $t02498525051._4
916- let shareId = $t02498525051._5
911+ let $t02499725063 = getPoolData(poolAddr, pType)
912+ let AId = $t02499725063._1
913+ let BId = $t02499725063._2
914+ let balA = $t02499725063._3
915+ let balB = $t02499725063._4
916+ let shareId = $t02499725063._5
917917 if (if ((tokenId != AId))
918918 then (tokenId != BId)
919919 else false)
930930 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
931931 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
932932 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
933- let $t02579625896 = if ((tokenId == AId))
933+ let $t02580825908 = if ((tokenId == AId))
934934 then $Tuple2((tokenAmount - axlyFee), 0)
935935 else $Tuple2(0, (tokenAmount - axlyFee))
936- let pmtA = $t02579625896._1
937- let pmtB = $t02579625896._2
938- let $t02589926003 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
939- let stakedAmount = $t02589926003._1
940- let nf = $t02589926003._2
936+ let pmtA = $t02580825908._1
937+ let pmtB = $t02580825908._2
938+ let $t02591126015 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
939+ let stakedAmount = $t02591126015._1
940+ let nf = $t02591126015._2
941941 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
942942 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
943943 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
983983 let userAddr = Address(fromBase58String(user))
984984 let poolAddr = Address(fromBase58String(pool))
985985 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
986- let $t02853228604 = getPoolData(poolAddr, pType)
987- let idAStr = $t02853228604._1
988- let idBStr = $t02853228604._2
989- let balA = $t02853228604._3
990- let balB = $t02853228604._4
991- let shareId = $t02853228604._5
992- let $t02860728674 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
993- let idA = $t02860728674._1
994- let idB = $t02860728674._2
986+ let $t02854428616 = getPoolData(poolAddr, pType)
987+ let idAStr = $t02854428616._1
988+ let idBStr = $t02854428616._2
989+ let balA = $t02854428616._3
990+ let balB = $t02854428616._4
991+ let shareId = $t02854428616._5
992+ let $t02861928686 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
993+ let idA = $t02861928686._1
994+ let idB = $t02861928686._2
995995 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
996996 let cBalABefore = accountBalance(idA)
997997 if ((cBalABefore == cBalABefore))
10221022 let cBalBAfter = accountBalance(idB)
10231023 if ((cBalBAfter == cBalBAfter))
10241024 then {
1025- let $t02936929458 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1026- let tokensAmountA = $t02936929458._1
1027- let tokensAmountB = $t02936929458._2
1028- let $t02946130697 = if (isBorrowed)
1025+ let $t02938129470 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1026+ let tokensAmountA = $t02938129470._1
1027+ let tokensAmountB = $t02938129470._2
1028+ let $t02947330709 = if (isBorrowed)
10291029 then {
10301030 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
10311031 let debt = {
10741074 else throw("Strict value is not equal to itself.")
10751075 }
10761076 else $Tuple2(tokensAmountA, tokensAmountB)
1077- let toUserA = $t02946130697._1
1078- let toUserB = $t02946130697._2
1077+ let toUserA = $t02947330709._1
1078+ let toUserB = $t02947330709._2
10791079 let poolTotalLoanEntries = if (isBorrowed)
10801080 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10811081 else nil
11211121 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
11221122 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
11231123 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1124- let $t03267932776 = if ((borrowId == aId))
1124+ let $t03269132788 = if ((borrowId == aId))
11251125 then $Tuple2(dPriceA, decPrA)
11261126 else $Tuple2(dPriceB, decPrB)
1127- let borrowPrice = $t03267932776._1
1128- let borrowDecPr = $t03267932776._2
1127+ let borrowPrice = $t03269132788._1
1128+ let borrowDecPr = $t03269132788._2
11291129 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
11301130 }
11311131
11541154
11551155
11561156 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1157- let $t03377634038 = if (claim)
1157+ let $t03378834050 = if (claim)
11581158 then claimFarmed(pType, pool)
11591159 else {
11601160 let claimedAsset = if ((pType == SF_POOL))
11641164 else unknownPoolType()
11651165 $Tuple2(amount, claimedAsset)
11661166 }
1167- if (($t03377634038 == $t03377634038))
1167+ if (($t03378834050 == $t03378834050))
11681168 then {
1169- let claimAsset = $t03377634038._2
1170- let claimAmount = $t03377634038._1
1169+ let claimAsset = $t03378834050._2
1170+ let claimAmount = $t03378834050._1
11711171 let bal = accountBalance(claimAsset)
11721172 if ((bal == bal))
11731173 then if ((amount > bal))
11831183 func getPoolInfoREADONLY (pool) = {
11841184 let poolAddr = addressFromStringValue(pool)
11851185 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1186- let $t03440534495 = getPoolData(Address(fromBase58String(pool)), pType)
1187- let AId = $t03440534495._1
1188- let BId = $t03440534495._2
1189- let balA = $t03440534495._3
1190- let balB = $t03440534495._4
1191- let shareId = $t03440534495._5
1186+ let $t03441734507 = getPoolData(Address(fromBase58String(pool)), pType)
1187+ let AId = $t03441734507._1
1188+ let BId = $t03441734507._2
1189+ let balA = $t03441734507._3
1190+ let balB = $t03441734507._4
1191+ let shareId = $t03441734507._5
11921192 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11931193 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11941194 }
12161216 @Callable(i)
12171217 func getUserPositionREADONLY (user,pools,posNum) = {
12181218 func userPos (a,pool) = {
1219- let $t03536835438 = a
1220- let wAmountsA = $t03536835438._1
1221- let wAmountsB = $t03536835438._2
1222- let debts = $t03536835438._3
1223- let eqWAmountsA = $t03536835438._4
1224- let eqWAmountsB = $t03536835438._5
1225- let index = $t03536835438._6
1219+ let $t03538035450 = a
1220+ let wAmountsA = $t03538035450._1
1221+ let wAmountsB = $t03538035450._2
1222+ let debts = $t03538035450._3
1223+ let eqWAmountsA = $t03538035450._4
1224+ let eqWAmountsB = $t03538035450._5
1225+ let index = $t03538035450._6
12261226 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
12271227 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
12281228 else {
12291229 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1230- let $t03571735807 = getPoolData(Address(fromBase58String(pool)), pType)
1231- let AId = $t03571735807._1
1232- let BId = $t03571735807._2
1233- let balA = $t03571735807._3
1234- let balB = $t03571735807._4
1235- let shareId = $t03571735807._5
1230+ let $t03572935819 = getPoolData(Address(fromBase58String(pool)), pType)
1231+ let AId = $t03572935819._1
1232+ let BId = $t03572935819._2
1233+ let balA = $t03572935819._3
1234+ let balB = $t03572935819._4
1235+ let shareId = $t03572935819._5
12361236 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
12371237 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1238- let $t03602336143 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1239- let wAmountA = $t03602336143._1
1240- let wAmountB = $t03602336143._2
1238+ let $t03603536155 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1239+ let wAmountA = $t03603536155._1
1240+ let wAmountB = $t03603536155._2
12411241 if ((borrowAmount > 0))
12421242 then {
12431243 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12711271 }
12721272 else unknownPoolType()
12731273 else 0
1274- let $t03705537274 = if ((borrowAsset == AId))
1274+ let $t03706737286 = if ((borrowAsset == AId))
12751275 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12761276 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1277- let eqWAmountA = $t03705537274._1
1278- let eqWAmountB = $t03705537274._2
1277+ let eqWAmountA = $t03706737286._1
1278+ let eqWAmountB = $t03706737286._2
12791279 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12801280 }
12811281 else throw("Strict value is not equal to itself.")
12841284 }
12851285 }
12861286
1287- let $t03752937640 = {
1287+ let $t03754137652 = {
12881288 let $l = pools
12891289 let $s = size($l)
12901290 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12981298
12991299 $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)
13001300 }
1301- let wAmountsA = $t03752937640._1
1302- let wAmountsB = $t03752937640._2
1303- let debts = $t03752937640._3
1304- let eqWAmountsA = $t03752937640._4
1305- let eqWAmountsB = $t03752937640._5
1301+ let wAmountsA = $t03754137652._1
1302+ let wAmountsB = $t03754137652._2
1303+ let debts = $t03754137652._3
1304+ let eqWAmountsA = $t03754137652._4
1305+ let eqWAmountsB = $t03754137652._5
13061306 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
13071307 }
13081308
13221322 else false)
13231323 then throw("You can't borrow in this pool")
13241324 else {
1325- let $t03823838328 = getPoolData(Address(fromBase58String(pool)), pType)
1326- let AId = $t03823838328._1
1327- let BId = $t03823838328._2
1328- let balA = $t03823838328._3
1329- let balB = $t03823838328._4
1330- let shareId = $t03823838328._5
1325+ let $t03825038340 = getPoolData(Address(fromBase58String(pool)), pType)
1326+ let AId = $t03825038340._1
1327+ let BId = $t03825038340._2
1328+ let balA = $t03825038340._3
1329+ let balB = $t03825038340._4
1330+ let shareId = $t03825038340._5
13311331 if (if ((borrowId != AId))
13321332 then (borrowId != BId)
13331333 else false)
13341334 then throw("Wrong borrow asset")
13351335 else {
1336- let $t03840938468 = parseReplenishPmts(i.payments, AId, BId)
1337- let pmtA = $t03840938468._1
1338- let pmtB = $t03840938468._2
1336+ let $t03842138480 = parseReplenishPmts(i.payments, AId, BId)
1337+ let pmtA = $t03842138480._1
1338+ let pmtB = $t03842138480._2
13391339 let user = toString(i.caller)
13401340 let newPosNum = getNewUserPositionNumber(user)
13411341 if ((leverage > 100))
13551355 if ((inv == inv))
13561356 then {
13571357 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1358- let $t03945739551 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1359- if (($t03945739551 == $t03945739551))
1358+ let $t03946939563 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1359+ if (($t03946939563 == $t03946939563))
13601360 then {
1361- let newBalB = $t03945739551._2
1362- let newBalA = $t03945739551._1
1361+ let newBalB = $t03946939563._2
1362+ let newBalA = $t03946939563._1
13631363 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1364- let $t03962139736 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1365- let wAmountA = $t03962139736._1
1366- let wAmountB = $t03962139736._2
1364+ let $t03963339748 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1365+ let wAmountA = $t03963339748._1
1366+ let wAmountB = $t03963339748._2
13671367 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13681368 }
13691369 else throw("Strict value is not equal to itself.")
13731373 else throw("Strict value is not equal to itself.")
13741374 }
13751375 else {
1376- let $t03978939904 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1377- if (($t03978939904 == $t03978939904))
1376+ let $t03980139916 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1377+ if (($t03980139916 == $t03980139916))
13781378 then {
1379- let axlyFee = $t03978939904._2
1380- let userStaked = $t03978939904._1
1381- let $t03991040004 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1382- if (($t03991040004 == $t03991040004))
1379+ let axlyFee = $t03980139916._2
1380+ let userStaked = $t03980139916._1
1381+ let $t03992240016 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1382+ if (($t03992240016 == $t03992240016))
13831383 then {
1384- let newBalB = $t03991040004._2
1385- let newBalA = $t03991040004._1
1384+ let newBalB = $t03992240016._2
1385+ let newBalA = $t03992240016._1
13861386 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1387- let $t04007440189 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1388- let wAmountA = $t04007440189._1
1389- let wAmountB = $t04007440189._2
1387+ let $t04008640201 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1388+ let wAmountA = $t04008640201._1
1389+ let wAmountB = $t04008640201._2
13901390 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13911391 }
13921392 else throw("Strict value is not equal to itself.")
14791479
14801480 @Callable(i)
14811481 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1482- let $t04502845132 = parseRequest(requestId)
1483- let user = $t04502845132._1
1484- let pool = $t04502845132._2
1485- let pmtA = $t04502845132._3
1486- let AId = $t04502845132._4
1487- let pmtB = $t04502845132._5
1488- let BId = $t04502845132._6
1489- let balA = $t04502845132._7
1490- let balB = $t04502845132._8
1491- let shareId = $t04502845132._9
1492- let bwAsset = $t04502845132._10
1493- let bwAmount = $t04502845132._11
1482+ let $t04504045144 = parseRequest(requestId)
1483+ let user = $t04504045144._1
1484+ let pool = $t04504045144._2
1485+ let pmtA = $t04504045144._3
1486+ let AId = $t04504045144._4
1487+ let pmtB = $t04504045144._5
1488+ let BId = $t04504045144._6
1489+ let balA = $t04504045144._7
1490+ let balB = $t04504045144._8
1491+ let shareId = $t04504045144._9
1492+ let bwAsset = $t04504045144._10
1493+ let bwAmount = $t04504045144._11
14941494 if ((size(i.payments) != 1))
14951495 then throw("Wrong payment size")
14961496 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14981498 else (i.payments[0].amount != bwAmount))
14991499 then throw("Wrong payment")
15001500 else {
1501- let $t04532245422 = if ((AId == bwAsset))
1501+ let $t04533445434 = if ((AId == bwAsset))
15021502 then $Tuple2((pmtA + bwAmount), pmtB)
15031503 else $Tuple2(pmtA, (pmtB + bwAmount))
1504- let pmtAllA = $t04532245422._1
1505- let pmtAllB = $t04532245422._2
1504+ let pmtAllA = $t04533445434._1
1505+ let pmtAllB = $t04533445434._2
15061506 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1507- let $t04550445619 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1508- let userStaked = $t04550445619._1
1509- let axlyFee = $t04550445619._2
1507+ let $t04551645631 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1508+ let userStaked = $t04551645631._1
1509+ let axlyFee = $t04551645631._2
15101510 let posNum = getNewUserPositionNumber(user)
15111511 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
15121512 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1513- let $t04597946094 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1514- let wAmountA = $t04597946094._1
1515- let wAmountB = $t04597946094._2
1513+ let $t04599146106 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1514+ let wAmountA = $t04599146106._1
1515+ let wAmountB = $t04599146106._2
15161516 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
15171517 }
15181518 }))
15231523 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
15241524 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
15251525 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1526- let $t04661546705 = getPoolData(Address(fromBase58String(pool)), pType)
1527- let AId = $t04661546705._1
1528- let BId = $t04661546705._2
1529- let balA = $t04661546705._3
1530- let balB = $t04661546705._4
1531- let shareId = $t04661546705._5
1526+ let $t04662746717 = getPoolData(Address(fromBase58String(pool)), pType)
1527+ let AId = $t04662746717._1
1528+ let BId = $t04662746717._2
1529+ let balA = $t04662746717._3
1530+ let balB = $t04662746717._4
1531+ let shareId = $t04662746717._5
15321532 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
15331533 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
15341534 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15601560 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15611561 let pType = getStringValue(this, (kPool + pool))
15621562 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1563- let $t04867548777 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1564- if (($t04867548777 == $t04867548777))
1563+ let $t04868748789 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1564+ if (($t04868748789 == $t04868748789))
15651565 then {
1566- let claimedAsset = $t04867548777._2
1567- let claimedAmount = $t04867548777._1
1566+ let claimedAsset = $t04868748789._2
1567+ let claimedAmount = $t04868748789._1
15681568 let rArgs = split(route, "__")
15691569 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15701570 then directSwopfiCPMM(rArgs, tokenToId)
15891589 @Callable(i)
15901590 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15911591 let pType = getStringValue(this, (kPool + pool))
1592- let $t04946149559 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1593- if (($t04946149559 == $t04946149559))
1592+ let $t04947349571 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1593+ if (($t04947349571 == $t04947349571))
15941594 then {
1595- let claimedAsset = $t04946149559._2
1596- let claimedAmount = $t04946149559._1
1595+ let claimedAsset = $t04947349571._2
1596+ let claimedAmount = $t04947349571._1
15971597 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15981598 }
15991599 else throw("Strict value is not equal to itself.")
16111611 else false)
16121612 then throw("Wrong pool type")
16131613 else {
1614- let $t05008050174 = getPoolData(Address(fromBase58String(poolAddr)), type)
1615- let aId = $t05008050174._1
1616- let bId = $t05008050174._2
1617- let aBal = $t05008050174._3
1618- let bBal = $t05008050174._4
1619- let shareId = $t05008050174._5
1614+ let $t05009250186 = getPoolData(Address(fromBase58String(poolAddr)), type)
1615+ let aId = $t05009250186._1
1616+ let bId = $t05009250186._2
1617+ let aBal = $t05009250186._3
1618+ let bBal = $t05009250186._4
1619+ let shareId = $t05009250186._5
16201620 if ((0 > inFeeNoLoan))
16211621 then throw("inFeeNoLoan must be greater than 0")
16221622 else if ((0 > inFeeLoan))
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_"
8787
8888 let kPoolType = "_poolType"
8989
9090 let kSharePool = "_poolShareId"
9191
9292 let kPoolCapChange = "_poolCapChange"
9393
9494 let kTokenLastPrice = "last_price"
9595
9696 let kPriceInOracle = "_twap5B"
9797
9898 let kActive = "active"
9999
100100 let kActiveUsers = "activeUsers"
101101
102102 let kActiveSFWX = "_active"
103103
104104 let kPoolActive = "_activePool"
105105
106106 let kUserStopLoss = "_stopLoss"
107107
108108 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
109109
110110 let kMoneyBox = "axly_money_box"
111111
112112 let kSFFarmingAddr = "swopfi_farming_addr"
113113
114114 let kLendService = "lend_service_addr"
115115
116116 let kOperatorCallPK = "admin_call_pub_key"
117117
118118 let kPriceOracle = "price_oracle"
119119
120120 let kExContract = "exchange_contract"
121121
122122 let kWxSwapContract = "wx_swap_contract"
123123
124124 let kSwopId = "swop_id"
125125
126126 let kWxId = "wx_id"
127127
128128 let kGroup1Admin1PK = "group1_admin1_pub_key"
129129
130130 let kGroup1Admin2PK = "group1_admin2_pub_key"
131131
132132 let kGroup2Admin1PK = "group2_admin1_pub_key"
133133
134134 let kGroup2Admin2PK = "group2_admin2_pub_key"
135135
136136 let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
137137
138138 let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
139139
140140 let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
141141
142142 let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
143143
144144 let SWOPID = fromBase58String(valueOrErrorMessage(getString(this, kSwopId), "No swop id"))
145145
146146 let WXID = fromBase58String(valueOrErrorMessage(getString(this, kWxId), "No wx id"))
147147
148148 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
149149
150150 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
151151
152152 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
153153
154154 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
155155
156156 let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
157157
158158 func unknownPoolType () = throw("Wrong pool type")
159159
160160
161161 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
162162
163163
164164 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
165165 then unit
166166 else throw("Only operator can call this function")
167167
168168
169169 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
170170 then true
171171 else (i.callerPublicKey == group1Admin2PK))
172172 then unit
173173 else throw("Only admin group1 can call this function")
174174
175175
176176 func isSelfCall (i) = if ((i.caller == this))
177177 then unit
178178 else throw("Only contract itself can call this function")
179179
180180
181181 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
182182 then unit
183183 else throw("Only land contract can call this function")
184184
185185
186186 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
187187 then unit
188188 else throw("DApp is inactive at this moment")
189189
190190
191191 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
192192 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
193193 else false)
194194 then unit
195195 else throw("DApp is inactive for users at this moment")
196196
197197
198198 func isPoolActive (pool,type) = {
199199 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
200200 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
201201 if (if (WXSFActive)
202202 then poolActive
203203 else false)
204204 then true
205205 else false
206206 }
207207
208208
209209 func accountBalance (assetId) = match assetId {
210210 case id: ByteVector =>
211211 assetBalance(this, id)
212212 case waves: Unit =>
213213 wavesBalance(this).available
214214 case _ =>
215215 throw("Match error")
216216 }
217217
218218
219219 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"))
220220
221221
222222 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
223223 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
224224 if ($isInstanceOf(@, "Int"))
225225 then @
226226 else throw(($getType(@) + " couldn't be cast to Int"))
227227 }, {
228228 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
229229 if ($isInstanceOf(@, "Int"))
230230 then @
231231 else throw(($getType(@) + " couldn't be cast to Int"))
232232 })
233233
234234
235235 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
236236 then getSFPoolBalances(poolAddr)
237237 else if ((type == WX_POOL))
238238 then getWXPoolBalances(poolAddr, aId, bId)
239239 else unknownPoolType()
240240
241241
242242 func getSFPoolData (poolAddr) = {
243243 let $t080898138 = getSFPoolBalances(poolAddr)
244244 if (($t080898138 == $t080898138))
245245 then {
246246 let balB = $t080898138._2
247247 let balA = $t080898138._1
248248 $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"))
249249 }
250250 else throw("Strict value is not equal to itself.")
251251 }
252252
253253
254254 func getWXPoolData (poolAddr) = {
255255 let cfg = {
256256 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
257257 if ($isInstanceOf(@, "List[Any]"))
258258 then @
259259 else throw(($getType(@) + " couldn't be cast to List[Any]"))
260260 }
261261 if ((cfg == cfg))
262262 then {
263263 let aId = valueOrErrorMessage({
264264 let @ = cfg[4]
265265 if ($isInstanceOf(@, "String"))
266266 then @
267267 else unit
268268 }, "Can't get pool A asset id")
269269 let bId = valueOrErrorMessage({
270270 let @ = cfg[5]
271271 if ($isInstanceOf(@, "String"))
272272 then @
273273 else unit
274274 }, "Can't get pool B asset id")
275275 let shareId = valueOrErrorMessage({
276276 let @ = cfg[3]
277277 if ($isInstanceOf(@, "String"))
278278 then @
279279 else unit
280280 }, "Can't get pool LP asset id")
281281 let $t088358894 = getWXPoolBalances(poolAddr, aId, bId)
282282 if (($t088358894 == $t088358894))
283283 then {
284284 let balB = $t088358894._2
285285 let balA = $t088358894._1
286286 $Tuple5(aId, bId, balA, balB, shareId)
287287 }
288288 else throw("Strict value is not equal to itself.")
289289 }
290290 else throw("Strict value is not equal to itself.")
291291 }
292292
293293
294294 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
295295 then getSFPoolData(poolAddr)
296296 else if ((type == WX_POOL))
297297 then getWXPoolData(poolAddr)
298298 else unknownPoolType()
299299
300300
301301 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
302302 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
303303 else if ((type == WX_POOL))
304304 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
305305 else unknownPoolType()
306306
307307
308308 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
309309
310310
311311 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
312312
313313
314314 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
315315
316316
317317 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
318318 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
319319 else if ((feeType == CAP_FEE_NO_LOAN))
320320 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
321321 else if ((feeType == LOAN_FEE))
322322 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
323323 else if ((feeType == NO_LOAN_FEE))
324324 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
325325 else if ((feeType == NO_FEE))
326326 then 0
327327 else throw("Wrong fee type")
328328
329329
330330 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
331331
332332
333333 func getWXFarmingAddr (poolAddr) = {
334334 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
335335 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
336336 Address(fromBase58String(factroyCfg[1]))
337337 }
338338
339339
340340 func assetIdToStr (assetId) = match assetId {
341341 case id: ByteVector =>
342342 toBase58String(id)
343343 case waves: Unit =>
344344 "WAVES"
345345 case _ =>
346346 throw("Not Asset id")
347347 }
348348
349349
350350 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
351351 then unit
352352 else fromBase58String(assetId)
353353
354354
355355 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
356356 then 8
357357 else match assetInfo(fromBase58String(assetId)) {
358358 case asset: Asset =>
359359 asset.decimals
360360 case _ =>
361361 throw("Can't find asset")
362362 }
363363
364364
365365 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
366366
367367
368368 func getAssetsPrice (assetIds) = {
369369 func getPrices (a,assetId) = {
370370 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
371371 (a :+ assetPrice)
372372 }
373373
374374 let $l = assetIds
375375 let $s = size($l)
376376 let $acc0 = nil
377377 func $f0_1 ($a,$i) = if (($i >= $s))
378378 then $a
379379 else getPrices($a, $l[$i])
380380
381381 func $f0_2 ($a,$i) = if (($i >= $s))
382382 then $a
383383 else throw("List size exceeds 50")
384384
385385 $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)
386386 }
387387
388388
389389 func getSharePrice (shareId) = {
390390 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
391391 let poolAddr = Address(fromBase58String(pool))
392392 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
393393 let $t01188311948 = getPoolData(poolAddr, pType)
394394 let aId = $t01188311948._1
395395 let bId = $t01188311948._2
396396 let aBalance = $t01188311948._3
397397 let bBalance = $t01188311948._4
398398 let prices = getAssetsPrice([aId, bId])
399399 let dPriceA = prices[0]
400400 let dPriceB = prices[1]
401401 if (if ((0 > dPriceA))
402402 then true
403403 else (0 > dPriceB))
404404 then -1
405405 else {
406406 let shareSupply = getShareSupply(poolAddr, pType, shareId)
407407 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
408408 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
409409 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
410410 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
411411 fraction(sum, sharePrecision, shareSupply)
412412 }
413413 }
414414
415415
416416 func getSharePrices (shareIds) = {
417417 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
418418
419419 let $l = shareIds
420420 let $s = size($l)
421421 let $acc0 = nil
422422 func $f0_1 ($a,$i) = if (($i >= $s))
423423 then $a
424424 else getPrices($a, $l[$i])
425425
426426 func $f0_2 ($a,$i) = if (($i >= $s))
427427 then $a
428428 else throw("List size exceeds 20")
429429
430430 $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)
431431 }
432432
433433
434434 func getCursEntries (aId,bId,shareId,wAmounts) = {
435435 let assetsPrices = getAssetsPrice([aId, bId])
436436 let sharePrice = getSharePrice(shareId)
437437 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
438438 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
439439 }
440440
441441
442442 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
443443 then {
444444 let repl = {
445445 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
446446 if ($isInstanceOf(@, "List[Any]"))
447447 then @
448448 else throw(($getType(@) + " couldn't be cast to List[Any]"))
449449 }
450450 if ((repl == repl))
451451 then $Tuple5({
452452 let @ = repl[3]
453453 if ($isInstanceOf(@, "Int"))
454454 then @
455455 else throw(($getType(@) + " couldn't be cast to Int"))
456456 }, {
457457 let @ = repl[4]
458458 if ($isInstanceOf(@, "Int"))
459459 then @
460460 else throw(($getType(@) + " couldn't be cast to Int"))
461461 }, {
462462 let @ = repl[1]
463463 if ($isInstanceOf(@, "Int"))
464464 then @
465465 else throw(($getType(@) + " couldn't be cast to Int"))
466466 }, assetIdToStr(repl[2]), {
467467 let @ = repl[0]
468468 if ($isInstanceOf(@, "Int"))
469469 then @
470470 else throw(($getType(@) + " couldn't be cast to Int"))
471471 })
472472 else throw("Strict value is not equal to itself.")
473473 }
474474 else if ((pType == WX_POOL))
475475 then {
476476 let $t01349213742 = $Tuple2(split({
477477 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
478478 if ($isInstanceOf(@, "String"))
479479 then @
480480 else throw(($getType(@) + " couldn't be cast to String"))
481481 }, "__"), split({
482482 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
483483 if ($isInstanceOf(@, "String"))
484484 then @
485485 else throw(($getType(@) + " couldn't be cast to String"))
486486 }, "__"))
487487 if (($t01349213742 == $t01349213742))
488488 then {
489489 let evalPutInB = $t01349213742._2
490490 let evalPutInA = $t01349213742._1
491491 let lpInA = parseIntValue(evalPutInA[1])
492492 let lpInB = parseIntValue(evalPutInB[1])
493493 if ((lpInB > lpInA))
494494 then {
495495 let pmt = parseIntValue(evalPutInA[8])
496496 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
497497 }
498498 else {
499499 let pmt = parseIntValue(evalPutInB[7])
500500 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
501501 }
502502 }
503503 else throw("Strict value is not equal to itself.")
504504 }
505505 else unknownPoolType()
506506
507507
508508 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
509509 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
510510 if ((pType == SF_POOL))
511511 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
512512 else if ((pType == WX_POOL))
513513 then invoke(poolAddr, "put", [1000000, false], payments)
514514 else unknownPoolType()
515515 }
516516
517517
518518 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
519519 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
520520 if ((pType == SF_POOL))
521521 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
522522 else if ((pType == WX_POOL))
523523 then {
524524 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
525525 then "putOneTknV2"
526526 else "putOneTkn"
527527 invoke(poolAddr, fc, [0, false], payments)
528528 }
529529 else unknownPoolType()
530530 }
531531
532532
533533 func stakeLP (pool,pType,shareId,amount) = {
534534 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
535535 if ((pType == SF_POOL))
536536 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
537537 else if ((pType == WX_POOL))
538538 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
539539 else unknownPoolType()
540540 }
541541
542542
543543 func unstakeLP (pool,pType,shareId,amount) = {
544544 let $t01552015870 = if ((pType == SF_POOL))
545545 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
546546 else if ((pType == WX_POOL))
547547 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
548548 else unknownPoolType()
549549 let farmAddr = $t01552015870._1
550550 let fName = $t01552015870._2
551551 let params = $t01552015870._3
552552 let inv = invoke(farmAddr, fName, params, nil)
553553 if ((inv == inv))
554554 then amount
555555 else throw("Strict value is not equal to itself.")
556556 }
557557
558558
559559 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
560560 let poolAddr = Address(fromBase58String(pool))
561561 let feeScale6 = 1000000
562562 let fee = getIntegerValue(poolAddr, kSFPoolFee)
563563 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
564564 let $t01629216598 = if ((assetTokenToGet == assetIdA))
565565 then {
566566 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
567567 $Tuple2(amountToPay, assetIdB)
568568 }
569569 else {
570570 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
571571 $Tuple2(amountToPay, assetIdA)
572572 }
573573 let amountToPay = $t01629216598._1
574574 let assetToPay = $t01629216598._2
575575 $Tuple2(assetToPay, amountToPay)
576576 }
577577
578578
579579 func getWXSwapFees (pool) = {
580580 let poolAddr = addressFromStringValue(pool)
581581 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
582582 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
583583 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
584584 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
585585 case fees: (Int, Int) =>
586586 $Tuple2(fees._1, fees._2)
587587 case _ =>
588588 $Tuple2(poolFeeDefault, protocolFeeDefault)
589589 }
590590 }
591591
592592
593593 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
594594 let $t01733817377 = getWXSwapFees(pool)
595595 let pFee = $t01733817377._1
596596 let prFee = $t01733817377._2
597597 let feeScale = toBigInt(100000000)
598598 let $t01741717725 = if ((assetTokenToGet == assetIdA))
599599 then {
600600 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
601601 $Tuple2(amountToPay, assetIdB)
602602 }
603603 else {
604604 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
605605 $Tuple2(amountToPay, assetIdA)
606606 }
607607 let amountToPay = $t01741717725._1
608608 let assetToPay = $t01741717725._2
609609 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
610610 $Tuple2(assetToPay, amountToPayWithFee)
611611 }
612612
613613
614614 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
615615 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
616616 if (if ((pType == SF_POOL))
617617 then true
618618 else (poolFB != ""))
619619 then {
620620 let $t01816618378 = if ((poolFB == ""))
621621 then $Tuple3(balA, balB, pool)
622622 else {
623623 let $t01827218345 = getSFPoolBalances(addressFromStringValue(poolFB))
624624 let sfBalA = $t01827218345._1
625625 let sfBalB = $t01827218345._2
626626 $Tuple3(sfBalA, sfBalB, poolFB)
627627 }
628628 let pBalA = $t01816618378._1
629629 let pBalB = $t01816618378._2
630630 let exPool = $t01816618378._3
631631 let $t01838318509 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
632632 let assetToPay = $t01838318509._1
633633 let amountToPay = $t01838318509._2
634634 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
635635 }
636636 else if ((pType == WX_POOL))
637637 then {
638638 let $t01871118833 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
639639 let assetToPay = $t01871118833._1
640640 let amountToPay = $t01871118833._2
641641 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
642642 }
643643 else unknownPoolType()
644644 }
645645
646646
647647 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
648- let $t01912020322 = if ((pType == SF_POOL))
648+ let $t01912020334 = if ((pType == SF_POOL))
649649 then {
650650 let inv = {
651651 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
652652 if ($isInstanceOf(@, "List[Any]"))
653653 then @
654654 else throw(($getType(@) + " couldn't be cast to List[Any]"))
655655 }
656656 if ((inv == inv))
657657 then $Tuple2({
658658 let @ = inv[0]
659659 if ($isInstanceOf(@, "Int"))
660660 then @
661661 else throw(($getType(@) + " couldn't be cast to Int"))
662662 }, {
663663 let @ = inv[1]
664664 if ($isInstanceOf(@, "Int"))
665665 then @
666666 else throw(($getType(@) + " couldn't be cast to Int"))
667667 })
668668 else throw("Strict value is not equal to itself.")
669669 }
670670 else if ((pType == WX_POOL))
671671 then if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
672672 then {
673- let inv = invoke(poolAddr, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
673+ let inv = invoke(poolAddr, "estimateGetOperationWrapperREADONLY", [shareId, userCanWithdraw], nil)
674674 if ((inv == inv))
675675 then {
676- let $t01958020077 = match inv {
676+ let $t01959220089 = match inv {
677677 case _ =>
678678 if (if (if ($isInstanceOf($match0._1, "Int"))
679679 then if ($isInstanceOf($match0._2, "Int"))
680680 then if ($isInstanceOf($match0._5, "Int"))
681681 then if ($isInstanceOf($match0._6, "Int"))
682682 then if ($isInstanceOf($match0._7, "Int"))
683683 then if ($isInstanceOf($match0._8, "String"))
684684 then $isInstanceOf($match0._9, "String")
685685 else false
686686 else false
687687 else false
688688 else false
689689 else false
690690 else false)
691691 then (size($match0) == 10)
692692 else false)
693693 then {
694694 let outAmAmt = $match0._1
695695 let outPrAmt = $match0._2
696696 let amBalance = $match0._5
697697 let prBalance = $match0._6
698698 let lpEmission = $match0._7
699699 let curPrice = $match0._8
700700 let poolStatus = $match0._9
701701 $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
702702 }
703703 else throw("Couldn't cast types")
704704 }
705- let outAmAmt = $t01958020077._1
706- let outPrAmt = $t01958020077._2
707- let amBalance = $t01958020077._3
708- let prBalance = $t01958020077._4
709- let lpEmission = $t01958020077._5
710- let curPrice = $t01958020077._6
711- let poolStatus = $t01958020077._7
705+ let outAmAmt = $t01959220089._1
706+ let outPrAmt = $t01959220089._2
707+ let amBalance = $t01959220089._3
708+ let prBalance = $t01959220089._4
709+ let lpEmission = $t01959220089._5
710+ let curPrice = $t01959220089._6
711+ let poolStatus = $t01959220089._7
712712 $Tuple2(outAmAmt, outPrAmt)
713713 }
714714 else throw("Strict value is not equal to itself.")
715715 }
716716 else {
717717 let inv = split({
718718 let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
719719 if ($isInstanceOf(@, "String"))
720720 then @
721721 else throw(($getType(@) + " couldn't be cast to String"))
722722 }, "__")
723723 if ((inv == inv))
724724 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
725725 else throw("Strict value is not equal to itself.")
726726 }
727727 else unknownPoolType()
728- let amountA = $t01912020322._1
729- let amountB = $t01912020322._2
728+ let amountA = $t01912020334._1
729+ let amountB = $t01912020334._2
730730 $Tuple2(amountA, amountB)
731731 }
732732
733733
734734 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
735735 then {
736736 let balBefore = accountBalance(SWOPID)
737737 if ((balBefore == balBefore))
738738 then {
739739 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
740740 if ((inv == inv))
741741 then {
742742 let balAfter = accountBalance(SWOPID)
743743 $Tuple2((balAfter - balBefore), SWOPID)
744744 }
745745 else throw("Strict value is not equal to itself.")
746746 }
747747 else throw("Strict value is not equal to itself.")
748748 }
749749 else if ((pType == WX_POOL))
750750 then {
751- let $t02069020769 = getWXPoolData(addressFromStringValue(pool))
752- let aId = $t02069020769._1
753- let bId = $t02069020769._2
754- let aBal = $t02069020769._3
755- let bBal = $t02069020769._4
756- let lpId = $t02069020769._5
751+ let $t02070220781 = getWXPoolData(addressFromStringValue(pool))
752+ let aId = $t02070220781._1
753+ let bId = $t02070220781._2
754+ let aBal = $t02070220781._3
755+ let bBal = $t02070220781._4
756+ let lpId = $t02070220781._5
757757 let balBefore = accountBalance(WXID)
758758 if ((balBefore == balBefore))
759759 then {
760760 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
761761 if ((inv == inv))
762762 then {
763763 let balAfter = accountBalance(WXID)
764764 $Tuple2((balAfter - balBefore), WXID)
765765 }
766766 else throw("Strict value is not equal to itself.")
767767 }
768768 else throw("Strict value is not equal to itself.")
769769 }
770770 else unknownPoolType()
771771
772772
773773 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
774774 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
775775 if ((lpBalanceBefore == lpBalanceBefore))
776776 then {
777777 let poolAddr = addressFromStringValue(pool)
778- let $t02136721783 = if (if ((pmtA > 0))
778+ let $t02137921795 = if (if ((pmtA > 0))
779779 then (pmtB > 0)
780780 else false)
781781 then {
782- let $t02143321549 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
783- let pmtInA = $t02143321549._1
784- let pmtInB = $t02143321549._2
785- let change = $t02143321549._3
786- let changeId = $t02143321549._4
782+ let $t02144521561 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
783+ let pmtInA = $t02144521561._1
784+ let pmtInB = $t02144521561._2
785+ let change = $t02144521561._3
786+ let changeId = $t02144521561._4
787787 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
788788 if ((inv == inv))
789789 then $Tuple2(change, changeId)
790790 else throw("Strict value is not equal to itself.")
791791 }
792792 else if ((pmtA > 0))
793793 then $Tuple2(pmtA, aId)
794794 else if ((pmtB > 0))
795795 then $Tuple2(pmtB, bId)
796796 else throw("pmts must be > 0")
797- let change = $t02136721783._1
798- let changeId = $t02136721783._2
797+ let change = $t02137921795._1
798+ let changeId = $t02137921795._2
799799 let inv = if ((change > 0))
800800 then replenishOneTokenByType(poolAddr, pType, change, changeId)
801801 else nil
802802 if ((inv == inv))
803803 then {
804804 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
805805 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
806806 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
807807 let userShareForStake = (totalStaked - axlyFeeAmount)
808808 if ((0 >= userShareForStake))
809809 then throw("amount of staked sharetokens must be > 0")
810810 else {
811811 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
812812 if ((invLP == invLP))
813813 then $Tuple2(userShareForStake, axlyFeeAmount)
814814 else throw("Strict value is not equal to itself.")
815815 }
816816 }
817817 else throw("Strict value is not equal to itself.")
818818 }
819819 else throw("Strict value is not equal to itself.")
820820 }
821821
822822
823823 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
824824 let totalAmount = getPoolTotalShare(pool)
825825 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
826- let $t02264022878 = if (withLoan)
826+ let $t02265222890 = if (withLoan)
827827 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
828828 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
829- let curPoolInterest = $t02264022878._1
830- let totalStakedWithLoan = $t02264022878._2
829+ let curPoolInterest = $t02265222890._1
830+ let totalStakedWithLoan = $t02265222890._2
831831 [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))]
832832 }
833833
834834
835835 func listToInt (a,item) = (a :+ parseIntValue(item))
836836
837837
838838 func directSwopfiCPMM (rArgs,tokenTo) = {
839839 let dApp = addressFromStringValue(rArgs[1])
840840 let pmtP = split(rArgs[2], "|")
841841 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
842842 if ((tokenBalanceBefore == tokenBalanceBefore))
843843 then {
844844 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
845845 let minToRecive = rArgs[3]
846846 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
847847 if ((inv == inv))
848848 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
849849 else throw("Strict value is not equal to itself.")
850850 }
851851 else throw("Strict value is not equal to itself.")
852852 }
853853
854854
855855 func directRoutingSwopfi (rArgs,tokenTo) = {
856856 let dApp = addressFromStringValue(rArgs[1])
857857 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
858858 if ((tokenBalanceBefore == tokenBalanceBefore))
859859 then {
860860 let pmt = {
861861 let pmtP = split(rArgs[2], "|")
862862 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
863863 }
864864 let args = {
865865 let eArgs = split(rArgs[3], "|")
866866 let exchangers = split(eArgs[0], ",")
867867 let exchangersType = split(eArgs[1], ",")
868868 let args1 = {
869869 let $l = split(eArgs[2], ",")
870870 let $s = size($l)
871871 let $acc0 = nil
872872 func $f0_1 ($a,$i) = if (($i >= $s))
873873 then $a
874874 else listToInt($a, $l[$i])
875875
876876 func $f0_2 ($a,$i) = if (($i >= $s))
877877 then $a
878878 else throw("List size exceeds 3")
879879
880880 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
881881 }
882882 let args2 = {
883883 let $l = split(eArgs[3], ",")
884884 let $s = size($l)
885885 let $acc0 = nil
886886 func $f1_1 ($a,$i) = if (($i >= $s))
887887 then $a
888888 else listToInt($a, $l[$i])
889889
890890 func $f1_2 ($a,$i) = if (($i >= $s))
891891 then $a
892892 else throw("List size exceeds 3")
893893
894894 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
895895 }
896896 let routingAssetsKeys = split(eArgs[4], ",")
897897 let minToRecive = parseIntValue(eArgs[5])
898898 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
899899 }
900900 let inv = invoke(dApp, "routingTrade", args, pmt)
901901 if ((inv == inv))
902902 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
903903 else throw("Strict value is not equal to itself.")
904904 }
905905 else throw("Strict value is not equal to itself.")
906906 }
907907
908908
909909 func capitalize (pool,pType,tokenId,tokenAmount) = {
910910 let poolAddr = Address(fromBase58String(pool))
911- let $t02498525051 = getPoolData(poolAddr, pType)
912- let AId = $t02498525051._1
913- let BId = $t02498525051._2
914- let balA = $t02498525051._3
915- let balB = $t02498525051._4
916- let shareId = $t02498525051._5
911+ let $t02499725063 = getPoolData(poolAddr, pType)
912+ let AId = $t02499725063._1
913+ let BId = $t02499725063._2
914+ let balA = $t02499725063._3
915+ let balB = $t02499725063._4
916+ let shareId = $t02499725063._5
917917 if (if ((tokenId != AId))
918918 then (tokenId != BId)
919919 else false)
920920 then throw("Wrong asset")
921921 else {
922922 let totalShareAmount = getPoolTotalShare(pool)
923923 if ((totalShareAmount == 0))
924924 then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
925925 else {
926926 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
927927 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
928928 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
929929 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
930930 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
931931 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
932932 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
933- let $t02579625896 = if ((tokenId == AId))
933+ let $t02580825908 = if ((tokenId == AId))
934934 then $Tuple2((tokenAmount - axlyFee), 0)
935935 else $Tuple2(0, (tokenAmount - axlyFee))
936- let pmtA = $t02579625896._1
937- let pmtB = $t02579625896._2
938- let $t02589926003 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
939- let stakedAmount = $t02589926003._1
940- let nf = $t02589926003._2
936+ let pmtA = $t02580825908._1
937+ let pmtB = $t02580825908._2
938+ let $t02591126015 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
939+ let stakedAmount = $t02591126015._1
940+ let nf = $t02591126015._2
941941 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
942942 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
943943 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
944944 let stakedNoLoan = (stakedAmount - stakedLoan)
945945 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
946946 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
947947 else 0
948948 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
949949 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
950950 else 0
951951 ([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))
952952 }
953953 }
954954 }
955955
956956
957957 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
958958 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
959959 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
960960 let poolInterest = if (borrowed)
961961 then getIntegerValue(this, (pool + kPoolInterestLoan))
962962 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
963963 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
964964 }
965965
966966
967967 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
968968 let feeType = if (isBorrowed)
969969 then STOPLOSS_LOAN
970970 else STOPLOSS_FEE_NO_LOAN
971971 if (stopLoss)
972972 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
973973 else 0
974974 }
975975
976976
977977 func withdrawToUser (user,pool,posId,stopLoss) = {
978978 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
979979 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
980980 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
981981 let poolTotalShare = getPoolTotalShare(pool)
982982 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
983983 let userAddr = Address(fromBase58String(user))
984984 let poolAddr = Address(fromBase58String(pool))
985985 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
986- let $t02853228604 = getPoolData(poolAddr, pType)
987- let idAStr = $t02853228604._1
988- let idBStr = $t02853228604._2
989- let balA = $t02853228604._3
990- let balB = $t02853228604._4
991- let shareId = $t02853228604._5
992- let $t02860728674 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
993- let idA = $t02860728674._1
994- let idB = $t02860728674._2
986+ let $t02854428616 = getPoolData(poolAddr, pType)
987+ let idAStr = $t02854428616._1
988+ let idBStr = $t02854428616._2
989+ let balA = $t02854428616._3
990+ let balB = $t02854428616._4
991+ let shareId = $t02854428616._5
992+ let $t02861928686 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
993+ let idA = $t02861928686._1
994+ let idB = $t02861928686._2
995995 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
996996 let cBalABefore = accountBalance(idA)
997997 if ((cBalABefore == cBalABefore))
998998 then {
999999 let cBalBBefore = accountBalance(idB)
10001000 if ((cBalBBefore == cBalBBefore))
10011001 then {
10021002 let inv = if ((pType == SF_POOL))
10031003 then {
10041004 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
10051005 if ((inv == inv))
10061006 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
10071007 else throw("Strict value is not equal to itself.")
10081008 }
10091009 else if ((pType == WX_POOL))
10101010 then {
10111011 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
10121012 if ((inv == inv))
10131013 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
10141014 else throw("Strict value is not equal to itself.")
10151015 }
10161016 else unknownPoolType()
10171017 if ((inv == inv))
10181018 then {
10191019 let cBalAAfter = accountBalance(idA)
10201020 if ((cBalAAfter == cBalAAfter))
10211021 then {
10221022 let cBalBAfter = accountBalance(idB)
10231023 if ((cBalBAfter == cBalBAfter))
10241024 then {
1025- let $t02936929458 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1026- let tokensAmountA = $t02936929458._1
1027- let tokensAmountB = $t02936929458._2
1028- let $t02946130697 = if (isBorrowed)
1025+ let $t02938129470 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1026+ let tokensAmountA = $t02938129470._1
1027+ let tokensAmountB = $t02938129470._2
1028+ let $t02947330709 = if (isBorrowed)
10291029 then {
10301030 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
10311031 let debt = {
10321032 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
10331033 if ($isInstanceOf(@, "Int"))
10341034 then @
10351035 else throw(($getType(@) + " couldn't be cast to Int"))
10361036 }
10371037 if ((debt == debt))
10381038 then {
10391039 let amountToGetEx = if (if ((borrowAsset == idAStr))
10401040 then (debt > tokensAmountA)
10411041 else false)
10421042 then (debt - tokensAmountA)
10431043 else if (if ((borrowAsset == idBStr))
10441044 then (debt > tokensAmountB)
10451045 else false)
10461046 then (debt - tokensAmountB)
10471047 else 0
10481048 let exInv = if ((amountToGetEx > 0))
10491049 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
10501050 else nil
10511051 if ((exInv == exInv))
10521052 then {
10531053 let cBalAAfterRepay = accountBalance(idA)
10541054 if ((cBalAAfterRepay == cBalAAfterRepay))
10551055 then {
10561056 let cBalBAfterRepay = accountBalance(idB)
10571057 if ((cBalBAfterRepay == cBalBAfterRepay))
10581058 then {
10591059 let closeDbtInv = if ((debt > 0))
10601060 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
10611061 else 0
10621062 if ((closeDbtInv == closeDbtInv))
10631063 then if ((borrowAsset == idAStr))
10641064 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
10651065 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
10661066 else throw("Strict value is not equal to itself.")
10671067 }
10681068 else throw("Strict value is not equal to itself.")
10691069 }
10701070 else throw("Strict value is not equal to itself.")
10711071 }
10721072 else throw("Strict value is not equal to itself.")
10731073 }
10741074 else throw("Strict value is not equal to itself.")
10751075 }
10761076 else $Tuple2(tokensAmountA, tokensAmountB)
1077- let toUserA = $t02946130697._1
1078- let toUserB = $t02946130697._2
1077+ let toUserA = $t02947330709._1
1078+ let toUserB = $t02947330709._2
10791079 let poolTotalLoanEntries = if (isBorrowed)
10801080 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10811081 else nil
10821082 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))
10831083 $Tuple2(entries, [toUserA, toUserB])
10841084 }
10851085 else throw("Strict value is not equal to itself.")
10861086 }
10871087 else throw("Strict value is not equal to itself.")
10881088 }
10891089 else throw("Strict value is not equal to itself.")
10901090 }
10911091 else throw("Strict value is not equal to itself.")
10921092 }
10931093 else throw("Strict value is not equal to itself.")
10941094 }
10951095
10961096
10971097 func parseRequest (requestId) = {
10981098 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
10991099 let user = request[0]
11001100 let pool = request[1]
11011101 let pmtA = parseIntValue(request[2])
11021102 let AId = request[3]
11031103 let pmtB = parseIntValue(request[4])
11041104 let BId = request[5]
11051105 let balA = parseIntValue(request[6])
11061106 let balB = parseIntValue(request[7])
11071107 let shareId = request[8]
11081108 let bwAsset = request[9]
11091109 let bwAmount = parseIntValue(request[10])
11101110 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
11111111 }
11121112
11131113
11141114 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
11151115 then (borrowId != bId)
11161116 else false)
11171117 then throw("Wrong borrow asset")
11181118 else {
11191119 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
11201120 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
11211121 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
11221122 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
11231123 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1124- let $t03267932776 = if ((borrowId == aId))
1124+ let $t03269132788 = if ((borrowId == aId))
11251125 then $Tuple2(dPriceA, decPrA)
11261126 else $Tuple2(dPriceB, decPrB)
1127- let borrowPrice = $t03267932776._1
1128- let borrowDecPr = $t03267932776._2
1127+ let borrowPrice = $t03269132788._1
1128+ let borrowDecPr = $t03269132788._2
11291129 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
11301130 }
11311131
11321132
11331133 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
11341134 then if ((assetIdToStr(pmts[0].assetId) != AId))
11351135 then throw("Wrong payment asset A")
11361136 else if ((assetIdToStr(pmts[1].assetId) != BId))
11371137 then throw("Wrong payment asset B")
11381138 else $Tuple2(pmts[0].amount, pmts[1].amount)
11391139 else if ((size(pmts) == 1))
11401140 then if ((assetIdToStr(pmts[0].assetId) == AId))
11411141 then $Tuple2(pmts[0].amount, 0)
11421142 else if ((assetIdToStr(pmts[0].assetId) == BId))
11431143 then $Tuple2(0, pmts[0].amount)
11441144 else throw("Wrong payment")
11451145 else throw("One or two payments expected")
11461146
11471147
11481148 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
11491149 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
11501150 if ((0 > pri))
11511151 then (pri * -1)
11521152 else pri
11531153 }
11541154
11551155
11561156 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1157- let $t03377634038 = if (claim)
1157+ let $t03378834050 = if (claim)
11581158 then claimFarmed(pType, pool)
11591159 else {
11601160 let claimedAsset = if ((pType == SF_POOL))
11611161 then SWOPID
11621162 else if ((pType == WX_POOL))
11631163 then WXID
11641164 else unknownPoolType()
11651165 $Tuple2(amount, claimedAsset)
11661166 }
1167- if (($t03377634038 == $t03377634038))
1167+ if (($t03378834050 == $t03378834050))
11681168 then {
1169- let claimAsset = $t03377634038._2
1170- let claimAmount = $t03377634038._1
1169+ let claimAsset = $t03378834050._2
1170+ let claimAmount = $t03378834050._1
11711171 let bal = accountBalance(claimAsset)
11721172 if ((bal == bal))
11731173 then if ((amount > bal))
11741174 then throw("To big amount to exchange")
11751175 else $Tuple2(claimAmount, claimAsset)
11761176 else throw("Strict value is not equal to itself.")
11771177 }
11781178 else throw("Strict value is not equal to itself.")
11791179 }
11801180
11811181
11821182 @Callable(i)
11831183 func getPoolInfoREADONLY (pool) = {
11841184 let poolAddr = addressFromStringValue(pool)
11851185 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1186- let $t03440534495 = getPoolData(Address(fromBase58String(pool)), pType)
1187- let AId = $t03440534495._1
1188- let BId = $t03440534495._2
1189- let balA = $t03440534495._3
1190- let balB = $t03440534495._4
1191- let shareId = $t03440534495._5
1186+ let $t03441734507 = getPoolData(Address(fromBase58String(pool)), pType)
1187+ let AId = $t03441734507._1
1188+ let BId = $t03441734507._2
1189+ let balA = $t03441734507._3
1190+ let balB = $t03441734507._4
1191+ let shareId = $t03441734507._5
11921192 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11931193 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11941194 }
11951195
11961196
11971197
11981198 @Callable(i)
11991199 func getShareAssetPriceREADONLY (shareId) = {
12001200 let sharePrices = getSharePrice(shareId)
12011201 $Tuple2(nil, sharePrices)
12021202 }
12031203
12041204
12051205
12061206 @Callable(i)
12071207 func getUserPositionShareAmountREADONLY (user,posNum) = {
12081208 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
12091209 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
12101210 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
12111211 $Tuple2(nil, userCanWithdraw)
12121212 }
12131213
12141214
12151215
12161216 @Callable(i)
12171217 func getUserPositionREADONLY (user,pools,posNum) = {
12181218 func userPos (a,pool) = {
1219- let $t03536835438 = a
1220- let wAmountsA = $t03536835438._1
1221- let wAmountsB = $t03536835438._2
1222- let debts = $t03536835438._3
1223- let eqWAmountsA = $t03536835438._4
1224- let eqWAmountsB = $t03536835438._5
1225- let index = $t03536835438._6
1219+ let $t03538035450 = a
1220+ let wAmountsA = $t03538035450._1
1221+ let wAmountsB = $t03538035450._2
1222+ let debts = $t03538035450._3
1223+ let eqWAmountsA = $t03538035450._4
1224+ let eqWAmountsB = $t03538035450._5
1225+ let index = $t03538035450._6
12261226 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
12271227 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
12281228 else {
12291229 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1230- let $t03571735807 = getPoolData(Address(fromBase58String(pool)), pType)
1231- let AId = $t03571735807._1
1232- let BId = $t03571735807._2
1233- let balA = $t03571735807._3
1234- let balB = $t03571735807._4
1235- let shareId = $t03571735807._5
1230+ let $t03572935819 = getPoolData(Address(fromBase58String(pool)), pType)
1231+ let AId = $t03572935819._1
1232+ let BId = $t03572935819._2
1233+ let balA = $t03572935819._3
1234+ let balB = $t03572935819._4
1235+ let shareId = $t03572935819._5
12361236 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
12371237 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1238- let $t03602336143 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1239- let wAmountA = $t03602336143._1
1240- let wAmountB = $t03602336143._2
1238+ let $t03603536155 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1239+ let wAmountA = $t03603536155._1
1240+ let wAmountB = $t03603536155._2
12411241 if ((borrowAmount > 0))
12421242 then {
12431243 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12441244 let debt = {
12451245 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
12461246 if ($isInstanceOf(@, "Int"))
12471247 then @
12481248 else throw(($getType(@) + " couldn't be cast to Int"))
12491249 }
12501250 if ((debt == debt))
12511251 then {
12521252 let amountToGetEx = if (if ((borrowAsset == AId))
12531253 then (debt > wAmountA)
12541254 else false)
12551255 then (debt - wAmountA)
12561256 else if (if ((borrowAsset == BId))
12571257 then (debt > wAmountB)
12581258 else false)
12591259 then (debt - wAmountB)
12601260 else 0
12611261 let amountToPay = if ((amountToGetEx > 0))
12621262 then if ((pType == SF_POOL))
12631263 then {
12641264 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12651265 ex._2
12661266 }
12671267 else if ((pType == WX_POOL))
12681268 then {
12691269 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12701270 ex._2
12711271 }
12721272 else unknownPoolType()
12731273 else 0
1274- let $t03705537274 = if ((borrowAsset == AId))
1274+ let $t03706737286 = if ((borrowAsset == AId))
12751275 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12761276 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1277- let eqWAmountA = $t03705537274._1
1278- let eqWAmountB = $t03705537274._2
1277+ let eqWAmountA = $t03706737286._1
1278+ let eqWAmountB = $t03706737286._2
12791279 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12801280 }
12811281 else throw("Strict value is not equal to itself.")
12821282 }
12831283 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
12841284 }
12851285 }
12861286
1287- let $t03752937640 = {
1287+ let $t03754137652 = {
12881288 let $l = pools
12891289 let $s = size($l)
12901290 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12911291 func $f0_1 ($a,$i) = if (($i >= $s))
12921292 then $a
12931293 else userPos($a, $l[$i])
12941294
12951295 func $f0_2 ($a,$i) = if (($i >= $s))
12961296 then $a
12971297 else throw("List size exceeds 20")
12981298
12991299 $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)
13001300 }
1301- let wAmountsA = $t03752937640._1
1302- let wAmountsB = $t03752937640._2
1303- let debts = $t03752937640._3
1304- let eqWAmountsA = $t03752937640._4
1305- let eqWAmountsB = $t03752937640._5
1301+ let wAmountsA = $t03754137652._1
1302+ let wAmountsB = $t03754137652._2
1303+ let debts = $t03754137652._3
1304+ let eqWAmountsA = $t03754137652._4
1305+ let eqWAmountsB = $t03754137652._5
13061306 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
13071307 }
13081308
13091309
13101310
13111311 @Callable(i)
13121312 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
13131313 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
13141314 if (!(isPoolActive(pool, pType)))
13151315 then throw("Pool not active at this moment")
13161316 else if (if ((100 > leverage))
13171317 then true
13181318 else (leverage > 300))
13191319 then throw("Leverage can't be <100 and >300")
13201320 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
13211321 then (leverage > 100)
13221322 else false)
13231323 then throw("You can't borrow in this pool")
13241324 else {
1325- let $t03823838328 = getPoolData(Address(fromBase58String(pool)), pType)
1326- let AId = $t03823838328._1
1327- let BId = $t03823838328._2
1328- let balA = $t03823838328._3
1329- let balB = $t03823838328._4
1330- let shareId = $t03823838328._5
1325+ let $t03825038340 = getPoolData(Address(fromBase58String(pool)), pType)
1326+ let AId = $t03825038340._1
1327+ let BId = $t03825038340._2
1328+ let balA = $t03825038340._3
1329+ let balB = $t03825038340._4
1330+ let shareId = $t03825038340._5
13311331 if (if ((borrowId != AId))
13321332 then (borrowId != BId)
13331333 else false)
13341334 then throw("Wrong borrow asset")
13351335 else {
1336- let $t03840938468 = parseReplenishPmts(i.payments, AId, BId)
1337- let pmtA = $t03840938468._1
1338- let pmtB = $t03840938468._2
1336+ let $t03842138480 = parseReplenishPmts(i.payments, AId, BId)
1337+ let pmtA = $t03842138480._1
1338+ let pmtB = $t03842138480._2
13391339 let user = toString(i.caller)
13401340 let newPosNum = getNewUserPositionNumber(user)
13411341 if ((leverage > 100))
13421342 then {
13431343 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
13441344 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
13451345 let newRequestId = {
13461346 let @ = invoke(this, "createNewRequest", [request], nil)
13471347 if ($isInstanceOf(@, "Int"))
13481348 then @
13491349 else throw(($getType(@) + " couldn't be cast to Int"))
13501350 }
13511351 if ((newRequestId == newRequestId))
13521352 then {
13531353 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
13541354 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
13551355 if ((inv == inv))
13561356 then {
13571357 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1358- let $t03945739551 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1359- if (($t03945739551 == $t03945739551))
1358+ let $t03946939563 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1359+ if (($t03946939563 == $t03946939563))
13601360 then {
1361- let newBalB = $t03945739551._2
1362- let newBalA = $t03945739551._1
1361+ let newBalB = $t03946939563._2
1362+ let newBalA = $t03946939563._1
13631363 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1364- let $t03962139736 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1365- let wAmountA = $t03962139736._1
1366- let wAmountB = $t03962139736._2
1364+ let $t03963339748 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1365+ let wAmountA = $t03963339748._1
1366+ let wAmountB = $t03963339748._2
13671367 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13681368 }
13691369 else throw("Strict value is not equal to itself.")
13701370 }
13711371 else throw("Strict value is not equal to itself.")
13721372 }
13731373 else throw("Strict value is not equal to itself.")
13741374 }
13751375 else {
1376- let $t03978939904 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1377- if (($t03978939904 == $t03978939904))
1376+ let $t03980139916 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1377+ if (($t03980139916 == $t03980139916))
13781378 then {
1379- let axlyFee = $t03978939904._2
1380- let userStaked = $t03978939904._1
1381- let $t03991040004 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1382- if (($t03991040004 == $t03991040004))
1379+ let axlyFee = $t03980139916._2
1380+ let userStaked = $t03980139916._1
1381+ let $t03992240016 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1382+ if (($t03992240016 == $t03992240016))
13831383 then {
1384- let newBalB = $t03991040004._2
1385- let newBalA = $t03991040004._1
1384+ let newBalB = $t03992240016._2
1385+ let newBalA = $t03992240016._1
13861386 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1387- let $t04007440189 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1388- let wAmountA = $t04007440189._1
1389- let wAmountB = $t04007440189._2
1387+ let $t04008640201 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1388+ let wAmountA = $t04008640201._1
1389+ let wAmountB = $t04008640201._2
13901390 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13911391 }
13921392 else throw("Strict value is not equal to itself.")
13931393 }
13941394 else throw("Strict value is not equal to itself.")
13951395 }
13961396 }
13971397 }
13981398 })
13991399
14001400
14011401
14021402 @Callable(i)
14031403 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
14041404 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
14051405 if (!(isPoolActive(pool, pType)))
14061406 then throw("Pool not active at this moment")
14071407 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
14081408 })
14091409
14101410
14111411
14121412 @Callable(i)
14131413 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
14141414 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14151415 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
14161416 if (!(isPoolActive(poolId, pType)))
14171417 then throw("Pool not active at this moment")
14181418 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
14191419 then throw("There are no user position")
14201420 else if ((0 >= price))
14211421 then throw("Price must be greater than 0")
14221422 else if ((price > tokenOraclePrice))
14231423 then throw("Price must be less than current token price")
14241424 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
14251425 })
14261426
14271427
14281428
14291429 @Callable(i)
14301430 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
14311431 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
14321432 if (!(isPoolActive(poolId, pType)))
14331433 then throw("Pool not active at this moment")
14341434 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
14351435 then throw("No entry")
14361436 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
14371437 })
14381438
14391439
14401440
14411441 @Callable(i)
14421442 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
14431443 then throw("Already inited")
14441444 else if (!(isDefined(addressFromString(moneyBoxAddr))))
14451445 then throw("moneyBoxAddr is not correct address")
14461446 else if (!(isDefined(addressFromString(sfFarmingAddr))))
14471447 then throw("sfFarmingAddr is not correct address")
14481448 else if (!(isDefined(addressFromString(lendAddr))))
14491449 then throw("lendAddr is not correct address")
14501450 else if (!(isDefined(addressFromString(priceOracleAddr))))
14511451 then throw("priceOracleAddr is not correct address")
14521452 else if (!(isDefined(addressFromString(keeperExContract))))
14531453 then throw("keeperExContract is not correct address")
14541454 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
14551455 then throw("swopAssetId is not correct asset id")
14561456 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
14571457 then throw("swopAssetId is not correct asset id")
14581458 else if ((size(fromBase58String(operatorPubKey)) != 32))
14591459 then throw("operatorPubKey is not correct")
14601460 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
14611461 then throw("group1Admin1PubKey is not correct")
14621462 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
14631463 then throw("group1Admin2PubKey is not correct")
14641464 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
14651465 then throw("group2Admin1PubKey is not correct")
14661466 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
14671467 then throw("group2Admin2PubKey is not correct")
14681468 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)])
14691469
14701470
14711471
14721472 @Callable(i)
14731473 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
14741474 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
14751475 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
14761476 })
14771477
14781478
14791479
14801480 @Callable(i)
14811481 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1482- let $t04502845132 = parseRequest(requestId)
1483- let user = $t04502845132._1
1484- let pool = $t04502845132._2
1485- let pmtA = $t04502845132._3
1486- let AId = $t04502845132._4
1487- let pmtB = $t04502845132._5
1488- let BId = $t04502845132._6
1489- let balA = $t04502845132._7
1490- let balB = $t04502845132._8
1491- let shareId = $t04502845132._9
1492- let bwAsset = $t04502845132._10
1493- let bwAmount = $t04502845132._11
1482+ let $t04504045144 = parseRequest(requestId)
1483+ let user = $t04504045144._1
1484+ let pool = $t04504045144._2
1485+ let pmtA = $t04504045144._3
1486+ let AId = $t04504045144._4
1487+ let pmtB = $t04504045144._5
1488+ let BId = $t04504045144._6
1489+ let balA = $t04504045144._7
1490+ let balB = $t04504045144._8
1491+ let shareId = $t04504045144._9
1492+ let bwAsset = $t04504045144._10
1493+ let bwAmount = $t04504045144._11
14941494 if ((size(i.payments) != 1))
14951495 then throw("Wrong payment size")
14961496 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14971497 then true
14981498 else (i.payments[0].amount != bwAmount))
14991499 then throw("Wrong payment")
15001500 else {
1501- let $t04532245422 = if ((AId == bwAsset))
1501+ let $t04533445434 = if ((AId == bwAsset))
15021502 then $Tuple2((pmtA + bwAmount), pmtB)
15031503 else $Tuple2(pmtA, (pmtB + bwAmount))
1504- let pmtAllA = $t04532245422._1
1505- let pmtAllB = $t04532245422._2
1504+ let pmtAllA = $t04533445434._1
1505+ let pmtAllB = $t04533445434._2
15061506 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1507- let $t04550445619 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1508- let userStaked = $t04550445619._1
1509- let axlyFee = $t04550445619._2
1507+ let $t04551645631 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1508+ let userStaked = $t04551645631._1
1509+ let axlyFee = $t04551645631._2
15101510 let posNum = getNewUserPositionNumber(user)
15111511 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
15121512 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1513- let $t04597946094 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1514- let wAmountA = $t04597946094._1
1515- let wAmountB = $t04597946094._2
1513+ let $t04599146106 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1514+ let wAmountA = $t04599146106._1
1515+ let wAmountB = $t04599146106._2
15161516 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
15171517 }
15181518 }))
15191519
15201520
15211521
15221522 @Callable(i)
15231523 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
15241524 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
15251525 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1526- let $t04661546705 = getPoolData(Address(fromBase58String(pool)), pType)
1527- let AId = $t04661546705._1
1528- let BId = $t04661546705._2
1529- let balA = $t04661546705._3
1530- let balB = $t04661546705._4
1531- let shareId = $t04661546705._5
1526+ let $t04662746717 = getPoolData(Address(fromBase58String(pool)), pType)
1527+ let AId = $t04662746717._1
1528+ let BId = $t04662746717._2
1529+ let balA = $t04662746717._3
1530+ let balB = $t04662746717._4
1531+ let shareId = $t04662746717._5
15321532 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
15331533 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
15341534 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15351535 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
15361536 if ((liquidateAmount > userCanWithdraw))
15371537 then throw("You can't liquidate more than user have")
15381538 else if ((borrowAmount == 0))
15391539 then throw("You can't liquidate position without borrow")
15401540 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))]
15411541 }))
15421542
15431543
15441544
15451545 @Callable(i)
15461546 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15471547 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
15481548 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
15491549 if ((tokenOraclePrice > stopLossPrice))
15501550 then throw("Token price greater stop loss price")
15511551 else {
15521552 let res = withdrawToUser(user, pool, toString(posId), true)
15531553 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
15541554 }
15551555 }))
15561556
15571557
15581558
15591559 @Callable(i)
15601560 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15611561 let pType = getStringValue(this, (kPool + pool))
15621562 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1563- let $t04867548777 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1564- if (($t04867548777 == $t04867548777))
1563+ let $t04868748789 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1564+ if (($t04868748789 == $t04868748789))
15651565 then {
1566- let claimedAsset = $t04867548777._2
1567- let claimedAmount = $t04867548777._1
1566+ let claimedAsset = $t04868748789._2
1567+ let claimedAmount = $t04868748789._1
15681568 let rArgs = split(route, "__")
15691569 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15701570 then directSwopfiCPMM(rArgs, tokenToId)
15711571 else if ((rArgs[0] == "routingSwopfi"))
15721572 then directRoutingSwopfi(rArgs, tokenToId)
15731573 else throw("Wrong route")
15741574 if ((exchangedAmount == exchangedAmount))
15751575 then {
15761576 let newChange = ((claimedAmount + change) - amountToExchange)
15771577 let changeEntry = if ((newChange >= 0))
15781578 then [IntegerEntry((pool + kPoolCapChange), newChange)]
15791579 else nil
15801580 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
15811581 }
15821582 else throw("Strict value is not equal to itself.")
15831583 }
15841584 else throw("Strict value is not equal to itself.")
15851585 }))
15861586
15871587
15881588
15891589 @Callable(i)
15901590 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15911591 let pType = getStringValue(this, (kPool + pool))
1592- let $t04946149559 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1593- if (($t04946149559 == $t04946149559))
1592+ let $t04947349571 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1593+ if (($t04947349571 == $t04947349571))
15941594 then {
1595- let claimedAsset = $t04946149559._2
1596- let claimedAmount = $t04946149559._1
1595+ let claimedAsset = $t04947349571._2
1596+ let claimedAmount = $t04947349571._1
15971597 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15981598 }
15991599 else throw("Strict value is not equal to itself.")
16001600 }))
16011601
16021602
16031603
16041604 @Callable(i)
16051605 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
16061606 then (type != WX_POOL)
16071607 else false)
16081608 then throw("Wrong type")
16091609 else if (if ((poolType != CPMM))
16101610 then (poolType != FLAT)
16111611 else false)
16121612 then throw("Wrong pool type")
16131613 else {
1614- let $t05008050174 = getPoolData(Address(fromBase58String(poolAddr)), type)
1615- let aId = $t05008050174._1
1616- let bId = $t05008050174._2
1617- let aBal = $t05008050174._3
1618- let bBal = $t05008050174._4
1619- let shareId = $t05008050174._5
1614+ let $t05009250186 = getPoolData(Address(fromBase58String(poolAddr)), type)
1615+ let aId = $t05009250186._1
1616+ let bId = $t05009250186._2
1617+ let aBal = $t05009250186._3
1618+ let bBal = $t05009250186._4
1619+ let shareId = $t05009250186._5
16201620 if ((0 > inFeeNoLoan))
16211621 then throw("inFeeNoLoan must be greater than 0")
16221622 else if ((0 > inFeeLoan))
16231623 then throw("inFeeLoan must be greater than 0")
16241624 else if ((0 > capFeeNoLoan))
16251625 then throw("capFeeNoLoan must be greater than 0")
16261626 else if ((0 > capFeeWithLoan))
16271627 then throw("capFeeWithLoan must be greater than 0")
16281628 else if ((0 > stoplossFeeNoLoan))
16291629 then throw("stoplossFeeNoLoan must be greater than 0")
16301630 else if ((0 > stoplossFeeWithLoan))
16311631 then throw("stoplossFeeWithLoan must be greater than 0")
16321632 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)]
16331633 }))
16341634
16351635
16361636
16371637 @Callable(i)
16381638 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
16391639 then throw(("Can't find pool with addr " + poolAddr))
16401640 else if ((0 > inFeeNoLoan))
16411641 then throw("inFeeNoLoan must be greater than 0")
16421642 else if ((0 > inFeeLoan))
16431643 then throw("inFeeLoan must be greater than 0")
16441644 else if ((0 > capFeeNoLoan))
16451645 then throw("capFeeNoLoan must be greater than 0")
16461646 else if ((0 > capFeeWithLoan))
16471647 then throw("capFeeWithLoan must be greater than 0")
16481648 else if ((0 > stoplossFeeNoLoan))
16491649 then throw("stoplossFeeNoLoan must be greater than 0")
16501650 else if ((0 > stoplossFeeWithLoan))
16511651 then throw("stoplossFeeWithLoan must be greater than 0")
16521652 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)]))
16531653
16541654
16551655
16561656 @Callable(i)
16571657 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
16581658 then throw("dApp already active")
16591659 else [BooleanEntry(kActive, true)])
16601660
16611661
16621662
16631663 @Callable(i)
16641664 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
16651665 then throw("dApp already shutdown")
16661666 else [BooleanEntry(kActive, false)])
16671667
16681668
16691669
16701670 @Callable(i)
16711671 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
16721672 then throw("dApp already active for users")
16731673 else [BooleanEntry(kActiveUsers, true)])
16741674
16751675
16761676
16771677 @Callable(i)
16781678 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
16791679 then throw("dApp already shutdown for users")
16801680 else [BooleanEntry(kActiveUsers, false)])
16811681
16821682
16831683
16841684 @Callable(i)
16851685 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
16861686 then throw("SWOPFI already active")
16871687 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
16881688
16891689
16901690
16911691 @Callable(i)
16921692 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
16931693 then throw("SWOPFI already shutdown")
16941694 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
16951695
16961696
16971697
16981698 @Callable(i)
16991699 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
17001700 then throw("WX already active")
17011701 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
17021702
17031703
17041704
17051705 @Callable(i)
17061706 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
17071707 then throw("WX already shutdown")
17081708 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
17091709
17101710
17111711
17121712 @Callable(i)
17131713 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
17141714 then throw("Unknown pool")
17151715 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
17161716 then throw("Pool already active")
17171717 else [BooleanEntry((pool + kPoolActive), true)])
17181718
17191719
17201720
17211721 @Callable(i)
17221722 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
17231723 then throw("Unknown pool")
17241724 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
17251725 then throw("Pool already shutdown")
17261726 else [BooleanEntry((pool + kPoolActive), false)])
17271727
17281728

github/deemru/w8io/3ef1775 
333.92 ms