tx · J68PxUYPz47WL64ij5ehnSXvWJfSUBa2YgGmV3WV9bud

3MuCofTkjmv397dEuRXE3pZxTb4zDWa96uo:  -0.06000000 Waves

2022.09.13 18:40 [2227520] smart account 3MuCofTkjmv397dEuRXE3pZxTb4zDWa96uo > SELF 0.00000000 Waves

{ "type": 13, "id": "J68PxUYPz47WL64ij5ehnSXvWJfSUBa2YgGmV3WV9bud", "fee": 6000000, "feeAssetId": null, "timestamp": 1663083667615, "version": 2, "chainId": 84, "sender": "3MuCofTkjmv397dEuRXE3pZxTb4zDWa96uo", "senderPublicKey": "HGKkqEdKKPVXHMq25FyB6nm1kyvrixu1a8Av6wc9t5CG", "proofs": [ "3Jw9xokto8934pbD2Lfcvo8ZJw83FK7ZHxCWUuTyJUrsWZScY6mTKcHRvJXRv1v2GGwKwKCs2dN1HEXuUTjKZwVx" ], "script": "base64:BgJtCAISABIAEgMKAQESAwoBARILCgkBAQEBAQEBAQESEAoOAQEBAQEBAQgICAEBAQESAwoBARIFCgMBAQESBgoEAQEBCBIAEgMKAQESABIDCgEIEgASBAoCCAESAwoBARIDCgEIEgMKAQgSAwoBAYcBAAlrX29yYV9rZXkCCWtfb3JhX2tleQAPa19vcmFfYmxvY2tfa2V5Ag9rX29yYV9ibG9ja19rZXkABWtfb3JhAgVrX29yYQAJa19iYWxhbmNlAglrX2JhbGFuY2UADmtfcG9zaXRpb25TaXplAg5rX3Bvc2l0aW9uU2l6ZQAQa19wb3NpdGlvbk1hcmdpbgIQa19wb3NpdGlvbk1hcmdpbgAWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAIWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAAua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgISa19wb3NpdGlvbkZyYWN0aW9uABRrX3Bvc2l0aW9uQ2xvc2VkRGF0ZQIUa19wb3NpdGlvbkNsb3NlZERhdGUADWtfaW5pdGlhbGl6ZWQCDWtfaW5pdGlhbGl6ZWQACGtfcGF1c2VkAghrX3BhdXNlZAAFa19mZWUCBWtfZmVlAA9rX2Z1bmRpbmdQZXJpb2QCD2tfZnVuZGluZ1BlcmlvZAARa19pbml0TWFyZ2luUmF0aW8CEWtfaW5pdE1hcmdpblJhdGlvABhrX21haW50ZW5hbmNlTWFyZ2luUmF0aW8CBWtfbW1yABVrX2xpcXVpZGF0aW9uRmVlUmF0aW8CFWtfbGlxdWlkYXRpb25GZWVSYXRpbwAZa19wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwIWa19wYXJ0TGlxdWlkYXRpb25SYXRpbwANa19zcHJlYWRMaW1pdAINa19zcHJlYWRMaW1pdAAQa19tYXhQcmljZUltcGFjdAIQa19tYXhQcmljZUltcGFjdAAQa19tYXhQcmljZVNwcmVhZAIQa19tYXhQcmljZVNwcmVhZAANa19sYXN0RGF0YVN0cgINa19sYXN0RGF0YVN0cgAOa19sYXN0TWludXRlSWQCDmtfbGFzdE1pbnV0ZUlkAB1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UAE2tfdHdhcERhdGFMYXN0UHJpY2UCE2tfdHdhcERhdGFMYXN0UHJpY2UAGmtfdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkAhprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAAla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIba19sYXRlc3RMb25nUHJlbWl1bUZyYWN0aW9uACZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIca19sYXRlc3RTaG9ydFByZW1pdW1GcmFjdGlvbgASa19uZXh0RnVuZGluZ0Jsb2NrAh5rX25leHRGdW5kaW5nQmxvY2tNaW5UaW1lc3RhbXAAEWtfbG9uZ0Z1bmRpbmdSYXRlAhFrX2xvbmdGdW5kaW5nUmF0ZQASa19zaG9ydEZ1bmRpbmdSYXRlAhJrX3Nob3J0RnVuZGluZ1JhdGUAE2tfcXVvdGVBc3NldFJlc2VydmUCCGtfcXRBc3RSABJrX2Jhc2VBc3NldFJlc2VydmUCCGtfYnNBc3RSABNrX3RvdGFsUG9zaXRpb25TaXplAhNrX3RvdGFsUG9zaXRpb25TaXplABdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQIXa190b3RhbExvbmdQb3NpdGlvblNpemUAGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQIYa190b3RhbFNob3J0UG9zaXRpb25TaXplABRrX2N1bXVsYXRpdmVOb3Rpb25hbAIUa19jdW11bGF0aXZlTm90aW9uYWwAFmtfb3BlbkludGVyZXN0Tm90aW9uYWwCFmtfb3BlbkludGVyZXN0Tm90aW9uYWwAFGtfY29vcmRpbmF0b3JBZGRyZXNzAhRrX2Nvb3JkaW5hdG9yQWRkcmVzcwATa19pbnN1cmFuY2VfYWRkcmVzcwITa19pbnN1cmFuY2VfYWRkcmVzcwAPa19hZG1pbl9hZGRyZXNzAg9rX2FkbWluX2FkZHJlc3MAEmtfYWRtaW5fcHVibGljX2tleQISa19hZG1pbl9wdWJsaWNfa2V5AA1rX3F1b3RlX2Fzc2V0Ag1rX3F1b3RlX2Fzc2V0AA9rX3F1b3RlX3N0YWtpbmcCD2tfcXVvdGVfc3Rha2luZwARa19zdGFraW5nX2FkZHJlc3MCEWtfc3Rha2luZ19hZGRyZXNzAA9rX21pbmVyX2FkZHJlc3MCD2tfbWluZXJfYWRkcmVzcwAQa19vcmRlcnNfYWRkcmVzcwIQa19vcmRlcnNfYWRkcmVzcwASa19yZWZlcnJhbF9hZGRyZXNzAhJrX3JlZmVycmFsX2FkZHJlc3MBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhNDb29yZGluYXRvciBub3Qgc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwEOYWRtaW5QdWJsaWNLZXkACQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfYWRtaW5fcHVibGljX2tleQEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAERcXVvdGVBc3NldFN0YWtpbmcACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUPa19xdW90ZV9zdGFraW5nAhtRdW90ZSBhc3NldCBzdGFraW5nIG5vdCBzZXQBDnN0YWtpbmdBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEWtfc3Rha2luZ19hZGRyZXNzAg9TdGFraW5nIG5vdCBzZXQBEGluc3VyYW5jZUFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUTa19pbnN1cmFuY2VfYWRkcmVzcwIRSW5zdXJhbmNlIG5vdCBzZXQBDG1pbmVyQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ9rX21pbmVyX2FkZHJlc3MCDU1pbmVyIG5vdCBzZXQBDW9yZGVyc0FkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUQa19vcmRlcnNfYWRkcmVzcwIOT3JkZXJzIG5vdCBzZXQBD3JlZmVycmFsQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRJrX3JlZmVycmFsX2FkZHJlc3MCEFJlZmVycmFsIG5vdCBzZXQACERJUl9MT05HAAEACURJUl9TSE9SVAACAA1UV0FQX0lOVEVSVkFMAA8AD09SQUNMRV9JTlRFUlZBTAAPAAdTRUNPTkRTAOgHAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgAHT05FX0RBWQkAaAIAgKMFBQxERUNJTUFMX1VOSVQACEFMTF9GRUVTAGQAD1BOTF9PUFRJT05fU1BPVAABABFQTkxfT1BUSU9OX09SQUNMRQACAQFzAQJfeAkArAICCQCkAwEFAl94AgEsAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBHZtYXgCAl94Al95AwkAZwIFAl94BQJfeQUCX3gFAl95AQ50b0NvbXBvc2l0ZUtleQIEX2tleQhfYWRkcmVzcwkArAICCQCsAgIFBF9rZXkCAV8FCF9hZGRyZXNzAQlsaXN0VG9TdHIBBV9saXN0CgEFX2pvaW4CC2FjY3VtdWxhdG9yA3ZhbAkArAICCQCsAgIFC2FjY3VtdWxhdG9yBQN2YWwCASwECm5ld0xpc3RTdHIKAAIkbAUFX2xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBV9qb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQEC25ld0xpc3RTdHJVCQCzAgIFCm5ld0xpc3RTdHIAAQQLbmV3TGlzdFN0clIDCQAAAgkArwICBQtuZXdMaXN0U3RyVQABAgEsCQCwAgIFC25ld0xpc3RTdHJVAAEFC25ld0xpc3RTdHJVBQtuZXdMaXN0U3RyUgEJc3RyVG9MaXN0AQRfc3RyCQC1CQIFBF9zdHICASwBC3B1c2hUb1F1ZXVlAwVfbGlzdAhfbWF4U2l6ZQZfdmFsdWUDCQBmAgkAkAMBBQVfbGlzdAUIX21heFNpemUJAM0IAgkA0QgCBQVfbGlzdAAABQZfdmFsdWUJAM0IAgUFX2xpc3QFBl92YWx1ZQEDaW50AQFrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBawkArAICAg1ubyB2YWx1ZSBmb3IgBQFrAQhjYmFsYW5jZQAJAQNpbnQBBQlrX2JhbGFuY2UBA2ZlZQAJAQNpbnQBBQVrX2ZlZQEPaW5pdE1hcmdpblJhdGlvAAkBA2ludAEFEWtfaW5pdE1hcmdpblJhdGlvAQZxdEFzdFIACQEDaW50AQUTa19xdW90ZUFzc2V0UmVzZXJ2ZQEGYnNBc3RSAAkBA2ludAEFEmtfYmFzZUFzc2V0UmVzZXJ2ZQERdG90YWxQb3NpdGlvblNpemUACQEDaW50AQUTa190b3RhbFBvc2l0aW9uU2l6ZQESY3VtdWxhdGl2ZU5vdGlvbmFsAAkBA2ludAEFFGtfY3VtdWxhdGl2ZU5vdGlvbmFsARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAJAQNpbnQBBRZrX29wZW5JbnRlcmVzdE5vdGlvbmFsARluZXh0RnVuZGluZ0Jsb2NrVGltZXN0YW1wAAkBA2ludAEFEmtfbmV4dEZ1bmRpbmdCbG9jawEQZnVuZGluZ1BlcmlvZFJhdwAJAQNpbnQBBQ9rX2Z1bmRpbmdQZXJpb2QBFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAkAaAIJARBmdW5kaW5nUGVyaW9kUmF3AAUMREVDSU1BTF9VTklUARRmdW5kaW5nUGVyaW9kU2Vjb25kcwAJAGgCCQEQZnVuZGluZ1BlcmlvZFJhdwAFB1NFQ09ORFMBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ACQEDaW50AQUYa19tYWludGVuYW5jZU1hcmdpblJhdGlvARNsaXF1aWRhdGlvbkZlZVJhdGlvAAkBA2ludAEFFWtfbGlxdWlkYXRpb25GZWVSYXRpbwEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQEDaW50AQUZa19wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwELc3ByZWFkTGltaXQACQEDaW50AQUNa19zcHJlYWRMaW1pdAEObWF4UHJpY2VJbXBhY3QACQEDaW50AQUQa19tYXhQcmljZUltcGFjdAEObWF4UHJpY2VTcHJlYWQACQEDaW50AQUQa19tYXhQcmljZVNwcmVhZAEjbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEDaW50AQUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAkBA2ludAEFJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBA2ludAEFGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkBA2ludAEFF2tfdG90YWxMb25nUG9zaXRpb25TaXplAQ9nZXRBY3R1YWxDYWxsZXIBAWkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgkBDW9yZGVyc0FkZHJlc3MAAghrX3NlbmRlcgkApQgBCAUBaQZjYWxsZXIBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DDF9tYXJnaW5SYXRpbxBfYmFzZU1hcmdpblJhdGlvFF9sYXJnZXJUaGFuT3JFcXVhbFRvBBRyZW1haW5pbmdNYXJnaW5SYXRpbwkAZQIFDF9tYXJnaW5SYXRpbwUQX2Jhc2VNYXJnaW5SYXRpbwMDBRRfbGFyZ2VyVGhhbk9yRXF1YWxUbwkAZgIAAAUUcmVtYWluaW5nTWFyZ2luUmF0aW8HCQACAQIOSW52YWxpZCBtYXJnaW4DAwkBASEBBRRfbGFyZ2VyVGhhbk9yRXF1YWxUbwkAZwIFFHJlbWFpbmluZ01hcmdpblJhdGlvAAAHCQACAQIOSW52YWxpZCBtYXJnaW4GAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQ1fcG9zaXRpb25TaXplAwkAAAIFDV9wb3NpdGlvblNpemUAAAkAAgECLFNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggX3Bvc2l0aW9uU2l6ZSA9PSAwAwkAZgIFDV9wb3NpdGlvblNpemUAAAkBI2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAkBJGxhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgABC2dldFBvc2l0aW9uAQdfdHJhZGVyBA9wb3NpdGlvblNpemVPcHQJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFB190cmFkZXIEByRtYXRjaDAFD3Bvc2l0aW9uU2l6ZU9wdAMJAAECBQckbWF0Y2gwAgNJbnQEDHBvc2l0aW9uU2l6ZQUHJG1hdGNoMAkAlgoEBQxwb3NpdGlvblNpemUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FB190cmFkZXIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFB190cmFkZXIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FB190cmFkZXIJAJYKBAAAAAAAAAAAARNyZXF1aXJlT3BlblBvc2l0aW9uAQdfdHJhZGVyAwkAAAIICQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyAl8xAAAJAAIBAhBObyBvcGVuIHBvc2l0aW9uBgELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHAQZwYXVzZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFCGtfcGF1c2VkBwENdXBkYXRlUmVzZXJ2ZQMGX2lzQWRkEV9xdW90ZUFzc2V0QW1vdW50EF9iYXNlQXNzZXRBbW91bnQDBQZfaXNBZGQEB25ld0Jhc2UJAGUCCQEGYnNBc3RSAAUQX2Jhc2VBc3NldEFtb3VudAMJAGcCAAAFB25ld0Jhc2UJAAIBAipUeCBsZWFkIHRvIGJhc2UgYXNzZXQgcmVzZXJ2ZSA8PSAwLCByZXZlcnQJAJYKBAkAZAIJAQZxdEFzdFIABRFfcXVvdGVBc3NldEFtb3VudAUHbmV3QmFzZQkAZAIJARF0b3RhbFBvc2l0aW9uU2l6ZQAFEF9iYXNlQXNzZXRBbW91bnQJAGQCCQESY3VtdWxhdGl2ZU5vdGlvbmFsAAURX3F1b3RlQXNzZXRBbW91bnQECG5ld1F1b3RlCQBlAgkBBnF0QXN0UgAFEV9xdW90ZUFzc2V0QW1vdW50AwkAZwIAAAUIbmV3UXVvdGUJAAIBAipUeCBsZWFkIHRvIGJhc2UgcXVvdGUgcmVzZXJ2ZSA8PSAwLCByZXZlcnQJAJYKBAUIbmV3UXVvdGUJAGQCCQEGYnNBc3RSAAUQX2Jhc2VBc3NldEFtb3VudAkAZQIJARF0b3RhbFBvc2l0aW9uU2l6ZQAFEF9iYXNlQXNzZXRBbW91bnQJAGUCCQESY3VtdWxhdGl2ZU5vdGlvbmFsAAURX3F1b3RlQXNzZXRBbW91bnQBCXN3YXBJbnB1dAIGX2lzQWRkEV9xdW90ZUFzc2V0QW1vdW50BAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEAWsJAQRtdWxkAgUHX3F0QXN0UgUHX2JzQXN0UgQWcXVvdGVBc3NldFJlc2VydmVBZnRlcgMFBl9pc0FkZAkAZAIFB19xdEFzdFIFEV9xdW90ZUFzc2V0QW1vdW50CQBlAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEFWJhc2VBc3NldFJlc2VydmVBZnRlcgkBBGRpdmQCBQFrBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBBhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMJAQNhYnMBCQBlAgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQdfYnNBc3RSBBVhbW91bnRCYXNlQXNzZXRCb3VnaHQDBQZfaXNBZGQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwkBAS0BBRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMEDSR0MDEyODE2MTMwMDkJAQ11cGRhdGVSZXNlcnZlAwUGX2lzQWRkBRFfcXVvdGVBc3NldEFtb3VudAUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzBBdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDEyODE2MTMwMDkCXzEEFmJhc2VBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxMjgxNjEzMDA5Al8yBBd0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyMQgFDSR0MDEyODE2MTMwMDkCXzMEGGN1bXVsYXRpdmVOb3Rpb25hbEFmdGVyMQgFDSR0MDEyODE2MTMwMDkCXzQEC3ByaWNlQmVmb3JlCQEEZGl2ZAIFB19xdEFzdFIFB19ic0FzdFIEC21hcmtldFByaWNlCQEEZGl2ZAIFEV9xdW90ZUFzc2V0QW1vdW50BRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMECXByaWNlRGlmZgkBA2FicwEJAGUCBQtwcmljZUJlZm9yZQULbWFya2V0UHJpY2UEC3ByaWNlSW1wYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFC3ByaWNlQmVmb3JlCQBkAgULcHJpY2VCZWZvcmUFCXByaWNlRGlmZgQTbWF4UHJpY2VJbXBhY3RWYWx1ZQkBDm1heFByaWNlSW1wYWN0AAMJAGYCBQtwcmljZUltcGFjdAUTbWF4UHJpY2VJbXBhY3RWYWx1ZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINUHJpY2UgaW1wYWN0IAkApAMBBQtwcmljZUltcGFjdAIUID4gbWF4IHByaWNlIGltcGFjdCAJAKQDAQUTbWF4UHJpY2VJbXBhY3RWYWx1ZQIVIGJlZm9yZSBxdW90ZSBhc3NldDogCQCkAwEFB19xdEFzdFICFCBiZWZvcmUgYmFzZSBhc3NldDogCQCkAwEFB19ic0FzdFICISBxdW90ZSBhc3NldCBhbW91bnQgdG8gZXhjaGFuZ2U6IAkApAMBBRFfcXVvdGVBc3NldEFtb3VudAIPIHByaWNlIGJlZm9yZTogCQCkAwEFC3ByaWNlQmVmb3JlAg4gbWFya2V0UHJpY2U6IAkApAMBBQttYXJrZXRQcmljZQkAlwoFBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQFF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxBRZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxBRd0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyMQUYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BBBfb2xkUG9zaXRpb25TaXplEl9vbGRQb3NpdGlvbk1hcmdpbiVfb2xkUG9zaXRpb25DdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uDF9tYXJnaW5EZWx0YQQOZnVuZGluZ1BheW1lbnQDCQECIT0CBRBfb2xkUG9zaXRpb25TaXplAAAEIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFEF9vbGRQb3NpdGlvblNpemUJAQRtdWxkAgkAZQIFIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBSVfb2xkUG9zaXRpb25DdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBRBfb2xkUG9zaXRpb25TaXplAAAEDHNpZ25lZE1hcmdpbgkAZAIJAGUCBQxfbWFyZ2luRGVsdGEFDmZ1bmRpbmdQYXltZW50BRJfb2xkUG9zaXRpb25NYXJnaW4EDSR0MDE0NTAwMTQ2MjcDCQBmAgAABQxzaWduZWRNYXJnaW4JAJQKAgAACQEDYWJzAQUMc2lnbmVkTWFyZ2luCQCUCgIJAQNhYnMBBQxzaWduZWRNYXJnaW4AAAQMcmVtYWluTWFyZ2luCAUNJHQwMTQ1MDAxNDYyNwJfMQQHYmFkRGVidAgFDSR0MDE0NTAwMTQ2MjcCXzIJAJUKAwUMcmVtYWluTWFyZ2luBQdiYWREZWJ0BQ5mdW5kaW5nUGF5bWVudAEWc3dhcE91dHB1dFdpdGhSZXNlcnZlcwUGX2lzQWRkEF9iYXNlQXNzZXRBbW91bnQUX2NoZWNrTWF4UHJpY2VJbXBhY3QSX3F1b3RlQXNzZXRSZXNlcnZlEV9iYXNlQXNzZXRSZXNlcnZlBAtwcmljZUJlZm9yZQkBBGRpdmQCBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlAwkAAAIFEF9iYXNlQXNzZXRBbW91bnQAAAkAAgECGUludmFsaWQgYmFzZSBhc3NldCBhbW91bnQEAWsJAQRtdWxkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQQYYmFzZUFzc2V0UG9vbEFtb3VudEFmdGVyAwUGX2lzQWRkCQBkAgURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRBbW91bnQJAGUCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUQX2Jhc2VBc3NldEFtb3VudAQPcXVvdGVBc3NldEFmdGVyCQEEZGl2ZAIFAWsFGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgQOcXVvdGVBc3NldFNvbGQJAQNhYnMBCQBlAgUPcXVvdGVBc3NldEFmdGVyBRJfcXVvdGVBc3NldFJlc2VydmUEE21heFByaWNlSW1wYWN0VmFsdWUJAQ5tYXhQcmljZUltcGFjdAAEDSR0MDE1NjA0MTU3OTcJAQ11cGRhdGVSZXNlcnZlAwkBASEBBQZfaXNBZGQFDnF1b3RlQXNzZXRTb2xkBRBfYmFzZUFzc2V0QW1vdW50BBdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDE1NjA0MTU3OTcCXzEEFmJhc2VBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxNTYwNDE1Nzk3Al8yBBd0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyMQgFDSR0MDE1NjA0MTU3OTcCXzMEGGN1bXVsYXRpdmVOb3Rpb25hbEFmdGVyMQgFDSR0MDE1NjA0MTU3OTcCXzQEC21hcmtldFByaWNlCQEEZGl2ZAIFDnF1b3RlQXNzZXRTb2xkBRBfYmFzZUFzc2V0QW1vdW50BAlwcmljZURpZmYJAQNhYnMBCQBlAgULcHJpY2VCZWZvcmUFC21hcmtldFByaWNlBAtwcmljZUltcGFjdAkAZQIFDERFQ0lNQUxfVU5JVAkBBGRpdmQCBQtwcmljZUJlZm9yZQkAZAIFC3ByaWNlQmVmb3JlBQlwcmljZURpZmYDAwkAZgIFC3ByaWNlSW1wYWN0BRNtYXhQcmljZUltcGFjdFZhbHVlBRRfY2hlY2tNYXhQcmljZUltcGFjdAcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDVByaWNlIGltcGFjdCAJAKQDAQULcHJpY2VJbXBhY3QCFCA+IG1heCBwcmljZSBpbXBhY3QgCQCkAwEFE21heFByaWNlSW1wYWN0VmFsdWUCFSBiZWZvcmUgcXVvdGUgYXNzZXQ6IAkApAMBBRJfcXVvdGVBc3NldFJlc2VydmUCFCBiZWZvcmUgYmFzZSBhc3NldDogCQCkAwEFEV9iYXNlQXNzZXRSZXNlcnZlAiAgYmFzZSBhc3NldCBhbW91bnQgdG8gZXhjaGFuZ2U6IAkApAMBBRBfYmFzZUFzc2V0QW1vdW50Ag8gcHJpY2UgYmVmb3JlOiAJAKQDAQULcHJpY2VCZWZvcmUCDyBtYXJrZXQgcHJpY2U6IAkApAMBBQttYXJrZXRQcmljZQkAmgoIBQ5xdW90ZUFzc2V0U29sZAUXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEFFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxBRhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMFBl9pc0FkZAkBA2FicwEFEF9iYXNlQXNzZXRBbW91bnQAAAkAZQIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAQEhAQUGX2lzQWRkCQEDYWJzAQUQX2Jhc2VBc3NldEFtb3VudAAABQtwcmljZUltcGFjdAEKc3dhcE91dHB1dAMGX2lzQWRkEF9iYXNlQXNzZXRBbW91bnQUX2NoZWNrTWF4UHJpY2VJbXBhY3QJARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBQUGX2lzQWRkBRBfYmFzZUFzc2V0QW1vdW50BRRfY2hlY2tNYXhQcmljZUltcGFjdAkBBnF0QXN0UgAJAQZic0FzdFIAARJnZXRPcmFjbGVUd2FwUHJpY2UABAZvcmFjbGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQVrX29yYQIABAhwcmljZUtleQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUJa19vcmFfa2V5BAhibG9ja0tleQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUPa19vcmFfYmxvY2tfa2V5BAlsYXN0VmFsdWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQZvcmFjbGUFCHByaWNlS2V5CQCsAgIJAKwCAgkArAICAiJDYW4gbm90IGdldCBvcmFjbGUgcHJpY2UuIE9yYWNsZTogCQClCAEFBm9yYWNsZQIGIGtleTogBQhwcmljZUtleQUJbGFzdFZhbHVlARlyZXF1aXJlTm90T3ZlclNwcmVhZExpbWl0AhJfcXVvdGVBc3NldFJlc2VydmURX2Jhc2VBc3NldFJlc2VydmUEC29yYWNsZVByaWNlCQESZ2V0T3JhY2xlVHdhcFByaWNlAAQKcHJpY2VBZnRlcgkBBGRpdmQCBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlBAxhdmVyYWdlUHJpY2UJAQRkaXZkAgkAZAIFC29yYWNsZVByaWNlBQpwcmljZUFmdGVyCQBoAgACBQxERUNJTUFMX1VOSVQEDGFic1ByaWNlRGlmZgkBBGRpdmQCCQEDYWJzAQkAZQIFC29yYWNsZVByaWNlBQpwcmljZUFmdGVyBQxhdmVyYWdlUHJpY2UDCQBmAgUMYWJzUHJpY2VEaWZmCQEObWF4UHJpY2VTcHJlYWQACQACAQkArAICCQCsAgIJAKwCAgINUHJpY2Ugc3ByZWFkIAkApAMBBQxhYnNQcmljZURpZmYCFCA+IG1heCBwcmljZSBzcHJlYWQgCQCkAwEJAQ5tYXhQcmljZVNwcmVhZAAGAQxnZXRTcG90UHJpY2UABBJfcXVvdGVBc3NldFJlc2VydmUJAQZxdEFzdFIABBFfYmFzZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0UgAJAQRkaXZkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQEWaXNPdmVyRmx1Y3R1YXRpb25MaW1pdAAEC29yYWNsZVByaWNlCQESZ2V0T3JhY2xlVHdhcFByaWNlAAQMY3VycmVudFByaWNlCQEMZ2V0U3BvdFByaWNlAAkAZgIJAQRkaXZkAgkBA2FicwEJAGUCBQtvcmFjbGVQcmljZQUMY3VycmVudFByaWNlBQtvcmFjbGVQcmljZQkBC3NwcmVhZExpbWl0AAEfZ2V0UG9zaXRpb25BZGp1c3RlZE9wZW5Ob3Rpb25hbAQNX3Bvc2l0aW9uU2l6ZQdfb3B0aW9uEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQQPcG9zaXRpb25TaXplQWJzCQEDYWJzAQUNX3Bvc2l0aW9uU2l6ZQQHaXNTaG9ydAkAZgIAAAUNX3Bvc2l0aW9uU2l6ZQQQcG9zaXRpb25Ob3Rpb25hbAMJAAACBQdfb3B0aW9uBQ9QTkxfT1BUSU9OX1NQT1QEDSR0MDE5MDE1MTkxODYJARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBQkBASEBBQdpc1Nob3J0BQ9wb3NpdGlvblNpemVBYnMHBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlBBNvdXRQb3NpdGlvbk5vdGlvbmFsCAUNJHQwMTkwMTUxOTE4NgJfMQQCeDEIBQ0kdDAxOTAxNTE5MTg2Al8yBAJ4MggFDSR0MDE5MDE1MTkxODYCXzMEAngzCAUNJHQwMTkwMTUxOTE4NgJfNAUTb3V0UG9zaXRpb25Ob3Rpb25hbAkBBG11bGQCBQ9wb3NpdGlvblNpemVBYnMJARJnZXRPcmFjbGVUd2FwUHJpY2UABRBwb3NpdGlvbk5vdGlvbmFsAStnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubEJ5VmFsdWVzBQ1fcG9zaXRpb25TaXplFV9wb3NpdGlvbk9wZW5Ob3Rpb25hbBJfcXVvdGVBc3NldFJlc2VydmURX2Jhc2VBc3NldFJlc2VydmUHX29wdGlvbgMJAAACBQ1fcG9zaXRpb25TaXplAAAJAAIBAhVJbnZhbGlkIHBvc2l0aW9uIHNpemUEB2lzU2hvcnQJAGYCAAAFDV9wb3NpdGlvblNpemUEEHBvc2l0aW9uTm90aW9uYWwJAR9nZXRQb3NpdGlvbkFkanVzdGVkT3Blbk5vdGlvbmFsBAUNX3Bvc2l0aW9uU2l6ZQUHX29wdGlvbgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQQNdW5yZWFsaXplZFBubAMFB2lzU2hvcnQJAGUCBRVfcG9zaXRpb25PcGVuTm90aW9uYWwFEHBvc2l0aW9uTm90aW9uYWwJAGUCBRBwb3NpdGlvbk5vdGlvbmFsBRVfcG9zaXRpb25PcGVuTm90aW9uYWwJAJQKAgUQcG9zaXRpb25Ob3Rpb25hbAUNdW5yZWFsaXplZFBubAEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCB190cmFkZXIHX29wdGlvbgQNJHQwMjA1MDMyMDYzMQkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMjA1MDMyMDYzMQJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAyMDUwMzIwNjMxAl8yBBRwb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDIwNTAzMjA2MzECXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMjA1MDMyMDYzMQJfNAkBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMFBQxwb3NpdGlvblNpemUFFHBvc2l0aW9uT3Blbk5vdGlvbmFsCQEGcXRBc3RSAAkBBmJzQXN0UgAFB19vcHRpb24BD2NhbGNNYXJnaW5SYXRpbwMNX3JlbWFpbk1hcmdpbghfYmFkRGVidBFfcG9zaXRpb25Ob3Rpb25hbAkBBGRpdmQCCQBlAgUNX3JlbWFpbk1hcmdpbgUIX2JhZERlYnQFEV9wb3NpdGlvbk5vdGlvbmFsARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAgdfdHJhZGVyB19vcHRpb24EDSR0MDIxMTEyMjEyMjMJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIEDHBvc2l0aW9uU2l6ZQgFDSR0MDIxMTEyMjEyMjMCXzEEDnBvc2l0aW9uTWFyZ2luCAUNJHQwMjExMTIyMTIyMwJfMgQDcG9uCAUNJHQwMjExMTIyMTIyMwJfMwQRcG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAyMTExMjIxMjIzAl80BA0kdDAyMTIyOTIxMzIyCQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCBQdfdHJhZGVyBQdfb3B0aW9uBBBwb3NpdGlvbk5vdGlvbmFsCAUNJHQwMjEyMjkyMTMyMgJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDIxMjI5MjEzMjICXzIEDSR0MDIxMzI3MjE0OTMJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUMcG9zaXRpb25TaXplBQ5wb3NpdGlvbk1hcmdpbgURcG9zaXRpb25Mc3RVcGRDUEYFDXVucmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDIxMzI3MjE0OTMCXzEEB2JhZERlYnQIBQ0kdDAyMTMyNzIxNDkzAl8yCQEPY2FsY01hcmdpblJhdGlvAwUMcmVtYWluTWFyZ2luBQdiYWREZWJ0BRBwb3NpdGlvbk5vdGlvbmFsAQ5nZXRNYXJnaW5SYXRpbwEHX3RyYWRlcgkBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QBG2dldFBhcnRpYWxMaXF1aWRhdGlvbkFtb3VudAIHX3RyYWRlcg1fcG9zaXRpb25TaXplBAxtYXhpbXVtUmF0aW8JAQR2bWF4AgkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAkAZQIFDERFQ0lNQUxfVU5JVAkBBGRpdmQCCQEOZ2V0TWFyZ2luUmF0aW8BBQdfdHJhZGVyCQEWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAEGG1heEV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkBBG11bGQCCQEDYWJzAQUNX3Bvc2l0aW9uU2l6ZQUMbWF4aW11bVJhdGlvBApzd2FwUmVzdWx0CQEKc3dhcE91dHB1dAMJAGYCBQ1fcG9zaXRpb25TaXplAAAFGG1heEV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQcEHG1heEV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQIBQpzd2FwUmVzdWx0Al8xBAtwcmljZUltcGFjdAgFCnN3YXBSZXN1bHQCXzgDCQBmAgkBDm1heFByaWNlSW1wYWN0AAULcHJpY2VJbXBhY3QFHG1heEV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQEFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkBBG11bGQCCQEDYWJzAQUNX3Bvc2l0aW9uU2l6ZQkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgJAQpzd2FwT3V0cHV0AwkAZgIFDV9wb3NpdGlvblNpemUAAAUVZXhjaGFuZ2VkUG9zaXRpb25TaXplBwJfMQUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAEVaW50ZXJuYWxDbG9zZVBvc2l0aW9uAgdfdHJhZGVyFF9jaGVja01heFByaWNlSW1wYWN0BA0kdDAyMjcyNjIyODU0CQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBAxwb3NpdGlvblNpemUIBQ0kdDAyMjcyNjIyODU0Al8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDIyNzI2MjI4NTQCXzIEFHBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMjI3MjYyMjg1NAJfMwQRcG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAyMjcyNjIyODU0Al80BA11bnJlYWxpemVkUG5sCAkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UAl8yBA0kdDAyMjk0OTIzMTE3CQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FEXBvc2l0aW9uTHN0VXBkQ1BGBQ11bnJlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDAyMjk0OTIzMTE3Al8xBAdiYWREZWJ0CAUNJHQwMjI5NDkyMzExNwJfMgQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQEBLQEFDHBvc2l0aW9uU2l6ZQQLcmVhbGl6ZWRQbmwFDXVucmVhbGl6ZWRQbmwEDW1hcmdpblRvVmF1bHQJAQEtAQUMcmVtYWluTWFyZ2luBA0kdDAyMzI0NDIzNTU1CQEKc3dhcE91dHB1dAMJAGYCBQxwb3NpdGlvblNpemUAAAkBA2FicwEFDHBvc2l0aW9uU2l6ZQUUX2NoZWNrTWF4UHJpY2VJbXBhY3QEGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQIBQ0kdDAyMzI0NDIzNTU1Al8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMjMyNDQyMzU1NQJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMjMyNDQyMzU1NQJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDIzMjQ0MjM1NTUCXzQEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwMjMyNDQyMzU1NQJfNQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDAyMzI0NDIzNTU1Al82BA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDAyMzI0NDIzNTU1Al83BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAUUcG9zaXRpb25PcGVuTm90aW9uYWwJAJ4KDAUVZXhjaGFuZ2VkUG9zaXRpb25TaXplBQdiYWREZWJ0BQtyZWFsaXplZFBubAUNbWFyZ2luVG9WYXVsdAUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgEQZ2V0VHdhcFNwb3RQcmljZQAECG1pbnV0ZUlkCQBpAgkAaQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wAOgHADwEDXN0YXJ0TWludXRlSWQJAGUCBQhtaW51dGVJZAUNVFdBUF9JTlRFUlZBTAQHbGlzdFN0cgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rX2xhc3REYXRhU3RyAgAEBGxpc3QJALUJAgUHbGlzdFN0cgIBLAoBCGZpbHRlckZuAgthY2N1bXVsYXRvcgRuZXh0AwkAZwIFDXN0YXJ0TWludXRlSWQJAQ1wYXJzZUludFZhbHVlAQUEbmV4dAkAzQgCBQthY2N1bXVsYXRvcgkBDXBhcnNlSW50VmFsdWUBBQRuZXh0BQthY2N1bXVsYXRvcgQFbGlzdEYKAAIkbAUEbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZmlsdGVyRm4CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQIbWF4SW5kZXgDCQBmAgkAkAMBBQVsaXN0RgAACQCWAwEFBWxpc3RGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbGlzdAAABAxsYXN0TWludXRlSWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUOa19sYXN0TWludXRlSWQAAAQWZW5kTGFzdEN1bXVsYXRpdmVQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UCAV8JAKQDAQUMbGFzdE1pbnV0ZUlkAAAEDGVuZExhc3RQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBQxsYXN0TWludXRlSWQAAAQSbm93Q3VtdWxhdGl2ZVByaWNlCQBkAgUWZW5kTGFzdEN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQhtaW51dGVJZAUMbGFzdE1pbnV0ZUlkBQxlbmRMYXN0UHJpY2UEGHN0YXJ0TGFzdEN1bXVsYXRpdmVQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UCAV8JAKQDAQUIbWF4SW5kZXgAAAQOc3RhcnRMYXN0UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIFE2tfdHdhcERhdGFMYXN0UHJpY2UCAV8JAKQDAQUIbWF4SW5kZXgAAAQUc3RhcnRDdW11bGF0aXZlUHJpY2UJAGQCBRhzdGFydExhc3RDdW11bGF0aXZlUHJpY2UJAGgCCQBlAgUNc3RhcnRNaW51dGVJZAUIbWF4SW5kZXgFDnN0YXJ0TGFzdFByaWNlCQBpAgkAZQIFEm5vd0N1bXVsYXRpdmVQcmljZQUUc3RhcnRDdW11bGF0aXZlUHJpY2UFDVRXQVBfSU5URVJWQUwBEGdldFBlZ0FkanVzdENvc3QBBl9wcmljZQQNX3Bvc2l0aW9uU2l6ZQkBEXRvdGFsUG9zaXRpb25TaXplAAQJZGlyZWN0aW9uCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABBVjdXJyZW50TmV0TWFya2V0VmFsdWUICQEKc3dhcE91dHB1dAMFCWRpcmVjdGlvbgkBA2FicwEFDV9wb3NpdGlvblNpemUHAl8xBBBiYXNlQXNzZXRSZXNlcnZlCQEGYnNBc3RSAAQUbmV3UXVvdGVBc3NldFJlc2VydmUJAQRtdWxkAgUQYmFzZUFzc2V0UmVzZXJ2ZQUGX3ByaWNlBARjb3N0CAkBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMFBQ1fcG9zaXRpb25TaXplBRVjdXJyZW50TmV0TWFya2V0VmFsdWUFFG5ld1F1b3RlQXNzZXRSZXNlcnZlBRBiYXNlQXNzZXRSZXNlcnZlBQ9QTkxfT1BUSU9OX1NQT1QCXzIJAJQKAgUUbmV3UXVvdGVBc3NldFJlc2VydmUFBGNvc3QBDnVwZGF0ZVNldHRpbmdzCRBfaW5pdE1hcmdpblJhdGlvBF9tbXIUX2xpcXVpZGF0aW9uRmVlUmF0aW8OX2Z1bmRpbmdQZXJpb2QEX2ZlZQxfc3ByZWFkTGltaXQPX21heFByaWNlSW1wYWN0GF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbw9fbWF4UHJpY2VTcHJlYWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtfaW5pdE1hcmdpblJhdGlvBRBfaW5pdE1hcmdpblJhdGlvCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhrX21haW50ZW5hbmNlTWFyZ2luUmF0aW8FBF9tbXIJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtfbGlxdWlkYXRpb25GZWVSYXRpbwUUX2xpcXVpZGF0aW9uRmVlUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFD2tfZnVuZGluZ1BlcmlvZAUOX2Z1bmRpbmdQZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIFBWtfZmVlBQRfZmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rX3NwcmVhZExpbWl0BQxfc3ByZWFkTGltaXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbWF4UHJpY2VJbXBhY3QFD19tYXhQcmljZUltcGFjdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZa19wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrX21heFByaWNlU3ByZWFkBQ9fbWF4UHJpY2VTcHJlYWQFA25pbAENdXBkYXRlRnVuZGluZwURX25leHRGdW5kaW5nQmxvY2skX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uJV9sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24QX2xvbmdGdW5kaW5nUmF0ZRFfc2hvcnRGdW5kaW5nUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19uZXh0RnVuZGluZ0Jsb2NrBRFfbmV4dEZ1bmRpbmdCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUkX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBSZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUlX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19sb25nRnVuZGluZ1JhdGUFEF9sb25nRnVuZGluZ1JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfc2hvcnRGdW5kaW5nUmF0ZQURX3Nob3J0RnVuZGluZ1JhdGUFA25pbAEOdXBkYXRlUG9zaXRpb24FCF9hZGRyZXNzBV9zaXplB19tYXJnaW4NX29wZW5Ob3Rpb25hbCBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFCF9hZGRyZXNzBQVfc2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgUIX2FkZHJlc3MFB19tYXJnaW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFCF9hZGRyZXNzBQ1fb3Blbk5vdGlvbmFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQhfYWRkcmVzcwUgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FA25pbAEKYXBwZW5kVHdhcAEFcHJpY2UECG1pbnV0ZUlkCQBpAgkAaQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wAOgHADwEEHByZXZpb3VzTWludXRlSWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUOa19sYXN0TWludXRlSWQAAAMJAGYCBRBwcmV2aW91c01pbnV0ZUlkBQhtaW51dGVJZAkAAgECEVRXQVAgb3V0LW9mLW9yZGVyBAxsYXN0TWludXRlSWQDCQAAAgUQcHJldmlvdXNNaW51dGVJZAAABQhtaW51dGVJZAUQcHJldmlvdXNNaW51dGVJZAMJAGYCBQhtaW51dGVJZAUQcHJldmlvdXNNaW51dGVJZAQTcHJldkN1bXVsYXRpdmVQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UCAV8JAKQDAQUQcHJldmlvdXNNaW51dGVJZAAABAlwcmV2UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIFE2tfdHdhcERhdGFMYXN0UHJpY2UCAV8JAKQDAQUQcHJldmlvdXNNaW51dGVJZAUFcHJpY2UEE2xhc3RDdW11bGF0aXZlUHJpY2UJAGQCBRNwcmV2Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBQxsYXN0TWludXRlSWQFCXByZXZQcmljZQQEbGlzdAkBC3B1c2hUb1F1ZXVlAwkBCXN0clRvTGlzdAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUNa19sYXN0RGF0YVN0cgIABQ1UV0FQX0lOVEVSVkFMCQCkAwEFCG1pbnV0ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQkApAMBBQhtaW51dGVJZAUTbGFzdEN1bXVsYXRpdmVQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUTa190d2FwRGF0YUxhc3RQcmljZQkApAMBBQhtaW51dGVJZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFGmtfdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkCQCkAwEFCG1pbnV0ZUlkBRBwcmV2aW91c01pbnV0ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rX2xhc3RNaW51dGVJZAUIbWludXRlSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUNa19sYXN0RGF0YVN0cgkBCWxpc3RUb1N0cgEFBGxpc3QFA25pbAQYdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFGmtfdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkCQCkAwEFCG1pbnV0ZUlkAAAEE3ByZXZDdW11bGF0aXZlUHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UJAKQDAQUYdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkAAAECXByZXZQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRNrX3R3YXBEYXRhTGFzdFByaWNlCQCkAwEFGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAUFcHJpY2UEE2xhc3RDdW11bGF0aXZlUHJpY2UJAGQCBRNwcmV2Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBRh0d2FwRGF0YVByZXZpb3VzTWludXRlSWQFCXByZXZQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UJAKQDAQUIbWludXRlSWQFE2xhc3RDdW11bGF0aXZlUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFE2tfdHdhcERhdGFMYXN0UHJpY2UJAKQDAQUIbWludXRlSWQFBXByaWNlBQNuaWwBEXVwZGF0ZUFtbVJlc2VydmVzAgdfcXRBc3RSB19ic0FzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfcXVvdGVBc3NldFJlc2VydmUFB19xdEFzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfYmFzZUFzc2V0UmVzZXJ2ZQUHX2JzQXN0UgUDbmlsAQl1cGRhdGVBbW0HB19xdEFzdFIHX2JzQXN0UhdfdG90YWxQb3NpdGlvblNpemVBZnRlchhfY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIVX29wZW5JbnRlcmVzdE5vdGlvbmFsFl90b3RhbExvbmdQb3NpdGlvblNpemUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUDCQECIT0CCQBlAgUWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUFF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICGEludmFsaWQgQU1NIHN0YXRlIGRhdGE6IAkApAMBBRZfdG90YWxMb25nUG9zaXRpb25TaXplAgQgKyAgCQCkAwEFF190b3RhbFNob3J0UG9zaXRpb25TaXplAgQgIT0gCQCkAwEFF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCQDOCAIJAM4IAgkBEXVwZGF0ZUFtbVJlc2VydmVzAgUHX3F0QXN0UgUHX2JzQXN0UgkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa190b3RhbFBvc2l0aW9uU2l6ZQUXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFFGtfY3VtdWxhdGl2ZU5vdGlvbmFsBRhfY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFFmtfb3BlbkludGVyZXN0Tm90aW9uYWwFFV9vcGVuSW50ZXJlc3ROb3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXa190b3RhbExvbmdQb3NpdGlvblNpemUFFl90b3RhbExvbmdQb3NpdGlvblNpemUJAMwIAgkBDEludGVnZXJFbnRyeQIFGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUFA25pbAkBCmFwcGVuZFR3YXABCQEEZGl2ZAIFB19xdEFzdFIFB19ic0FzdFIBDmRlbGV0ZVBvc2l0aW9uAQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQUIX2FkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgUIX2FkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAUIX2FkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUIX2FkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFFGtfcG9zaXRpb25DbG9zZWREYXRlBQhfYWRkcmVzcwgFCWxhc3RCbG9jawl0aW1lc3RhbXAFA25pbAEId2l0aGRyYXcCCF9hZGRyZXNzB19hbW91bnQEB2JhbGFuY2UJAPAHAgUEdGhpcwkBCnF1b3RlQXNzZXQAAwkAZgIFB19hbW91bnQFB2JhbGFuY2UJAAIBCQCsAgIJAKwCAgkArAICAhNVbmFibGUgdG8gd2l0aGRyYXcgCQCkAwEFB19hbW91bnQCFyBmcm9tIGNvbnRyYWN0IGJhbGFuY2UgCQCkAwEFB2JhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIX2FkZHJlc3MFB19hbW91bnQJAQpxdW90ZUFzc2V0AAUDbmlsAQ11cGRhdGVCYWxhbmNlAQFpAwkAZgIAAAUBaQkAAgECB0JhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtfYmFsYW5jZQUBaQUDbmlsAQt0cmFuc2ZlckZlZQEBaQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEOc3Rha2luZ0FkZHJlc3MABQFpCQEKcXVvdGVBc3NldAAFA25pbBMBaQEFcGF1c2UAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECGkludmFsaWQgdG9nZ2xlUGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAYFA25pbAFpAQd1bnBhdXNlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhpJbnZhbGlkIHRvZ2dsZVBhdXNlIHBhcmFtcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUIa19wYXVzZWQHBQNuaWwBaQEMYWRkTGlxdWlkaXR5ARFfcXVvdGVBc3NldEFtb3VudAMDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MABgkAZwIAAAURX3F1b3RlQXNzZXRBbW91bnQJAAIBAhtJbnZhbGlkIGFkZExpcXVpZGl0eSBwYXJhbXMEB19xdEFzdFIJAQZxdEFzdFIABAdfYnNBc3RSCQEGYnNBc3RSAAQFcHJpY2UJAQRkaXZkAgUHX3F0QXN0UgUHX2JzQXN0UgQUYmFzZUFzc2V0QW1vdW50VG9BZGQJAQRkaXZkAgURX3F1b3RlQXNzZXRBbW91bnQFBXByaWNlBAtxdEFzdFJBZnRlcgkAZAIFB19xdEFzdFIFEV9xdW90ZUFzc2V0QW1vdW50BAtic0FzdFJBZnRlcgkAZAIFB19ic0FzdFIFFGJhc2VBc3NldEFtb3VudFRvQWRkCQERdXBkYXRlQW1tUmVzZXJ2ZXMCBQtxdEFzdFJBZnRlcgULYnNBc3RSQWZ0ZXIBaQEPcmVtb3ZlTGlxdWlkaXR5ARFfcXVvdGVBc3NldEFtb3VudAMDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MABgkAZwIAAAURX3F1b3RlQXNzZXRBbW91bnQJAAIBAh5JbnZhbGlkIHJlbW92ZUxpcXVpZGl0eSBwYXJhbXMEB19xdEFzdFIJAQZxdEFzdFIABAdfYnNBc3RSCQEGYnNBc3RSAAQFcHJpY2UJAQRkaXZkAgUHX3F0QXN0UgUHX2JzQXN0UgQXYmFzZUFzc2V0QW1vdW50VG9SZW1vdmUJAQRkaXZkAgURX3F1b3RlQXNzZXRBbW91bnQFBXByaWNlBAtxdEFzdFJBZnRlcgkAZQIFB19xdEFzdFIFEV9xdW90ZUFzc2V0QW1vdW50BAtic0FzdFJBZnRlcgkAZQIFB19ic0FzdFIFF2Jhc2VBc3NldEFtb3VudFRvUmVtb3ZlCQERdXBkYXRlQW1tUmVzZXJ2ZXMCBQtxdEFzdFJBZnRlcgULYnNBc3RSQWZ0ZXIBaQEOY2hhbmdlU2V0dGluZ3MJEF9pbml0TWFyZ2luUmF0aW8EX21tchRfbGlxdWlkYXRpb25GZWVSYXRpbw5fZnVuZGluZ1BlcmlvZARfZmVlDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAh1JbnZhbGlkIGNoYW5nZVNldHRpbmdzIHBhcmFtcwkBDnVwZGF0ZVNldHRpbmdzCQUQX2luaXRNYXJnaW5SYXRpbwUEX21tcgUUX2xpcXVpZGF0aW9uRmVlUmF0aW8FDl9mdW5kaW5nUGVyaW9kBQRfZmVlBQxfc3ByZWFkTGltaXQFD19tYXhQcmljZUltcGFjdAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBQ9fbWF4UHJpY2VTcHJlYWQBaQEKaW5pdGlhbGl6ZQ4HX3F0QXN0UgdfYnNBc3RSDl9mdW5kaW5nUGVyaW9kEF9pbml0TWFyZ2luUmF0aW8EX21tchRfbGlxdWlkYXRpb25GZWVSYXRpbwRfZmVlB19vcmFjbGUKX29yYWNsZUtleQxfY29vcmRpbmF0b3IMX3NwcmVhZExpbWl0D19tYXhQcmljZUltcGFjdBhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8PX21heFByaWNlU3ByZWFkAwMDAwMDAwMDAwMDCQBnAgAABQdfcXRBc3RSBgkAZwIAAAUHX2JzQXN0UgYJAGcCAAAFDl9mdW5kaW5nUGVyaW9kBgkAZwIAAAUQX2luaXRNYXJnaW5SYXRpbwYJAGcCAAAFBF9tbXIGCQBnAgAABRRfbGlxdWlkYXRpb25GZWVSYXRpbwYJAGcCAAAFBF9mZWUGCQBnAgAABQxfc3ByZWFkTGltaXQGCQBnAgAABQ9fbWF4UHJpY2VJbXBhY3QGCQBnAgAABRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8GCQBnAgAABQ9fbWF4UHJpY2VTcHJlYWQGCQELaW5pdGlhbGl6ZWQACQACAQIdSW52YWxpZCBpbml0aWFsaXplIHBhcmFtZXRlcnMJAM4IAgkAzggCCQDOCAIJAM4IAgkBCXVwZGF0ZUFtbQcFB19xdEFzdFIFB19ic0FzdFIAAAAAAAAAAAAACQEOdXBkYXRlU2V0dGluZ3MJBRBfaW5pdE1hcmdpblJhdGlvBQRfbW1yBRRfbGlxdWlkYXRpb25GZWVSYXRpbwUOX2Z1bmRpbmdQZXJpb2QFBF9mZWUFDF9zcHJlYWRMaW1pdAUPX21heFByaWNlSW1wYWN0BRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8FD19tYXhQcmljZVNwcmVhZAkBDXVwZGF0ZUZ1bmRpbmcFCQBkAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFDl9mdW5kaW5nUGVyaW9kAAAAAAAAAAAJAQ11cGRhdGVCYWxhbmNlAQAACQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rX2luaXRpYWxpemVkBgkAzAgCCQELU3RyaW5nRW50cnkCBQVrX29yYQUHX29yYWNsZQkAzAgCCQELU3RyaW5nRW50cnkCBQlrX29yYV9rZXkFCl9vcmFjbGVLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUUa19jb29yZGluYXRvckFkZHJlc3MFDF9jb29yZGluYXRvcgUDbmlsAWkBEnNldEluaXRNYXJnaW5SYXRpbwEQX2luaXRNYXJnaW5SYXRpbwMDCQBnAgAABRBfaW5pdE1hcmdpblJhdGlvBgkBASEBCQELaW5pdGlhbGl6ZWQACQACAQIlSW52YWxpZCBzZXRJbml0TWFyZ2luUmF0aW8gcGFyYW1ldGVycwkBDnVwZGF0ZVNldHRpbmdzCQUQX2luaXRNYXJnaW5SYXRpbwkBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ACQETbGlxdWlkYXRpb25GZWVSYXRpbwAJARBmdW5kaW5nUGVyaW9kUmF3AAkBA2ZlZQAJAQtzcHJlYWRMaW1pdAAJAQ5tYXhQcmljZUltcGFjdAAJARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwAJAQ5tYXhQcmljZVNwcmVhZAABaQEQZGVjcmVhc2VQb3NpdGlvbgMHX2Ftb3VudAlfbGV2ZXJhZ2UTX21pbkJhc2VBc3NldEFtb3VudAMDAwMDCQBnAgAABQdfYW1vdW50BgkBASEBCQELaW5pdGlhbGl6ZWQABgkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMJAQRkaXZkAgUMREVDSU1BTF9VTklUBQlfbGV2ZXJhZ2UJAQ9pbml0TWFyZ2luUmF0aW8ABgYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgYJAQZwYXVzZWQACQACAQIjSW52YWxpZCBkZWNyZWFzZVBvc2l0aW9uIHBhcmFtZXRlcnMEDSR0MDM2MDczMzYyMjUJAQtnZXRQb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDAzNjA3MzM2MjI1Al8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDM2MDczMzYyMjUCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMzYwNzMzNjIyNQJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAzNjA3MzM2MjI1Al80BApfZGlyZWN0aW9uAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAABQlESVJfU0hPUlQFCERJUl9MT05HBAVpc0FkZAkAAAIFCl9kaXJlY3Rpb24FCERJUl9MT05HBAxvcGVuTm90aW9uYWwJAQRtdWxkAgUHX2Ftb3VudAUJX2xldmVyYWdlBA0kdDAzNjM5ODM2NTE0CQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCCQClCAEIBQFpBmNhbGxlcgUPUE5MX09QVElPTl9TUE9UBBNvbGRQb3NpdGlvbk5vdGlvbmFsCAUNJHQwMzYzOTgzNjUxNAJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDM2Mzk4MzY1MTQCXzIEDSR0MDM2NTIwMzkwNjkDCQBmAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUMb3Blbk5vdGlvbmFsBA0kdDAzNjg5NzM3MTE2CQEJc3dhcElucHV0AgUFaXNBZGQFDG9wZW5Ob3Rpb25hbAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCAUNJHQwMzY4OTczNzExNgJfMQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDM2ODk3MzcxMTYCXzIEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDM2ODk3MzcxMTYCXzMEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDAzNjg5NzM3MTE2Al80BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDM2ODk3MzcxMTYCXzUEGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQMDCQECIT0CBRNfbWluQmFzZUFzc2V0QW1vdW50AAAJAGYCBRNfbWluQmFzZUFzc2V0QW1vdW50BRhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMHCQACAQkArAICCQCsAgIJAKwCAgIlVG9vIGxpdHRsZSBiYXNlIGFzc2V0IGV4Y2hhbmdlZCwgZ290IAkApAMBBRhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMCCiBleHBlY3RlZCAJAKQDAQUTX21pbkJhc2VBc3NldEFtb3VudAQLcmVhbGl6ZWRQbmwJAQRkaXZkAgkBBG11bGQCBQ11bnJlYWxpemVkUG5sBRhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMJAQNhYnMBBQ9vbGRQb3NpdGlvblNpemUEDSR0MDM3NTUzMzc3OTgJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFC3JlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDAzNzU1MzM3Nzk4Al8xBAdiYWREZWJ0CAUNJHQwMzc1NTMzNzc5OAJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDAzNzU1MzM3Nzk4Al8zBBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BQxvcGVuTm90aW9uYWwEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQPbmV3UG9zaXRpb25TaXplCQBkAgUPb2xkUG9zaXRpb25TaXplBRVleGNoYW5nZWRQb3NpdGlvblNpemUJAJ0KCwUPbmV3UG9zaXRpb25TaXplBQxyZW1haW5NYXJnaW4JAQNhYnMBBRJyZW1haW5PcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAUMb3Blbk5vdGlvbmFsCQBlAgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQADCQBmAgUPbmV3UG9zaXRpb25TaXplAAAJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkAZQIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQAACQACAQIUQ2xvc2UgcG9zaXRpb24gZmlyc3QED25ld1Bvc2l0aW9uU2l6ZQgFDSR0MDM2NTIwMzkwNjkCXzEEF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luCAUNJHQwMzY1MjAzOTA2OQJfMgQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAzNjUyMDM5MDY5Al8zBBRuZXdQb3NpdGlvbkxhdGVzdENQRggFDSR0MDM2NTIwMzkwNjkCXzQEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDM2NTIwMzkwNjkCXzUEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzNjUyMDM5MDY5Al82BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMzY1MjAzOTA2OQJfNwQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDAzNjUyMDM5MDY5Al84BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCAUNJHQwMzY1MjAzOTA2OQJfOQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDAzNjUyMDM5MDY5A18xMAQPdG90YWxTaG9ydEFmdGVyCAUNJHQwMzY1MjAzOTA2OQNfMTEEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUDbmlsBQNuaWwDCQAAAgUObm90aWZ5Tm90aW9uYWwFDm5vdGlmeU5vdGlvbmFsCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUJAKUIAQgFAWkGY2FsbGVyBQ9uZXdQb3NpdGlvblNpemUFF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUbmV3UG9zaXRpb25MYXRlc3RDUEYJAQl1cGRhdGVBbW0HBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGluY3JlYXNlUG9zaXRpb24ECl9kaXJlY3Rpb24JX2xldmVyYWdlE19taW5CYXNlQXNzZXRBbW91bnQIX3JlZkxpbmsECl9yYXdBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwMDAwMDAwkBAiE9AgUKX2RpcmVjdGlvbgUIRElSX0xPTkcJAQIhPQIFCl9kaXJlY3Rpb24FCURJUl9TSE9SVAcGCQBnAgAABQpfcmF3QW1vdW50BgkBASEBCQELaW5pdGlhbGl6ZWQABgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQEKcXVvdGVBc3NldAAGCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwkBBGRpdmQCBQxERUNJTUFMX1VOSVQFCV9sZXZlcmFnZQkBD2luaXRNYXJnaW5SYXRpbwAGBgkBBnBhdXNlZAAJAAIBAiNJbnZhbGlkIGluY3JlYXNlUG9zaXRpb24gcGFyYW1ldGVycwQHX3RyYWRlcgkApQgBCAUBaQZjYWxsZXIEDHJhd0ZlZUFtb3VudAkBBG11bGQCBQpfcmF3QW1vdW50CQEDZmVlAAQOcmVmZXJyZXJGZWVBbnkJAPwHBAkBD3JlZmVycmFsQWRkcmVzcwACFWFjY2VwdFBheW1lbnRXaXRoTGluawkAzAgCBQdfdHJhZGVyCQDMCAIFCF9yZWZMaW5rBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUMcmF3RmVlQW1vdW50BQNuaWwDCQAAAgUOcmVmZXJyZXJGZWVBbnkFDnJlZmVycmVyRmVlQW55BAtyZWZlcnJlckZlZQQHJG1hdGNoMAUOcmVmZXJyZXJGZWVBbnkDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQITSW52YWxpZCByZWZlcnJlckZlZQQHX2Ftb3VudAkAZQIFCl9yYXdBbW91bnQFDHJhd0ZlZUFtb3VudAQJZmVlQW1vdW50CQBlAgUMcmF3RmVlQW1vdW50BQtyZWZlcnJlckZlZQQNJHQwNDA1OTg0MDczOAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwNDA1OTg0MDczOAJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDA0MDU5ODQwNzM4Al8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDQwNTk4NDA3MzgCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNDA1OTg0MDczOAJfNAQNaXNOZXdQb3NpdGlvbgkAAAIFD29sZFBvc2l0aW9uU2l6ZQAABA9pc1NhbWVEaXJlY3Rpb24DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwkAAAIFCl9kaXJlY3Rpb24FCURJUl9TSE9SVAQOZXhwYW5kRXhpc3RpbmcDCQEBIQEFDWlzTmV3UG9zaXRpb24FD2lzU2FtZURpcmVjdGlvbgcEBWlzQWRkCQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcEDSR0MDQxMDI3NDM1OTUDAwUNaXNOZXdQb3NpdGlvbgYFDmV4cGFuZEV4aXN0aW5nBAxvcGVuTm90aW9uYWwJAQRtdWxkAgUHX2Ftb3VudAUJX2xldmVyYWdlBA0kdDA0MTQ1MTQxNjU3CQEJc3dhcElucHV0AgUFaXNBZGQFDG9wZW5Ob3Rpb25hbAQVYW1vdW50QmFzZUFzc2V0Qm91Z2h0CAUNJHQwNDE0NTE0MTY1NwJfMQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDQxNDUxNDE2NTcCXzIEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDQxNDUxNDE2NTcCXzMEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA0MTQ1MTQxNjU3Al80BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDQxNDUxNDE2NTcCXzUDAwkBAiE9AgUTX21pbkJhc2VBc3NldEFtb3VudAAACQBmAgUTX21pbkJhc2VBc3NldEFtb3VudAkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAcJAAIBCQCsAgIJAKwCAgkArAICAg1MaW1pdCBlcnJvcjogCQCkAwEJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQCAyA8IAkApAMBBRNfbWluQmFzZUFzc2V0QW1vdW50BA9uZXdQb3NpdGlvblNpemUJAGQCBQ9vbGRQb3NpdGlvblNpemUFFWFtb3VudEJhc2VBc3NldEJvdWdodAQZaW5jcmVhc2VNYXJnaW5SZXF1aXJlbWVudAkBBGRpdmQCBQxvcGVuTm90aW9uYWwFCV9sZXZlcmFnZQQNJHQwNDIwMzg0MjI3NwkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgUZaW5jcmVhc2VNYXJnaW5SZXF1aXJlbWVudAQMcmVtYWluTWFyZ2luCAUNJHQwNDIwMzg0MjI3NwJfMQQCeDEIBQ0kdDA0MjAzODQyMjc3Al8yBAJ4MggFDSR0MDQyMDM4NDIyNzcCXzMDCQEBIQEJARlyZXF1aXJlTm90T3ZlclNwcmVhZExpbWl0AgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCQACAQIVT3ZlciBtYXggc3ByZWFkIGxpbWl0CQCdCgsFD25ld1Bvc2l0aW9uU2l6ZQUMcmVtYWluTWFyZ2luCQBkAgUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwFDG9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9uZXdQb3NpdGlvblNpemUFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIJAGQCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABQxvcGVuTm90aW9uYWwJAGQCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAAACQBkAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplCQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AAAEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDQzMjg4NDM0MDQJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIJAKUIAQgFAWkGY2FsbGVyBQ9QTkxfT1BUSU9OX1NQT1QEE29sZFBvc2l0aW9uTm90aW9uYWwIBQ0kdDA0MzI4ODQzNDA0Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwNDMyODg0MzQwNAJfMgMJAGYCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAAIBAi5Vc2UgZGVjcmVhc2VQb3NpdGlvbiB0byBkZWNyZWFzZSBwb3NpdGlvbiBzaXplCQACAQIUQ2xvc2UgcG9zaXRpb24gZmlyc3QED25ld1Bvc2l0aW9uU2l6ZQgFDSR0MDQxMDI3NDM1OTUCXzEEF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luCAUNJHQwNDEwMjc0MzU5NQJfMgQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA0MTAyNzQzNTk1Al8zBBRuZXdQb3NpdGlvbkxhdGVzdENQRggFDSR0MDQxMDI3NDM1OTUCXzQEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDQxMDI3NDM1OTUCXzUEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA0MTAyNzQzNTk1Al82BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNDEwMjc0MzU5NQJfNwQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDA0MTAyNzQzNTk1Al84BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCAUNJHQwNDEwMjc0MzU5NQJfOQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA0MTAyNzQzNTk1A18xMAQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNDEwMjc0MzU5NQNfMTEEDGZlZVRvU3Rha2VycwkAaQIFCWZlZUFtb3VudAACBA5mZWVUb0luc3VyYW5jZQkAZQIFCWZlZUFtb3VudAUMZmVlVG9TdGFrZXJzBAVzdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg5sb2NrTmV1dHJpbm9TUAkAzAgCCQClCAEJAQ5zdGFraW5nQWRkcmVzcwAJAMwIAgUIQUxMX0ZFRVMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQdfYW1vdW50BQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlBBBkZXBvc2l0SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDmZlZVRvSW5zdXJhbmNlBQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQJbm90aWZ5RmVlCQD8BwQJAQxtaW5lckFkZHJlc3MAAgpub3RpZnlGZWVzCQDMCAIFB190cmFkZXIJAMwIAgUJZmVlQW1vdW50BQNuaWwFA25pbAMJAAACBQlub3RpZnlGZWUFCW5vdGlmeUZlZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPbmV3UG9zaXRpb25TaXplBRduZXdQb3NpdGlvblJlbWFpbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgkBC3RyYW5zZmVyRmVlAQUMZmVlVG9TdGFrZXJzCQENdXBkYXRlQmFsYW5jZQEJAGQCCQEIY2JhbGFuY2UABQdfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWFkZE1hcmdpbgAECl9yYXdBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwMDAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCQEKcXVvdGVBc3NldAAGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAkAAgECHEludmFsaWQgYWRkTWFyZ2luIHBhcmFtZXRlcnMEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyBAxyYXdGZWVBbW91bnQJAQRtdWxkAgUKX3Jhd0Ftb3VudAkBA2ZlZQAEDnJlZmVycmVyRmVlQW55CQD8BwQJAQ9yZWZlcnJhbEFkZHJlc3MAAg1hY2NlcHRQYXltZW50CQDMCAIFB190cmFkZXIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQxyYXdGZWVBbW91bnQFA25pbAMJAAACBQ5yZWZlcnJlckZlZUFueQUOcmVmZXJyZXJGZWVBbnkEC3JlZmVycmVyRmVlBAckbWF0Y2gwBQ5yZWZlcnJlckZlZUFueQMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgJAAIBAhNJbnZhbGlkIHJlZmVycmVyRmVlBAlmZWVBbW91bnQJAGUCBQxyYXdGZWVBbW91bnQFC3JlZmVycmVyRmVlBAdfYW1vdW50CQBlAgUKX3Jhd0Ftb3VudAUMcmF3RmVlQW1vdW50BA0kdDA0NTQ4ODQ1NjI4CQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA0NTQ4ODQ1NjI4Al8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDQ1NDg4NDU2MjgCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNDU0ODg0NTYyOAJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA0NTQ4ODQ1NjI4Al80BAxmZWVUb1N0YWtlcnMJAGkCBQlmZWVBbW91bnQAAgQOZmVlVG9JbnN1cmFuY2UJAGUCBQlmZWVBbW91bnQFDGZlZVRvU3Rha2VycwQFc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIObG9ja05ldXRyaW5vU1AJAMwIAgkApQgBCQEOc3Rha2luZ0FkZHJlc3MACQDMCAIFCEFMTF9GRUVTBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUHX2Ftb3VudAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UECW5vdGlmeUZlZQkA/AcECQEMbWluZXJBZGRyZXNzAAIKbm90aWZ5RmVlcwkAzAgCBQdfdHJhZGVyCQDMCAIFCWZlZUFtb3VudAUDbmlsBQNuaWwDCQAAAgUJbm90aWZ5RmVlBQlub3RpZnlGZWUJAM4IAgkAzggCCQEOdXBkYXRlUG9zaXRpb24FBQdfdHJhZGVyBQ9vbGRQb3NpdGlvblNpemUJAGQCBRFvbGRQb3NpdGlvbk1hcmdpbgUHX2Ftb3VudAUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwFFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMcmVtb3ZlTWFyZ2luAQdfYW1vdW50AwMDAwkAZwIAAAUHX2Ftb3VudAYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQIfSW52YWxpZCByZW1vdmVNYXJnaW4gcGFyYW1ldGVycwQNJHQwNDY2NTM0NjgwNQkBC2dldFBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDQ2NjUzNDY4MDUCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNDY2NTM0NjgwNQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA0NjY1MzQ2ODA1Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDQ2NjUzNDY4MDUCXzQEC21hcmdpbkRlbHRhCQEBLQEFB19hbW91bnQEDSR0MDQ2ODQyNDcwMjEJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFC21hcmdpbkRlbHRhBAxyZW1haW5NYXJnaW4IBQ0kdDA0Njg0MjQ3MDIxAl8xBAdiYWREZWJ0CAUNJHQwNDY4NDI0NzAyMQJfMgMJAQIhPQIFB2JhZERlYnQAAAkAAgECHUludmFsaWQgcmVtb3ZlZCBtYXJnaW4gYW1vdW50BAttYXJnaW5SYXRpbwkBD2NhbGNNYXJnaW5SYXRpbwMFDHJlbWFpbk1hcmdpbgUHYmFkRGVidAUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwDCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwULbWFyZ2luUmF0aW8JAQ9pbml0TWFyZ2luUmF0aW8ABgkAAgEJAKwCAgkArAICCQCsAgICGVRvbyBtdWNoIG1hcmdpbiByZW1vdmVkOiAJAKQDAQULbWFyZ2luUmF0aW8CAyA8IAkApAMBCQEPaW5pdE1hcmdpblJhdGlvAAQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCBQdfYW1vdW50CQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQkApQgBCAUBaQZjYWxsZXIFD29sZFBvc2l0aW9uU2l6ZQUMcmVtYWluTWFyZ2luBRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9vbGRQb3NpdGlvblNpemUJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUHX2Ftb3VudAkBDXVwZGF0ZUJhbGFuY2UBCQBlAgkBCGNiYWxhbmNlAAUHX2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1jbG9zZVBvc2l0aW9uAAQGY2FsbGVyCQEPZ2V0QWN0dWFsQ2FsbGVyAQUBaQQNY2FsbGVyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBmNhbGxlcgIOSW52YWxpZCBjYWxsZXIDAwMJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BBQZjYWxsZXIGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAkAAgECIEludmFsaWQgY2xvc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBA0kdDA0ODIyNDQ4NjAxCQEVaW50ZXJuYWxDbG9zZVBvc2l0aW9uAgUGY2FsbGVyBgQCeDEIBQ0kdDA0ODIyNDQ4NjAxAl8xBA9wb3NpdGlvbkJhZERlYnQIBQ0kdDA0ODIyNDQ4NjAxAl8yBAtyZWFsaXplZFBubAgFDSR0MDQ4MjI0NDg2MDECXzMEDW1hcmdpblRvVmF1bHQIBQ0kdDA0ODIyNDQ4NjAxAl80BBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDgyMjQ0ODYwMQJfNQQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDgyMjQ0ODYwMQJfNgQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDQ4MjI0NDg2MDECXzcEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwNDgyMjQ0ODYwMQJfOAQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDQ4MjI0NDg2MDECXzkEAngyCAUNJHQwNDgyMjQ0ODYwMQNfMTAEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNDgyMjQ0ODYwMQNfMTEED3RvdGFsU2hvcnRBZnRlcggFDSR0MDQ4MjI0NDg2MDEDXzEyAwkAZgIFD3Bvc2l0aW9uQmFkRGVidAAACQACAQImVW5hYmxlIHRvIGNsb3NlIHBvc2l0aW9uIHdpdGggYmFkIGRlYnQEDndpdGhkcmF3QW1vdW50CQEDYWJzAQUNbWFyZ2luVG9WYXVsdAQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFDndpdGhkcmF3QW1vdW50BA0kdDA0ODgxMDQ4OTUyAwkAZgIAAAUKYW1tQmFsYW5jZQkAlAoCAAAJAQNhYnMBBQphbW1CYWxhbmNlCQCUCgIFCmFtbUJhbGFuY2UAAAQNYW1tTmV3QmFsYW5jZQgFDSR0MDQ4ODEwNDg5NTICXzEEEGdldEZyb21JbnN1cmFuY2UIBQ0kdDA0ODgxMDQ4OTUyAl8yBAF4AwkAZgIFEGdldEZyb21JbnN1cmFuY2UAAAQRd2l0aGRyYXdJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCBRBnZXRGcm9tSW5zdXJhbmNlBQNuaWwFA25pbAMJAAACBRF3aXRoZHJhd0luc3VyYW5jZQURd2l0aGRyYXdJbnN1cmFuY2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFAXgFAXgEB3Vuc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIOdW5sb2NrTmV1dHJpbm8JAMwIAgkAZQIFDndpdGhkcmF3QW1vdW50BRBnZXRGcm9tSW5zdXJhbmNlCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBA5ub3RpZnlOb3Rpb25hbAkA/AcECQEMbWluZXJBZGRyZXNzAAIObm90aWZ5Tm90aW9uYWwJAMwIAgUGY2FsbGVyCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUObm90aWZ5Tm90aW9uYWwFDm5vdGlmeU5vdGlvbmFsCQDOCAIJAM4IAgkAzggCCQEOZGVsZXRlUG9zaXRpb24BBQZjYWxsZXIJAQl1cGRhdGVBbW0HBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyCQEId2l0aGRyYXcCBQ1jYWxsZXJBZGRyZXNzBQ53aXRoZHJhd0Ftb3VudAkBDXVwZGF0ZUJhbGFuY2UBBQ1hbW1OZXdCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWxpcXVpZGF0ZQEHX3RyYWRlcgQPc3BvdE1hcmdpblJhdGlvCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQLbWFyZ2luUmF0aW8DCQEWaXNPdmVyRmx1Y3R1YXRpb25MaW1pdAAEEW9yYWNsZU1hcmdpblJhdGlvCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFEVBOTF9PUFRJT05fT1JBQ0xFCQEEdm1heAIFD3Nwb3RNYXJnaW5SYXRpbwURb3JhY2xlTWFyZ2luUmF0aW8FD3Nwb3RNYXJnaW5SYXRpbwMDAwMJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DBQttYXJnaW5SYXRpbwkBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ABwYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BBQdfdHJhZGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBAhNVbmFibGUgdG8gbGlxdWlkYXRlAwMDCQBmAgUPc3BvdE1hcmdpblJhdGlvCQETbGlxdWlkYXRpb25GZWVSYXRpbwAJAGYCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8AAAAHCQBmAgUMREVDSU1BTF9VTklUCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABwQNJHQwNTEwMzI1MTE4MgkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwNTEwMzI1MTE4MgJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDA1MTAzMjUxMTgyAl8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDUxMDMyNTExODICXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNTEwMzI1MTE4MgJfNAQKX2RpcmVjdGlvbgMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAUJRElSX1NIT1JUBQhESVJfTE9ORwQFaXNBZGQJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkBG2dldFBhcnRpYWxMaXF1aWRhdGlvbkFtb3VudAIFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQQNJHQwNTE0MDc1MTUxMQkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UBBNvbGRQb3NpdGlvbk5vdGlvbmFsCAUNJHQwNTE0MDc1MTUxMQJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDUxNDA3NTE1MTECXzIEDSR0MDUxNTE5NTE4MDkJAQlzd2FwSW5wdXQCBQVpc0FkZAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCAUNJHQwNTE1MTk1MTgwOQJfMQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDUxNTE5NTE4MDkCXzIEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDUxNTE5NTE4MDkCXzMEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA1MTUxOTUxODA5Al80BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDUxNTE5NTE4MDkCXzUEC3JlYWxpemVkUG5sCQEEZGl2ZAIJAQRtdWxkAgUNdW5yZWFsaXplZFBubAkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkBA2FicwEFD29sZFBvc2l0aW9uU2l6ZQQNJHQwNTE5MTY1MjE0OQkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgULcmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDUxOTE2NTIxNDkCXzEEB2JhZERlYnQIBQ0kdDA1MTkxNjUyMTQ5Al8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDUxOTE2NTIxNDkCXzMEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQSbGlxdWlkYXRpb25QZW5hbHR5CQEEbXVsZAIFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARNsaXF1aWRhdGlvbkZlZVJhdGlvAAQPZmVlVG9MaXF1aWRhdG9yCQBpAgUSbGlxdWlkYXRpb25QZW5hbHR5AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BQ9mZWVUb0xpcXVpZGF0b3IEEW5ld1Bvc2l0aW9uTWFyZ2luCQBlAgUMcmVtYWluTWFyZ2luBRJsaXF1aWRhdGlvblBlbmFsdHkED25ld1Bvc2l0aW9uU2l6ZQkAZAIFD29sZFBvc2l0aW9uU2l6ZQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBA2FicwEFEnJlbWFpbk9wZW5Ob3Rpb25hbAQUbmV3UG9zaXRpb25Mc3RVcGRDUEYJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNTMzMjI1MzQ2NQMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA1MzMyMjUzNDY1Al8xBBF0YWtlRnJvbUluc3VyYW5jZQgFDSR0MDUzMzIyNTM0NjUCXzIEAXgDCQBmAgURdGFrZUZyb21JbnN1cmFuY2UAAAQRd2l0aGRyYXdJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCBRF0YWtlRnJvbUluc3VyYW5jZQUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQF4BQF4BAd1bnN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDnVubG9ja05ldXRyaW5vCQDMCAIJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFEXRha2VGcm9tSW5zdXJhbmNlCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBBBkZXBvc2l0SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDmZlZVRvSW5zdXJhbmNlBQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPbmV3UG9zaXRpb25TaXplBRFuZXdQb3NpdGlvbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgkAZQIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQ9mZWVUb0xpcXVpZGF0b3IJAQ11cGRhdGVCYWxhbmNlAQUNbmV3QW1tQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNTQ5MjE1NTM3NgkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIFB190cmFkZXIHBAJ4MQgFDSR0MDU0OTIxNTUzNzYCXzEEB2JhZERlYnQIBQ0kdDA1NDkyMTU1Mzc2Al8yBAJ4MggFDSR0MDU0OTIxNTUzNzYCXzMEAngzCAUNJHQwNTQ5MjE1NTM3NgJfNAQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDU0OTIxNTUzNzYCXzUEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDU0OTIxNTUzNzYCXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA1NDkyMTU1Mzc2Al83BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDU0OTIxNTUzNzYCXzgEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA1NDkyMTU1Mzc2Al85BBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUNJHQwNTQ5MjE1NTM3NgNfMTAEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNTQ5MjE1NTM3NgNfMTEED3RvdGFsU2hvcnRBZnRlcggFDSR0MDU0OTIxNTUzNzYDXzEyBBJsaXF1aWRhdGlvblBlbmFsdHkJAQRtdWxkAgUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ABA9mZWVUb0xpcXVpZGF0b3IJAGkCBRJsaXF1aWRhdGlvblBlbmFsdHkAAgQOZmVlVG9JbnN1cmFuY2UJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFD2ZlZVRvTGlxdWlkYXRvcgQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNTU3ODg1NTkzMQMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA1NTc4ODU1OTMxAl8xBBF0YWtlRnJvbUluc3VyYW5jZQgFDSR0MDU1Nzg4NTU5MzECXzIEAXgDCQBmAgURdGFrZUZyb21JbnN1cmFuY2UAAAQRd2l0aGRyYXdJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCBRF0YWtlRnJvbUluc3VyYW5jZQUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQF4BQF4BAd1bnN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDnVubG9ja05ldXRyaW5vCQDMCAIJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFEXRha2VGcm9tSW5zdXJhbmNlCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBBBkZXBvc2l0SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDmZlZVRvSW5zdXJhbmNlBQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ5kZWxldGVQb3NpdGlvbgEFB190cmFkZXIJAQl1cGRhdGVBbW0HBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyCQEId2l0aGRyYXcCCAUBaQZjYWxsZXIFD2ZlZVRvTGlxdWlkYXRvcgkBDXVwZGF0ZUJhbGFuY2UBBQ1uZXdBbW1CYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnBheUZ1bmRpbmcABBVmdW5kaW5nQmxvY2tUaW1lc3RhbXAJARluZXh0RnVuZGluZ0Jsb2NrVGltZXN0YW1wAAMDAwkAZgIFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAgFCWxhc3RCbG9jawl0aW1lc3RhbXAGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAkAAgEJAKwCAgkArAICCQCsAgICIUludmFsaWQgZnVuZGluZyBibG9jayB0aW1lc3RhbXA6IAkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAIDIDwgCQCkAwEFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAQPdW5kZXJseWluZ1ByaWNlCQESZ2V0T3JhY2xlVHdhcFByaWNlAAQNc3BvdFR3YXBQcmljZQkBEGdldFR3YXBTcG90UHJpY2UABAdwcmVtaXVtCQBlAgUNc3BvdFR3YXBQcmljZQUPdW5kZXJseWluZ1ByaWNlBA0kdDA1NzUxOTU4ODU0AwMJAAACCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAAAAYJAAACCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAAACQCUCgIAAAAAAwkAZgIAAAUHcHJlbWl1bQQUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZBBNsb25nUHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAJAJQKAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24EE2xvbmdQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZBBRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFE2xvbmdQcmVtaXVtRnJhY3Rpb24JARV0b3RhbExvbmdQb3NpdGlvblNpemUACQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAJAJQKAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24EFHNob3J0UHJlbWl1bUZyYWN0aW9uCAUNJHQwNTc1MTk1ODg1NAJfMQQTbG9uZ1ByZW1pdW1GcmFjdGlvbggFDSR0MDU3NTE5NTg4NTQCXzIJAQ11cGRhdGVGdW5kaW5nBQkAZAIFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAkBFGZ1bmRpbmdQZXJpb2RTZWNvbmRzAAkAZAIJASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAFE2xvbmdQcmVtaXVtRnJhY3Rpb24JAGQCCQEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlCQEEZGl2ZAIFFHNob3J0UHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UBaQEOZm9yY2VNb3ZlQXNzZXQCB190cmFkZXIHX2Ftb3VudAMDCQECIT0CCQCnCAEJAQ5hZG1pblB1YmxpY0tleQAIBQFpBmNhbGxlcgYJAGYCAAAFB19hbW91bnQJAAIBAiFJbnZhbGlkIGZvcmNlTW92ZUFzc2V0IHBhcmFtZXRlcnMEB3Vuc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIOdW5sb2NrTmV1dHJpbm8JAMwIAgUHX2Ftb3VudAkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAzggCCQEId2l0aGRyYXcCCQERQGV4dHJOYXRpdmUoMTA2MikBBQdfdHJhZGVyBQdfYW1vdW50CQENdXBkYXRlQmFsYW5jZQEJAGUCCQEIY2JhbGFuY2UABQdfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWFkanVzdFBlZwEGX3ByaWNlAwMJAQIhPQIJAKcIAQkBDmFkbWluUHVibGljS2V5AAgFAWkGY2FsbGVyBgkAZgIAAAUGX3ByaWNlCQACAQIcSW52YWxpZCBhZGp1c3RQZWcgcGFyYW1ldGVycwQNJHQwNTk4NTQ1OTk0MAkBEGdldFBlZ0FkanVzdENvc3QBBQZfcHJpY2UEFG5ld1F1b3RlQXNzZXRSZXNlcnZlCAUNJHQwNTk4NTQ1OTk0MAJfMQQNcGVnQ2hhbmdlQ29zdAgFDSR0MDU5ODU0NTk5NDACXzIDCQAAAgUNcGVnQ2hhbmdlQ29zdAAACQACAQIRTm90aGluZyB0byBhZGp1c3QDCQBmAgUNcGVnQ2hhbmdlQ29zdAAABBF3aXRoZHJhd0luc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACCHdpdGhkcmF3CQDMCAIFDXBlZ0NoYW5nZUNvc3QFA25pbAUDbmlsAwkAAAIFEXdpdGhkcmF3SW5zdXJhbmNlBRF3aXRoZHJhd0luc3VyYW5jZQQFc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIObG9ja05ldXRyaW5vU1AJAMwIAgkApQgBCQEOc3Rha2luZ0FkZHJlc3MACQDMCAIFCEFMTF9GRUVTBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUNcGVnQ2hhbmdlQ29zdAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQkAzggCCQENdXBkYXRlQmFsYW5jZQEJAGQCCQEIY2JhbGFuY2UABQ1wZWdDaGFuZ2VDb3N0CQERdXBkYXRlQW1tUmVzZXJ2ZXMCBRRuZXdRdW90ZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0UgAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EB3Vuc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIOdW5sb2NrTmV1dHJpbm8JAMwIAgkBA2FicwEFDXBlZ0NoYW5nZUNvc3QJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAkBA2FicwEFDXBlZ0NoYW5nZUNvc3QFA25pbAMJAAACBRBkZXBvc2l0SW5zdXJhbmNlBRBkZXBvc2l0SW5zdXJhbmNlCQDOCAIJAQ11cGRhdGVCYWxhbmNlAQkAZQIJAQhjYmFsYW5jZQAJAQNhYnMBBQ1wZWdDaGFuZ2VDb3N0CQERdXBkYXRlQW1tUmVzZXJ2ZXMCBRRuZXdRdW90ZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0UgAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFdl9nZXQBB190cmFkZXIEDSR0MDYxMTY1NjEyMjUJARVpbnRlcm5hbENsb3NlUG9zaXRpb24CBQdfdHJhZGVyBwQCeDEIBQ0kdDA2MTE2NTYxMjI1Al8xBAJ4MggFDSR0MDYxMTY1NjEyMjUCXzIEAngzCAUNJHQwNjExNjU2MTIyNQJfMwQCeDQIBQ0kdDA2MTE2NTYxMjI1Al80CQACAQkArAICCQCsAgIJAKwCAgkBAXMBBQJ4MgkBAXMBBQJ4MwkBAXMBBQJ4NAkBAXMBCQEOZ2V0TWFyZ2luUmF0aW8BBQdfdHJhZGVyAWkBJ3ZpZXdfY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAEHX3RyYWRlcgQNJHQwNjEzNzI2MTQ4MwkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwNjEzNzI2MTQ4MwJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDA2MTM3MjYxNDgzAl8yBANwb24IBQ0kdDA2MTM3MjYxNDgzAl8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDYxMzcyNjE0ODMCXzQEDSR0MDYxNDg4NjE1ODkJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQQcG9zaXRpb25Ob3Rpb25hbAgFDSR0MDYxNDg4NjE1ODkCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA2MTQ4ODYxNTg5Al8yBA0kdDA2MTU5NDYxNzc2CQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FEXBvc2l0aW9uTHN0VXBkQ1BGBQ11bnJlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDA2MTU5NDYxNzc2Al8xBAdiYWREZWJ0CAUNJHQwNjE1OTQ2MTc3NgJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDA2MTU5NDYxNzc2Al8zCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAQFzAQUMcmVtYWluTWFyZ2luCQEBcwEFDmZ1bmRpbmdQYXltZW50CQEBcwEJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIJAQFzAQUNdW5yZWFsaXplZFBubAkBAXMBBQdiYWREZWJ0CQEBcwEFEHBvc2l0aW9uTm90aW9uYWwBaQEVdmlld19nZXRQZWdBZGp1c3RDb3N0AQZfcHJpY2UEBGNvc3QJARBnZXRQZWdBZGp1c3RDb3N0AQUGX3ByaWNlCQACAQkApAMBCAUEY29zdAJfMgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJAQ5hZG1pblB1YmxpY0tleQAnlyg5", "height": 2227520, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EN6aPf9KBBMi8W2kcBvYma3umCMJvQMTceV3H8427qdT Next: CJ3TF2ncnaGaD7kABpBAmsHxh74RyPsSus7TuSwpwcgP Diff:
OldNewDifferences
9393
9494 let T = "k_orders_address"
9595
96-func U () = valueOrErrorMessage(addressFromString(getStringValue(this, L)), "Coordinator not set")
96+let U = "k_referral_address"
97+
98+func V () = valueOrErrorMessage(addressFromString(getStringValue(this, L)), "Coordinator not set")
9799
98100
99-func V () = addressFromString(getStringValue(U(), N))
101+func W () = addressFromString(getStringValue(V(), N))
100102
101103
102-func W () = fromBase58String(getStringValue(U(), O))
104+func X () = fromBase58String(getStringValue(V(), O))
103105
104106
105-func X () = fromBase58String(getStringValue(U(), P))
107+func Y () = fromBase58String(getStringValue(V(), P))
106108
107109
108-func Y () = valueOrErrorMessage(addressFromString(getStringValue(U(), Q)), "Quote asset staking not set")
110+func Z () = valueOrErrorMessage(addressFromString(getStringValue(V(), Q)), "Quote asset staking not set")
109111
110112
111-func Z () = valueOrErrorMessage(addressFromString(getStringValue(U(), R)), "Staking not set")
113+func aa () = valueOrErrorMessage(addressFromString(getStringValue(V(), R)), "Staking not set")
112114
113115
114-func aa () = valueOrErrorMessage(addressFromString(getStringValue(U(), M)), "Insurance not set")
116+func ab () = valueOrErrorMessage(addressFromString(getStringValue(V(), M)), "Insurance not set")
115117
116118
117-func ab () = valueOrErrorMessage(addressFromString(getStringValue(U(), S)), "Miner not set")
119+func ac () = valueOrErrorMessage(addressFromString(getStringValue(V(), S)), "Miner not set")
118120
119121
120-func ac () = valueOrErrorMessage(addressFromString(getStringValue(U(), T)), "Orders not set")
122+func ad () = valueOrErrorMessage(addressFromString(getStringValue(V(), T)), "Orders not set")
121123
122124
123-let ad = 1
124-
125-let ae = 2
126-
127-let af = 15
128-
129-let ag = 15
130-
131-let ah = 1000
132-
133-let ai = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
134-
135-let aj = (86400 * ai)
136-
137-let ak = 100
138-
139-let al = 1
140-
141-let am = 2
142-
143-func an (ao) = (toString(ao) + ",")
125+func ae () = valueOrErrorMessage(addressFromString(getStringValue(V(), U)), "Referral not set")
144126
145127
146-func ap (ao,aq) = fraction(ao, ai, aq, HALFEVEN)
128+let af = 1
129+
130+let ag = 2
131+
132+let ah = 15
133+
134+let ai = 15
135+
136+let aj = 1000
137+
138+let ak = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
139+
140+let al = (86400 * ak)
141+
142+let am = 100
143+
144+let an = 1
145+
146+let ao = 2
147+
148+func ap (aq) = (toString(aq) + ",")
147149
148150
149-func ar (ao,aq) = fraction(ao, aq, ai, HALFEVEN)
151+func ar (aq,as) = fraction(aq, ak, as, HALFEVEN)
150152
151153
152-func as (ao) = if ((ao > 0))
153- then ao
154- else -(ao)
154+func at (aq,as) = fraction(aq, as, ak, HALFEVEN)
155155
156156
157-func at (ao,aq) = if ((ao >= aq))
158- then ao
159- else aq
157+func au (aq) = if ((aq > 0))
158+ then aq
159+ else -(aq)
160160
161161
162-func au (av,aw) = ((av + "_") + aw)
162+func av (aq,as) = if ((aq >= as))
163+ then aq
164+ else as
163165
164166
165-func ax (ay) = {
166- func az (aA,aB) = ((aA + aB) + ",")
167+func aw (ax,ay) = ((ax + "_") + ay)
167168
168- let aC = {
169- let aD = ay
170- let aE = size(aD)
171- let aF = ""
172- func aG (aH,aI) = if ((aI >= aE))
173- then aH
174- else az(aH, aD[aI])
175169
176- func aJ (aH,aI) = if ((aI >= aE))
177- then aH
170+func az (aA) = {
171+ func aB (aC,aD) = ((aC + aD) + ",")
172+
173+ let aE = {
174+ let aF = aA
175+ let aG = size(aF)
176+ let aH = ""
177+ func aI (aJ,aK) = if ((aK >= aG))
178+ then aJ
179+ else aB(aJ, aF[aK])
180+
181+ func aL (aJ,aK) = if ((aK >= aG))
182+ then aJ
178183 else throw("List size exceeds 20")
179184
180- aJ(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aF, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
185+ aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
181186 }
182- let aK = dropRight(aC, 1)
183- let aL = if ((take(aK, 1) == ","))
184- then drop(aK, 1)
185- else aK
186- aL
187+ let aM = dropRight(aE, 1)
188+ let aN = if ((take(aM, 1) == ","))
189+ then drop(aM, 1)
190+ else aM
191+ aN
187192 }
188193
189194
190-func aM (aN) = split(aN, ",")
195+func aO (aP) = split(aP, ",")
191196
192197
193-func aO (ay,aP,aQ) = if ((size(ay) > aP))
194- then (removeByIndex(ay, 0) :+ aQ)
195- else (ay :+ aQ)
198+func aQ (aA,aR,aS) = if ((size(aA) > aR))
199+ then (removeByIndex(aA, 0) :+ aS)
200+ else (aA :+ aS)
196201
197202
198-func aR (aS) = valueOrErrorMessage(getInteger(this, aS), ("no value for " + aS))
203+func aT (aU) = valueOrErrorMessage(getInteger(this, aU), ("no value for " + aU))
199204
200205
201-func aT () = aR(d)
206+func aV () = aT(d)
202207
203208
204-func aU () = aR(l)
209+func aW () = aT(l)
205210
206211
207-func aV () = aR(n)
212+func aX () = aT(n)
208213
209214
210-func aW () = aR(E)
215+func aY () = aT(E)
211216
212217
213-func aX () = aR(F)
218+func aZ () = aT(F)
214219
215220
216-func aY () = aR(G)
221+func ba () = aT(G)
217222
218223
219-func aZ () = aR(J)
224+func bb () = aT(J)
220225
221226
222-func ba () = aR(K)
227+func bc () = aT(K)
223228
224229
225-func bb () = aR(B)
230+func bd () = aT(B)
226231
227232
228-func bc () = aR(m)
233+func be () = aT(m)
229234
230235
231-func bd () = (bc() * ai)
236+func bf () = (be() * ak)
232237
233238
234-func be () = (bc() * ah)
239+func bg () = (be() * aj)
235240
236241
237-func bf () = aR(o)
242+func bh () = aT(o)
238243
239244
240-func bg () = aR(p)
245+func bi () = aT(p)
241246
242247
243-func bh () = aR(q)
248+func bj () = aT(q)
244249
245250
246-func bi () = aR(r)
251+func bk () = aT(r)
247252
248253
249-func bj () = aR(s)
254+func bl () = aT(s)
250255
251256
252-func bk () = aR(t)
257+func bm () = aT(t)
253258
254259
255-func bl () = aR(z)
260+func bn () = aT(z)
256261
257262
258-func bm () = aR(A)
263+func bo () = aT(A)
259264
260265
261-func bn () = aR(I)
266+func bp () = aT(I)
262267
263268
264-func bo () = aR(H)
269+func bq () = aT(H)
265270
266271
267-func bp (bq) = valueOrElse(getString(ac(), "k_sender"), toString(bq.caller))
272+func br (bs) = valueOrElse(getString(ad(), "k_sender"), toString(bs.caller))
268273
269274
270-func br (bs,bt,bu) = {
271- let bv = (bs - bt)
272- if (if (bu)
273- then (0 > bv)
275+func bt (bu,bv,bw) = {
276+ let bx = (bu - bv)
277+ if (if (bw)
278+ then (0 > bx)
274279 else false)
275280 then throw("Invalid margin")
276- else if (if (!(bu))
277- then (bv >= 0)
281+ else if (if (!(bw))
282+ then (bx >= 0)
278283 else false)
279284 then throw("Invalid margin")
280285 else true
281286 }
282287
283288
284-func bw (bx) = if ((bx == 0))
289+func by (bz) = if ((bz == 0))
285290 then throw("Should not be called with _positionSize == 0")
286- else if ((bx > 0))
287- then bl()
288- else bm()
291+ else if ((bz > 0))
292+ then bn()
293+ else bo()
289294
290295
291-func by (bz) = {
292- let bA = getInteger(this, au(e, bz))
293- let bB = bA
294- if ($isInstanceOf(bB, "Int"))
296+func bA (bB) = {
297+ let bC = getInteger(this, aw(e, bB))
298+ let bD = bC
299+ if ($isInstanceOf(bD, "Int"))
295300 then {
296- let bC = bB
297- $Tuple4(bC, getIntegerValue(this, au(f, bz)), getIntegerValue(this, au(g, bz)), getIntegerValue(this, au(h, bz)))
301+ let bE = bD
302+ $Tuple4(bE, getIntegerValue(this, aw(f, bB)), getIntegerValue(this, aw(g, bB)), getIntegerValue(this, aw(h, bB)))
298303 }
299304 else $Tuple4(0, 0, 0, 0)
300305 }
301306
302307
303-func bD (bz) = if ((by(bz)._1 == 0))
308+func bF (bB) = if ((bA(bB)._1 == 0))
304309 then throw("No open position")
305310 else true
306311
307312
308-func bE () = valueOrElse(getBoolean(this, j), false)
313+func bG () = valueOrElse(getBoolean(this, j), false)
309314
310315
311-func bF () = valueOrElse(getBoolean(this, k), false)
316+func bH () = valueOrElse(getBoolean(this, k), false)
312317
313318
314-func bG (bH,bI,bJ) = if (bH)
319+func bI (bJ,bK,bL) = if (bJ)
315320 then {
316- let bK = (aX() - bJ)
317- if ((0 >= bK))
321+ let bM = (aZ() - bL)
322+ if ((0 >= bM))
318323 then throw("Tx lead to base asset reserve <= 0, revert")
319- else $Tuple4((aW() + bI), bK, (aY() + bJ), (aZ() + bI))
324+ else $Tuple4((aY() + bK), bM, (ba() + bL), (bb() + bK))
320325 }
321326 else {
322- let bL = (aW() - bI)
323- if ((0 >= bL))
327+ let bN = (aY() - bK)
328+ if ((0 >= bN))
324329 then throw("Tx lead to base quote reserve <= 0, revert")
325- else $Tuple4(bL, (aX() + bJ), (aY() - bJ), (aZ() - bI))
330+ else $Tuple4(bN, (aZ() + bL), (ba() - bL), (bb() - bK))
326331 }
327332
328333
329-func bM (bH,bI) = {
330- let bN = aW()
331- let bO = aX()
332- let aS = ar(bN, bO)
333- let bP = if (bH)
334- then (bN + bI)
335- else (bN - bI)
336- let bQ = ap(aS, bP)
337- let bR = as((bQ - bO))
338- let bS = if (bH)
339- then bR
340- else -(bR)
341- let bT = bG(bH, bI, bR)
342- let bU = bT._1
343- let bV = bT._2
344- let bW = bT._3
345- let bX = bT._4
346- let bY = ap(bN, bO)
347- let bZ = ap(bI, bR)
348- let ca = as((bY - bZ))
349- let cb = (ai - ap(bY, (bY + ca)))
350- let cc = bj()
351- if ((cb > cc))
352- then throw(((((((((((((("Price impact " + toString(cb)) + " > max price impact ") + toString(cc)) + " before quote asset: ") + toString(bN)) + " before base asset: ") + toString(bO)) + " quote asset amount to exchange: ") + toString(bI)) + " price before: ") + toString(bY)) + " marketPrice: ") + toString(bZ)))
353- else $Tuple5(bS, bU, bV, bW, bX)
334+func bO (bJ,bK) = {
335+ let bP = aY()
336+ let bQ = aZ()
337+ let aU = at(bP, bQ)
338+ let bR = if (bJ)
339+ then (bP + bK)
340+ else (bP - bK)
341+ let bS = ar(aU, bR)
342+ let bT = au((bS - bQ))
343+ let bU = if (bJ)
344+ then bT
345+ else -(bT)
346+ let bV = bI(bJ, bK, bT)
347+ let bW = bV._1
348+ let bX = bV._2
349+ let bY = bV._3
350+ let bZ = bV._4
351+ let ca = ar(bP, bQ)
352+ let cb = ar(bK, bT)
353+ let cc = au((ca - cb))
354+ let cd = (ak - ar(ca, (ca + cc)))
355+ let ce = bl()
356+ if ((cd > ce))
357+ then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(bP)) + " before base asset: ") + toString(bQ)) + " quote asset amount to exchange: ") + toString(bK)) + " price before: ") + toString(ca)) + " marketPrice: ") + toString(cb)))
358+ else $Tuple5(bU, bW, bX, bY, bZ)
354359 }
355360
356361
357-func cd (ce,cf,cg,ch) = {
358- let ci = if ((ce != 0))
362+func cf (cg,ch,ci,cj) = {
363+ let ck = if ((cg != 0))
359364 then {
360- let cj = bw(ce)
361- ar((cj - cg), ce)
365+ let cl = by(cg)
366+ at((cl - ci), cg)
362367 }
363368 else 0
364- let ck = ((ch - ci) + cf)
365- let cl = if ((0 > ck))
366- then $Tuple2(0, as(ck))
367- else $Tuple2(as(ck), 0)
368- let cm = cl._1
369- let cn = cl._2
370- $Tuple3(cm, cn, ci)
369+ let cm = ((cj - ck) + ch)
370+ let cn = if ((0 > cm))
371+ then $Tuple2(0, au(cm))
372+ else $Tuple2(au(cm), 0)
373+ let co = cn._1
374+ let cp = cn._2
375+ $Tuple3(co, cp, ck)
371376 }
372377
373378
374-func co (bH,bJ,cp,cq,cr) = {
375- let bY = ap(cq, cr)
376- if ((bJ == 0))
379+func cq (bJ,bL,cr,cs,ct) = {
380+ let ca = ar(cs, ct)
381+ if ((bL == 0))
377382 then throw("Invalid base asset amount")
378383 else {
379- let aS = ar(cq, cr)
380- let cs = if (bH)
381- then (cr + bJ)
382- else (cr - bJ)
383- let ct = ap(aS, cs)
384- let cu = as((ct - cq))
385- let cc = bj()
386- let cv = bG(!(bH), cu, bJ)
387- let bU = cv._1
388- let bV = cv._2
389- let bW = cv._3
390- let bX = cv._4
391- let bZ = ap(cu, bJ)
392- let ca = as((bY - bZ))
393- let cb = (ai - ap(bY, (bY + ca)))
394- if (if ((cb > cc))
395- then cp
384+ let aU = at(cs, ct)
385+ let cu = if (bJ)
386+ then (ct + bL)
387+ else (ct - bL)
388+ let cv = ar(aU, cu)
389+ let cw = au((cv - cs))
390+ let ce = bl()
391+ let cx = bI(!(bJ), cw, bL)
392+ let bW = cx._1
393+ let bX = cx._2
394+ let bY = cx._3
395+ let bZ = cx._4
396+ let cb = ar(cw, bL)
397+ let cc = au((ca - cb))
398+ let cd = (ak - ar(ca, (ca + cc)))
399+ if (if ((cd > ce))
400+ then cr
396401 else false)
397- then throw(((((((((((((("Price impact " + toString(cb)) + " > max price impact ") + toString(cc)) + " before quote asset: ") + toString(cq)) + " before base asset: ") + toString(cr)) + " base asset amount to exchange: ") + toString(bJ)) + " price before: ") + toString(bY)) + " market price: ") + toString(bZ)))
398- else $Tuple8(cu, bU, bV, bW, bX, (bo() - (if (bH)
399- then as(bJ)
400- else 0)), (bn() - (if (!(bH))
401- then as(bJ)
402- else 0)), cb)
402+ then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(cs)) + " before base asset: ") + toString(ct)) + " base asset amount to exchange: ") + toString(bL)) + " price before: ") + toString(ca)) + " market price: ") + toString(cb)))
403+ else $Tuple8(cw, bW, bX, bY, bZ, (bq() - (if (bJ)
404+ then au(bL)
405+ else 0)), (bp() - (if (!(bJ))
406+ then au(bL)
407+ else 0)), cd)
403408 }
404409 }
405410
406411
407-func cw (bH,bJ,cp) = co(bH, bJ, cp, aW(), aX())
412+func cy (bJ,bL,cr) = cq(bJ, bL, cr, aY(), aZ())
408413
409414
410-func cx () = {
411- let cy = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
412- let cz = getStringValue(this, a)
413- let cA = getStringValue(this, b)
414- let cB = valueOrErrorMessage(getInteger(cy, cz), ((("Can not get oracle price. Oracle: " + toString(cy)) + " key: ") + cz))
415- cB
415+func cz () = {
416+ let cA = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
417+ let cB = getStringValue(this, a)
418+ let cC = getStringValue(this, b)
419+ let cD = valueOrErrorMessage(getInteger(cA, cB), ((("Can not get oracle price. Oracle: " + toString(cA)) + " key: ") + cB))
420+ cD
416421 }
417422
418423
419-func cC (cq,cr) = {
420- let cD = cx()
421- let cE = ap(cq, cr)
422- let cF = ap((cD + cE), (2 * ai))
423- let cG = ap(as((cD - cE)), cF)
424- if ((cG > bk()))
425- then throw(((("Price spread " + toString(cG)) + " > max price spread ") + toString(bk())))
424+func cE (cs,ct) = {
425+ let cF = cz()
426+ let cG = ar(cs, ct)
427+ let cH = ar((cF + cG), (2 * ak))
428+ let cI = ar(au((cF - cG)), cH)
429+ if ((cI > bm()))
430+ then throw(((("Price spread " + toString(cI)) + " > max price spread ") + toString(bm())))
426431 else true
427432 }
428433
429434
430-func cH () = {
431- let cq = aW()
432- let cr = aX()
433- ap(cq, cr)
435+func cJ () = {
436+ let cs = aY()
437+ let ct = aZ()
438+ ar(cs, ct)
434439 }
435440
436441
437-func cI () = {
438- let cD = cx()
439- let cJ = cH()
440- (ap(as((cD - cJ)), cD) > bi())
442+func cK () = {
443+ let cF = cz()
444+ let cL = cJ()
445+ (ar(au((cF - cL)), cF) > bk())
441446 }
442447
443448
444-func cK (bx,cL,cq,cr) = {
445- let cM = as(bx)
446- let cN = (0 > bx)
447- let cO = if ((cL == al))
449+func cM (bz,cN,cs,ct) = {
450+ let cO = au(bz)
451+ let cP = (0 > bz)
452+ let cQ = if ((cN == an))
448453 then {
449- let cP = co(!(cN), cM, false, cq, cr)
450- let cQ = cP._1
451- let cR = cP._2
452- let cS = cP._3
453- let cT = cP._4
454- cQ
454+ let cR = cq(!(cP), cO, false, cs, ct)
455+ let cS = cR._1
456+ let cT = cR._2
457+ let cU = cR._3
458+ let cV = cR._4
459+ cS
455460 }
456- else ar(cM, cx())
457- cO
461+ else at(cO, cz())
462+ cQ
458463 }
459464
460465
461-func cU (bz,cL) = {
462- let cV = by(bz)
463- let bC = cV._1
464- let cW = cV._2
465- let cX = cV._3
466- let cY = cV._4
467- if ((bC == 0))
468- then throw("Invalid position size")
466+func cW (bz,cX,cs,ct,cN) = if ((bz == 0))
467+ then throw("Invalid position size")
468+ else {
469+ let cP = (0 > bz)
470+ let cQ = cM(bz, cN, cs, ct)
471+ let cY = if (cP)
472+ then (cX - cQ)
473+ else (cQ - cX)
474+ $Tuple2(cQ, cY)
475+ }
476+
477+
478+func cZ (bB,cN) = {
479+ let da = bA(bB)
480+ let bE = da._1
481+ let db = da._2
482+ let dc = da._3
483+ let dd = da._4
484+ cW(bE, dc, aY(), aZ(), cN)
485+ }
486+
487+
488+func de (df,dg,dh) = ar((df - dg), dh)
489+
490+
491+func di (bB,cN) = {
492+ let dj = bA(bB)
493+ let bE = dj._1
494+ let db = dj._2
495+ let dk = dj._3
496+ let dd = dj._4
497+ let dl = cZ(bB, cN)
498+ let cQ = dl._1
499+ let cY = dl._2
500+ let dm = cf(bE, db, dd, cY)
501+ let co = dm._1
502+ let cp = dm._2
503+ de(co, cp, cQ)
504+ }
505+
506+
507+func dn (bB) = di(bB, an)
508+
509+
510+func do (bB,bz) = {
511+ let dp = av(bj(), (ak - ar(dn(bB), bh())))
512+ let dq = at(au(bz), dp)
513+ let dr = cy((bz > 0), dq, false)
514+ let ds = dr._1
515+ let cd = dr._8
516+ if ((bl() > cd))
517+ then ds
469518 else {
470- let cN = (0 > bC)
471- let cO = cK(bC, cL, aW(), aX())
472- let cZ = if (cN)
473- then (cX - cO)
474- else (cO - cX)
475- $Tuple2(cO, cZ)
519+ let dt = at(au(bz), bj())
520+ let du = cy((bz > 0), dt, false)._1
521+ du
476522 }
477523 }
478524
479525
480-func da (db,dc,dd) = ap((db - dc), dd)
481-
482-
483-func de (bz,cL) = {
484- let df = by(bz)
485- let bC = df._1
486- let cW = df._2
487- let dg = df._3
488- let cY = df._4
489- let dh = cU(bz, cL)
490- let cO = dh._1
491- let cZ = dh._2
492- let di = cd(bC, cW, cY, cZ)
493- let cm = di._1
494- let cn = di._2
495- da(cm, cn, cO)
526+func dv (bB,cr) = {
527+ let dw = bA(bB)
528+ let bE = dw._1
529+ let db = dw._2
530+ let dc = dw._3
531+ let dd = dw._4
532+ let cY = cZ(bB, an)._2
533+ let dx = cf(bE, db, dd, cY)
534+ let co = dx._1
535+ let cp = dx._2
536+ let dt = -(bE)
537+ let dy = cY
538+ let dz = -(co)
539+ let dA = cy((bE > 0), au(bE), cr)
540+ let du = dA._1
541+ let bR = dA._2
542+ let bS = dA._3
543+ let dB = dA._4
544+ let dC = dA._5
545+ let dD = dA._6
546+ let dE = dA._7
547+ let dF = (bc() - dc)
548+ $Tuple12(dt, cp, dy, dz, bR, bS, dB, dC, dF, du, dD, dE)
496549 }
497550
498551
499-func dj (bz) = de(bz, al)
552+func dG () = {
553+ let dH = ((lastBlock.timestamp / 1000) / 60)
554+ let dI = (dH - ah)
555+ let dJ = valueOrElse(getString(this, u), "")
556+ let dK = split(dJ, ",")
557+ func dL (aC,dM) = if ((dI >= parseIntValue(dM)))
558+ then (aC :+ parseIntValue(dM))
559+ else aC
500560
561+ let dN = {
562+ let aF = dK
563+ let aG = size(aF)
564+ let aH = nil
565+ func aI (aJ,aK) = if ((aK >= aG))
566+ then aJ
567+ else dL(aJ, aF[aK])
501568
502-func dk (bz,bx) = {
503- let dl = at(bh(), (ai - ap(dj(bz), bf())))
504- let dm = ar(as(bx), dl)
505- let dn = cw((bx > 0), dm, false)
506- let do = dn._1
507- let cb = dn._8
508- if ((bj() > cb))
509- then do
510- else {
511- let dp = ar(as(bx), bh())
512- let dq = cw((bx > 0), dp, false)._1
513- dq
514- }
569+ func aL (aJ,aK) = if ((aK >= aG))
570+ then aJ
571+ else throw("List size exceeds 20")
572+
573+ aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
574+ }
575+ let dO = if ((size(dN) > 0))
576+ then max(dN)
577+ else parseIntValue(dK[0])
578+ let dP = valueOrElse(getInteger(this, v), 0)
579+ let dQ = valueOrElse(getInteger(this, ((w + "_") + toString(dP))), 0)
580+ let dR = valueOrElse(getInteger(this, ((x + "_") + toString(dP))), 0)
581+ let dS = (dQ + ((dH - dP) * dR))
582+ let dT = valueOrElse(getInteger(this, ((w + "_") + toString(dO))), 0)
583+ let dU = valueOrElse(getInteger(this, ((x + "_") + toString(dO))), 0)
584+ let dV = (dT + ((dI - dO) * dU))
585+ ((dS - dV) / ah)
515586 }
516587
517588
518-func dr (bz,cp) = {
519- let ds = by(bz)
520- let bC = ds._1
521- let cW = ds._2
522- let cX = ds._3
523- let cY = ds._4
524- let cZ = cU(bz, al)._2
525- let dt = cd(bC, cW, cY, cZ)
526- let cm = dt._1
527- let cn = dt._2
528- let dp = -(bC)
529- let du = cZ
530- let dv = -(cm)
531- let dw = cw((bC > 0), as(bC), cp)
532- let dq = dw._1
533- let bP = dw._2
534- let bQ = dw._3
535- let dx = dw._4
536- let dy = dw._5
537- let dz = dw._6
538- let dA = dw._7
539- let dB = (ba() - cX)
540- $Tuple12(dp, cn, du, dv, bP, bQ, dx, dy, dB, dq, dz, dA)
589+func dW (dX) = {
590+ let bz = ba()
591+ let dY = (bz > 0)
592+ let dZ = cy(dY, au(bz), false)._1
593+ let ea = aZ()
594+ let eb = at(ea, dX)
595+ let ec = cW(bz, dZ, eb, ea, an)._2
596+ $Tuple2(eb, ec)
541597 }
542598
543599
544-func dC () = {
545- let dD = ((lastBlock.timestamp / 1000) / 60)
546- let dE = (dD - af)
547- let dF = valueOrElse(getString(this, u), "")
548- let dG = split(dF, ",")
549- func dH (aA,dI) = if ((dE >= parseIntValue(dI)))
550- then (aA :+ parseIntValue(dI))
551- else aA
552-
553- let dJ = {
554- let aD = dG
555- let aE = size(aD)
556- let aF = nil
557- func aG (aH,aI) = if ((aI >= aE))
558- then aH
559- else dH(aH, aD[aI])
560-
561- func aJ (aH,aI) = if ((aI >= aE))
562- then aH
563- else throw("List size exceeds 20")
564-
565- aJ(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aF, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
566- }
567- let dK = if ((size(dJ) > 0))
568- then max(dJ)
569- else parseIntValue(dG[0])
570- let dL = valueOrElse(getInteger(this, v), 0)
571- let dM = valueOrElse(getInteger(this, ((w + "_") + toString(dL))), 0)
572- let dN = valueOrElse(getInteger(this, ((x + "_") + toString(dL))), 0)
573- let dO = (dM + ((dD - dL) * dN))
574- let dP = valueOrElse(getInteger(this, ((w + "_") + toString(dK))), 0)
575- let dQ = valueOrElse(getInteger(this, ((x + "_") + toString(dK))), 0)
576- let dR = (dP + ((dE - dK) * dQ))
577- ((dO - dR) / af)
578- }
600+func ed (ee,ef,eg,eh,ei,ej,ek,el,em) = [IntegerEntry(n, ee), IntegerEntry(o, ef), IntegerEntry(p, eg), IntegerEntry(m, eh), IntegerEntry(l, ei), IntegerEntry(r, ej), IntegerEntry(s, ek), IntegerEntry(q, el), IntegerEntry(t, em)]
579601
580602
581-func dS (dT,dU,dV,dW,dX,dY,dZ,ea,eb) = [IntegerEntry(n, dT), IntegerEntry(o, dU), IntegerEntry(p, dV), IntegerEntry(m, dW), IntegerEntry(l, dX), IntegerEntry(r, dY), IntegerEntry(s, dZ), IntegerEntry(q, ea), IntegerEntry(t, eb)]
603+func en (eo,ep,eq,er,es) = [IntegerEntry(B, eo), IntegerEntry(z, ep), IntegerEntry(A, eq), IntegerEntry(C, er), IntegerEntry(D, es)]
582604
583605
584-func ec (ed,ee,ef,eg,eh) = [IntegerEntry(B, ed), IntegerEntry(z, ee), IntegerEntry(A, ef), IntegerEntry(C, eg), IntegerEntry(D, eh)]
606+func et (ay,eu,ev,ew,cl) = [IntegerEntry(aw(e, ay), eu), IntegerEntry(aw(f, ay), ev), IntegerEntry(aw(g, ay), ew), IntegerEntry(aw(h, ay), cl)]
585607
586608
587-func ei (aw,ej,ek,el,cj) = [IntegerEntry(au(e, aw), ej), IntegerEntry(au(f, aw), ek), IntegerEntry(au(g, aw), el), IntegerEntry(au(h, aw), cj)]
588-
589-
590-func em (en) = {
591- let dD = ((lastBlock.timestamp / 1000) / 60)
592- let eo = valueOrElse(getInteger(this, v), 0)
593- if ((eo > dD))
609+func ex (ey) = {
610+ let dH = ((lastBlock.timestamp / 1000) / 60)
611+ let ez = valueOrElse(getInteger(this, v), 0)
612+ if ((ez > dH))
594613 then throw("TWAP out-of-order")
595614 else {
596- let dL = if ((eo == 0))
597- then dD
598- else eo
599- if ((dD > eo))
615+ let dP = if ((ez == 0))
616+ then dH
617+ else ez
618+ if ((dH > ez))
600619 then {
601- let ep = valueOrElse(getInteger(this, ((w + "_") + toString(eo))), 0)
602- let eq = valueOrElse(getInteger(this, ((x + "_") + toString(eo))), en)
603- let er = (ep + ((dD - dL) * eq))
604- let dG = aO(aM(valueOrElse(getString(this, u), "")), af, toString(dD))
605-[IntegerEntry(au(w, toString(dD)), er), IntegerEntry(au(x, toString(dD)), en), IntegerEntry(au(y, toString(dD)), eo), IntegerEntry(v, dD), StringEntry(u, ax(dG))]
620+ let eA = valueOrElse(getInteger(this, ((w + "_") + toString(ez))), 0)
621+ let eB = valueOrElse(getInteger(this, ((x + "_") + toString(ez))), ey)
622+ let eC = (eA + ((dH - dP) * eB))
623+ let dK = aQ(aO(valueOrElse(getString(this, u), "")), ah, toString(dH))
624+[IntegerEntry(aw(w, toString(dH)), eC), IntegerEntry(aw(x, toString(dH)), ey), IntegerEntry(aw(y, toString(dH)), ez), IntegerEntry(v, dH), StringEntry(u, az(dK))]
606625 }
607626 else {
608- let es = valueOrElse(getInteger(this, au(y, toString(dD))), 0)
609- let ep = valueOrElse(getInteger(this, au(w, toString(es))), 0)
610- let eq = valueOrElse(getInteger(this, au(x, toString(es))), en)
611- let er = (ep + ((dD - es) * eq))
612-[IntegerEntry(au(w, toString(dD)), er), IntegerEntry(au(x, toString(dD)), en)]
627+ let eD = valueOrElse(getInteger(this, aw(y, toString(dH))), 0)
628+ let eA = valueOrElse(getInteger(this, aw(w, toString(eD))), 0)
629+ let eB = valueOrElse(getInteger(this, aw(x, toString(eD))), ey)
630+ let eC = (eA + ((dH - eD) * eB))
631+[IntegerEntry(aw(w, toString(dH)), eC), IntegerEntry(aw(x, toString(dH)), ey)]
613632 }
614633 }
615634 }
616635
617636
618-func et (bN,bO) = [IntegerEntry(E, bN), IntegerEntry(F, bO)]
637+func eE (bP,bQ) = [IntegerEntry(E, bP), IntegerEntry(F, bQ)]
619638
620639
621-func eu (bN,bO,ev,ew,ex,ey,ez) = if (((ey - ez) != ev))
622- then throw(((((("Invalid AMM state data: " + toString(ey)) + " + ") + toString(ez)) + " != ") + toString(ev)))
623- else ((et(bN, bO) ++ [IntegerEntry(G, ev), IntegerEntry(J, ew), IntegerEntry(K, ex), IntegerEntry(H, ey), IntegerEntry(I, ez)]) ++ em(ap(bN, bO)))
640+func eF (bP,bQ,eG,eH,eI,eJ,eK) = if (((eJ - eK) != eG))
641+ then throw(((((("Invalid AMM state data: " + toString(eJ)) + " + ") + toString(eK)) + " != ") + toString(eG)))
642+ else ((eE(bP, bQ) ++ [IntegerEntry(G, eG), IntegerEntry(J, eH), IntegerEntry(K, eI), IntegerEntry(H, eJ), IntegerEntry(I, eK)]) ++ ex(ar(bP, bQ)))
624643
625644
626-func eA (aw) = [DeleteEntry(au(e, aw)), DeleteEntry(au(f, aw)), DeleteEntry(au(g, aw)), DeleteEntry(au(h, aw)), IntegerEntry(au(i, aw), lastBlock.timestamp)]
645+func eL (ay) = [DeleteEntry(aw(e, ay)), DeleteEntry(aw(f, ay)), DeleteEntry(aw(g, ay)), DeleteEntry(aw(h, ay)), IntegerEntry(aw(i, ay), lastBlock.timestamp)]
627646
628647
629-func eB (aw,eC) = {
630- let eD = assetBalance(this, X())
631- if ((eC > eD))
632- then throw(((("Unable to withdraw " + toString(eC)) + " from contract balance ") + toString(eD)))
633- else [ScriptTransfer(aw, eC, X())]
648+func eM (ay,eN) = {
649+ let eO = assetBalance(this, Y())
650+ if ((eN > eO))
651+ then throw(((("Unable to withdraw " + toString(eN)) + " from contract balance ") + toString(eO)))
652+ else [ScriptTransfer(ay, eN, Y())]
634653 }
635654
636655
637-func eE (bq) = if ((0 > bq))
656+func eP (bs) = if ((0 > bs))
638657 then throw("Balance")
639- else [IntegerEntry(d, bq)]
658+ else [IntegerEntry(d, bs)]
640659
641660
642-func eF (bq) = [ScriptTransfer(Z(), bq, X())]
661+func eQ (bs) = [ScriptTransfer(aa(), bs, Y())]
643662
644663
645-@Callable(bq)
646-func pause () = if ((bq.caller != V()))
664+@Callable(bs)
665+func pause () = if ((bs.caller != W()))
647666 then throw("Invalid togglePause params")
648667 else [BooleanEntry(k, true)]
649668
650669
651670
652-@Callable(bq)
653-func unpause () = if ((bq.caller != V()))
671+@Callable(bs)
672+func unpause () = if ((bs.caller != W()))
654673 then throw("Invalid togglePause params")
655674 else [BooleanEntry(k, false)]
656675
657676
658677
659-@Callable(bq)
660-func addLiquidity (bI) = if (if ((bq.caller != V()))
678+@Callable(bs)
679+func addLiquidity (bK) = if (if ((bs.caller != W()))
661680 then true
662- else (0 >= bI))
681+ else (0 >= bK))
663682 then throw("Invalid addLiquidity params")
664683 else {
665- let bN = aW()
666- let bO = aX()
667- let en = ap(bN, bO)
668- let eG = ap(bI, en)
669- let eH = (bN + bI)
670- let eI = (bO + eG)
671- et(eH, eI)
684+ let bP = aY()
685+ let bQ = aZ()
686+ let ey = ar(bP, bQ)
687+ let eR = ar(bK, ey)
688+ let eS = (bP + bK)
689+ let eT = (bQ + eR)
690+ eE(eS, eT)
672691 }
673692
674693
675694
676-@Callable(bq)
677-func removeLiquidity (bI) = if (if ((bq.caller != V()))
695+@Callable(bs)
696+func removeLiquidity (bK) = if (if ((bs.caller != W()))
678697 then true
679- else (0 >= bI))
698+ else (0 >= bK))
680699 then throw("Invalid removeLiquidity params")
681700 else {
682- let bN = aW()
683- let bO = aX()
684- let en = ap(bN, bO)
685- let eJ = ap(bI, en)
686- let eH = (bN - bI)
687- let eI = (bO - eJ)
688- et(eH, eI)
701+ let bP = aY()
702+ let bQ = aZ()
703+ let ey = ar(bP, bQ)
704+ let eU = ar(bK, ey)
705+ let eS = (bP - bK)
706+ let eT = (bQ - eU)
707+ eE(eS, eT)
689708 }
690709
691710
692711
693-@Callable(bq)
694-func changeSettings (dT,dU,dV,dW,dX,dY,dZ,ea,eb) = if ((bq.caller != V()))
712+@Callable(bs)
713+func changeSettings (ee,ef,eg,eh,ei,ej,ek,el,em) = if ((bs.caller != W()))
695714 then throw("Invalid changeSettings params")
696- else dS(dT, dU, dV, dW, dX, dY, dZ, ea, eb)
715+ else ed(ee, ef, eg, eh, ei, ej, ek, el, em)
697716
698717
699718
700-@Callable(bq)
701-func initialize (bN,bO,dW,dT,dU,dV,dX,eK,eL,eM,dY,dZ,ea,eb) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bN))
719+@Callable(bs)
720+func initialize (bP,bQ,eh,ee,ef,eg,ei,eV,eW,eX,ej,ek,el,em) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bP))
702721 then true
703- else (0 >= bO))
722+ else (0 >= bQ))
704723 then true
705- else (0 >= dW))
724+ else (0 >= eh))
706725 then true
707- else (0 >= dT))
726+ else (0 >= ee))
708727 then true
709- else (0 >= dU))
728+ else (0 >= ef))
710729 then true
711- else (0 >= dV))
730+ else (0 >= eg))
712731 then true
713- else (0 >= dX))
732+ else (0 >= ei))
714733 then true
715- else (0 >= dY))
734+ else (0 >= ej))
716735 then true
717- else (0 >= dZ))
736+ else (0 >= ek))
718737 then true
719- else (0 >= ea))
738+ else (0 >= el))
720739 then true
721- else (0 >= eb))
740+ else (0 >= em))
722741 then true
723- else bE())
742+ else bG())
724743 then throw("Invalid initialize parameters")
725- else ((((eu(bN, bO, 0, 0, 0, 0, 0) ++ dS(dT, dU, dV, dW, dX, dY, dZ, ea, eb)) ++ ec((lastBlock.timestamp + dW), 0, 0, 0, 0)) ++ eE(0)) ++ [BooleanEntry(j, true), StringEntry(c, eK), StringEntry(a, eL), StringEntry(L, eM)])
744+ else ((((eF(bP, bQ, 0, 0, 0, 0, 0) ++ ed(ee, ef, eg, eh, ei, ej, ek, el, em)) ++ en((lastBlock.timestamp + eh), 0, 0, 0, 0)) ++ eP(0)) ++ [BooleanEntry(j, true), StringEntry(c, eV), StringEntry(a, eW), StringEntry(L, eX)])
726745
727746
728747
729-@Callable(bq)
730-func setInitMarginRatio (dT) = if (if ((0 >= dT))
748+@Callable(bs)
749+func setInitMarginRatio (ee) = if (if ((0 >= ee))
731750 then true
732- else !(bE()))
751+ else !(bG()))
733752 then throw("Invalid setInitMarginRatio parameters")
734- else dS(dT, bf(), bg(), bc(), aU(), bi(), bj(), bh(), bk())
753+ else ed(ee, bh(), bi(), be(), aW(), bk(), bl(), bj(), bm())
735754
736755
737756
738-@Callable(bq)
739-func decreasePosition (eC,eN,eO) = if (if (if (if (if ((0 >= eC))
757+@Callable(bs)
758+func decreasePosition (eN,eY,eZ) = if (if (if (if (if ((0 >= eN))
740759 then true
741- else !(bE()))
760+ else !(bG()))
742761 then true
743- else !(br(ap(ai, eN), aV(), true)))
762+ else !(bt(ar(ak, eY), aX(), true)))
744763 then true
745- else !(bD(toString(bq.caller))))
764+ else !(bF(toString(bs.caller))))
746765 then true
747- else bF())
766+ else bH())
748767 then throw("Invalid decreasePosition parameters")
749768 else {
750- let eP = by(toString(bq.caller))
751- let eQ = eP._1
752- let eR = eP._2
753- let eS = eP._3
754- let eT = eP._4
755- let eU = if ((eQ > 0))
756- then ae
757- else ad
758- let eV = (eU == ad)
759- let eW = ar(eC, eN)
760- let eX = cU(toString(bq.caller), al)
761- let eY = eX._1
762- let cZ = eX._2
763- let eZ = if ((eY > eW))
769+ let fa = bA(toString(bs.caller))
770+ let fb = fa._1
771+ let fc = fa._2
772+ let fd = fa._3
773+ let fe = fa._4
774+ let ff = if ((fb > 0))
775+ then ag
776+ else af
777+ let fg = (ff == af)
778+ let fh = at(eN, eY)
779+ let fi = cZ(toString(bs.caller), an)
780+ let fj = fi._1
781+ let cY = fi._2
782+ let fk = if ((fj > fh))
764783 then {
765- let fa = bM(eV, eW)
766- let dp = fa._1
767- let bP = fa._2
768- let bQ = fa._3
769- let dx = fa._4
770- let dy = fa._5
771- let fb = as(dp)
772- if (if ((eO != 0))
773- then (eO > fb)
784+ let fl = bO(fg, fh)
785+ let dt = fl._1
786+ let bR = fl._2
787+ let bS = fl._3
788+ let dB = fl._4
789+ let dC = fl._5
790+ let fm = au(dt)
791+ if (if ((eZ != 0))
792+ then (eZ > fm)
774793 else false)
775- then throw(((("Too little base asset exchanged, got " + toString(fb)) + " expected ") + toString(eO)))
794+ then throw(((("Too little base asset exchanged, got " + toString(fm)) + " expected ") + toString(eZ)))
776795 else {
777- let du = ap(ar(cZ, fb), as(eQ))
778- let fc = cd(eQ, eR, eT, du)
779- let cm = fc._1
780- let cn = fc._2
781- let ci = fc._3
782- let dq = eW
783- let fd = (cZ - du)
784- let fe = if ((eQ > 0))
785- then ((eY - dq) - fd)
786- else ((fd + eY) - dq)
787- let ff = (eQ + dp)
788- $Tuple11(ff, cm, as(fe), bw(ff), bQ, bP, dx, dy, (ba() - eW), (bo() - (if ((ff > 0))
789- then as(dp)
790- else 0)), (bn() - (if ((0 > ff))
791- then as(dp)
796+ let dy = ar(at(cY, fm), au(fb))
797+ let fn = cf(fb, fc, fe, dy)
798+ let co = fn._1
799+ let cp = fn._2
800+ let ck = fn._3
801+ let du = fh
802+ let fo = (cY - dy)
803+ let fp = if ((fb > 0))
804+ then ((fj - du) - fo)
805+ else ((fo + fj) - du)
806+ let fq = (fb + dt)
807+ $Tuple11(fq, co, au(fp), by(fq), bS, bR, dB, dC, (bc() - fh), (bq() - (if ((fq > 0))
808+ then au(dt)
809+ else 0)), (bp() - (if ((0 > fq))
810+ then au(dt)
792811 else 0)))
793812 }
794813 }
795814 else throw("Close position first")
796- let ff = eZ._1
797- let fg = eZ._2
798- let fh = eZ._3
799- let fi = eZ._4
800- let bQ = eZ._5
801- let bP = eZ._6
802- let dx = eZ._7
803- let dy = eZ._8
804- let dB = eZ._9
805- let dz = eZ._10
806- let dA = eZ._11
807- let fj = invoke(ab(), "notifyNotional", [toString(bq.caller), fh], nil)
808- if ((fj == fj))
809- then (ei(toString(bq.caller), ff, fg, fh, fi) ++ eu(bP, bQ, dx, dy, dB, dz, dA))
815+ let fq = fk._1
816+ let fr = fk._2
817+ let fs = fk._3
818+ let ft = fk._4
819+ let bS = fk._5
820+ let bR = fk._6
821+ let dB = fk._7
822+ let dC = fk._8
823+ let dF = fk._9
824+ let dD = fk._10
825+ let dE = fk._11
826+ let fu = invoke(ac(), "notifyNotional", [toString(bs.caller), fs], nil)
827+ if ((fu == fu))
828+ then (et(toString(bs.caller), fq, fr, fs, ft) ++ eF(bR, bS, dB, dC, dF, dD, dE))
810829 else throw("Strict value is not equal to itself.")
811830 }
812831
813832
814833
815-@Callable(bq)
816-func increasePosition (eU,eN,eO) = {
817- let fk = bq.payments[0].amount
818- if (if (if (if (if (if (if ((eU != ad))
819- then (eU != ae)
834+@Callable(bs)
835+func increasePosition (ff,eY,eZ,fv) = {
836+ let fw = bs.payments[0].amount
837+ if (if (if (if (if (if (if ((ff != af))
838+ then (ff != ag)
820839 else false)
821840 then true
822- else (0 >= fk))
841+ else (0 >= fw))
823842 then true
824- else !(bE()))
843+ else !(bG()))
825844 then true
826- else (bq.payments[0].assetId != X()))
845+ else (bs.payments[0].assetId != Y()))
827846 then true
828- else !(br(ap(ai, eN), aV(), true)))
847+ else !(bt(ar(ak, eY), aX(), true)))
829848 then true
830- else bF())
849+ else bH())
831850 then throw("Invalid increasePosition parameters")
832851 else {
833- let fl = ar(fk, aU())
834- let eC = (fk - fl)
835- let fm = by(toString(bq.caller))
836- let eQ = fm._1
837- let eR = fm._2
838- let eS = fm._3
839- let eT = fm._4
840- let fn = (eQ == 0)
841- let fo = if ((eQ > 0))
842- then (eU == ad)
843- else (eU == ae)
844- let fp = if (!(fn))
845- then fo
846- else false
847- let eV = (eU == ad)
848- let fq = if (if (fn)
849- then true
850- else fp)
852+ let bB = toString(bs.caller)
853+ let fx = at(fw, aW())
854+ let fy = invoke(ae(), "acceptPaymentWithLink", [bB, fv], [AttachedPayment(Y(), fx)])
855+ if ((fy == fy))
851856 then {
852- let eW = ar(eC, eN)
853- let fr = bM(eV, eW)
854- let bS = fr._1
855- let bP = fr._2
856- let bQ = fr._3
857- let dx = fr._4
858- let dy = fr._5
859- if (if ((eO != 0))
860- then (eO > as(bS))
861- else false)
862- then throw(((("Limit error: " + toString(as(bS))) + " < ") + toString(eO)))
857+ let fz = {
858+ let bD = fy
859+ if ($isInstanceOf(bD, "Int"))
860+ then {
861+ let fA = bD
862+ fA
863+ }
864+ else throw("Invalid referrerFee")
865+ }
866+ let eN = (fw - fx)
867+ let fB = (fx - fz)
868+ let fC = bA(bB)
869+ let fb = fC._1
870+ let fc = fC._2
871+ let fd = fC._3
872+ let fe = fC._4
873+ let fD = (fb == 0)
874+ let fE = if ((fb > 0))
875+ then (ff == af)
876+ else (ff == ag)
877+ let fF = if (!(fD))
878+ then fE
879+ else false
880+ let fg = (ff == af)
881+ let fG = if (if (fD)
882+ then true
883+ else fF)
884+ then {
885+ let fh = at(eN, eY)
886+ let fH = bO(fg, fh)
887+ let bU = fH._1
888+ let bR = fH._2
889+ let bS = fH._3
890+ let dB = fH._4
891+ let dC = fH._5
892+ if (if ((eZ != 0))
893+ then (eZ > au(bU))
894+ else false)
895+ then throw(((("Limit error: " + toString(au(bU))) + " < ") + toString(eZ)))
896+ else {
897+ let fq = (fb + bU)
898+ let fI = ar(fh, eY)
899+ let fJ = cf(fb, fc, fe, fI)
900+ let co = fJ._1
901+ let cT = fJ._2
902+ let cU = fJ._3
903+ if (!(cE(bR, bS)))
904+ then throw("Over max spread limit")
905+ else $Tuple11(fq, co, (fd + fh), by(fq), bS, bR, dB, dC, (bc() + fh), (bq() + (if ((fq > 0))
906+ then au(bU)
907+ else 0)), (bp() + (if ((0 > fq))
908+ then au(bU)
909+ else 0)))
910+ }
911+ }
863912 else {
864- let ff = (eQ + bS)
865- let fs = ap(eW, eN)
866- let ft = cd(eQ, eR, eT, fs)
867- let cm = ft._1
868- let cR = ft._2
869- let cS = ft._3
870- if (!(cC(bP, bQ)))
871- then throw("Over max spread limit")
872- else $Tuple11(ff, cm, (eS + eW), bw(ff), bQ, bP, dx, dy, (ba() + eW), (bo() + (if ((ff > 0))
873- then as(bS)
874- else 0)), (bn() + (if ((0 > ff))
875- then as(bS)
876- else 0)))
913+ let fh = at(eN, eY)
914+ let fK = cZ(toString(bs.caller), an)
915+ let fj = fK._1
916+ let cY = fK._2
917+ if ((fj > fh))
918+ then throw("Use decreasePosition to decrease position size")
919+ else throw("Close position first")
877920 }
878- }
879- else {
880- let eW = ar(eC, eN)
881- let fu = cU(toString(bq.caller), al)
882- let eY = fu._1
883- let cZ = fu._2
884- if ((eY > eW))
885- then throw("Use decreasePosition to decrease position size")
886- else throw("Close position first")
887- }
888- let ff = fq._1
889- let fg = fq._2
890- let fh = fq._3
891- let fi = fq._4
892- let bQ = fq._5
893- let bP = fq._6
894- let dx = fq._7
895- let dy = fq._8
896- let dB = fq._9
897- let dz = fq._10
898- let dA = fq._11
899- let fv = (fl / 2)
900- let fw = (fl - fv)
901- let fx = invoke(Y(), "lockNeutrinoSP", [toString(Z()), ak], [AttachedPayment(X(), eC)])
902- if ((fx == fx))
903- then {
904- let fy = invoke(aa(), "deposit", nil, [AttachedPayment(X(), fw)])
905- if ((fy == fy))
921+ let fq = fG._1
922+ let fr = fG._2
923+ let fs = fG._3
924+ let ft = fG._4
925+ let bS = fG._5
926+ let bR = fG._6
927+ let dB = fG._7
928+ let dC = fG._8
929+ let dF = fG._9
930+ let dD = fG._10
931+ let dE = fG._11
932+ let fL = (fB / 2)
933+ let fM = (fB - fL)
934+ let fN = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eN)])
935+ if ((fN == fN))
906936 then {
907- let fz = invoke(ab(), "notifyFees", [toString(bq.caller), fl], nil)
908- if ((fz == fz))
937+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fM)])
938+ if ((fO == fO))
909939 then {
910- let fj = invoke(ab(), "notifyNotional", [toString(bq.caller), fh], nil)
911- if ((fj == fj))
912- then (((ei(toString(bq.caller), ff, fg, fh, fi) ++ eu(bP, bQ, dx, dy, dB, dz, dA)) ++ eF(fv)) ++ eE((aT() + eC)))
940+ let fP = invoke(ac(), "notifyFees", [bB, fB], nil)
941+ if ((fP == fP))
942+ then {
943+ let fu = invoke(ac(), "notifyNotional", [bB, fs], nil)
944+ if ((fu == fu))
945+ then (((et(bB, fq, fr, fs, ft) ++ eF(bR, bS, dB, dC, dF, dD, dE)) ++ eQ(fL)) ++ eP((aV() + eN)))
946+ else throw("Strict value is not equal to itself.")
947+ }
913948 else throw("Strict value is not equal to itself.")
914949 }
915950 else throw("Strict value is not equal to itself.")
922957
923958
924959
925-@Callable(bq)
960+@Callable(bs)
926961 func addMargin () = {
927- let fk = bq.payments[0].amount
928- if (if (if (if ((bq.payments[0].assetId != X()))
962+ let fw = bs.payments[0].amount
963+ if (if (if (if ((bs.payments[0].assetId != Y()))
929964 then true
930- else !(bD(toString(bq.caller))))
965+ else !(bF(toString(bs.caller))))
931966 then true
932- else !(bE()))
967+ else !(bG()))
933968 then true
934- else bF())
969+ else bH())
935970 then throw("Invalid addMargin parameters")
936971 else {
937- let fl = ar(fk, aU())
938- let eC = (fk - fl)
939- let fA = by(toString(bq.caller))
940- let eQ = fA._1
941- let eR = fA._2
942- let eS = fA._3
943- let eT = fA._4
944- let fv = (fl / 2)
945- let fw = (fl - fv)
946- let fx = invoke(Y(), "lockNeutrinoSP", [toString(Z()), ak], [AttachedPayment(X(), eC)])
947- if ((fx == fx))
972+ let bB = toString(bs.caller)
973+ let fx = at(fw, aW())
974+ let fy = invoke(ae(), "acceptPayment", [bB], [AttachedPayment(Y(), fx)])
975+ if ((fy == fy))
948976 then {
949- let fy = invoke(aa(), "deposit", nil, [AttachedPayment(X(), fw)])
950- if ((fy == fy))
977+ let fz = {
978+ let bD = fy
979+ if ($isInstanceOf(bD, "Int"))
980+ then {
981+ let fA = bD
982+ fA
983+ }
984+ else throw("Invalid referrerFee")
985+ }
986+ let fB = (fx - fz)
987+ let eN = (fw - fx)
988+ let fQ = bA(bB)
989+ let fb = fQ._1
990+ let fc = fQ._2
991+ let fd = fQ._3
992+ let fe = fQ._4
993+ let fL = (fB / 2)
994+ let fM = (fB - fL)
995+ let fN = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eN)])
996+ if ((fN == fN))
951997 then {
952- let fz = invoke(ab(), "notifyFees", [toString(bq.caller), fl], nil)
953- if ((fz == fz))
954- then ((ei(toString(bq.caller), eQ, (eR + eC), eS, eT) ++ eF(fv)) ++ eE((aT() + eC)))
998+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fM)])
999+ if ((fO == fO))
1000+ then {
1001+ let fP = invoke(ac(), "notifyFees", [bB, fB], nil)
1002+ if ((fP == fP))
1003+ then ((et(bB, fb, (fc + eN), fd, fe) ++ eQ(fL)) ++ eP((aV() + eN)))
1004+ else throw("Strict value is not equal to itself.")
1005+ }
9551006 else throw("Strict value is not equal to itself.")
9561007 }
9571008 else throw("Strict value is not equal to itself.")
9621013
9631014
9641015
965-@Callable(bq)
966-func removeMargin (eC) = if (if (if (if ((0 >= eC))
1016+@Callable(bs)
1017+func removeMargin (eN) = if (if (if (if ((0 >= eN))
9671018 then true
968- else !(bD(toString(bq.caller))))
1019+ else !(bF(toString(bs.caller))))
9691020 then true
970- else !(bE()))
1021+ else !(bG()))
9711022 then true
972- else bF())
1023+ else bH())
9731024 then throw("Invalid removeMargin parameters")
9741025 else {
975- let fB = by(toString(bq.caller))
976- let eQ = fB._1
977- let eR = fB._2
978- let eS = fB._3
979- let eT = fB._4
980- let fC = -(eC)
981- let fD = cd(eQ, eR, eT, fC)
982- let cm = fD._1
983- let cn = fD._2
984- if ((cn != 0))
1026+ let fR = bA(toString(bs.caller))
1027+ let fb = fR._1
1028+ let fc = fR._2
1029+ let fd = fR._3
1030+ let fe = fR._4
1031+ let fS = -(eN)
1032+ let fT = cf(fb, fc, fe, fS)
1033+ let co = fT._1
1034+ let cp = fT._2
1035+ if ((cp != 0))
9851036 then throw("Invalid removed margin amount")
9861037 else {
987- let fE = da(cm, cn, eS)
988- if (!(br(fE, aV(), true)))
989- then throw(((("Too much margin removed: " + toString(fE)) + " < ") + toString(aV())))
1038+ let fU = de(co, cp, fd)
1039+ if (!(bt(fU, aX(), true)))
1040+ then throw(((("Too much margin removed: " + toString(fU)) + " < ") + toString(aX())))
9901041 else {
991- let fF = invoke(Y(), "unlockNeutrino", [eC, toBase58String(X())], nil)
992- if ((fF == fF))
993- then ((ei(toString(bq.caller), eQ, cm, eS, bw(eQ)) ++ eB(bq.caller, eC)) ++ eE((aT() - eC)))
1042+ let fV = invoke(Z(), "unlockNeutrino", [eN, toBase58String(Y())], nil)
1043+ if ((fV == fV))
1044+ then ((et(toString(bs.caller), fb, co, fd, by(fb)) ++ eM(bs.caller, eN)) ++ eP((aV() - eN)))
9941045 else throw("Strict value is not equal to itself.")
9951046 }
9961047 }
9981049
9991050
10001051
1001-@Callable(bq)
1052+@Callable(bs)
10021053 func closePosition () = {
1003- let fG = bp(bq)
1004- let fH = valueOrErrorMessage(addressFromString(fG), "Invalid caller")
1005- if (if (if (!(bD(fG)))
1054+ let fW = br(bs)
1055+ let fX = valueOrErrorMessage(addressFromString(fW), "Invalid caller")
1056+ if (if (if (!(bF(fW)))
10061057 then true
1007- else !(bE()))
1058+ else !(bG()))
10081059 then true
1009- else bF())
1060+ else bH())
10101061 then throw("Invalid closePosition parameters")
10111062 else {
1012- let fI = dr(fG, true)
1013- let cR = fI._1
1014- let fJ = fI._2
1015- let du = fI._3
1016- let dv = fI._4
1017- let bP = fI._5
1018- let bQ = fI._6
1019- let dx = fI._7
1020- let dy = fI._8
1021- let dB = fI._9
1022- let cS = fI._10
1023- let dz = fI._11
1024- let dA = fI._12
1025- if ((fJ > 0))
1063+ let fY = dv(fW, true)
1064+ let cT = fY._1
1065+ let fZ = fY._2
1066+ let dy = fY._3
1067+ let dz = fY._4
1068+ let bR = fY._5
1069+ let bS = fY._6
1070+ let dB = fY._7
1071+ let dC = fY._8
1072+ let dF = fY._9
1073+ let cU = fY._10
1074+ let dD = fY._11
1075+ let dE = fY._12
1076+ if ((fZ > 0))
10261077 then throw("Unable to close position with bad debt")
10271078 else {
1028- let fK = as(dv)
1029- let fL = (aT() - fK)
1030- let fM = if ((0 > fL))
1031- then $Tuple2(0, as(fL))
1032- else $Tuple2(fL, 0)
1033- let fN = fM._1
1034- let fO = fM._2
1035- let fP = if ((fO > 0))
1079+ let ga = au(dz)
1080+ let gb = (aV() - ga)
1081+ let gc = if ((0 > gb))
1082+ then $Tuple2(0, au(gb))
1083+ else $Tuple2(gb, 0)
1084+ let gd = gc._1
1085+ let ge = gc._2
1086+ let fA = if ((ge > 0))
10361087 then {
1037- let fQ = invoke(aa(), "withdraw", [fO], nil)
1038- if ((fQ == fQ))
1088+ let gf = invoke(ab(), "withdraw", [ge], nil)
1089+ if ((gf == gf))
10391090 then nil
10401091 else throw("Strict value is not equal to itself.")
10411092 }
10421093 else nil
1043- if ((fP == fP))
1094+ if ((fA == fA))
10441095 then {
1045- let fF = invoke(Y(), "unlockNeutrino", [(fK - fO), toBase58String(X())], nil)
1046- if ((fF == fF))
1096+ let fV = invoke(Z(), "unlockNeutrino", [(ga - ge), toBase58String(Y())], nil)
1097+ if ((fV == fV))
10471098 then {
1048- let fj = invoke(ab(), "notifyNotional", [fG, 0], nil)
1049- if ((fj == fj))
1050- then (((eA(fG) ++ eu(bP, bQ, dx, dy, dB, dz, dA)) ++ eB(fH, fK)) ++ eE(fN))
1099+ let fu = invoke(ac(), "notifyNotional", [fW, 0], nil)
1100+ if ((fu == fu))
1101+ then (((eL(fW) ++ eF(bR, bS, dB, dC, dF, dD, dE)) ++ eM(fX, ga)) ++ eP(gd))
10511102 else throw("Strict value is not equal to itself.")
10521103 }
10531104 else throw("Strict value is not equal to itself.")
10591110
10601111
10611112
1062-@Callable(bq)
1063-func liquidate (bz) = {
1064- let fR = de(bz, al)
1065- let fE = if (cI())
1113+@Callable(bs)
1114+func liquidate (bB) = {
1115+ let gg = di(bB, an)
1116+ let fU = if (cK())
10661117 then {
1067- let fS = de(bz, am)
1068- at(fR, fS)
1118+ let gh = di(bB, ao)
1119+ av(gg, gh)
10691120 }
1070- else fR
1071- if (if (if (if (!(br(fE, bf(), false)))
1121+ else gg
1122+ if (if (if (if (!(bt(fU, bh(), false)))
10721123 then true
1073- else !(bD(bz)))
1124+ else !(bF(bB)))
10741125 then true
1075- else !(bE()))
1126+ else !(bG()))
10761127 then true
1077- else bF())
1128+ else bH())
10781129 then throw("Unable to liquidate")
1079- else if (if (if ((fR > bg()))
1080- then (bh() > 0)
1130+ else if (if (if ((gg > bi()))
1131+ then (bj() > 0)
10811132 else false)
1082- then (ai > bh())
1133+ then (ak > bj())
10831134 else false)
10841135 then {
1085- let fT = by(bz)
1086- let eQ = fT._1
1087- let eR = fT._2
1088- let eS = fT._3
1089- let eT = fT._4
1090- let eU = if ((eQ > 0))
1091- then ae
1092- else ad
1093- let eV = (eU == ad)
1094- let dq = dk(bz, eQ)
1095- let fU = cU(bz, al)
1096- let eY = fU._1
1097- let cZ = fU._2
1098- let fV = bM(eV, dq)
1099- let dp = fV._1
1100- let bP = fV._2
1101- let bQ = fV._3
1102- let dx = fV._4
1103- let dy = fV._5
1104- let du = ap(ar(cZ, as(dp)), as(eQ))
1105- let fW = cd(eQ, eR, eT, du)
1106- let cm = fW._1
1107- let cn = fW._2
1108- let ci = fW._3
1109- let fd = (cZ - du)
1110- let fe = if ((eQ > 0))
1111- then ((eY - dq) - fd)
1112- else ((fd + eY) - dq)
1113- let fX = ar(dq, bg())
1114- let fY = (fX / 2)
1115- let fw = (fX - fY)
1116- let fZ = (cm - fX)
1117- let ff = (eQ + dp)
1118- let fh = as(fe)
1119- let ga = bw(ff)
1120- let dB = (ba() - dq)
1121- let fL = (aT() - fX)
1122- let gb = if ((0 > fL))
1123- then $Tuple2(0, as(fL))
1124- else $Tuple2(fL, 0)
1125- let gc = gb._1
1126- let gd = gb._2
1127- let fP = if ((gd > 0))
1136+ let gi = bA(bB)
1137+ let fb = gi._1
1138+ let fc = gi._2
1139+ let fd = gi._3
1140+ let fe = gi._4
1141+ let ff = if ((fb > 0))
1142+ then ag
1143+ else af
1144+ let fg = (ff == af)
1145+ let du = do(bB, fb)
1146+ let gj = cZ(bB, an)
1147+ let fj = gj._1
1148+ let cY = gj._2
1149+ let gk = bO(fg, du)
1150+ let dt = gk._1
1151+ let bR = gk._2
1152+ let bS = gk._3
1153+ let dB = gk._4
1154+ let dC = gk._5
1155+ let dy = ar(at(cY, au(dt)), au(fb))
1156+ let gl = cf(fb, fc, fe, dy)
1157+ let co = gl._1
1158+ let cp = gl._2
1159+ let ck = gl._3
1160+ let fo = (cY - dy)
1161+ let fp = if ((fb > 0))
1162+ then ((fj - du) - fo)
1163+ else ((fo + fj) - du)
1164+ let gm = at(du, bi())
1165+ let gn = (gm / 2)
1166+ let fM = (gm - gn)
1167+ let go = (co - gm)
1168+ let fq = (fb + dt)
1169+ let fs = au(fp)
1170+ let gp = by(fq)
1171+ let dF = (bc() - du)
1172+ let gb = (aV() - gm)
1173+ let gq = if ((0 > gb))
1174+ then $Tuple2(0, au(gb))
1175+ else $Tuple2(gb, 0)
1176+ let gr = gq._1
1177+ let gs = gq._2
1178+ let fA = if ((gs > 0))
11281179 then {
1129- let fQ = invoke(aa(), "withdraw", [gd], nil)
1130- if ((fQ == fQ))
1180+ let gf = invoke(ab(), "withdraw", [gs], nil)
1181+ if ((gf == gf))
11311182 then nil
11321183 else throw("Strict value is not equal to itself.")
11331184 }
11341185 else nil
1135- if ((fP == fP))
1186+ if ((fA == fA))
11361187 then {
1137- let fF = invoke(Y(), "unlockNeutrino", [(fX - gd), toBase58String(X())], nil)
1138- if ((fF == fF))
1188+ let fV = invoke(Z(), "unlockNeutrino", [(gm - gs), toBase58String(Y())], nil)
1189+ if ((fV == fV))
11391190 then {
1140- let fy = invoke(aa(), "deposit", nil, [AttachedPayment(X(), fw)])
1141- if ((fy == fy))
1191+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fM)])
1192+ if ((fO == fO))
11421193 then {
1143- let fj = invoke(ab(), "notifyNotional", [bz, fh], nil)
1144- if ((fj == fj))
1145- then (((ei(bz, ff, fZ, fh, ga) ++ eu(bP, bQ, dx, dy, dB, (bo() - (if ((ff > 0))
1146- then as(dp)
1147- else 0)), (bn() - (if ((0 > ff))
1148- then as(dp)
1149- else 0)))) ++ eB(bq.caller, fY)) ++ eE(gc))
1194+ let fu = invoke(ac(), "notifyNotional", [bB, fs], nil)
1195+ if ((fu == fu))
1196+ then (((et(bB, fq, go, fs, gp) ++ eF(bR, bS, dB, dC, dF, (bq() - (if ((fq > 0))
1197+ then au(dt)
1198+ else 0)), (bp() - (if ((0 > fq))
1199+ then au(dt)
1200+ else 0)))) ++ eM(bs.caller, gn)) ++ eP(gr))
11501201 else throw("Strict value is not equal to itself.")
11511202 }
11521203 else throw("Strict value is not equal to itself.")
11561207 else throw("Strict value is not equal to itself.")
11571208 }
11581209 else {
1159- let ge = dr(bz, false)
1160- let cR = ge._1
1161- let cn = ge._2
1162- let cS = ge._3
1163- let cT = ge._4
1164- let bP = ge._5
1165- let bQ = ge._6
1166- let dx = ge._7
1167- let dy = ge._8
1168- let dB = ge._9
1169- let dq = ge._10
1170- let dz = ge._11
1171- let dA = ge._12
1172- let fX = ar(dq, bg())
1173- let fY = (fX / 2)
1174- let fw = (fX - fY)
1175- let fL = (aT() - fX)
1176- let gf = if ((0 > fL))
1177- then $Tuple2(0, as(fL))
1178- else $Tuple2(fL, 0)
1179- let gc = gf._1
1180- let gd = gf._2
1181- let fP = if ((gd > 0))
1210+ let gt = dv(bB, false)
1211+ let cT = gt._1
1212+ let cp = gt._2
1213+ let cU = gt._3
1214+ let cV = gt._4
1215+ let bR = gt._5
1216+ let bS = gt._6
1217+ let dB = gt._7
1218+ let dC = gt._8
1219+ let dF = gt._9
1220+ let du = gt._10
1221+ let dD = gt._11
1222+ let dE = gt._12
1223+ let gm = at(du, bi())
1224+ let gn = (gm / 2)
1225+ let fM = (gm - gn)
1226+ let gb = (aV() - gm)
1227+ let gu = if ((0 > gb))
1228+ then $Tuple2(0, au(gb))
1229+ else $Tuple2(gb, 0)
1230+ let gr = gu._1
1231+ let gs = gu._2
1232+ let fA = if ((gs > 0))
11821233 then {
1183- let fQ = invoke(aa(), "withdraw", [gd], nil)
1184- if ((fQ == fQ))
1234+ let gf = invoke(ab(), "withdraw", [gs], nil)
1235+ if ((gf == gf))
11851236 then nil
11861237 else throw("Strict value is not equal to itself.")
11871238 }
11881239 else nil
1189- if ((fP == fP))
1240+ if ((fA == fA))
11901241 then {
1191- let fF = invoke(Y(), "unlockNeutrino", [(fX - gd), toBase58String(X())], nil)
1192- if ((fF == fF))
1242+ let fV = invoke(Z(), "unlockNeutrino", [(gm - gs), toBase58String(Y())], nil)
1243+ if ((fV == fV))
11931244 then {
1194- let fy = invoke(aa(), "deposit", nil, [AttachedPayment(X(), fw)])
1195- if ((fy == fy))
1245+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fM)])
1246+ if ((fO == fO))
11961247 then {
1197- let fj = invoke(ab(), "notifyNotional", [bz, 0], nil)
1198- if ((fj == fj))
1199- then (((eA(bz) ++ eu(bP, bQ, dx, dy, dB, dz, dA)) ++ eB(bq.caller, fY)) ++ eE(gc))
1248+ let fu = invoke(ac(), "notifyNotional", [bB, 0], nil)
1249+ if ((fu == fu))
1250+ then (((eL(bB) ++ eF(bR, bS, dB, dC, dF, dD, dE)) ++ eM(bs.caller, gn)) ++ eP(gr))
12001251 else throw("Strict value is not equal to itself.")
12011252 }
12021253 else throw("Strict value is not equal to itself.")
12091260
12101261
12111262
1212-@Callable(bq)
1263+@Callable(bs)
12131264 func payFunding () = {
1214- let gg = bb()
1215- if (if (if ((gg > lastBlock.timestamp))
1265+ let gv = bd()
1266+ if (if (if ((gv > lastBlock.timestamp))
12161267 then true
1217- else !(bE()))
1268+ else !(bG()))
12181269 then true
1219- else bF())
1220- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(gg)))
1270+ else bH())
1271+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(gv)))
12211272 else {
1222- let gh = cx()
1223- let gi = dC()
1224- let gj = (gi - gh)
1225- let gk = if (if ((bn() == 0))
1273+ let gw = cz()
1274+ let gx = dG()
1275+ let gy = (gx - gw)
1276+ let gz = if (if ((bp() == 0))
12261277 then true
1227- else (bo() == 0))
1278+ else (bq() == 0))
12281279 then $Tuple2(0, 0)
1229- else if ((0 > gj))
1280+ else if ((0 > gy))
12301281 then {
1231- let gl = ap(ar(gj, bd()), aj)
1232- let gm = ap(ar(gl, bn()), bo())
1233- $Tuple2(gl, gm)
1282+ let gA = ar(at(gy, bf()), al)
1283+ let gB = ar(at(gA, bp()), bq())
1284+ $Tuple2(gA, gB)
12341285 }
12351286 else {
1236- let gm = ap(ar(gj, bd()), aj)
1237- let gl = ap(ar(gm, bo()), bn())
1238- $Tuple2(gl, gm)
1287+ let gB = ar(at(gy, bf()), al)
1288+ let gA = ar(at(gB, bq()), bp())
1289+ $Tuple2(gA, gB)
12391290 }
1240- let gl = gk._1
1241- let gm = gk._2
1242- ec((gg + be()), (bl() + gm), (bm() + gl), ap(gm, gh), ap(gl, gh))
1291+ let gA = gz._1
1292+ let gB = gz._2
1293+ en((gv + bg()), (bn() + gB), (bo() + gA), ar(gB, gw), ar(gA, gw))
12431294 }
12441295 }
12451296
12461297
12471298
1248-@Callable(bq)
1249-func v_get (bz) = {
1250- let gn = dr(bz, false)
1251- let cR = gn._1
1252- let cS = gn._2
1253- let cT = gn._3
1254- let go = gn._4
1255- throw((((an(cS) + an(cT)) + an(go)) + an(dj(bz))))
1299+@Callable(bs)
1300+func forceMoveAsset (bB,eN) = if (if ((addressFromPublicKey(X()) != bs.caller))
1301+ then true
1302+ else (0 > eN))
1303+ then throw("Invalid forceMoveAsset parameters")
1304+ else {
1305+ let fV = invoke(Z(), "unlockNeutrino", [eN, toBase58String(Y())], nil)
1306+ if ((fV == fV))
1307+ then (eM(addressFromStringValue(bB), eN) ++ eP((aV() - eN)))
1308+ else throw("Strict value is not equal to itself.")
1309+ }
1310+
1311+
1312+
1313+@Callable(bs)
1314+func adjustPeg (dX) = if (if ((addressFromPublicKey(X()) != bs.caller))
1315+ then true
1316+ else (0 > dX))
1317+ then throw("Invalid adjustPeg parameters")
1318+ else {
1319+ let gC = dW(dX)
1320+ let eb = gC._1
1321+ let gD = gC._2
1322+ if ((gD == 0))
1323+ then throw("Nothing to adjust")
1324+ else if ((gD > 0))
1325+ then {
1326+ let gf = invoke(ab(), "withdraw", [gD], nil)
1327+ if ((gf == gf))
1328+ then {
1329+ let fN = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), gD)])
1330+ if ((fN == fN))
1331+ then (eP((aV() + gD)) ++ eE(eb, aZ()))
1332+ else throw("Strict value is not equal to itself.")
1333+ }
1334+ else throw("Strict value is not equal to itself.")
1335+ }
1336+ else {
1337+ let fV = invoke(Z(), "unlockNeutrino", [au(gD), toBase58String(Y())], nil)
1338+ if ((fV == fV))
1339+ then {
1340+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), au(gD))])
1341+ if ((fO == fO))
1342+ then (eP((aV() - au(gD))) ++ eE(eb, aZ()))
1343+ else throw("Strict value is not equal to itself.")
1344+ }
1345+ else throw("Strict value is not equal to itself.")
1346+ }
1347+ }
1348+
1349+
1350+
1351+@Callable(bs)
1352+func v_get (bB) = {
1353+ let gE = dv(bB, false)
1354+ let cT = gE._1
1355+ let cU = gE._2
1356+ let cV = gE._3
1357+ let gF = gE._4
1358+ throw((((ap(cU) + ap(cV)) + ap(gF)) + ap(dn(bB))))
12561359 }
12571360
12581361
12591362
1260-@Callable(bq)
1261-func view_calcRemainMarginWithFundingPayment (bz) = {
1262- let gp = by(bz)
1263- let bC = gp._1
1264- let cW = gp._2
1265- let dg = gp._3
1266- let cY = gp._4
1267- let gq = cU(bz, al)
1268- let cO = gq._1
1269- let cZ = gq._2
1270- let gr = cd(bC, cW, cY, cZ)
1271- let cm = gr._1
1272- let cn = gr._2
1273- let ci = gr._3
1274- throw((((((an(cm) + an(ci)) + an(dj(bz))) + an(cZ)) + an(cn)) + an(cO)))
1363+@Callable(bs)
1364+func view_calcRemainMarginWithFundingPayment (bB) = {
1365+ let gG = bA(bB)
1366+ let bE = gG._1
1367+ let db = gG._2
1368+ let dk = gG._3
1369+ let dd = gG._4
1370+ let gH = cZ(bB, an)
1371+ let cQ = gH._1
1372+ let cY = gH._2
1373+ let gI = cf(bE, db, dd, cY)
1374+ let co = gI._1
1375+ let cp = gI._2
1376+ let ck = gI._3
1377+ throw((((((ap(co) + ap(ck)) + ap(dn(bB))) + ap(cY)) + ap(cp)) + ap(cQ)))
12751378 }
12761379
12771380
12781381
1279-@Callable(bq)
1280-func forceMoveAsset (bz,eC) = if (if ((addressFromPublicKey(W()) != bq.caller))
1281- then true
1282- else (0 > eC))
1283- then throw("Invalid forceMoveAsset parameters")
1284- else {
1285- let fF = invoke(Y(), "unlockNeutrino", [eC, toBase58String(X())], nil)
1286- if ((fF == fF))
1287- then (eB(addressFromStringValue(bz), eC) ++ eE((aT() - eC)))
1288- else throw("Strict value is not equal to itself.")
1289- }
1382+@Callable(bs)
1383+func view_getPegAdjustCost (dX) = {
1384+ let ec = dW(dX)
1385+ throw(toString(ec._2))
1386+ }
12901387
12911388
1292-@Verifier(gs)
1293-func gt () = sigVerify(gs.bodyBytes, gs.proofs[0], W())
1389+@Verifier(gJ)
1390+func gK () = sigVerify(gJ.bodyBytes, gJ.proofs[0], X())
12941391
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_ora_key"
55
66 let b = "k_ora_block_key"
77
88 let c = "k_ora"
99
1010 let d = "k_balance"
1111
1212 let e = "k_positionSize"
1313
1414 let f = "k_positionMargin"
1515
1616 let g = "k_positionOpenNotional"
1717
1818 let h = "k_positionFraction"
1919
2020 let i = "k_positionClosedDate"
2121
2222 let j = "k_initialized"
2323
2424 let k = "k_paused"
2525
2626 let l = "k_fee"
2727
2828 let m = "k_fundingPeriod"
2929
3030 let n = "k_initMarginRatio"
3131
3232 let o = "k_mmr"
3333
3434 let p = "k_liquidationFeeRatio"
3535
3636 let q = "k_partLiquidationRatio"
3737
3838 let r = "k_spreadLimit"
3939
4040 let s = "k_maxPriceImpact"
4141
4242 let t = "k_maxPriceSpread"
4343
4444 let u = "k_lastDataStr"
4545
4646 let v = "k_lastMinuteId"
4747
4848 let w = "k_twapDataLastCumulativePrice"
4949
5050 let x = "k_twapDataLastPrice"
5151
5252 let y = "k_twapDataPreviousMinuteId"
5353
5454 let z = "k_latestLongPremiumFraction"
5555
5656 let A = "k_latestShortPremiumFraction"
5757
5858 let B = "k_nextFundingBlockMinTimestamp"
5959
6060 let C = "k_longFundingRate"
6161
6262 let D = "k_shortFundingRate"
6363
6464 let E = "k_qtAstR"
6565
6666 let F = "k_bsAstR"
6767
6868 let G = "k_totalPositionSize"
6969
7070 let H = "k_totalLongPositionSize"
7171
7272 let I = "k_totalShortPositionSize"
7373
7474 let J = "k_cumulativeNotional"
7575
7676 let K = "k_openInterestNotional"
7777
7878 let L = "k_coordinatorAddress"
7979
8080 let M = "k_insurance_address"
8181
8282 let N = "k_admin_address"
8383
8484 let O = "k_admin_public_key"
8585
8686 let P = "k_quote_asset"
8787
8888 let Q = "k_quote_staking"
8989
9090 let R = "k_staking_address"
9191
9292 let S = "k_miner_address"
9393
9494 let T = "k_orders_address"
9595
96-func U () = valueOrErrorMessage(addressFromString(getStringValue(this, L)), "Coordinator not set")
96+let U = "k_referral_address"
97+
98+func V () = valueOrErrorMessage(addressFromString(getStringValue(this, L)), "Coordinator not set")
9799
98100
99-func V () = addressFromString(getStringValue(U(), N))
101+func W () = addressFromString(getStringValue(V(), N))
100102
101103
102-func W () = fromBase58String(getStringValue(U(), O))
104+func X () = fromBase58String(getStringValue(V(), O))
103105
104106
105-func X () = fromBase58String(getStringValue(U(), P))
107+func Y () = fromBase58String(getStringValue(V(), P))
106108
107109
108-func Y () = valueOrErrorMessage(addressFromString(getStringValue(U(), Q)), "Quote asset staking not set")
110+func Z () = valueOrErrorMessage(addressFromString(getStringValue(V(), Q)), "Quote asset staking not set")
109111
110112
111-func Z () = valueOrErrorMessage(addressFromString(getStringValue(U(), R)), "Staking not set")
113+func aa () = valueOrErrorMessage(addressFromString(getStringValue(V(), R)), "Staking not set")
112114
113115
114-func aa () = valueOrErrorMessage(addressFromString(getStringValue(U(), M)), "Insurance not set")
116+func ab () = valueOrErrorMessage(addressFromString(getStringValue(V(), M)), "Insurance not set")
115117
116118
117-func ab () = valueOrErrorMessage(addressFromString(getStringValue(U(), S)), "Miner not set")
119+func ac () = valueOrErrorMessage(addressFromString(getStringValue(V(), S)), "Miner not set")
118120
119121
120-func ac () = valueOrErrorMessage(addressFromString(getStringValue(U(), T)), "Orders not set")
122+func ad () = valueOrErrorMessage(addressFromString(getStringValue(V(), T)), "Orders not set")
121123
122124
123-let ad = 1
124-
125-let ae = 2
126-
127-let af = 15
128-
129-let ag = 15
130-
131-let ah = 1000
132-
133-let ai = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
134-
135-let aj = (86400 * ai)
136-
137-let ak = 100
138-
139-let al = 1
140-
141-let am = 2
142-
143-func an (ao) = (toString(ao) + ",")
125+func ae () = valueOrErrorMessage(addressFromString(getStringValue(V(), U)), "Referral not set")
144126
145127
146-func ap (ao,aq) = fraction(ao, ai, aq, HALFEVEN)
128+let af = 1
129+
130+let ag = 2
131+
132+let ah = 15
133+
134+let ai = 15
135+
136+let aj = 1000
137+
138+let ak = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
139+
140+let al = (86400 * ak)
141+
142+let am = 100
143+
144+let an = 1
145+
146+let ao = 2
147+
148+func ap (aq) = (toString(aq) + ",")
147149
148150
149-func ar (ao,aq) = fraction(ao, aq, ai, HALFEVEN)
151+func ar (aq,as) = fraction(aq, ak, as, HALFEVEN)
150152
151153
152-func as (ao) = if ((ao > 0))
153- then ao
154- else -(ao)
154+func at (aq,as) = fraction(aq, as, ak, HALFEVEN)
155155
156156
157-func at (ao,aq) = if ((ao >= aq))
158- then ao
159- else aq
157+func au (aq) = if ((aq > 0))
158+ then aq
159+ else -(aq)
160160
161161
162-func au (av,aw) = ((av + "_") + aw)
162+func av (aq,as) = if ((aq >= as))
163+ then aq
164+ else as
163165
164166
165-func ax (ay) = {
166- func az (aA,aB) = ((aA + aB) + ",")
167+func aw (ax,ay) = ((ax + "_") + ay)
167168
168- let aC = {
169- let aD = ay
170- let aE = size(aD)
171- let aF = ""
172- func aG (aH,aI) = if ((aI >= aE))
173- then aH
174- else az(aH, aD[aI])
175169
176- func aJ (aH,aI) = if ((aI >= aE))
177- then aH
170+func az (aA) = {
171+ func aB (aC,aD) = ((aC + aD) + ",")
172+
173+ let aE = {
174+ let aF = aA
175+ let aG = size(aF)
176+ let aH = ""
177+ func aI (aJ,aK) = if ((aK >= aG))
178+ then aJ
179+ else aB(aJ, aF[aK])
180+
181+ func aL (aJ,aK) = if ((aK >= aG))
182+ then aJ
178183 else throw("List size exceeds 20")
179184
180- aJ(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aF, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
185+ aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
181186 }
182- let aK = dropRight(aC, 1)
183- let aL = if ((take(aK, 1) == ","))
184- then drop(aK, 1)
185- else aK
186- aL
187+ let aM = dropRight(aE, 1)
188+ let aN = if ((take(aM, 1) == ","))
189+ then drop(aM, 1)
190+ else aM
191+ aN
187192 }
188193
189194
190-func aM (aN) = split(aN, ",")
195+func aO (aP) = split(aP, ",")
191196
192197
193-func aO (ay,aP,aQ) = if ((size(ay) > aP))
194- then (removeByIndex(ay, 0) :+ aQ)
195- else (ay :+ aQ)
198+func aQ (aA,aR,aS) = if ((size(aA) > aR))
199+ then (removeByIndex(aA, 0) :+ aS)
200+ else (aA :+ aS)
196201
197202
198-func aR (aS) = valueOrErrorMessage(getInteger(this, aS), ("no value for " + aS))
203+func aT (aU) = valueOrErrorMessage(getInteger(this, aU), ("no value for " + aU))
199204
200205
201-func aT () = aR(d)
206+func aV () = aT(d)
202207
203208
204-func aU () = aR(l)
209+func aW () = aT(l)
205210
206211
207-func aV () = aR(n)
212+func aX () = aT(n)
208213
209214
210-func aW () = aR(E)
215+func aY () = aT(E)
211216
212217
213-func aX () = aR(F)
218+func aZ () = aT(F)
214219
215220
216-func aY () = aR(G)
221+func ba () = aT(G)
217222
218223
219-func aZ () = aR(J)
224+func bb () = aT(J)
220225
221226
222-func ba () = aR(K)
227+func bc () = aT(K)
223228
224229
225-func bb () = aR(B)
230+func bd () = aT(B)
226231
227232
228-func bc () = aR(m)
233+func be () = aT(m)
229234
230235
231-func bd () = (bc() * ai)
236+func bf () = (be() * ak)
232237
233238
234-func be () = (bc() * ah)
239+func bg () = (be() * aj)
235240
236241
237-func bf () = aR(o)
242+func bh () = aT(o)
238243
239244
240-func bg () = aR(p)
245+func bi () = aT(p)
241246
242247
243-func bh () = aR(q)
248+func bj () = aT(q)
244249
245250
246-func bi () = aR(r)
251+func bk () = aT(r)
247252
248253
249-func bj () = aR(s)
254+func bl () = aT(s)
250255
251256
252-func bk () = aR(t)
257+func bm () = aT(t)
253258
254259
255-func bl () = aR(z)
260+func bn () = aT(z)
256261
257262
258-func bm () = aR(A)
263+func bo () = aT(A)
259264
260265
261-func bn () = aR(I)
266+func bp () = aT(I)
262267
263268
264-func bo () = aR(H)
269+func bq () = aT(H)
265270
266271
267-func bp (bq) = valueOrElse(getString(ac(), "k_sender"), toString(bq.caller))
272+func br (bs) = valueOrElse(getString(ad(), "k_sender"), toString(bs.caller))
268273
269274
270-func br (bs,bt,bu) = {
271- let bv = (bs - bt)
272- if (if (bu)
273- then (0 > bv)
275+func bt (bu,bv,bw) = {
276+ let bx = (bu - bv)
277+ if (if (bw)
278+ then (0 > bx)
274279 else false)
275280 then throw("Invalid margin")
276- else if (if (!(bu))
277- then (bv >= 0)
281+ else if (if (!(bw))
282+ then (bx >= 0)
278283 else false)
279284 then throw("Invalid margin")
280285 else true
281286 }
282287
283288
284-func bw (bx) = if ((bx == 0))
289+func by (bz) = if ((bz == 0))
285290 then throw("Should not be called with _positionSize == 0")
286- else if ((bx > 0))
287- then bl()
288- else bm()
291+ else if ((bz > 0))
292+ then bn()
293+ else bo()
289294
290295
291-func by (bz) = {
292- let bA = getInteger(this, au(e, bz))
293- let bB = bA
294- if ($isInstanceOf(bB, "Int"))
296+func bA (bB) = {
297+ let bC = getInteger(this, aw(e, bB))
298+ let bD = bC
299+ if ($isInstanceOf(bD, "Int"))
295300 then {
296- let bC = bB
297- $Tuple4(bC, getIntegerValue(this, au(f, bz)), getIntegerValue(this, au(g, bz)), getIntegerValue(this, au(h, bz)))
301+ let bE = bD
302+ $Tuple4(bE, getIntegerValue(this, aw(f, bB)), getIntegerValue(this, aw(g, bB)), getIntegerValue(this, aw(h, bB)))
298303 }
299304 else $Tuple4(0, 0, 0, 0)
300305 }
301306
302307
303-func bD (bz) = if ((by(bz)._1 == 0))
308+func bF (bB) = if ((bA(bB)._1 == 0))
304309 then throw("No open position")
305310 else true
306311
307312
308-func bE () = valueOrElse(getBoolean(this, j), false)
313+func bG () = valueOrElse(getBoolean(this, j), false)
309314
310315
311-func bF () = valueOrElse(getBoolean(this, k), false)
316+func bH () = valueOrElse(getBoolean(this, k), false)
312317
313318
314-func bG (bH,bI,bJ) = if (bH)
319+func bI (bJ,bK,bL) = if (bJ)
315320 then {
316- let bK = (aX() - bJ)
317- if ((0 >= bK))
321+ let bM = (aZ() - bL)
322+ if ((0 >= bM))
318323 then throw("Tx lead to base asset reserve <= 0, revert")
319- else $Tuple4((aW() + bI), bK, (aY() + bJ), (aZ() + bI))
324+ else $Tuple4((aY() + bK), bM, (ba() + bL), (bb() + bK))
320325 }
321326 else {
322- let bL = (aW() - bI)
323- if ((0 >= bL))
327+ let bN = (aY() - bK)
328+ if ((0 >= bN))
324329 then throw("Tx lead to base quote reserve <= 0, revert")
325- else $Tuple4(bL, (aX() + bJ), (aY() - bJ), (aZ() - bI))
330+ else $Tuple4(bN, (aZ() + bL), (ba() - bL), (bb() - bK))
326331 }
327332
328333
329-func bM (bH,bI) = {
330- let bN = aW()
331- let bO = aX()
332- let aS = ar(bN, bO)
333- let bP = if (bH)
334- then (bN + bI)
335- else (bN - bI)
336- let bQ = ap(aS, bP)
337- let bR = as((bQ - bO))
338- let bS = if (bH)
339- then bR
340- else -(bR)
341- let bT = bG(bH, bI, bR)
342- let bU = bT._1
343- let bV = bT._2
344- let bW = bT._3
345- let bX = bT._4
346- let bY = ap(bN, bO)
347- let bZ = ap(bI, bR)
348- let ca = as((bY - bZ))
349- let cb = (ai - ap(bY, (bY + ca)))
350- let cc = bj()
351- if ((cb > cc))
352- then throw(((((((((((((("Price impact " + toString(cb)) + " > max price impact ") + toString(cc)) + " before quote asset: ") + toString(bN)) + " before base asset: ") + toString(bO)) + " quote asset amount to exchange: ") + toString(bI)) + " price before: ") + toString(bY)) + " marketPrice: ") + toString(bZ)))
353- else $Tuple5(bS, bU, bV, bW, bX)
334+func bO (bJ,bK) = {
335+ let bP = aY()
336+ let bQ = aZ()
337+ let aU = at(bP, bQ)
338+ let bR = if (bJ)
339+ then (bP + bK)
340+ else (bP - bK)
341+ let bS = ar(aU, bR)
342+ let bT = au((bS - bQ))
343+ let bU = if (bJ)
344+ then bT
345+ else -(bT)
346+ let bV = bI(bJ, bK, bT)
347+ let bW = bV._1
348+ let bX = bV._2
349+ let bY = bV._3
350+ let bZ = bV._4
351+ let ca = ar(bP, bQ)
352+ let cb = ar(bK, bT)
353+ let cc = au((ca - cb))
354+ let cd = (ak - ar(ca, (ca + cc)))
355+ let ce = bl()
356+ if ((cd > ce))
357+ then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(bP)) + " before base asset: ") + toString(bQ)) + " quote asset amount to exchange: ") + toString(bK)) + " price before: ") + toString(ca)) + " marketPrice: ") + toString(cb)))
358+ else $Tuple5(bU, bW, bX, bY, bZ)
354359 }
355360
356361
357-func cd (ce,cf,cg,ch) = {
358- let ci = if ((ce != 0))
362+func cf (cg,ch,ci,cj) = {
363+ let ck = if ((cg != 0))
359364 then {
360- let cj = bw(ce)
361- ar((cj - cg), ce)
365+ let cl = by(cg)
366+ at((cl - ci), cg)
362367 }
363368 else 0
364- let ck = ((ch - ci) + cf)
365- let cl = if ((0 > ck))
366- then $Tuple2(0, as(ck))
367- else $Tuple2(as(ck), 0)
368- let cm = cl._1
369- let cn = cl._2
370- $Tuple3(cm, cn, ci)
369+ let cm = ((cj - ck) + ch)
370+ let cn = if ((0 > cm))
371+ then $Tuple2(0, au(cm))
372+ else $Tuple2(au(cm), 0)
373+ let co = cn._1
374+ let cp = cn._2
375+ $Tuple3(co, cp, ck)
371376 }
372377
373378
374-func co (bH,bJ,cp,cq,cr) = {
375- let bY = ap(cq, cr)
376- if ((bJ == 0))
379+func cq (bJ,bL,cr,cs,ct) = {
380+ let ca = ar(cs, ct)
381+ if ((bL == 0))
377382 then throw("Invalid base asset amount")
378383 else {
379- let aS = ar(cq, cr)
380- let cs = if (bH)
381- then (cr + bJ)
382- else (cr - bJ)
383- let ct = ap(aS, cs)
384- let cu = as((ct - cq))
385- let cc = bj()
386- let cv = bG(!(bH), cu, bJ)
387- let bU = cv._1
388- let bV = cv._2
389- let bW = cv._3
390- let bX = cv._4
391- let bZ = ap(cu, bJ)
392- let ca = as((bY - bZ))
393- let cb = (ai - ap(bY, (bY + ca)))
394- if (if ((cb > cc))
395- then cp
384+ let aU = at(cs, ct)
385+ let cu = if (bJ)
386+ then (ct + bL)
387+ else (ct - bL)
388+ let cv = ar(aU, cu)
389+ let cw = au((cv - cs))
390+ let ce = bl()
391+ let cx = bI(!(bJ), cw, bL)
392+ let bW = cx._1
393+ let bX = cx._2
394+ let bY = cx._3
395+ let bZ = cx._4
396+ let cb = ar(cw, bL)
397+ let cc = au((ca - cb))
398+ let cd = (ak - ar(ca, (ca + cc)))
399+ if (if ((cd > ce))
400+ then cr
396401 else false)
397- then throw(((((((((((((("Price impact " + toString(cb)) + " > max price impact ") + toString(cc)) + " before quote asset: ") + toString(cq)) + " before base asset: ") + toString(cr)) + " base asset amount to exchange: ") + toString(bJ)) + " price before: ") + toString(bY)) + " market price: ") + toString(bZ)))
398- else $Tuple8(cu, bU, bV, bW, bX, (bo() - (if (bH)
399- then as(bJ)
400- else 0)), (bn() - (if (!(bH))
401- then as(bJ)
402- else 0)), cb)
402+ then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(cs)) + " before base asset: ") + toString(ct)) + " base asset amount to exchange: ") + toString(bL)) + " price before: ") + toString(ca)) + " market price: ") + toString(cb)))
403+ else $Tuple8(cw, bW, bX, bY, bZ, (bq() - (if (bJ)
404+ then au(bL)
405+ else 0)), (bp() - (if (!(bJ))
406+ then au(bL)
407+ else 0)), cd)
403408 }
404409 }
405410
406411
407-func cw (bH,bJ,cp) = co(bH, bJ, cp, aW(), aX())
412+func cy (bJ,bL,cr) = cq(bJ, bL, cr, aY(), aZ())
408413
409414
410-func cx () = {
411- let cy = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
412- let cz = getStringValue(this, a)
413- let cA = getStringValue(this, b)
414- let cB = valueOrErrorMessage(getInteger(cy, cz), ((("Can not get oracle price. Oracle: " + toString(cy)) + " key: ") + cz))
415- cB
415+func cz () = {
416+ let cA = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
417+ let cB = getStringValue(this, a)
418+ let cC = getStringValue(this, b)
419+ let cD = valueOrErrorMessage(getInteger(cA, cB), ((("Can not get oracle price. Oracle: " + toString(cA)) + " key: ") + cB))
420+ cD
416421 }
417422
418423
419-func cC (cq,cr) = {
420- let cD = cx()
421- let cE = ap(cq, cr)
422- let cF = ap((cD + cE), (2 * ai))
423- let cG = ap(as((cD - cE)), cF)
424- if ((cG > bk()))
425- then throw(((("Price spread " + toString(cG)) + " > max price spread ") + toString(bk())))
424+func cE (cs,ct) = {
425+ let cF = cz()
426+ let cG = ar(cs, ct)
427+ let cH = ar((cF + cG), (2 * ak))
428+ let cI = ar(au((cF - cG)), cH)
429+ if ((cI > bm()))
430+ then throw(((("Price spread " + toString(cI)) + " > max price spread ") + toString(bm())))
426431 else true
427432 }
428433
429434
430-func cH () = {
431- let cq = aW()
432- let cr = aX()
433- ap(cq, cr)
435+func cJ () = {
436+ let cs = aY()
437+ let ct = aZ()
438+ ar(cs, ct)
434439 }
435440
436441
437-func cI () = {
438- let cD = cx()
439- let cJ = cH()
440- (ap(as((cD - cJ)), cD) > bi())
442+func cK () = {
443+ let cF = cz()
444+ let cL = cJ()
445+ (ar(au((cF - cL)), cF) > bk())
441446 }
442447
443448
444-func cK (bx,cL,cq,cr) = {
445- let cM = as(bx)
446- let cN = (0 > bx)
447- let cO = if ((cL == al))
449+func cM (bz,cN,cs,ct) = {
450+ let cO = au(bz)
451+ let cP = (0 > bz)
452+ let cQ = if ((cN == an))
448453 then {
449- let cP = co(!(cN), cM, false, cq, cr)
450- let cQ = cP._1
451- let cR = cP._2
452- let cS = cP._3
453- let cT = cP._4
454- cQ
454+ let cR = cq(!(cP), cO, false, cs, ct)
455+ let cS = cR._1
456+ let cT = cR._2
457+ let cU = cR._3
458+ let cV = cR._4
459+ cS
455460 }
456- else ar(cM, cx())
457- cO
461+ else at(cO, cz())
462+ cQ
458463 }
459464
460465
461-func cU (bz,cL) = {
462- let cV = by(bz)
463- let bC = cV._1
464- let cW = cV._2
465- let cX = cV._3
466- let cY = cV._4
467- if ((bC == 0))
468- then throw("Invalid position size")
466+func cW (bz,cX,cs,ct,cN) = if ((bz == 0))
467+ then throw("Invalid position size")
468+ else {
469+ let cP = (0 > bz)
470+ let cQ = cM(bz, cN, cs, ct)
471+ let cY = if (cP)
472+ then (cX - cQ)
473+ else (cQ - cX)
474+ $Tuple2(cQ, cY)
475+ }
476+
477+
478+func cZ (bB,cN) = {
479+ let da = bA(bB)
480+ let bE = da._1
481+ let db = da._2
482+ let dc = da._3
483+ let dd = da._4
484+ cW(bE, dc, aY(), aZ(), cN)
485+ }
486+
487+
488+func de (df,dg,dh) = ar((df - dg), dh)
489+
490+
491+func di (bB,cN) = {
492+ let dj = bA(bB)
493+ let bE = dj._1
494+ let db = dj._2
495+ let dk = dj._3
496+ let dd = dj._4
497+ let dl = cZ(bB, cN)
498+ let cQ = dl._1
499+ let cY = dl._2
500+ let dm = cf(bE, db, dd, cY)
501+ let co = dm._1
502+ let cp = dm._2
503+ de(co, cp, cQ)
504+ }
505+
506+
507+func dn (bB) = di(bB, an)
508+
509+
510+func do (bB,bz) = {
511+ let dp = av(bj(), (ak - ar(dn(bB), bh())))
512+ let dq = at(au(bz), dp)
513+ let dr = cy((bz > 0), dq, false)
514+ let ds = dr._1
515+ let cd = dr._8
516+ if ((bl() > cd))
517+ then ds
469518 else {
470- let cN = (0 > bC)
471- let cO = cK(bC, cL, aW(), aX())
472- let cZ = if (cN)
473- then (cX - cO)
474- else (cO - cX)
475- $Tuple2(cO, cZ)
519+ let dt = at(au(bz), bj())
520+ let du = cy((bz > 0), dt, false)._1
521+ du
476522 }
477523 }
478524
479525
480-func da (db,dc,dd) = ap((db - dc), dd)
481-
482-
483-func de (bz,cL) = {
484- let df = by(bz)
485- let bC = df._1
486- let cW = df._2
487- let dg = df._3
488- let cY = df._4
489- let dh = cU(bz, cL)
490- let cO = dh._1
491- let cZ = dh._2
492- let di = cd(bC, cW, cY, cZ)
493- let cm = di._1
494- let cn = di._2
495- da(cm, cn, cO)
526+func dv (bB,cr) = {
527+ let dw = bA(bB)
528+ let bE = dw._1
529+ let db = dw._2
530+ let dc = dw._3
531+ let dd = dw._4
532+ let cY = cZ(bB, an)._2
533+ let dx = cf(bE, db, dd, cY)
534+ let co = dx._1
535+ let cp = dx._2
536+ let dt = -(bE)
537+ let dy = cY
538+ let dz = -(co)
539+ let dA = cy((bE > 0), au(bE), cr)
540+ let du = dA._1
541+ let bR = dA._2
542+ let bS = dA._3
543+ let dB = dA._4
544+ let dC = dA._5
545+ let dD = dA._6
546+ let dE = dA._7
547+ let dF = (bc() - dc)
548+ $Tuple12(dt, cp, dy, dz, bR, bS, dB, dC, dF, du, dD, dE)
496549 }
497550
498551
499-func dj (bz) = de(bz, al)
552+func dG () = {
553+ let dH = ((lastBlock.timestamp / 1000) / 60)
554+ let dI = (dH - ah)
555+ let dJ = valueOrElse(getString(this, u), "")
556+ let dK = split(dJ, ",")
557+ func dL (aC,dM) = if ((dI >= parseIntValue(dM)))
558+ then (aC :+ parseIntValue(dM))
559+ else aC
500560
561+ let dN = {
562+ let aF = dK
563+ let aG = size(aF)
564+ let aH = nil
565+ func aI (aJ,aK) = if ((aK >= aG))
566+ then aJ
567+ else dL(aJ, aF[aK])
501568
502-func dk (bz,bx) = {
503- let dl = at(bh(), (ai - ap(dj(bz), bf())))
504- let dm = ar(as(bx), dl)
505- let dn = cw((bx > 0), dm, false)
506- let do = dn._1
507- let cb = dn._8
508- if ((bj() > cb))
509- then do
510- else {
511- let dp = ar(as(bx), bh())
512- let dq = cw((bx > 0), dp, false)._1
513- dq
514- }
569+ func aL (aJ,aK) = if ((aK >= aG))
570+ then aJ
571+ else throw("List size exceeds 20")
572+
573+ aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
574+ }
575+ let dO = if ((size(dN) > 0))
576+ then max(dN)
577+ else parseIntValue(dK[0])
578+ let dP = valueOrElse(getInteger(this, v), 0)
579+ let dQ = valueOrElse(getInteger(this, ((w + "_") + toString(dP))), 0)
580+ let dR = valueOrElse(getInteger(this, ((x + "_") + toString(dP))), 0)
581+ let dS = (dQ + ((dH - dP) * dR))
582+ let dT = valueOrElse(getInteger(this, ((w + "_") + toString(dO))), 0)
583+ let dU = valueOrElse(getInteger(this, ((x + "_") + toString(dO))), 0)
584+ let dV = (dT + ((dI - dO) * dU))
585+ ((dS - dV) / ah)
515586 }
516587
517588
518-func dr (bz,cp) = {
519- let ds = by(bz)
520- let bC = ds._1
521- let cW = ds._2
522- let cX = ds._3
523- let cY = ds._4
524- let cZ = cU(bz, al)._2
525- let dt = cd(bC, cW, cY, cZ)
526- let cm = dt._1
527- let cn = dt._2
528- let dp = -(bC)
529- let du = cZ
530- let dv = -(cm)
531- let dw = cw((bC > 0), as(bC), cp)
532- let dq = dw._1
533- let bP = dw._2
534- let bQ = dw._3
535- let dx = dw._4
536- let dy = dw._5
537- let dz = dw._6
538- let dA = dw._7
539- let dB = (ba() - cX)
540- $Tuple12(dp, cn, du, dv, bP, bQ, dx, dy, dB, dq, dz, dA)
589+func dW (dX) = {
590+ let bz = ba()
591+ let dY = (bz > 0)
592+ let dZ = cy(dY, au(bz), false)._1
593+ let ea = aZ()
594+ let eb = at(ea, dX)
595+ let ec = cW(bz, dZ, eb, ea, an)._2
596+ $Tuple2(eb, ec)
541597 }
542598
543599
544-func dC () = {
545- let dD = ((lastBlock.timestamp / 1000) / 60)
546- let dE = (dD - af)
547- let dF = valueOrElse(getString(this, u), "")
548- let dG = split(dF, ",")
549- func dH (aA,dI) = if ((dE >= parseIntValue(dI)))
550- then (aA :+ parseIntValue(dI))
551- else aA
552-
553- let dJ = {
554- let aD = dG
555- let aE = size(aD)
556- let aF = nil
557- func aG (aH,aI) = if ((aI >= aE))
558- then aH
559- else dH(aH, aD[aI])
560-
561- func aJ (aH,aI) = if ((aI >= aE))
562- then aH
563- else throw("List size exceeds 20")
564-
565- aJ(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aG(aF, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
566- }
567- let dK = if ((size(dJ) > 0))
568- then max(dJ)
569- else parseIntValue(dG[0])
570- let dL = valueOrElse(getInteger(this, v), 0)
571- let dM = valueOrElse(getInteger(this, ((w + "_") + toString(dL))), 0)
572- let dN = valueOrElse(getInteger(this, ((x + "_") + toString(dL))), 0)
573- let dO = (dM + ((dD - dL) * dN))
574- let dP = valueOrElse(getInteger(this, ((w + "_") + toString(dK))), 0)
575- let dQ = valueOrElse(getInteger(this, ((x + "_") + toString(dK))), 0)
576- let dR = (dP + ((dE - dK) * dQ))
577- ((dO - dR) / af)
578- }
600+func ed (ee,ef,eg,eh,ei,ej,ek,el,em) = [IntegerEntry(n, ee), IntegerEntry(o, ef), IntegerEntry(p, eg), IntegerEntry(m, eh), IntegerEntry(l, ei), IntegerEntry(r, ej), IntegerEntry(s, ek), IntegerEntry(q, el), IntegerEntry(t, em)]
579601
580602
581-func dS (dT,dU,dV,dW,dX,dY,dZ,ea,eb) = [IntegerEntry(n, dT), IntegerEntry(o, dU), IntegerEntry(p, dV), IntegerEntry(m, dW), IntegerEntry(l, dX), IntegerEntry(r, dY), IntegerEntry(s, dZ), IntegerEntry(q, ea), IntegerEntry(t, eb)]
603+func en (eo,ep,eq,er,es) = [IntegerEntry(B, eo), IntegerEntry(z, ep), IntegerEntry(A, eq), IntegerEntry(C, er), IntegerEntry(D, es)]
582604
583605
584-func ec (ed,ee,ef,eg,eh) = [IntegerEntry(B, ed), IntegerEntry(z, ee), IntegerEntry(A, ef), IntegerEntry(C, eg), IntegerEntry(D, eh)]
606+func et (ay,eu,ev,ew,cl) = [IntegerEntry(aw(e, ay), eu), IntegerEntry(aw(f, ay), ev), IntegerEntry(aw(g, ay), ew), IntegerEntry(aw(h, ay), cl)]
585607
586608
587-func ei (aw,ej,ek,el,cj) = [IntegerEntry(au(e, aw), ej), IntegerEntry(au(f, aw), ek), IntegerEntry(au(g, aw), el), IntegerEntry(au(h, aw), cj)]
588-
589-
590-func em (en) = {
591- let dD = ((lastBlock.timestamp / 1000) / 60)
592- let eo = valueOrElse(getInteger(this, v), 0)
593- if ((eo > dD))
609+func ex (ey) = {
610+ let dH = ((lastBlock.timestamp / 1000) / 60)
611+ let ez = valueOrElse(getInteger(this, v), 0)
612+ if ((ez > dH))
594613 then throw("TWAP out-of-order")
595614 else {
596- let dL = if ((eo == 0))
597- then dD
598- else eo
599- if ((dD > eo))
615+ let dP = if ((ez == 0))
616+ then dH
617+ else ez
618+ if ((dH > ez))
600619 then {
601- let ep = valueOrElse(getInteger(this, ((w + "_") + toString(eo))), 0)
602- let eq = valueOrElse(getInteger(this, ((x + "_") + toString(eo))), en)
603- let er = (ep + ((dD - dL) * eq))
604- let dG = aO(aM(valueOrElse(getString(this, u), "")), af, toString(dD))
605-[IntegerEntry(au(w, toString(dD)), er), IntegerEntry(au(x, toString(dD)), en), IntegerEntry(au(y, toString(dD)), eo), IntegerEntry(v, dD), StringEntry(u, ax(dG))]
620+ let eA = valueOrElse(getInteger(this, ((w + "_") + toString(ez))), 0)
621+ let eB = valueOrElse(getInteger(this, ((x + "_") + toString(ez))), ey)
622+ let eC = (eA + ((dH - dP) * eB))
623+ let dK = aQ(aO(valueOrElse(getString(this, u), "")), ah, toString(dH))
624+[IntegerEntry(aw(w, toString(dH)), eC), IntegerEntry(aw(x, toString(dH)), ey), IntegerEntry(aw(y, toString(dH)), ez), IntegerEntry(v, dH), StringEntry(u, az(dK))]
606625 }
607626 else {
608- let es = valueOrElse(getInteger(this, au(y, toString(dD))), 0)
609- let ep = valueOrElse(getInteger(this, au(w, toString(es))), 0)
610- let eq = valueOrElse(getInteger(this, au(x, toString(es))), en)
611- let er = (ep + ((dD - es) * eq))
612-[IntegerEntry(au(w, toString(dD)), er), IntegerEntry(au(x, toString(dD)), en)]
627+ let eD = valueOrElse(getInteger(this, aw(y, toString(dH))), 0)
628+ let eA = valueOrElse(getInteger(this, aw(w, toString(eD))), 0)
629+ let eB = valueOrElse(getInteger(this, aw(x, toString(eD))), ey)
630+ let eC = (eA + ((dH - eD) * eB))
631+[IntegerEntry(aw(w, toString(dH)), eC), IntegerEntry(aw(x, toString(dH)), ey)]
613632 }
614633 }
615634 }
616635
617636
618-func et (bN,bO) = [IntegerEntry(E, bN), IntegerEntry(F, bO)]
637+func eE (bP,bQ) = [IntegerEntry(E, bP), IntegerEntry(F, bQ)]
619638
620639
621-func eu (bN,bO,ev,ew,ex,ey,ez) = if (((ey - ez) != ev))
622- then throw(((((("Invalid AMM state data: " + toString(ey)) + " + ") + toString(ez)) + " != ") + toString(ev)))
623- else ((et(bN, bO) ++ [IntegerEntry(G, ev), IntegerEntry(J, ew), IntegerEntry(K, ex), IntegerEntry(H, ey), IntegerEntry(I, ez)]) ++ em(ap(bN, bO)))
640+func eF (bP,bQ,eG,eH,eI,eJ,eK) = if (((eJ - eK) != eG))
641+ then throw(((((("Invalid AMM state data: " + toString(eJ)) + " + ") + toString(eK)) + " != ") + toString(eG)))
642+ else ((eE(bP, bQ) ++ [IntegerEntry(G, eG), IntegerEntry(J, eH), IntegerEntry(K, eI), IntegerEntry(H, eJ), IntegerEntry(I, eK)]) ++ ex(ar(bP, bQ)))
624643
625644
626-func eA (aw) = [DeleteEntry(au(e, aw)), DeleteEntry(au(f, aw)), DeleteEntry(au(g, aw)), DeleteEntry(au(h, aw)), IntegerEntry(au(i, aw), lastBlock.timestamp)]
645+func eL (ay) = [DeleteEntry(aw(e, ay)), DeleteEntry(aw(f, ay)), DeleteEntry(aw(g, ay)), DeleteEntry(aw(h, ay)), IntegerEntry(aw(i, ay), lastBlock.timestamp)]
627646
628647
629-func eB (aw,eC) = {
630- let eD = assetBalance(this, X())
631- if ((eC > eD))
632- then throw(((("Unable to withdraw " + toString(eC)) + " from contract balance ") + toString(eD)))
633- else [ScriptTransfer(aw, eC, X())]
648+func eM (ay,eN) = {
649+ let eO = assetBalance(this, Y())
650+ if ((eN > eO))
651+ then throw(((("Unable to withdraw " + toString(eN)) + " from contract balance ") + toString(eO)))
652+ else [ScriptTransfer(ay, eN, Y())]
634653 }
635654
636655
637-func eE (bq) = if ((0 > bq))
656+func eP (bs) = if ((0 > bs))
638657 then throw("Balance")
639- else [IntegerEntry(d, bq)]
658+ else [IntegerEntry(d, bs)]
640659
641660
642-func eF (bq) = [ScriptTransfer(Z(), bq, X())]
661+func eQ (bs) = [ScriptTransfer(aa(), bs, Y())]
643662
644663
645-@Callable(bq)
646-func pause () = if ((bq.caller != V()))
664+@Callable(bs)
665+func pause () = if ((bs.caller != W()))
647666 then throw("Invalid togglePause params")
648667 else [BooleanEntry(k, true)]
649668
650669
651670
652-@Callable(bq)
653-func unpause () = if ((bq.caller != V()))
671+@Callable(bs)
672+func unpause () = if ((bs.caller != W()))
654673 then throw("Invalid togglePause params")
655674 else [BooleanEntry(k, false)]
656675
657676
658677
659-@Callable(bq)
660-func addLiquidity (bI) = if (if ((bq.caller != V()))
678+@Callable(bs)
679+func addLiquidity (bK) = if (if ((bs.caller != W()))
661680 then true
662- else (0 >= bI))
681+ else (0 >= bK))
663682 then throw("Invalid addLiquidity params")
664683 else {
665- let bN = aW()
666- let bO = aX()
667- let en = ap(bN, bO)
668- let eG = ap(bI, en)
669- let eH = (bN + bI)
670- let eI = (bO + eG)
671- et(eH, eI)
684+ let bP = aY()
685+ let bQ = aZ()
686+ let ey = ar(bP, bQ)
687+ let eR = ar(bK, ey)
688+ let eS = (bP + bK)
689+ let eT = (bQ + eR)
690+ eE(eS, eT)
672691 }
673692
674693
675694
676-@Callable(bq)
677-func removeLiquidity (bI) = if (if ((bq.caller != V()))
695+@Callable(bs)
696+func removeLiquidity (bK) = if (if ((bs.caller != W()))
678697 then true
679- else (0 >= bI))
698+ else (0 >= bK))
680699 then throw("Invalid removeLiquidity params")
681700 else {
682- let bN = aW()
683- let bO = aX()
684- let en = ap(bN, bO)
685- let eJ = ap(bI, en)
686- let eH = (bN - bI)
687- let eI = (bO - eJ)
688- et(eH, eI)
701+ let bP = aY()
702+ let bQ = aZ()
703+ let ey = ar(bP, bQ)
704+ let eU = ar(bK, ey)
705+ let eS = (bP - bK)
706+ let eT = (bQ - eU)
707+ eE(eS, eT)
689708 }
690709
691710
692711
693-@Callable(bq)
694-func changeSettings (dT,dU,dV,dW,dX,dY,dZ,ea,eb) = if ((bq.caller != V()))
712+@Callable(bs)
713+func changeSettings (ee,ef,eg,eh,ei,ej,ek,el,em) = if ((bs.caller != W()))
695714 then throw("Invalid changeSettings params")
696- else dS(dT, dU, dV, dW, dX, dY, dZ, ea, eb)
715+ else ed(ee, ef, eg, eh, ei, ej, ek, el, em)
697716
698717
699718
700-@Callable(bq)
701-func initialize (bN,bO,dW,dT,dU,dV,dX,eK,eL,eM,dY,dZ,ea,eb) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bN))
719+@Callable(bs)
720+func initialize (bP,bQ,eh,ee,ef,eg,ei,eV,eW,eX,ej,ek,el,em) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bP))
702721 then true
703- else (0 >= bO))
722+ else (0 >= bQ))
704723 then true
705- else (0 >= dW))
724+ else (0 >= eh))
706725 then true
707- else (0 >= dT))
726+ else (0 >= ee))
708727 then true
709- else (0 >= dU))
728+ else (0 >= ef))
710729 then true
711- else (0 >= dV))
730+ else (0 >= eg))
712731 then true
713- else (0 >= dX))
732+ else (0 >= ei))
714733 then true
715- else (0 >= dY))
734+ else (0 >= ej))
716735 then true
717- else (0 >= dZ))
736+ else (0 >= ek))
718737 then true
719- else (0 >= ea))
738+ else (0 >= el))
720739 then true
721- else (0 >= eb))
740+ else (0 >= em))
722741 then true
723- else bE())
742+ else bG())
724743 then throw("Invalid initialize parameters")
725- else ((((eu(bN, bO, 0, 0, 0, 0, 0) ++ dS(dT, dU, dV, dW, dX, dY, dZ, ea, eb)) ++ ec((lastBlock.timestamp + dW), 0, 0, 0, 0)) ++ eE(0)) ++ [BooleanEntry(j, true), StringEntry(c, eK), StringEntry(a, eL), StringEntry(L, eM)])
744+ else ((((eF(bP, bQ, 0, 0, 0, 0, 0) ++ ed(ee, ef, eg, eh, ei, ej, ek, el, em)) ++ en((lastBlock.timestamp + eh), 0, 0, 0, 0)) ++ eP(0)) ++ [BooleanEntry(j, true), StringEntry(c, eV), StringEntry(a, eW), StringEntry(L, eX)])
726745
727746
728747
729-@Callable(bq)
730-func setInitMarginRatio (dT) = if (if ((0 >= dT))
748+@Callable(bs)
749+func setInitMarginRatio (ee) = if (if ((0 >= ee))
731750 then true
732- else !(bE()))
751+ else !(bG()))
733752 then throw("Invalid setInitMarginRatio parameters")
734- else dS(dT, bf(), bg(), bc(), aU(), bi(), bj(), bh(), bk())
753+ else ed(ee, bh(), bi(), be(), aW(), bk(), bl(), bj(), bm())
735754
736755
737756
738-@Callable(bq)
739-func decreasePosition (eC,eN,eO) = if (if (if (if (if ((0 >= eC))
757+@Callable(bs)
758+func decreasePosition (eN,eY,eZ) = if (if (if (if (if ((0 >= eN))
740759 then true
741- else !(bE()))
760+ else !(bG()))
742761 then true
743- else !(br(ap(ai, eN), aV(), true)))
762+ else !(bt(ar(ak, eY), aX(), true)))
744763 then true
745- else !(bD(toString(bq.caller))))
764+ else !(bF(toString(bs.caller))))
746765 then true
747- else bF())
766+ else bH())
748767 then throw("Invalid decreasePosition parameters")
749768 else {
750- let eP = by(toString(bq.caller))
751- let eQ = eP._1
752- let eR = eP._2
753- let eS = eP._3
754- let eT = eP._4
755- let eU = if ((eQ > 0))
756- then ae
757- else ad
758- let eV = (eU == ad)
759- let eW = ar(eC, eN)
760- let eX = cU(toString(bq.caller), al)
761- let eY = eX._1
762- let cZ = eX._2
763- let eZ = if ((eY > eW))
769+ let fa = bA(toString(bs.caller))
770+ let fb = fa._1
771+ let fc = fa._2
772+ let fd = fa._3
773+ let fe = fa._4
774+ let ff = if ((fb > 0))
775+ then ag
776+ else af
777+ let fg = (ff == af)
778+ let fh = at(eN, eY)
779+ let fi = cZ(toString(bs.caller), an)
780+ let fj = fi._1
781+ let cY = fi._2
782+ let fk = if ((fj > fh))
764783 then {
765- let fa = bM(eV, eW)
766- let dp = fa._1
767- let bP = fa._2
768- let bQ = fa._3
769- let dx = fa._4
770- let dy = fa._5
771- let fb = as(dp)
772- if (if ((eO != 0))
773- then (eO > fb)
784+ let fl = bO(fg, fh)
785+ let dt = fl._1
786+ let bR = fl._2
787+ let bS = fl._3
788+ let dB = fl._4
789+ let dC = fl._5
790+ let fm = au(dt)
791+ if (if ((eZ != 0))
792+ then (eZ > fm)
774793 else false)
775- then throw(((("Too little base asset exchanged, got " + toString(fb)) + " expected ") + toString(eO)))
794+ then throw(((("Too little base asset exchanged, got " + toString(fm)) + " expected ") + toString(eZ)))
776795 else {
777- let du = ap(ar(cZ, fb), as(eQ))
778- let fc = cd(eQ, eR, eT, du)
779- let cm = fc._1
780- let cn = fc._2
781- let ci = fc._3
782- let dq = eW
783- let fd = (cZ - du)
784- let fe = if ((eQ > 0))
785- then ((eY - dq) - fd)
786- else ((fd + eY) - dq)
787- let ff = (eQ + dp)
788- $Tuple11(ff, cm, as(fe), bw(ff), bQ, bP, dx, dy, (ba() - eW), (bo() - (if ((ff > 0))
789- then as(dp)
790- else 0)), (bn() - (if ((0 > ff))
791- then as(dp)
796+ let dy = ar(at(cY, fm), au(fb))
797+ let fn = cf(fb, fc, fe, dy)
798+ let co = fn._1
799+ let cp = fn._2
800+ let ck = fn._3
801+ let du = fh
802+ let fo = (cY - dy)
803+ let fp = if ((fb > 0))
804+ then ((fj - du) - fo)
805+ else ((fo + fj) - du)
806+ let fq = (fb + dt)
807+ $Tuple11(fq, co, au(fp), by(fq), bS, bR, dB, dC, (bc() - fh), (bq() - (if ((fq > 0))
808+ then au(dt)
809+ else 0)), (bp() - (if ((0 > fq))
810+ then au(dt)
792811 else 0)))
793812 }
794813 }
795814 else throw("Close position first")
796- let ff = eZ._1
797- let fg = eZ._2
798- let fh = eZ._3
799- let fi = eZ._4
800- let bQ = eZ._5
801- let bP = eZ._6
802- let dx = eZ._7
803- let dy = eZ._8
804- let dB = eZ._9
805- let dz = eZ._10
806- let dA = eZ._11
807- let fj = invoke(ab(), "notifyNotional", [toString(bq.caller), fh], nil)
808- if ((fj == fj))
809- then (ei(toString(bq.caller), ff, fg, fh, fi) ++ eu(bP, bQ, dx, dy, dB, dz, dA))
815+ let fq = fk._1
816+ let fr = fk._2
817+ let fs = fk._3
818+ let ft = fk._4
819+ let bS = fk._5
820+ let bR = fk._6
821+ let dB = fk._7
822+ let dC = fk._8
823+ let dF = fk._9
824+ let dD = fk._10
825+ let dE = fk._11
826+ let fu = invoke(ac(), "notifyNotional", [toString(bs.caller), fs], nil)
827+ if ((fu == fu))
828+ then (et(toString(bs.caller), fq, fr, fs, ft) ++ eF(bR, bS, dB, dC, dF, dD, dE))
810829 else throw("Strict value is not equal to itself.")
811830 }
812831
813832
814833
815-@Callable(bq)
816-func increasePosition (eU,eN,eO) = {
817- let fk = bq.payments[0].amount
818- if (if (if (if (if (if (if ((eU != ad))
819- then (eU != ae)
834+@Callable(bs)
835+func increasePosition (ff,eY,eZ,fv) = {
836+ let fw = bs.payments[0].amount
837+ if (if (if (if (if (if (if ((ff != af))
838+ then (ff != ag)
820839 else false)
821840 then true
822- else (0 >= fk))
841+ else (0 >= fw))
823842 then true
824- else !(bE()))
843+ else !(bG()))
825844 then true
826- else (bq.payments[0].assetId != X()))
845+ else (bs.payments[0].assetId != Y()))
827846 then true
828- else !(br(ap(ai, eN), aV(), true)))
847+ else !(bt(ar(ak, eY), aX(), true)))
829848 then true
830- else bF())
849+ else bH())
831850 then throw("Invalid increasePosition parameters")
832851 else {
833- let fl = ar(fk, aU())
834- let eC = (fk - fl)
835- let fm = by(toString(bq.caller))
836- let eQ = fm._1
837- let eR = fm._2
838- let eS = fm._3
839- let eT = fm._4
840- let fn = (eQ == 0)
841- let fo = if ((eQ > 0))
842- then (eU == ad)
843- else (eU == ae)
844- let fp = if (!(fn))
845- then fo
846- else false
847- let eV = (eU == ad)
848- let fq = if (if (fn)
849- then true
850- else fp)
852+ let bB = toString(bs.caller)
853+ let fx = at(fw, aW())
854+ let fy = invoke(ae(), "acceptPaymentWithLink", [bB, fv], [AttachedPayment(Y(), fx)])
855+ if ((fy == fy))
851856 then {
852- let eW = ar(eC, eN)
853- let fr = bM(eV, eW)
854- let bS = fr._1
855- let bP = fr._2
856- let bQ = fr._3
857- let dx = fr._4
858- let dy = fr._5
859- if (if ((eO != 0))
860- then (eO > as(bS))
861- else false)
862- then throw(((("Limit error: " + toString(as(bS))) + " < ") + toString(eO)))
857+ let fz = {
858+ let bD = fy
859+ if ($isInstanceOf(bD, "Int"))
860+ then {
861+ let fA = bD
862+ fA
863+ }
864+ else throw("Invalid referrerFee")
865+ }
866+ let eN = (fw - fx)
867+ let fB = (fx - fz)
868+ let fC = bA(bB)
869+ let fb = fC._1
870+ let fc = fC._2
871+ let fd = fC._3
872+ let fe = fC._4
873+ let fD = (fb == 0)
874+ let fE = if ((fb > 0))
875+ then (ff == af)
876+ else (ff == ag)
877+ let fF = if (!(fD))
878+ then fE
879+ else false
880+ let fg = (ff == af)
881+ let fG = if (if (fD)
882+ then true
883+ else fF)
884+ then {
885+ let fh = at(eN, eY)
886+ let fH = bO(fg, fh)
887+ let bU = fH._1
888+ let bR = fH._2
889+ let bS = fH._3
890+ let dB = fH._4
891+ let dC = fH._5
892+ if (if ((eZ != 0))
893+ then (eZ > au(bU))
894+ else false)
895+ then throw(((("Limit error: " + toString(au(bU))) + " < ") + toString(eZ)))
896+ else {
897+ let fq = (fb + bU)
898+ let fI = ar(fh, eY)
899+ let fJ = cf(fb, fc, fe, fI)
900+ let co = fJ._1
901+ let cT = fJ._2
902+ let cU = fJ._3
903+ if (!(cE(bR, bS)))
904+ then throw("Over max spread limit")
905+ else $Tuple11(fq, co, (fd + fh), by(fq), bS, bR, dB, dC, (bc() + fh), (bq() + (if ((fq > 0))
906+ then au(bU)
907+ else 0)), (bp() + (if ((0 > fq))
908+ then au(bU)
909+ else 0)))
910+ }
911+ }
863912 else {
864- let ff = (eQ + bS)
865- let fs = ap(eW, eN)
866- let ft = cd(eQ, eR, eT, fs)
867- let cm = ft._1
868- let cR = ft._2
869- let cS = ft._3
870- if (!(cC(bP, bQ)))
871- then throw("Over max spread limit")
872- else $Tuple11(ff, cm, (eS + eW), bw(ff), bQ, bP, dx, dy, (ba() + eW), (bo() + (if ((ff > 0))
873- then as(bS)
874- else 0)), (bn() + (if ((0 > ff))
875- then as(bS)
876- else 0)))
913+ let fh = at(eN, eY)
914+ let fK = cZ(toString(bs.caller), an)
915+ let fj = fK._1
916+ let cY = fK._2
917+ if ((fj > fh))
918+ then throw("Use decreasePosition to decrease position size")
919+ else throw("Close position first")
877920 }
878- }
879- else {
880- let eW = ar(eC, eN)
881- let fu = cU(toString(bq.caller), al)
882- let eY = fu._1
883- let cZ = fu._2
884- if ((eY > eW))
885- then throw("Use decreasePosition to decrease position size")
886- else throw("Close position first")
887- }
888- let ff = fq._1
889- let fg = fq._2
890- let fh = fq._3
891- let fi = fq._4
892- let bQ = fq._5
893- let bP = fq._6
894- let dx = fq._7
895- let dy = fq._8
896- let dB = fq._9
897- let dz = fq._10
898- let dA = fq._11
899- let fv = (fl / 2)
900- let fw = (fl - fv)
901- let fx = invoke(Y(), "lockNeutrinoSP", [toString(Z()), ak], [AttachedPayment(X(), eC)])
902- if ((fx == fx))
903- then {
904- let fy = invoke(aa(), "deposit", nil, [AttachedPayment(X(), fw)])
905- if ((fy == fy))
921+ let fq = fG._1
922+ let fr = fG._2
923+ let fs = fG._3
924+ let ft = fG._4
925+ let bS = fG._5
926+ let bR = fG._6
927+ let dB = fG._7
928+ let dC = fG._8
929+ let dF = fG._9
930+ let dD = fG._10
931+ let dE = fG._11
932+ let fL = (fB / 2)
933+ let fM = (fB - fL)
934+ let fN = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eN)])
935+ if ((fN == fN))
906936 then {
907- let fz = invoke(ab(), "notifyFees", [toString(bq.caller), fl], nil)
908- if ((fz == fz))
937+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fM)])
938+ if ((fO == fO))
909939 then {
910- let fj = invoke(ab(), "notifyNotional", [toString(bq.caller), fh], nil)
911- if ((fj == fj))
912- then (((ei(toString(bq.caller), ff, fg, fh, fi) ++ eu(bP, bQ, dx, dy, dB, dz, dA)) ++ eF(fv)) ++ eE((aT() + eC)))
940+ let fP = invoke(ac(), "notifyFees", [bB, fB], nil)
941+ if ((fP == fP))
942+ then {
943+ let fu = invoke(ac(), "notifyNotional", [bB, fs], nil)
944+ if ((fu == fu))
945+ then (((et(bB, fq, fr, fs, ft) ++ eF(bR, bS, dB, dC, dF, dD, dE)) ++ eQ(fL)) ++ eP((aV() + eN)))
946+ else throw("Strict value is not equal to itself.")
947+ }
913948 else throw("Strict value is not equal to itself.")
914949 }
915950 else throw("Strict value is not equal to itself.")
916951 }
917952 else throw("Strict value is not equal to itself.")
918953 }
919954 else throw("Strict value is not equal to itself.")
920955 }
921956 }
922957
923958
924959
925-@Callable(bq)
960+@Callable(bs)
926961 func addMargin () = {
927- let fk = bq.payments[0].amount
928- if (if (if (if ((bq.payments[0].assetId != X()))
962+ let fw = bs.payments[0].amount
963+ if (if (if (if ((bs.payments[0].assetId != Y()))
929964 then true
930- else !(bD(toString(bq.caller))))
965+ else !(bF(toString(bs.caller))))
931966 then true
932- else !(bE()))
967+ else !(bG()))
933968 then true
934- else bF())
969+ else bH())
935970 then throw("Invalid addMargin parameters")
936971 else {
937- let fl = ar(fk, aU())
938- let eC = (fk - fl)
939- let fA = by(toString(bq.caller))
940- let eQ = fA._1
941- let eR = fA._2
942- let eS = fA._3
943- let eT = fA._4
944- let fv = (fl / 2)
945- let fw = (fl - fv)
946- let fx = invoke(Y(), "lockNeutrinoSP", [toString(Z()), ak], [AttachedPayment(X(), eC)])
947- if ((fx == fx))
972+ let bB = toString(bs.caller)
973+ let fx = at(fw, aW())
974+ let fy = invoke(ae(), "acceptPayment", [bB], [AttachedPayment(Y(), fx)])
975+ if ((fy == fy))
948976 then {
949- let fy = invoke(aa(), "deposit", nil, [AttachedPayment(X(), fw)])
950- if ((fy == fy))
977+ let fz = {
978+ let bD = fy
979+ if ($isInstanceOf(bD, "Int"))
980+ then {
981+ let fA = bD
982+ fA
983+ }
984+ else throw("Invalid referrerFee")
985+ }
986+ let fB = (fx - fz)
987+ let eN = (fw - fx)
988+ let fQ = bA(bB)
989+ let fb = fQ._1
990+ let fc = fQ._2
991+ let fd = fQ._3
992+ let fe = fQ._4
993+ let fL = (fB / 2)
994+ let fM = (fB - fL)
995+ let fN = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eN)])
996+ if ((fN == fN))
951997 then {
952- let fz = invoke(ab(), "notifyFees", [toString(bq.caller), fl], nil)
953- if ((fz == fz))
954- then ((ei(toString(bq.caller), eQ, (eR + eC), eS, eT) ++ eF(fv)) ++ eE((aT() + eC)))
998+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fM)])
999+ if ((fO == fO))
1000+ then {
1001+ let fP = invoke(ac(), "notifyFees", [bB, fB], nil)
1002+ if ((fP == fP))
1003+ then ((et(bB, fb, (fc + eN), fd, fe) ++ eQ(fL)) ++ eP((aV() + eN)))
1004+ else throw("Strict value is not equal to itself.")
1005+ }
9551006 else throw("Strict value is not equal to itself.")
9561007 }
9571008 else throw("Strict value is not equal to itself.")
9581009 }
9591010 else throw("Strict value is not equal to itself.")
9601011 }
9611012 }
9621013
9631014
9641015
965-@Callable(bq)
966-func removeMargin (eC) = if (if (if (if ((0 >= eC))
1016+@Callable(bs)
1017+func removeMargin (eN) = if (if (if (if ((0 >= eN))
9671018 then true
968- else !(bD(toString(bq.caller))))
1019+ else !(bF(toString(bs.caller))))
9691020 then true
970- else !(bE()))
1021+ else !(bG()))
9711022 then true
972- else bF())
1023+ else bH())
9731024 then throw("Invalid removeMargin parameters")
9741025 else {
975- let fB = by(toString(bq.caller))
976- let eQ = fB._1
977- let eR = fB._2
978- let eS = fB._3
979- let eT = fB._4
980- let fC = -(eC)
981- let fD = cd(eQ, eR, eT, fC)
982- let cm = fD._1
983- let cn = fD._2
984- if ((cn != 0))
1026+ let fR = bA(toString(bs.caller))
1027+ let fb = fR._1
1028+ let fc = fR._2
1029+ let fd = fR._3
1030+ let fe = fR._4
1031+ let fS = -(eN)
1032+ let fT = cf(fb, fc, fe, fS)
1033+ let co = fT._1
1034+ let cp = fT._2
1035+ if ((cp != 0))
9851036 then throw("Invalid removed margin amount")
9861037 else {
987- let fE = da(cm, cn, eS)
988- if (!(br(fE, aV(), true)))
989- then throw(((("Too much margin removed: " + toString(fE)) + " < ") + toString(aV())))
1038+ let fU = de(co, cp, fd)
1039+ if (!(bt(fU, aX(), true)))
1040+ then throw(((("Too much margin removed: " + toString(fU)) + " < ") + toString(aX())))
9901041 else {
991- let fF = invoke(Y(), "unlockNeutrino", [eC, toBase58String(X())], nil)
992- if ((fF == fF))
993- then ((ei(toString(bq.caller), eQ, cm, eS, bw(eQ)) ++ eB(bq.caller, eC)) ++ eE((aT() - eC)))
1042+ let fV = invoke(Z(), "unlockNeutrino", [eN, toBase58String(Y())], nil)
1043+ if ((fV == fV))
1044+ then ((et(toString(bs.caller), fb, co, fd, by(fb)) ++ eM(bs.caller, eN)) ++ eP((aV() - eN)))
9941045 else throw("Strict value is not equal to itself.")
9951046 }
9961047 }
9971048 }
9981049
9991050
10001051
1001-@Callable(bq)
1052+@Callable(bs)
10021053 func closePosition () = {
1003- let fG = bp(bq)
1004- let fH = valueOrErrorMessage(addressFromString(fG), "Invalid caller")
1005- if (if (if (!(bD(fG)))
1054+ let fW = br(bs)
1055+ let fX = valueOrErrorMessage(addressFromString(fW), "Invalid caller")
1056+ if (if (if (!(bF(fW)))
10061057 then true
1007- else !(bE()))
1058+ else !(bG()))
10081059 then true
1009- else bF())
1060+ else bH())
10101061 then throw("Invalid closePosition parameters")
10111062 else {
1012- let fI = dr(fG, true)
1013- let cR = fI._1
1014- let fJ = fI._2
1015- let du = fI._3
1016- let dv = fI._4
1017- let bP = fI._5
1018- let bQ = fI._6
1019- let dx = fI._7
1020- let dy = fI._8
1021- let dB = fI._9
1022- let cS = fI._10
1023- let dz = fI._11
1024- let dA = fI._12
1025- if ((fJ > 0))
1063+ let fY = dv(fW, true)
1064+ let cT = fY._1
1065+ let fZ = fY._2
1066+ let dy = fY._3
1067+ let dz = fY._4
1068+ let bR = fY._5
1069+ let bS = fY._6
1070+ let dB = fY._7
1071+ let dC = fY._8
1072+ let dF = fY._9
1073+ let cU = fY._10
1074+ let dD = fY._11
1075+ let dE = fY._12
1076+ if ((fZ > 0))
10261077 then throw("Unable to close position with bad debt")
10271078 else {
1028- let fK = as(dv)
1029- let fL = (aT() - fK)
1030- let fM = if ((0 > fL))
1031- then $Tuple2(0, as(fL))
1032- else $Tuple2(fL, 0)
1033- let fN = fM._1
1034- let fO = fM._2
1035- let fP = if ((fO > 0))
1079+ let ga = au(dz)
1080+ let gb = (aV() - ga)
1081+ let gc = if ((0 > gb))
1082+ then $Tuple2(0, au(gb))
1083+ else $Tuple2(gb, 0)
1084+ let gd = gc._1
1085+ let ge = gc._2
1086+ let fA = if ((ge > 0))
10361087 then {
1037- let fQ = invoke(aa(), "withdraw", [fO], nil)
1038- if ((fQ == fQ))
1088+ let gf = invoke(ab(), "withdraw", [ge], nil)
1089+ if ((gf == gf))
10391090 then nil
10401091 else throw("Strict value is not equal to itself.")
10411092 }
10421093 else nil
1043- if ((fP == fP))
1094+ if ((fA == fA))
10441095 then {
1045- let fF = invoke(Y(), "unlockNeutrino", [(fK - fO), toBase58String(X())], nil)
1046- if ((fF == fF))
1096+ let fV = invoke(Z(), "unlockNeutrino", [(ga - ge), toBase58String(Y())], nil)
1097+ if ((fV == fV))
10471098 then {
1048- let fj = invoke(ab(), "notifyNotional", [fG, 0], nil)
1049- if ((fj == fj))
1050- then (((eA(fG) ++ eu(bP, bQ, dx, dy, dB, dz, dA)) ++ eB(fH, fK)) ++ eE(fN))
1099+ let fu = invoke(ac(), "notifyNotional", [fW, 0], nil)
1100+ if ((fu == fu))
1101+ then (((eL(fW) ++ eF(bR, bS, dB, dC, dF, dD, dE)) ++ eM(fX, ga)) ++ eP(gd))
10511102 else throw("Strict value is not equal to itself.")
10521103 }
10531104 else throw("Strict value is not equal to itself.")
10541105 }
10551106 else throw("Strict value is not equal to itself.")
10561107 }
10571108 }
10581109 }
10591110
10601111
10611112
1062-@Callable(bq)
1063-func liquidate (bz) = {
1064- let fR = de(bz, al)
1065- let fE = if (cI())
1113+@Callable(bs)
1114+func liquidate (bB) = {
1115+ let gg = di(bB, an)
1116+ let fU = if (cK())
10661117 then {
1067- let fS = de(bz, am)
1068- at(fR, fS)
1118+ let gh = di(bB, ao)
1119+ av(gg, gh)
10691120 }
1070- else fR
1071- if (if (if (if (!(br(fE, bf(), false)))
1121+ else gg
1122+ if (if (if (if (!(bt(fU, bh(), false)))
10721123 then true
1073- else !(bD(bz)))
1124+ else !(bF(bB)))
10741125 then true
1075- else !(bE()))
1126+ else !(bG()))
10761127 then true
1077- else bF())
1128+ else bH())
10781129 then throw("Unable to liquidate")
1079- else if (if (if ((fR > bg()))
1080- then (bh() > 0)
1130+ else if (if (if ((gg > bi()))
1131+ then (bj() > 0)
10811132 else false)
1082- then (ai > bh())
1133+ then (ak > bj())
10831134 else false)
10841135 then {
1085- let fT = by(bz)
1086- let eQ = fT._1
1087- let eR = fT._2
1088- let eS = fT._3
1089- let eT = fT._4
1090- let eU = if ((eQ > 0))
1091- then ae
1092- else ad
1093- let eV = (eU == ad)
1094- let dq = dk(bz, eQ)
1095- let fU = cU(bz, al)
1096- let eY = fU._1
1097- let cZ = fU._2
1098- let fV = bM(eV, dq)
1099- let dp = fV._1
1100- let bP = fV._2
1101- let bQ = fV._3
1102- let dx = fV._4
1103- let dy = fV._5
1104- let du = ap(ar(cZ, as(dp)), as(eQ))
1105- let fW = cd(eQ, eR, eT, du)
1106- let cm = fW._1
1107- let cn = fW._2
1108- let ci = fW._3
1109- let fd = (cZ - du)
1110- let fe = if ((eQ > 0))
1111- then ((eY - dq) - fd)
1112- else ((fd + eY) - dq)
1113- let fX = ar(dq, bg())
1114- let fY = (fX / 2)
1115- let fw = (fX - fY)
1116- let fZ = (cm - fX)
1117- let ff = (eQ + dp)
1118- let fh = as(fe)
1119- let ga = bw(ff)
1120- let dB = (ba() - dq)
1121- let fL = (aT() - fX)
1122- let gb = if ((0 > fL))
1123- then $Tuple2(0, as(fL))
1124- else $Tuple2(fL, 0)
1125- let gc = gb._1
1126- let gd = gb._2
1127- let fP = if ((gd > 0))
1136+ let gi = bA(bB)
1137+ let fb = gi._1
1138+ let fc = gi._2
1139+ let fd = gi._3
1140+ let fe = gi._4
1141+ let ff = if ((fb > 0))
1142+ then ag
1143+ else af
1144+ let fg = (ff == af)
1145+ let du = do(bB, fb)
1146+ let gj = cZ(bB, an)
1147+ let fj = gj._1
1148+ let cY = gj._2
1149+ let gk = bO(fg, du)
1150+ let dt = gk._1
1151+ let bR = gk._2
1152+ let bS = gk._3
1153+ let dB = gk._4
1154+ let dC = gk._5
1155+ let dy = ar(at(cY, au(dt)), au(fb))
1156+ let gl = cf(fb, fc, fe, dy)
1157+ let co = gl._1
1158+ let cp = gl._2
1159+ let ck = gl._3
1160+ let fo = (cY - dy)
1161+ let fp = if ((fb > 0))
1162+ then ((fj - du) - fo)
1163+ else ((fo + fj) - du)
1164+ let gm = at(du, bi())
1165+ let gn = (gm / 2)
1166+ let fM = (gm - gn)
1167+ let go = (co - gm)
1168+ let fq = (fb + dt)
1169+ let fs = au(fp)
1170+ let gp = by(fq)
1171+ let dF = (bc() - du)
1172+ let gb = (aV() - gm)
1173+ let gq = if ((0 > gb))
1174+ then $Tuple2(0, au(gb))
1175+ else $Tuple2(gb, 0)
1176+ let gr = gq._1
1177+ let gs = gq._2
1178+ let fA = if ((gs > 0))
11281179 then {
1129- let fQ = invoke(aa(), "withdraw", [gd], nil)
1130- if ((fQ == fQ))
1180+ let gf = invoke(ab(), "withdraw", [gs], nil)
1181+ if ((gf == gf))
11311182 then nil
11321183 else throw("Strict value is not equal to itself.")
11331184 }
11341185 else nil
1135- if ((fP == fP))
1186+ if ((fA == fA))
11361187 then {
1137- let fF = invoke(Y(), "unlockNeutrino", [(fX - gd), toBase58String(X())], nil)
1138- if ((fF == fF))
1188+ let fV = invoke(Z(), "unlockNeutrino", [(gm - gs), toBase58String(Y())], nil)
1189+ if ((fV == fV))
11391190 then {
1140- let fy = invoke(aa(), "deposit", nil, [AttachedPayment(X(), fw)])
1141- if ((fy == fy))
1191+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fM)])
1192+ if ((fO == fO))
11421193 then {
1143- let fj = invoke(ab(), "notifyNotional", [bz, fh], nil)
1144- if ((fj == fj))
1145- then (((ei(bz, ff, fZ, fh, ga) ++ eu(bP, bQ, dx, dy, dB, (bo() - (if ((ff > 0))
1146- then as(dp)
1147- else 0)), (bn() - (if ((0 > ff))
1148- then as(dp)
1149- else 0)))) ++ eB(bq.caller, fY)) ++ eE(gc))
1194+ let fu = invoke(ac(), "notifyNotional", [bB, fs], nil)
1195+ if ((fu == fu))
1196+ then (((et(bB, fq, go, fs, gp) ++ eF(bR, bS, dB, dC, dF, (bq() - (if ((fq > 0))
1197+ then au(dt)
1198+ else 0)), (bp() - (if ((0 > fq))
1199+ then au(dt)
1200+ else 0)))) ++ eM(bs.caller, gn)) ++ eP(gr))
11501201 else throw("Strict value is not equal to itself.")
11511202 }
11521203 else throw("Strict value is not equal to itself.")
11531204 }
11541205 else throw("Strict value is not equal to itself.")
11551206 }
11561207 else throw("Strict value is not equal to itself.")
11571208 }
11581209 else {
1159- let ge = dr(bz, false)
1160- let cR = ge._1
1161- let cn = ge._2
1162- let cS = ge._3
1163- let cT = ge._4
1164- let bP = ge._5
1165- let bQ = ge._6
1166- let dx = ge._7
1167- let dy = ge._8
1168- let dB = ge._9
1169- let dq = ge._10
1170- let dz = ge._11
1171- let dA = ge._12
1172- let fX = ar(dq, bg())
1173- let fY = (fX / 2)
1174- let fw = (fX - fY)
1175- let fL = (aT() - fX)
1176- let gf = if ((0 > fL))
1177- then $Tuple2(0, as(fL))
1178- else $Tuple2(fL, 0)
1179- let gc = gf._1
1180- let gd = gf._2
1181- let fP = if ((gd > 0))
1210+ let gt = dv(bB, false)
1211+ let cT = gt._1
1212+ let cp = gt._2
1213+ let cU = gt._3
1214+ let cV = gt._4
1215+ let bR = gt._5
1216+ let bS = gt._6
1217+ let dB = gt._7
1218+ let dC = gt._8
1219+ let dF = gt._9
1220+ let du = gt._10
1221+ let dD = gt._11
1222+ let dE = gt._12
1223+ let gm = at(du, bi())
1224+ let gn = (gm / 2)
1225+ let fM = (gm - gn)
1226+ let gb = (aV() - gm)
1227+ let gu = if ((0 > gb))
1228+ then $Tuple2(0, au(gb))
1229+ else $Tuple2(gb, 0)
1230+ let gr = gu._1
1231+ let gs = gu._2
1232+ let fA = if ((gs > 0))
11821233 then {
1183- let fQ = invoke(aa(), "withdraw", [gd], nil)
1184- if ((fQ == fQ))
1234+ let gf = invoke(ab(), "withdraw", [gs], nil)
1235+ if ((gf == gf))
11851236 then nil
11861237 else throw("Strict value is not equal to itself.")
11871238 }
11881239 else nil
1189- if ((fP == fP))
1240+ if ((fA == fA))
11901241 then {
1191- let fF = invoke(Y(), "unlockNeutrino", [(fX - gd), toBase58String(X())], nil)
1192- if ((fF == fF))
1242+ let fV = invoke(Z(), "unlockNeutrino", [(gm - gs), toBase58String(Y())], nil)
1243+ if ((fV == fV))
11931244 then {
1194- let fy = invoke(aa(), "deposit", nil, [AttachedPayment(X(), fw)])
1195- if ((fy == fy))
1245+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fM)])
1246+ if ((fO == fO))
11961247 then {
1197- let fj = invoke(ab(), "notifyNotional", [bz, 0], nil)
1198- if ((fj == fj))
1199- then (((eA(bz) ++ eu(bP, bQ, dx, dy, dB, dz, dA)) ++ eB(bq.caller, fY)) ++ eE(gc))
1248+ let fu = invoke(ac(), "notifyNotional", [bB, 0], nil)
1249+ if ((fu == fu))
1250+ then (((eL(bB) ++ eF(bR, bS, dB, dC, dF, dD, dE)) ++ eM(bs.caller, gn)) ++ eP(gr))
12001251 else throw("Strict value is not equal to itself.")
12011252 }
12021253 else throw("Strict value is not equal to itself.")
12031254 }
12041255 else throw("Strict value is not equal to itself.")
12051256 }
12061257 else throw("Strict value is not equal to itself.")
12071258 }
12081259 }
12091260
12101261
12111262
1212-@Callable(bq)
1263+@Callable(bs)
12131264 func payFunding () = {
1214- let gg = bb()
1215- if (if (if ((gg > lastBlock.timestamp))
1265+ let gv = bd()
1266+ if (if (if ((gv > lastBlock.timestamp))
12161267 then true
1217- else !(bE()))
1268+ else !(bG()))
12181269 then true
1219- else bF())
1220- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(gg)))
1270+ else bH())
1271+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(gv)))
12211272 else {
1222- let gh = cx()
1223- let gi = dC()
1224- let gj = (gi - gh)
1225- let gk = if (if ((bn() == 0))
1273+ let gw = cz()
1274+ let gx = dG()
1275+ let gy = (gx - gw)
1276+ let gz = if (if ((bp() == 0))
12261277 then true
1227- else (bo() == 0))
1278+ else (bq() == 0))
12281279 then $Tuple2(0, 0)
1229- else if ((0 > gj))
1280+ else if ((0 > gy))
12301281 then {
1231- let gl = ap(ar(gj, bd()), aj)
1232- let gm = ap(ar(gl, bn()), bo())
1233- $Tuple2(gl, gm)
1282+ let gA = ar(at(gy, bf()), al)
1283+ let gB = ar(at(gA, bp()), bq())
1284+ $Tuple2(gA, gB)
12341285 }
12351286 else {
1236- let gm = ap(ar(gj, bd()), aj)
1237- let gl = ap(ar(gm, bo()), bn())
1238- $Tuple2(gl, gm)
1287+ let gB = ar(at(gy, bf()), al)
1288+ let gA = ar(at(gB, bq()), bp())
1289+ $Tuple2(gA, gB)
12391290 }
1240- let gl = gk._1
1241- let gm = gk._2
1242- ec((gg + be()), (bl() + gm), (bm() + gl), ap(gm, gh), ap(gl, gh))
1291+ let gA = gz._1
1292+ let gB = gz._2
1293+ en((gv + bg()), (bn() + gB), (bo() + gA), ar(gB, gw), ar(gA, gw))
12431294 }
12441295 }
12451296
12461297
12471298
1248-@Callable(bq)
1249-func v_get (bz) = {
1250- let gn = dr(bz, false)
1251- let cR = gn._1
1252- let cS = gn._2
1253- let cT = gn._3
1254- let go = gn._4
1255- throw((((an(cS) + an(cT)) + an(go)) + an(dj(bz))))
1299+@Callable(bs)
1300+func forceMoveAsset (bB,eN) = if (if ((addressFromPublicKey(X()) != bs.caller))
1301+ then true
1302+ else (0 > eN))
1303+ then throw("Invalid forceMoveAsset parameters")
1304+ else {
1305+ let fV = invoke(Z(), "unlockNeutrino", [eN, toBase58String(Y())], nil)
1306+ if ((fV == fV))
1307+ then (eM(addressFromStringValue(bB), eN) ++ eP((aV() - eN)))
1308+ else throw("Strict value is not equal to itself.")
1309+ }
1310+
1311+
1312+
1313+@Callable(bs)
1314+func adjustPeg (dX) = if (if ((addressFromPublicKey(X()) != bs.caller))
1315+ then true
1316+ else (0 > dX))
1317+ then throw("Invalid adjustPeg parameters")
1318+ else {
1319+ let gC = dW(dX)
1320+ let eb = gC._1
1321+ let gD = gC._2
1322+ if ((gD == 0))
1323+ then throw("Nothing to adjust")
1324+ else if ((gD > 0))
1325+ then {
1326+ let gf = invoke(ab(), "withdraw", [gD], nil)
1327+ if ((gf == gf))
1328+ then {
1329+ let fN = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), gD)])
1330+ if ((fN == fN))
1331+ then (eP((aV() + gD)) ++ eE(eb, aZ()))
1332+ else throw("Strict value is not equal to itself.")
1333+ }
1334+ else throw("Strict value is not equal to itself.")
1335+ }
1336+ else {
1337+ let fV = invoke(Z(), "unlockNeutrino", [au(gD), toBase58String(Y())], nil)
1338+ if ((fV == fV))
1339+ then {
1340+ let fO = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), au(gD))])
1341+ if ((fO == fO))
1342+ then (eP((aV() - au(gD))) ++ eE(eb, aZ()))
1343+ else throw("Strict value is not equal to itself.")
1344+ }
1345+ else throw("Strict value is not equal to itself.")
1346+ }
1347+ }
1348+
1349+
1350+
1351+@Callable(bs)
1352+func v_get (bB) = {
1353+ let gE = dv(bB, false)
1354+ let cT = gE._1
1355+ let cU = gE._2
1356+ let cV = gE._3
1357+ let gF = gE._4
1358+ throw((((ap(cU) + ap(cV)) + ap(gF)) + ap(dn(bB))))
12561359 }
12571360
12581361
12591362
1260-@Callable(bq)
1261-func view_calcRemainMarginWithFundingPayment (bz) = {
1262- let gp = by(bz)
1263- let bC = gp._1
1264- let cW = gp._2
1265- let dg = gp._3
1266- let cY = gp._4
1267- let gq = cU(bz, al)
1268- let cO = gq._1
1269- let cZ = gq._2
1270- let gr = cd(bC, cW, cY, cZ)
1271- let cm = gr._1
1272- let cn = gr._2
1273- let ci = gr._3
1274- throw((((((an(cm) + an(ci)) + an(dj(bz))) + an(cZ)) + an(cn)) + an(cO)))
1363+@Callable(bs)
1364+func view_calcRemainMarginWithFundingPayment (bB) = {
1365+ let gG = bA(bB)
1366+ let bE = gG._1
1367+ let db = gG._2
1368+ let dk = gG._3
1369+ let dd = gG._4
1370+ let gH = cZ(bB, an)
1371+ let cQ = gH._1
1372+ let cY = gH._2
1373+ let gI = cf(bE, db, dd, cY)
1374+ let co = gI._1
1375+ let cp = gI._2
1376+ let ck = gI._3
1377+ throw((((((ap(co) + ap(ck)) + ap(dn(bB))) + ap(cY)) + ap(cp)) + ap(cQ)))
12751378 }
12761379
12771380
12781381
1279-@Callable(bq)
1280-func forceMoveAsset (bz,eC) = if (if ((addressFromPublicKey(W()) != bq.caller))
1281- then true
1282- else (0 > eC))
1283- then throw("Invalid forceMoveAsset parameters")
1284- else {
1285- let fF = invoke(Y(), "unlockNeutrino", [eC, toBase58String(X())], nil)
1286- if ((fF == fF))
1287- then (eB(addressFromStringValue(bz), eC) ++ eE((aT() - eC)))
1288- else throw("Strict value is not equal to itself.")
1289- }
1382+@Callable(bs)
1383+func view_getPegAdjustCost (dX) = {
1384+ let ec = dW(dX)
1385+ throw(toString(ec._2))
1386+ }
12901387
12911388
1292-@Verifier(gs)
1293-func gt () = sigVerify(gs.bodyBytes, gs.proofs[0], W())
1389+@Verifier(gJ)
1390+func gK () = sigVerify(gJ.bodyBytes, gJ.proofs[0], X())
12941391

github/deemru/w8io/169f3d6 
414.79 ms