tx · 9Vyfi5f9oSfnL6MaJMhccRtq1JAoR5noz64AddKGmSiL

3N8G95pEaYEhZ4U3m3UrzpEzwBFn5vvXsZH:  -0.04900000 Waves

2022.08.29 22:18 [2206149] smart account 3N8G95pEaYEhZ4U3m3UrzpEzwBFn5vvXsZH > SELF 0.00000000 Waves

{ "type": 13, "id": "9Vyfi5f9oSfnL6MaJMhccRtq1JAoR5noz64AddKGmSiL", "fee": 4900000, "feeAssetId": null, "timestamp": 1661800731187, "version": 2, "chainId": 84, "sender": "3N8G95pEaYEhZ4U3m3UrzpEzwBFn5vvXsZH", "senderPublicKey": "Hj6oyH6As5UWo8fZ1K4hPsEY7nxH3MvhBqDD6axiwjXs", "proofs": [ "gmRbFpPrUpkkdbDRkTEaX1UgGGcydQmJXisx6K8qUoE6RsxEuq2g5wUXV4S6RWf4C3AwEZoXgpnFKtF2m5DZBiT" ], "script": "base64:BgJiCAISABIAEgMKAQESAwoBARILCgkBAQEBAQEBAQESEAoOAQEBAQEBAQgICAEBAQESAwoBARIFCgMBAQESBQoDAQEBEgASAwoBARIAEgMKAQgSABIDCgEIEgMKAQgSBAoCCAF/AAlrX29yYV9rZXkCCWtfb3JhX2tleQAPa19vcmFfYmxvY2tfa2V5Ag9rX29yYV9ibG9ja19rZXkABWtfb3JhAgVrX29yYQAJa19iYWxhbmNlAglrX2JhbGFuY2UADmtfcG9zaXRpb25TaXplAg5rX3Bvc2l0aW9uU2l6ZQAQa19wb3NpdGlvbk1hcmdpbgIQa19wb3NpdGlvbk1hcmdpbgAWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAIWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAAua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgISa19wb3NpdGlvbkZyYWN0aW9uAA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkAAhrX3BhdXNlZAIIa19wYXVzZWQABWtfZmVlAgVrX2ZlZQAPa19mdW5kaW5nUGVyaW9kAg9rX2Z1bmRpbmdQZXJpb2QAEWtfaW5pdE1hcmdpblJhdGlvAhFrX2luaXRNYXJnaW5SYXRpbwAYa19tYWludGVuYW5jZU1hcmdpblJhdGlvAgVrX21tcgAVa19saXF1aWRhdGlvbkZlZVJhdGlvAhVrX2xpcXVpZGF0aW9uRmVlUmF0aW8AGWtfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8CFmtfcGFydExpcXVpZGF0aW9uUmF0aW8ADWtfc3ByZWFkTGltaXQCDWtfc3ByZWFkTGltaXQAEGtfbWF4UHJpY2VJbXBhY3QCEGtfbWF4UHJpY2VJbXBhY3QAEGtfbWF4UHJpY2VTcHJlYWQCEGtfbWF4UHJpY2VTcHJlYWQADWtfbGFzdERhdGFTdHICDWtfbGFzdERhdGFTdHIADmtfbGFzdE1pbnV0ZUlkAg5rX2xhc3RNaW51dGVJZAAda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UCHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlABNrX3R3YXBEYXRhTGFzdFByaWNlAhNrX3R3YXBEYXRhTGFzdFByaWNlABprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAIaa190d2FwRGF0YVByZXZpb3VzTWludXRlSWQAJWtfbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24CG2tfbGF0ZXN0TG9uZ1ByZW1pdW1GcmFjdGlvbgAma19sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24CHGtfbGF0ZXN0U2hvcnRQcmVtaXVtRnJhY3Rpb24AEmtfbmV4dEZ1bmRpbmdCbG9jawIea19uZXh0RnVuZGluZ0Jsb2NrTWluVGltZXN0YW1wABFrX2xvbmdGdW5kaW5nUmF0ZQIRa19sb25nRnVuZGluZ1JhdGUAEmtfc2hvcnRGdW5kaW5nUmF0ZQISa19zaG9ydEZ1bmRpbmdSYXRlABNrX3F1b3RlQXNzZXRSZXNlcnZlAghrX3F0QXN0UgASa19iYXNlQXNzZXRSZXNlcnZlAghrX2JzQXN0UgATa190b3RhbFBvc2l0aW9uU2l6ZQITa190b3RhbFBvc2l0aW9uU2l6ZQAXa190b3RhbExvbmdQb3NpdGlvblNpemUCF2tfdG90YWxMb25nUG9zaXRpb25TaXplABhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUCGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAUa19jdW11bGF0aXZlTm90aW9uYWwCFGtfY3VtdWxhdGl2ZU5vdGlvbmFsABZrX29wZW5JbnRlcmVzdE5vdGlvbmFsAhZrX29wZW5JbnRlcmVzdE5vdGlvbmFsABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIUa19jb29yZGluYXRvckFkZHJlc3MAE2tfaW5zdXJhbmNlX2FkZHJlc3MCE2tfaW5zdXJhbmNlX2FkZHJlc3MAD2tfYWRtaW5fYWRkcmVzcwIPa19hZG1pbl9hZGRyZXNzABJrX2FkbWluX3B1YmxpY19rZXkCEmtfYWRtaW5fcHVibGljX2tleQANa19xdW90ZV9hc3NldAINa19xdW90ZV9hc3NldAAPa19xdW90ZV9zdGFraW5nAg9rX3F1b3RlX3N0YWtpbmcAEWtfc3Rha2luZ19hZGRyZXNzAhFrX3N0YWtpbmdfYWRkcmVzcwAPa19taW5lcl9hZGRyZXNzAg9rX21pbmVyX2FkZHJlc3MBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhNDb29yZGluYXRvciBub3Qgc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwEOYWRtaW5QdWJsaWNLZXkACQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfYWRtaW5fcHVibGljX2tleQEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAERcXVvdGVBc3NldFN0YWtpbmcACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUPa19xdW90ZV9zdGFraW5nAhtRdW90ZSBhc3NldCBzdGFraW5nIG5vdCBzZXQBDnN0YWtpbmdBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEWtfc3Rha2luZ19hZGRyZXNzAhFJbnN1cmFuY2Ugbm90IHNldAEQaW5zdXJhbmNlQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRNrX2luc3VyYW5jZV9hZGRyZXNzAhFJbnN1cmFuY2Ugbm90IHNldAEMbWluZXJBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfbWluZXJfYWRkcmVzcwIRSW5zdXJhbmNlIG5vdCBzZXQACERJUl9MT05HAAEACURJUl9TSE9SVAACAA1UV0FQX0lOVEVSVkFMAA8AD09SQUNMRV9JTlRFUlZBTAAPAAdTRUNPTkRTAOgHAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgAHT05FX0RBWQkAaAIAgKMFBQxERUNJTUFMX1VOSVQACEFMTF9GRUVTAGQAD1BOTF9PUFRJT05fU1BPVAABABFQTkxfT1BUSU9OX09SQUNMRQACAQFzAQJfeAkArAICCQCkAwEFAl94AgEsAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBHZtYXgCAl94Al95AwkAZwIFAl94BQJfeQUCX3gFAl95AQ50b0NvbXBvc2l0ZUtleQIEX2tleQhfYWRkcmVzcwkArAICCQCsAgIFBF9rZXkCAV8FCF9hZGRyZXNzAQlsaXN0VG9TdHIBBV9saXN0CgEFX2pvaW4CC2FjY3VtdWxhdG9yA3ZhbAkArAICCQCsAgIFC2FjY3VtdWxhdG9yBQN2YWwCASwECm5ld0xpc3RTdHIKAAIkbAUFX2xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBV9qb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQEC25ld0xpc3RTdHJVCQCzAgIFCm5ld0xpc3RTdHIAAQQLbmV3TGlzdFN0clIDCQAAAgkArwICBQtuZXdMaXN0U3RyVQABAgEsCQCwAgIFC25ld0xpc3RTdHJVAAEFC25ld0xpc3RTdHJVBQtuZXdMaXN0U3RyUgEJc3RyVG9MaXN0AQRfc3RyCQC1CQIFBF9zdHICASwBC3B1c2hUb1F1ZXVlAwVfbGlzdAhfbWF4U2l6ZQZfdmFsdWUDCQBmAgkAkAMBBQVfbGlzdAUIX21heFNpemUJAM0IAgkA0QgCBQVfbGlzdAAABQZfdmFsdWUJAM0IAgUFX2xpc3QFBl92YWx1ZQEDaW50AQFrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBawkArAICAg1ubyB2YWx1ZSBmb3IgBQFrAQhjYmFsYW5jZQAJAQNpbnQBBQlrX2JhbGFuY2UBA2ZlZQAJAQNpbnQBBQVrX2ZlZQEPaW5pdE1hcmdpblJhdGlvAAkBA2ludAEFEWtfaW5pdE1hcmdpblJhdGlvAQZxdEFzdFIACQEDaW50AQUTa19xdW90ZUFzc2V0UmVzZXJ2ZQEGYnNBc3RSAAkBA2ludAEFEmtfYmFzZUFzc2V0UmVzZXJ2ZQERdG90YWxQb3NpdGlvblNpemUACQEDaW50AQUTa190b3RhbFBvc2l0aW9uU2l6ZQESY3VtdWxhdGl2ZU5vdGlvbmFsAAkBA2ludAEFFGtfY3VtdWxhdGl2ZU5vdGlvbmFsARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAJAQNpbnQBBRZrX29wZW5JbnRlcmVzdE5vdGlvbmFsARluZXh0RnVuZGluZ0Jsb2NrVGltZXN0YW1wAAkBA2ludAEFEmtfbmV4dEZ1bmRpbmdCbG9jawEQZnVuZGluZ1BlcmlvZFJhdwAJAQNpbnQBBQ9rX2Z1bmRpbmdQZXJpb2QBFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAkAaAIJARBmdW5kaW5nUGVyaW9kUmF3AAUMREVDSU1BTF9VTklUARRmdW5kaW5nUGVyaW9kU2Vjb25kcwAJAGgCCQEQZnVuZGluZ1BlcmlvZFJhdwAFB1NFQ09ORFMBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ACQEDaW50AQUYa19tYWludGVuYW5jZU1hcmdpblJhdGlvARNsaXF1aWRhdGlvbkZlZVJhdGlvAAkBA2ludAEFFWtfbGlxdWlkYXRpb25GZWVSYXRpbwEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQEDaW50AQUZa19wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwELc3ByZWFkTGltaXQACQEDaW50AQUNa19zcHJlYWRMaW1pdAEObWF4UHJpY2VJbXBhY3QACQEDaW50AQUQa19tYXhQcmljZUltcGFjdAEObWF4UHJpY2VTcHJlYWQACQEDaW50AQUQa19tYXhQcmljZVNwcmVhZAEjbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEDaW50AQUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAkBA2ludAEFJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBA2ludAEFGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkBA2ludAEFF2tfdG90YWxMb25nUG9zaXRpb25TaXplARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwxfbWFyZ2luUmF0aW8QX2Jhc2VNYXJnaW5SYXRpbxRfbGFyZ2VyVGhhbk9yRXF1YWxUbwQUcmVtYWluaW5nTWFyZ2luUmF0aW8JAGUCBQxfbWFyZ2luUmF0aW8FEF9iYXNlTWFyZ2luUmF0aW8DAwUUX2xhcmdlclRoYW5PckVxdWFsVG8JAGYCAAAFFHJlbWFpbmluZ01hcmdpblJhdGlvBwkAAgECDkludmFsaWQgbWFyZ2luAwMJAQEhAQUUX2xhcmdlclRoYW5PckVxdWFsVG8JAGcCBRRyZW1haW5pbmdNYXJnaW5SYXRpbwAABwkAAgECDkludmFsaWQgbWFyZ2luBgEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgENX3Bvc2l0aW9uU2l6ZQMJAAACBQ1fcG9zaXRpb25TaXplAAAJAAIBAixTaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIF9wb3NpdGlvblNpemUgPT0gMAMJAGYCBQ1fcG9zaXRpb25TaXplAAAJASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAJASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24AAQtnZXRQb3NpdGlvbgEHX3RyYWRlcgQPcG9zaXRpb25TaXplT3B0CQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQdfdHJhZGVyBAckbWF0Y2gwBQ9wb3NpdGlvblNpemVPcHQDCQABAgUHJG1hdGNoMAIDSW50BAxwb3NpdGlvblNpemUFByRtYXRjaDAJAJYKBAUMcG9zaXRpb25TaXplCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQdfdHJhZGVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQdfdHJhZGVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQdfdHJhZGVyCQCWCgQAAAAAAAAAAAETcmVxdWlyZU9wZW5Qb3NpdGlvbgEHX3RyYWRlcgMJAAACCAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgJfMQAACQACAQIQTm8gb3BlbiBwb3NpdGlvbgYBC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwEGcGF1c2VkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQhrX3BhdXNlZAcBDXVwZGF0ZVJlc2VydmUDBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudBBfYmFzZUFzc2V0QW1vdW50AwUGX2lzQWRkBAduZXdCYXNlCQBlAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQDCQBnAgAABQduZXdCYXNlCQACAQIqVHggbGVhZCB0byBiYXNlIGFzc2V0IHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCWCgQJAGQCCQEGcXRBc3RSAAURX3F1b3RlQXNzZXRBbW91bnQFB25ld0Jhc2UJAGQCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50CQBkAgkBEmN1bXVsYXRpdmVOb3Rpb25hbAAFEV9xdW90ZUFzc2V0QW1vdW50BAhuZXdRdW90ZQkAZQIJAQZxdEFzdFIABRFfcXVvdGVBc3NldEFtb3VudAMJAGcCAAAFCG5ld1F1b3RlCQACAQIqVHggbGVhZCB0byBiYXNlIHF1b3RlIHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCWCgQFCG5ld1F1b3RlCQBkAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQJAGUCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50CQBlAgkBEmN1bXVsYXRpdmVOb3Rpb25hbAAFEV9xdW90ZUFzc2V0QW1vdW50AQlzd2FwSW5wdXQCBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudAQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAFrCQEEbXVsZAIFB19xdEFzdFIFB19ic0FzdFIEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIDBQZfaXNBZGQJAGQCBQdfcXRBc3RSBRFfcXVvdGVBc3NldEFtb3VudAkAZQIFB19xdEFzdFIFEV9xdW90ZUFzc2V0QW1vdW50BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIJAQRkaXZkAgUBawUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgQYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzCQEDYWJzAQkAZQIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUHX2JzQXN0UgQVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AwUGX2lzQWRkBRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMJAQEtAQUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzBA0kdDAxMjE3NzEyMzcwCQENdXBkYXRlUmVzZXJ2ZQMFBl9pc0FkZAURX3F1b3RlQXNzZXRBbW91bnQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxMjE3NzEyMzcwAl8xBBZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTIxNzcxMjM3MAJfMgQXdG90YWxQb3NpdGlvblNpemVBZnRlcjEIBQ0kdDAxMjE3NzEyMzcwAl8zBBhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEIBQ0kdDAxMjE3NzEyMzcwAl80BAtwcmljZUJlZm9yZQkBBGRpdmQCBQdfcXRBc3RSBQdfYnNBc3RSBAttYXJrZXRQcmljZQkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzBAlwcmljZURpZmYJAQNhYnMBCQBlAgULcHJpY2VCZWZvcmUFC21hcmtldFByaWNlBAtwcmljZUltcGFjdAkAZQIFDERFQ0lNQUxfVU5JVAkBBGRpdmQCBQtwcmljZUJlZm9yZQkAZAIFC3ByaWNlQmVmb3JlBQlwcmljZURpZmYEE21heFByaWNlSW1wYWN0VmFsdWUJAQ5tYXhQcmljZUltcGFjdAADCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDVByaWNlIGltcGFjdCAJAKQDAQULcHJpY2VJbXBhY3QCFCA+IG1heCBwcmljZSBpbXBhY3QgCQCkAwEFE21heFByaWNlSW1wYWN0VmFsdWUCFSBiZWZvcmUgcXVvdGUgYXNzZXQ6IAkApAMBBQdfcXRBc3RSAhQgYmVmb3JlIGJhc2UgYXNzZXQ6IAkApAMBBQdfYnNBc3RSAiEgcXVvdGUgYXNzZXQgYW1vdW50IHRvIGV4Y2hhbmdlOiAJAKQDAQURX3F1b3RlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIOIG1hcmtldFByaWNlOiAJAKQDAQULbWFya2V0UHJpY2UJAJcKBQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0BRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEFGGN1bXVsYXRpdmVOb3Rpb25hbEFmdGVyMQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQQX29sZFBvc2l0aW9uU2l6ZRJfb2xkUG9zaXRpb25NYXJnaW4lX29sZFBvc2l0aW9uQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgxfbWFyZ2luRGVsdGEEDmZ1bmRpbmdQYXltZW50AwkBAiE9AgUQX29sZFBvc2l0aW9uU2l6ZQAABCBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBRBfb2xkUG9zaXRpb25TaXplCQEEbXVsZAIJAGUCBSBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUlX29sZFBvc2l0aW9uQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUQX29sZFBvc2l0aW9uU2l6ZQAABAxzaWduZWRNYXJnaW4JAGQCCQBlAgUMX21hcmdpbkRlbHRhBQ5mdW5kaW5nUGF5bWVudAUSX29sZFBvc2l0aW9uTWFyZ2luBA0kdDAxMzg2MTEzOTg4AwkAZgIAAAUMc2lnbmVkTWFyZ2luCQCUCgIAAAkBA2FicwEFDHNpZ25lZE1hcmdpbgkAlAoCCQEDYWJzAQUMc2lnbmVkTWFyZ2luAAAEDHJlbWFpbk1hcmdpbggFDSR0MDEzODYxMTM5ODgCXzEEB2JhZERlYnQIBQ0kdDAxMzg2MTEzOTg4Al8yCQCVCgMFDHJlbWFpbk1hcmdpbgUHYmFkRGVidAUOZnVuZGluZ1BheW1lbnQBFnN3YXBPdXRwdXRXaXRoUmVzZXJ2ZXMFBl9pc0FkZBBfYmFzZUFzc2V0QW1vdW50FF9jaGVja01heFByaWNlSW1wYWN0El9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQQLcHJpY2VCZWZvcmUJAQRkaXZkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQMJAAACBRBfYmFzZUFzc2V0QW1vdW50AAAJAAIBAhlJbnZhbGlkIGJhc2UgYXNzZXQgYW1vdW50BAFrCQEEbXVsZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgMFBl9pc0FkZAkAZAIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0QW1vdW50CQBlAgURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRBbW91bnQED3F1b3RlQXNzZXRBZnRlcgkBBGRpdmQCBQFrBRhiYXNlQXNzZXRQb29sQW1vdW50QWZ0ZXIEDnF1b3RlQXNzZXRTb2xkCQEDYWJzAQkAZQIFD3F1b3RlQXNzZXRBZnRlcgUSX3F1b3RlQXNzZXRSZXNlcnZlBBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QABA0kdDAxNDk2NTE1MTU4CQENdXBkYXRlUmVzZXJ2ZQMJAQEhAQUGX2lzQWRkBQ5xdW90ZUFzc2V0U29sZAUQX2Jhc2VBc3NldEFtb3VudAQXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxNDk2NTE1MTU4Al8xBBZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTQ5NjUxNTE1OAJfMgQXdG90YWxQb3NpdGlvblNpemVBZnRlcjEIBQ0kdDAxNDk2NTE1MTU4Al8zBBhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEIBQ0kdDAxNDk2NTE1MTU4Al80BAttYXJrZXRQcmljZQkBBGRpdmQCBQ5xdW90ZUFzc2V0U29sZAUQX2Jhc2VBc3NldEFtb3VudAQJcHJpY2VEaWZmCQEDYWJzAQkAZQIFC3ByaWNlQmVmb3JlBQttYXJrZXRQcmljZQQLcHJpY2VJbXBhY3QJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgULcHJpY2VCZWZvcmUJAGQCBQtwcmljZUJlZm9yZQUJcHJpY2VEaWZmAwMJAGYCBQtwcmljZUltcGFjdAUTbWF4UHJpY2VJbXBhY3RWYWx1ZQUUX2NoZWNrTWF4UHJpY2VJbXBhY3QHCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1QcmljZSBpbXBhY3QgCQCkAwEFC3ByaWNlSW1wYWN0AhQgPiBtYXggcHJpY2UgaW1wYWN0IAkApAMBBRNtYXhQcmljZUltcGFjdFZhbHVlAhUgYmVmb3JlIHF1b3RlIGFzc2V0OiAJAKQDAQUSX3F1b3RlQXNzZXRSZXNlcnZlAhQgYmVmb3JlIGJhc2UgYXNzZXQ6IAkApAMBBRFfYmFzZUFzc2V0UmVzZXJ2ZQIgIGJhc2UgYXNzZXQgYW1vdW50IHRvIGV4Y2hhbmdlOiAJAKQDAQUQX2Jhc2VBc3NldEFtb3VudAIPIHByaWNlIGJlZm9yZTogCQCkAwEFC3ByaWNlQmVmb3JlAg8gbWFya2V0IHByaWNlOiAJAKQDAQULbWFya2V0UHJpY2UJAJoKCAUOcXVvdGVBc3NldFNvbGQFF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxBRZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxBRd0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyMQUYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxCQBlAgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQADBQZfaXNBZGQJAQNhYnMBBRBfYmFzZUFzc2V0QW1vdW50AAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQEBIQEFBl9pc0FkZAkBA2FicwEFEF9iYXNlQXNzZXRBbW91bnQAAAULcHJpY2VJbXBhY3QBCnN3YXBPdXRwdXQDBl9pc0FkZBBfYmFzZUFzc2V0QW1vdW50FF9jaGVja01heFByaWNlSW1wYWN0CQEWc3dhcE91dHB1dFdpdGhSZXNlcnZlcwUFBl9pc0FkZAUQX2Jhc2VBc3NldEFtb3VudAUUX2NoZWNrTWF4UHJpY2VJbXBhY3QJAQZxdEFzdFIACQEGYnNBc3RSAAESZ2V0T3JhY2xlVHdhcFByaWNlAAQGb3JhY2xlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUFa19vcmECAAQIcHJpY2VLZXkJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFCWtfb3JhX2tleQQIYmxvY2tLZXkJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFD2tfb3JhX2Jsb2NrX2tleQQJbGFzdFZhbHVlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUGb3JhY2xlBQhwcmljZUtleQkArAICCQCsAgIJAKwCAgIiQ2FuIG5vdCBnZXQgb3JhY2xlIHByaWNlLiBPcmFjbGU6IAkApQgBBQZvcmFjbGUCBiBrZXk6IAUIcHJpY2VLZXkFCWxhc3RWYWx1ZQEZcmVxdWlyZU5vdE92ZXJTcHJlYWRMaW1pdAISX3F1b3RlQXNzZXRSZXNlcnZlEV9iYXNlQXNzZXRSZXNlcnZlBAtvcmFjbGVQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAECnByaWNlQWZ0ZXIJAQRkaXZkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQQMYXZlcmFnZVByaWNlCQEEZGl2ZAIJAGQCBQtvcmFjbGVQcmljZQUKcHJpY2VBZnRlcgkAaAIAAgUMREVDSU1BTF9VTklUBAxhYnNQcmljZURpZmYJAQRkaXZkAgkBA2FicwEJAGUCBQtvcmFjbGVQcmljZQUKcHJpY2VBZnRlcgUMYXZlcmFnZVByaWNlAwkAZgIFDGFic1ByaWNlRGlmZgkBDm1heFByaWNlU3ByZWFkAAkAAgEJAKwCAgkArAICCQCsAgICDVByaWNlIHNwcmVhZCAJAKQDAQUMYWJzUHJpY2VEaWZmAhQgPiBtYXggcHJpY2Ugc3ByZWFkIAkApAMBCQEObWF4UHJpY2VTcHJlYWQABgEMZ2V0U3BvdFByaWNlAAQSX3F1b3RlQXNzZXRSZXNlcnZlCQEGcXRBc3RSAAQRX2Jhc2VBc3NldFJlc2VydmUJAQZic0FzdFIACQEEZGl2ZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUBFmlzT3ZlckZsdWN0dWF0aW9uTGltaXQABAtvcmFjbGVQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAEDGN1cnJlbnRQcmljZQkBDGdldFNwb3RQcmljZQAJAGYCCQEEZGl2ZAIJAQNhYnMBCQBlAgULb3JhY2xlUHJpY2UFDGN1cnJlbnRQcmljZQULb3JhY2xlUHJpY2UJAQtzcHJlYWRMaW1pdAABH2dldFBvc2l0aW9uQWRqdXN0ZWRPcGVuTm90aW9uYWwEDV9wb3NpdGlvblNpemUHX29wdGlvbhJfcXVvdGVBc3NldFJlc2VydmURX2Jhc2VBc3NldFJlc2VydmUED3Bvc2l0aW9uU2l6ZUFicwkBA2FicwEFDV9wb3NpdGlvblNpemUEB2lzU2hvcnQJAGYCAAAFDV9wb3NpdGlvblNpemUEEHBvc2l0aW9uTm90aW9uYWwDCQAAAgUHX29wdGlvbgUPUE5MX09QVElPTl9TUE9UBA0kdDAxODM3NjE4NTQ3CQEWc3dhcE91dHB1dFdpdGhSZXNlcnZlcwUJAQEhAQUHaXNTaG9ydAUPcG9zaXRpb25TaXplQWJzBwUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQQTb3V0UG9zaXRpb25Ob3Rpb25hbAgFDSR0MDE4Mzc2MTg1NDcCXzEEAngxCAUNJHQwMTgzNzYxODU0NwJfMgQCeDIIBQ0kdDAxODM3NjE4NTQ3Al8zBAJ4MwgFDSR0MDE4Mzc2MTg1NDcCXzQFE291dFBvc2l0aW9uTm90aW9uYWwJAQRtdWxkAgUPcG9zaXRpb25TaXplQWJzCQESZ2V0T3JhY2xlVHdhcFByaWNlAAUQcG9zaXRpb25Ob3Rpb25hbAEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCB190cmFkZXIHX29wdGlvbgQNJHQwMTg5NDExOTA2OQkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMTg5NDExOTA2OQJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAxODk0MTE5MDY5Al8yBBRwb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDE4OTQxMTkwNjkCXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMTg5NDExOTA2OQJfNAMJAAACBQxwb3NpdGlvblNpemUAAAkAAgECFUludmFsaWQgcG9zaXRpb24gc2l6ZQQHaXNTaG9ydAkAZgIAAAUMcG9zaXRpb25TaXplBBBwb3NpdGlvbk5vdGlvbmFsCQEfZ2V0UG9zaXRpb25BZGp1c3RlZE9wZW5Ob3Rpb25hbAQFDHBvc2l0aW9uU2l6ZQUHX29wdGlvbgkBBnF0QXN0UgAJAQZic0FzdFIABA11bnJlYWxpemVkUG5sAwUHaXNTaG9ydAkAZQIFFHBvc2l0aW9uT3Blbk5vdGlvbmFsBRBwb3NpdGlvbk5vdGlvbmFsCQBlAgUQcG9zaXRpb25Ob3Rpb25hbAUUcG9zaXRpb25PcGVuTm90aW9uYWwJAJQKAgUQcG9zaXRpb25Ob3Rpb25hbAUNdW5yZWFsaXplZFBubAEPY2FsY01hcmdpblJhdGlvAw1fcmVtYWluTWFyZ2luCF9iYWREZWJ0EV9wb3NpdGlvbk5vdGlvbmFsCQEEZGl2ZAIJAGUCBQ1fcmVtYWluTWFyZ2luBQhfYmFkRGVidAURX3Bvc2l0aW9uTm90aW9uYWwBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CB190cmFkZXIHX29wdGlvbgQNJHQwMTk5MDIyMDAxMwkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMTk5MDIyMDAxMwJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAxOTkwMjIwMDEzAl8yBANwb24IBQ0kdDAxOTkwMjIwMDEzAl8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDE5OTAyMjAwMTMCXzQEDSR0MDIwMDE5MjAxMTIJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFB19vcHRpb24EEHBvc2l0aW9uTm90aW9uYWwIBQ0kdDAyMDAxOTIwMTEyAl8xBA11bnJlYWxpemVkUG5sCAUNJHQwMjAwMTkyMDExMgJfMgQNJHQwMjAxMTcyMDI4MwkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQxwb3NpdGlvblNpemUFDnBvc2l0aW9uTWFyZ2luBRFwb3NpdGlvbkxzdFVwZENQRgUNdW5yZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwMjAxMTcyMDI4MwJfMQQHYmFkRGVidAgFDSR0MDIwMTE3MjAyODMCXzIJAQ9jYWxjTWFyZ2luUmF0aW8DBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFEHBvc2l0aW9uTm90aW9uYWwBDmdldE1hcmdpblJhdGlvAQdfdHJhZGVyCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAEbZ2V0UGFydGlhbExpcXVpZGF0aW9uQW1vdW50AgdfdHJhZGVyDV9wb3NpdGlvblNpemUEDG1heGltdW1SYXRpbwkBBHZtYXgCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIJARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAQYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplBQxtYXhpbXVtUmF0aW8ECnN3YXBSZXN1bHQJAQpzd2FwT3V0cHV0AwkAZgIFDV9wb3NpdGlvblNpemUAAAUYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplBwQcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFCnN3YXBSZXN1bHQCXzEEC3ByaWNlSW1wYWN0CAUKc3dhcFJlc3VsdAJfOAMJAGYCCQEObWF4UHJpY2VJbXBhY3QABQtwcmljZUltcGFjdAUcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAkBCnN3YXBPdXRwdXQDCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABRVleGNoYW5nZWRQb3NpdGlvblNpemUHAl8xBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50ARVpbnRlcm5hbENsb3NlUG9zaXRpb24CB190cmFkZXIUX2NoZWNrTWF4UHJpY2VJbXBhY3QEDSR0MDIxNDY1MjE1OTMJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIEDHBvc2l0aW9uU2l6ZQgFDSR0MDIxNDY1MjE1OTMCXzEEDnBvc2l0aW9uTWFyZ2luCAUNJHQwMjE0NjUyMTU5MwJfMgQUcG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAyMTQ2NTIxNTkzAl8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDIxNDY1MjE1OTMCXzQEDXVucmVhbGl6ZWRQbmwICQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QCXzIEDSR0MDIxNjg4MjE4NTYJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUMcG9zaXRpb25TaXplBQ5wb3NpdGlvbk1hcmdpbgURcG9zaXRpb25Mc3RVcGRDUEYFDXVucmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDIxNjg4MjE4NTYCXzEEB2JhZERlYnQIBQ0kdDAyMTY4ODIxODU2Al8yBBVleGNoYW5nZWRQb3NpdGlvblNpemUJAQEtAQUMcG9zaXRpb25TaXplBAtyZWFsaXplZFBubAUNdW5yZWFsaXplZFBubAQNbWFyZ2luVG9WYXVsdAkBAS0BBQxyZW1haW5NYXJnaW4EDSR0MDIxOTgzMjIyOTQJAQpzd2FwT3V0cHV0AwkAZgIFDHBvc2l0aW9uU2l6ZQAACQEDYWJzAQUMcG9zaXRpb25TaXplBRRfY2hlY2tNYXhQcmljZUltcGFjdAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDIxOTgzMjIyOTQCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyMTk4MzIyMjk0Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyMTk4MzIyMjk0Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMjE5ODMyMjI5NAJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDAyMTk4MzIyMjk0Al81BA50b3RhbExvbmdBZnRlcggFDSR0MDIxOTgzMjIyOTQCXzYED3RvdGFsU2hvcnRBZnRlcggFDSR0MDIxOTgzMjIyOTQCXzcEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIJAGUCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABRRwb3NpdGlvbk9wZW5Ob3Rpb25hbAkAngoMBRVleGNoYW5nZWRQb3NpdGlvblNpemUFB2JhZERlYnQFC3JlYWxpemVkUG5sBQ1tYXJnaW5Ub1ZhdWx0BRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyARBnZXRUd2FwU3BvdFByaWNlAAQIbWludXRlSWQJAGkCCQBpAggFCWxhc3RCbG9jawl0aW1lc3RhbXAA6AcAPAQNc3RhcnRNaW51dGVJZAkAZQIFCG1pbnV0ZUlkBQ1UV0FQX0lOVEVSVkFMBAdsaXN0U3RyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFDWtfbGFzdERhdGFTdHICAAQEbGlzdAkAtQkCBQdsaXN0U3RyAgEsCgEIZmlsdGVyRm4CC2FjY3VtdWxhdG9yBG5leHQDCQBnAgUNc3RhcnRNaW51dGVJZAkBDXBhcnNlSW50VmFsdWUBBQRuZXh0CQDNCAIFC2FjY3VtdWxhdG9yCQENcGFyc2VJbnRWYWx1ZQEFBG5leHQFC2FjY3VtdWxhdG9yBAVsaXN0RgoAAiRsBQRsaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmaWx0ZXJGbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAhtYXhJbmRleAMJAGYCCQCQAwEFBWxpc3RGAAAJAJYDAQUFbGlzdEYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsaXN0AAAEDGxhc3RNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rX2xhc3RNaW51dGVJZAAABBZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQxsYXN0TWludXRlSWQAAAQMZW5kTGFzdFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBRNrX3R3YXBEYXRhTGFzdFByaWNlAgFfCQCkAwEFDGxhc3RNaW51dGVJZAAABBJub3dDdW11bGF0aXZlUHJpY2UJAGQCBRZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBQxsYXN0TWludXRlSWQFDGVuZExhc3RQcmljZQQYc3RhcnRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABA5zdGFydExhc3RQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABBRzdGFydEN1bXVsYXRpdmVQcmljZQkAZAIFGHN0YXJ0TGFzdEN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQ1zdGFydE1pbnV0ZUlkBQhtYXhJbmRleAUOc3RhcnRMYXN0UHJpY2UJAGkCCQBlAgUSbm93Q3VtdWxhdGl2ZVByaWNlBRRzdGFydEN1bXVsYXRpdmVQcmljZQUNVFdBUF9JTlRFUlZBTAEOdXBkYXRlU2V0dGluZ3MJEF9pbml0TWFyZ2luUmF0aW8EX21tchRfbGlxdWlkYXRpb25GZWVSYXRpbw5fZnVuZGluZ1BlcmlvZARfZmVlDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19pbml0TWFyZ2luUmF0aW8FEF9pbml0TWFyZ2luUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwUEX21tcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa19saXF1aWRhdGlvbkZlZVJhdGlvBRRfbGlxdWlkYXRpb25GZWVSYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa19mdW5kaW5nUGVyaW9kBQ5fZnVuZGluZ1BlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUFa19mZWUFBF9mZWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfc3ByZWFkTGltaXQFDF9zcHJlYWRMaW1pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhQcmljZUltcGFjdAUPX21heFByaWNlSW1wYWN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbWF4UHJpY2VTcHJlYWQFD19tYXhQcmljZVNwcmVhZAUDbmlsAQ11cGRhdGVGdW5kaW5nBRFfbmV4dEZ1bmRpbmdCbG9jayRfbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24lX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbhBfbG9uZ0Z1bmRpbmdSYXRlEV9zaG9ydEZ1bmRpbmdSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX25leHRGdW5kaW5nQmxvY2sFEV9uZXh0RnVuZGluZ0Jsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBSVrX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBSRfbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIFJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBSVfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrX2xvbmdGdW5kaW5nUmF0ZQUQX2xvbmdGdW5kaW5nUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19zaG9ydEZ1bmRpbmdSYXRlBRFfc2hvcnRGdW5kaW5nUmF0ZQUDbmlsAQ51cGRhdGVQb3NpdGlvbgUIX2FkZHJlc3MFX3NpemUHX21hcmdpbg1fb3Blbk5vdGlvbmFsIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQUIX2FkZHJlc3MFBV9zaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQhfYWRkcmVzcwUHX21hcmdpbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAUIX2FkZHJlc3MFDV9vcGVuTm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FCF9hZGRyZXNzBSBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUDbmlsAQphcHBlbmRUd2FwAQVwcmljZQQIbWludXRlSWQJAGkCCQBpAggFCWxhc3RCbG9jawl0aW1lc3RhbXAA6AcAPAQQcHJldmlvdXNNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rX2xhc3RNaW51dGVJZAAAAwkAZgIFEHByZXZpb3VzTWludXRlSWQFCG1pbnV0ZUlkCQACAQIRVFdBUCBvdXQtb2Ytb3JkZXIEDGxhc3RNaW51dGVJZAMJAAACBRBwcmV2aW91c01pbnV0ZUlkAAAFCG1pbnV0ZUlkBRBwcmV2aW91c01pbnV0ZUlkAwkAZgIFCG1pbnV0ZUlkBRBwcmV2aW91c01pbnV0ZUlkBBNwcmV2Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBRBwcmV2aW91c01pbnV0ZUlkAAAECXByZXZQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBRBwcmV2aW91c01pbnV0ZUlkBQVwcmljZQQTbGFzdEN1bXVsYXRpdmVQcmljZQkAZAIFE3ByZXZDdW11bGF0aXZlUHJpY2UJAGgCCQBlAgUIbWludXRlSWQFDGxhc3RNaW51dGVJZAUJcHJldlByaWNlBARsaXN0CQELcHVzaFRvUXVldWUDCQEJc3RyVG9MaXN0AQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rX2xhc3REYXRhU3RyAgAFDVRXQVBfSU5URVJWQUwJAKQDAQUIbWludXRlSWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlCQCkAwEFCG1pbnV0ZUlkBRNsYXN0Q3VtdWxhdGl2ZVByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRNrX3R3YXBEYXRhTGFzdFByaWNlCQCkAwEFCG1pbnV0ZUlkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUaa190d2FwRGF0YVByZXZpb3VzTWludXRlSWQJAKQDAQUIbWludXRlSWQFEHByZXZpb3VzTWludXRlSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtfbGFzdE1pbnV0ZUlkBQhtaW51dGVJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rX2xhc3REYXRhU3RyCQEJbGlzdFRvU3RyAQUEbGlzdAUDbmlsBBh0d2FwRGF0YVByZXZpb3VzTWludXRlSWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUaa190d2FwRGF0YVByZXZpb3VzTWludXRlSWQJAKQDAQUIbWludXRlSWQAAAQTcHJldkN1bXVsYXRpdmVQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQkApAMBBRh0d2FwRGF0YVByZXZpb3VzTWludXRlSWQAAAQJcHJldlByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFE2tfdHdhcERhdGFMYXN0UHJpY2UJAKQDAQUYdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkBQVwcmljZQQTbGFzdEN1bXVsYXRpdmVQcmljZQkAZAIFE3ByZXZDdW11bGF0aXZlUHJpY2UJAGgCCQBlAgUIbWludXRlSWQFGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAUJcHJldlByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQkApAMBBQhtaW51dGVJZAUTbGFzdEN1bXVsYXRpdmVQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUTa190d2FwRGF0YUxhc3RQcmljZQkApAMBBQhtaW51dGVJZAUFcHJpY2UFA25pbAERdXBkYXRlQW1tUmVzZXJ2ZXMCB19xdEFzdFIHX2JzQXN0UgkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa19xdW90ZUFzc2V0UmVzZXJ2ZQUHX3F0QXN0UgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19iYXNlQXNzZXRSZXNlcnZlBQdfYnNBc3RSBQNuaWwBCXVwZGF0ZUFtbQcHX3F0QXN0UgdfYnNBc3RSF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyGF9jdW11bGF0aXZlTm90aW9uYWxBZnRlchVfb3BlbkludGVyZXN0Tm90aW9uYWwWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQMJAQIhPQIJAGUCBRZfdG90YWxMb25nUG9zaXRpb25TaXplBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQUXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIYSW52YWxpZCBBTU0gc3RhdGUgZGF0YTogCQCkAwEFFl90b3RhbExvbmdQb3NpdGlvblNpemUCBCArICAJAKQDAQUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUCBCAhPSAJAKQDAQUXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAM4IAgkAzggCCQERdXBkYXRlQW1tUmVzZXJ2ZXMCBQdfcXRBc3RSBQdfYnNBc3RSCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrX3RvdGFsUG9zaXRpb25TaXplBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa19jdW11bGF0aXZlTm90aW9uYWwFGF9jdW11bGF0aXZlTm90aW9uYWxBZnRlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAUVX29wZW5JbnRlcmVzdE5vdGlvbmFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQUWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUYa190b3RhbFNob3J0UG9zaXRpb25TaXplBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQUDbmlsCQEKYXBwZW5kVHdhcAEJAQRkaXZkAgUHX3F0QXN0UgUHX2JzQXN0UgEOZGVsZXRlUG9zaXRpb24BCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQhfYWRkcmVzcwUDbmlsAQh3aXRoZHJhdwIIX2FkZHJlc3MHX2Ftb3VudAQHYmFsYW5jZQkA8AcCBQR0aGlzCQEKcXVvdGVBc3NldAADCQBmAgUHX2Ftb3VudAUHYmFsYW5jZQkAAgEJAKwCAgkArAICCQCsAgICE1VuYWJsZSB0byB3aXRoZHJhdyAJAKQDAQUHX2Ftb3VudAIXIGZyb20gY29udHJhY3QgYmFsYW5jZSAJAKQDAQUHYmFsYW5jZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhfYWRkcmVzcwUHX2Ftb3VudAkBCnF1b3RlQXNzZXQABQNuaWwBDXVwZGF0ZUJhbGFuY2UBAWkDCQBmAgAABQFpCQACAQIHQmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa19iYWxhbmNlBQFpBQNuaWwBC3RyYW5zZmVyRmVlAQFpCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQ5zdGFraW5nQWRkcmVzcwAFAWkJAQpxdW90ZUFzc2V0AAUDbmlsEQFpAQVwYXVzZQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIaSW52YWxpZCB0b2dnbGVQYXVzZSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCGtfcGF1c2VkBgUDbmlsAWkBB3VucGF1c2UAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECGkludmFsaWQgdG9nZ2xlUGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAcFA25pbAFpAQxhZGRMaXF1aWRpdHkBEV9xdW90ZUFzc2V0QW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAGCQBnAgAABRFfcXVvdGVBc3NldEFtb3VudAkAAgECG0ludmFsaWQgYWRkTGlxdWlkaXR5IHBhcmFtcwQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAVwcmljZQkBBGRpdmQCBQdfcXRBc3RSBQdfYnNBc3RSBBRiYXNlQXNzZXRBbW91bnRUb0FkZAkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUFcHJpY2UEC3F0QXN0UkFmdGVyCQBkAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEC2JzQXN0UkFmdGVyCQBkAgUHX2JzQXN0UgUUYmFzZUFzc2V0QW1vdW50VG9BZGQJARF1cGRhdGVBbW1SZXNlcnZlcwIFC3F0QXN0UkFmdGVyBQtic0FzdFJBZnRlcgFpAQ9yZW1vdmVMaXF1aWRpdHkBEV9xdW90ZUFzc2V0QW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAGCQBnAgAABRFfcXVvdGVBc3NldEFtb3VudAkAAgECHkludmFsaWQgcmVtb3ZlTGlxdWlkaXR5IHBhcmFtcwQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAVwcmljZQkBBGRpdmQCBQdfcXRBc3RSBQdfYnNBc3RSBBdiYXNlQXNzZXRBbW91bnRUb1JlbW92ZQkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUFcHJpY2UEC3F0QXN0UkFmdGVyCQBlAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEC2JzQXN0UkFmdGVyCQBlAgUHX2JzQXN0UgUXYmFzZUFzc2V0QW1vdW50VG9SZW1vdmUJARF1cGRhdGVBbW1SZXNlcnZlcwIFC3F0QXN0UkFmdGVyBQtic0FzdFJBZnRlcgFpAQ5jaGFuZ2VTZXR0aW5ncwkQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvDl9mdW5kaW5nUGVyaW9kBF9mZWUMX3NwcmVhZExpbWl0D19tYXhQcmljZUltcGFjdBhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8PX21heFByaWNlU3ByZWFkAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECHUludmFsaWQgY2hhbmdlU2V0dGluZ3MgcGFyYW1zCQEOdXBkYXRlU2V0dGluZ3MJBRBfaW5pdE1hcmdpblJhdGlvBQRfbW1yBRRfbGlxdWlkYXRpb25GZWVSYXRpbwUOX2Z1bmRpbmdQZXJpb2QFBF9mZWUFDF9zcHJlYWRMaW1pdAUPX21heFByaWNlSW1wYWN0BRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8FD19tYXhQcmljZVNwcmVhZAFpAQppbml0aWFsaXplDgdfcXRBc3RSB19ic0FzdFIOX2Z1bmRpbmdQZXJpb2QQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvBF9mZWUHX29yYWNsZQpfb3JhY2xlS2V5DF9jb29yZGluYXRvcgxfc3ByZWFkTGltaXQPX21heFByaWNlSW1wYWN0GF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbw9fbWF4UHJpY2VTcHJlYWQDAwMDAwMDAwMDAwMJAGcCAAAFB19xdEFzdFIGCQBnAgAABQdfYnNBc3RSBgkAZwIAAAUOX2Z1bmRpbmdQZXJpb2QGCQBnAgAABRBfaW5pdE1hcmdpblJhdGlvBgkAZwIAAAUEX21tcgYJAGcCAAAFFF9saXF1aWRhdGlvbkZlZVJhdGlvBgkAZwIAAAUEX2ZlZQYJAGcCAAAFDF9zcHJlYWRMaW1pdAYJAGcCAAAFD19tYXhQcmljZUltcGFjdAYJAGcCAAAFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwYJAGcCAAAFD19tYXhQcmljZVNwcmVhZAYJAQtpbml0aWFsaXplZAAJAAIBAh1JbnZhbGlkIGluaXRpYWxpemUgcGFyYW1ldGVycwkAzggCCQDOCAIJAM4IAgkAzggCCQEJdXBkYXRlQW1tBwUHX3F0QXN0UgUHX2JzQXN0UgAAAAAAAAAAAAAJAQ51cGRhdGVTZXR0aW5ncwkFEF9pbml0TWFyZ2luUmF0aW8FBF9tbXIFFF9saXF1aWRhdGlvbkZlZVJhdGlvBQ5fZnVuZGluZ1BlcmlvZAUEX2ZlZQUMX3NwcmVhZExpbWl0BQ9fbWF4UHJpY2VJbXBhY3QFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwUPX21heFByaWNlU3ByZWFkCQENdXBkYXRlRnVuZGluZwUJAGQCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUOX2Z1bmRpbmdQZXJpb2QAAAAAAAAAAAkBDXVwZGF0ZUJhbGFuY2UBAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWtfb3JhBQdfb3JhY2xlCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtfb3JhX2tleQUKX29yYWNsZUtleQkAzAgCCQELU3RyaW5nRW50cnkCBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwUMX2Nvb3JkaW5hdG9yBQNuaWwBaQESc2V0SW5pdE1hcmdpblJhdGlvARBfaW5pdE1hcmdpblJhdGlvAwMJAGcCAAAFEF9pbml0TWFyZ2luUmF0aW8GCQEBIQEJAQtpbml0aWFsaXplZAAJAAIBAiVJbnZhbGlkIHNldEluaXRNYXJnaW5SYXRpbyBwYXJhbWV0ZXJzCQEOdXBkYXRlU2V0dGluZ3MJBRBfaW5pdE1hcmdpblJhdGlvCQEWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAJARNsaXF1aWRhdGlvbkZlZVJhdGlvAAkBEGZ1bmRpbmdQZXJpb2RSYXcACQEDZmVlAAkBC3NwcmVhZExpbWl0AAkBDm1heFByaWNlSW1wYWN0AAkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAkBDm1heFByaWNlU3ByZWFkAAFpARBkZWNyZWFzZVBvc2l0aW9uAwdfYW1vdW50CV9sZXZlcmFnZRNfbWluQmFzZUFzc2V0QW1vdW50AwMDAwMJAGcCAAAFB19hbW91bnQGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwkBBGRpdmQCBQxERUNJTUFMX1VOSVQFCV9sZXZlcmFnZQkBD2luaXRNYXJnaW5SYXRpbwAGBgkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBgkBBnBhdXNlZAAJAAIBAiNJbnZhbGlkIGRlY3JlYXNlUG9zaXRpb24gcGFyYW1ldGVycwQNJHQwMzQxODczNDMzOQkBC2dldFBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDM0MTg3MzQzMzkCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwMzQxODczNDMzOQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAzNDE4NzM0MzM5Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDM0MTg3MzQzMzkCXzQECl9kaXJlY3Rpb24DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAFCURJUl9TSE9SVAUIRElSX0xPTkcEBWlzQWRkCQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDM0NTEyMzQ2MjgJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIJAKUIAQgFAWkGY2FsbGVyBQ9QTkxfT1BUSU9OX1NQT1QEE29sZFBvc2l0aW9uTm90aW9uYWwIBQ0kdDAzNDUxMjM0NjI4Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwMzQ1MTIzNDYyOAJfMgQNJHQwMzQ2MzQzNzE4MwMJAGYCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwEDSR0MDM1MDExMzUyMzAJAQlzd2FwSW5wdXQCBQVpc0FkZAUMb3Blbk5vdGlvbmFsBBVleGNoYW5nZWRQb3NpdGlvblNpemUIBQ0kdDAzNTAxMTM1MjMwAl8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzUwMTEzNTIzMAJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzUwMTEzNTIzMAJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDM1MDExMzUyMzACXzQEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwMzUwMTEzNTIzMAJfNQQYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAwMJAQIhPQIFE19taW5CYXNlQXNzZXRBbW91bnQAAAkAZgIFE19taW5CYXNlQXNzZXRBbW91bnQFGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwcJAAIBCQCsAgIJAKwCAgkArAICAiVUb28gbGl0dGxlIGJhc2UgYXNzZXQgZXhjaGFuZ2VkLCBnb3QgCQCkAwEFGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwIKIGV4cGVjdGVkIAkApAMBBRNfbWluQmFzZUFzc2V0QW1vdW50BAtyZWFsaXplZFBubAkBBGRpdmQCCQEEbXVsZAIFDXVucmVhbGl6ZWRQbmwFGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwkBA2FicwEFD29sZFBvc2l0aW9uU2l6ZQQNJHQwMzU2NjczNTkxMgkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgULcmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDM1NjY3MzU5MTICXzEEB2JhZERlYnQIBQ0kdDAzNTY2NzM1OTEyAl8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDM1NjY3MzU5MTICXzMEGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFDG9wZW5Ob3Rpb25hbAQSdW5yZWFsaXplZFBubEFmdGVyCQBlAgUNdW5yZWFsaXplZFBubAULcmVhbGl6ZWRQbmwEEnJlbWFpbk9wZW5Ob3Rpb25hbAMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAkAZQIJAGUCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BRJ1bnJlYWxpemVkUG5sQWZ0ZXIJAGUCCQBkAgUSdW5yZWFsaXplZFBubEFmdGVyBRNvbGRQb3NpdGlvbk5vdGlvbmFsBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BA9uZXdQb3NpdGlvblNpemUJAGQCBQ9vbGRQb3NpdGlvblNpemUFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkAnQoLBQ9uZXdQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgkBA2FicwEFEnJlbWFpbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9uZXdQb3NpdGlvblNpemUFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIJAGUCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABQxvcGVuTm90aW9uYWwJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQAACQBlAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAAIBAhRDbG9zZSBwb3NpdGlvbiBmaXJzdAQPbmV3UG9zaXRpb25TaXplCAUNJHQwMzQ2MzQzNzE4MwJfMQQXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4IBQ0kdDAzNDYzNDM3MTgzAl8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDM0NjM0MzcxODMCXzMEFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCAUNJHQwMzQ2MzQzNzE4MwJfNAQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzQ2MzQzNzE4MwJfNQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDM0NjM0MzcxODMCXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDAzNDYzNDM3MTgzAl83BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDM0NjM0MzcxODMCXzgEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDAzNDYzNDM3MTgzAl85BA50b3RhbExvbmdBZnRlcggFDSR0MDM0NjM0MzcxODMDXzEwBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDAzNDYzNDM3MTgzA18xMQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQkApQgBCAUBaQZjYWxsZXIFD25ld1Bvc2l0aW9uU2l6ZQUXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxhdGVzdENQRgkBCXVwZGF0ZUFtbQcFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQaW5jcmVhc2VQb3NpdGlvbgMKX2RpcmVjdGlvbglfbGV2ZXJhZ2UTX21pbkJhc2VBc3NldEFtb3VudAQKX3Jhd0Ftb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDAwMDAwMDCQECIT0CBQpfZGlyZWN0aW9uBQhESVJfTE9ORwkBAiE9AgUKX2RpcmVjdGlvbgUJRElSX1NIT1JUBwYJAGcCAAAFCl9yYXdBbW91bnQGCQEBIQEJAQtpbml0aWFsaXplZAAGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQpxdW90ZUFzc2V0AAYJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DCQEEZGl2ZAIFDERFQ0lNQUxfVU5JVAUJX2xldmVyYWdlCQEPaW5pdE1hcmdpblJhdGlvAAYGCQEGcGF1c2VkAAkAAgECI0ludmFsaWQgaW5jcmVhc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBAlmZWVBbW91bnQJAQRtdWxkAgUKX3Jhd0Ftb3VudAkBA2ZlZQAEB19hbW91bnQJAGUCBQpfcmF3QW1vdW50BQlmZWVBbW91bnQEDSR0MDM4MzAxMzg0NTMJAQtnZXRQb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDAzODMwMTM4NDUzAl8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDM4MzAxMzg0NTMCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMzgzMDEzODQ1MwJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAzODMwMTM4NDUzAl80BA1pc05ld1Bvc2l0aW9uCQAAAgUPb2xkUG9zaXRpb25TaXplAAAED2lzU2FtZURpcmVjdGlvbgMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAkAAAIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQAAAgUKX2RpcmVjdGlvbgUJRElSX1NIT1JUBA5leHBhbmRFeGlzdGluZwMJAQEhAQUNaXNOZXdQb3NpdGlvbgUPaXNTYW1lRGlyZWN0aW9uBwQFaXNBZGQJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwQNJHQwMzg3NDI0MTMxMAMDBQ1pc05ld1Bvc2l0aW9uBgUOZXhwYW5kRXhpc3RpbmcEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDM5MTY2MzkzNzIJAQlzd2FwSW5wdXQCBQVpc0FkZAUMb3Blbk5vdGlvbmFsBBVhbW91bnRCYXNlQXNzZXRCb3VnaHQIBQ0kdDAzOTE2NjM5MzcyAl8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzkxNjYzOTM3MgJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzkxNjYzOTM3MgJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDM5MTY2MzkzNzICXzQEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwMzkxNjYzOTM3MgJfNQMDCQECIT0CBRNfbWluQmFzZUFzc2V0QW1vdW50AAAJAGYCBRNfbWluQmFzZUFzc2V0QW1vdW50CQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0BwkAAgEJAKwCAgkArAICCQCsAgICDUxpbWl0IGVycm9yOiAJAKQDAQkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAIDIDwgCQCkAwEFE19taW5CYXNlQXNzZXRBbW91bnQED25ld1Bvc2l0aW9uU2l6ZQkAZAIFD29sZFBvc2l0aW9uU2l6ZQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0BBlpbmNyZWFzZU1hcmdpblJlcXVpcmVtZW50CQEEZGl2ZAIFDG9wZW5Ob3Rpb25hbAUJX2xldmVyYWdlBA0kdDAzOTc1MzM5OTkyCQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFD29sZFBvc2l0aW9uU2l6ZQURb2xkUG9zaXRpb25NYXJnaW4FFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBRlpbmNyZWFzZU1hcmdpblJlcXVpcmVtZW50BAxyZW1haW5NYXJnaW4IBQ0kdDAzOTc1MzM5OTkyAl8xBAJ4MQgFDSR0MDM5NzUzMzk5OTICXzIEAngyCAUNJHQwMzk3NTMzOTk5MgJfMwMJAQEhAQkBGXJlcXVpcmVOb3RPdmVyU3ByZWFkTGltaXQCBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIJAAIBAhVPdmVyIG1heCBzcHJlYWQgbGltaXQJAJ0KCwUPbmV3UG9zaXRpb25TaXplBQxyZW1haW5NYXJnaW4JAGQCBRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAUMb3Blbk5vdGlvbmFsCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFD25ld1Bvc2l0aW9uU2l6ZQUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgkAZAIJARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAFDG9wZW5Ob3Rpb25hbAkAZAIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AAAJAGQCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQAAAQMb3Blbk5vdGlvbmFsCQEEbXVsZAIFB19hbW91bnQFCV9sZXZlcmFnZQQNJHQwNDEwMDM0MTExOQkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgkApQgBCAUBaQZjYWxsZXIFD1BOTF9PUFRJT05fU1BPVAQTb2xkUG9zaXRpb25Ob3Rpb25hbAgFDSR0MDQxMDAzNDExMTkCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA0MTAwMzQxMTE5Al8yAwkAZgIFE29sZFBvc2l0aW9uTm90aW9uYWwFDG9wZW5Ob3Rpb25hbAkAAgECLlVzZSBkZWNyZWFzZVBvc2l0aW9uIHRvIGRlY3JlYXNlIHBvc2l0aW9uIHNpemUJAAIBAhRDbG9zZSBwb3NpdGlvbiBmaXJzdAQPbmV3UG9zaXRpb25TaXplCAUNJHQwMzg3NDI0MTMxMAJfMQQXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4IBQ0kdDAzODc0MjQxMzEwAl8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDM4NzQyNDEzMTACXzMEFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCAUNJHQwMzg3NDI0MTMxMAJfNAQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzg3NDI0MTMxMAJfNQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDM4NzQyNDEzMTACXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDAzODc0MjQxMzEwAl83BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDM4NzQyNDEzMTACXzgEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDAzODc0MjQxMzEwAl85BA50b3RhbExvbmdBZnRlcggFDSR0MDM4NzQyNDEzMTADXzEwBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDAzODc0MjQxMzEwA18xMQQMZmVlVG9TdGFrZXJzCQBpAgUJZmVlQW1vdW50AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUJZmVlQW1vdW50BQxmZWVUb1N0YWtlcnMEBXN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDmxvY2tOZXV0cmlub1NQCQDMCAIJAKUIAQkBDnN0YWtpbmdBZGRyZXNzAAkAzAgCBQhBTExfRkVFUwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUOZmVlVG9JbnN1cmFuY2UFA25pbAMJAAACBRBkZXBvc2l0SW5zdXJhbmNlBRBkZXBvc2l0SW5zdXJhbmNlBAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUJZmVlQW1vdW50BQNuaWwFA25pbAMJAAACBQlub3RpZnlGZWUFCW5vdGlmeUZlZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUJAKUIAQgFAWkGY2FsbGVyBQ9uZXdQb3NpdGlvblNpemUFF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUbmV3UG9zaXRpb25MYXRlc3RDUEYJAQl1cGRhdGVBbW0HBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJYWRkTWFyZ2luAAQKX3Jhd0Ftb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDAwMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQpxdW90ZUFzc2V0AAYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQIcSW52YWxpZCBhZGRNYXJnaW4gcGFyYW1ldGVycwQJZmVlQW1vdW50CQEEbXVsZAIFCl9yYXdBbW91bnQJAQNmZWUABAdfYW1vdW50CQBlAgUKX3Jhd0Ftb3VudAUJZmVlQW1vdW50BA0kdDA0Mjg2NjQzMDE4CQELZ2V0UG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwNDI4NjY0MzAxOAJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDA0Mjg2NjQzMDE4Al8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDQyODY2NDMwMTgCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNDI4NjY0MzAxOAJfNAQMZmVlVG9TdGFrZXJzCQBpAgUJZmVlQW1vdW50AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUJZmVlQW1vdW50BQxmZWVUb1N0YWtlcnMEBXN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDmxvY2tOZXV0cmlub1NQCQDMCAIJAKUIAQkBDnN0YWtpbmdBZGRyZXNzAAkAzAgCBQhBTExfRkVFUwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUOZmVlVG9JbnN1cmFuY2UFA25pbAMJAAACBRBkZXBvc2l0SW5zdXJhbmNlBRBkZXBvc2l0SW5zdXJhbmNlBAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUJZmVlQW1vdW50BQNuaWwFA25pbAMJAAACBQlub3RpZnlGZWUFCW5vdGlmeUZlZQkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUJAKUIAQgFAWkGY2FsbGVyBQ9vbGRQb3NpdGlvblNpemUJAGQCBRFvbGRQb3NpdGlvbk1hcmdpbgUHX2Ftb3VudAUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwFFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMcmVtb3ZlTWFyZ2luAQdfYW1vdW50AwMDAwkAZwIAAAUHX2Ftb3VudAYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQIfSW52YWxpZCByZW1vdmVNYXJnaW4gcGFyYW1ldGVycwQNJHQwNDQwNjc0NDIxOQkBC2dldFBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDQ0MDY3NDQyMTkCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNDQwNjc0NDIxOQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA0NDA2NzQ0MjE5Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDQ0MDY3NDQyMTkCXzQEC21hcmdpbkRlbHRhCQEBLQEFB19hbW91bnQEDSR0MDQ0MjU2NDQ0MzUJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFC21hcmdpbkRlbHRhBAxyZW1haW5NYXJnaW4IBQ0kdDA0NDI1NjQ0NDM1Al8xBAdiYWREZWJ0CAUNJHQwNDQyNTY0NDQzNQJfMgMJAQIhPQIFB2JhZERlYnQAAAkAAgECHUludmFsaWQgcmVtb3ZlZCBtYXJnaW4gYW1vdW50BAttYXJnaW5SYXRpbwkBD2NhbGNNYXJnaW5SYXRpbwMFDHJlbWFpbk1hcmdpbgUHYmFkRGVidAUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwDCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwULbWFyZ2luUmF0aW8JAQ9pbml0TWFyZ2luUmF0aW8ABgkAAgEJAKwCAgkArAICCQCsAgICGVRvbyBtdWNoIG1hcmdpbiByZW1vdmVkOiAJAKQDAQULbWFyZ2luUmF0aW8CAyA8IAkApAMBCQEPaW5pdE1hcmdpblJhdGlvAAQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCBQdfYW1vdW50CQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQkApQgBCAUBaQZjYWxsZXIFD29sZFBvc2l0aW9uU2l6ZQUMcmVtYWluTWFyZ2luBRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9vbGRQb3NpdGlvblNpemUJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUHX2Ftb3VudAkBDXVwZGF0ZUJhbGFuY2UBCQBlAgkBCGNiYWxhbmNlAAUHX2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1jbG9zZVBvc2l0aW9uAAMDAwkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBAiBJbnZhbGlkIGNsb3NlUG9zaXRpb24gcGFyYW1ldGVycwQNJHQwNDU1MzE0NTkyMQkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIJAKUIAQgFAWkGY2FsbGVyBgQCeDEIBQ0kdDA0NTUzMTQ1OTIxAl8xBA9wb3NpdGlvbkJhZERlYnQIBQ0kdDA0NTUzMTQ1OTIxAl8yBAtyZWFsaXplZFBubAgFDSR0MDQ1NTMxNDU5MjECXzMEDW1hcmdpblRvVmF1bHQIBQ0kdDA0NTUzMTQ1OTIxAl80BBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDU1MzE0NTkyMQJfNQQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDU1MzE0NTkyMQJfNgQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDQ1NTMxNDU5MjECXzcEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwNDU1MzE0NTkyMQJfOAQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDQ1NTMxNDU5MjECXzkEAngyCAUNJHQwNDU1MzE0NTkyMQNfMTAEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNDU1MzE0NTkyMQNfMTEED3RvdGFsU2hvcnRBZnRlcggFDSR0MDQ1NTMxNDU5MjEDXzEyAwkAZgIFD3Bvc2l0aW9uQmFkRGVidAAACQACAQImVW5hYmxlIHRvIGNsb3NlIHBvc2l0aW9uIHdpdGggYmFkIGRlYnQEDndpdGhkcmF3QW1vdW50CQEDYWJzAQUNbWFyZ2luVG9WYXVsdAQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFDndpdGhkcmF3QW1vdW50BA0kdDA0NjEzMDQ2MjcyAwkAZgIAAAUKYW1tQmFsYW5jZQkAlAoCAAAJAQNhYnMBBQphbW1CYWxhbmNlCQCUCgIFCmFtbUJhbGFuY2UAAAQNYW1tTmV3QmFsYW5jZQgFDSR0MDQ2MTMwNDYyNzICXzEEEGdldEZyb21JbnN1cmFuY2UIBQ0kdDA0NjEzMDQ2MjcyAl8yBAF4AwkAZgIFEGdldEZyb21JbnN1cmFuY2UAAAQRd2l0aGRyYXdJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCBRBnZXRGcm9tSW5zdXJhbmNlBQNuaWwFA25pbAMJAAACBRF3aXRoZHJhd0luc3VyYW5jZQURd2l0aGRyYXdJbnN1cmFuY2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFAXgFAXgEB3Vuc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIOdW5sb2NrTmV1dHJpbm8JAMwIAgkAZQIFDndpdGhkcmF3QW1vdW50BRBnZXRGcm9tSW5zdXJhbmNlCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBA5ub3RpZnlOb3Rpb25hbAkA/AcECQEMbWluZXJBZGRyZXNzAAIObm90aWZ5Tm90aW9uYWwJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ5kZWxldGVQb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQ53aXRoZHJhd0Ftb3VudAkBDXVwZGF0ZUJhbGFuY2UBBQ1hbW1OZXdCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWxpcXVpZGF0ZQEHX3RyYWRlcgQPc3BvdE1hcmdpblJhdGlvCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQLbWFyZ2luUmF0aW8DCQEWaXNPdmVyRmx1Y3R1YXRpb25MaW1pdAAEEW9yYWNsZU1hcmdpblJhdGlvCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFEVBOTF9PUFRJT05fT1JBQ0xFCQEEdm1heAIFD3Nwb3RNYXJnaW5SYXRpbwURb3JhY2xlTWFyZ2luUmF0aW8FD3Nwb3RNYXJnaW5SYXRpbwMDAwMJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DBQttYXJnaW5SYXRpbwkBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ABwYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BBQdfdHJhZGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBAhNVbmFibGUgdG8gbGlxdWlkYXRlAwMDCQBmAgUPc3BvdE1hcmdpblJhdGlvCQETbGlxdWlkYXRpb25GZWVSYXRpbwAJAGYCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8AAAAHCQBmAgUMREVDSU1BTF9VTklUCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABwQNJHQwNDgzNzM0ODUyMwkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwNDgzNzM0ODUyMwJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDA0ODM3MzQ4NTIzAl8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDQ4MzczNDg1MjMCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNDgzNzM0ODUyMwJfNAQKX2RpcmVjdGlvbgMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAUJRElSX1NIT1JUBQhESVJfTE9ORwQFaXNBZGQJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkBG2dldFBhcnRpYWxMaXF1aWRhdGlvbkFtb3VudAIFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQQNJHQwNDg3NDg0ODg1MgkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UBBNvbGRQb3NpdGlvbk5vdGlvbmFsCAUNJHQwNDg3NDg0ODg1MgJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDQ4NzQ4NDg4NTICXzIEDSR0MDQ4ODYwNDkxNTAJAQlzd2FwSW5wdXQCBQVpc0FkZAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCAUNJHQwNDg4NjA0OTE1MAJfMQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDQ4ODYwNDkxNTACXzIEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDQ4ODYwNDkxNTACXzMEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA0ODg2MDQ5MTUwAl80BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDQ4ODYwNDkxNTACXzUEC3JlYWxpemVkUG5sCQEEZGl2ZAIJAQRtdWxkAgUNdW5yZWFsaXplZFBubAkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkBA2FicwEFD29sZFBvc2l0aW9uU2l6ZQQNJHQwNDkyNTc0OTQ5MAkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgULcmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDQ5MjU3NDk0OTACXzEEB2JhZERlYnQIBQ0kdDA0OTI1NzQ5NDkwAl8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDQ5MjU3NDk0OTACXzMEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQSbGlxdWlkYXRpb25QZW5hbHR5CQEEbXVsZAIFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARNsaXF1aWRhdGlvbkZlZVJhdGlvAAQPZmVlVG9MaXF1aWRhdG9yCQBpAgUSbGlxdWlkYXRpb25QZW5hbHR5AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BQ9mZWVUb0xpcXVpZGF0b3IEEW5ld1Bvc2l0aW9uTWFyZ2luCQBlAgUMcmVtYWluTWFyZ2luBRJsaXF1aWRhdGlvblBlbmFsdHkED25ld1Bvc2l0aW9uU2l6ZQkAZAIFD29sZFBvc2l0aW9uU2l6ZQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBA2FicwEFEnJlbWFpbk9wZW5Ob3Rpb25hbAQUbmV3UG9zaXRpb25Mc3RVcGRDUEYJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNTA2NjM1MDgwNgMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA1MDY2MzUwODA2Al8xBBF0YWtlRnJvbUluc3VyYW5jZQgFDSR0MDUwNjYzNTA4MDYCXzIEAXgDCQBmAgURdGFrZUZyb21JbnN1cmFuY2UAAAQRd2l0aGRyYXdJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCBRF0YWtlRnJvbUluc3VyYW5jZQUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQF4BQF4BAd1bnN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDnVubG9ja05ldXRyaW5vCQDMCAIJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFEXRha2VGcm9tSW5zdXJhbmNlCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBBBkZXBvc2l0SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDmZlZVRvSW5zdXJhbmNlBQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPbmV3UG9zaXRpb25TaXplBRFuZXdQb3NpdGlvbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgkAZQIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQ9mZWVUb0xpcXVpZGF0b3IJAQ11cGRhdGVCYWxhbmNlAQUNbmV3QW1tQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNTIyNjI1MjcxNwkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIFB190cmFkZXIHBAJ4MQgFDSR0MDUyMjYyNTI3MTcCXzEEB2JhZERlYnQIBQ0kdDA1MjI2MjUyNzE3Al8yBAJ4MggFDSR0MDUyMjYyNTI3MTcCXzMEAngzCAUNJHQwNTIyNjI1MjcxNwJfNAQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDUyMjYyNTI3MTcCXzUEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDUyMjYyNTI3MTcCXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA1MjI2MjUyNzE3Al83BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDUyMjYyNTI3MTcCXzgEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA1MjI2MjUyNzE3Al85BBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUNJHQwNTIyNjI1MjcxNwNfMTAEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNTIyNjI1MjcxNwNfMTEED3RvdGFsU2hvcnRBZnRlcggFDSR0MDUyMjYyNTI3MTcDXzEyBBJsaXF1aWRhdGlvblBlbmFsdHkJAQRtdWxkAgUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ABA9mZWVUb0xpcXVpZGF0b3IJAGkCBRJsaXF1aWRhdGlvblBlbmFsdHkAAgQOZmVlVG9JbnN1cmFuY2UJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFD2ZlZVRvTGlxdWlkYXRvcgQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNTMxMjk1MzI3MgMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA1MzEyOTUzMjcyAl8xBBF0YWtlRnJvbUluc3VyYW5jZQgFDSR0MDUzMTI5NTMyNzICXzIEAXgDCQBmAgURdGFrZUZyb21JbnN1cmFuY2UAAAQRd2l0aGRyYXdJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCBRF0YWtlRnJvbUluc3VyYW5jZQUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQF4BQF4BAd1bnN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDnVubG9ja05ldXRyaW5vCQDMCAIJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFEXRha2VGcm9tSW5zdXJhbmNlCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBBBkZXBvc2l0SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDmZlZVRvSW5zdXJhbmNlBQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ5kZWxldGVQb3NpdGlvbgEFB190cmFkZXIJAQl1cGRhdGVBbW0HBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyCQEId2l0aGRyYXcCCAUBaQZjYWxsZXIFD2ZlZVRvTGlxdWlkYXRvcgkBDXVwZGF0ZUJhbGFuY2UBBQ1uZXdBbW1CYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnBheUZ1bmRpbmcABBVmdW5kaW5nQmxvY2tUaW1lc3RhbXAJARluZXh0RnVuZGluZ0Jsb2NrVGltZXN0YW1wAAMDAwkAZgIFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAgFCWxhc3RCbG9jawl0aW1lc3RhbXAGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAkAAgEJAKwCAgkArAICCQCsAgICIUludmFsaWQgZnVuZGluZyBibG9jayB0aW1lc3RhbXA6IAkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAIDIDwgCQCkAwEFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAQPdW5kZXJseWluZ1ByaWNlCQESZ2V0T3JhY2xlVHdhcFByaWNlAAQNc3BvdFR3YXBQcmljZQkBEGdldFR3YXBTcG90UHJpY2UABAdwcmVtaXVtCQBlAgUNc3BvdFR3YXBQcmljZQUPdW5kZXJseWluZ1ByaWNlBA0kdDA1NDg2MDU2MTk1AwMJAAACCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAAAAYJAAACCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAAACQCUCgIAAAAAAwkAZgIAAAUHcHJlbWl1bQQUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZBBNsb25nUHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAJAJQKAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24EE2xvbmdQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZBBRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFE2xvbmdQcmVtaXVtRnJhY3Rpb24JARV0b3RhbExvbmdQb3NpdGlvblNpemUACQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAJAJQKAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24EFHNob3J0UHJlbWl1bUZyYWN0aW9uCAUNJHQwNTQ4NjA1NjE5NQJfMQQTbG9uZ1ByZW1pdW1GcmFjdGlvbggFDSR0MDU0ODYwNTYxOTUCXzIJAQ11cGRhdGVGdW5kaW5nBQkAZAIFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAkBFGZ1bmRpbmdQZXJpb2RTZWNvbmRzAAkAZAIJASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAFE2xvbmdQcmVtaXVtRnJhY3Rpb24JAGQCCQEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlCQEEZGl2ZAIFFHNob3J0UHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UBaQEFdl9nZXQBB190cmFkZXIEDSR0MDU2NTcwNTY2MzAJARVpbnRlcm5hbENsb3NlUG9zaXRpb24CBQdfdHJhZGVyBwQCeDEIBQ0kdDA1NjU3MDU2NjMwAl8xBAJ4MggFDSR0MDU2NTcwNTY2MzACXzIEAngzCAUNJHQwNTY1NzA1NjYzMAJfMwQCeDQIBQ0kdDA1NjU3MDU2NjMwAl80CQACAQkArAICCQCsAgIJAKwCAgkBAXMBBQJ4MgkBAXMBBQJ4MwkBAXMBBQJ4NAkBAXMBCQEOZ2V0TWFyZ2luUmF0aW8BBQdfdHJhZGVyAWkBJ3ZpZXdfY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAEHX3RyYWRlcgQNJHQwNTY3Nzc1Njg4OAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwNTY3Nzc1Njg4OAJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDA1Njc3NzU2ODg4Al8yBANwb24IBQ0kdDA1Njc3NzU2ODg4Al8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDU2Nzc3NTY4ODgCXzQEDSR0MDU2ODkzNTY5OTQJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQQcG9zaXRpb25Ob3Rpb25hbAgFDSR0MDU2ODkzNTY5OTQCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA1Njg5MzU2OTk0Al8yBA0kdDA1Njk5OTU3MTgxCQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FEXBvc2l0aW9uTHN0VXBkQ1BGBQ11bnJlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDA1Njk5OTU3MTgxAl8xBAdiYWREZWJ0CAUNJHQwNTY5OTk1NzE4MQJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDA1Njk5OTU3MTgxAl8zCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAQFzAQUMcmVtYWluTWFyZ2luCQEBcwEFDmZ1bmRpbmdQYXltZW50CQEBcwEJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIJAQFzAQUNdW5yZWFsaXplZFBubAkBAXMBBQdiYWREZWJ0CQEBcwEFEHBvc2l0aW9uTm90aW9uYWwBaQEOZm9yY2VNb3ZlQXNzZXQCB190cmFkZXIHX2Ftb3VudAMDCQECIT0CCQCnCAEJAQ5hZG1pblB1YmxpY0tleQAIBQFpBmNhbGxlcgYJAGYCAAAFB19hbW91bnQJAAIBAiFJbnZhbGlkIGZvcmNlTW92ZUFzc2V0IHBhcmFtZXRlcnMEB3Vuc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIOdW5sb2NrTmV1dHJpbm8JAMwIAgUHX2Ftb3VudAkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAzggCCQEId2l0aGRyYXcCCQERQGV4dHJOYXRpdmUoMTA2MikBBQdfdHJhZGVyBQdfYW1vdW50CQENdXBkYXRlQmFsYW5jZQEJAGUCCQEIY2JhbGFuY2UABQdfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkBDmFkbWluUHVibGljS2V5AMe2r1k=", "height": 2206149, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: H8RBFe1rwD7zdhDn48UVL2PmY4pEYjR1cyfXDKhwhJVJ Next: 6Znb8ZnUjQjNn75JbKbhqcFT1cCLEiTyMKVrWkqAPpcE Diff:
OldNewDifferences
3131
3232 let o = "k_liquidationFeeRatio"
3333
34-let p = "k_spreadLimit"
34+let p = "k_partLiquidationRatio"
3535
36-let q = "k_maxPriceImpact"
36+let q = "k_spreadLimit"
3737
38-let r = "k_lastDataStr"
38+let r = "k_maxPriceImpact"
3939
40-let s = "k_lastMinuteId"
40+let s = "k_maxPriceSpread"
4141
42-let t = "k_twapDataLastCumulativePrice"
42+let t = "k_lastDataStr"
4343
44-let u = "k_twapDataLastPrice"
44+let u = "k_lastMinuteId"
4545
46-let v = "k_twapDataPreviousMinuteId"
46+let v = "k_twapDataLastCumulativePrice"
4747
48-let w = "k_latestLongPremiumFraction"
48+let w = "k_twapDataLastPrice"
4949
50-let x = "k_latestShortPremiumFraction"
50+let x = "k_twapDataPreviousMinuteId"
5151
52-let y = "k_nextFundingBlockMinTimestamp"
52+let y = "k_latestLongPremiumFraction"
5353
54-let z = "k_longFundingRate"
54+let z = "k_latestShortPremiumFraction"
5555
56-let A = "k_shortFundingRate"
56+let A = "k_nextFundingBlockMinTimestamp"
5757
58-let B = "k_qtAstR"
58+let B = "k_longFundingRate"
5959
60-let C = "k_bsAstR"
60+let C = "k_shortFundingRate"
6161
62-let D = "k_totalPositionSize"
62+let D = "k_qtAstR"
6363
64-let E = "k_totalLongPositionSize"
64+let E = "k_bsAstR"
6565
66-let F = "k_totalShortPositionSize"
66+let F = "k_totalPositionSize"
6767
68-let G = "k_cumulativeNotional"
68+let G = "k_totalLongPositionSize"
6969
70-let H = "k_openInterestNotional"
70+let H = "k_totalShortPositionSize"
7171
72-let I = "k_coordinatorAddress"
72+let I = "k_cumulativeNotional"
7373
74-let J = "k_insurance_address"
74+let J = "k_openInterestNotional"
7575
76-let K = "k_admin_address"
76+let K = "k_coordinatorAddress"
7777
78-let L = "k_admin_public_key"
78+let L = "k_insurance_address"
7979
80-let M = "k_quote_asset"
80+let M = "k_admin_address"
8181
82-let N = "k_quote_staking"
82+let N = "k_admin_public_key"
8383
84-let O = "k_staking_address"
84+let O = "k_quote_asset"
8585
86-let P = "k_miner_address"
86+let P = "k_quote_staking"
8787
88-func Q () = valueOrErrorMessage(addressFromString(getStringValue(this, I)), "Coordinator not set")
88+let Q = "k_staking_address"
89+
90+let R = "k_miner_address"
91+
92+func S () = valueOrErrorMessage(addressFromString(getStringValue(this, K)), "Coordinator not set")
8993
9094
91-func R () = addressFromString(getStringValue(Q(), K))
95+func T () = addressFromString(getStringValue(S(), M))
9296
9397
94-func S () = fromBase58String(getStringValue(Q(), L))
98+func U () = fromBase58String(getStringValue(S(), N))
9599
96100
97-func T () = fromBase58String(getStringValue(Q(), M))
101+func V () = fromBase58String(getStringValue(S(), O))
98102
99103
100-func U () = valueOrErrorMessage(addressFromString(getStringValue(Q(), N)), "Quote asset staking not set")
104+func W () = valueOrErrorMessage(addressFromString(getStringValue(S(), P)), "Quote asset staking not set")
101105
102106
103-func V () = valueOrErrorMessage(addressFromString(getStringValue(Q(), O)), "Insurance not set")
107+func X () = valueOrErrorMessage(addressFromString(getStringValue(S(), Q)), "Insurance not set")
104108
105109
106-func W () = valueOrErrorMessage(addressFromString(getStringValue(Q(), J)), "Insurance not set")
110+func Y () = valueOrErrorMessage(addressFromString(getStringValue(S(), L)), "Insurance not set")
107111
108112
109-func X () = valueOrErrorMessage(addressFromString(getStringValue(Q(), P)), "Insurance not set")
113+func Z () = valueOrErrorMessage(addressFromString(getStringValue(S(), R)), "Insurance not set")
110114
111115
112-let Y = 1
116+let aa = 1
113117
114-let Z = 2
118+let ab = 2
115119
116-let aa = 15
120+let ac = 15
117121
118-let ab = 15
122+let ad = 15
119123
120-let ac = 1000
124+let ae = 1000
121125
122-let ad = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
126+let af = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
123127
124-let ae = (86400 * ad)
128+let ag = (86400 * af)
125129
126-let af = 100
130+let ah = 100
127131
128-let ag = 1
132+let ai = 1
129133
130-let ah = 2
134+let aj = 2
131135
132-func ai (aj) = (toString(aj) + ",")
136+func ak (al) = (toString(al) + ",")
133137
134138
135-func ak (aj,al) = fraction(aj, ad, al, HALFEVEN)
139+func am (al,an) = fraction(al, af, an, HALFEVEN)
136140
137141
138-func am (aj,al) = fraction(aj, al, ad, HALFEVEN)
142+func ao (al,an) = fraction(al, an, af, HALFEVEN)
139143
140144
141-func an (aj) = if ((aj > 0))
142- then aj
143- else -(aj)
145+func ap (al) = if ((al > 0))
146+ then al
147+ else -(al)
144148
145149
146-func ao (aj,al) = if ((aj >= al))
147- then aj
148- else al
150+func aq (al,an) = if ((al >= an))
151+ then al
152+ else an
149153
150154
151-func ap (aq,ar) = ((aq + "_") + ar)
155+func ar (as,at) = ((as + "_") + at)
152156
153157
154-func as (at) = {
155- func au (av,aw) = ((av + aw) + ",")
158+func au (av) = {
159+ func aw (ax,ay) = ((ax + ay) + ",")
156160
157- let ax = {
158- let ay = at
159- let az = size(ay)
160- let aA = ""
161- func aB (aC,aD) = if ((aD >= az))
162- then aC
163- else au(aC, ay[aD])
161+ let az = {
162+ let aA = av
163+ let aB = size(aA)
164+ let aC = ""
165+ func aD (aE,aF) = if ((aF >= aB))
166+ then aE
167+ else aw(aE, aA[aF])
164168
165- func aE (aC,aD) = if ((aD >= az))
166- then aC
169+ func aG (aE,aF) = if ((aF >= aB))
170+ then aE
167171 else throw("List size exceeds 20")
168172
169- aE(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aA, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
173+ aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
170174 }
171- let aF = dropRight(ax, 1)
172- let aG = if ((take(aF, 1) == ","))
173- then drop(aF, 1)
174- else aF
175- aG
175+ let aH = dropRight(az, 1)
176+ let aI = if ((take(aH, 1) == ","))
177+ then drop(aH, 1)
178+ else aH
179+ aI
176180 }
177181
178182
179-func aH (aI) = split(aI, ",")
183+func aJ (aK) = split(aK, ",")
180184
181185
182-func aJ (at,aK,aL) = if ((size(at) > aK))
183- then (removeByIndex(at, 0) :+ aL)
184- else (at :+ aL)
186+func aL (av,aM,aN) = if ((size(av) > aM))
187+ then (removeByIndex(av, 0) :+ aN)
188+ else (av :+ aN)
185189
186190
187-func aM (aN) = valueOrErrorMessage(getInteger(this, aN), ("no value for " + aN))
191+func aO (aP) = valueOrErrorMessage(getInteger(this, aP), ("no value for " + aP))
188192
189193
190-func aO () = aM(d)
194+func aQ () = aO(d)
191195
192196
193-func aP () = aM(k)
197+func aR () = aO(k)
194198
195199
196-func aQ () = aM(m)
200+func aS () = aO(m)
197201
198202
199-func aR () = aM(B)
203+func aT () = aO(D)
200204
201205
202-func aS () = aM(C)
206+func aU () = aO(E)
203207
204208
205-func aT () = aM(D)
209+func aV () = aO(F)
206210
207211
208-func aU () = aM(G)
212+func aW () = aO(I)
209213
210214
211-func aV () = aM(H)
215+func aX () = aO(J)
212216
213217
214-func aW () = aM(y)
218+func aY () = aO(A)
215219
216220
217-func aX () = aM(l)
221+func aZ () = aO(l)
218222
219223
220-func aY () = (aX() * ad)
224+func ba () = (aZ() * af)
221225
222226
223-func aZ () = (aX() * ac)
227+func bb () = (aZ() * ae)
224228
225229
226-func ba () = aM(n)
230+func bc () = aO(n)
227231
228232
229-func bb () = aM(o)
233+func bd () = aO(o)
230234
231235
232-func bc () = aM(p)
236+func be () = aO(p)
233237
234238
235-func bd () = aM(q)
239+func bf () = aO(q)
236240
237241
238-func be () = aM(w)
242+func bg () = aO(r)
239243
240244
241-func bf () = aM(x)
245+func bh () = aO(s)
242246
243247
244-func bg () = aM(F)
248+func bi () = aO(y)
245249
246250
247-func bh () = aM(E)
251+func bj () = aO(z)
248252
249253
250-func bi (bj,bk,bl) = {
251- let bm = (bj - bk)
252- if (if (bl)
253- then (0 > bm)
254+func bk () = aO(H)
255+
256+
257+func bl () = aO(G)
258+
259+
260+func bm (bn,bo,bp) = {
261+ let bq = (bn - bo)
262+ if (if (bp)
263+ then (0 > bq)
254264 else false)
255265 then throw("Invalid margin")
256- else if (if (!(bl))
257- then (bm >= 0)
266+ else if (if (!(bp))
267+ then (bq >= 0)
258268 else false)
259269 then throw("Invalid margin")
260270 else true
261271 }
262272
263273
264-func bn (bo) = if ((bo == 0))
274+func br (bs) = if ((bs == 0))
265275 then throw("Should not be called with _positionSize == 0")
266- else if ((bo > 0))
267- then be()
268- else bf()
276+ else if ((bs > 0))
277+ then bi()
278+ else bj()
269279
270280
271-func bp (bq) = {
272- let br = getInteger(this, ap(e, bq))
273- let bs = br
274- if ($isInstanceOf(bs, "Int"))
281+func bt (bu) = {
282+ let bv = getInteger(this, ar(e, bu))
283+ let bw = bv
284+ if ($isInstanceOf(bw, "Int"))
275285 then {
276- let bt = bs
277- $Tuple4(bt, getIntegerValue(this, ap(f, bq)), getIntegerValue(this, ap(g, bq)), getIntegerValue(this, ap(h, bq)))
286+ let bx = bw
287+ $Tuple4(bx, getIntegerValue(this, ar(f, bu)), getIntegerValue(this, ar(g, bu)), getIntegerValue(this, ar(h, bu)))
278288 }
279289 else $Tuple4(0, 0, 0, 0)
280290 }
281291
282292
283-func bu (bq) = if ((bp(bq)._1 == 0))
293+func by (bu) = if ((bt(bu)._1 == 0))
284294 then throw("No open position")
285295 else true
286296
287297
288-func bv () = valueOrElse(getBoolean(this, i), false)
298+func bz () = valueOrElse(getBoolean(this, i), false)
289299
290300
291-func bw () = valueOrElse(getBoolean(this, j), false)
301+func bA () = valueOrElse(getBoolean(this, j), false)
292302
293303
294-func bx (by,bz,bA) = if (by)
304+func bB (bC,bD,bE) = if (bC)
295305 then {
296- let bB = (aS() - bA)
297- if ((0 >= bB))
306+ let bF = (aU() - bE)
307+ if ((0 >= bF))
298308 then throw("Tx lead to base asset reserve <= 0, revert")
299- else $Tuple4((aR() + bz), bB, (aT() + bA), (aU() + bz))
309+ else $Tuple4((aT() + bD), bF, (aV() + bE), (aW() + bD))
300310 }
301311 else {
302- let bC = (aR() - bz)
303- if ((0 >= bC))
312+ let bG = (aT() - bD)
313+ if ((0 >= bG))
304314 then throw("Tx lead to base quote reserve <= 0, revert")
305- else $Tuple4(bC, (aS() + bA), (aT() - bA), (aU() - bz))
315+ else $Tuple4(bG, (aU() + bE), (aV() - bE), (aW() - bD))
306316 }
307317
308318
309-func bD (by,bz) = {
310- let bE = aR()
311- let bF = aS()
312- let aN = am(bE, bF)
313- let bG = if (by)
314- then (bE + bz)
315- else (bE - bz)
316- let bH = ak(aN, bG)
317- let bI = an((bH - bF))
318- let bJ = if (by)
319- then bI
320- else -(bI)
321- let bK = bx(by, bz, bI)
322- let bL = bK._1
323- let bM = bK._2
324- let bN = bK._3
325- let bO = bK._4
326- let bP = ak(bE, bF)
327- let bQ = ak(bz, bI)
328- let bR = an((bP - bQ))
329- let bS = (ad - ak(bP, (bP + bR)))
330- let bT = bd()
331- if ((bS > bT))
332- then throw(((((((((((((("Price impact " + toString(bS)) + " > max price impact ") + toString(bT)) + " before quote asset: ") + toString(bE)) + " before base asset: ") + toString(bF)) + " quote asset amount to exchange: ") + toString(bz)) + " price before: ") + toString(bP)) + " marketPrice: ") + toString(bQ)))
333- else $Tuple5(bJ, bL, bM, bN, bO)
319+func bH (bC,bD) = {
320+ let bI = aT()
321+ let bJ = aU()
322+ let aP = ao(bI, bJ)
323+ let bK = if (bC)
324+ then (bI + bD)
325+ else (bI - bD)
326+ let bL = am(aP, bK)
327+ let bM = ap((bL - bJ))
328+ let bN = if (bC)
329+ then bM
330+ else -(bM)
331+ let bO = bB(bC, bD, bM)
332+ let bP = bO._1
333+ let bQ = bO._2
334+ let bR = bO._3
335+ let bS = bO._4
336+ let bT = am(bI, bJ)
337+ let bU = am(bD, bM)
338+ let bV = ap((bT - bU))
339+ let bW = (af - am(bT, (bT + bV)))
340+ let bX = bg()
341+ if ((bW > bX))
342+ then throw(((((((((((((("Price impact " + toString(bW)) + " > max price impact ") + toString(bX)) + " before quote asset: ") + toString(bI)) + " before base asset: ") + toString(bJ)) + " quote asset amount to exchange: ") + toString(bD)) + " price before: ") + toString(bT)) + " marketPrice: ") + toString(bU)))
343+ else $Tuple5(bN, bP, bQ, bR, bS)
334344 }
335345
336346
337-func bU (bV,bW,bX,bY) = {
338- let bZ = if ((bV != 0))
347+func bY (bZ,ca,cb,cc) = {
348+ let cd = if ((bZ != 0))
339349 then {
340- let ca = bn(bV)
341- am((ca - bX), bV)
350+ let ce = br(bZ)
351+ ao((ce - cb), bZ)
342352 }
343353 else 0
344- let cb = ((bY - bZ) + bW)
345- let cc = if ((0 > cb))
346- then $Tuple2(0, an(cb))
347- else $Tuple2(an(cb), 0)
348- let cd = cc._1
349- let ce = cc._2
350- $Tuple3(cd, ce, bZ)
354+ let cf = ((cc - cd) + ca)
355+ let cg = if ((0 > cf))
356+ then $Tuple2(0, ap(cf))
357+ else $Tuple2(ap(cf), 0)
358+ let ch = cg._1
359+ let ci = cg._2
360+ $Tuple3(ch, ci, cd)
351361 }
352362
353363
354-func cf (by,bA,cg) = {
355- let ch = aR()
356- let ci = aS()
357- let bP = ak(ch, ci)
358- if ((bA == 0))
364+func cj (bC,bE,ck,cl,cm) = {
365+ let bT = am(cl, cm)
366+ if ((bE == 0))
359367 then throw("Invalid base asset amount")
360368 else {
361- let aN = am(ch, ci)
362- let cj = if (by)
363- then (ci + bA)
364- else (ci - bA)
365- let ck = ak(aN, cj)
366- let cl = an((ck - ch))
367- let bT = bd()
368- let cm = bx(!(by), cl, bA)
369- let bL = cm._1
370- let bM = cm._2
371- let bN = cm._3
372- let bO = cm._4
373- let bQ = ak(cl, bA)
374- let bR = an((bP - bQ))
375- let bS = (ad - ak(bP, (bP + bR)))
376- if (if ((bS > bT))
377- then cg
369+ let aP = ao(cl, cm)
370+ let cn = if (bC)
371+ then (cm + bE)
372+ else (cm - bE)
373+ let co = am(aP, cn)
374+ let cp = ap((co - cl))
375+ let bX = bg()
376+ let cq = bB(!(bC), cp, bE)
377+ let bP = cq._1
378+ let bQ = cq._2
379+ let bR = cq._3
380+ let bS = cq._4
381+ let bU = am(cp, bE)
382+ let bV = ap((bT - bU))
383+ let bW = (af - am(bT, (bT + bV)))
384+ if (if ((bW > bX))
385+ then ck
378386 else false)
379- then throw(((((((((((((("Price impact " + toString(bS)) + " > max price impact ") + toString(bT)) + " before quote asset: ") + toString(ch)) + " before base asset: ") + toString(ci)) + " base asset amount to exchange: ") + toString(bA)) + " price before: ") + toString(bP)) + " market price: ") + toString(bQ)))
380- else $Tuple7(cl, bL, bM, bN, bO, (bh() - (if (by)
381- then an(bA)
382- else 0)), (bg() - (if (!(by))
383- then an(bA)
384- else 0)))
387+ then throw(((((((((((((("Price impact " + toString(bW)) + " > max price impact ") + toString(bX)) + " before quote asset: ") + toString(cl)) + " before base asset: ") + toString(cm)) + " base asset amount to exchange: ") + toString(bE)) + " price before: ") + toString(bT)) + " market price: ") + toString(bU)))
388+ else $Tuple8(cp, bP, bQ, bR, bS, (bl() - (if (bC)
389+ then ap(bE)
390+ else 0)), (bk() - (if (!(bC))
391+ then ap(bE)
392+ else 0)), bW)
385393 }
386394 }
387395
388396
389-func cn () = {
390- let co = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
391- let cp = getStringValue(this, a)
392- let cq = getStringValue(this, b)
393- let cr = valueOrErrorMessage(getInteger(co, cp), ((("Can not get oracle price. Oracle: " + toString(co)) + " key: ") + cp))
394- cr
397+func cr (bC,bE,ck) = cj(bC, bE, ck, aT(), aU())
398+
399+
400+func cs () = {
401+ let ct = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
402+ let cu = getStringValue(this, a)
403+ let cv = getStringValue(this, b)
404+ let cw = valueOrErrorMessage(getInteger(ct, cu), ((("Can not get oracle price. Oracle: " + toString(ct)) + " key: ") + cu))
405+ cw
395406 }
396407
397408
398-func cs () = {
399- let ch = aR()
400- let ci = aS()
401- ak(ch, ci)
409+func cx (cl,cm) = {
410+ let cy = cs()
411+ let cz = am(cl, cm)
412+ let cA = am((cy + cz), (2 * af))
413+ let cB = am(ap((cy - cz)), cA)
414+ if ((cB > bh()))
415+ then throw(((("Price spread " + toString(cB)) + " > max price spread ") + toString(bh())))
416+ else true
402417 }
403418
404419
405-func ct () = {
406- let cu = cn()
407- let cv = cs()
408- (ak(an((cu - cv)), cu) > bc())
420+func cC () = {
421+ let cl = aT()
422+ let cm = aU()
423+ am(cl, cm)
409424 }
410425
411426
412-func cw (bq,cx) = {
413- let cy = bp(bq)
414- let bt = cy._1
415- let cz = cy._2
416- let cA = cy._3
417- let cB = cy._4
418- let cC = an(bt)
419- if ((cC == 0))
427+func cD () = {
428+ let cy = cs()
429+ let cE = cC()
430+ (am(ap((cy - cE)), cy) > bf())
431+ }
432+
433+
434+func cF (bs,cG,cl,cm) = {
435+ let cH = ap(bs)
436+ let cI = (0 > bs)
437+ let cJ = if ((cG == ai))
438+ then {
439+ let cK = cj(!(cI), cH, false, cl, cm)
440+ let cL = cK._1
441+ let cM = cK._2
442+ let cN = cK._3
443+ let cO = cK._4
444+ cL
445+ }
446+ else ao(cH, cs())
447+ cJ
448+ }
449+
450+
451+func cP (bu,cG) = {
452+ let cQ = bt(bu)
453+ let bx = cQ._1
454+ let cR = cQ._2
455+ let cS = cQ._3
456+ let cT = cQ._4
457+ if ((bx == 0))
420458 then throw("Invalid position size")
421459 else {
422- let cD = (0 > bt)
423- let cE = if ((cx == ag))
424- then {
425- let cF = cf(!(cD), cC, false)
426- let cG = cF._1
427- let cH = cF._2
428- let cI = cF._3
429- let cJ = cF._4
430- cG
431- }
432- else am(cC, cn())
433- let cK = if (cD)
434- then (cA - cE)
435- else (cE - cA)
436- $Tuple2(cE, cK)
460+ let cI = (0 > bx)
461+ let cJ = cF(bx, cG, aT(), aU())
462+ let cU = if (cI)
463+ then (cS - cJ)
464+ else (cJ - cS)
465+ $Tuple2(cJ, cU)
437466 }
438467 }
439468
440469
441-func cL (cM,cN,cO) = ak((cM - cN), cO)
470+func cV (cW,cX,cY) = am((cW - cX), cY)
442471
443472
444-func cP (bq,cx) = {
445- let cQ = bp(bq)
446- let bt = cQ._1
447- let cz = cQ._2
448- let cR = cQ._3
449- let cB = cQ._4
450- let cS = cw(bq, cx)
451- let cE = cS._1
452- let cK = cS._2
453- let cT = bU(bt, cz, cB, cK)
454- let cd = cT._1
455- let ce = cT._2
456- cL(cd, ce, cE)
473+func cZ (bu,cG) = {
474+ let da = bt(bu)
475+ let bx = da._1
476+ let cR = da._2
477+ let db = da._3
478+ let cT = da._4
479+ let dc = cP(bu, cG)
480+ let cJ = dc._1
481+ let cU = dc._2
482+ let dd = bY(bx, cR, cT, cU)
483+ let ch = dd._1
484+ let ci = dd._2
485+ cV(ch, ci, cJ)
457486 }
458487
459488
460-func cU (bq) = cP(bq, ag)
489+func de (bu) = cZ(bu, ai)
461490
462491
463-func cV (bq,cg) = {
464- let cW = bp(bq)
465- let bt = cW._1
466- let cz = cW._2
467- let cA = cW._3
468- let cB = cW._4
469- let cX = cw(bq, ag)
470- let cH = cX._1
471- let cK = cX._2
472- let cY = bU(bt, cz, cB, cK)
473- let cd = cY._1
474- let ce = cY._2
475- let cZ = -(bt)
476- let da = cK
477- let db = -(cd)
478- let dc = cf((bt > 0), an(bt), cg)
479- let dd = dc._1
480- let bG = dc._2
481- let bH = dc._3
482- let de = dc._4
483- let df = dc._5
484- let dg = dc._6
485- let dh = dc._7
486- let di = (aV() - cA)
487- $Tuple12(cZ, ce, da, db, bG, bH, de, df, di, dd, dg, dh)
492+func df (bu,bs) = {
493+ let dg = aq(be(), (af - am(de(bu), bc())))
494+ let dh = ao(ap(bs), dg)
495+ let di = cr((bs > 0), dh, false)
496+ let dj = di._1
497+ let bW = di._8
498+ if ((bg() > bW))
499+ then dj
500+ else {
501+ let dk = ao(ap(bs), be())
502+ let dl = cr((bs > 0), dk, false)._1
503+ dl
504+ }
488505 }
489506
490507
491-func dj () = {
492- let dk = ((lastBlock.timestamp / 1000) / 60)
493- let dl = (dk - aa)
494- let dm = valueOrElse(getString(this, r), "")
495- let dn = split(dm, ",")
496- func do (av,dp) = if ((dl >= parseIntValue(dp)))
497- then (av :+ parseIntValue(dp))
498- else av
499-
500- let dq = {
501- let ay = dn
502- let az = size(ay)
503- let aA = nil
504- func aB (aC,aD) = if ((aD >= az))
505- then aC
506- else do(aC, ay[aD])
507-
508- func aE (aC,aD) = if ((aD >= az))
509- then aC
510- else throw("List size exceeds 20")
511-
512- aE(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aA, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
513- }
514- let dr = if ((size(dq) > 0))
515- then max(dq)
516- else parseIntValue(dn[0])
517- let ds = valueOrElse(getInteger(this, s), 0)
518- let dt = valueOrElse(getInteger(this, ((t + "_") + toString(ds))), 0)
519- let du = valueOrElse(getInteger(this, ((u + "_") + toString(ds))), 0)
520- let dv = (dt + ((dk - ds) * du))
521- let dw = valueOrElse(getInteger(this, ((t + "_") + toString(dr))), 0)
522- let dx = valueOrElse(getInteger(this, ((u + "_") + toString(dr))), 0)
523- let dy = (dw + ((dl - dr) * dx))
524- ((dv - dy) / aa)
508+func dm (bu,ck) = {
509+ let dn = bt(bu)
510+ let bx = dn._1
511+ let cR = dn._2
512+ let cS = dn._3
513+ let cT = dn._4
514+ let cU = cP(bu, ai)._2
515+ let do = bY(bx, cR, cT, cU)
516+ let ch = do._1
517+ let ci = do._2
518+ let dk = -(bx)
519+ let dp = cU
520+ let dq = -(ch)
521+ let dr = cr((bx > 0), ap(bx), ck)
522+ let dl = dr._1
523+ let bK = dr._2
524+ let bL = dr._3
525+ let ds = dr._4
526+ let dt = dr._5
527+ let du = dr._6
528+ let dv = dr._7
529+ let dw = (aX() - cS)
530+ $Tuple12(dk, ci, dp, dq, bK, bL, ds, dt, dw, dl, du, dv)
525531 }
526532
527533
528-func dz (dA,dB,dC,dD,dE,dF,dG) = [IntegerEntry(m, dA), IntegerEntry(n, dB), IntegerEntry(o, dC), IntegerEntry(l, dD), IntegerEntry(k, dE), IntegerEntry(p, dF), IntegerEntry(q, dG)]
534+func dx () = {
535+ let dy = ((lastBlock.timestamp / 1000) / 60)
536+ let dz = (dy - ac)
537+ let dA = valueOrElse(getString(this, t), "")
538+ let dB = split(dA, ",")
539+ func dC (ax,dD) = if ((dz >= parseIntValue(dD)))
540+ then (ax :+ parseIntValue(dD))
541+ else ax
542+
543+ let dE = {
544+ let aA = dB
545+ let aB = size(aA)
546+ let aC = nil
547+ func aD (aE,aF) = if ((aF >= aB))
548+ then aE
549+ else dC(aE, aA[aF])
550+
551+ func aG (aE,aF) = if ((aF >= aB))
552+ then aE
553+ else throw("List size exceeds 20")
554+
555+ aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
556+ }
557+ let dF = if ((size(dE) > 0))
558+ then max(dE)
559+ else parseIntValue(dB[0])
560+ let dG = valueOrElse(getInteger(this, u), 0)
561+ let dH = valueOrElse(getInteger(this, ((v + "_") + toString(dG))), 0)
562+ let dI = valueOrElse(getInteger(this, ((w + "_") + toString(dG))), 0)
563+ let dJ = (dH + ((dy - dG) * dI))
564+ let dK = valueOrElse(getInteger(this, ((v + "_") + toString(dF))), 0)
565+ let dL = valueOrElse(getInteger(this, ((w + "_") + toString(dF))), 0)
566+ let dM = (dK + ((dz - dF) * dL))
567+ ((dJ - dM) / ac)
568+ }
529569
530570
531-func dH (dI,dJ,dK,dL,dM) = [IntegerEntry(y, dI), IntegerEntry(w, dJ), IntegerEntry(x, dK), IntegerEntry(z, dL), IntegerEntry(A, dM)]
571+func dN (dO,dP,dQ,dR,dS,dT,dU,dV,dW) = [IntegerEntry(m, dO), IntegerEntry(n, dP), IntegerEntry(o, dQ), IntegerEntry(l, dR), IntegerEntry(k, dS), IntegerEntry(q, dT), IntegerEntry(r, dU), IntegerEntry(p, dV), IntegerEntry(s, dW)]
532572
533573
534-func dN (ar,dO,dP,dQ,ca) = [IntegerEntry(ap(e, ar), dO), IntegerEntry(ap(f, ar), dP), IntegerEntry(ap(g, ar), dQ), IntegerEntry(ap(h, ar), ca)]
574+func dX (dY,dZ,ea,eb,ec) = [IntegerEntry(A, dY), IntegerEntry(y, dZ), IntegerEntry(z, ea), IntegerEntry(B, eb), IntegerEntry(C, ec)]
535575
536576
537-func dR (dS) = {
538- let dk = ((lastBlock.timestamp / 1000) / 60)
539- let dT = valueOrElse(getInteger(this, s), 0)
540- if ((dT > dk))
577+func ed (at,ee,ef,eg,ce) = [IntegerEntry(ar(e, at), ee), IntegerEntry(ar(f, at), ef), IntegerEntry(ar(g, at), eg), IntegerEntry(ar(h, at), ce)]
578+
579+
580+func eh (ei) = {
581+ let dy = ((lastBlock.timestamp / 1000) / 60)
582+ let ej = valueOrElse(getInteger(this, u), 0)
583+ if ((ej > dy))
541584 then throw("TWAP out-of-order")
542585 else {
543- let ds = if ((dT == 0))
544- then dk
545- else dT
546- if ((dk > dT))
586+ let dG = if ((ej == 0))
587+ then dy
588+ else ej
589+ if ((dy > ej))
547590 then {
548- let dU = valueOrElse(getInteger(this, ((t + "_") + toString(dT))), 0)
549- let dV = valueOrElse(getInteger(this, ((u + "_") + toString(dT))), dS)
550- let dW = (dU + ((dk - ds) * dV))
551- let dn = aJ(aH(valueOrElse(getString(this, r), "")), aa, toString(dk))
552-[IntegerEntry(ap(t, toString(dk)), dW), IntegerEntry(ap(u, toString(dk)), dS), IntegerEntry(ap(v, toString(dk)), dT), IntegerEntry(s, dk), StringEntry(r, as(dn))]
591+ let ek = valueOrElse(getInteger(this, ((v + "_") + toString(ej))), 0)
592+ let el = valueOrElse(getInteger(this, ((w + "_") + toString(ej))), ei)
593+ let em = (ek + ((dy - dG) * el))
594+ let dB = aL(aJ(valueOrElse(getString(this, t), "")), ac, toString(dy))
595+[IntegerEntry(ar(v, toString(dy)), em), IntegerEntry(ar(w, toString(dy)), ei), IntegerEntry(ar(x, toString(dy)), ej), IntegerEntry(u, dy), StringEntry(t, au(dB))]
553596 }
554597 else {
555- let dX = valueOrElse(getInteger(this, ap(v, toString(dk))), 0)
556- let dU = valueOrElse(getInteger(this, ap(t, toString(dX))), 0)
557- let dV = valueOrElse(getInteger(this, ap(u, toString(dX))), dS)
558- let dW = (dU + ((dk - dX) * dV))
559-[IntegerEntry(ap(t, toString(dk)), dW), IntegerEntry(ap(u, toString(dk)), dS)]
598+ let en = valueOrElse(getInteger(this, ar(x, toString(dy))), 0)
599+ let ek = valueOrElse(getInteger(this, ar(v, toString(en))), 0)
600+ let el = valueOrElse(getInteger(this, ar(w, toString(en))), ei)
601+ let em = (ek + ((dy - en) * el))
602+[IntegerEntry(ar(v, toString(dy)), em), IntegerEntry(ar(w, toString(dy)), ei)]
560603 }
561604 }
562605 }
563606
564607
565-func dY (bE,bF) = [IntegerEntry(B, bE), IntegerEntry(C, bF)]
608+func eo (bI,bJ) = [IntegerEntry(D, bI), IntegerEntry(E, bJ)]
566609
567610
568-func dZ (bE,bF,ea,eb,ec,ed,ee) = if (((ed - ee) != ea))
569- then throw(((((("Invalid AMM state data: " + toString(ed)) + " + ") + toString(ee)) + " != ") + toString(ea)))
570- else ((dY(bE, bF) ++ [IntegerEntry(D, ea), IntegerEntry(G, eb), IntegerEntry(H, ec), IntegerEntry(E, ed), IntegerEntry(F, ee)]) ++ dR(ak(bE, bF)))
611+func ep (bI,bJ,eq,er,es,et,eu) = if (((et - eu) != eq))
612+ then throw(((((("Invalid AMM state data: " + toString(et)) + " + ") + toString(eu)) + " != ") + toString(eq)))
613+ else ((eo(bI, bJ) ++ [IntegerEntry(F, eq), IntegerEntry(I, er), IntegerEntry(J, es), IntegerEntry(G, et), IntegerEntry(H, eu)]) ++ eh(am(bI, bJ)))
571614
572615
573-func ef (ar) = [DeleteEntry(ap(e, ar)), DeleteEntry(ap(f, ar)), DeleteEntry(ap(g, ar)), DeleteEntry(ap(h, ar))]
616+func ev (at) = [DeleteEntry(ar(e, at)), DeleteEntry(ar(f, at)), DeleteEntry(ar(g, at)), DeleteEntry(ar(h, at))]
574617
575618
576-func eg (ar,eh) = {
577- let ei = assetBalance(this, T())
578- if ((eh > ei))
579- then throw(((("Unable to withdraw " + toString(eh)) + " from contract balance ") + toString(ei)))
580- else [ScriptTransfer(ar, eh, T())]
619+func ew (at,ex) = {
620+ let ey = assetBalance(this, V())
621+ if ((ex > ey))
622+ then throw(((("Unable to withdraw " + toString(ex)) + " from contract balance ") + toString(ey)))
623+ else [ScriptTransfer(at, ex, V())]
581624 }
582625
583626
584-func ej (ek) = if ((0 > ek))
627+func ez (eA) = if ((0 > eA))
585628 then throw("Balance")
586- else [IntegerEntry(d, ek)]
629+ else [IntegerEntry(d, eA)]
587630
588631
589-func el (ek) = [ScriptTransfer(V(), ek, T())]
632+func eB (eA) = [ScriptTransfer(X(), eA, V())]
590633
591634
592-@Callable(ek)
593-func pause () = if ((ek.caller != R()))
635+@Callable(eA)
636+func pause () = if ((eA.caller != T()))
594637 then throw("Invalid togglePause params")
595638 else [BooleanEntry(j, true)]
596639
597640
598641
599-@Callable(ek)
600-func unpause () = if ((ek.caller != R()))
642+@Callable(eA)
643+func unpause () = if ((eA.caller != T()))
601644 then throw("Invalid togglePause params")
602645 else [BooleanEntry(j, false)]
603646
604647
605648
606-@Callable(ek)
607-func addLiquidity (bz) = if (if ((ek.caller != R()))
649+@Callable(eA)
650+func addLiquidity (bD) = if (if ((eA.caller != T()))
608651 then true
609- else (0 >= bz))
652+ else (0 >= bD))
610653 then throw("Invalid addLiquidity params")
611654 else {
612- let bE = aR()
613- let bF = aS()
614- let dS = ak(bE, bF)
615- let em = ak(bz, dS)
616- let en = (bE + bz)
617- let eo = (bF + em)
618- dY(en, eo)
655+ let bI = aT()
656+ let bJ = aU()
657+ let ei = am(bI, bJ)
658+ let eC = am(bD, ei)
659+ let eD = (bI + bD)
660+ let eE = (bJ + eC)
661+ eo(eD, eE)
619662 }
620663
621664
622665
623-@Callable(ek)
624-func removeLiquidity (bz) = if (if ((ek.caller != R()))
666+@Callable(eA)
667+func removeLiquidity (bD) = if (if ((eA.caller != T()))
625668 then true
626- else (0 >= bz))
669+ else (0 >= bD))
627670 then throw("Invalid removeLiquidity params")
628671 else {
629- let bE = aR()
630- let bF = aS()
631- let dS = ak(bE, bF)
632- let ep = ak(bz, dS)
633- let en = (bE - bz)
634- let eo = (bF - ep)
635- dY(en, eo)
672+ let bI = aT()
673+ let bJ = aU()
674+ let ei = am(bI, bJ)
675+ let eF = am(bD, ei)
676+ let eD = (bI - bD)
677+ let eE = (bJ - eF)
678+ eo(eD, eE)
636679 }
637680
638681
639682
640-@Callable(ek)
641-func changeSettings (dA,dB,dC,dD,dE,dF,dG) = if ((ek.caller != R()))
683+@Callable(eA)
684+func changeSettings (dO,dP,dQ,dR,dS,dT,dU,dV,dW) = if ((eA.caller != T()))
642685 then throw("Invalid changeSettings params")
643- else dz(dA, dB, dC, dD, dE, dF, dG)
686+ else dN(dO, dP, dQ, dR, dS, dT, dU, dV, dW)
644687
645688
646689
647-@Callable(ek)
648-func initialize (bE,bF,dD,dA,dB,dC,dE,eq,er,es,dF,dG) = if (if (if (if (if (if (if (if (if (if ((0 >= bE))
690+@Callable(eA)
691+func initialize (bI,bJ,dR,dO,dP,dQ,dS,eG,eH,eI,dT,dU,dV,dW) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bI))
649692 then true
650- else (0 >= bF))
693+ else (0 >= bJ))
651694 then true
652- else (0 >= dD))
695+ else (0 >= dR))
653696 then true
654- else (0 >= dA))
697+ else (0 >= dO))
655698 then true
656- else (0 >= dB))
699+ else (0 >= dP))
657700 then true
658- else (0 >= dC))
701+ else (0 >= dQ))
659702 then true
660- else (0 >= dE))
703+ else (0 >= dS))
661704 then true
662- else (0 >= dF))
705+ else (0 >= dT))
663706 then true
664- else (0 >= dG))
707+ else (0 >= dU))
665708 then true
666- else bv())
709+ else (0 >= dV))
710+ then true
711+ else (0 >= dW))
712+ then true
713+ else bz())
667714 then throw("Invalid initialize parameters")
668- else ((((dZ(bE, bF, 0, 0, 0, 0, 0) ++ dz(dA, dB, dC, dD, dE, dF, dG)) ++ dH((lastBlock.timestamp + dD), 0, 0, 0, 0)) ++ ej(0)) ++ [BooleanEntry(i, true), StringEntry(c, eq), StringEntry(a, er), StringEntry(I, es)])
715+ else ((((ep(bI, bJ, 0, 0, 0, 0, 0) ++ dN(dO, dP, dQ, dR, dS, dT, dU, dV, dW)) ++ dX((lastBlock.timestamp + dR), 0, 0, 0, 0)) ++ ez(0)) ++ [BooleanEntry(i, true), StringEntry(c, eG), StringEntry(a, eH), StringEntry(K, eI)])
669716
670717
671718
672-@Callable(ek)
673-func setMaxPriceImpact (dG) = if (if ((0 >= dG))
719+@Callable(eA)
720+func setInitMarginRatio (dO) = if (if ((0 >= dO))
674721 then true
675- else !(bv()))
676- then throw("Invalid _maxPriceImpact parameters")
677- else dz(aQ(), ba(), bb(), aX(), aP(), bc(), dG)
722+ else !(bz()))
723+ then throw("Invalid setInitMarginRatio parameters")
724+ else dN(dO, bc(), bd(), aZ(), aR(), bf(), bg(), be(), bh())
678725
679726
680727
681-@Callable(ek)
682-func setInitMarginRatio (dA) = if (if ((0 >= dA))
728+@Callable(eA)
729+func decreasePosition (ex,eJ,eK) = if (if (if (if (if ((0 >= ex))
683730 then true
684- else !(bv()))
685- then throw("Invalid setInitMarginRatio parameters")
686- else dz(dA, ba(), bb(), aX(), aP(), bc(), bd())
687-
688-
689-
690-@Callable(ek)
691-func decreasePosition (eh,et,eu) = if (if (if (if (if ((0 >= eh))
731+ else !(bz()))
692732 then true
693- else !(bv()))
733+ else !(bm(am(af, eJ), aS(), true)))
694734 then true
695- else !(bi(ak(ad, et), aQ(), true)))
735+ else !(by(toString(eA.caller))))
696736 then true
697- else !(bu(toString(ek.caller))))
698- then true
699- else bw())
737+ else bA())
700738 then throw("Invalid decreasePosition parameters")
701739 else {
702- let ev = bp(toString(ek.caller))
703- let ew = ev._1
704- let ex = ev._2
705- let ey = ev._3
706- let ez = ev._4
707- let eA = if ((ew > 0))
708- then Z
709- else Y
710- let eB = (eA == Y)
711- let eC = am(eh, et)
712- let eD = cw(toString(ek.caller), ag)
713- let eE = eD._1
714- let cK = eD._2
715- let eF = if ((eE > eC))
740+ let eL = bt(toString(eA.caller))
741+ let eM = eL._1
742+ let eN = eL._2
743+ let eO = eL._3
744+ let eP = eL._4
745+ let eQ = if ((eM > 0))
746+ then ab
747+ else aa
748+ let eR = (eQ == aa)
749+ let eS = ao(ex, eJ)
750+ let eT = cP(toString(eA.caller), ai)
751+ let eU = eT._1
752+ let cU = eT._2
753+ let eV = if ((eU > eS))
716754 then {
717- let eG = bD(eB, eC)
718- let cZ = eG._1
719- let bG = eG._2
720- let bH = eG._3
721- let de = eG._4
722- let df = eG._5
723- let eH = an(cZ)
724- if (if ((eu != 0))
725- then (eu > eH)
755+ let eW = bH(eR, eS)
756+ let dk = eW._1
757+ let bK = eW._2
758+ let bL = eW._3
759+ let ds = eW._4
760+ let dt = eW._5
761+ let eX = ap(dk)
762+ if (if ((eK != 0))
763+ then (eK > eX)
726764 else false)
727- then throw(((("Too little base asset exchanged, got " + toString(eH)) + " expected ") + toString(eu)))
765+ then throw(((("Too little base asset exchanged, got " + toString(eX)) + " expected ") + toString(eK)))
728766 else {
729- let da = ak(am(cK, eH), an(ew))
730- let eI = bU(ew, ex, ez, da)
731- let cd = eI._1
732- let ce = eI._2
733- let bZ = eI._3
734- let dd = eC
735- let eJ = (cK - da)
736- let eK = if ((ew > 0))
737- then ((eE - dd) - eJ)
738- else ((eJ + eE) - dd)
739- let eL = (ew + cZ)
740- $Tuple11(eL, cd, an(eK), bn(eL), bH, bG, de, df, (aV() - eC), (bh() - (if ((eL > 0))
741- then an(cZ)
742- else 0)), (bg() - (if ((0 > eL))
743- then an(cZ)
767+ let dp = am(ao(cU, eX), ap(eM))
768+ let eY = bY(eM, eN, eP, dp)
769+ let ch = eY._1
770+ let ci = eY._2
771+ let cd = eY._3
772+ let dl = eS
773+ let eZ = (cU - dp)
774+ let fa = if ((eM > 0))
775+ then ((eU - dl) - eZ)
776+ else ((eZ + eU) - dl)
777+ let fb = (eM + dk)
778+ $Tuple11(fb, ch, ap(fa), br(fb), bL, bK, ds, dt, (aX() - eS), (bl() - (if ((fb > 0))
779+ then ap(dk)
780+ else 0)), (bk() - (if ((0 > fb))
781+ then ap(dk)
744782 else 0)))
745783 }
746784 }
747785 else throw("Close position first")
748- let eL = eF._1
749- let eM = eF._2
750- let eN = eF._3
751- let eO = eF._4
752- let bH = eF._5
753- let bG = eF._6
754- let de = eF._7
755- let df = eF._8
756- let di = eF._9
757- let dg = eF._10
758- let dh = eF._11
759- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), eN], nil)
760- if ((eP == eP))
761- then (dN(toString(ek.caller), eL, eM, eN, eO) ++ dZ(bG, bH, de, df, di, dg, dh))
786+ let fb = eV._1
787+ let fc = eV._2
788+ let fd = eV._3
789+ let fe = eV._4
790+ let bL = eV._5
791+ let bK = eV._6
792+ let ds = eV._7
793+ let dt = eV._8
794+ let dw = eV._9
795+ let du = eV._10
796+ let dv = eV._11
797+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil)
798+ if ((ff == ff))
799+ then (ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv))
762800 else throw("Strict value is not equal to itself.")
763801 }
764802
765803
766804
767-@Callable(ek)
768-func increasePosition (eA,et,eu) = {
769- let eQ = ek.payments[0].amount
770- if (if (if (if (if (if (if ((eA != Y))
771- then (eA != Z)
805+@Callable(eA)
806+func increasePosition (eQ,eJ,eK) = {
807+ let fg = eA.payments[0].amount
808+ if (if (if (if (if (if (if ((eQ != aa))
809+ then (eQ != ab)
772810 else false)
773811 then true
774- else (0 >= eQ))
812+ else (0 >= fg))
775813 then true
776- else !(bv()))
814+ else !(bz()))
777815 then true
778- else (ek.payments[0].assetId != T()))
816+ else (eA.payments[0].assetId != V()))
779817 then true
780- else !(bi(ak(ad, et), aQ(), true)))
818+ else !(bm(am(af, eJ), aS(), true)))
781819 then true
782- else bw())
820+ else bA())
783821 then throw("Invalid increasePosition parameters")
784822 else {
785- let eR = am(eQ, aP())
786- let eh = (eQ - eR)
787- let eS = bp(toString(ek.caller))
788- let ew = eS._1
789- let ex = eS._2
790- let ey = eS._3
791- let ez = eS._4
792- let eT = (ew == 0)
793- let eU = if ((ew > 0))
794- then (eA == Y)
795- else (eA == Z)
796- let eV = if (!(eT))
797- then eU
823+ let fh = ao(fg, aR())
824+ let ex = (fg - fh)
825+ let fi = bt(toString(eA.caller))
826+ let eM = fi._1
827+ let eN = fi._2
828+ let eO = fi._3
829+ let eP = fi._4
830+ let fj = (eM == 0)
831+ let fk = if ((eM > 0))
832+ then (eQ == aa)
833+ else (eQ == ab)
834+ let fl = if (!(fj))
835+ then fk
798836 else false
799- let eB = (eA == Y)
800- let eW = if (if (eT)
837+ let eR = (eQ == aa)
838+ let fm = if (if (fj)
801839 then true
802- else eV)
840+ else fl)
803841 then {
804- let eC = am(eh, et)
805- let eX = bD(eB, eC)
806- let bJ = eX._1
807- let bG = eX._2
808- let bH = eX._3
809- let de = eX._4
810- let df = eX._5
811- if (if ((eu != 0))
812- then (eu > an(bJ))
842+ let eS = ao(ex, eJ)
843+ let fn = bH(eR, eS)
844+ let bN = fn._1
845+ let bK = fn._2
846+ let bL = fn._3
847+ let ds = fn._4
848+ let dt = fn._5
849+ if (if ((eK != 0))
850+ then (eK > ap(bN))
813851 else false)
814- then throw(((("Limit error: " + toString(an(bJ))) + " < ") + toString(eu)))
852+ then throw(((("Limit error: " + toString(ap(bN))) + " < ") + toString(eK)))
815853 else {
816- let eL = (ew + bJ)
817- let eY = ak(eC, et)
818- let eZ = bU(ew, ex, ez, eY)
819- let cd = eZ._1
820- let cH = eZ._2
821- let cI = eZ._3
822- $Tuple11(eL, cd, (ey + eC), bn(eL), bH, bG, de, df, (aV() + eC), (bh() + (if ((eL > 0))
823- then an(bJ)
824- else 0)), (bg() + (if ((0 > eL))
825- then an(bJ)
826- else 0)))
854+ let fb = (eM + bN)
855+ let fo = am(eS, eJ)
856+ let fp = bY(eM, eN, eP, fo)
857+ let ch = fp._1
858+ let cM = fp._2
859+ let cN = fp._3
860+ if (!(cx(bK, bL)))
861+ then throw("Over max spread limit")
862+ else $Tuple11(fb, ch, (eO + eS), br(fb), bL, bK, ds, dt, (aX() + eS), (bl() + (if ((fb > 0))
863+ then ap(bN)
864+ else 0)), (bk() + (if ((0 > fb))
865+ then ap(bN)
866+ else 0)))
827867 }
828868 }
829869 else {
830- let eC = am(eh, et)
831- let fa = cw(toString(ek.caller), ag)
832- let eE = fa._1
833- let cK = fa._2
834- if ((eE > eC))
870+ let eS = ao(ex, eJ)
871+ let fq = cP(toString(eA.caller), ai)
872+ let eU = fq._1
873+ let cU = fq._2
874+ if ((eU > eS))
835875 then throw("Use decreasePosition to decrease position size")
836876 else throw("Close position first")
837877 }
838- let eL = eW._1
839- let eM = eW._2
840- let eN = eW._3
841- let eO = eW._4
842- let bH = eW._5
843- let bG = eW._6
844- let de = eW._7
845- let df = eW._8
846- let di = eW._9
847- let dg = eW._10
848- let dh = eW._11
849- let fb = (eR / 2)
850- let fc = (eR - fb)
851- let fd = invoke(U(), "lockNeutrinoSP", [toString(V()), af], [AttachedPayment(T(), eh)])
852- if ((fd == fd))
878+ let fb = fm._1
879+ let fc = fm._2
880+ let fd = fm._3
881+ let fe = fm._4
882+ let bL = fm._5
883+ let bK = fm._6
884+ let ds = fm._7
885+ let dt = fm._8
886+ let dw = fm._9
887+ let du = fm._10
888+ let dv = fm._11
889+ let fr = (fh / 2)
890+ let fs = (fh - fr)
891+ let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)])
892+ if ((ft == ft))
853893 then {
854- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
855- if ((fe == fe))
894+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
895+ if ((fu == fu))
856896 then {
857- let ff = invoke(X(), "notifyFees", [toString(ek.caller), eR], nil)
858- if ((ff == ff))
897+ let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil)
898+ if ((fv == fv))
859899 then {
860- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), eN], nil)
861- if ((eP == eP))
862- then (((dN(toString(ek.caller), eL, eM, eN, eO) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ el(fb)) ++ ej((aO() + eh)))
900+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil)
901+ if ((ff == ff))
902+ then (((ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ eB(fr)) ++ ez((aQ() + ex)))
863903 else throw("Strict value is not equal to itself.")
864904 }
865905 else throw("Strict value is not equal to itself.")
872912
873913
874914
875-@Callable(ek)
915+@Callable(eA)
876916 func addMargin () = {
877- let eQ = ek.payments[0].amount
878- if (if (if (if ((ek.payments[0].assetId != T()))
917+ let fg = eA.payments[0].amount
918+ if (if (if (if ((eA.payments[0].assetId != V()))
879919 then true
880- else !(bu(toString(ek.caller))))
920+ else !(by(toString(eA.caller))))
881921 then true
882- else !(bv()))
922+ else !(bz()))
883923 then true
884- else bw())
924+ else bA())
885925 then throw("Invalid addMargin parameters")
886926 else {
887- let eR = am(eQ, aP())
888- let eh = (eQ - eR)
889- let fg = bp(toString(ek.caller))
890- let ew = fg._1
891- let ex = fg._2
892- let ey = fg._3
893- let ez = fg._4
894- let fb = (eR / 2)
895- let fc = (eR - fb)
896- let fd = invoke(U(), "lockNeutrinoSP", [toString(V()), af], [AttachedPayment(T(), eh)])
897- if ((fd == fd))
927+ let fh = ao(fg, aR())
928+ let ex = (fg - fh)
929+ let fw = bt(toString(eA.caller))
930+ let eM = fw._1
931+ let eN = fw._2
932+ let eO = fw._3
933+ let eP = fw._4
934+ let fr = (fh / 2)
935+ let fs = (fh - fr)
936+ let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)])
937+ if ((ft == ft))
898938 then {
899- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
900- if ((fe == fe))
939+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
940+ if ((fu == fu))
901941 then {
902- let ff = invoke(X(), "notifyFees", [toString(ek.caller), eR], nil)
903- if ((ff == ff))
904- then ((dN(toString(ek.caller), ew, (ex + eh), ey, ez) ++ el(fb)) ++ ej((aO() + eh)))
942+ let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil)
943+ if ((fv == fv))
944+ then ((ed(toString(eA.caller), eM, (eN + ex), eO, eP) ++ eB(fr)) ++ ez((aQ() + ex)))
905945 else throw("Strict value is not equal to itself.")
906946 }
907947 else throw("Strict value is not equal to itself.")
912952
913953
914954
915-@Callable(ek)
916-func removeMargin (eh) = if (if (if (if ((0 >= eh))
955+@Callable(eA)
956+func removeMargin (ex) = if (if (if (if ((0 >= ex))
917957 then true
918- else !(bu(toString(ek.caller))))
958+ else !(by(toString(eA.caller))))
919959 then true
920- else !(bv()))
960+ else !(bz()))
921961 then true
922- else bw())
962+ else bA())
923963 then throw("Invalid removeMargin parameters")
924964 else {
925- let fh = bp(toString(ek.caller))
926- let ew = fh._1
927- let ex = fh._2
928- let ey = fh._3
929- let ez = fh._4
930- let fi = -(eh)
931- let fj = bU(ew, ex, ez, fi)
932- let cd = fj._1
933- let ce = fj._2
934- if ((ce != 0))
965+ let fx = bt(toString(eA.caller))
966+ let eM = fx._1
967+ let eN = fx._2
968+ let eO = fx._3
969+ let eP = fx._4
970+ let fy = -(ex)
971+ let fz = bY(eM, eN, eP, fy)
972+ let ch = fz._1
973+ let ci = fz._2
974+ if ((ci != 0))
935975 then throw("Invalid removed margin amount")
936976 else {
937- let fk = cL(cd, ce, ey)
938- if (!(bi(fk, aQ(), true)))
939- then throw(((("Too much margin removed: " + toString(fk)) + " < ") + toString(aQ())))
977+ let fA = cV(ch, ci, eO)
978+ if (!(bm(fA, aS(), true)))
979+ then throw(((("Too much margin removed: " + toString(fA)) + " < ") + toString(aS())))
940980 else {
941- let fl = invoke(U(), "unlockNeutrino", [eh, toBase58String(T())], nil)
942- if ((fl == fl))
943- then ((dN(toString(ek.caller), ew, cd, ey, bn(ew)) ++ eg(ek.caller, eh)) ++ ej((aO() - eh)))
981+ let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil)
982+ if ((fB == fB))
983+ then ((ed(toString(eA.caller), eM, ch, eO, br(eM)) ++ ew(eA.caller, ex)) ++ ez((aQ() - ex)))
944984 else throw("Strict value is not equal to itself.")
945985 }
946986 }
948988
949989
950990
951-@Callable(ek)
952-func closePosition () = if (if (if (!(bu(toString(ek.caller))))
991+@Callable(eA)
992+func closePosition () = if (if (if (!(by(toString(eA.caller))))
953993 then true
954- else !(bv()))
994+ else !(bz()))
955995 then true
956- else bw())
996+ else bA())
957997 then throw("Invalid closePosition parameters")
958998 else {
959- let fm = cV(toString(ek.caller), true)
960- let cH = fm._1
961- let fn = fm._2
962- let da = fm._3
963- let db = fm._4
964- let bG = fm._5
965- let bH = fm._6
966- let de = fm._7
967- let df = fm._8
968- let di = fm._9
969- let cI = fm._10
970- let dg = fm._11
971- let dh = fm._12
972- if ((fn > 0))
999+ let fC = dm(toString(eA.caller), true)
1000+ let cM = fC._1
1001+ let fD = fC._2
1002+ let dp = fC._3
1003+ let dq = fC._4
1004+ let bK = fC._5
1005+ let bL = fC._6
1006+ let ds = fC._7
1007+ let dt = fC._8
1008+ let dw = fC._9
1009+ let cN = fC._10
1010+ let du = fC._11
1011+ let dv = fC._12
1012+ if ((fD > 0))
9731013 then throw("Unable to close position with bad debt")
9741014 else {
975- let fo = an(db)
976- let fp = (aO() - fo)
977- let fq = if ((0 > fp))
978- then $Tuple2(0, an(fp))
979- else $Tuple2(fp, 0)
980- let fr = fq._1
981- let fs = fq._2
982- let ft = if ((fs > 0))
1015+ let fE = ap(dq)
1016+ let fF = (aQ() - fE)
1017+ let fG = if ((0 > fF))
1018+ then $Tuple2(0, ap(fF))
1019+ else $Tuple2(fF, 0)
1020+ let fH = fG._1
1021+ let fI = fG._2
1022+ let fJ = if ((fI > 0))
9831023 then {
984- let fu = invoke(W(), "withdraw", [fs], nil)
985- if ((fu == fu))
1024+ let fK = invoke(Y(), "withdraw", [fI], nil)
1025+ if ((fK == fK))
9861026 then nil
9871027 else throw("Strict value is not equal to itself.")
9881028 }
9891029 else nil
990- if ((ft == ft))
1030+ if ((fJ == fJ))
9911031 then {
992- let fl = invoke(U(), "unlockNeutrino", [(fo - fs), toBase58String(T())], nil)
993- if ((fl == fl))
1032+ let fB = invoke(W(), "unlockNeutrino", [(fE - fI), toBase58String(V())], nil)
1033+ if ((fB == fB))
9941034 then {
995- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), 0], nil)
996- if ((eP == eP))
997- then (((ef(toString(ek.caller)) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ eg(ek.caller, fo)) ++ ej(fr))
1035+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), 0], nil)
1036+ if ((ff == ff))
1037+ then (((ev(toString(eA.caller)) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fE)) ++ ez(fH))
9981038 else throw("Strict value is not equal to itself.")
9991039 }
10001040 else throw("Strict value is not equal to itself.")
10051045
10061046
10071047
1008-@Callable(ek)
1009-func liquidate (bq) = {
1010- let fv = cP(bq, ag)
1011- let fk = if (ct())
1048+@Callable(eA)
1049+func liquidate (bu) = {
1050+ let fL = cZ(bu, ai)
1051+ let fA = if (cD())
10121052 then {
1013- let fw = cP(bq, ah)
1014- ao(fv, fw)
1053+ let fM = cZ(bu, aj)
1054+ aq(fL, fM)
10151055 }
1016- else fv
1017- if (if (if (if (!(bi(fk, ba(), false)))
1056+ else fL
1057+ if (if (if (if (!(bm(fA, bc(), false)))
10181058 then true
1019- else !(bu(bq)))
1059+ else !(by(bu)))
10201060 then true
1021- else !(bv()))
1061+ else !(bz()))
10221062 then true
1023- else bw())
1063+ else bA())
10241064 then throw("Unable to liquidate")
1065+ else if (if (if ((fL > bd()))
1066+ then (be() > 0)
1067+ else false)
1068+ then (af > be())
1069+ else false)
1070+ then {
1071+ let fN = bt(bu)
1072+ let eM = fN._1
1073+ let eN = fN._2
1074+ let eO = fN._3
1075+ let eP = fN._4
1076+ let eQ = if ((eM > 0))
1077+ then ab
1078+ else aa
1079+ let eR = (eQ == aa)
1080+ let dl = df(bu, eM)
1081+ let fO = cP(bu, ai)
1082+ let eU = fO._1
1083+ let cU = fO._2
1084+ let fP = bH(eR, dl)
1085+ let dk = fP._1
1086+ let bK = fP._2
1087+ let bL = fP._3
1088+ let ds = fP._4
1089+ let dt = fP._5
1090+ let dp = am(ao(cU, ap(dk)), ap(eM))
1091+ let fQ = bY(eM, eN, eP, dp)
1092+ let ch = fQ._1
1093+ let ci = fQ._2
1094+ let cd = fQ._3
1095+ let eZ = (cU - dp)
1096+ let fa = if ((eM > 0))
1097+ then ((eU - dl) - eZ)
1098+ else ((eZ + eU) - dl)
1099+ let fR = ao(dl, bd())
1100+ let fS = (fR / 2)
1101+ let fs = (fR - fS)
1102+ let fT = (ch - fR)
1103+ let fb = (eM + dk)
1104+ let fd = ap(fa)
1105+ let fU = br(fb)
1106+ let dw = (aX() - dl)
1107+ let fF = (aQ() - fR)
1108+ let fV = if ((0 > fF))
1109+ then $Tuple2(0, ap(fF))
1110+ else $Tuple2(fF, 0)
1111+ let fW = fV._1
1112+ let fX = fV._2
1113+ let fJ = if ((fX > 0))
1114+ then {
1115+ let fK = invoke(Y(), "withdraw", [fX], nil)
1116+ if ((fK == fK))
1117+ then nil
1118+ else throw("Strict value is not equal to itself.")
1119+ }
1120+ else nil
1121+ if ((fJ == fJ))
1122+ then {
1123+ let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil)
1124+ if ((fB == fB))
1125+ then {
1126+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
1127+ if ((fu == fu))
1128+ then {
1129+ let ff = invoke(Z(), "notifyNotional", [bu, fd], nil)
1130+ if ((ff == ff))
1131+ then (((ed(bu, fb, fT, fd, fU) ++ ep(bK, bL, ds, dt, dw, (bl() - (if ((fb > 0))
1132+ then ap(dk)
1133+ else 0)), (bk() - (if ((0 > fb))
1134+ then ap(dk)
1135+ else 0)))) ++ ew(eA.caller, fS)) ++ ez(fW))
1136+ else throw("Strict value is not equal to itself.")
1137+ }
1138+ else throw("Strict value is not equal to itself.")
1139+ }
1140+ else throw("Strict value is not equal to itself.")
1141+ }
1142+ else throw("Strict value is not equal to itself.")
1143+ }
1144+ else {
1145+ let fY = dm(bu, false)
1146+ let cM = fY._1
1147+ let ci = fY._2
1148+ let cN = fY._3
1149+ let cO = fY._4
1150+ let bK = fY._5
1151+ let bL = fY._6
1152+ let ds = fY._7
1153+ let dt = fY._8
1154+ let dw = fY._9
1155+ let dl = fY._10
1156+ let du = fY._11
1157+ let dv = fY._12
1158+ let fR = ao(dl, bd())
1159+ let fS = (fR / 2)
1160+ let fs = (fR - fS)
1161+ let fF = (aQ() - fR)
1162+ let fZ = if ((0 > fF))
1163+ then $Tuple2(0, ap(fF))
1164+ else $Tuple2(fF, 0)
1165+ let fW = fZ._1
1166+ let fX = fZ._2
1167+ let fJ = if ((fX > 0))
1168+ then {
1169+ let fK = invoke(Y(), "withdraw", [fX], nil)
1170+ if ((fK == fK))
1171+ then nil
1172+ else throw("Strict value is not equal to itself.")
1173+ }
1174+ else nil
1175+ if ((fJ == fJ))
1176+ then {
1177+ let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil)
1178+ if ((fB == fB))
1179+ then {
1180+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
1181+ if ((fu == fu))
1182+ then {
1183+ let ff = invoke(Z(), "notifyNotional", [bu, 0], nil)
1184+ if ((ff == ff))
1185+ then (((ev(bu) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fS)) ++ ez(fW))
1186+ else throw("Strict value is not equal to itself.")
1187+ }
1188+ else throw("Strict value is not equal to itself.")
1189+ }
1190+ else throw("Strict value is not equal to itself.")
1191+ }
1192+ else throw("Strict value is not equal to itself.")
1193+ }
1194+ }
1195+
1196+
1197+
1198+@Callable(eA)
1199+func payFunding () = {
1200+ let ga = aY()
1201+ if (if (if ((ga > lastBlock.timestamp))
1202+ then true
1203+ else !(bz()))
1204+ then true
1205+ else bA())
1206+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(ga)))
10251207 else {
1026- let fx = cV(bq, false)
1027- let cH = fx._1
1028- let ce = fx._2
1029- let cI = fx._3
1030- let cJ = fx._4
1031- let bG = fx._5
1032- let bH = fx._6
1033- let de = fx._7
1034- let df = fx._8
1035- let di = fx._9
1036- let dd = fx._10
1037- let dg = fx._11
1038- let dh = fx._12
1039- let fy = am(dd, bb())
1040- let fz = (fy / 2)
1041- let fc = (fy - fz)
1042- let fp = (aO() - fy)
1043- let fA = if ((0 > fp))
1044- then $Tuple2(0, an(fp))
1045- else $Tuple2(fp, 0)
1046- let fB = fA._1
1047- let fC = fA._2
1048- let ft = if ((fC > 0))
1049- then {
1050- let fu = invoke(W(), "withdraw", [fC], nil)
1051- if ((fu == fu))
1052- then nil
1053- else throw("Strict value is not equal to itself.")
1054- }
1055- else nil
1056- if ((ft == ft))
1057- then {
1058- let fl = invoke(U(), "unlockNeutrino", [(fy - fC), toBase58String(T())], nil)
1059- if ((fl == fl))
1060- then {
1061- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
1062- if ((fe == fe))
1063- then {
1064- let eP = invoke(X(), "notifyNotional", [bq, 0], nil)
1065- if ((eP == eP))
1066- then (((ef(bq) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ eg(ek.caller, fz)) ++ ej(fB))
1067- else throw("Strict value is not equal to itself.")
1068- }
1069- else throw("Strict value is not equal to itself.")
1070- }
1071- else throw("Strict value is not equal to itself.")
1072- }
1073- else throw("Strict value is not equal to itself.")
1208+ let gb = cs()
1209+ let gc = dx()
1210+ let gd = (gc - gb)
1211+ let ge = if (if ((bk() == 0))
1212+ then true
1213+ else (bl() == 0))
1214+ then $Tuple2(0, 0)
1215+ else if ((0 > gd))
1216+ then {
1217+ let gf = am(ao(gd, ba()), ag)
1218+ let gg = am(ao(gf, bk()), bl())
1219+ $Tuple2(gf, gg)
1220+ }
1221+ else {
1222+ let gg = am(ao(gd, ba()), ag)
1223+ let gf = am(ao(gg, bl()), bk())
1224+ $Tuple2(gf, gg)
1225+ }
1226+ let gf = ge._1
1227+ let gg = ge._2
1228+ dX((ga + bb()), (bi() + gg), (bj() + gf), am(gg, gb), am(gf, gb))
10741229 }
10751230 }
10761231
10771232
10781233
1079-@Callable(ek)
1080-func payFunding () = {
1081- let fD = aW()
1082- if (if (if ((fD > lastBlock.timestamp))
1083- then true
1084- else !(bv()))
1085- then true
1086- else bw())
1087- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(fD)))
1088- else {
1089- let fE = cn()
1090- let fF = dj()
1091- let fG = (fF - fE)
1092- let fH = if (if ((bg() == 0))
1093- then true
1094- else (bh() == 0))
1095- then $Tuple2(0, 0)
1096- else if ((0 > fG))
1097- then {
1098- let fI = ak(am(fG, aY()), ae)
1099- let fJ = ak(am(fI, bg()), bh())
1100- $Tuple2(fI, fJ)
1101- }
1102- else {
1103- let fJ = ak(am(fG, aY()), ae)
1104- let fI = ak(am(fJ, bh()), bg())
1105- $Tuple2(fI, fJ)
1106- }
1107- let fI = fH._1
1108- let fJ = fH._2
1109- dH((fD + aZ()), (be() + fJ), (bf() + fI), ak(fJ, fE), ak(fI, fE))
1110- }
1234+@Callable(eA)
1235+func v_get (bu) = {
1236+ let gh = dm(bu, false)
1237+ let cM = gh._1
1238+ let cN = gh._2
1239+ let cO = gh._3
1240+ let gi = gh._4
1241+ throw((((ak(cN) + ak(cO)) + ak(gi)) + ak(de(bu))))
11111242 }
11121243
11131244
11141245
1115-@Callable(ek)
1116-func v_get (bq) = {
1117- let fK = cV(bq, false)
1118- let cH = fK._1
1119- let cI = fK._2
1120- let cJ = fK._3
1121- let fL = fK._4
1122- throw((((ai(cI) + ai(cJ)) + ai(fL)) + ai(cU(bq))))
1246+@Callable(eA)
1247+func view_calcRemainMarginWithFundingPayment (bu) = {
1248+ let gj = bt(bu)
1249+ let bx = gj._1
1250+ let cR = gj._2
1251+ let db = gj._3
1252+ let cT = gj._4
1253+ let gk = cP(bu, ai)
1254+ let cJ = gk._1
1255+ let cU = gk._2
1256+ let gl = bY(bx, cR, cT, cU)
1257+ let ch = gl._1
1258+ let ci = gl._2
1259+ let cd = gl._3
1260+ throw((((((ak(ch) + ak(cd)) + ak(de(bu))) + ak(cU)) + ak(ci)) + ak(cJ)))
11231261 }
11241262
11251263
11261264
1127-@Callable(ek)
1128-func view_calcRemainMarginWithFundingPayment (bq) = {
1129- let fM = bp(bq)
1130- let bt = fM._1
1131- let cz = fM._2
1132- let cR = fM._3
1133- let cB = fM._4
1134- let fN = cw(bq, ag)
1135- let cE = fN._1
1136- let cK = fN._2
1137- let fO = bU(bt, cz, cB, cK)
1138- let cd = fO._1
1139- let ce = fO._2
1140- let bZ = fO._3
1141- throw(((((ai(cd) + ai(bZ)) + ai(cU(bq))) + ai(cK)) + ai(ce)))
1142- }
1143-
1144-
1145-
1146-@Callable(ek)
1147-func forceMoveAsset (bq,eh) = if (if ((addressFromPublicKey(S()) != ek.caller))
1265+@Callable(eA)
1266+func forceMoveAsset (bu,ex) = if (if ((addressFromPublicKey(U()) != eA.caller))
11481267 then true
1149- else (0 > eh))
1268+ else (0 > ex))
11501269 then throw("Invalid forceMoveAsset parameters")
11511270 else {
1152- let fl = invoke(U(), "unlockNeutrino", [eh, toBase58String(T())], nil)
1153- if ((fl == fl))
1154- then (eg(addressFromStringValue(bq), eh) ++ ej((aO() - eh)))
1271+ let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil)
1272+ if ((fB == fB))
1273+ then (ew(addressFromStringValue(bu), ex) ++ ez((aQ() - ex)))
11551274 else throw("Strict value is not equal to itself.")
11561275 }
11571276
11581277
1159-@Verifier(fP)
1160-func fQ () = sigVerify(fP.bodyBytes, fP.proofs[0], S())
1278+@Verifier(gm)
1279+func gn () = sigVerify(gm.bodyBytes, gm.proofs[0], U())
11611280
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_initialized"
2121
2222 let j = "k_paused"
2323
2424 let k = "k_fee"
2525
2626 let l = "k_fundingPeriod"
2727
2828 let m = "k_initMarginRatio"
2929
3030 let n = "k_mmr"
3131
3232 let o = "k_liquidationFeeRatio"
3333
34-let p = "k_spreadLimit"
34+let p = "k_partLiquidationRatio"
3535
36-let q = "k_maxPriceImpact"
36+let q = "k_spreadLimit"
3737
38-let r = "k_lastDataStr"
38+let r = "k_maxPriceImpact"
3939
40-let s = "k_lastMinuteId"
40+let s = "k_maxPriceSpread"
4141
42-let t = "k_twapDataLastCumulativePrice"
42+let t = "k_lastDataStr"
4343
44-let u = "k_twapDataLastPrice"
44+let u = "k_lastMinuteId"
4545
46-let v = "k_twapDataPreviousMinuteId"
46+let v = "k_twapDataLastCumulativePrice"
4747
48-let w = "k_latestLongPremiumFraction"
48+let w = "k_twapDataLastPrice"
4949
50-let x = "k_latestShortPremiumFraction"
50+let x = "k_twapDataPreviousMinuteId"
5151
52-let y = "k_nextFundingBlockMinTimestamp"
52+let y = "k_latestLongPremiumFraction"
5353
54-let z = "k_longFundingRate"
54+let z = "k_latestShortPremiumFraction"
5555
56-let A = "k_shortFundingRate"
56+let A = "k_nextFundingBlockMinTimestamp"
5757
58-let B = "k_qtAstR"
58+let B = "k_longFundingRate"
5959
60-let C = "k_bsAstR"
60+let C = "k_shortFundingRate"
6161
62-let D = "k_totalPositionSize"
62+let D = "k_qtAstR"
6363
64-let E = "k_totalLongPositionSize"
64+let E = "k_bsAstR"
6565
66-let F = "k_totalShortPositionSize"
66+let F = "k_totalPositionSize"
6767
68-let G = "k_cumulativeNotional"
68+let G = "k_totalLongPositionSize"
6969
70-let H = "k_openInterestNotional"
70+let H = "k_totalShortPositionSize"
7171
72-let I = "k_coordinatorAddress"
72+let I = "k_cumulativeNotional"
7373
74-let J = "k_insurance_address"
74+let J = "k_openInterestNotional"
7575
76-let K = "k_admin_address"
76+let K = "k_coordinatorAddress"
7777
78-let L = "k_admin_public_key"
78+let L = "k_insurance_address"
7979
80-let M = "k_quote_asset"
80+let M = "k_admin_address"
8181
82-let N = "k_quote_staking"
82+let N = "k_admin_public_key"
8383
84-let O = "k_staking_address"
84+let O = "k_quote_asset"
8585
86-let P = "k_miner_address"
86+let P = "k_quote_staking"
8787
88-func Q () = valueOrErrorMessage(addressFromString(getStringValue(this, I)), "Coordinator not set")
88+let Q = "k_staking_address"
89+
90+let R = "k_miner_address"
91+
92+func S () = valueOrErrorMessage(addressFromString(getStringValue(this, K)), "Coordinator not set")
8993
9094
91-func R () = addressFromString(getStringValue(Q(), K))
95+func T () = addressFromString(getStringValue(S(), M))
9296
9397
94-func S () = fromBase58String(getStringValue(Q(), L))
98+func U () = fromBase58String(getStringValue(S(), N))
9599
96100
97-func T () = fromBase58String(getStringValue(Q(), M))
101+func V () = fromBase58String(getStringValue(S(), O))
98102
99103
100-func U () = valueOrErrorMessage(addressFromString(getStringValue(Q(), N)), "Quote asset staking not set")
104+func W () = valueOrErrorMessage(addressFromString(getStringValue(S(), P)), "Quote asset staking not set")
101105
102106
103-func V () = valueOrErrorMessage(addressFromString(getStringValue(Q(), O)), "Insurance not set")
107+func X () = valueOrErrorMessage(addressFromString(getStringValue(S(), Q)), "Insurance not set")
104108
105109
106-func W () = valueOrErrorMessage(addressFromString(getStringValue(Q(), J)), "Insurance not set")
110+func Y () = valueOrErrorMessage(addressFromString(getStringValue(S(), L)), "Insurance not set")
107111
108112
109-func X () = valueOrErrorMessage(addressFromString(getStringValue(Q(), P)), "Insurance not set")
113+func Z () = valueOrErrorMessage(addressFromString(getStringValue(S(), R)), "Insurance not set")
110114
111115
112-let Y = 1
116+let aa = 1
113117
114-let Z = 2
118+let ab = 2
115119
116-let aa = 15
120+let ac = 15
117121
118-let ab = 15
122+let ad = 15
119123
120-let ac = 1000
124+let ae = 1000
121125
122-let ad = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
126+let af = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
123127
124-let ae = (86400 * ad)
128+let ag = (86400 * af)
125129
126-let af = 100
130+let ah = 100
127131
128-let ag = 1
132+let ai = 1
129133
130-let ah = 2
134+let aj = 2
131135
132-func ai (aj) = (toString(aj) + ",")
136+func ak (al) = (toString(al) + ",")
133137
134138
135-func ak (aj,al) = fraction(aj, ad, al, HALFEVEN)
139+func am (al,an) = fraction(al, af, an, HALFEVEN)
136140
137141
138-func am (aj,al) = fraction(aj, al, ad, HALFEVEN)
142+func ao (al,an) = fraction(al, an, af, HALFEVEN)
139143
140144
141-func an (aj) = if ((aj > 0))
142- then aj
143- else -(aj)
145+func ap (al) = if ((al > 0))
146+ then al
147+ else -(al)
144148
145149
146-func ao (aj,al) = if ((aj >= al))
147- then aj
148- else al
150+func aq (al,an) = if ((al >= an))
151+ then al
152+ else an
149153
150154
151-func ap (aq,ar) = ((aq + "_") + ar)
155+func ar (as,at) = ((as + "_") + at)
152156
153157
154-func as (at) = {
155- func au (av,aw) = ((av + aw) + ",")
158+func au (av) = {
159+ func aw (ax,ay) = ((ax + ay) + ",")
156160
157- let ax = {
158- let ay = at
159- let az = size(ay)
160- let aA = ""
161- func aB (aC,aD) = if ((aD >= az))
162- then aC
163- else au(aC, ay[aD])
161+ let az = {
162+ let aA = av
163+ let aB = size(aA)
164+ let aC = ""
165+ func aD (aE,aF) = if ((aF >= aB))
166+ then aE
167+ else aw(aE, aA[aF])
164168
165- func aE (aC,aD) = if ((aD >= az))
166- then aC
169+ func aG (aE,aF) = if ((aF >= aB))
170+ then aE
167171 else throw("List size exceeds 20")
168172
169- aE(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aA, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
173+ aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
170174 }
171- let aF = dropRight(ax, 1)
172- let aG = if ((take(aF, 1) == ","))
173- then drop(aF, 1)
174- else aF
175- aG
175+ let aH = dropRight(az, 1)
176+ let aI = if ((take(aH, 1) == ","))
177+ then drop(aH, 1)
178+ else aH
179+ aI
176180 }
177181
178182
179-func aH (aI) = split(aI, ",")
183+func aJ (aK) = split(aK, ",")
180184
181185
182-func aJ (at,aK,aL) = if ((size(at) > aK))
183- then (removeByIndex(at, 0) :+ aL)
184- else (at :+ aL)
186+func aL (av,aM,aN) = if ((size(av) > aM))
187+ then (removeByIndex(av, 0) :+ aN)
188+ else (av :+ aN)
185189
186190
187-func aM (aN) = valueOrErrorMessage(getInteger(this, aN), ("no value for " + aN))
191+func aO (aP) = valueOrErrorMessage(getInteger(this, aP), ("no value for " + aP))
188192
189193
190-func aO () = aM(d)
194+func aQ () = aO(d)
191195
192196
193-func aP () = aM(k)
197+func aR () = aO(k)
194198
195199
196-func aQ () = aM(m)
200+func aS () = aO(m)
197201
198202
199-func aR () = aM(B)
203+func aT () = aO(D)
200204
201205
202-func aS () = aM(C)
206+func aU () = aO(E)
203207
204208
205-func aT () = aM(D)
209+func aV () = aO(F)
206210
207211
208-func aU () = aM(G)
212+func aW () = aO(I)
209213
210214
211-func aV () = aM(H)
215+func aX () = aO(J)
212216
213217
214-func aW () = aM(y)
218+func aY () = aO(A)
215219
216220
217-func aX () = aM(l)
221+func aZ () = aO(l)
218222
219223
220-func aY () = (aX() * ad)
224+func ba () = (aZ() * af)
221225
222226
223-func aZ () = (aX() * ac)
227+func bb () = (aZ() * ae)
224228
225229
226-func ba () = aM(n)
230+func bc () = aO(n)
227231
228232
229-func bb () = aM(o)
233+func bd () = aO(o)
230234
231235
232-func bc () = aM(p)
236+func be () = aO(p)
233237
234238
235-func bd () = aM(q)
239+func bf () = aO(q)
236240
237241
238-func be () = aM(w)
242+func bg () = aO(r)
239243
240244
241-func bf () = aM(x)
245+func bh () = aO(s)
242246
243247
244-func bg () = aM(F)
248+func bi () = aO(y)
245249
246250
247-func bh () = aM(E)
251+func bj () = aO(z)
248252
249253
250-func bi (bj,bk,bl) = {
251- let bm = (bj - bk)
252- if (if (bl)
253- then (0 > bm)
254+func bk () = aO(H)
255+
256+
257+func bl () = aO(G)
258+
259+
260+func bm (bn,bo,bp) = {
261+ let bq = (bn - bo)
262+ if (if (bp)
263+ then (0 > bq)
254264 else false)
255265 then throw("Invalid margin")
256- else if (if (!(bl))
257- then (bm >= 0)
266+ else if (if (!(bp))
267+ then (bq >= 0)
258268 else false)
259269 then throw("Invalid margin")
260270 else true
261271 }
262272
263273
264-func bn (bo) = if ((bo == 0))
274+func br (bs) = if ((bs == 0))
265275 then throw("Should not be called with _positionSize == 0")
266- else if ((bo > 0))
267- then be()
268- else bf()
276+ else if ((bs > 0))
277+ then bi()
278+ else bj()
269279
270280
271-func bp (bq) = {
272- let br = getInteger(this, ap(e, bq))
273- let bs = br
274- if ($isInstanceOf(bs, "Int"))
281+func bt (bu) = {
282+ let bv = getInteger(this, ar(e, bu))
283+ let bw = bv
284+ if ($isInstanceOf(bw, "Int"))
275285 then {
276- let bt = bs
277- $Tuple4(bt, getIntegerValue(this, ap(f, bq)), getIntegerValue(this, ap(g, bq)), getIntegerValue(this, ap(h, bq)))
286+ let bx = bw
287+ $Tuple4(bx, getIntegerValue(this, ar(f, bu)), getIntegerValue(this, ar(g, bu)), getIntegerValue(this, ar(h, bu)))
278288 }
279289 else $Tuple4(0, 0, 0, 0)
280290 }
281291
282292
283-func bu (bq) = if ((bp(bq)._1 == 0))
293+func by (bu) = if ((bt(bu)._1 == 0))
284294 then throw("No open position")
285295 else true
286296
287297
288-func bv () = valueOrElse(getBoolean(this, i), false)
298+func bz () = valueOrElse(getBoolean(this, i), false)
289299
290300
291-func bw () = valueOrElse(getBoolean(this, j), false)
301+func bA () = valueOrElse(getBoolean(this, j), false)
292302
293303
294-func bx (by,bz,bA) = if (by)
304+func bB (bC,bD,bE) = if (bC)
295305 then {
296- let bB = (aS() - bA)
297- if ((0 >= bB))
306+ let bF = (aU() - bE)
307+ if ((0 >= bF))
298308 then throw("Tx lead to base asset reserve <= 0, revert")
299- else $Tuple4((aR() + bz), bB, (aT() + bA), (aU() + bz))
309+ else $Tuple4((aT() + bD), bF, (aV() + bE), (aW() + bD))
300310 }
301311 else {
302- let bC = (aR() - bz)
303- if ((0 >= bC))
312+ let bG = (aT() - bD)
313+ if ((0 >= bG))
304314 then throw("Tx lead to base quote reserve <= 0, revert")
305- else $Tuple4(bC, (aS() + bA), (aT() - bA), (aU() - bz))
315+ else $Tuple4(bG, (aU() + bE), (aV() - bE), (aW() - bD))
306316 }
307317
308318
309-func bD (by,bz) = {
310- let bE = aR()
311- let bF = aS()
312- let aN = am(bE, bF)
313- let bG = if (by)
314- then (bE + bz)
315- else (bE - bz)
316- let bH = ak(aN, bG)
317- let bI = an((bH - bF))
318- let bJ = if (by)
319- then bI
320- else -(bI)
321- let bK = bx(by, bz, bI)
322- let bL = bK._1
323- let bM = bK._2
324- let bN = bK._3
325- let bO = bK._4
326- let bP = ak(bE, bF)
327- let bQ = ak(bz, bI)
328- let bR = an((bP - bQ))
329- let bS = (ad - ak(bP, (bP + bR)))
330- let bT = bd()
331- if ((bS > bT))
332- then throw(((((((((((((("Price impact " + toString(bS)) + " > max price impact ") + toString(bT)) + " before quote asset: ") + toString(bE)) + " before base asset: ") + toString(bF)) + " quote asset amount to exchange: ") + toString(bz)) + " price before: ") + toString(bP)) + " marketPrice: ") + toString(bQ)))
333- else $Tuple5(bJ, bL, bM, bN, bO)
319+func bH (bC,bD) = {
320+ let bI = aT()
321+ let bJ = aU()
322+ let aP = ao(bI, bJ)
323+ let bK = if (bC)
324+ then (bI + bD)
325+ else (bI - bD)
326+ let bL = am(aP, bK)
327+ let bM = ap((bL - bJ))
328+ let bN = if (bC)
329+ then bM
330+ else -(bM)
331+ let bO = bB(bC, bD, bM)
332+ let bP = bO._1
333+ let bQ = bO._2
334+ let bR = bO._3
335+ let bS = bO._4
336+ let bT = am(bI, bJ)
337+ let bU = am(bD, bM)
338+ let bV = ap((bT - bU))
339+ let bW = (af - am(bT, (bT + bV)))
340+ let bX = bg()
341+ if ((bW > bX))
342+ then throw(((((((((((((("Price impact " + toString(bW)) + " > max price impact ") + toString(bX)) + " before quote asset: ") + toString(bI)) + " before base asset: ") + toString(bJ)) + " quote asset amount to exchange: ") + toString(bD)) + " price before: ") + toString(bT)) + " marketPrice: ") + toString(bU)))
343+ else $Tuple5(bN, bP, bQ, bR, bS)
334344 }
335345
336346
337-func bU (bV,bW,bX,bY) = {
338- let bZ = if ((bV != 0))
347+func bY (bZ,ca,cb,cc) = {
348+ let cd = if ((bZ != 0))
339349 then {
340- let ca = bn(bV)
341- am((ca - bX), bV)
350+ let ce = br(bZ)
351+ ao((ce - cb), bZ)
342352 }
343353 else 0
344- let cb = ((bY - bZ) + bW)
345- let cc = if ((0 > cb))
346- then $Tuple2(0, an(cb))
347- else $Tuple2(an(cb), 0)
348- let cd = cc._1
349- let ce = cc._2
350- $Tuple3(cd, ce, bZ)
354+ let cf = ((cc - cd) + ca)
355+ let cg = if ((0 > cf))
356+ then $Tuple2(0, ap(cf))
357+ else $Tuple2(ap(cf), 0)
358+ let ch = cg._1
359+ let ci = cg._2
360+ $Tuple3(ch, ci, cd)
351361 }
352362
353363
354-func cf (by,bA,cg) = {
355- let ch = aR()
356- let ci = aS()
357- let bP = ak(ch, ci)
358- if ((bA == 0))
364+func cj (bC,bE,ck,cl,cm) = {
365+ let bT = am(cl, cm)
366+ if ((bE == 0))
359367 then throw("Invalid base asset amount")
360368 else {
361- let aN = am(ch, ci)
362- let cj = if (by)
363- then (ci + bA)
364- else (ci - bA)
365- let ck = ak(aN, cj)
366- let cl = an((ck - ch))
367- let bT = bd()
368- let cm = bx(!(by), cl, bA)
369- let bL = cm._1
370- let bM = cm._2
371- let bN = cm._3
372- let bO = cm._4
373- let bQ = ak(cl, bA)
374- let bR = an((bP - bQ))
375- let bS = (ad - ak(bP, (bP + bR)))
376- if (if ((bS > bT))
377- then cg
369+ let aP = ao(cl, cm)
370+ let cn = if (bC)
371+ then (cm + bE)
372+ else (cm - bE)
373+ let co = am(aP, cn)
374+ let cp = ap((co - cl))
375+ let bX = bg()
376+ let cq = bB(!(bC), cp, bE)
377+ let bP = cq._1
378+ let bQ = cq._2
379+ let bR = cq._3
380+ let bS = cq._4
381+ let bU = am(cp, bE)
382+ let bV = ap((bT - bU))
383+ let bW = (af - am(bT, (bT + bV)))
384+ if (if ((bW > bX))
385+ then ck
378386 else false)
379- then throw(((((((((((((("Price impact " + toString(bS)) + " > max price impact ") + toString(bT)) + " before quote asset: ") + toString(ch)) + " before base asset: ") + toString(ci)) + " base asset amount to exchange: ") + toString(bA)) + " price before: ") + toString(bP)) + " market price: ") + toString(bQ)))
380- else $Tuple7(cl, bL, bM, bN, bO, (bh() - (if (by)
381- then an(bA)
382- else 0)), (bg() - (if (!(by))
383- then an(bA)
384- else 0)))
387+ then throw(((((((((((((("Price impact " + toString(bW)) + " > max price impact ") + toString(bX)) + " before quote asset: ") + toString(cl)) + " before base asset: ") + toString(cm)) + " base asset amount to exchange: ") + toString(bE)) + " price before: ") + toString(bT)) + " market price: ") + toString(bU)))
388+ else $Tuple8(cp, bP, bQ, bR, bS, (bl() - (if (bC)
389+ then ap(bE)
390+ else 0)), (bk() - (if (!(bC))
391+ then ap(bE)
392+ else 0)), bW)
385393 }
386394 }
387395
388396
389-func cn () = {
390- let co = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
391- let cp = getStringValue(this, a)
392- let cq = getStringValue(this, b)
393- let cr = valueOrErrorMessage(getInteger(co, cp), ((("Can not get oracle price. Oracle: " + toString(co)) + " key: ") + cp))
394- cr
397+func cr (bC,bE,ck) = cj(bC, bE, ck, aT(), aU())
398+
399+
400+func cs () = {
401+ let ct = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
402+ let cu = getStringValue(this, a)
403+ let cv = getStringValue(this, b)
404+ let cw = valueOrErrorMessage(getInteger(ct, cu), ((("Can not get oracle price. Oracle: " + toString(ct)) + " key: ") + cu))
405+ cw
395406 }
396407
397408
398-func cs () = {
399- let ch = aR()
400- let ci = aS()
401- ak(ch, ci)
409+func cx (cl,cm) = {
410+ let cy = cs()
411+ let cz = am(cl, cm)
412+ let cA = am((cy + cz), (2 * af))
413+ let cB = am(ap((cy - cz)), cA)
414+ if ((cB > bh()))
415+ then throw(((("Price spread " + toString(cB)) + " > max price spread ") + toString(bh())))
416+ else true
402417 }
403418
404419
405-func ct () = {
406- let cu = cn()
407- let cv = cs()
408- (ak(an((cu - cv)), cu) > bc())
420+func cC () = {
421+ let cl = aT()
422+ let cm = aU()
423+ am(cl, cm)
409424 }
410425
411426
412-func cw (bq,cx) = {
413- let cy = bp(bq)
414- let bt = cy._1
415- let cz = cy._2
416- let cA = cy._3
417- let cB = cy._4
418- let cC = an(bt)
419- if ((cC == 0))
427+func cD () = {
428+ let cy = cs()
429+ let cE = cC()
430+ (am(ap((cy - cE)), cy) > bf())
431+ }
432+
433+
434+func cF (bs,cG,cl,cm) = {
435+ let cH = ap(bs)
436+ let cI = (0 > bs)
437+ let cJ = if ((cG == ai))
438+ then {
439+ let cK = cj(!(cI), cH, false, cl, cm)
440+ let cL = cK._1
441+ let cM = cK._2
442+ let cN = cK._3
443+ let cO = cK._4
444+ cL
445+ }
446+ else ao(cH, cs())
447+ cJ
448+ }
449+
450+
451+func cP (bu,cG) = {
452+ let cQ = bt(bu)
453+ let bx = cQ._1
454+ let cR = cQ._2
455+ let cS = cQ._3
456+ let cT = cQ._4
457+ if ((bx == 0))
420458 then throw("Invalid position size")
421459 else {
422- let cD = (0 > bt)
423- let cE = if ((cx == ag))
424- then {
425- let cF = cf(!(cD), cC, false)
426- let cG = cF._1
427- let cH = cF._2
428- let cI = cF._3
429- let cJ = cF._4
430- cG
431- }
432- else am(cC, cn())
433- let cK = if (cD)
434- then (cA - cE)
435- else (cE - cA)
436- $Tuple2(cE, cK)
460+ let cI = (0 > bx)
461+ let cJ = cF(bx, cG, aT(), aU())
462+ let cU = if (cI)
463+ then (cS - cJ)
464+ else (cJ - cS)
465+ $Tuple2(cJ, cU)
437466 }
438467 }
439468
440469
441-func cL (cM,cN,cO) = ak((cM - cN), cO)
470+func cV (cW,cX,cY) = am((cW - cX), cY)
442471
443472
444-func cP (bq,cx) = {
445- let cQ = bp(bq)
446- let bt = cQ._1
447- let cz = cQ._2
448- let cR = cQ._3
449- let cB = cQ._4
450- let cS = cw(bq, cx)
451- let cE = cS._1
452- let cK = cS._2
453- let cT = bU(bt, cz, cB, cK)
454- let cd = cT._1
455- let ce = cT._2
456- cL(cd, ce, cE)
473+func cZ (bu,cG) = {
474+ let da = bt(bu)
475+ let bx = da._1
476+ let cR = da._2
477+ let db = da._3
478+ let cT = da._4
479+ let dc = cP(bu, cG)
480+ let cJ = dc._1
481+ let cU = dc._2
482+ let dd = bY(bx, cR, cT, cU)
483+ let ch = dd._1
484+ let ci = dd._2
485+ cV(ch, ci, cJ)
457486 }
458487
459488
460-func cU (bq) = cP(bq, ag)
489+func de (bu) = cZ(bu, ai)
461490
462491
463-func cV (bq,cg) = {
464- let cW = bp(bq)
465- let bt = cW._1
466- let cz = cW._2
467- let cA = cW._3
468- let cB = cW._4
469- let cX = cw(bq, ag)
470- let cH = cX._1
471- let cK = cX._2
472- let cY = bU(bt, cz, cB, cK)
473- let cd = cY._1
474- let ce = cY._2
475- let cZ = -(bt)
476- let da = cK
477- let db = -(cd)
478- let dc = cf((bt > 0), an(bt), cg)
479- let dd = dc._1
480- let bG = dc._2
481- let bH = dc._3
482- let de = dc._4
483- let df = dc._5
484- let dg = dc._6
485- let dh = dc._7
486- let di = (aV() - cA)
487- $Tuple12(cZ, ce, da, db, bG, bH, de, df, di, dd, dg, dh)
492+func df (bu,bs) = {
493+ let dg = aq(be(), (af - am(de(bu), bc())))
494+ let dh = ao(ap(bs), dg)
495+ let di = cr((bs > 0), dh, false)
496+ let dj = di._1
497+ let bW = di._8
498+ if ((bg() > bW))
499+ then dj
500+ else {
501+ let dk = ao(ap(bs), be())
502+ let dl = cr((bs > 0), dk, false)._1
503+ dl
504+ }
488505 }
489506
490507
491-func dj () = {
492- let dk = ((lastBlock.timestamp / 1000) / 60)
493- let dl = (dk - aa)
494- let dm = valueOrElse(getString(this, r), "")
495- let dn = split(dm, ",")
496- func do (av,dp) = if ((dl >= parseIntValue(dp)))
497- then (av :+ parseIntValue(dp))
498- else av
499-
500- let dq = {
501- let ay = dn
502- let az = size(ay)
503- let aA = nil
504- func aB (aC,aD) = if ((aD >= az))
505- then aC
506- else do(aC, ay[aD])
507-
508- func aE (aC,aD) = if ((aD >= az))
509- then aC
510- else throw("List size exceeds 20")
511-
512- aE(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aB(aA, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
513- }
514- let dr = if ((size(dq) > 0))
515- then max(dq)
516- else parseIntValue(dn[0])
517- let ds = valueOrElse(getInteger(this, s), 0)
518- let dt = valueOrElse(getInteger(this, ((t + "_") + toString(ds))), 0)
519- let du = valueOrElse(getInteger(this, ((u + "_") + toString(ds))), 0)
520- let dv = (dt + ((dk - ds) * du))
521- let dw = valueOrElse(getInteger(this, ((t + "_") + toString(dr))), 0)
522- let dx = valueOrElse(getInteger(this, ((u + "_") + toString(dr))), 0)
523- let dy = (dw + ((dl - dr) * dx))
524- ((dv - dy) / aa)
508+func dm (bu,ck) = {
509+ let dn = bt(bu)
510+ let bx = dn._1
511+ let cR = dn._2
512+ let cS = dn._3
513+ let cT = dn._4
514+ let cU = cP(bu, ai)._2
515+ let do = bY(bx, cR, cT, cU)
516+ let ch = do._1
517+ let ci = do._2
518+ let dk = -(bx)
519+ let dp = cU
520+ let dq = -(ch)
521+ let dr = cr((bx > 0), ap(bx), ck)
522+ let dl = dr._1
523+ let bK = dr._2
524+ let bL = dr._3
525+ let ds = dr._4
526+ let dt = dr._5
527+ let du = dr._6
528+ let dv = dr._7
529+ let dw = (aX() - cS)
530+ $Tuple12(dk, ci, dp, dq, bK, bL, ds, dt, dw, dl, du, dv)
525531 }
526532
527533
528-func dz (dA,dB,dC,dD,dE,dF,dG) = [IntegerEntry(m, dA), IntegerEntry(n, dB), IntegerEntry(o, dC), IntegerEntry(l, dD), IntegerEntry(k, dE), IntegerEntry(p, dF), IntegerEntry(q, dG)]
534+func dx () = {
535+ let dy = ((lastBlock.timestamp / 1000) / 60)
536+ let dz = (dy - ac)
537+ let dA = valueOrElse(getString(this, t), "")
538+ let dB = split(dA, ",")
539+ func dC (ax,dD) = if ((dz >= parseIntValue(dD)))
540+ then (ax :+ parseIntValue(dD))
541+ else ax
542+
543+ let dE = {
544+ let aA = dB
545+ let aB = size(aA)
546+ let aC = nil
547+ func aD (aE,aF) = if ((aF >= aB))
548+ then aE
549+ else dC(aE, aA[aF])
550+
551+ func aG (aE,aF) = if ((aF >= aB))
552+ then aE
553+ else throw("List size exceeds 20")
554+
555+ aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
556+ }
557+ let dF = if ((size(dE) > 0))
558+ then max(dE)
559+ else parseIntValue(dB[0])
560+ let dG = valueOrElse(getInteger(this, u), 0)
561+ let dH = valueOrElse(getInteger(this, ((v + "_") + toString(dG))), 0)
562+ let dI = valueOrElse(getInteger(this, ((w + "_") + toString(dG))), 0)
563+ let dJ = (dH + ((dy - dG) * dI))
564+ let dK = valueOrElse(getInteger(this, ((v + "_") + toString(dF))), 0)
565+ let dL = valueOrElse(getInteger(this, ((w + "_") + toString(dF))), 0)
566+ let dM = (dK + ((dz - dF) * dL))
567+ ((dJ - dM) / ac)
568+ }
529569
530570
531-func dH (dI,dJ,dK,dL,dM) = [IntegerEntry(y, dI), IntegerEntry(w, dJ), IntegerEntry(x, dK), IntegerEntry(z, dL), IntegerEntry(A, dM)]
571+func dN (dO,dP,dQ,dR,dS,dT,dU,dV,dW) = [IntegerEntry(m, dO), IntegerEntry(n, dP), IntegerEntry(o, dQ), IntegerEntry(l, dR), IntegerEntry(k, dS), IntegerEntry(q, dT), IntegerEntry(r, dU), IntegerEntry(p, dV), IntegerEntry(s, dW)]
532572
533573
534-func dN (ar,dO,dP,dQ,ca) = [IntegerEntry(ap(e, ar), dO), IntegerEntry(ap(f, ar), dP), IntegerEntry(ap(g, ar), dQ), IntegerEntry(ap(h, ar), ca)]
574+func dX (dY,dZ,ea,eb,ec) = [IntegerEntry(A, dY), IntegerEntry(y, dZ), IntegerEntry(z, ea), IntegerEntry(B, eb), IntegerEntry(C, ec)]
535575
536576
537-func dR (dS) = {
538- let dk = ((lastBlock.timestamp / 1000) / 60)
539- let dT = valueOrElse(getInteger(this, s), 0)
540- if ((dT > dk))
577+func ed (at,ee,ef,eg,ce) = [IntegerEntry(ar(e, at), ee), IntegerEntry(ar(f, at), ef), IntegerEntry(ar(g, at), eg), IntegerEntry(ar(h, at), ce)]
578+
579+
580+func eh (ei) = {
581+ let dy = ((lastBlock.timestamp / 1000) / 60)
582+ let ej = valueOrElse(getInteger(this, u), 0)
583+ if ((ej > dy))
541584 then throw("TWAP out-of-order")
542585 else {
543- let ds = if ((dT == 0))
544- then dk
545- else dT
546- if ((dk > dT))
586+ let dG = if ((ej == 0))
587+ then dy
588+ else ej
589+ if ((dy > ej))
547590 then {
548- let dU = valueOrElse(getInteger(this, ((t + "_") + toString(dT))), 0)
549- let dV = valueOrElse(getInteger(this, ((u + "_") + toString(dT))), dS)
550- let dW = (dU + ((dk - ds) * dV))
551- let dn = aJ(aH(valueOrElse(getString(this, r), "")), aa, toString(dk))
552-[IntegerEntry(ap(t, toString(dk)), dW), IntegerEntry(ap(u, toString(dk)), dS), IntegerEntry(ap(v, toString(dk)), dT), IntegerEntry(s, dk), StringEntry(r, as(dn))]
591+ let ek = valueOrElse(getInteger(this, ((v + "_") + toString(ej))), 0)
592+ let el = valueOrElse(getInteger(this, ((w + "_") + toString(ej))), ei)
593+ let em = (ek + ((dy - dG) * el))
594+ let dB = aL(aJ(valueOrElse(getString(this, t), "")), ac, toString(dy))
595+[IntegerEntry(ar(v, toString(dy)), em), IntegerEntry(ar(w, toString(dy)), ei), IntegerEntry(ar(x, toString(dy)), ej), IntegerEntry(u, dy), StringEntry(t, au(dB))]
553596 }
554597 else {
555- let dX = valueOrElse(getInteger(this, ap(v, toString(dk))), 0)
556- let dU = valueOrElse(getInteger(this, ap(t, toString(dX))), 0)
557- let dV = valueOrElse(getInteger(this, ap(u, toString(dX))), dS)
558- let dW = (dU + ((dk - dX) * dV))
559-[IntegerEntry(ap(t, toString(dk)), dW), IntegerEntry(ap(u, toString(dk)), dS)]
598+ let en = valueOrElse(getInteger(this, ar(x, toString(dy))), 0)
599+ let ek = valueOrElse(getInteger(this, ar(v, toString(en))), 0)
600+ let el = valueOrElse(getInteger(this, ar(w, toString(en))), ei)
601+ let em = (ek + ((dy - en) * el))
602+[IntegerEntry(ar(v, toString(dy)), em), IntegerEntry(ar(w, toString(dy)), ei)]
560603 }
561604 }
562605 }
563606
564607
565-func dY (bE,bF) = [IntegerEntry(B, bE), IntegerEntry(C, bF)]
608+func eo (bI,bJ) = [IntegerEntry(D, bI), IntegerEntry(E, bJ)]
566609
567610
568-func dZ (bE,bF,ea,eb,ec,ed,ee) = if (((ed - ee) != ea))
569- then throw(((((("Invalid AMM state data: " + toString(ed)) + " + ") + toString(ee)) + " != ") + toString(ea)))
570- else ((dY(bE, bF) ++ [IntegerEntry(D, ea), IntegerEntry(G, eb), IntegerEntry(H, ec), IntegerEntry(E, ed), IntegerEntry(F, ee)]) ++ dR(ak(bE, bF)))
611+func ep (bI,bJ,eq,er,es,et,eu) = if (((et - eu) != eq))
612+ then throw(((((("Invalid AMM state data: " + toString(et)) + " + ") + toString(eu)) + " != ") + toString(eq)))
613+ else ((eo(bI, bJ) ++ [IntegerEntry(F, eq), IntegerEntry(I, er), IntegerEntry(J, es), IntegerEntry(G, et), IntegerEntry(H, eu)]) ++ eh(am(bI, bJ)))
571614
572615
573-func ef (ar) = [DeleteEntry(ap(e, ar)), DeleteEntry(ap(f, ar)), DeleteEntry(ap(g, ar)), DeleteEntry(ap(h, ar))]
616+func ev (at) = [DeleteEntry(ar(e, at)), DeleteEntry(ar(f, at)), DeleteEntry(ar(g, at)), DeleteEntry(ar(h, at))]
574617
575618
576-func eg (ar,eh) = {
577- let ei = assetBalance(this, T())
578- if ((eh > ei))
579- then throw(((("Unable to withdraw " + toString(eh)) + " from contract balance ") + toString(ei)))
580- else [ScriptTransfer(ar, eh, T())]
619+func ew (at,ex) = {
620+ let ey = assetBalance(this, V())
621+ if ((ex > ey))
622+ then throw(((("Unable to withdraw " + toString(ex)) + " from contract balance ") + toString(ey)))
623+ else [ScriptTransfer(at, ex, V())]
581624 }
582625
583626
584-func ej (ek) = if ((0 > ek))
627+func ez (eA) = if ((0 > eA))
585628 then throw("Balance")
586- else [IntegerEntry(d, ek)]
629+ else [IntegerEntry(d, eA)]
587630
588631
589-func el (ek) = [ScriptTransfer(V(), ek, T())]
632+func eB (eA) = [ScriptTransfer(X(), eA, V())]
590633
591634
592-@Callable(ek)
593-func pause () = if ((ek.caller != R()))
635+@Callable(eA)
636+func pause () = if ((eA.caller != T()))
594637 then throw("Invalid togglePause params")
595638 else [BooleanEntry(j, true)]
596639
597640
598641
599-@Callable(ek)
600-func unpause () = if ((ek.caller != R()))
642+@Callable(eA)
643+func unpause () = if ((eA.caller != T()))
601644 then throw("Invalid togglePause params")
602645 else [BooleanEntry(j, false)]
603646
604647
605648
606-@Callable(ek)
607-func addLiquidity (bz) = if (if ((ek.caller != R()))
649+@Callable(eA)
650+func addLiquidity (bD) = if (if ((eA.caller != T()))
608651 then true
609- else (0 >= bz))
652+ else (0 >= bD))
610653 then throw("Invalid addLiquidity params")
611654 else {
612- let bE = aR()
613- let bF = aS()
614- let dS = ak(bE, bF)
615- let em = ak(bz, dS)
616- let en = (bE + bz)
617- let eo = (bF + em)
618- dY(en, eo)
655+ let bI = aT()
656+ let bJ = aU()
657+ let ei = am(bI, bJ)
658+ let eC = am(bD, ei)
659+ let eD = (bI + bD)
660+ let eE = (bJ + eC)
661+ eo(eD, eE)
619662 }
620663
621664
622665
623-@Callable(ek)
624-func removeLiquidity (bz) = if (if ((ek.caller != R()))
666+@Callable(eA)
667+func removeLiquidity (bD) = if (if ((eA.caller != T()))
625668 then true
626- else (0 >= bz))
669+ else (0 >= bD))
627670 then throw("Invalid removeLiquidity params")
628671 else {
629- let bE = aR()
630- let bF = aS()
631- let dS = ak(bE, bF)
632- let ep = ak(bz, dS)
633- let en = (bE - bz)
634- let eo = (bF - ep)
635- dY(en, eo)
672+ let bI = aT()
673+ let bJ = aU()
674+ let ei = am(bI, bJ)
675+ let eF = am(bD, ei)
676+ let eD = (bI - bD)
677+ let eE = (bJ - eF)
678+ eo(eD, eE)
636679 }
637680
638681
639682
640-@Callable(ek)
641-func changeSettings (dA,dB,dC,dD,dE,dF,dG) = if ((ek.caller != R()))
683+@Callable(eA)
684+func changeSettings (dO,dP,dQ,dR,dS,dT,dU,dV,dW) = if ((eA.caller != T()))
642685 then throw("Invalid changeSettings params")
643- else dz(dA, dB, dC, dD, dE, dF, dG)
686+ else dN(dO, dP, dQ, dR, dS, dT, dU, dV, dW)
644687
645688
646689
647-@Callable(ek)
648-func initialize (bE,bF,dD,dA,dB,dC,dE,eq,er,es,dF,dG) = if (if (if (if (if (if (if (if (if (if ((0 >= bE))
690+@Callable(eA)
691+func initialize (bI,bJ,dR,dO,dP,dQ,dS,eG,eH,eI,dT,dU,dV,dW) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bI))
649692 then true
650- else (0 >= bF))
693+ else (0 >= bJ))
651694 then true
652- else (0 >= dD))
695+ else (0 >= dR))
653696 then true
654- else (0 >= dA))
697+ else (0 >= dO))
655698 then true
656- else (0 >= dB))
699+ else (0 >= dP))
657700 then true
658- else (0 >= dC))
701+ else (0 >= dQ))
659702 then true
660- else (0 >= dE))
703+ else (0 >= dS))
661704 then true
662- else (0 >= dF))
705+ else (0 >= dT))
663706 then true
664- else (0 >= dG))
707+ else (0 >= dU))
665708 then true
666- else bv())
709+ else (0 >= dV))
710+ then true
711+ else (0 >= dW))
712+ then true
713+ else bz())
667714 then throw("Invalid initialize parameters")
668- else ((((dZ(bE, bF, 0, 0, 0, 0, 0) ++ dz(dA, dB, dC, dD, dE, dF, dG)) ++ dH((lastBlock.timestamp + dD), 0, 0, 0, 0)) ++ ej(0)) ++ [BooleanEntry(i, true), StringEntry(c, eq), StringEntry(a, er), StringEntry(I, es)])
715+ else ((((ep(bI, bJ, 0, 0, 0, 0, 0) ++ dN(dO, dP, dQ, dR, dS, dT, dU, dV, dW)) ++ dX((lastBlock.timestamp + dR), 0, 0, 0, 0)) ++ ez(0)) ++ [BooleanEntry(i, true), StringEntry(c, eG), StringEntry(a, eH), StringEntry(K, eI)])
669716
670717
671718
672-@Callable(ek)
673-func setMaxPriceImpact (dG) = if (if ((0 >= dG))
719+@Callable(eA)
720+func setInitMarginRatio (dO) = if (if ((0 >= dO))
674721 then true
675- else !(bv()))
676- then throw("Invalid _maxPriceImpact parameters")
677- else dz(aQ(), ba(), bb(), aX(), aP(), bc(), dG)
722+ else !(bz()))
723+ then throw("Invalid setInitMarginRatio parameters")
724+ else dN(dO, bc(), bd(), aZ(), aR(), bf(), bg(), be(), bh())
678725
679726
680727
681-@Callable(ek)
682-func setInitMarginRatio (dA) = if (if ((0 >= dA))
728+@Callable(eA)
729+func decreasePosition (ex,eJ,eK) = if (if (if (if (if ((0 >= ex))
683730 then true
684- else !(bv()))
685- then throw("Invalid setInitMarginRatio parameters")
686- else dz(dA, ba(), bb(), aX(), aP(), bc(), bd())
687-
688-
689-
690-@Callable(ek)
691-func decreasePosition (eh,et,eu) = if (if (if (if (if ((0 >= eh))
731+ else !(bz()))
692732 then true
693- else !(bv()))
733+ else !(bm(am(af, eJ), aS(), true)))
694734 then true
695- else !(bi(ak(ad, et), aQ(), true)))
735+ else !(by(toString(eA.caller))))
696736 then true
697- else !(bu(toString(ek.caller))))
698- then true
699- else bw())
737+ else bA())
700738 then throw("Invalid decreasePosition parameters")
701739 else {
702- let ev = bp(toString(ek.caller))
703- let ew = ev._1
704- let ex = ev._2
705- let ey = ev._3
706- let ez = ev._4
707- let eA = if ((ew > 0))
708- then Z
709- else Y
710- let eB = (eA == Y)
711- let eC = am(eh, et)
712- let eD = cw(toString(ek.caller), ag)
713- let eE = eD._1
714- let cK = eD._2
715- let eF = if ((eE > eC))
740+ let eL = bt(toString(eA.caller))
741+ let eM = eL._1
742+ let eN = eL._2
743+ let eO = eL._3
744+ let eP = eL._4
745+ let eQ = if ((eM > 0))
746+ then ab
747+ else aa
748+ let eR = (eQ == aa)
749+ let eS = ao(ex, eJ)
750+ let eT = cP(toString(eA.caller), ai)
751+ let eU = eT._1
752+ let cU = eT._2
753+ let eV = if ((eU > eS))
716754 then {
717- let eG = bD(eB, eC)
718- let cZ = eG._1
719- let bG = eG._2
720- let bH = eG._3
721- let de = eG._4
722- let df = eG._5
723- let eH = an(cZ)
724- if (if ((eu != 0))
725- then (eu > eH)
755+ let eW = bH(eR, eS)
756+ let dk = eW._1
757+ let bK = eW._2
758+ let bL = eW._3
759+ let ds = eW._4
760+ let dt = eW._5
761+ let eX = ap(dk)
762+ if (if ((eK != 0))
763+ then (eK > eX)
726764 else false)
727- then throw(((("Too little base asset exchanged, got " + toString(eH)) + " expected ") + toString(eu)))
765+ then throw(((("Too little base asset exchanged, got " + toString(eX)) + " expected ") + toString(eK)))
728766 else {
729- let da = ak(am(cK, eH), an(ew))
730- let eI = bU(ew, ex, ez, da)
731- let cd = eI._1
732- let ce = eI._2
733- let bZ = eI._3
734- let dd = eC
735- let eJ = (cK - da)
736- let eK = if ((ew > 0))
737- then ((eE - dd) - eJ)
738- else ((eJ + eE) - dd)
739- let eL = (ew + cZ)
740- $Tuple11(eL, cd, an(eK), bn(eL), bH, bG, de, df, (aV() - eC), (bh() - (if ((eL > 0))
741- then an(cZ)
742- else 0)), (bg() - (if ((0 > eL))
743- then an(cZ)
767+ let dp = am(ao(cU, eX), ap(eM))
768+ let eY = bY(eM, eN, eP, dp)
769+ let ch = eY._1
770+ let ci = eY._2
771+ let cd = eY._3
772+ let dl = eS
773+ let eZ = (cU - dp)
774+ let fa = if ((eM > 0))
775+ then ((eU - dl) - eZ)
776+ else ((eZ + eU) - dl)
777+ let fb = (eM + dk)
778+ $Tuple11(fb, ch, ap(fa), br(fb), bL, bK, ds, dt, (aX() - eS), (bl() - (if ((fb > 0))
779+ then ap(dk)
780+ else 0)), (bk() - (if ((0 > fb))
781+ then ap(dk)
744782 else 0)))
745783 }
746784 }
747785 else throw("Close position first")
748- let eL = eF._1
749- let eM = eF._2
750- let eN = eF._3
751- let eO = eF._4
752- let bH = eF._5
753- let bG = eF._6
754- let de = eF._7
755- let df = eF._8
756- let di = eF._9
757- let dg = eF._10
758- let dh = eF._11
759- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), eN], nil)
760- if ((eP == eP))
761- then (dN(toString(ek.caller), eL, eM, eN, eO) ++ dZ(bG, bH, de, df, di, dg, dh))
786+ let fb = eV._1
787+ let fc = eV._2
788+ let fd = eV._3
789+ let fe = eV._4
790+ let bL = eV._5
791+ let bK = eV._6
792+ let ds = eV._7
793+ let dt = eV._8
794+ let dw = eV._9
795+ let du = eV._10
796+ let dv = eV._11
797+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil)
798+ if ((ff == ff))
799+ then (ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv))
762800 else throw("Strict value is not equal to itself.")
763801 }
764802
765803
766804
767-@Callable(ek)
768-func increasePosition (eA,et,eu) = {
769- let eQ = ek.payments[0].amount
770- if (if (if (if (if (if (if ((eA != Y))
771- then (eA != Z)
805+@Callable(eA)
806+func increasePosition (eQ,eJ,eK) = {
807+ let fg = eA.payments[0].amount
808+ if (if (if (if (if (if (if ((eQ != aa))
809+ then (eQ != ab)
772810 else false)
773811 then true
774- else (0 >= eQ))
812+ else (0 >= fg))
775813 then true
776- else !(bv()))
814+ else !(bz()))
777815 then true
778- else (ek.payments[0].assetId != T()))
816+ else (eA.payments[0].assetId != V()))
779817 then true
780- else !(bi(ak(ad, et), aQ(), true)))
818+ else !(bm(am(af, eJ), aS(), true)))
781819 then true
782- else bw())
820+ else bA())
783821 then throw("Invalid increasePosition parameters")
784822 else {
785- let eR = am(eQ, aP())
786- let eh = (eQ - eR)
787- let eS = bp(toString(ek.caller))
788- let ew = eS._1
789- let ex = eS._2
790- let ey = eS._3
791- let ez = eS._4
792- let eT = (ew == 0)
793- let eU = if ((ew > 0))
794- then (eA == Y)
795- else (eA == Z)
796- let eV = if (!(eT))
797- then eU
823+ let fh = ao(fg, aR())
824+ let ex = (fg - fh)
825+ let fi = bt(toString(eA.caller))
826+ let eM = fi._1
827+ let eN = fi._2
828+ let eO = fi._3
829+ let eP = fi._4
830+ let fj = (eM == 0)
831+ let fk = if ((eM > 0))
832+ then (eQ == aa)
833+ else (eQ == ab)
834+ let fl = if (!(fj))
835+ then fk
798836 else false
799- let eB = (eA == Y)
800- let eW = if (if (eT)
837+ let eR = (eQ == aa)
838+ let fm = if (if (fj)
801839 then true
802- else eV)
840+ else fl)
803841 then {
804- let eC = am(eh, et)
805- let eX = bD(eB, eC)
806- let bJ = eX._1
807- let bG = eX._2
808- let bH = eX._3
809- let de = eX._4
810- let df = eX._5
811- if (if ((eu != 0))
812- then (eu > an(bJ))
842+ let eS = ao(ex, eJ)
843+ let fn = bH(eR, eS)
844+ let bN = fn._1
845+ let bK = fn._2
846+ let bL = fn._3
847+ let ds = fn._4
848+ let dt = fn._5
849+ if (if ((eK != 0))
850+ then (eK > ap(bN))
813851 else false)
814- then throw(((("Limit error: " + toString(an(bJ))) + " < ") + toString(eu)))
852+ then throw(((("Limit error: " + toString(ap(bN))) + " < ") + toString(eK)))
815853 else {
816- let eL = (ew + bJ)
817- let eY = ak(eC, et)
818- let eZ = bU(ew, ex, ez, eY)
819- let cd = eZ._1
820- let cH = eZ._2
821- let cI = eZ._3
822- $Tuple11(eL, cd, (ey + eC), bn(eL), bH, bG, de, df, (aV() + eC), (bh() + (if ((eL > 0))
823- then an(bJ)
824- else 0)), (bg() + (if ((0 > eL))
825- then an(bJ)
826- else 0)))
854+ let fb = (eM + bN)
855+ let fo = am(eS, eJ)
856+ let fp = bY(eM, eN, eP, fo)
857+ let ch = fp._1
858+ let cM = fp._2
859+ let cN = fp._3
860+ if (!(cx(bK, bL)))
861+ then throw("Over max spread limit")
862+ else $Tuple11(fb, ch, (eO + eS), br(fb), bL, bK, ds, dt, (aX() + eS), (bl() + (if ((fb > 0))
863+ then ap(bN)
864+ else 0)), (bk() + (if ((0 > fb))
865+ then ap(bN)
866+ else 0)))
827867 }
828868 }
829869 else {
830- let eC = am(eh, et)
831- let fa = cw(toString(ek.caller), ag)
832- let eE = fa._1
833- let cK = fa._2
834- if ((eE > eC))
870+ let eS = ao(ex, eJ)
871+ let fq = cP(toString(eA.caller), ai)
872+ let eU = fq._1
873+ let cU = fq._2
874+ if ((eU > eS))
835875 then throw("Use decreasePosition to decrease position size")
836876 else throw("Close position first")
837877 }
838- let eL = eW._1
839- let eM = eW._2
840- let eN = eW._3
841- let eO = eW._4
842- let bH = eW._5
843- let bG = eW._6
844- let de = eW._7
845- let df = eW._8
846- let di = eW._9
847- let dg = eW._10
848- let dh = eW._11
849- let fb = (eR / 2)
850- let fc = (eR - fb)
851- let fd = invoke(U(), "lockNeutrinoSP", [toString(V()), af], [AttachedPayment(T(), eh)])
852- if ((fd == fd))
878+ let fb = fm._1
879+ let fc = fm._2
880+ let fd = fm._3
881+ let fe = fm._4
882+ let bL = fm._5
883+ let bK = fm._6
884+ let ds = fm._7
885+ let dt = fm._8
886+ let dw = fm._9
887+ let du = fm._10
888+ let dv = fm._11
889+ let fr = (fh / 2)
890+ let fs = (fh - fr)
891+ let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)])
892+ if ((ft == ft))
853893 then {
854- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
855- if ((fe == fe))
894+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
895+ if ((fu == fu))
856896 then {
857- let ff = invoke(X(), "notifyFees", [toString(ek.caller), eR], nil)
858- if ((ff == ff))
897+ let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil)
898+ if ((fv == fv))
859899 then {
860- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), eN], nil)
861- if ((eP == eP))
862- then (((dN(toString(ek.caller), eL, eM, eN, eO) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ el(fb)) ++ ej((aO() + eh)))
900+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil)
901+ if ((ff == ff))
902+ then (((ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ eB(fr)) ++ ez((aQ() + ex)))
863903 else throw("Strict value is not equal to itself.")
864904 }
865905 else throw("Strict value is not equal to itself.")
866906 }
867907 else throw("Strict value is not equal to itself.")
868908 }
869909 else throw("Strict value is not equal to itself.")
870910 }
871911 }
872912
873913
874914
875-@Callable(ek)
915+@Callable(eA)
876916 func addMargin () = {
877- let eQ = ek.payments[0].amount
878- if (if (if (if ((ek.payments[0].assetId != T()))
917+ let fg = eA.payments[0].amount
918+ if (if (if (if ((eA.payments[0].assetId != V()))
879919 then true
880- else !(bu(toString(ek.caller))))
920+ else !(by(toString(eA.caller))))
881921 then true
882- else !(bv()))
922+ else !(bz()))
883923 then true
884- else bw())
924+ else bA())
885925 then throw("Invalid addMargin parameters")
886926 else {
887- let eR = am(eQ, aP())
888- let eh = (eQ - eR)
889- let fg = bp(toString(ek.caller))
890- let ew = fg._1
891- let ex = fg._2
892- let ey = fg._3
893- let ez = fg._4
894- let fb = (eR / 2)
895- let fc = (eR - fb)
896- let fd = invoke(U(), "lockNeutrinoSP", [toString(V()), af], [AttachedPayment(T(), eh)])
897- if ((fd == fd))
927+ let fh = ao(fg, aR())
928+ let ex = (fg - fh)
929+ let fw = bt(toString(eA.caller))
930+ let eM = fw._1
931+ let eN = fw._2
932+ let eO = fw._3
933+ let eP = fw._4
934+ let fr = (fh / 2)
935+ let fs = (fh - fr)
936+ let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)])
937+ if ((ft == ft))
898938 then {
899- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
900- if ((fe == fe))
939+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
940+ if ((fu == fu))
901941 then {
902- let ff = invoke(X(), "notifyFees", [toString(ek.caller), eR], nil)
903- if ((ff == ff))
904- then ((dN(toString(ek.caller), ew, (ex + eh), ey, ez) ++ el(fb)) ++ ej((aO() + eh)))
942+ let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil)
943+ if ((fv == fv))
944+ then ((ed(toString(eA.caller), eM, (eN + ex), eO, eP) ++ eB(fr)) ++ ez((aQ() + ex)))
905945 else throw("Strict value is not equal to itself.")
906946 }
907947 else throw("Strict value is not equal to itself.")
908948 }
909949 else throw("Strict value is not equal to itself.")
910950 }
911951 }
912952
913953
914954
915-@Callable(ek)
916-func removeMargin (eh) = if (if (if (if ((0 >= eh))
955+@Callable(eA)
956+func removeMargin (ex) = if (if (if (if ((0 >= ex))
917957 then true
918- else !(bu(toString(ek.caller))))
958+ else !(by(toString(eA.caller))))
919959 then true
920- else !(bv()))
960+ else !(bz()))
921961 then true
922- else bw())
962+ else bA())
923963 then throw("Invalid removeMargin parameters")
924964 else {
925- let fh = bp(toString(ek.caller))
926- let ew = fh._1
927- let ex = fh._2
928- let ey = fh._3
929- let ez = fh._4
930- let fi = -(eh)
931- let fj = bU(ew, ex, ez, fi)
932- let cd = fj._1
933- let ce = fj._2
934- if ((ce != 0))
965+ let fx = bt(toString(eA.caller))
966+ let eM = fx._1
967+ let eN = fx._2
968+ let eO = fx._3
969+ let eP = fx._4
970+ let fy = -(ex)
971+ let fz = bY(eM, eN, eP, fy)
972+ let ch = fz._1
973+ let ci = fz._2
974+ if ((ci != 0))
935975 then throw("Invalid removed margin amount")
936976 else {
937- let fk = cL(cd, ce, ey)
938- if (!(bi(fk, aQ(), true)))
939- then throw(((("Too much margin removed: " + toString(fk)) + " < ") + toString(aQ())))
977+ let fA = cV(ch, ci, eO)
978+ if (!(bm(fA, aS(), true)))
979+ then throw(((("Too much margin removed: " + toString(fA)) + " < ") + toString(aS())))
940980 else {
941- let fl = invoke(U(), "unlockNeutrino", [eh, toBase58String(T())], nil)
942- if ((fl == fl))
943- then ((dN(toString(ek.caller), ew, cd, ey, bn(ew)) ++ eg(ek.caller, eh)) ++ ej((aO() - eh)))
981+ let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil)
982+ if ((fB == fB))
983+ then ((ed(toString(eA.caller), eM, ch, eO, br(eM)) ++ ew(eA.caller, ex)) ++ ez((aQ() - ex)))
944984 else throw("Strict value is not equal to itself.")
945985 }
946986 }
947987 }
948988
949989
950990
951-@Callable(ek)
952-func closePosition () = if (if (if (!(bu(toString(ek.caller))))
991+@Callable(eA)
992+func closePosition () = if (if (if (!(by(toString(eA.caller))))
953993 then true
954- else !(bv()))
994+ else !(bz()))
955995 then true
956- else bw())
996+ else bA())
957997 then throw("Invalid closePosition parameters")
958998 else {
959- let fm = cV(toString(ek.caller), true)
960- let cH = fm._1
961- let fn = fm._2
962- let da = fm._3
963- let db = fm._4
964- let bG = fm._5
965- let bH = fm._6
966- let de = fm._7
967- let df = fm._8
968- let di = fm._9
969- let cI = fm._10
970- let dg = fm._11
971- let dh = fm._12
972- if ((fn > 0))
999+ let fC = dm(toString(eA.caller), true)
1000+ let cM = fC._1
1001+ let fD = fC._2
1002+ let dp = fC._3
1003+ let dq = fC._4
1004+ let bK = fC._5
1005+ let bL = fC._6
1006+ let ds = fC._7
1007+ let dt = fC._8
1008+ let dw = fC._9
1009+ let cN = fC._10
1010+ let du = fC._11
1011+ let dv = fC._12
1012+ if ((fD > 0))
9731013 then throw("Unable to close position with bad debt")
9741014 else {
975- let fo = an(db)
976- let fp = (aO() - fo)
977- let fq = if ((0 > fp))
978- then $Tuple2(0, an(fp))
979- else $Tuple2(fp, 0)
980- let fr = fq._1
981- let fs = fq._2
982- let ft = if ((fs > 0))
1015+ let fE = ap(dq)
1016+ let fF = (aQ() - fE)
1017+ let fG = if ((0 > fF))
1018+ then $Tuple2(0, ap(fF))
1019+ else $Tuple2(fF, 0)
1020+ let fH = fG._1
1021+ let fI = fG._2
1022+ let fJ = if ((fI > 0))
9831023 then {
984- let fu = invoke(W(), "withdraw", [fs], nil)
985- if ((fu == fu))
1024+ let fK = invoke(Y(), "withdraw", [fI], nil)
1025+ if ((fK == fK))
9861026 then nil
9871027 else throw("Strict value is not equal to itself.")
9881028 }
9891029 else nil
990- if ((ft == ft))
1030+ if ((fJ == fJ))
9911031 then {
992- let fl = invoke(U(), "unlockNeutrino", [(fo - fs), toBase58String(T())], nil)
993- if ((fl == fl))
1032+ let fB = invoke(W(), "unlockNeutrino", [(fE - fI), toBase58String(V())], nil)
1033+ if ((fB == fB))
9941034 then {
995- let eP = invoke(X(), "notifyNotional", [toString(ek.caller), 0], nil)
996- if ((eP == eP))
997- then (((ef(toString(ek.caller)) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ eg(ek.caller, fo)) ++ ej(fr))
1035+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), 0], nil)
1036+ if ((ff == ff))
1037+ then (((ev(toString(eA.caller)) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fE)) ++ ez(fH))
9981038 else throw("Strict value is not equal to itself.")
9991039 }
10001040 else throw("Strict value is not equal to itself.")
10011041 }
10021042 else throw("Strict value is not equal to itself.")
10031043 }
10041044 }
10051045
10061046
10071047
1008-@Callable(ek)
1009-func liquidate (bq) = {
1010- let fv = cP(bq, ag)
1011- let fk = if (ct())
1048+@Callable(eA)
1049+func liquidate (bu) = {
1050+ let fL = cZ(bu, ai)
1051+ let fA = if (cD())
10121052 then {
1013- let fw = cP(bq, ah)
1014- ao(fv, fw)
1053+ let fM = cZ(bu, aj)
1054+ aq(fL, fM)
10151055 }
1016- else fv
1017- if (if (if (if (!(bi(fk, ba(), false)))
1056+ else fL
1057+ if (if (if (if (!(bm(fA, bc(), false)))
10181058 then true
1019- else !(bu(bq)))
1059+ else !(by(bu)))
10201060 then true
1021- else !(bv()))
1061+ else !(bz()))
10221062 then true
1023- else bw())
1063+ else bA())
10241064 then throw("Unable to liquidate")
1065+ else if (if (if ((fL > bd()))
1066+ then (be() > 0)
1067+ else false)
1068+ then (af > be())
1069+ else false)
1070+ then {
1071+ let fN = bt(bu)
1072+ let eM = fN._1
1073+ let eN = fN._2
1074+ let eO = fN._3
1075+ let eP = fN._4
1076+ let eQ = if ((eM > 0))
1077+ then ab
1078+ else aa
1079+ let eR = (eQ == aa)
1080+ let dl = df(bu, eM)
1081+ let fO = cP(bu, ai)
1082+ let eU = fO._1
1083+ let cU = fO._2
1084+ let fP = bH(eR, dl)
1085+ let dk = fP._1
1086+ let bK = fP._2
1087+ let bL = fP._3
1088+ let ds = fP._4
1089+ let dt = fP._5
1090+ let dp = am(ao(cU, ap(dk)), ap(eM))
1091+ let fQ = bY(eM, eN, eP, dp)
1092+ let ch = fQ._1
1093+ let ci = fQ._2
1094+ let cd = fQ._3
1095+ let eZ = (cU - dp)
1096+ let fa = if ((eM > 0))
1097+ then ((eU - dl) - eZ)
1098+ else ((eZ + eU) - dl)
1099+ let fR = ao(dl, bd())
1100+ let fS = (fR / 2)
1101+ let fs = (fR - fS)
1102+ let fT = (ch - fR)
1103+ let fb = (eM + dk)
1104+ let fd = ap(fa)
1105+ let fU = br(fb)
1106+ let dw = (aX() - dl)
1107+ let fF = (aQ() - fR)
1108+ let fV = if ((0 > fF))
1109+ then $Tuple2(0, ap(fF))
1110+ else $Tuple2(fF, 0)
1111+ let fW = fV._1
1112+ let fX = fV._2
1113+ let fJ = if ((fX > 0))
1114+ then {
1115+ let fK = invoke(Y(), "withdraw", [fX], nil)
1116+ if ((fK == fK))
1117+ then nil
1118+ else throw("Strict value is not equal to itself.")
1119+ }
1120+ else nil
1121+ if ((fJ == fJ))
1122+ then {
1123+ let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil)
1124+ if ((fB == fB))
1125+ then {
1126+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
1127+ if ((fu == fu))
1128+ then {
1129+ let ff = invoke(Z(), "notifyNotional", [bu, fd], nil)
1130+ if ((ff == ff))
1131+ then (((ed(bu, fb, fT, fd, fU) ++ ep(bK, bL, ds, dt, dw, (bl() - (if ((fb > 0))
1132+ then ap(dk)
1133+ else 0)), (bk() - (if ((0 > fb))
1134+ then ap(dk)
1135+ else 0)))) ++ ew(eA.caller, fS)) ++ ez(fW))
1136+ else throw("Strict value is not equal to itself.")
1137+ }
1138+ else throw("Strict value is not equal to itself.")
1139+ }
1140+ else throw("Strict value is not equal to itself.")
1141+ }
1142+ else throw("Strict value is not equal to itself.")
1143+ }
1144+ else {
1145+ let fY = dm(bu, false)
1146+ let cM = fY._1
1147+ let ci = fY._2
1148+ let cN = fY._3
1149+ let cO = fY._4
1150+ let bK = fY._5
1151+ let bL = fY._6
1152+ let ds = fY._7
1153+ let dt = fY._8
1154+ let dw = fY._9
1155+ let dl = fY._10
1156+ let du = fY._11
1157+ let dv = fY._12
1158+ let fR = ao(dl, bd())
1159+ let fS = (fR / 2)
1160+ let fs = (fR - fS)
1161+ let fF = (aQ() - fR)
1162+ let fZ = if ((0 > fF))
1163+ then $Tuple2(0, ap(fF))
1164+ else $Tuple2(fF, 0)
1165+ let fW = fZ._1
1166+ let fX = fZ._2
1167+ let fJ = if ((fX > 0))
1168+ then {
1169+ let fK = invoke(Y(), "withdraw", [fX], nil)
1170+ if ((fK == fK))
1171+ then nil
1172+ else throw("Strict value is not equal to itself.")
1173+ }
1174+ else nil
1175+ if ((fJ == fJ))
1176+ then {
1177+ let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil)
1178+ if ((fB == fB))
1179+ then {
1180+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
1181+ if ((fu == fu))
1182+ then {
1183+ let ff = invoke(Z(), "notifyNotional", [bu, 0], nil)
1184+ if ((ff == ff))
1185+ then (((ev(bu) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fS)) ++ ez(fW))
1186+ else throw("Strict value is not equal to itself.")
1187+ }
1188+ else throw("Strict value is not equal to itself.")
1189+ }
1190+ else throw("Strict value is not equal to itself.")
1191+ }
1192+ else throw("Strict value is not equal to itself.")
1193+ }
1194+ }
1195+
1196+
1197+
1198+@Callable(eA)
1199+func payFunding () = {
1200+ let ga = aY()
1201+ if (if (if ((ga > lastBlock.timestamp))
1202+ then true
1203+ else !(bz()))
1204+ then true
1205+ else bA())
1206+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(ga)))
10251207 else {
1026- let fx = cV(bq, false)
1027- let cH = fx._1
1028- let ce = fx._2
1029- let cI = fx._3
1030- let cJ = fx._4
1031- let bG = fx._5
1032- let bH = fx._6
1033- let de = fx._7
1034- let df = fx._8
1035- let di = fx._9
1036- let dd = fx._10
1037- let dg = fx._11
1038- let dh = fx._12
1039- let fy = am(dd, bb())
1040- let fz = (fy / 2)
1041- let fc = (fy - fz)
1042- let fp = (aO() - fy)
1043- let fA = if ((0 > fp))
1044- then $Tuple2(0, an(fp))
1045- else $Tuple2(fp, 0)
1046- let fB = fA._1
1047- let fC = fA._2
1048- let ft = if ((fC > 0))
1049- then {
1050- let fu = invoke(W(), "withdraw", [fC], nil)
1051- if ((fu == fu))
1052- then nil
1053- else throw("Strict value is not equal to itself.")
1054- }
1055- else nil
1056- if ((ft == ft))
1057- then {
1058- let fl = invoke(U(), "unlockNeutrino", [(fy - fC), toBase58String(T())], nil)
1059- if ((fl == fl))
1060- then {
1061- let fe = invoke(W(), "deposit", nil, [AttachedPayment(T(), fc)])
1062- if ((fe == fe))
1063- then {
1064- let eP = invoke(X(), "notifyNotional", [bq, 0], nil)
1065- if ((eP == eP))
1066- then (((ef(bq) ++ dZ(bG, bH, de, df, di, dg, dh)) ++ eg(ek.caller, fz)) ++ ej(fB))
1067- else throw("Strict value is not equal to itself.")
1068- }
1069- else throw("Strict value is not equal to itself.")
1070- }
1071- else throw("Strict value is not equal to itself.")
1072- }
1073- else throw("Strict value is not equal to itself.")
1208+ let gb = cs()
1209+ let gc = dx()
1210+ let gd = (gc - gb)
1211+ let ge = if (if ((bk() == 0))
1212+ then true
1213+ else (bl() == 0))
1214+ then $Tuple2(0, 0)
1215+ else if ((0 > gd))
1216+ then {
1217+ let gf = am(ao(gd, ba()), ag)
1218+ let gg = am(ao(gf, bk()), bl())
1219+ $Tuple2(gf, gg)
1220+ }
1221+ else {
1222+ let gg = am(ao(gd, ba()), ag)
1223+ let gf = am(ao(gg, bl()), bk())
1224+ $Tuple2(gf, gg)
1225+ }
1226+ let gf = ge._1
1227+ let gg = ge._2
1228+ dX((ga + bb()), (bi() + gg), (bj() + gf), am(gg, gb), am(gf, gb))
10741229 }
10751230 }
10761231
10771232
10781233
1079-@Callable(ek)
1080-func payFunding () = {
1081- let fD = aW()
1082- if (if (if ((fD > lastBlock.timestamp))
1083- then true
1084- else !(bv()))
1085- then true
1086- else bw())
1087- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(fD)))
1088- else {
1089- let fE = cn()
1090- let fF = dj()
1091- let fG = (fF - fE)
1092- let fH = if (if ((bg() == 0))
1093- then true
1094- else (bh() == 0))
1095- then $Tuple2(0, 0)
1096- else if ((0 > fG))
1097- then {
1098- let fI = ak(am(fG, aY()), ae)
1099- let fJ = ak(am(fI, bg()), bh())
1100- $Tuple2(fI, fJ)
1101- }
1102- else {
1103- let fJ = ak(am(fG, aY()), ae)
1104- let fI = ak(am(fJ, bh()), bg())
1105- $Tuple2(fI, fJ)
1106- }
1107- let fI = fH._1
1108- let fJ = fH._2
1109- dH((fD + aZ()), (be() + fJ), (bf() + fI), ak(fJ, fE), ak(fI, fE))
1110- }
1234+@Callable(eA)
1235+func v_get (bu) = {
1236+ let gh = dm(bu, false)
1237+ let cM = gh._1
1238+ let cN = gh._2
1239+ let cO = gh._3
1240+ let gi = gh._4
1241+ throw((((ak(cN) + ak(cO)) + ak(gi)) + ak(de(bu))))
11111242 }
11121243
11131244
11141245
1115-@Callable(ek)
1116-func v_get (bq) = {
1117- let fK = cV(bq, false)
1118- let cH = fK._1
1119- let cI = fK._2
1120- let cJ = fK._3
1121- let fL = fK._4
1122- throw((((ai(cI) + ai(cJ)) + ai(fL)) + ai(cU(bq))))
1246+@Callable(eA)
1247+func view_calcRemainMarginWithFundingPayment (bu) = {
1248+ let gj = bt(bu)
1249+ let bx = gj._1
1250+ let cR = gj._2
1251+ let db = gj._3
1252+ let cT = gj._4
1253+ let gk = cP(bu, ai)
1254+ let cJ = gk._1
1255+ let cU = gk._2
1256+ let gl = bY(bx, cR, cT, cU)
1257+ let ch = gl._1
1258+ let ci = gl._2
1259+ let cd = gl._3
1260+ throw((((((ak(ch) + ak(cd)) + ak(de(bu))) + ak(cU)) + ak(ci)) + ak(cJ)))
11231261 }
11241262
11251263
11261264
1127-@Callable(ek)
1128-func view_calcRemainMarginWithFundingPayment (bq) = {
1129- let fM = bp(bq)
1130- let bt = fM._1
1131- let cz = fM._2
1132- let cR = fM._3
1133- let cB = fM._4
1134- let fN = cw(bq, ag)
1135- let cE = fN._1
1136- let cK = fN._2
1137- let fO = bU(bt, cz, cB, cK)
1138- let cd = fO._1
1139- let ce = fO._2
1140- let bZ = fO._3
1141- throw(((((ai(cd) + ai(bZ)) + ai(cU(bq))) + ai(cK)) + ai(ce)))
1142- }
1143-
1144-
1145-
1146-@Callable(ek)
1147-func forceMoveAsset (bq,eh) = if (if ((addressFromPublicKey(S()) != ek.caller))
1265+@Callable(eA)
1266+func forceMoveAsset (bu,ex) = if (if ((addressFromPublicKey(U()) != eA.caller))
11481267 then true
1149- else (0 > eh))
1268+ else (0 > ex))
11501269 then throw("Invalid forceMoveAsset parameters")
11511270 else {
1152- let fl = invoke(U(), "unlockNeutrino", [eh, toBase58String(T())], nil)
1153- if ((fl == fl))
1154- then (eg(addressFromStringValue(bq), eh) ++ ej((aO() - eh)))
1271+ let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil)
1272+ if ((fB == fB))
1273+ then (ew(addressFromStringValue(bu), ex) ++ ez((aQ() - ex)))
11551274 else throw("Strict value is not equal to itself.")
11561275 }
11571276
11581277
1159-@Verifier(fP)
1160-func fQ () = sigVerify(fP.bodyBytes, fP.proofs[0], S())
1278+@Verifier(gm)
1279+func gn () = sigVerify(gm.bodyBytes, gm.proofs[0], U())
11611280

github/deemru/w8io/169f3d6 
422.62 ms