tx · CJfPP9nTcmQhWTV9H5z8nbRrrhfbbzXGenHpoukSBZWk

3MxqS3CD3DRbyvyMLCLq3JoiSSi5qTuRMFd:  -0.04600000 Waves

2022.06.28 13:03 [2116141] smart account 3MxqS3CD3DRbyvyMLCLq3JoiSSi5qTuRMFd > SELF 0.00000000 Waves

{ "type": 13, "id": "CJfPP9nTcmQhWTV9H5z8nbRrrhfbbzXGenHpoukSBZWk", "fee": 4600000, "feeAssetId": null, "timestamp": 1656410676560, "version": 2, "chainId": 84, "sender": "3MxqS3CD3DRbyvyMLCLq3JoiSSi5qTuRMFd", "senderPublicKey": "3JKx86V3GnbRtGTLNKaRKFkhb7v1aMTLpKMz28o43DE6", "proofs": [ "H7pJPv1LPvWdNzfmAbMBFBxRWDuG9GCbyD4KJqfnGmRuk7BGrjrMbyppTxxu1KcFNnp25YAaPEGdEJgmtnQR6tt" ], "script": "base64:AAIFAAAAAAAAAEUIAhIAEgASCQoHAQEBAQEBARIOCgwBAQEBAQEBCAgIAQESBgoEAQEBARIFCgMBAQESABIDCgEBEgASAwoBCBIAEgMKAQgAAABpAAAAAAlrX29yYV9rZXkCAAAACWtfb3JhX2tleQAAAAAFa19vcmECAAAABWtfb3JhAAAAAAlrX2JhbGFuY2UCAAAACWtfYmFsYW5jZQAAAAAOa19wb3NpdGlvblNpemUCAAAADmtfcG9zaXRpb25TaXplAAAAABBrX3Bvc2l0aW9uTWFyZ2luAgAAABBrX3Bvc2l0aW9uTWFyZ2luAAAAABZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsAgAAABZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsAAAAAC5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAgAAABJrX3Bvc2l0aW9uRnJhY3Rpb24AAAAADWtfaW5pdGlhbGl6ZWQCAAAADWtfaW5pdGlhbGl6ZWQAAAAACGtfcGF1c2VkAgAAAAhrX3BhdXNlZAAAAAAFa19mZWUCAAAABWtfZmVlAAAAAA9rX2Z1bmRpbmdQZXJpb2QCAAAAD2tfZnVuZGluZ1BlcmlvZAAAAAARa19pbml0TWFyZ2luUmF0aW8CAAAAEWtfaW5pdE1hcmdpblJhdGlvAAAAABhrX21haW50ZW5hbmNlTWFyZ2luUmF0aW8CAAAABWtfbW1yAAAAABVrX2xpcXVpZGF0aW9uRmVlUmF0aW8CAAAAFWtfbGlxdWlkYXRpb25GZWVSYXRpbwAAAAANa19zcHJlYWRMaW1pdAIAAAANa19zcHJlYWRMaW1pdAAAAAAQa19tYXhQcmljZUltcGFjdAIAAAAQa19tYXhQcmljZUltcGFjdAAAAAANa19sYXN0RGF0YVN0cgIAAAANa19sYXN0RGF0YVN0cgAAAAAOa19sYXN0TWludXRlSWQCAAAADmtfbGFzdE1pbnV0ZUlkAAAAAB1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIAAAAda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UAAAAAE2tfdHdhcERhdGFMYXN0UHJpY2UCAAAAE2tfdHdhcERhdGFMYXN0UHJpY2UAAAAABmtfdHdhcAIAAAAGa190d2FwAAAAABFrX2Jhc2VBc3N0Rm5kRGVsdAIAAAAQa19iYXNlQXNzZXREZWx0YQAAAAAha19sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAgAAABdrX2xhdGVzdFByZW1pdW1GcmFjdGlvbgAAAAASa19uZXh0RnVuZGluZ0Jsb2NrAgAAAB5rX25leHRGdW5kaW5nQmxvY2tNaW5UaW1lc3RhbXAAAAAADWtfZnVuZGluZ1JhdGUCAAAADWtfZnVuZGluZ1JhdGUAAAAAE2tfcXVvdGVBc3NldFJlc2VydmUCAAAACGtfcXRBc3RSAAAAABJrX2Jhc2VBc3NldFJlc2VydmUCAAAACGtfYnNBc3RSAAAAABJrX2Jhc2VBc3N0Rm5kRGUxbHQCAAAAEGtfYmFzZUFzc2V0RGVsdGEAAAAAE2tfdG90YWxQb3NpdGlvblNpemUCAAAAE2tfdG90YWxQb3NpdGlvblNpemUAAAAAFGtfY3VtdWxhdGl2ZU5vdGlvbmFsAgAAABRrX2N1bXVsYXRpdmVOb3Rpb25hbAAAAAAXa19vcGVuSW50ZXJlc2V0Tm90aW9uYWwCAAAAF2tfb3BlbkludGVyZXNldE5vdGlvbmFsAAAAABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIAAAAUa19jb29yZGluYXRvckFkZHJlc3MAAAAAE2tfaW5zdXJhbmNlX2FkZHJlc3MCAAAAE2tfaW5zdXJhbmNlX2FkZHJlc3MAAAAAD2tfYWRtaW5fYWRkcmVzcwIAAAAPa19hZG1pbl9hZGRyZXNzAAAAABJrX2FkbWluX3B1YmxpY19rZXkCAAAAEmtfYWRtaW5fcHVibGljX2tleQAAAAANa19xdW90ZV9hc3NldAIAAAANa19xdW90ZV9hc3NldAAAAAAPa19xdW90ZV9zdGFraW5nAgAAAA9rX3F1b3RlX3N0YWtpbmcAAAAAEWtfc3Rha2luZ19hZGRyZXNzAgAAABFrX3N0YWtpbmdfYWRkcmVzcwEAAAALY29vcmRpbmF0b3IAAAAACQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAAUa19jb29yZGluYXRvckFkZHJlc3MCAAAAE0Nvb3JkaW5hdG9yIG5vdCBzZXQBAAAADGFkbWluQWRkcmVzcwAAAAAJAAQmAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgkBAAAAC2Nvb3JkaW5hdG9yAAAAAAUAAAAPa19hZG1pbl9hZGRyZXNzAQAAAA5hZG1pblB1YmxpY0tleQAAAAAJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgkBAAAAC2Nvb3JkaW5hdG9yAAAAAAUAAAASa19hZG1pbl9wdWJsaWNfa2V5AQAAAApxdW90ZUFzc2V0AAAAAAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAALY29vcmRpbmF0b3IAAAAABQAAAA1rX3F1b3RlX2Fzc2V0AQAAABFxdW90ZUFzc2V0U3Rha2luZwAAAAAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAALY29vcmRpbmF0b3IAAAAABQAAAA9rX3F1b3RlX3N0YWtpbmcCAAAAHFF1b3RlIGFzc2V0ZSBzdGFraW5nIG5vdCBzZXQBAAAADnN0YWtpbmdBZGRyZXNzAAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIJAQAAAAtjb29yZGluYXRvcgAAAAAFAAAAEWtfc3Rha2luZ19hZGRyZXNzAgAAABFJbnN1cmFuY2Ugbm90IHNldAEAAAAQaW5zdXJhbmNlQWRkcmVzcwAAAAAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAALY29vcmRpbmF0b3IAAAAABQAAABNrX2luc3VyYW5jZV9hZGRyZXNzAgAAABFJbnN1cmFuY2Ugbm90IHNldAAAAAAIRElSX0xPTkcAAAAAAAAAAAEAAAAACURJUl9TSE9SVAAAAAAAAAAAAgAAAAAWRlVORElOR19CTE9DS19JTlRFUlZBTAAAAAAAAAAAPAAAAAANVFdBUF9JTlRFUlZBTAAA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AAABBQAAAA9rX2Z1bmRpbmdQZXJpb2QBAAAAFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAAAAAkAAGgAAAACCQEAAAAQZnVuZGluZ1BlcmlvZFJhdwAAAAAFAAAADERFQ0lNQUxfVU5JVAEAAAAUZnVuZGluZ1BlcmlvZFNlY29uZHMAAAAACQAAaAAAAAIJAQAAABBmdW5kaW5nUGVyaW9kUmF3AAAAAAUAAAAHU0VDT05EUwEAAAADbW1yAAAAAAkBAAAAA2ludAAAAAEFAAAAGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwEAAAATbGlxdWlkYXRpb25GZWVSYXRpbwAAAAAJAQAAAANpbnQAAAABBQAAABVrX2xpcXVpZGF0aW9uRmVlUmF0aW8BAAAAC3NwcmVhZExpbWl0AAAAAAkBAAAAA2ludAAAAAEFAAAADWtfc3ByZWFkTGltaXQBAAAADm1heFByaWNlSW1wYWN0AAAAAAkBAAAAA2ludAAAAAEFAAAAEGtfbWF4UHJpY2VJbXBhY3QBAAAAC2dldFBvc2l0aW9uAAAAAQAAAAdpbnZlc29yBAAAAA9wb3NpdGlvblNpemVPcHQJAAQaAAAAAgUAAAAEdGhpcwkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAOa19wb3NpdGlvblNpemUFAAAAB2ludmVzb3IEAAAAByRtYXRjaDAFAAAAD3Bvc2l0aW9uU2l6ZU9wdAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAxwb3NpdGlvblNpemUFAAAAByRtYXRjaDAJAAUWAAAABAUAAAAMcG9zaXRpb25TaXplCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABBrX3Bvc2l0aW9uTWFyZ2luBQAAAAdpbnZlc29yCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQAAAAdpbnZlc29yCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAAC5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQAAAAdpbnZlc29yCQAFFgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAE3JlcXVpcmVPcGVuUG9zaXRpb24AAAABAAAAB190cmFkZXIDCQAAAAAAAAIICQEAAAALZ2V0UG9zaXRpb24AAAABBQAAAAdfdHJhZGVyAAAAAl8xAAAAAAAAAAAACQAAAgAAAAECAAAAEE5vIG9wZW4gcG9zaXRpb24GAQAAAAtpbml0aWFsaXplZAAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAANa19pbml0aWFsaXplZAcBAAAABnBhdXNlZAAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAAIa19wYXVzZWQHAQAAAA11cGRhdGVSZXNlcnZlAAAAAwAAAAZfaXNBZGQAAAARX3F1b3RlQXNzZXRBbW91bnQAAAAQX2Jhc2VBc3NldEFtb3VudAMFAAAABl9pc0FkZAQAAAAHbmV3QmFzZQkAAGUAAAACCQEAAAAGYnNBc3RSAAAAAAUAAAAQX2Jhc2VBc3NldEFtb3VudAMJAABnAAAAAgAAAAAAAAAAAAUAAAAHbmV3QmFzZQkAAAIAAAABAgAAACpUeCBsZWFkIHRvIGJhc2UgYXNzZXQgcmVzZXJ2ZSA8PSAwLCByZXZlcnQJAAUXAAAABQkAAGQAAAACCQEAAAAGcXRBc3RSAAAAAAUAAAARX3F1b3RlQXNzZXRBbW91bnQFAAAAB25ld0Jhc2UJAABlAAAAAgkBAAAAD2Jhc2VBc3N0Rm5kRGVsdAAAAAAFAAAAEF9iYXNlQXNzZXRBbW91bnQJAABkAAAAAgkBAAAAEXRvdGFsUG9zaXRpb25TaXplAAAAAAUAAAAQX2Jhc2VBc3NldEFtb3VudAkAAGQAAAACCQEAAAASY3VtdWxhdGl2ZU5vdGlvbmFsAAAAAAUAAAARX3F1b3RlQXNzZXRBbW91bnQEAAAACG5ld1F1b3RlCQAAZQAAAAIJAQAAAAZxdEFzdFIAAAAABQAAABFfcXVvdGVBc3NldEFtb3VudAMJAABnAAAAAgAAAAAAAAAAAAUAAAAIbmV3UXVvdGUJAAACAAAAAQIAAAAqVHggbGVhZCB0byBiYXNlIHF1b3RlIHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQAFFwAAAAUFAAAACG5ld1F1b3RlCQAAZAAAAAIJAQAAAAZic0FzdFIAAAAABQAAABBfYmFzZUFzc2V0QW1vdW50CQAAZAAAAAIJAQAAAA9iYXNlQXNzdEZuZERlbHQAAAAABQAAABBfYmFzZUFzc2V0QW1vdW50CQAAZQAAAAIJAQAAABF0b3RhbFBvc2l0aW9uU2l6ZQAAAAAFAAAAEF9iYXNlQXNzZXRBbW91bnQJAABlAAAAAgkBAAAAEmN1bXVsYXRpdmVOb3Rpb25hbAAAAAAFAAAAEV9xdW90ZUFzc2V0QW1vdW50AQAAAAlzd2FwSW5wdXQAAAACAAAABl9pc0FkZAAAABFfcXVvdGVBc3NldEFtb3VudAQAAAAHX3F0QXN0UgkBAAAABnF0QXN0UgAAAAAEAAAAB19ic0FzdFIJAQAAAAZic0FzdFIAAAAABAAAAAtwcmljZUJlZm9yZQkBAAAABGRpdmQAAAACBQAAAAdfcXRBc3RSBQAAAAdfYnNBc3RSBAAAACdhbW91bnRCYXNlQXNzZXRCb3VnaHRXaXRob3V0UHJpY2VJbXBhY3QJAQAAAARtdWxkAAAAAgUAAAARX3F1b3RlQXNzZXRBbW91bnQFAAAAC3ByaWNlQmVmb3JlBAAAAAFrCQEAAAAEbXVsZAAAAAIFAAAAB19xdEFzdFIFAAAAB19ic0FzdFIEAAAAFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIDBQAAAAZfaXNBZGQJAABkAAAAAgUAAAAHX3F0QXN0UgUAAAARX3F1b3RlQXNzZXRBbW91bnQJAABlAAAAAgUAAAAHX3F0QXN0UgUAAAARX3F1b3RlQXNzZXRBbW91bnQEAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcgkBAAAABGRpdmQAAAACBQAAAAFrBQAAABZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBAAAABhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMJAQAAAANhYnMAAAABCQAAZQAAAAIFAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcgUAAAAHX2JzQXN0UgQAAAAVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AwUAAAAGX2lzQWRkBQAAABhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMJAQAAAAEtAAAAAQUAAAAYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzBAAAAAtwcmljZUltcGFjdAkAAGkAAAACCQAAZQAAAAIFAAAAJ2Ftb3VudEJhc2VBc3NldEJvdWdodFdpdGhvdXRQcmljZUltcGFjdAUAAAAYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzBQAAACdhbW91bnRCYXNlQXNzZXRCb3VnaHRXaXRob3V0UHJpY2VJbXBhY3QEAAAAE21heFByaWNlSW1wYWN0VmFsdWUJAQAAAA5tYXhQcmljZUltcGFjdAAAAAADCQAAZgAAAAIFAAAAC3ByaWNlSW1wYWN0BQAAABNtYXhQcmljZUltcGFjdFZhbHVlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADVByaWNlIGltcGFjdCAJAAGkAAAAAQUAAAALcHJpY2VJbXBhY3QCAAAAFCA+IG1heCBwcmljZSBpbXBhY3QgCQABpAAAAAEFAAAAE21heFByaWNlSW1wYWN0VmFsdWUEAAAADCR0MDk4NjcxMDExNQkBAAAADXVwZGF0ZVJlc2VydmUAAAADBQAAAAZfaXNBZGQFAAAAEV9xdW90ZUFzc2V0QW1vdW50BQAAABhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMEAAAAF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUAAAAMJHQwOTg2NzEwMTE1AAAAAl8xBAAAABZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUAAAAMJHQwOTg2NzEwMTE1AAAAAl8yBAAAACViYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIxCAUAAAAMJHQwOTg2NzEwMTE1AAAAAl8zBAAAABd0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyMQgFAAAADCR0MDk4NjcxMDExNQAAAAJfNAQAAAAYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxCAUAAAAMJHQwOTg2NzEwMTE1AAAAAl81CQAFGAAAAAYFAAAAFWFtb3VudEJhc2VBc3NldEJvdWdodAUAAAAXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEFAAAAFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFAAAAJWJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcjEFAAAAF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxBQAAABhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEBAAAAImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQAAAAEAAAAEF9vbGRQb3NpdGlvblNpemUAAAASX29sZFBvc2l0aW9uTWFyZ2luAAAAFV9vbGRQb3NpdGlvbkxzdFVwZENQRgAAAAxfbWFyZ2luRGVsdGEEAAAACl9sYXRlc3RDUEYJAQAAAAlsYXRlc3RDUEYAAAAABAAAAA5mdW5kaW5nUGF5bWVudAMJAQAAAAIhPQAAAAIFAAAAEF9vbGRQb3NpdGlvblNpemUAAAAAAAAAAAAJAQAAAARtdWxkAAAAAgkAAGUAAAACBQAAAApfbGF0ZXN0Q1BGBQAAABVfb2xkUG9zaXRpb25Mc3RVcGRDUEYFAAAAEF9vbGRQb3NpdGlvblNpemUAAAAAAAAAAAAEAAAADHNpZ25lZE1hcmdpbgkAAGQAAAACCQAAZQAAAAIFAAAADF9tYXJnaW5EZWx0YQUAAAAOZnVuZGluZ1BheW1lbnQFAAAAEl9vbGRQb3NpdGlvbk1hcmdpbgQAAAANJHQwMTA3MzMxMDg2MAMJAABmAAAAAgAAAAAAAAAAAAUAAAAMc2lnbmVkTWFyZ2luCQAFFAAAAAIAAAAAAAAAAAAJAQAAAANhYnMAAAABBQAAAAxzaWduZWRNYXJnaW4JAAUUAAAAAgkBAAAAA2FicwAAAAEFAAAADHNpZ25lZE1hcmdpbgAAAAAAAAAAAAQAAAAMcmVtYWluTWFyZ2luCAUAAAANJHQwMTA3MzMxMDg2MAAAAAJfMQQAAAAHYmFkRGVidAgFAAAADSR0MDEwNzMzMTA4NjAAAAACXzIJAAUWAAAABAUAAAAMcmVtYWluTWFyZ2luBQAAAAdiYWREZWJ0BQAAAA5mdW5kaW5nUGF5bWVudAUAAAAKX2xhdGVzdENQRgEAAAAaZ2V0T3V0cHV0UHJpY2VXaXRoUmVzZXJ2ZXMAAAAEAAAABF9hZGQAAAAQX2Jhc2VBc3NldEFtb3VudAAAABVfcXVvdGVBc3NldFBvb2xBbW91bnQAAAAUX2Jhc2VBc3NldFBvb2xBbW91bnQDCQAAAAAAAAIFAAAAEF9iYXNlQXNzZXRBbW91bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAZSW52YWxpZCBiYXNlIGFzc2V0IGFtb3VudAQAAAABawkBAAAABG11bGQAAAACBQAAABVfcXVvdGVBc3NldFBvb2xBbW91bnQFAAAAFF9iYXNlQXNzZXRQb29sQW1vdW50BAAAABhiYXNlQXNzZXRQb29sQW1vdW50QWZ0ZXIDBQAAAARfYWRkCQAAZAAAAAIFAAAAFF9iYXNlQXNzZXRQb29sQW1vdW50BQAAABBfYmFzZUFzc2V0QW1vdW50CQAAZQAAAAIFAAAAFF9iYXNlQXNzZXRQb29sQW1vdW50BQAAABBfYmFzZUFzc2V0QW1vdW50BAAAAA9xdW90ZUFzc2V0QWZ0ZXIJAQAAAARkaXZkAAAAAgUAAAABawUAAAAYYmFzZUFzc2V0UG9vbEFtb3VudEFmdGVyBAAAAA5xdW90ZUFzc2V0U29sZAkBAAAAA2FicwAAAAEJAABlAAAAAgUAAAAPcXVvdGVBc3NldEFmdGVyBQAAABVfcXVvdGVBc3NldFBvb2xBbW91bnQEAAAADSR0MDExNTA5MTE3NDUJAQAAAA11cGRhdGVSZXNlcnZlAAAAAwkBAAAAASEAAAABBQAAAARfYWRkBQAAAA5xdW90ZUFzc2V0U29sZAUAAAAQX2Jhc2VBc3NldEFtb3VudAQAAAAXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEIBQAAAA0kdDAxMTUwOTExNzQ1AAAAAl8xBAAAABZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUAAAANJHQwMTE1MDkxMTc0NQAAAAJfMgQAAAAlYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyMQgFAAAADSR0MDExNTA5MTE3NDUAAAACXzMEAAAAF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUAAAANJHQwMTE1MDkxMTc0NQAAAAJfNAQAAAAYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxCAUAAAANJHQwMTE1MDkxMTc0NQAAAAJfNQkABRgAAAAGBQAAAA5xdW90ZUFzc2V0U29sZAUAAAAXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEFAAAAFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFAAAAJWJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcjEFAAAAF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxBQAAABhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEBAAAAEmdldE9yYWNsZVR3YXBQcmljZQAAAAAEAAAABm9yYWNsZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAABWtfb3JhAgAAAAAEAAAACHByaWNlS2V5CQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAAlrX29yYV9rZXkJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABm9yYWNsZQUAAAAIcHJpY2VLZXkBAAAADGdldFNwb3RQcmljZQAAAAAEAAAAB19xdEFzdFIJAQAAAAZxdEFzdFIAAAAABAAAAAdfYnNBc3RSCQEAAAAGYnNBc3RSAAAAAAkBAAAABGRpdmQAAAACBQAAAAdfcXRBc3RSBQAAAAdfYnNBc3RSAQAAABZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAAAAAQAAAALb3JhY2xlUHJpY2UJAQAAABJnZXRPcmFjbGVUd2FwUHJpY2UAAAAABAAAAAxjdXJyZW50UHJpY2UJAQAAAAxnZXRTcG90UHJpY2UAAAAACQAAZgAAAAIJAQAAAARkaXZkAAAAAgkBAAAAA2FicwAAAAEJAABlAAAAAgUAAAALb3JhY2xlUHJpY2UFAAAADGN1cnJlbnRQcmljZQUAAAALb3JhY2xlUHJpY2UJAQAAAAtzcHJlYWRMaW1pdAAAAAABAAAAI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAAAAAgAAAAdfdHJhZGVyAAAAB19vcHRpb24EAAAADSR0MDEyNTIwMTI2NDgJAQAAAAtnZXRQb3NpdGlvbgAAAAEFAAAAB190cmFkZXIEAAAADHBvc2l0aW9uU2l6ZQgFAAAADSR0MDEyNTIwMTI2NDgAAAACXzEEAAAADnBvc2l0aW9uTWFyZ2luCAUAAAANJHQwMTI1MjAxMjY0OAAAAAJfMgQAAAAUcG9zaXRpb25PcGVuTm90aW9uYWwIBQAAAA0kdDAxMjUyMDEyNjQ4AAAAAl8zBAAAABFwb3NpdGlvbkxzdFVwZENQRggFAAAADSR0MDEyNTIwMTI2NDgAAAACXzQEAAAAD3Bvc2l0aW9uU2l6ZUFicwkBAAAAA2FicwAAAAEFAAAADHBvc2l0aW9uU2l6ZQMJAAAAAAAAAgUAAAAPcG9zaXRpb25TaXplQWJzAAAAAAAAAAAACQAAAgAAAAECAAAAFUludmFsaWQgcG9zaXRpb24gc2l6ZQQAAAAHaXNTaG9ydAkAAGYAAAACAAAAAAAAAAAABQAAAAxwb3NpdGlvblNpemUEAAAAEHBvc2l0aW9uTm90aW9uYWwDCQAAAAAAAAIFAAAAB19vcHRpb24FAAAAD1BOTF9PUFRJT05fU1BPVAQAAAANJHQwMTI4OTUxMzA1OAkBAAAAGmdldE91dHB1dFByaWNlV2l0aFJlc2VydmVzAAAABAkBAAAAASEAAAABBQAAAAdpc1Nob3J0BQAAAA9wb3NpdGlvblNpemVBYnMJAQAAAAZxdEFzdFIAAAAACQEAAAAGYnNBc3RSAAAAAAQAAAATb3V0UG9zaXRpb25Ob3Rpb25hbAgFAAAADSR0MDEyODk1MTMwNTgAAAACXzEEAAAAAngxCAUAAAANJHQwMTI4OTUxMzA1OAAAAAJfMgQAAAACeDIIBQAAAA0kdDAxMjg5NTEzMDU4AAAAAl8zBAAAAAJ4MwgFAAAADSR0MDEyODk1MTMwNTgAAAACXzQFAAAAE291dFBvc2l0aW9uTm90aW9uYWwJAABoAAAAAgUAAAAPcG9zaXRpb25TaXplQWJzCQEAAAASZ2V0T3JhY2xlVHdhcFByaWNlAAAAAAQAAAANdW5yZWFsaXplZFBubAMFAAAAB2lzU2hvcnQJAABlAAAAAgUAAAAUcG9zaXRpb25PcGVuTm90aW9uYWwFAAAAEHBvc2l0aW9uTm90aW9uYWwJAABlAAAAAgUAAAAQcG9zaXRpb25Ob3Rpb25hbAUAAAAUcG9zaXRpb25PcGVuTm90aW9uYWwJAAUUAAAAAgUAAAAQcG9zaXRpb25Ob3Rpb25hbAUAAAANdW5yZWFsaXplZFBubAEAAAAWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgAAAAIAAAAHX3RyYWRlcgAAAAdfb3B0aW9uCgEAAAABeAAAAAAAAAAAAAAAAAAEAAAADSR0MDEzNDgyMTM1OTMJAQAAAAtnZXRQb3NpdGlvbgAAAAEFAAAAB190cmFkZXIEAAAADHBvc2l0aW9uU2l6ZQgFAAAADSR0MDEzNDgyMTM1OTMAAAACXzEEAAAADnBvc2l0aW9uTWFyZ2luCAUAAAANJHQwMTM0ODIxMzU5MwAAAAJfMgQAAAADcG9uCAUAAAANJHQwMTM0ODIxMzU5MwAAAAJfMwQAAAARcG9zaXRpb25Mc3RVcGRDUEYIBQAAAA0kdDAxMzQ4MjEzNTkzAAAAAl80BAAAAA0kdDAxMzU5OTEzNjkyCQEAAAAjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwAAAACBQAAAAdfdHJhZGVyBQAAAAdfb3B0aW9uBAAAABBwb3NpdGlvbk5vdGlvbmFsCAUAAAANJHQwMTM1OTkxMzY5MgAAAAJfMQQAAAANdW5yZWFsaXplZFBubAgFAAAADSR0MDEzNTk5MTM2OTIAAAACXzIEAAAADSR0MDEzNjk3MTM4NjMJAQAAACJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50AAAABAUAAAAMcG9zaXRpb25TaXplBQAAAA5wb3NpdGlvbk1hcmdpbgUAAAARcG9zaXRpb25Mc3RVcGRDUEYFAAAADXVucmVhbGl6ZWRQbmwEAAAADHJlbWFpbk1hcmdpbggFAAAADSR0MDEzNjk3MTM4NjMAAAACXzEEAAAAB2JhZERlYnQIBQAAAA0kdDAxMzY5NzEzODYzAAAAAl8yCQEAAAAEZGl2ZAAAAAIJAABlAAAAAgUAAAAMcmVtYWluTWFyZ2luBQAAAAdiYWREZWJ0BQAAABBwb3NpdGlvbk5vdGlvbmFsAQAAAA5nZXRNYXJnaW5SYXRpbwAAAAEAAAAHX3RyYWRlcgkBAAAAFmdldE1hcmdpblJhdGlvQnlPcHRpb24AAAACBQAAAAdfdHJhZGVyBQAAAA9QTkxfT1BUSU9OX1NQT1QBAAAAFWludGVybmFsQ2xvc2VQb3NpdGlvbgAAAAEAAAAHX3RyYWRlcgQAAAANJHQwMTQwNTkxNDE3MAkBAAAAC2dldFBvc2l0aW9uAAAAAQUAAAAHX3RyYWRlcgQAAAAMcG9zaXRpb25TaXplCAUAAAANJHQwMTQwNTkxNDE3MAAAAAJfMQQAAAAOcG9zaXRpb25NYXJnaW4IBQAAAA0kdDAxNDA1OTE0MTcwAAAAAl8yBAAAAANwb24IBQAAAA0kdDAxNDA1OTE0MTcwAAAAAl8zBAAAABFwb3NpdGlvbkxzdFVwZENQRggFAAAADSR0MDE0MDU5MTQxNzAAAAACXzQEAAAADSR0MDE0MTc2MTQyNjMJAQAAACNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAAAAAIFAAAAB190cmFkZXIFAAAAD1BOTF9PUFRJT05fU1BPVAQAAAACeDEIBQAAAA0kdDAxNDE3NjE0MjYzAAAAAl8xBAAAAA11bnJlYWxpemVkUG5sCAUAAAANJHQwMTQxNzYxNDI2MwAAAAJfMgQAAAANJHQwMTQyNjgxNDQ0MAkBAAAAImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQAAAAEBQAAAAxwb3NpdGlvblNpemUFAAAADnBvc2l0aW9uTWFyZ2luBQAAABFwb3NpdGlvbkxzdFVwZENQRgUAAAANdW5yZWFsaXplZFBubAQAAAAMcmVtYWluTWFyZ2luCAUAAAANJHQwMTQyNjgxNDQ0MAAAAAJfMQQAAAAHYmFkRGVidAgFAAAADSR0MDE0MjY4MTQ0NDAAAAACXzIEAAAAAngyCAUAAAANJHQwMTQyNjgxNDQ0MAAAAAJfMwQAAAAVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQEAAAABLQAAAAEFAAAADHBvc2l0aW9uU2l6ZQQAAAALcmVhbGl6ZWRQbmwFAAAADXVucmVhbGl6ZWRQbmwEAAAADW1hcmdpblRvVmF1bHQJAQAAAAEtAAAAAQUAAAAMcmVtYWluTWFyZ2luBAAAAA0kdDAxNDU2NzE0OTAwCQEAAAAaZ2V0T3V0cHV0UHJpY2VXaXRoUmVzZXJ2ZXMAAAAECQAAZgAAAAIFAAAADHBvc2l0aW9uU2l6ZQAAAAAAAAAAAAkBAAAAA2FicwAAAAEFAAAADHBvc2l0aW9uU2l6ZQkBAAAABnF0QXN0UgAAAAAJAQAAAAZic0FzdFIAAAAABAAAABlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUAAAANJHQwMTQ1NjcxNDkwMAAAAAJfMQQAAAAWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDE0NTY3MTQ5MDAAAAACXzIEAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDE0NTY3MTQ5MDAAAAACXzMEAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcggFAAAADSR0MDE0NTY3MTQ5MDAAAAACXzQEAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQAAAA0kdDAxNDU2NzE0OTAwAAAAAl81BAAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFAAAADSR0MDE0NTY3MTQ5MDAAAAACXzYEAAAAGm9wZW5JbnRlcmVzZXROb3Rpb25hbEFmdGVyCQAAZQAAAAIJAQAAABVvcGVuSW50ZXJlc2V0Tm90aW9uYWwAAAAABQAAAANwb24JAAUdAAAACwUAAAAVZXhjaGFuZ2VkUG9zaXRpb25TaXplBQAAAAdiYWREZWJ0BQAAAAtyZWFsaXplZFBubAUAAAANbWFyZ2luVG9WYXVsdAUAAAAWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAACRiYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIFAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFAAAAF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBQAAABpvcGVuSW50ZXJlc2V0Tm90aW9uYWxBZnRlcgUAAAAZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAEAAAAQZ2V0VHdhcFNwb3RQcmljZQAAAAAEAAAACG1pbnV0ZUlkCQAAaQAAAAIJAABpAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAAAAAAAAAAA+gAAAAAAAAAADwEAAAADXN0YXJ0TWludXRlSWQJAABlAAAAAgUAAAAIbWludXRlSWQFAAAADVRXQVBfSU5URVJWQUwEAAAAB2xp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YXN0UHJpY2UCAAAAAV8JAAGkAAAAAQUAAAAIbWF4SW5kZXgAAAAAAAAAAAAEAAAAFXN0YXJ0Q3VtbXVsYXRpdmVQcmljZQkAAGQAAAACBQAAABhzdGFydExhc3RDdW11bGF0aXZlUHJpY2UJAABoAAAAAgkAAGUAAAACBQAAAA1zdGFydE1pbnV0ZUlkBQAAAAhtYXhJbmRleAUAAAAOc3RhcnRMYXN0UHJpY2UJAABpAAAAAgkAAGUAAAACBQAAABNub3dDdW1tdWxhdGl2ZVByaWNlBQAAABVzdGFydEN1bW11bGF0aXZlUHJpY2UFAAAADVRXQVBfSU5URVJWQUwBAAAADnVwZGF0ZVNldHRpbmdzAAAABwAAABBfaW5pdE1hcmdpblJhdGlvAAAABF9tbXIAAAAUX2xpcXVpZGF0aW9uRmVlUmF0aW8AAAAOX2Z1bmRpbmdQZXJpb2QAAAAEX2ZlZQAAAAxfc3ByZWFkTGltaXQAAAAPX21heFByaWNlSW1wYWN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrX2luaXRNYXJnaW5SYXRpbwUAAAAQX2luaXRNYXJnaW5SYXRpbwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAYa19tYWludGVuYW5jZU1hcmdpblJhdGlvBQAAAARfbW1yCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABVrX2xpcXVpZGF0aW9uRmVlUmF0aW8FAAAAFF9saXF1aWRhdGlvbkZlZVJhdGlvCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA9rX2Z1bmRpbmdQZXJpb2QFAAAADl9mdW5kaW5nUGVyaW9kCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAVrX2ZlZQUAAAAEX2ZlZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANa19zcHJlYWRMaW1pdAUAAAAMX3NwcmVhZExpbWl0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABBrX21heFByaWNlSW1wYWN0BQAAAA9fbWF4UHJpY2VJbXBhY3QFAAAAA25pbAEAAAANdXBkYXRlRnVuZGluZwAAAAQAAAAKX2Jhc2VBRFRGUAAAABFfbmV4dEZ1bmRpbmdCbG9jawAAAApfbGF0ZXN0Q1BGAAAADF9mdW5kaW5nUmF0ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa19iYXNlQXNzdEZuZERlbHQFAAAACl9iYXNlQURURlAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmtfbmV4dEZ1bmRpbmdCbG9jawUAAAARX25leHRGdW5kaW5nQmxvY2sJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIWtfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUAAAAKX2xhdGVzdENQRgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANa19mdW5kaW5nUmF0ZQUAAAAMX2Z1bmRpbmdSYXRlBQAAAANuaWwBAAAADnVwZGF0ZVBvc2l0aW9uAAAABQAAAAhfYWRkcmVzcwAAAAVfc2l6ZQAAAAdfbWFyZ2luAAAADF9vcGVuTm90aW5hbAAAAApfTHN0VXBkQ1BGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAAA5rX3Bvc2l0aW9uU2l6ZQUAAAAIX2FkZHJlc3MFAAAABV9zaXplCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABBrX3Bvc2l0aW9uTWFyZ2luBQAAAAhfYWRkcmVzcwUAAAAHX21hcmdpbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAUAAAAIX2FkZHJlc3MFAAAADF9vcGVuTm90aW5hbAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvQ29tcG9zaXRlS2V5AAAAAgUAAAAua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUAAAAIX2FkZHJlc3MFAAAACl9Mc3RVcGRDUEYFAAAAA25pbAEAAAAK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ZXJ2ZQUAAAAHX2JzQXN0UgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa19iYXNlQXNzdEZuZERlbHQFAAAAJV9iYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tfdG90YWxQb3NpdGlvblNpemUFAAAAF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABRrX2N1bXVsYXRpdmVOb3Rpb25hbAUAAAAYX2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABdrX29wZW5JbnRlcmVzZXROb3Rpb25hbAUAAAAWX29wZW5JbnRlcmVzZXROb3Rpb25hbAUAAAADbmlsCQEAAAAKYXBwZW5kVHdhcAAAAAEJAQAAAARkaXZkAAAAAgUAAAAHX3F0QXN0UgUAAAAHX2JzQXN0UgEAAAAOZGVsZXRlUG9zaXRpb24AAAABAAAACF9hZGRyZXNzCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAA50b0NvbXBvc2l0ZUtleQAAAAIFAAAADmtfcG9zaXRpb25TaXplBQAAAAhfYWRkcmVzcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABBrX3Bvc2l0aW9uTWFyZ2luBQAAAAhfYWRkcmVzcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAABZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQAAAAhfYWRkcmVzcwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAOdG9Db21wb3NpdGVLZXkAAAACBQAAAC5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQAAAAhfYWRkcmVzcwUAAAADbmlsAQAAAAh3aXRoZHJhdwAAAAIAAAAIX2FkZHJlc3MAAAAHX2Ftb3VudAQAAAAHYmFsYW5jZQkAA/AAAAACBQAAAAR0aGlzCQEAAAAKcXVvdGVBc3NldAAAAAADCQAAZgAAAAIFAAAAB19hbW91bnQFAAAAB2JhbGFuY2UJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAATVW5hYmxlIHRvIHdpdGhkcmF3IAkAAaQAAAABBQAAAAdfYW1vdW50AgAAABcgZnJvbSBjb250cmFjdCBiYWxhbmNlIAkAAaQAAAABBQAAAAdiYWxhbmNlCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAACF9hZGRyZXNzBQAAAAdfYW1vdW50CQEAAAAKcXVvdGVBc3NldAAAAAAFAAAAA25pbAEAAAANdXBkYXRlQmFsYW5jZQAAAAEAAAABaQMJAABmAAAAAgAAAAAAAAAAAAUAAAABaQkAAAIAAAABAgAAAAdCYWxhbmNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrX2JhbGFuY2UFAAAAAWkFAAAAA25pbAEAAAALdHJhbnNmZXJGZWUAAAABAAAAAWkJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAADnN0YWtpbmdBZGRyZXNzAAAAAAUAAAABaQkBAAAACnF1b3RlQXNzZXQAAAAABQAAAANuaWwAAAAMAAAAAWkBAAAABXBhdXNlAAAAAAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgkBAAAADGFkbWluQWRkcmVzcwAAAAAJAAACAAAAAQIAAAAaSW52YWxpZCB0b2dnbGVQYXVzZSBwYXJhbXMJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAACGtfcGF1c2VkBgUAAAADbmlsAAAAAWkBAAAAB3VucGF1c2UAAAAAAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyCQEAAAAMYWRtaW5BZGRyZXNzAAAAAAkAAAIAAAABAgAAABpJbnZhbGlkIHRvZ2dsZVBhdXNlIHBhcmFtcwkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAIa19wYXVzZWQHBQAAAANuaWwAAAABaQEAAAAOY2hhbmdlU2V0dGluZ3MAAAAHAAAAEF9pbml0TWFyZ2luUmF0aW8AAAAEX21tcgAAABRfbGlxdWlkYXRpb25GZWVSYXRpbwAAAA5fZnVuZGluZ1BlcmlvZAAAAARfZmVlAAAADF9zcHJlYWRMaW1pdAAAAA9fbWF4UHJpY2VJbXBhY3QDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIJAQAAAAxhZG1pbkFkZHJlc3MAAAAACQAAAgAAAAECAAAAHUludmFsaWQgY2hhbmdlU2V0dGluZ3MgcGFyYW1zCQEAAAAOdXBkYXRlU2V0dGluZ3MAAAAHBQAAABBfaW5pdE1hcmdpblJhdGlvBQAAAARfbW1yBQAAABRfbGlxdWlkYXRpb25GZWVSYXRpbwUAAAAOX2Z1bmRpbmdQZXJpb2QFAAAABF9mZWUFAAAADF9zcHJlYWRMaW1pdAUAAAAPX21heFByaWNlSW1wYWN0AAAAAWkBAAAACmluaXRpYWxpemUAAAAMAAAAB19xdEFzdFIAAAAHX2JzQXN0UgAAAA5fZnVuZGluZ1BlcmlvZAAAABBfaW5pdE1hcmdpblJhdGlvAAAABF9tbXIAAAAUX2xpcXVpZGF0aW9uRmVlUmF0aW8AAAAEX2ZlZQAAAAdfb3JhY2xlAAAACl9vcmFjbGVLZXkAAAAMX2Nvb3JkaW5hdG9yAAAADF9zcHJlYWRMaW1pdAAAAA9fbWF4UHJpY2VJbXBhY3QDAwMDAwMDAwMDCQAAZwAAAAIAAAAAAAAAAAAFAAAAB19xdEFzdFIGCQAAZwAAAAIAAAAAAAAAAAAFAAAAB19ic0FzdFIGCQAAZwAAAAIAAAAAAAAAAAAFAAAADl9mdW5kaW5nUGVyaW9kBgkAAGcAAAACAAAAAAAAAAAABQAAABBfaW5pdE1hcmdpblJhdGlvBgkAAGcAAAACAAAAAAAAAAAABQAAAARfbW1yBgkAAGcAAAACAAAAAAAAAAAABQAAABRfbGlxdWlkYXRpb25GZWVSYXRpbwYJAABnAAAAAgAAAAAAAAAAAAUAAAAEX2ZlZQYJAABnAAAAAgAAAAAAAAAAAAUAAAAMX3NwcmVhZExpbWl0BgkAAGcAAAACAAAAAAAAAAAABQAAAA9fbWF4UHJpY2VJbXBhY3QGCQEAAAALaW5pdGlhbGl6ZWQAAAAACQAAAgAAAAECAAAAHUludmFsaWQgaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzCQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAQAAAAl1cGRhdGVBbW0AAAAGBQAAAAdfcXRBc3RSBQAAAAdfYnNBc3RSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQEAAAAOdXBkYXRlU2V0dGluZ3MAAAAHBQAAABBfaW5pdE1hcmdpblJhdGlvBQAAAARfbW1yBQAAABRfbGlxdWlkYXRpb25GZWVSYXRpbwUAAAAOX2Z1bmRpbmdQZXJpb2QFAAAABF9mZWUFAAAADF9zcHJlYWRMaW1pdAUAAAAPX21heFByaWNlSW1wYWN0CQEAAAANdXBkYXRlRnVuZGluZwAAAAQAAAAAAAAAAAAJAABkAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAADl9mdW5kaW5nUGVyaW9kAAAAAAAAAAAAAAAAAAAAAAAACQEAAAANdXBkYXRlQmFsYW5jZQAAAAEAAAAAAAAAAAAJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAADWtfaW5pdGlhbGl6ZWQGCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAABWtfb3JhBQAAAAdfb3JhY2xlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACWtfb3JhX2tleQUAAAAKX29yYWNsZUtleQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwUAAAAMX2Nvb3JkaW5hdG9yBQAAAANuaWwAAAABaQEAAAAQZGVjcmVhc2VQb3NpdGlvbgAAAAQAAAAKX2RpcmVjdGlvbgAAAAdfYW1vdW50AAAACV9sZXZlcmFnZQAAABNfbWluQmFzZUFzc2V0QW1vdW50AwMDAwMDAwkBAAAAAiE9AAAAAgUAAAAKX2RpcmVjdGlvbgUAAAAIRElSX0xPTkcJAQAAAAIhPQAAAAIFAAAACl9kaXJlY3Rpb24FAAAACURJUl9TSE9SVAcGCQAAZwAAAAIAAAAAAAAAAAAFAAAAB19hbW91bnQGAwkAAGYAAAACCQAAaAAAAAIAAAAAAAAAAAEFAAAADERFQ0lNQUxfVU5JVAUAAAAJX2xldmVyYWdlBgkAAGYAAAACBQAAAAlfbGV2ZXJhZ2UJAABoAAAAAgAAAAAAAAAAAwUAAAAMREVDSU1BTF9VTklUBgkBAAAAASEAAAABCQEAAAALaW5pdGlhbGl6ZWQAAAAABgkBAAAAASEAAAABCQEAAAAWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwAAAAMJAQAAAARkaXZkAAAAAgUAAAAMREVDSU1BTF9VTklUBQAAAAlfbGV2ZXJhZ2UJAQAAAA9pbml0TWFyZ2luUmF0aW8AAAAABgYJAQAAAAZwYXVzZWQAAAAACQAAAgAAAAECAAAAI0ludmFsaWQgZGVjcmVhc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBAAAAA0kdDAyMzQ1OTIzNjExCQEAAAALZ2V0UG9zaXRpb24AAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAPb2xkUG9zaXRpb25TaXplCAUAAAANJHQwMjM0NTkyMzYxMQAAAAJfMQQAAAARb2xkUG9zaXRpb25NYXJnaW4IBQAAAA0kdDAyMzQ1OTIzNjExAAAAAl8yBAAAABdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFAAAADSR0MDIzNDU5MjM2MTEAAAACXzMEAAAAFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUAAAANJHQwMjM0NTkyMzYxMQAAAAJfNAQAAAANaXNOZXdQb3NpdGlvbgkAAAAAAAACBQAAAA9vbGRQb3NpdGlvblNpemUAAAAAAAAAAAAEAAAAD2lzU2FtZURpcmVjdGlvbgMJAABmAAAAAgUAAAAPb2xkUG9zaXRpb25TaXplAAAAAAAAAAAACQAAAAAAAAIFAAAACl9kaXJlY3Rpb24FAAAACERJUl9MT05HCQAAAAAAAAIFAAAACl9kaXJlY3Rpb24FAAAACURJUl9TSE9SVAQAAAAOZXhwYW5kRXhpc3RpbmcDCQEAAAABIQAAAAEFAAAADWlzTmV3UG9zaXRpb24FAAAAD2lzU2FtZURpcmVjdGlvbgcEAAAABWlzQWRkCQAAAAAAAAIFAAAACl9kaXJlY3Rpb24FAAAACERJUl9MT05HBAAAAA0kdDAyMzkwMDI2Nzk4AwMFAAAADWlzTmV3UG9zaXRpb24GBQAAAA5leHBhbmRFeGlzdGluZwkAAAIAAAABAgAAADVVc2UgaW5jcmVhc2VQb3NpdGlvbiB0byBvcGVuIG5ldyBvciBpbmNyZWFzZSBwb3NpdGlvbgQAAAAMb3Blbk5vdGlvbmFsCQEAAAAEbXVsZAAAAAIFAAAAB19hbW91bnQFAAAACV9sZXZlcmFnZQQAAAANJHQwMjQ0MDUyNDUyMQkBAAAAI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAD1BOTF9PUFRJT05fU1BPVAQAAAATb2xkUG9zaXRpb25Ob3Rpb25hbAgFAAAADSR0MDI0NDA1MjQ1MjEAAAACXzEEAAAADXVucmVhbGl6ZWRQbmwIBQAAAA0kdDAyNDQwNTI0NTIxAAAAAl8yAwkAAGYAAAACBQAAABNvbGRQb3NpdGlvbk5vdGlvbmFsBQAAAAxvcGVuTm90aW9uYWwEAAAADSR0MDI0NTgzMjQ4NjMJAQAAAAlzd2FwSW5wdXQAAAACBQAAAAVpc0FkZAUAAAAMb3Blbk5vdGlvbmFsBAAAABVleGNoYW5nZWRQb3NpdGlvblNpemUIBQAAAA0kdDAyNDU4MzI0ODYzAAAAAl8xBAAAABZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUAAAANJHQwMjQ1ODMyNDg2MwAAAAJfMgQAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUAAAANJHQwMjQ1ODMyNDg2MwAAAAJfMwQAAAAkYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyCAUAAAANJHQwMjQ1ODMyNDg2MwAAAAJfNAQAAAAWdG90YWxQb3NpdGlvblNpemVBZnRlcggFAAAADSR0MDI0NTgzMjQ4NjMAAAACXzUEAAAAF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUAAAANJHQwMjQ1ODMyNDg2MwAAAAJfNgQAAAAYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzCQEAAAADYWJzAAAAAQUAAAAVZXhjaGFuZ2VkUG9zaXRpb25TaXplAwMJAQAAAAIhPQAAAAIFAAAAE19taW5CYXNlQXNzZXRBbW91bnQAAAAAAAAAAAAJAABmAAAAAgUAAAATX21pbkJhc2VBc3NldEFtb3VudAUAAAAYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzBwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACZUb28gbGl0dGxlIGJhc3NlIGFzc2V0IGV4Y2hhbmdlZCwgZ290IAkAAaQAAAABBQAAABhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMCAAAACiBleHBlY3RlZCAJAAGkAAAAAQUAAAATX21pbkJhc2VBc3NldEFtb3VudAQAAAALcmVhbGl6ZWRQbmwDCQEAAAACIT0AAAACBQAAAA9vbGRQb3NpdGlvblNpemUAAAAAAAAAAAAJAQAAAARkaXZkAAAAAgkBAAAABG11bGQAAAACBQAAAA11bnJlYWxpemVkUG5sBQAAABhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMFAAAAD29sZFBvc2l0aW9uU2l6ZQAAAAAAAAAAAAQAAAANJHQwMjU0MDQyNTY3NQkBAAAAImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQAAAAEBQAAAA9vbGRQb3NpdGlvblNpemUFAAAAEW9sZFBvc2l0aW9uTWFyZ2luBQAAABRvbGRQb3NpdGlvbkxzdFVwZENQRgUAAAALcmVhbGl6ZWRQbmwEAAAADHJlbWFpbk1hcmdpbggFAAAADSR0MDI1NDA0MjU2NzUAAAACXzEEAAAAB2JhZERlYnQIBQAAAA0kdDAyNTQwNDI1Njc1AAAAAl8yBAAAAA5mdW5kaW5nUGF5bWVudAgFAAAADSR0MDI1NDA0MjU2NzUAAAACXzMEAAAADG9sZExhdGVzdENQRggFAAAADSR0MDI1NDA0MjU2NzUAAAACXzQEAAAAGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFAAAADG9wZW5Ob3Rpb25hbAQAAAASdW5yZWFsaXplZFBubEFmdGVyCQAAZQAAAAIFAAAADXVucmVhbGl6ZWRQbmwFAAAAC3JlYWxpemVkUG5sBAAAABJyZW1haW5PcGVuTm90aW9uYWwDCQAAZgAAAAIFAAAAD29sZFBvc2l0aW9uU2l6ZQAAAAAAAAAAAAkAAGUAAAACCQAAZQAAAAIFAAAAE29sZFBvc2l0aW9uTm90aW9uYWwFAAAAGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFAAAAEnVucmVhbGl6ZWRQbmxBZnRlcgkAAGUAAAACCQAAZAAAAAIFAAAAEnVucmVhbGl6ZWRQbmxBZnRlcgUAAAATb2xkUG9zaXRpb25Ob3Rpb25hbAUAAAAZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkABRwAAAAKCQAAZAAAAAIFAAAAD29sZFBvc2l0aW9uU2l6ZQUAAAAVZXhjaGFuZ2VkUG9zaXRpb25TaXplBQAAAAxyZW1haW5NYXJnaW4JAQAAAANhYnMAAAABBQAAABJyZW1haW5PcGVuTm90aW9uYWwFAAAADG9sZExhdGVzdENQRgUAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAABZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAACRiYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIFAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFAAAAF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCQAAZQAAAAIJAQAAABVvcGVuSW50ZXJlc2V0Tm90aW9uYWwAAAAABQAAAAxvcGVuTm90aW9uYWwJAAACAAAAAQIAAAAUQ2xvc2UgcG9zaXRpb24gZmlyc3QEAAAAD25ld1Bvc2l0aW9uU2l6ZQgFAAAADSR0MDIzOTAwMjY3OTgAAAACXzEEAAAAF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luCAUAAAANJHQwMjM5MDAyNjc5OAAAAAJfMgQAAAAWbmV3UG9zaWlvbk9wZW5Ob3Rpb25hbAgFAAAADSR0MDIzOTAwMjY3OTgAAAACXzMEAAAAFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCAUAAAANJHQwMjM5MDAyNjc5OAAAAAJfNAQAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUAAAANJHQwMjM5MDAyNjc5OAAAAAJfNQQAAAAWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDIzOTAwMjY3OTgAAAACXzYEAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcggFAAAADSR0MDIzOTAwMjY3OTgAAAACXzcEAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQAAAA0kdDAyMzkwMDI2Nzk4AAAAAl84BAAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFAAAADSR0MDIzOTAwMjY3OTgAAAACXzkEAAAAGm9wZW5JbnRlcmVzZXROb3Rpb25hbEFmdGVyCAUAAAANJHQwMjM5MDAyNjc5OAAAAANfMTAJAAROAAAAAgkBAAAADnVwZGF0ZVBvc2l0aW9uAAAABQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAD25ld1Bvc2l0aW9uU2l6ZQUAAAAXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4FAAAAFm5ld1Bvc2lpb25PcGVuTm90aW9uYWwFAAAAFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCQEAAAAJdXBkYXRlQW1tAAAABgUAAAAWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAACRiYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIFAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFAAAAF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBQAAABpvcGVuSW50ZXJlc2V0Tm90aW9uYWxBZnRlcgAAAAFpAQAAABBpbmNyZWFzZVBvc2l0aW9uAAAAAwAAAApfZGlyZWN0aW9uAAAACV9sZXZlcmFnZQAAABNfbWluQmFzZUFzc2V0QW1vdW50BAAAAApfcmF3QW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQDAwMDAwMDAwkBAAAAAiE9AAAAAgUAAAAKX2RpcmVjdGlvbgUAAAAIRElSX0xPTkcJAQAAAAIhPQAAAAIFAAAACl9kaXJlY3Rpb24FAAAACURJUl9TSE9SVAcGCQAAZwAAAAIAAAAAAAAAAAAFAAAACl9yYXdBbW91bnQGAwkAAGYAAAACCQAAaAAAAAIAAAAAAAAAAAEFAAAADERFQ0lNQUxfVU5JVAUAAAAJX2xldmVyYWdlBgkAAGYAAAACBQAAAAlfbGV2ZXJhZ2UJAABoAAAAAgAAAAAAAAAAAwUAAAAMREVDSU1BTF9VTklUBgkBAAAAASEAAAABCQEAAAALaW5pdGlhbGl6ZWQAAAAABgkBAAAAAiE9AAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAkBAAAACnF1b3RlQXNzZXQAAAAABgkBAAAAASEAAAABCQEAAAAWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwAAAAMJAQAAAARkaXZkAAAAAgUAAAAMREVDSU1BTF9VTklUBQAAAAlfbGV2ZXJhZ2UJAQAAAA9pbml0TWFyZ2luUmF0aW8AAAAABgYJAQAAAAZwYXVzZWQAAAAACQAAAgAAAAECAAAAI0ludmFsaWQgaW5jcmVhc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBAAAAAlmZWVBbW91bnQJAQAAAARtdWxkAAAAAgUAAAAKX3Jhd0Ftb3VudAkBAAAAA2ZlZQAAAAAEAAAAB19hbW91bnQJAABlAAAAAgUAAAAKX3Jhd0Ftb3VudAUAAAAJZmVlQW1vdW50BAAAAA0kdDAyNzgzMzI3OTg1CQEAAAALZ2V0UG9zaXRpb24AAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAPb2xkUG9zaXRpb25TaXplCAUAAAANJHQwMjc4MzMyNzk4NQAAAAJfMQQAAAARb2xkUG9zaXRpb25NYXJnaW4IBQAAAA0kdDAyNzgzMzI3OTg1AAAAAl8yBAAAABdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFAAAADSR0MDI3ODMzMjc5ODUAAAACXzMEAAAAFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUAAAANJHQwMjc4MzMyNzk4NQAAAAJfNAQAAAANaXNOZXdQb3NpdGlvbgkAAAAAAAACBQAAAA9vbGRQb3NpdGlvblNpemUAAAAAAAAAAAAEAAAAD2lzU2FtZURpcmVjdGlvbgMJAABmAAAAAgUAAAAPb2xkUG9zaXRpb25TaXplAAAAAAAAAAAACQAAAAAAAAIFAAAACl9kaXJlY3Rpb24FAAAACERJUl9MT05HCQAAAAAAAAIFAAAACl9kaXJlY3Rpb24FAAAACURJUl9TSE9SVAQAAAAOZXhwYW5kRXhpc3RpbmcDCQEAAAABIQAAAAEFAAAADWlzTmV3UG9zaXRpb24FAAAAD2lzU2FtZURpcmVjdGlvbgcEAAAABWlzQWRkCQAAAAAAAAIFAAAACl9kaXJlY3Rpb24FAAAACERJUl9MT05HBAAAAA0kdDAyODI3NDMwNTYzAwMFAAAADWlzTmV3UG9zaXRpb24GBQAAAA5leHBhbmRFeGlzdGluZwQAAAAMb3Blbk5vdGlvbmFsCQEAAAAEbXVsZAAAAAIFAAAAB19hbW91bnQFAAAACV9sZXZlcmFnZQQAAAANJHQwMjg2OTcyODk0OQkBAAAACXN3YXBJbnB1dAAAAAIFAAAABWlzQWRkBQAAAAxvcGVuTm90aW9uYWwEAAAAFWFtb3VudEJhc2VBc3NldEJvdWdodAgFAAAADSR0MDI4Njk3Mjg5NDkAAAACXzEEAAAAFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQAAAA0kdDAyODY5NzI4OTQ5AAAAAl8yBAAAABViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQAAAA0kdDAyODY5NzI4OTQ5AAAAAl8zBAAAACRiYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIIBQAAAA0kdDAyODY5NzI4OTQ5AAAAAl80BAAAABZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUAAAANJHQwMjg2OTcyODk0OQAAAAJfNQQAAAAXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQAAAA0kdDAyODY5NzI4OTQ5AAAAAl82AwMJAQAAAAIhPQAAAAIFAAAAE19taW5CYXNlQXNzZXRBbW91bnQAAAAAAAAAAAAJAABmAAAAAgUAAAATX21pbkJhc2VBc3NldEFtb3VudAkBAAAAA2FicwAAAAEFAAAAFWFtb3VudEJhc2VBc3NldEJvdWdodAcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAANTGltaXQgZXJyb3I6IAkAAaQAAAABCQEAAAADYWJzAAAAAQUAAAAVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AgAAAAMgPCAJAAGkAAAAAQUAAAATX21pbkJhc2VBc3NldEFtb3VudAQAAAAPbmV3UG9zaXRpb25TaXplCQAAZAAAAAIFAAAAD29sZFBvc2l0aW9uU2l6ZQUAAAAVYW1vdW50QmFzZUFzc2V0Qm91Z2h0BAAAABlpbmNyZWFzZU1hcmdpblJlcXVpcmVtZW50CQEAAAAEZGl2ZAAAAAIFAAAADG9wZW5Ob3Rpb25hbAUAAAAJX2xldmVyYWdlBAAAAA0kdDAyOTMzMDI5NTgzCQEAAAAiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAAAAAQFAAAAD29sZFBvc2l0aW9uU2l6ZQUAAAARb2xkUG9zaXRpb25NYXJnaW4FAAAAFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBQAAABlpbmNyZWFzZU1hcmdpblJlcXVpcmVtZW50BAAAAAxyZW1haW5NYXJnaW4IBQAAAA0kdDAyOTMzMDI5NTgzAAAAAl8xBAAAAAJ4MQgFAAAADSR0MDI5MzMwMjk1ODMAAAACXzIEAAAAAngyCAUAAAANJHQwMjkzMzAyOTU4MwAAAAJfMwQAAAAMb2xkTGF0ZXN0Q1BGCAUAAAANJHQwMjkzMzAyOTU4MwAAAAJfNAkABRwAAAAKBQAAAA9uZXdQb3NpdGlvblNpemUFAAAADHJlbWFpbk1hcmdpbgkAAGQAAAACBQAAABdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAUAAAAMb3Blbk5vdGlvbmFsBQAAAAxvbGRMYXRlc3RDUEYFAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcgUAAAAWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUAAAAkYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyBQAAABZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBQAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgkAAGQAAAACCQEAAAAVb3BlbkludGVyZXNldE5vdGlvbmFsAAAAAAUAAAAMb3Blbk5vdGlvbmFsBAAAAAxvcGVuTm90aW9uYWwJAQAAAARtdWxkAAAAAgUAAAAHX2Ftb3VudAUAAAAJX2xldmVyYWdlBAAAAA0kdDAzMDI1NjMwMzcyCQEAAAAjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAPUE5MX09QVElPTl9TUE9UBAAAABNvbGRQb3NpdGlvbk5vdGlvbmFsCAUAAAANJHQwMzAyNTYzMDM3MgAAAAJfMQQAAAANdW5yZWFsaXplZFBubAgFAAAADSR0MDMwMjU2MzAzNzIAAAACXzIDCQAAZgAAAAIFAAAAE29sZFBvc2l0aW9uTm90aW9uYWwFAAAADG9wZW5Ob3Rpb25hbAkAAAIAAAABAgAAAC5Vc2UgZGVjcmVhc2VQb3NpdGlvbiB0byBkZWNyZWFzZSBwb3NpdGlvbiBzaXplCQAAAgAAAAECAAAAFENsb3NlIHBvc2l0aW9uIGZpcnN0BAAAAA9uZXdQb3NpdGlvblNpemUIBQAAAA0kdDAyODI3NDMwNTYzAAAAAl8xBAAAABduZXdQb3NpdGlvblJlbWFpbk1hcmdpbggFAAAADSR0MDI4Mjc0MzA1NjMAAAACXzIEAAAAFm5ld1Bvc2lpb25PcGVuTm90aW9uYWwIBQAAAA0kdDAyODI3NDMwNTYzAAAAAl8zBAAAABRuZXdQb3NpdGlvbkxhdGVzdENQRggFAAAADSR0MDI4Mjc0MzA1NjMAAAACXzQEAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcggFAAAADSR0MDI4Mjc0MzA1NjMAAAACXzUEAAAAFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQAAAA0kdDAyODI3NDMwNTYzAAAAAl82BAAAACRiYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIIBQAAAA0kdDAyODI3NDMwNTYzAAAAAl83BAAAABZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUAAAANJHQwMjgyNzQzMDU2MwAAAAJfOAQAAAAXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQAAAA0kdDAyODI3NDMwNTYzAAAAAl85BAAAABpvcGVuSW50ZXJlc2V0Tm90aW9uYWxBZnRlcggFAAAADSR0MDI4Mjc0MzA1NjMAAAADXzEwBAAAAAxmZWVUb1N0YWtlcnMJAABpAAAAAgUAAAAJZmVlQW1vdW50AAAAAAAAAAACBAAAAA5mZWVUb0luc3VyYW5jZQkAAGUAAAACBQAAAAlmZWVBbW91bnQFAAAADGZlZVRvU3Rha2VycwQAAAAFc3Rha2UJAAP8AAAABAkBAAAAEXF1b3RlQXNzZXRTdGFraW5nAAAAAAIAAAAObG9ja05ldXRyaW5vU1AJAARMAAAAAgkABCUAAAABCQEAAAAOc3Rha2luZ0FkZHJlc3MAAAAACQAETAAAAAIFAAAACEFMTF9GRUVTBQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIJAQAAAApxdW90ZUFzc2V0AAAAAAUAAAAHX2Ftb3VudAUAAAADbmlsAwkAAAAAAAACBQAAAAVzdGFrZQUAAAAFc3Rha2UEAAAAEGRlcG9zaXRJbnN1cmFuY2UJAAP8AAAABAkBAAAAEGluc3VyYW5jZUFkZHJlc3MAAAAAAgAAAAdkZXBvc2l0BQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIJAQAAAApxdW90ZUFzc2V0AAAAAAUAAAAOZmVlVG9JbnN1cmFuY2UFAAAAA25pbAMJAAAAAAAAAgUAAAAQZGVwb3NpdEluc3VyYW5jZQUAAAAQZGVwb3NpdEluc3VyYW5jZQkABE4AAAACCQAETgAAAAIJAAROAAAAAgkBAAAADnVwZGF0ZVBvc2l0aW9uAAAABQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAD25ld1Bvc2l0aW9uU2l6ZQUAAAAXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4FAAAAFm5ld1Bvc2lpb25PcGVuTm90aW9uYWwFAAAAFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCQEAAAAJdXBkYXRlQW1tAAAABgUAAAAWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUAAAAVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAACRiYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIFAAAAFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFAAAAF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBQAAABpvcGVuSW50ZXJlc2V0Tm90aW9uYWxBZnRlcgkBAAAAC3RyYW5zZmVyRmVlAAAAAQUAAAAMZmVlVG9TdGFrZXJzCQEAAAANdXBkYXRlQmFsYW5jZQAAAAEJAABkAAAAAgkBAAAACGNiYWxhbmNlAAAAAAUAAAAHX2Ftb3VudAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0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ASEAAAABCQEAAAALaW5pdGlhbGl6ZWQAAAAABgkBAAAABnBhdXNlZAAAAAAJAAACAAAAAQIAAAAfSW52YWxpZCByZW1vdmVNYXJnaW4gcGFyYW1ldGVycwQAAAANJHQwMzI5MjMzMzA3NQkBAAAAC2dldFBvc2l0aW9uAAAAAQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAD29sZFBvc2l0aW9uU2l6ZQgFAAAADSR0MDMyOTIzMzMwNzUAAAACXzEEAAAAEW9sZFBvc2l0aW9uTWFyZ2luCAUAAAANJHQwMzI5MjMzMzA3NQAAAAJfMgQAAAAXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQAAAA0kdDAzMjkyMzMzMDc1AAAAAl8zBAAAABRvbGRQb3NpdGlvbkxzdFVwZENQRggFAAAADSR0MDMyOTIzMzMwNzUAAAACXzQEAAAAC21hcmdpbkRlbHRhCQEAAAABLQAAAAEFAAAAB19hbW91bnQEAAAADSR0MDMzMTEyMzMzMDcJAQAAACJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50AAAABAUAAAAPb2xkUG9zaXRpb25TaXplBQAAABFvbGRQb3NpdGlvbk1hcmdpbgUAAAAUb2xkUG9zaXRpb25Mc3RVcGRDUEYFAAAAC21hcmdpbkRlbHRhBAAAAAxyZW1haW5NYXJnaW4IBQAAAA0kdDAzMzExMjMzMzA3AAAAAl8xBAAAAAdiYWREZWJ0CAUAAAANJHQwMzMxMTIzMzMwNwAAAAJfMgQAAAACeDEIBQAAAA0kdDAzMzExMjMzMzA3AAAAAl8zBAAAAApsYXRlc3RDUEYxCAUAAAANJHQwMzMxMTIzMzMwNwAAAAJfNAMJAQAAAAIhPQAAAAIFAAAAB2JhZERlYnQAAAAAAAAAAAAJAAACAAAAAQIAAAAbSW52YWxpZCBhZGRlZCBtYXJnaW4gYW1vdW50BAAAAAd1bnN0YWtlCQAD/AAAAAQJAQAAABFxdW90ZUFzc2V0U3Rha2luZwAAAAACAAAADnVubG9ja05ldXRyaW5vCQAETAAAAAIFAAAAB19hbW91bnQJAARMAAAAAgkAAlgAAAABCQEAAAAKcXVvdGVBc3NldAAAAAAFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAd1bnN0YWtlBQAAAAd1bnN0YWtlCQAETgAAAAIJAAROAAAAAgkBAAAADnVwZGF0ZVBvc2l0aW9uAAAABQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAD29sZFBvc2l0aW9uU2l6ZQUAAAAMcmVtYWluTWFyZ2luBQAAABdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAUAAAAKbGF0ZXN0Q1BGMQkBAAAACHdpdGhkcmF3AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAdfYW1vdW50CQEAAAANdXBkYXRlQmFsYW5jZQAAAAEJAABlAAAAAgkBAAAACGNiYWxhbmNlAAAAAAUAAAAHX2Ftb3VudAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAANY2xvc2VQb3NpdGlvbgAAAAADAwMJAQAAAAEhAAAAAQkBAAAAE3JlcXVpcmVPcGVuUG9zaXRpb24AAAABCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgYJAQAAAAEhAAAAAQkBAAAAC2luaXRpYWxpemVkAAAAAAYJAQAAAAZwYXVzZWQAAAAACQAAAgAAAAECAAAAIEludmFsaWQgY2xvc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBAAAAA0kdDAzNDAyOTM0Mzg3CQEAAAAVaW50ZXJuYWxDbG9zZVBvc2l0aW9uAAAAAQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAAngxCAUAAAANJHQwMzQwMjkzNDM4NwAAAAJfMQQAAAAHYmFkRGVidAgFAAAADSR0MDM0MDI5MzQzODcAAAACXzIEAAAAC3JlYWxpemVkUG5sCAUAAAANJHQwMzQwMjkzNDM4NwAAAAJfMwQAAAANbWFyZ2luVG9WYXVsdAgFAAAADSR0MDM0MDI5MzQzODcAAAACXzQEAAAAFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQAAAA0kdDAzNDAyOTM0Mzg3AAAAAl81BAAAABViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQAAAA0kdDAzNDAyOTM0Mzg3AAAAAl82BAAAACRiYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIIBQAAAA0kdDAzNDAyOTM0Mzg3AAAAAl83BAAAABZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUAAAANJHQwMzQwMjkzNDM4NwAAAAJfOAQAAAAXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQAAAA0kdDAzNDAyOTM0Mzg3AAAAAl85BAAAABpvcGVuSW50ZXJlc2V0Tm90aW9uYWxBZnRlcggFAAAADSR0MDM0MDI5MzQzODcAAAADXzEwAwkAAGYAAAACBQAAAAdiYWREZWJ0AAAAAAAAAAAACQAAAgAAAAECAAAAJlVuYWJsZSB0byBjbG9zZSBwb3NpdGlvbiB3aXRoIGJhZCBkZWJ0BAAAAA53aXRoZHJhd0Ftb3VudAkBAAAAA2FicwAAAAEFAAAADW1hcmdpblRvVmF1bHQEAAAAAmJkCQAAZQAAAAIJAQAAAAhjYmFsYW5jZQAAAAAFAAAADndpdGhkcmF3QW1vdW50BAAAAA0kdDAzNDU4MDM0Njc2AwkAAGYAAAACAAAAAAAAAAAABQAAAAJiZAkABRQAAAACAAAAAAAAAAAACQEAAAADYWJzAAAAAQUAAAACYmQJAAUUAAAAAgUAAAACYmQAAAAAAAAAAAAEAAAAAm5iCAUAAAANJHQwMzQ1ODAzNDY3NgAAAAJfMQQAAAAFZnJvbWkIBQAAAA0kdDAzNDU4MDM0Njc2AAAAAl8yBAAAAAF4AwkAAGYAAAACBQAAAAVmcm9taQAAAAAAAAAAAAQAAAARd2l0aGRyYXdJbnN1cmFuY2UJAAP8AAAABAkBAAAAEGluc3VyYW5jZUFkZHJlc3MAAAAAAgAAAAh3aXRoZHJhdwkABEwAAAACBQAAAAVmcm9taQUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAEXdpdGhkcmF3SW5zdXJhbmNlBQAAABF3aXRoZHJhd0luc3VyYW5jZQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUAAAADbmlsAwkAAAAAAAACBQAAAAF4BQAAAAF4BAAAAAd1bnN0YWtlCQAD/AAAAAQJAQAAABFxdW90ZUFzc2V0U3Rha2luZwAAAAACAAAADnVubG9ja05ldXRyaW5vCQAETAAAAAIJAABlAAAAAgUAAAAOd2l0aGRyYXdBbW91bnQFAAAABWZyb21pCQAETAAAAAIJAAJYAAAAAQkBAAAACnF1b3RlQXNzZXQAAAAABQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAHdW5zdGFrZQUAAAAHdW5zdGFrZQkABE4AAAACCQAETgAAAAIJAAROAAAAAgkBAAAADmRlbGV0ZVBvc2l0aW9uAAAAAQkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAQAAAAl1cGRhdGVBbW0AAAAGBQAAABZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBQAAABViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFAAAAJGJhc2VBc3NldERlbHRhVGhpc0Z1bmRpbmdQZXJpb2RBZnRlcgUAAAAWdG90YWxQb3NpdGlvblNpemVBZnRlcgUAAAAXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIFAAAAGm9wZW5JbnRlcmVzZXROb3Rpb25hbEFmdGVyCQEAAAAId2l0aGRyYXcAAAACCAUAAAABaQAAAAZjYWxsZXIFAAAADndpdGhkcmF3QW1vdW50CQEAAAANdXBkYXRlQmFsYW5jZQAAAAEFAAAAAm5iCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAJbGlxdWlkYXRlAAAAAQAAAAdfdHJhZGVyBAAAAAttYXJnaW5SYXRpbwMJAQAAABZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAAAAAkBAAAAFmdldE1hcmdpblJhdGlvQnlPcHRpb24AAAACBQAAAAdfdHJhZGVyBQAAABFQTkxfT1BUSU9OX09SQUNMRQkBAAAAFmdldE1hcmdpblJhdGlvQnlPcHRpb24AAAACBQAAAAdfdHJhZGVyBQAAAA9QTkxfT1BUSU9OX1NQT1QDAwMJAQAAAAEhAAAAAQkBAAAAFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8AAAADBQAAAAttYXJnaW5SYXRpbwkBAAAAA21tcgAAAAAHBgkBAAAAASEAAAABCQEAAAALaW5pdGlhbGl6ZWQAAAAABgkBAAAABnBhdXNlZAAAAAAJAAACAAAAAQIAAAATVW5hYmxlIHRvIGxpcXVpZGF0ZQQAAAANJHQwMzU4NDgzNjE3OAkBAAAAFWludGVybmFsQ2xvc2VQb3NpdGlvbgAAAAEFAAAAB190cmFkZXIEAAAAAngxCAUAAAANJHQwMzU4NDgzNjE3OAAAAAJfMQQAAAAHYmFkRGVidAgFAAAADSR0MDM1ODQ4MzYxNzgAAAACXzIEAAAAAngyCAUAAAANJHQwMzU4NDgzNjE3OAAAAAJfMwQAAAANbWFyZ2luVG9WYXVsdAgFAAAADSR0MDM1ODQ4MzYxNzgAAAACXzQEAAAAFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQAAAA0kdDAzNTg0ODM2MTc4AAAAAl81BAAAABViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQAAAA0kdDAzNTg0ODM2MTc4AAAAAl82BAAAACRiYXNlQXNzZXREZWx0YVRoaXNGdW5kaW5nUGVyaW9kQWZ0ZXIIBQAAAA0kdDAzNTg0ODM2MTc4AAAAAl83BAAAABZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUAAAANJHQwMzU4NDgzNjE3OAAAAAJfOAQAAAAXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQAAAA0kdDAzNTg0ODM2MTc4AAAAAl85BAAAABpvcGVuSW50ZXJlc2V0Tm90aW9uYWxBZnRlcggFAAAADSR0MDM1ODQ4MzYxNzgAAAADXzEwBAAAABlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUAAAANJHQwMzU4NDgzNjE3OAAAAANfMTEEAAAAD2ZlZVRvTGlxdWlkYXRvcgkAAGkAAAACCQEAAAAEbXVsZAAAAAIFAAAAGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJAQAAABNsaXF1aWRhdGlvbkZlZVJhdGlvAAAAAAAAAAAAAAAAAgQAAAANJHQwMzYyNjgzNjY3MgMJAABmAAAAAgUAAAAPZmVlVG9MaXF1aWRhdG9yBQAAAA1tYXJnaW5Ub1ZhdWx0CQAFFQAAAAMJAABlAAAAAgUAAAAPZmVlVG9MaXF1aWRhdG9yBQAAAA1tYXJnaW5Ub1ZhdWx0BQAAAA1tYXJnaW5Ub1ZhdWx0CQAAZQAAAAIJAABkAAAAAgUAAAAHYmFkRGVidAUAAAAPZmVlVG9MaXF1aWRhdG9yBQAAAA1tYXJnaW5Ub1ZhdWx0CQAFFQAAAAMAAAAAAAAAAAAJAABlAAAAAgUAAAANbWFyZ2luVG9WYXVsdAUAAAAPZmVlVG9MaXF1aWRhdG9yBQAAAAdiYWREZWJ0BAAAABJsaXF1aWRhdGlvbkJhZERlYnQIBQAAAA0kdDAzNjI2ODM2NjcyAAAAAl8xBAAAAAxyZW1haW5NYXJnaW4IBQAAAA0kdDAzNjI2ODM2NjcyAAAAAl8yBAAAAAx0b3RhbEJhZERlYnQIBQAAAA0kdDAzNjI2ODM2NjcyAAAAAl8zBAAAAAJiZAkAAGUAAAACCQEAAAAIY2JhbGFuY2UAAAAABQAAAA9mZWVUb0xpcXVpZGF0b3IEAAAADSR0MDM2NzIwMzY4MDgDCQAAZgAAAAIAAAAAAAAAAAAFAAAAAmJkCQAFFAAAAAIAAAAAAAAAAAAJAQAAAANhYnMAAAABBQAAAAJiZAkABRQAAAACBQAAAAJiZAAAAAAAAAAAAAQAAAACbmIIBQAAAA0kdDAzNjcyMDM2ODA4AAAAAl8xBAAAAAVmcm9taQgFAAAADSR0MDM2NzIwMzY4MDgAAAACXzIEAAAAAXgDCQAAZgAAAAIFAAAABWZyb21pAAAAAAAAAAAABAAAABF3aXRoZHJhd0luc3VyYW5jZQkAA/wAAAAECQEAAAAQaW5zdXJhbmNlQWRkcmVzcwAAAAACAAAACHdpdGhkcmF3CQAETAAAAAIFAAAABWZyb21pBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAARd2l0aGRyYXdJbnN1cmFuY2UFAAAAEXdpdGhkcmF3SW5zdXJhbmNlBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQAAAANuaWwDCQAAAAAAAAIFAAAAAXgFAAAAAXgEAAAAB3Vuc3Rha2UJAAP8AAAABAkBAAAAEXF1b3RlQXNzZXRTdGFraW5nAAAAAAIAAAAOdW5sb2NrTmV1dHJpbm8JAARMAAAAAgkAAGUAAAACBQAAAA9mZWVUb0xpcXVpZGF0b3IFAAAABWZyb21pCQAETAAAAAIJAAJYAAAAAQkBAAAACnF1b3RlQXNzZXQAAAAABQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAHdW5zdGFrZQUAAAAHdW5zdGFrZQkABE4AAAACCQAETgAAAAIJAAROAAAAAgkBAAAADmRlbGV0ZVBvc2l0aW9uAAAAAQUAAAAHX3RyYWRlcgkBAAAACXVwZGF0ZUFtbQAAAAYFAAAAFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFAAAAFWJhc2VBc3NldFJlc2VydmVBZnRlcgUAAAAkYmFzZUFzc2V0RGVsdGFUaGlzRnVuZGluZ1BlcmlvZEFmdGVyBQAAABZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBQAAABdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUAAAAab3BlbkludGVyZXNldE5vdGlvbmFsQWZ0ZXIJAQAAAAh3aXRoZHJhdwAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAPZmVlVG9MaXF1aWRhdG9yCQEAAAANdXBkYXRlQmFsYW5jZQAAAAEFAAAAAm5iCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAKcGF5RnVuZGluZwAAAAAEAAAAFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAkBAAAAGW5leHRGdW5kaW5nQmxvY2tUaW1lc3RhbXAAAAAAAwMDCQAAZgAAAAIFAAAAFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAGCQEAAAABIQAAAAEJAQAAAAtpbml0aWFsaXplZAAAAAAGCQEAAAAGcGF1c2VkAAAAAAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACFJbnZhbGlkIGZ1bmRpbmcgYmxvY2sgdGltZXN0YW1wOiAJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXACAAAAAyA8IAkAAaQAAAABBQAAABVmdW5kaW5nQmxvY2tUaW1lc3RhbXAEAAAAD3VuZGVybHlpbmdQcmljZQkBAAAAEmdldE9yYWNsZVR3YXBQcmljZQAAAAAEAAAADXNwb3RUd2FwUHJpY2UJAQAAABBnZXRUd2FwU3BvdFByaWNlAAAAAAQAAAAHcHJlbWl1bQkAAGUAAAACBQAAAA1zcG90VHdhcFByaWNlBQAAAA91bmRlcmx5aW5nUHJpY2UEAAAAD3ByZW1pdW1GcmFjdGlvbgkBAAAABGRpdmQAAAACCQEAAAAEbXVsZAAAAAIFAAAAB3ByZW1pdW0JAQAAABRmdW5kaW5nUGVyaW9kRGVjaW1hbAAAAAAFAAAAB09ORV9EQVkJAQAAAA11cGRhdGVGdW5kaW5nAAAABAAAAAAAAAAAAAkAAGQAAAACBQAAABVmdW5kaW5nQmxvY2tUaW1lc3RhbXAJAQAAABRmdW5kaW5nUGVyaW9kU2Vjb25kcwAAAAAJAABkAAAAAgkBAAAACWxhdGVzdENQRgAAAAAFAAAAD3ByZW1pdW1GcmFjdGlvbgkBAAAABGRpdmQAAAACBQAAAA9wcmVtaXVtRnJhY3Rpb24FAAAAD3VuZGVybHlpbmdQcmljZQAAAAFpAQAAAAV2X2dldAAAAAEAAAAHX3RyYWRlcgQAAAANJHQwMzgyODIzODMzNQkBAAAAFWludGVybmFsQ2xvc2VQb3NpdGlvbgAAAAEFAAAAB190cmFkZXIEAAAAAngxCAUAAAANJHQwMzgyODIzODMzNQAAAAJfMQQAAAACeDIIBQAAAA0kdDAzODI4MjM4MzM1AAAAAl8yBAAAAAJ4MwgFAAAADSR0MDM4MjgyMzgzMzUAAAACXzMEAAAAAng0CAUAAAANJHQwMzgyODIzODMzNQAAAAJfNAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQEAAAABcwAAAAEFAAAAAngyCQEAAAABcwAAAAEFAAAAAngzCQEAAAABcwAAAAEFAAAAAng0CQEAAAABcwAAAAEJAQAAAA5nZXRNYXJnaW5SYXRpbwAAAAEFAAAAB190cmFkZXIAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkBAAAADmFkbWluUHVibGljS2V5AAAAAI/h53Q=", "height": 2116141, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6k3u1m9eQ9qmhJqpkwfX6KXEsDnZLfBztF2Rvw238Ht8 Next: 8wPJuhUvPX4ievTjioZtpy9cWoNCoquJADKrfpRjydjp Diff:
OldNewDifferences
4343
4444 let k_twap = "k_twap"
4545
46+let k_baseAsstFndDelt = "k_baseAssetDelta"
47+
4648 let k_latestCumulativePremiumFraction = "k_latestPremiumFraction"
4749
4850 let k_nextFundingBlock = "k_nextFundingBlockMinTimestamp"
5355
5456 let k_baseAssetReserve = "k_bsAstR"
5557
56-let k_baseAsstFndDelt = "k_baseAssetDelta"
58+let k_baseAsstFndDe1lt = "k_baseAssetDelta"
5759
5860 let k_totalPositionSize = "k_totalPositionSize"
5961
260262 if ((priceImpact > maxPriceImpactValue))
261263 then throw(((("Price impact " + toString(priceImpact)) + " > max price impact ") + toString(maxPriceImpactValue)))
262264 else {
263- let $t0999810246 = updateReserve(_isAdd, _quoteAssetAmount, amountBaseAssetBoughtAbs)
264- let quoteAssetReserveAfter1 = $t0999810246._1
265- let baseAssetReserveAfter1 = $t0999810246._2
266- let baseAssetDeltaThisFundingPeriodAfter1 = $t0999810246._3
267- let totalPositionSizeAfter1 = $t0999810246._4
268- let cumulativeNotionalAfter1 = $t0999810246._5
265+ let $t0986710115 = updateReserve(_isAdd, _quoteAssetAmount, amountBaseAssetBoughtAbs)
266+ let quoteAssetReserveAfter1 = $t0986710115._1
267+ let baseAssetReserveAfter1 = $t0986710115._2
268+ let baseAssetDeltaThisFundingPeriodAfter1 = $t0986710115._3
269+ let totalPositionSizeAfter1 = $t0986710115._4
270+ let cumulativeNotionalAfter1 = $t0986710115._5
269271 $Tuple6(amountBaseAssetBought, quoteAssetReserveAfter1, baseAssetReserveAfter1, baseAssetDeltaThisFundingPeriodAfter1, totalPositionSizeAfter1, cumulativeNotionalAfter1)
270272 }
271273 }
277279 then muld((_latestCPF - _oldPositionLstUpdCPF), _oldPositionSize)
278280 else 0
279281 let signedMargin = ((_marginDelta - fundingPayment) + _oldPositionMargin)
280- let $t01087711004 = if ((0 > signedMargin))
282+ let $t01073310860 = if ((0 > signedMargin))
281283 then $Tuple2(0, abs(signedMargin))
282284 else $Tuple2(abs(signedMargin), 0)
283- let remainMargin = $t01087711004._1
284- let badDebt = $t01087711004._2
285+ let remainMargin = $t01073310860._1
286+ let badDebt = $t01073310860._2
285287 $Tuple4(remainMargin, badDebt, fundingPayment, _latestCPF)
286288 }
287289
295297 else (_baseAssetPoolAmount - _baseAssetAmount)
296298 let quoteAssetAfter = divd(k, baseAssetPoolAmountAfter)
297299 let quoteAssetSold = abs((quoteAssetAfter - _quoteAssetPoolAmount))
298- let $t01165311889 = updateReserve(!(_add), quoteAssetSold, _baseAssetAmount)
299- let quoteAssetReserveAfter1 = $t01165311889._1
300- let baseAssetReserveAfter1 = $t01165311889._2
301- let baseAssetDeltaThisFundingPeriodAfter1 = $t01165311889._3
302- let totalPositionSizeAfter1 = $t01165311889._4
303- let cumulativeNotionalAfter1 = $t01165311889._5
300+ let $t01150911745 = updateReserve(!(_add), quoteAssetSold, _baseAssetAmount)
301+ let quoteAssetReserveAfter1 = $t01150911745._1
302+ let baseAssetReserveAfter1 = $t01150911745._2
303+ let baseAssetDeltaThisFundingPeriodAfter1 = $t01150911745._3
304+ let totalPositionSizeAfter1 = $t01150911745._4
305+ let cumulativeNotionalAfter1 = $t01150911745._5
304306 $Tuple6(quoteAssetSold, quoteAssetReserveAfter1, baseAssetReserveAfter1, baseAssetDeltaThisFundingPeriodAfter1, totalPositionSizeAfter1, cumulativeNotionalAfter1)
305307 }
306308
327329
328330
329331 func getPositionNotionalAndUnrealizedPnl (_trader,_option) = {
330- let $t01266412775 = getPosition(_trader)
331- let positionSize = $t01266412775._1
332- let positionMargin = $t01266412775._2
333- let pon = $t01266412775._3
334- let positionLstUpdCPF = $t01266412775._4
332+ let $t01252012648 = getPosition(_trader)
333+ let positionSize = $t01252012648._1
334+ let positionMargin = $t01252012648._2
335+ let positionOpenNotional = $t01252012648._3
336+ let positionLstUpdCPF = $t01252012648._4
335337 let positionSizeAbs = abs(positionSize)
336338 if ((positionSizeAbs == 0))
337339 then throw("Invalid position size")
339341 let isShort = (0 > positionSize)
340342 let positionNotional = if ((_option == PNL_OPTION_SPOT))
341343 then {
342- let $t01302213185 = getOutputPriceWithReserves(!(isShort), positionSizeAbs, qtAstR(), bsAstR())
343- let outPositionNotional = $t01302213185._1
344- let x1 = $t01302213185._2
345- let x2 = $t01302213185._3
346- let x3 = $t01302213185._4
344+ let $t01289513058 = getOutputPriceWithReserves(!(isShort), positionSizeAbs, qtAstR(), bsAstR())
345+ let outPositionNotional = $t01289513058._1
346+ let x1 = $t01289513058._2
347+ let x2 = $t01289513058._3
348+ let x3 = $t01289513058._4
347349 outPositionNotional
348350 }
349351 else (positionSizeAbs * getOracleTwapPrice())
350352 let unrealizedPnl = if (isShort)
351- then (pon - positionNotional)
352- else (positionNotional - pon)
353+ then (positionOpenNotional - positionNotional)
354+ else (positionNotional - positionOpenNotional)
353355 $Tuple2(positionNotional, unrealizedPnl)
354356 }
355357 }
358360 func getMarginRatioByOption (_trader,_option) = {
359361 func x () = 0
360362
361- let $t01357513686 = getPosition(_trader)
362- let positionSize = $t01357513686._1
363- let positionMargin = $t01357513686._2
364- let pon = $t01357513686._3
365- let positionLstUpdCPF = $t01357513686._4
366- let $t01369213785 = getPositionNotionalAndUnrealizedPnl(_trader, _option)
367- let positionNotional = $t01369213785._1
368- let unrealizedPnl = $t01369213785._2
369- let $t01379013956 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLstUpdCPF, unrealizedPnl)
370- let remainMargin = $t01379013956._1
371- let badDebt = $t01379013956._2
363+ let $t01348213593 = getPosition(_trader)
364+ let positionSize = $t01348213593._1
365+ let positionMargin = $t01348213593._2
366+ let pon = $t01348213593._3
367+ let positionLstUpdCPF = $t01348213593._4
368+ let $t01359913692 = getPositionNotionalAndUnrealizedPnl(_trader, _option)
369+ let positionNotional = $t01359913692._1
370+ let unrealizedPnl = $t01359913692._2
371+ let $t01369713863 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLstUpdCPF, unrealizedPnl)
372+ let remainMargin = $t01369713863._1
373+ let badDebt = $t01369713863._2
372374 divd((remainMargin - badDebt), positionNotional)
373375 }
374376
377379
378380
379381 func internalClosePosition (_trader) = {
380- let $t01415214263 = getPosition(_trader)
381- let positionSize = $t01415214263._1
382- let positionMargin = $t01415214263._2
383- let pon = $t01415214263._3
384- let positionLstUpdCPF = $t01415214263._4
385- let $t01426914356 = getPositionNotionalAndUnrealizedPnl(_trader, PNL_OPTION_SPOT)
386- let x1 = $t01426914356._1
387- let unrealizedPnl = $t01426914356._2
388- let $t01436114533 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLstUpdCPF, unrealizedPnl)
389- let remainMargin = $t01436114533._1
390- let badDebt = $t01436114533._2
391- let x2 = $t01436114533._3
382+ let $t01405914170 = getPosition(_trader)
383+ let positionSize = $t01405914170._1
384+ let positionMargin = $t01405914170._2
385+ let pon = $t01405914170._3
386+ let positionLstUpdCPF = $t01405914170._4
387+ let $t01417614263 = getPositionNotionalAndUnrealizedPnl(_trader, PNL_OPTION_SPOT)
388+ let x1 = $t01417614263._1
389+ let unrealizedPnl = $t01417614263._2
390+ let $t01426814440 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLstUpdCPF, unrealizedPnl)
391+ let remainMargin = $t01426814440._1
392+ let badDebt = $t01426814440._2
393+ let x2 = $t01426814440._3
392394 let exchangedPositionSize = -(positionSize)
393395 let realizedPnl = unrealizedPnl
394396 let marginToVault = -(remainMargin)
395- let $t01466014993 = getOutputPriceWithReserves((positionSize > 0), abs(positionSize), qtAstR(), bsAstR())
396- let exchangedQuoteAssetAmount = $t01466014993._1
397- let quoteAssetReserveAfter = $t01466014993._2
398- let baseAssetReserveAfter = $t01466014993._3
399- let baseAssetDeltaThisFundingPeriodAfter = $t01466014993._4
400- let totalPositionSizeAfter = $t01466014993._5
401- let cumulativeNotionalAfter = $t01466014993._6
397+ let $t01456714900 = getOutputPriceWithReserves((positionSize > 0), abs(positionSize), qtAstR(), bsAstR())
398+ let exchangedQuoteAssetAmount = $t01456714900._1
399+ let quoteAssetReserveAfter = $t01456714900._2
400+ let baseAssetReserveAfter = $t01456714900._3
401+ let baseAssetDeltaThisFundingPeriodAfter = $t01456714900._4
402+ let totalPositionSizeAfter = $t01456714900._5
403+ let cumulativeNotionalAfter = $t01456714900._6
402404 let openInteresetNotionalAfter = (openInteresetNotional() - pon)
403405 $Tuple11(exchangedPositionSize, badDebt, realizedPnl, marginToVault, quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter, exchangedQuoteAssetAmount)
404406 }
423425
424426 func $f0_2 ($a,$i) = if (($i >= $s))
425427 then $a
426- else throw("List size exceeds 15")
428+ else throw("List size exceeds 20")
427429
428- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
430+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
429431 }
430432 let maxIndex = max(listF)
431433 let lastMinuteId = valueOrElse(getInteger(this, k_lastMinuteId), 0)
477479
478480 func $f0_2 ($a,$i) = if (($i >= $s))
479481 then $a
480- else throw("List size exceeds 15")
482+ else throw("List size exceeds 20")
481483
482- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
484+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
483485 }
484486 let newListStrU = dropRight(newListStr, 1)
485487 let newListStrR = if ((take(newListStrU, 1) == ","))
576578 else paused())
577579 then throw("Invalid decreasePosition parameters")
578580 else {
579- let $t02355223704 = getPosition(toString(i.caller))
580- let oldPositionSize = $t02355223704._1
581- let oldPositionMargin = $t02355223704._2
582- let oldPositionOpenNotional = $t02355223704._3
583- let oldPositionLstUpdCPF = $t02355223704._4
581+ let $t02345923611 = getPosition(toString(i.caller))
582+ let oldPositionSize = $t02345923611._1
583+ let oldPositionMargin = $t02345923611._2
584+ let oldPositionOpenNotional = $t02345923611._3
585+ let oldPositionLstUpdCPF = $t02345923611._4
584586 let isNewPosition = (oldPositionSize == 0)
585587 let isSameDirection = if ((oldPositionSize > 0))
586588 then (_direction == DIR_LONG)
589591 then isSameDirection
590592 else false
591593 let isAdd = (_direction == DIR_LONG)
592- let $t02399326891 = if (if (isNewPosition)
594+ let $t02390026798 = if (if (isNewPosition)
593595 then true
594596 else expandExisting)
595597 then throw("Use increasePosition to open new or increase position")
596598 else {
597599 let openNotional = muld(_amount, _leverage)
598- let $t02449824614 = getPositionNotionalAndUnrealizedPnl(toString(i.caller), PNL_OPTION_SPOT)
599- let oldPositionNotional = $t02449824614._1
600- let unrealizedPnl = $t02449824614._2
600+ let $t02440524521 = getPositionNotionalAndUnrealizedPnl(toString(i.caller), PNL_OPTION_SPOT)
601+ let oldPositionNotional = $t02440524521._1
602+ let unrealizedPnl = $t02440524521._2
601603 if ((oldPositionNotional > openNotional))
602604 then {
603- let $t02467624956 = swapInput(isAdd, openNotional)
604- let exchangedPositionSize = $t02467624956._1
605- let quoteAssetReserveAfter = $t02467624956._2
606- let baseAssetReserveAfter = $t02467624956._3
607- let baseAssetDeltaThisFundingPeriodAfter = $t02467624956._4
608- let totalPositionSizeAfter = $t02467624956._5
609- let cumulativeNotionalAfter = $t02467624956._6
605+ let $t02458324863 = swapInput(isAdd, openNotional)
606+ let exchangedPositionSize = $t02458324863._1
607+ let quoteAssetReserveAfter = $t02458324863._2
608+ let baseAssetReserveAfter = $t02458324863._3
609+ let baseAssetDeltaThisFundingPeriodAfter = $t02458324863._4
610+ let totalPositionSizeAfter = $t02458324863._5
611+ let cumulativeNotionalAfter = $t02458324863._6
610612 let exchangedPositionSizeAbs = abs(exchangedPositionSize)
611613 if (if ((_minBaseAssetAmount != 0))
612614 then (_minBaseAssetAmount > exchangedPositionSizeAbs)
616618 let realizedPnl = if ((oldPositionSize != 0))
617619 then divd(muld(unrealizedPnl, exchangedPositionSizeAbs), oldPositionSize)
618620 else 0
619- let $t02549725768 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, realizedPnl)
620- let remainMargin = $t02549725768._1
621- let badDebt = $t02549725768._2
622- let fundingPayment = $t02549725768._3
623- let oldLatestCPF = $t02549725768._4
621+ let $t02540425675 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, realizedPnl)
622+ let remainMargin = $t02540425675._1
623+ let badDebt = $t02540425675._2
624+ let fundingPayment = $t02540425675._3
625+ let oldLatestCPF = $t02540425675._4
624626 let exchangedQuoteAssetAmount = openNotional
625627 let unrealizedPnlAfter = (unrealizedPnl - realizedPnl)
626628 let remainOpenNotional = if ((oldPositionSize > 0))
631633 }
632634 else throw("Close position first")
633635 }
634- let newPositionSize = $t02399326891._1
635- let newPositionRemainMargin = $t02399326891._2
636- let newPosiionOpenNotional = $t02399326891._3
637- let newPositionLatestCPF = $t02399326891._4
638- let baseAssetReserveAfter = $t02399326891._5
639- let quoteAssetReserveAfter = $t02399326891._6
640- let baseAssetDeltaThisFundingPeriodAfter = $t02399326891._7
641- let totalPositionSizeAfter = $t02399326891._8
642- let cumulativeNotionalAfter = $t02399326891._9
643- let openInteresetNotionalAfter = $t02399326891._10
636+ let newPositionSize = $t02390026798._1
637+ let newPositionRemainMargin = $t02390026798._2
638+ let newPosiionOpenNotional = $t02390026798._3
639+ let newPositionLatestCPF = $t02390026798._4
640+ let baseAssetReserveAfter = $t02390026798._5
641+ let quoteAssetReserveAfter = $t02390026798._6
642+ let baseAssetDeltaThisFundingPeriodAfter = $t02390026798._7
643+ let totalPositionSizeAfter = $t02390026798._8
644+ let cumulativeNotionalAfter = $t02390026798._9
645+ let openInteresetNotionalAfter = $t02390026798._10
644646 (updatePosition(toString(i.caller), newPositionSize, newPositionRemainMargin, newPosiionOpenNotional, newPositionLatestCPF) ++ updateAmm(quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter))
645647 }
646648
670672 else {
671673 let feeAmount = muld(_rawAmount, fee())
672674 let _amount = (_rawAmount - feeAmount)
673- let $t02792628078 = getPosition(toString(i.caller))
674- let oldPositionSize = $t02792628078._1
675- let oldPositionMargin = $t02792628078._2
676- let oldPositionOpenNotional = $t02792628078._3
677- let oldPositionLstUpdCPF = $t02792628078._4
675+ let $t02783327985 = getPosition(toString(i.caller))
676+ let oldPositionSize = $t02783327985._1
677+ let oldPositionMargin = $t02783327985._2
678+ let oldPositionOpenNotional = $t02783327985._3
679+ let oldPositionLstUpdCPF = $t02783327985._4
678680 let isNewPosition = (oldPositionSize == 0)
679681 let isSameDirection = if ((oldPositionSize > 0))
680682 then (_direction == DIR_LONG)
683685 then isSameDirection
684686 else false
685687 let isAdd = (_direction == DIR_LONG)
686- let $t02836730656 = if (if (isNewPosition)
688+ let $t02827430563 = if (if (isNewPosition)
687689 then true
688690 else expandExisting)
689691 then {
690692 let openNotional = muld(_amount, _leverage)
691- let $t02879029042 = swapInput(isAdd, openNotional)
692- let amountBaseAssetBought = $t02879029042._1
693- let quoteAssetReserveAfter = $t02879029042._2
694- let baseAssetReserveAfter = $t02879029042._3
695- let baseAssetDeltaThisFundingPeriodAfter = $t02879029042._4
696- let totalPositionSizeAfter = $t02879029042._5
697- let cumulativeNotionalAfter = $t02879029042._6
693+ let $t02869728949 = swapInput(isAdd, openNotional)
694+ let amountBaseAssetBought = $t02869728949._1
695+ let quoteAssetReserveAfter = $t02869728949._2
696+ let baseAssetReserveAfter = $t02869728949._3
697+ let baseAssetDeltaThisFundingPeriodAfter = $t02869728949._4
698+ let totalPositionSizeAfter = $t02869728949._5
699+ let cumulativeNotionalAfter = $t02869728949._6
698700 if (if ((_minBaseAssetAmount != 0))
699701 then (_minBaseAssetAmount > abs(amountBaseAssetBought))
700702 else false)
702704 else {
703705 let newPositionSize = (oldPositionSize + amountBaseAssetBought)
704706 let increaseMarginRequirement = divd(openNotional, _leverage)
705- let $t02942329676 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, increaseMarginRequirement)
706- let remainMargin = $t02942329676._1
707- let x1 = $t02942329676._2
708- let x2 = $t02942329676._3
709- let oldLatestCPF = $t02942329676._4
707+ let $t02933029583 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, increaseMarginRequirement)
708+ let remainMargin = $t02933029583._1
709+ let x1 = $t02933029583._2
710+ let x2 = $t02933029583._3
711+ let oldLatestCPF = $t02933029583._4
710712 $Tuple10(newPositionSize, remainMargin, (oldPositionOpenNotional + openNotional), oldLatestCPF, baseAssetReserveAfter, quoteAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, (openInteresetNotional() + openNotional))
711713 }
712714 }
713715 else {
714716 let openNotional = muld(_amount, _leverage)
715- let $t03034930465 = getPositionNotionalAndUnrealizedPnl(toString(i.caller), PNL_OPTION_SPOT)
716- let oldPositionNotional = $t03034930465._1
717- let unrealizedPnl = $t03034930465._2
717+ let $t03025630372 = getPositionNotionalAndUnrealizedPnl(toString(i.caller), PNL_OPTION_SPOT)
718+ let oldPositionNotional = $t03025630372._1
719+ let unrealizedPnl = $t03025630372._2
718720 if ((oldPositionNotional > openNotional))
719721 then throw("Use decreasePosition to decrease position size")
720722 else throw("Close position first")
721723 }
722- let newPositionSize = $t02836730656._1
723- let newPositionRemainMargin = $t02836730656._2
724- let newPosiionOpenNotional = $t02836730656._3
725- let newPositionLatestCPF = $t02836730656._4
726- let baseAssetReserveAfter = $t02836730656._5
727- let quoteAssetReserveAfter = $t02836730656._6
728- let baseAssetDeltaThisFundingPeriodAfter = $t02836730656._7
729- let totalPositionSizeAfter = $t02836730656._8
730- let cumulativeNotionalAfter = $t02836730656._9
731- let openInteresetNotionalAfter = $t02836730656._10
724+ let newPositionSize = $t02827430563._1
725+ let newPositionRemainMargin = $t02827430563._2
726+ let newPosiionOpenNotional = $t02827430563._3
727+ let newPositionLatestCPF = $t02827430563._4
728+ let baseAssetReserveAfter = $t02827430563._5
729+ let quoteAssetReserveAfter = $t02827430563._6
730+ let baseAssetDeltaThisFundingPeriodAfter = $t02827430563._7
731+ let totalPositionSizeAfter = $t02827430563._8
732+ let cumulativeNotionalAfter = $t02827430563._9
733+ let openInteresetNotionalAfter = $t02827430563._10
732734 let feeToStakers = (feeAmount / 2)
733735 let feeToInsurance = (feeAmount - feeToStakers)
734736 let stake = invoke(quoteAssetStaking(), "lockNeutrinoSP", [toString(stakingAddress()), ALL_FEES], [AttachedPayment(quoteAsset(), _amount)])
759761 else {
760762 let feeAmount = muld(_rawAmount, fee())
761763 let _amount = (_rawAmount - feeAmount)
762- let $t03193132083 = getPosition(toString(i.caller))
763- let oldPositionSize = $t03193132083._1
764- let oldPositionMargin = $t03193132083._2
765- let oldPositionOpenNotional = $t03193132083._3
766- let oldPositionLstUpdCPF = $t03193132083._4
764+ let $t03183831990 = getPosition(toString(i.caller))
765+ let oldPositionSize = $t03183831990._1
766+ let oldPositionMargin = $t03183831990._2
767+ let oldPositionOpenNotional = $t03183831990._3
768+ let oldPositionLstUpdCPF = $t03183831990._4
767769 let feeToStakers = (feeAmount / 2)
768770 let feeToInsurance = (feeAmount - feeToStakers)
769771 let stake = invoke(quoteAssetStaking(), "lockNeutrinoSP", [toString(stakingAddress()), ALL_FEES], [AttachedPayment(quoteAsset(), _amount)])
790792 else paused())
791793 then throw("Invalid removeMargin parameters")
792794 else {
793- let $t03301633168 = getPosition(toString(i.caller))
794- let oldPositionSize = $t03301633168._1
795- let oldPositionMargin = $t03301633168._2
796- let oldPositionOpenNotional = $t03301633168._3
797- let oldPositionLstUpdCPF = $t03301633168._4
795+ let $t03292333075 = getPosition(toString(i.caller))
796+ let oldPositionSize = $t03292333075._1
797+ let oldPositionMargin = $t03292333075._2
798+ let oldPositionOpenNotional = $t03292333075._3
799+ let oldPositionLstUpdCPF = $t03292333075._4
798800 let marginDelta = -(_amount)
799- let $t03320533400 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, marginDelta)
800- let remainMargin = $t03320533400._1
801- let badDebt = $t03320533400._2
802- let x1 = $t03320533400._3
803- let latestCPF1 = $t03320533400._4
801+ let $t03311233307 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, marginDelta)
802+ let remainMargin = $t03311233307._1
803+ let badDebt = $t03311233307._2
804+ let x1 = $t03311233307._3
805+ let latestCPF1 = $t03311233307._4
804806 if ((badDebt != 0))
805807 then throw("Invalid added margin amount")
806808 else {
821823 else paused())
822824 then throw("Invalid closePosition parameters")
823825 else {
824- let $t03412234480 = internalClosePosition(toString(i.caller))
825- let x1 = $t03412234480._1
826- let badDebt = $t03412234480._2
827- let realizedPnl = $t03412234480._3
828- let marginToVault = $t03412234480._4
829- let quoteAssetReserveAfter = $t03412234480._5
830- let baseAssetReserveAfter = $t03412234480._6
831- let baseAssetDeltaThisFundingPeriodAfter = $t03412234480._7
832- let totalPositionSizeAfter = $t03412234480._8
833- let cumulativeNotionalAfter = $t03412234480._9
834- let openInteresetNotionalAfter = $t03412234480._10
826+ let $t03402934387 = internalClosePosition(toString(i.caller))
827+ let x1 = $t03402934387._1
828+ let badDebt = $t03402934387._2
829+ let realizedPnl = $t03402934387._3
830+ let marginToVault = $t03402934387._4
831+ let quoteAssetReserveAfter = $t03402934387._5
832+ let baseAssetReserveAfter = $t03402934387._6
833+ let baseAssetDeltaThisFundingPeriodAfter = $t03402934387._7
834+ let totalPositionSizeAfter = $t03402934387._8
835+ let cumulativeNotionalAfter = $t03402934387._9
836+ let openInteresetNotionalAfter = $t03402934387._10
835837 if ((badDebt > 0))
836838 then throw("Unable to close position with bad debt")
837839 else {
838840 let withdrawAmount = abs(marginToVault)
839841 let bd = (cbalance() - withdrawAmount)
840- let $t03467334769 = if ((0 > bd))
842+ let $t03458034676 = if ((0 > bd))
841843 then $Tuple2(0, abs(bd))
842844 else $Tuple2(bd, 0)
843- let nb = $t03467334769._1
844- let fromi = $t03467334769._2
845+ let nb = $t03458034676._1
846+ let fromi = $t03458034676._2
845847 let x = if ((fromi > 0))
846848 then {
847849 let withdrawInsurance = invoke(insuranceAddress(), "withdraw", [fromi], nil)
875877 else paused())
876878 then throw("Unable to liquidate")
877879 else {
878- let $t03594136271 = internalClosePosition(_trader)
879- let x1 = $t03594136271._1
880- let badDebt = $t03594136271._2
881- let x2 = $t03594136271._3
882- let marginToVault = $t03594136271._4
883- let quoteAssetReserveAfter = $t03594136271._5
884- let baseAssetReserveAfter = $t03594136271._6
885- let baseAssetDeltaThisFundingPeriodAfter = $t03594136271._7
886- let totalPositionSizeAfter = $t03594136271._8
887- let cumulativeNotionalAfter = $t03594136271._9
888- let openInteresetNotionalAfter = $t03594136271._10
889- let exchangedQuoteAssetAmount = $t03594136271._11
880+ let $t03584836178 = internalClosePosition(_trader)
881+ let x1 = $t03584836178._1
882+ let badDebt = $t03584836178._2
883+ let x2 = $t03584836178._3
884+ let marginToVault = $t03584836178._4
885+ let quoteAssetReserveAfter = $t03584836178._5
886+ let baseAssetReserveAfter = $t03584836178._6
887+ let baseAssetDeltaThisFundingPeriodAfter = $t03584836178._7
888+ let totalPositionSizeAfter = $t03584836178._8
889+ let cumulativeNotionalAfter = $t03584836178._9
890+ let openInteresetNotionalAfter = $t03584836178._10
891+ let exchangedQuoteAssetAmount = $t03584836178._11
890892 let feeToLiquidator = (muld(exchangedQuoteAssetAmount, liquidationFeeRatio()) / 2)
891- let $t03636136765 = if ((feeToLiquidator > marginToVault))
893+ let $t03626836672 = if ((feeToLiquidator > marginToVault))
892894 then $Tuple3((feeToLiquidator - marginToVault), marginToVault, ((badDebt + feeToLiquidator) - marginToVault))
893895 else $Tuple3(0, (marginToVault - feeToLiquidator), badDebt)
894- let liquidationBadDebt = $t03636136765._1
895- let remainMargin = $t03636136765._2
896- let totalBadDebt = $t03636136765._3
896+ let liquidationBadDebt = $t03626836672._1
897+ let remainMargin = $t03626836672._2
898+ let totalBadDebt = $t03626836672._3
897899 let bd = (cbalance() - feeToLiquidator)
898- let $t03681336901 = if ((0 > bd))
900+ let $t03672036808 = if ((0 > bd))
899901 then $Tuple2(0, abs(bd))
900902 else $Tuple2(bd, 0)
901- let nb = $t03681336901._1
902- let fromi = $t03681336901._2
903+ let nb = $t03672036808._1
904+ let fromi = $t03672036808._2
903905 let x = if ((fromi > 0))
904906 then {
905907 let withdrawInsurance = invoke(insuranceAddress(), "withdraw", [fromi], nil)
943945
944946 @Callable(i)
945947 func v_get (_trader) = {
946- let $t03837538428 = internalClosePosition(_trader)
947- let x1 = $t03837538428._1
948- let x2 = $t03837538428._2
949- let x3 = $t03837538428._3
950- let x4 = $t03837538428._4
948+ let $t03828238335 = internalClosePosition(_trader)
949+ let x1 = $t03828238335._1
950+ let x2 = $t03828238335._2
951+ let x3 = $t03828238335._3
952+ let x4 = $t03828238335._4
951953 throw((((s(x2) + s(x3)) + s(x4)) + s(getMarginRatio(_trader))))
952954 }
953955
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_ora_key = "k_ora_key"
55
66 let k_ora = "k_ora"
77
88 let k_balance = "k_balance"
99
1010 let k_positionSize = "k_positionSize"
1111
1212 let k_positionMargin = "k_positionMargin"
1313
1414 let k_positionOpenNotional = "k_positionOpenNotional"
1515
1616 let k_positionLastUpdatedCumulativePremiumFraction = "k_positionFraction"
1717
1818 let k_initialized = "k_initialized"
1919
2020 let k_paused = "k_paused"
2121
2222 let k_fee = "k_fee"
2323
2424 let k_fundingPeriod = "k_fundingPeriod"
2525
2626 let k_initMarginRatio = "k_initMarginRatio"
2727
2828 let k_maintenanceMarginRatio = "k_mmr"
2929
3030 let k_liquidationFeeRatio = "k_liquidationFeeRatio"
3131
3232 let k_spreadLimit = "k_spreadLimit"
3333
3434 let k_maxPriceImpact = "k_maxPriceImpact"
3535
3636 let k_lastDataStr = "k_lastDataStr"
3737
3838 let k_lastMinuteId = "k_lastMinuteId"
3939
4040 let k_twapDataLastCumulativePrice = "k_twapDataLastCumulativePrice"
4141
4242 let k_twapDataLastPrice = "k_twapDataLastPrice"
4343
4444 let k_twap = "k_twap"
4545
46+let k_baseAsstFndDelt = "k_baseAssetDelta"
47+
4648 let k_latestCumulativePremiumFraction = "k_latestPremiumFraction"
4749
4850 let k_nextFundingBlock = "k_nextFundingBlockMinTimestamp"
4951
5052 let k_fundingRate = "k_fundingRate"
5153
5254 let k_quoteAssetReserve = "k_qtAstR"
5355
5456 let k_baseAssetReserve = "k_bsAstR"
5557
56-let k_baseAsstFndDelt = "k_baseAssetDelta"
58+let k_baseAsstFndDe1lt = "k_baseAssetDelta"
5759
5860 let k_totalPositionSize = "k_totalPositionSize"
5961
6062 let k_cumulativeNotional = "k_cumulativeNotional"
6163
6264 let k_openInteresetNotional = "k_openInteresetNotional"
6365
6466 let k_coordinatorAddress = "k_coordinatorAddress"
6567
6668 let k_insurance_address = "k_insurance_address"
6769
6870 let k_admin_address = "k_admin_address"
6971
7072 let k_admin_public_key = "k_admin_public_key"
7173
7274 let k_quote_asset = "k_quote_asset"
7375
7476 let k_quote_staking = "k_quote_staking"
7577
7678 let k_staking_address = "k_staking_address"
7779
7880 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
7981
8082
8183 func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
8284
8385
8486 func adminPublicKey () = fromBase58String(getStringValue(coordinator(), k_admin_public_key))
8587
8688
8789 func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
8890
8991
9092 func quoteAssetStaking () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_quote_staking)), "Quote assete staking not set")
9193
9294
9395 func stakingAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_staking_address)), "Insurance not set")
9496
9597
9698 func insuranceAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_insurance_address)), "Insurance not set")
9799
98100
99101 let DIR_LONG = 1
100102
101103 let DIR_SHORT = 2
102104
103105 let FUNDING_BLOCK_INTERVAL = 60
104106
105107 let TWAP_INTERVAL = 15
106108
107109 let SECONDS = 1000
108110
109111 let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
110112
111113 let ONE_DAY = (86400 * DECIMAL_UNIT)
112114
113115 let ALL_FEES = 100
114116
115117 let PNL_OPTION_SPOT = 1
116118
117119 let PNL_OPTION_ORACLE = 2
118120
119121 func s (_x) = (toString(_x) + ",")
120122
121123
122124 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
123125
124126
125127 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
126128
127129
128130 func abs (_x) = if ((_x > 0))
129131 then _x
130132 else -(_x)
131133
132134
133135 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
134136
135137
136138 func requireMoreMarginRatio (_marginRatio,_baseMarginRatio,_largerThanOrEqualTo) = {
137139 let remainingMarginRatio = (_marginRatio - _baseMarginRatio)
138140 if (if (_largerThanOrEqualTo)
139141 then (0 > remainingMarginRatio)
140142 else false)
141143 then throw("Invalid margin")
142144 else if (if (!(_largerThanOrEqualTo))
143145 then (remainingMarginRatio >= 0)
144146 else false)
145147 then throw("Invalid margin")
146148 else true
147149 }
148150
149151
150152 func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
151153
152154
153155 func cbalance () = int(k_balance)
154156
155157
156158 func fee () = int(k_fee)
157159
158160
159161 func initMarginRatio () = int(k_initMarginRatio)
160162
161163
162164 func qtAstR () = int(k_quoteAssetReserve)
163165
164166
165167 func bsAstR () = int(k_baseAssetReserve)
166168
167169
168170 func baseAsstFndDelt () = int(k_baseAsstFndDelt)
169171
170172
171173 func totalPositionSize () = int(k_totalPositionSize)
172174
173175
174176 func cumulativeNotional () = int(k_cumulativeNotional)
175177
176178
177179 func latestCPF () = int(k_latestCumulativePremiumFraction)
178180
179181
180182 func openInteresetNotional () = int(k_openInteresetNotional)
181183
182184
183185 func nextFundingBlockTimestamp () = int(k_nextFundingBlock)
184186
185187
186188 func fundingPeriodRaw () = int(k_fundingPeriod)
187189
188190
189191 func fundingPeriodDecimal () = (fundingPeriodRaw() * DECIMAL_UNIT)
190192
191193
192194 func fundingPeriodSeconds () = (fundingPeriodRaw() * SECONDS)
193195
194196
195197 func mmr () = int(k_maintenanceMarginRatio)
196198
197199
198200 func liquidationFeeRatio () = int(k_liquidationFeeRatio)
199201
200202
201203 func spreadLimit () = int(k_spreadLimit)
202204
203205
204206 func maxPriceImpact () = int(k_maxPriceImpact)
205207
206208
207209 func getPosition (invesor) = {
208210 let positionSizeOpt = getInteger(this, toCompositeKey(k_positionSize, invesor))
209211 match positionSizeOpt {
210212 case positionSize: Int =>
211213 $Tuple4(positionSize, getIntegerValue(this, toCompositeKey(k_positionMargin, invesor)), getIntegerValue(this, toCompositeKey(k_positionOpenNotional, invesor)), getIntegerValue(this, toCompositeKey(k_positionLastUpdatedCumulativePremiumFraction, invesor)))
212214 case _ =>
213215 $Tuple4(0, 0, 0, 0)
214216 }
215217 }
216218
217219
218220 func requireOpenPosition (_trader) = if ((getPosition(_trader)._1 == 0))
219221 then throw("No open position")
220222 else true
221223
222224
223225 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
224226
225227
226228 func paused () = valueOrElse(getBoolean(this, k_paused), false)
227229
228230
229231 func updateReserve (_isAdd,_quoteAssetAmount,_baseAssetAmount) = if (_isAdd)
230232 then {
231233 let newBase = (bsAstR() - _baseAssetAmount)
232234 if ((0 >= newBase))
233235 then throw("Tx lead to base asset reserve <= 0, revert")
234236 else $Tuple5((qtAstR() + _quoteAssetAmount), newBase, (baseAsstFndDelt() - _baseAssetAmount), (totalPositionSize() + _baseAssetAmount), (cumulativeNotional() + _quoteAssetAmount))
235237 }
236238 else {
237239 let newQuote = (qtAstR() - _quoteAssetAmount)
238240 if ((0 >= newQuote))
239241 then throw("Tx lead to base quote reserve <= 0, revert")
240242 else $Tuple5(newQuote, (bsAstR() + _baseAssetAmount), (baseAsstFndDelt() + _baseAssetAmount), (totalPositionSize() - _baseAssetAmount), (cumulativeNotional() - _quoteAssetAmount))
241243 }
242244
243245
244246 func swapInput (_isAdd,_quoteAssetAmount) = {
245247 let _qtAstR = qtAstR()
246248 let _bsAstR = bsAstR()
247249 let priceBefore = divd(_qtAstR, _bsAstR)
248250 let amountBaseAssetBoughtWithoutPriceImpact = muld(_quoteAssetAmount, priceBefore)
249251 let k = muld(_qtAstR, _bsAstR)
250252 let quoteAssetReserveAfter = if (_isAdd)
251253 then (_qtAstR + _quoteAssetAmount)
252254 else (_qtAstR - _quoteAssetAmount)
253255 let baseAssetReserveAfter = divd(k, quoteAssetReserveAfter)
254256 let amountBaseAssetBoughtAbs = abs((baseAssetReserveAfter - _bsAstR))
255257 let amountBaseAssetBought = if (_isAdd)
256258 then amountBaseAssetBoughtAbs
257259 else -(amountBaseAssetBoughtAbs)
258260 let priceImpact = ((amountBaseAssetBoughtWithoutPriceImpact - amountBaseAssetBoughtAbs) / amountBaseAssetBoughtWithoutPriceImpact)
259261 let maxPriceImpactValue = maxPriceImpact()
260262 if ((priceImpact > maxPriceImpactValue))
261263 then throw(((("Price impact " + toString(priceImpact)) + " > max price impact ") + toString(maxPriceImpactValue)))
262264 else {
263- let $t0999810246 = updateReserve(_isAdd, _quoteAssetAmount, amountBaseAssetBoughtAbs)
264- let quoteAssetReserveAfter1 = $t0999810246._1
265- let baseAssetReserveAfter1 = $t0999810246._2
266- let baseAssetDeltaThisFundingPeriodAfter1 = $t0999810246._3
267- let totalPositionSizeAfter1 = $t0999810246._4
268- let cumulativeNotionalAfter1 = $t0999810246._5
265+ let $t0986710115 = updateReserve(_isAdd, _quoteAssetAmount, amountBaseAssetBoughtAbs)
266+ let quoteAssetReserveAfter1 = $t0986710115._1
267+ let baseAssetReserveAfter1 = $t0986710115._2
268+ let baseAssetDeltaThisFundingPeriodAfter1 = $t0986710115._3
269+ let totalPositionSizeAfter1 = $t0986710115._4
270+ let cumulativeNotionalAfter1 = $t0986710115._5
269271 $Tuple6(amountBaseAssetBought, quoteAssetReserveAfter1, baseAssetReserveAfter1, baseAssetDeltaThisFundingPeriodAfter1, totalPositionSizeAfter1, cumulativeNotionalAfter1)
270272 }
271273 }
272274
273275
274276 func calcRemainMarginWithFundingPayment (_oldPositionSize,_oldPositionMargin,_oldPositionLstUpdCPF,_marginDelta) = {
275277 let _latestCPF = latestCPF()
276278 let fundingPayment = if ((_oldPositionSize != 0))
277279 then muld((_latestCPF - _oldPositionLstUpdCPF), _oldPositionSize)
278280 else 0
279281 let signedMargin = ((_marginDelta - fundingPayment) + _oldPositionMargin)
280- let $t01087711004 = if ((0 > signedMargin))
282+ let $t01073310860 = if ((0 > signedMargin))
281283 then $Tuple2(0, abs(signedMargin))
282284 else $Tuple2(abs(signedMargin), 0)
283- let remainMargin = $t01087711004._1
284- let badDebt = $t01087711004._2
285+ let remainMargin = $t01073310860._1
286+ let badDebt = $t01073310860._2
285287 $Tuple4(remainMargin, badDebt, fundingPayment, _latestCPF)
286288 }
287289
288290
289291 func getOutputPriceWithReserves (_add,_baseAssetAmount,_quoteAssetPoolAmount,_baseAssetPoolAmount) = if ((_baseAssetAmount == 0))
290292 then throw("Invalid base asset amount")
291293 else {
292294 let k = muld(_quoteAssetPoolAmount, _baseAssetPoolAmount)
293295 let baseAssetPoolAmountAfter = if (_add)
294296 then (_baseAssetPoolAmount + _baseAssetAmount)
295297 else (_baseAssetPoolAmount - _baseAssetAmount)
296298 let quoteAssetAfter = divd(k, baseAssetPoolAmountAfter)
297299 let quoteAssetSold = abs((quoteAssetAfter - _quoteAssetPoolAmount))
298- let $t01165311889 = updateReserve(!(_add), quoteAssetSold, _baseAssetAmount)
299- let quoteAssetReserveAfter1 = $t01165311889._1
300- let baseAssetReserveAfter1 = $t01165311889._2
301- let baseAssetDeltaThisFundingPeriodAfter1 = $t01165311889._3
302- let totalPositionSizeAfter1 = $t01165311889._4
303- let cumulativeNotionalAfter1 = $t01165311889._5
300+ let $t01150911745 = updateReserve(!(_add), quoteAssetSold, _baseAssetAmount)
301+ let quoteAssetReserveAfter1 = $t01150911745._1
302+ let baseAssetReserveAfter1 = $t01150911745._2
303+ let baseAssetDeltaThisFundingPeriodAfter1 = $t01150911745._3
304+ let totalPositionSizeAfter1 = $t01150911745._4
305+ let cumulativeNotionalAfter1 = $t01150911745._5
304306 $Tuple6(quoteAssetSold, quoteAssetReserveAfter1, baseAssetReserveAfter1, baseAssetDeltaThisFundingPeriodAfter1, totalPositionSizeAfter1, cumulativeNotionalAfter1)
305307 }
306308
307309
308310 func getOracleTwapPrice () = {
309311 let oracle = valueOrErrorMessage(addressFromString(getStringValue(this, k_ora)), "")
310312 let priceKey = getStringValue(this, k_ora_key)
311313 getIntegerValue(oracle, priceKey)
312314 }
313315
314316
315317 func getSpotPrice () = {
316318 let _qtAstR = qtAstR()
317319 let _bsAstR = bsAstR()
318320 divd(_qtAstR, _bsAstR)
319321 }
320322
321323
322324 func isOverFluctuationLimit () = {
323325 let oraclePrice = getOracleTwapPrice()
324326 let currentPrice = getSpotPrice()
325327 (divd(abs((oraclePrice - currentPrice)), oraclePrice) > spreadLimit())
326328 }
327329
328330
329331 func getPositionNotionalAndUnrealizedPnl (_trader,_option) = {
330- let $t01266412775 = getPosition(_trader)
331- let positionSize = $t01266412775._1
332- let positionMargin = $t01266412775._2
333- let pon = $t01266412775._3
334- let positionLstUpdCPF = $t01266412775._4
332+ let $t01252012648 = getPosition(_trader)
333+ let positionSize = $t01252012648._1
334+ let positionMargin = $t01252012648._2
335+ let positionOpenNotional = $t01252012648._3
336+ let positionLstUpdCPF = $t01252012648._4
335337 let positionSizeAbs = abs(positionSize)
336338 if ((positionSizeAbs == 0))
337339 then throw("Invalid position size")
338340 else {
339341 let isShort = (0 > positionSize)
340342 let positionNotional = if ((_option == PNL_OPTION_SPOT))
341343 then {
342- let $t01302213185 = getOutputPriceWithReserves(!(isShort), positionSizeAbs, qtAstR(), bsAstR())
343- let outPositionNotional = $t01302213185._1
344- let x1 = $t01302213185._2
345- let x2 = $t01302213185._3
346- let x3 = $t01302213185._4
344+ let $t01289513058 = getOutputPriceWithReserves(!(isShort), positionSizeAbs, qtAstR(), bsAstR())
345+ let outPositionNotional = $t01289513058._1
346+ let x1 = $t01289513058._2
347+ let x2 = $t01289513058._3
348+ let x3 = $t01289513058._4
347349 outPositionNotional
348350 }
349351 else (positionSizeAbs * getOracleTwapPrice())
350352 let unrealizedPnl = if (isShort)
351- then (pon - positionNotional)
352- else (positionNotional - pon)
353+ then (positionOpenNotional - positionNotional)
354+ else (positionNotional - positionOpenNotional)
353355 $Tuple2(positionNotional, unrealizedPnl)
354356 }
355357 }
356358
357359
358360 func getMarginRatioByOption (_trader,_option) = {
359361 func x () = 0
360362
361- let $t01357513686 = getPosition(_trader)
362- let positionSize = $t01357513686._1
363- let positionMargin = $t01357513686._2
364- let pon = $t01357513686._3
365- let positionLstUpdCPF = $t01357513686._4
366- let $t01369213785 = getPositionNotionalAndUnrealizedPnl(_trader, _option)
367- let positionNotional = $t01369213785._1
368- let unrealizedPnl = $t01369213785._2
369- let $t01379013956 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLstUpdCPF, unrealizedPnl)
370- let remainMargin = $t01379013956._1
371- let badDebt = $t01379013956._2
363+ let $t01348213593 = getPosition(_trader)
364+ let positionSize = $t01348213593._1
365+ let positionMargin = $t01348213593._2
366+ let pon = $t01348213593._3
367+ let positionLstUpdCPF = $t01348213593._4
368+ let $t01359913692 = getPositionNotionalAndUnrealizedPnl(_trader, _option)
369+ let positionNotional = $t01359913692._1
370+ let unrealizedPnl = $t01359913692._2
371+ let $t01369713863 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLstUpdCPF, unrealizedPnl)
372+ let remainMargin = $t01369713863._1
373+ let badDebt = $t01369713863._2
372374 divd((remainMargin - badDebt), positionNotional)
373375 }
374376
375377
376378 func getMarginRatio (_trader) = getMarginRatioByOption(_trader, PNL_OPTION_SPOT)
377379
378380
379381 func internalClosePosition (_trader) = {
380- let $t01415214263 = getPosition(_trader)
381- let positionSize = $t01415214263._1
382- let positionMargin = $t01415214263._2
383- let pon = $t01415214263._3
384- let positionLstUpdCPF = $t01415214263._4
385- let $t01426914356 = getPositionNotionalAndUnrealizedPnl(_trader, PNL_OPTION_SPOT)
386- let x1 = $t01426914356._1
387- let unrealizedPnl = $t01426914356._2
388- let $t01436114533 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLstUpdCPF, unrealizedPnl)
389- let remainMargin = $t01436114533._1
390- let badDebt = $t01436114533._2
391- let x2 = $t01436114533._3
382+ let $t01405914170 = getPosition(_trader)
383+ let positionSize = $t01405914170._1
384+ let positionMargin = $t01405914170._2
385+ let pon = $t01405914170._3
386+ let positionLstUpdCPF = $t01405914170._4
387+ let $t01417614263 = getPositionNotionalAndUnrealizedPnl(_trader, PNL_OPTION_SPOT)
388+ let x1 = $t01417614263._1
389+ let unrealizedPnl = $t01417614263._2
390+ let $t01426814440 = calcRemainMarginWithFundingPayment(positionSize, positionMargin, positionLstUpdCPF, unrealizedPnl)
391+ let remainMargin = $t01426814440._1
392+ let badDebt = $t01426814440._2
393+ let x2 = $t01426814440._3
392394 let exchangedPositionSize = -(positionSize)
393395 let realizedPnl = unrealizedPnl
394396 let marginToVault = -(remainMargin)
395- let $t01466014993 = getOutputPriceWithReserves((positionSize > 0), abs(positionSize), qtAstR(), bsAstR())
396- let exchangedQuoteAssetAmount = $t01466014993._1
397- let quoteAssetReserveAfter = $t01466014993._2
398- let baseAssetReserveAfter = $t01466014993._3
399- let baseAssetDeltaThisFundingPeriodAfter = $t01466014993._4
400- let totalPositionSizeAfter = $t01466014993._5
401- let cumulativeNotionalAfter = $t01466014993._6
397+ let $t01456714900 = getOutputPriceWithReserves((positionSize > 0), abs(positionSize), qtAstR(), bsAstR())
398+ let exchangedQuoteAssetAmount = $t01456714900._1
399+ let quoteAssetReserveAfter = $t01456714900._2
400+ let baseAssetReserveAfter = $t01456714900._3
401+ let baseAssetDeltaThisFundingPeriodAfter = $t01456714900._4
402+ let totalPositionSizeAfter = $t01456714900._5
403+ let cumulativeNotionalAfter = $t01456714900._6
402404 let openInteresetNotionalAfter = (openInteresetNotional() - pon)
403405 $Tuple11(exchangedPositionSize, badDebt, realizedPnl, marginToVault, quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter, exchangedQuoteAssetAmount)
404406 }
405407
406408
407409 func getTwapSpotPrice () = {
408410 let minuteId = ((lastBlock.timestamp / 1000) / 60)
409411 let startMinuteId = (minuteId - TWAP_INTERVAL)
410412 let listStr = valueOrElse(getString(this, k_lastDataStr), "")
411413 let list = split(listStr, ",")
412414 func filterFn (accum,next) = if ((startMinuteId >= parseIntValue(next)))
413415 then (accum :+ parseIntValue(next))
414416 else accum
415417
416418 let listF = {
417419 let $l = list
418420 let $s = size($l)
419421 let $acc0 = nil
420422 func $f0_1 ($a,$i) = if (($i >= $s))
421423 then $a
422424 else filterFn($a, $l[$i])
423425
424426 func $f0_2 ($a,$i) = if (($i >= $s))
425427 then $a
426- else throw("List size exceeds 15")
428+ else throw("List size exceeds 20")
427429
428- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
430+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
429431 }
430432 let maxIndex = max(listF)
431433 let lastMinuteId = valueOrElse(getInteger(this, k_lastMinuteId), 0)
432434 let endLastCumulativePrice = valueOrElse(getInteger(this, ((k_twapDataLastCumulativePrice + "_") + toString(lastMinuteId))), 0)
433435 let endLastPrice = valueOrElse(getInteger(this, ((k_twapDataLastPrice + "_") + toString(lastMinuteId))), 0)
434436 let nowCummulativePrice = (endLastCumulativePrice + ((minuteId - lastMinuteId) * endLastPrice))
435437 let startLastCumulativePrice = valueOrElse(getInteger(this, ((k_twapDataLastCumulativePrice + "_") + toString(maxIndex))), 0)
436438 let startLastPrice = valueOrElse(getInteger(this, ((k_twapDataLastPrice + "_") + toString(maxIndex))), 0)
437439 let startCummulativePrice = (startLastCumulativePrice + ((startMinuteId - maxIndex) * startLastPrice))
438440 ((nowCummulativePrice - startCummulativePrice) / TWAP_INTERVAL)
439441 }
440442
441443
442444 func updateSettings (_initMarginRatio,_mmr,_liquidationFeeRatio,_fundingPeriod,_fee,_spreadLimit,_maxPriceImpact) = [IntegerEntry(k_initMarginRatio, _initMarginRatio), IntegerEntry(k_maintenanceMarginRatio, _mmr), IntegerEntry(k_liquidationFeeRatio, _liquidationFeeRatio), IntegerEntry(k_fundingPeriod, _fundingPeriod), IntegerEntry(k_fee, _fee), IntegerEntry(k_spreadLimit, _spreadLimit), IntegerEntry(k_maxPriceImpact, _maxPriceImpact)]
443445
444446
445447 func updateFunding (_baseADTFP,_nextFundingBlock,_latestCPF,_fundingRate) = [IntegerEntry(k_baseAsstFndDelt, _baseADTFP), IntegerEntry(k_nextFundingBlock, _nextFundingBlock), IntegerEntry(k_latestCumulativePremiumFraction, _latestCPF), IntegerEntry(k_fundingRate, _fundingRate)]
446448
447449
448450 func updatePosition (_address,_size,_margin,_openNotinal,_LstUpdCPF) = [IntegerEntry(toCompositeKey(k_positionSize, _address), _size), IntegerEntry(toCompositeKey(k_positionMargin, _address), _margin), IntegerEntry(toCompositeKey(k_positionOpenNotional, _address), _openNotinal), IntegerEntry(toCompositeKey(k_positionLastUpdatedCumulativePremiumFraction, _address), _LstUpdCPF)]
449451
450452
451453 func appendTwap (price) = {
452454 let minuteId = ((lastBlock.timestamp / 1000) / 60)
453455 let previousMinuteId = valueOrElse(getInteger(this, k_lastMinuteId), 0)
454456 if ((previousMinuteId > minuteId))
455457 then throw("TWAP out-of-order")
456458 else {
457459 let lastMinuteId = if ((previousMinuteId == 0))
458460 then minuteId
459461 else previousMinuteId
460462 let listStr = valueOrElse(getString(this, k_lastDataStr), "")
461463 let oldList = split(listStr, ",")
462464 let list = if ((size(oldList) > TWAP_INTERVAL))
463465 then (removeByIndex(oldList, 0) :+ toString(minuteId))
464466 else (oldList :+ toString(minuteId))
465467 let prevCummulativePrice = valueOrElse(getInteger(this, ((k_twapDataLastCumulativePrice + "_") + toString(previousMinuteId))), 0)
466468 let prevPrice = valueOrElse(getInteger(this, ((k_twapDataLastPrice + "_") + toString(previousMinuteId))), price)
467469 let lastCummulativePrice = (prevCummulativePrice + ((minuteId - lastMinuteId) * prevPrice))
468470 func join (accum,val) = ((accum + val) + ",")
469471
470472 let newListStr = {
471473 let $l = list
472474 let $s = size($l)
473475 let $acc0 = ""
474476 func $f0_1 ($a,$i) = if (($i >= $s))
475477 then $a
476478 else join($a, $l[$i])
477479
478480 func $f0_2 ($a,$i) = if (($i >= $s))
479481 then $a
480- else throw("List size exceeds 15")
482+ else throw("List size exceeds 20")
481483
482- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
484+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
483485 }
484486 let newListStrU = dropRight(newListStr, 1)
485487 let newListStrR = if ((take(newListStrU, 1) == ","))
486488 then drop(newListStrU, 1)
487489 else newListStrU
488490 [IntegerEntry(((k_twapDataLastCumulativePrice + "_") + toString(minuteId)), lastCummulativePrice), IntegerEntry(((k_twapDataLastPrice + "_") + toString(minuteId)), price), IntegerEntry(k_lastMinuteId, minuteId), StringEntry(k_lastDataStr, newListStrR)]
489491 }
490492 }
491493
492494
493495 func updateAmm (_qtAstR,_bsAstR,_baseAssetDeltaThisFundingPeriodAfter,_totalPositionSizeAfter,_cumulativeNotionalAfter,_openInteresetNotional) = ([IntegerEntry(k_quoteAssetReserve, _qtAstR), IntegerEntry(k_baseAssetReserve, _bsAstR), IntegerEntry(k_baseAsstFndDelt, _baseAssetDeltaThisFundingPeriodAfter), IntegerEntry(k_totalPositionSize, _totalPositionSizeAfter), IntegerEntry(k_cumulativeNotional, _cumulativeNotionalAfter), IntegerEntry(k_openInteresetNotional, _openInteresetNotional)] ++ appendTwap(divd(_qtAstR, _bsAstR)))
494496
495497
496498 func deletePosition (_address) = [DeleteEntry(toCompositeKey(k_positionSize, _address)), DeleteEntry(toCompositeKey(k_positionMargin, _address)), DeleteEntry(toCompositeKey(k_positionOpenNotional, _address)), DeleteEntry(toCompositeKey(k_positionLastUpdatedCumulativePremiumFraction, _address))]
497499
498500
499501 func withdraw (_address,_amount) = {
500502 let balance = assetBalance(this, quoteAsset())
501503 if ((_amount > balance))
502504 then throw(((("Unable to withdraw " + toString(_amount)) + " from contract balance ") + toString(balance)))
503505 else [ScriptTransfer(_address, _amount, quoteAsset())]
504506 }
505507
506508
507509 func updateBalance (i) = if ((0 > i))
508510 then throw("Balance")
509511 else [IntegerEntry(k_balance, i)]
510512
511513
512514 func transferFee (i) = [ScriptTransfer(stakingAddress(), i, quoteAsset())]
513515
514516
515517 @Callable(i)
516518 func pause () = if ((i.caller != adminAddress()))
517519 then throw("Invalid togglePause params")
518520 else [BooleanEntry(k_paused, true)]
519521
520522
521523
522524 @Callable(i)
523525 func unpause () = if ((i.caller != adminAddress()))
524526 then throw("Invalid togglePause params")
525527 else [BooleanEntry(k_paused, false)]
526528
527529
528530
529531 @Callable(i)
530532 func changeSettings (_initMarginRatio,_mmr,_liquidationFeeRatio,_fundingPeriod,_fee,_spreadLimit,_maxPriceImpact) = if ((i.caller != adminAddress()))
531533 then throw("Invalid changeSettings params")
532534 else updateSettings(_initMarginRatio, _mmr, _liquidationFeeRatio, _fundingPeriod, _fee, _spreadLimit, _maxPriceImpact)
533535
534536
535537
536538 @Callable(i)
537539 func initialize (_qtAstR,_bsAstR,_fundingPeriod,_initMarginRatio,_mmr,_liquidationFeeRatio,_fee,_oracle,_oracleKey,_coordinator,_spreadLimit,_maxPriceImpact) = if (if (if (if (if (if (if (if (if (if ((0 >= _qtAstR))
538540 then true
539541 else (0 >= _bsAstR))
540542 then true
541543 else (0 >= _fundingPeriod))
542544 then true
543545 else (0 >= _initMarginRatio))
544546 then true
545547 else (0 >= _mmr))
546548 then true
547549 else (0 >= _liquidationFeeRatio))
548550 then true
549551 else (0 >= _fee))
550552 then true
551553 else (0 >= _spreadLimit))
552554 then true
553555 else (0 >= _maxPriceImpact))
554556 then true
555557 else initialized())
556558 then throw("Invalid initialize parameters")
557559 else ((((updateAmm(_qtAstR, _bsAstR, 0, 0, 0, 0) ++ updateSettings(_initMarginRatio, _mmr, _liquidationFeeRatio, _fundingPeriod, _fee, _spreadLimit, _maxPriceImpact)) ++ updateFunding(0, (lastBlock.timestamp + _fundingPeriod), 0, 0)) ++ updateBalance(0)) ++ [BooleanEntry(k_initialized, true), StringEntry(k_ora, _oracle), StringEntry(k_ora_key, _oracleKey), StringEntry(k_coordinatorAddress, _coordinator)])
558560
559561
560562
561563 @Callable(i)
562564 func decreasePosition (_direction,_amount,_leverage,_minBaseAssetAmount) = if (if (if (if (if (if (if ((_direction != DIR_LONG))
563565 then (_direction != DIR_SHORT)
564566 else false)
565567 then true
566568 else (0 >= _amount))
567569 then true
568570 else if (((1 * DECIMAL_UNIT) > _leverage))
569571 then true
570572 else (_leverage > (3 * DECIMAL_UNIT)))
571573 then true
572574 else !(initialized()))
573575 then true
574576 else !(requireMoreMarginRatio(divd(DECIMAL_UNIT, _leverage), initMarginRatio(), true)))
575577 then true
576578 else paused())
577579 then throw("Invalid decreasePosition parameters")
578580 else {
579- let $t02355223704 = getPosition(toString(i.caller))
580- let oldPositionSize = $t02355223704._1
581- let oldPositionMargin = $t02355223704._2
582- let oldPositionOpenNotional = $t02355223704._3
583- let oldPositionLstUpdCPF = $t02355223704._4
581+ let $t02345923611 = getPosition(toString(i.caller))
582+ let oldPositionSize = $t02345923611._1
583+ let oldPositionMargin = $t02345923611._2
584+ let oldPositionOpenNotional = $t02345923611._3
585+ let oldPositionLstUpdCPF = $t02345923611._4
584586 let isNewPosition = (oldPositionSize == 0)
585587 let isSameDirection = if ((oldPositionSize > 0))
586588 then (_direction == DIR_LONG)
587589 else (_direction == DIR_SHORT)
588590 let expandExisting = if (!(isNewPosition))
589591 then isSameDirection
590592 else false
591593 let isAdd = (_direction == DIR_LONG)
592- let $t02399326891 = if (if (isNewPosition)
594+ let $t02390026798 = if (if (isNewPosition)
593595 then true
594596 else expandExisting)
595597 then throw("Use increasePosition to open new or increase position")
596598 else {
597599 let openNotional = muld(_amount, _leverage)
598- let $t02449824614 = getPositionNotionalAndUnrealizedPnl(toString(i.caller), PNL_OPTION_SPOT)
599- let oldPositionNotional = $t02449824614._1
600- let unrealizedPnl = $t02449824614._2
600+ let $t02440524521 = getPositionNotionalAndUnrealizedPnl(toString(i.caller), PNL_OPTION_SPOT)
601+ let oldPositionNotional = $t02440524521._1
602+ let unrealizedPnl = $t02440524521._2
601603 if ((oldPositionNotional > openNotional))
602604 then {
603- let $t02467624956 = swapInput(isAdd, openNotional)
604- let exchangedPositionSize = $t02467624956._1
605- let quoteAssetReserveAfter = $t02467624956._2
606- let baseAssetReserveAfter = $t02467624956._3
607- let baseAssetDeltaThisFundingPeriodAfter = $t02467624956._4
608- let totalPositionSizeAfter = $t02467624956._5
609- let cumulativeNotionalAfter = $t02467624956._6
605+ let $t02458324863 = swapInput(isAdd, openNotional)
606+ let exchangedPositionSize = $t02458324863._1
607+ let quoteAssetReserveAfter = $t02458324863._2
608+ let baseAssetReserveAfter = $t02458324863._3
609+ let baseAssetDeltaThisFundingPeriodAfter = $t02458324863._4
610+ let totalPositionSizeAfter = $t02458324863._5
611+ let cumulativeNotionalAfter = $t02458324863._6
610612 let exchangedPositionSizeAbs = abs(exchangedPositionSize)
611613 if (if ((_minBaseAssetAmount != 0))
612614 then (_minBaseAssetAmount > exchangedPositionSizeAbs)
613615 else false)
614616 then throw(((("Too little basse asset exchanged, got " + toString(exchangedPositionSizeAbs)) + " expected ") + toString(_minBaseAssetAmount)))
615617 else {
616618 let realizedPnl = if ((oldPositionSize != 0))
617619 then divd(muld(unrealizedPnl, exchangedPositionSizeAbs), oldPositionSize)
618620 else 0
619- let $t02549725768 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, realizedPnl)
620- let remainMargin = $t02549725768._1
621- let badDebt = $t02549725768._2
622- let fundingPayment = $t02549725768._3
623- let oldLatestCPF = $t02549725768._4
621+ let $t02540425675 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, realizedPnl)
622+ let remainMargin = $t02540425675._1
623+ let badDebt = $t02540425675._2
624+ let fundingPayment = $t02540425675._3
625+ let oldLatestCPF = $t02540425675._4
624626 let exchangedQuoteAssetAmount = openNotional
625627 let unrealizedPnlAfter = (unrealizedPnl - realizedPnl)
626628 let remainOpenNotional = if ((oldPositionSize > 0))
627629 then ((oldPositionNotional - exchangedQuoteAssetAmount) - unrealizedPnlAfter)
628630 else ((unrealizedPnlAfter + oldPositionNotional) - exchangedQuoteAssetAmount)
629631 $Tuple10((oldPositionSize + exchangedPositionSize), remainMargin, abs(remainOpenNotional), oldLatestCPF, baseAssetReserveAfter, quoteAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, (openInteresetNotional() - openNotional))
630632 }
631633 }
632634 else throw("Close position first")
633635 }
634- let newPositionSize = $t02399326891._1
635- let newPositionRemainMargin = $t02399326891._2
636- let newPosiionOpenNotional = $t02399326891._3
637- let newPositionLatestCPF = $t02399326891._4
638- let baseAssetReserveAfter = $t02399326891._5
639- let quoteAssetReserveAfter = $t02399326891._6
640- let baseAssetDeltaThisFundingPeriodAfter = $t02399326891._7
641- let totalPositionSizeAfter = $t02399326891._8
642- let cumulativeNotionalAfter = $t02399326891._9
643- let openInteresetNotionalAfter = $t02399326891._10
636+ let newPositionSize = $t02390026798._1
637+ let newPositionRemainMargin = $t02390026798._2
638+ let newPosiionOpenNotional = $t02390026798._3
639+ let newPositionLatestCPF = $t02390026798._4
640+ let baseAssetReserveAfter = $t02390026798._5
641+ let quoteAssetReserveAfter = $t02390026798._6
642+ let baseAssetDeltaThisFundingPeriodAfter = $t02390026798._7
643+ let totalPositionSizeAfter = $t02390026798._8
644+ let cumulativeNotionalAfter = $t02390026798._9
645+ let openInteresetNotionalAfter = $t02390026798._10
644646 (updatePosition(toString(i.caller), newPositionSize, newPositionRemainMargin, newPosiionOpenNotional, newPositionLatestCPF) ++ updateAmm(quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter))
645647 }
646648
647649
648650
649651 @Callable(i)
650652 func increasePosition (_direction,_leverage,_minBaseAssetAmount) = {
651653 let _rawAmount = i.payments[0].amount
652654 if (if (if (if (if (if (if (if ((_direction != DIR_LONG))
653655 then (_direction != DIR_SHORT)
654656 else false)
655657 then true
656658 else (0 >= _rawAmount))
657659 then true
658660 else if (((1 * DECIMAL_UNIT) > _leverage))
659661 then true
660662 else (_leverage > (3 * DECIMAL_UNIT)))
661663 then true
662664 else !(initialized()))
663665 then true
664666 else (i.payments[0].assetId != quoteAsset()))
665667 then true
666668 else !(requireMoreMarginRatio(divd(DECIMAL_UNIT, _leverage), initMarginRatio(), true)))
667669 then true
668670 else paused())
669671 then throw("Invalid increasePosition parameters")
670672 else {
671673 let feeAmount = muld(_rawAmount, fee())
672674 let _amount = (_rawAmount - feeAmount)
673- let $t02792628078 = getPosition(toString(i.caller))
674- let oldPositionSize = $t02792628078._1
675- let oldPositionMargin = $t02792628078._2
676- let oldPositionOpenNotional = $t02792628078._3
677- let oldPositionLstUpdCPF = $t02792628078._4
675+ let $t02783327985 = getPosition(toString(i.caller))
676+ let oldPositionSize = $t02783327985._1
677+ let oldPositionMargin = $t02783327985._2
678+ let oldPositionOpenNotional = $t02783327985._3
679+ let oldPositionLstUpdCPF = $t02783327985._4
678680 let isNewPosition = (oldPositionSize == 0)
679681 let isSameDirection = if ((oldPositionSize > 0))
680682 then (_direction == DIR_LONG)
681683 else (_direction == DIR_SHORT)
682684 let expandExisting = if (!(isNewPosition))
683685 then isSameDirection
684686 else false
685687 let isAdd = (_direction == DIR_LONG)
686- let $t02836730656 = if (if (isNewPosition)
688+ let $t02827430563 = if (if (isNewPosition)
687689 then true
688690 else expandExisting)
689691 then {
690692 let openNotional = muld(_amount, _leverage)
691- let $t02879029042 = swapInput(isAdd, openNotional)
692- let amountBaseAssetBought = $t02879029042._1
693- let quoteAssetReserveAfter = $t02879029042._2
694- let baseAssetReserveAfter = $t02879029042._3
695- let baseAssetDeltaThisFundingPeriodAfter = $t02879029042._4
696- let totalPositionSizeAfter = $t02879029042._5
697- let cumulativeNotionalAfter = $t02879029042._6
693+ let $t02869728949 = swapInput(isAdd, openNotional)
694+ let amountBaseAssetBought = $t02869728949._1
695+ let quoteAssetReserveAfter = $t02869728949._2
696+ let baseAssetReserveAfter = $t02869728949._3
697+ let baseAssetDeltaThisFundingPeriodAfter = $t02869728949._4
698+ let totalPositionSizeAfter = $t02869728949._5
699+ let cumulativeNotionalAfter = $t02869728949._6
698700 if (if ((_minBaseAssetAmount != 0))
699701 then (_minBaseAssetAmount > abs(amountBaseAssetBought))
700702 else false)
701703 then throw(((("Limit error: " + toString(abs(amountBaseAssetBought))) + " < ") + toString(_minBaseAssetAmount)))
702704 else {
703705 let newPositionSize = (oldPositionSize + amountBaseAssetBought)
704706 let increaseMarginRequirement = divd(openNotional, _leverage)
705- let $t02942329676 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, increaseMarginRequirement)
706- let remainMargin = $t02942329676._1
707- let x1 = $t02942329676._2
708- let x2 = $t02942329676._3
709- let oldLatestCPF = $t02942329676._4
707+ let $t02933029583 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, increaseMarginRequirement)
708+ let remainMargin = $t02933029583._1
709+ let x1 = $t02933029583._2
710+ let x2 = $t02933029583._3
711+ let oldLatestCPF = $t02933029583._4
710712 $Tuple10(newPositionSize, remainMargin, (oldPositionOpenNotional + openNotional), oldLatestCPF, baseAssetReserveAfter, quoteAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, (openInteresetNotional() + openNotional))
711713 }
712714 }
713715 else {
714716 let openNotional = muld(_amount, _leverage)
715- let $t03034930465 = getPositionNotionalAndUnrealizedPnl(toString(i.caller), PNL_OPTION_SPOT)
716- let oldPositionNotional = $t03034930465._1
717- let unrealizedPnl = $t03034930465._2
717+ let $t03025630372 = getPositionNotionalAndUnrealizedPnl(toString(i.caller), PNL_OPTION_SPOT)
718+ let oldPositionNotional = $t03025630372._1
719+ let unrealizedPnl = $t03025630372._2
718720 if ((oldPositionNotional > openNotional))
719721 then throw("Use decreasePosition to decrease position size")
720722 else throw("Close position first")
721723 }
722- let newPositionSize = $t02836730656._1
723- let newPositionRemainMargin = $t02836730656._2
724- let newPosiionOpenNotional = $t02836730656._3
725- let newPositionLatestCPF = $t02836730656._4
726- let baseAssetReserveAfter = $t02836730656._5
727- let quoteAssetReserveAfter = $t02836730656._6
728- let baseAssetDeltaThisFundingPeriodAfter = $t02836730656._7
729- let totalPositionSizeAfter = $t02836730656._8
730- let cumulativeNotionalAfter = $t02836730656._9
731- let openInteresetNotionalAfter = $t02836730656._10
724+ let newPositionSize = $t02827430563._1
725+ let newPositionRemainMargin = $t02827430563._2
726+ let newPosiionOpenNotional = $t02827430563._3
727+ let newPositionLatestCPF = $t02827430563._4
728+ let baseAssetReserveAfter = $t02827430563._5
729+ let quoteAssetReserveAfter = $t02827430563._6
730+ let baseAssetDeltaThisFundingPeriodAfter = $t02827430563._7
731+ let totalPositionSizeAfter = $t02827430563._8
732+ let cumulativeNotionalAfter = $t02827430563._9
733+ let openInteresetNotionalAfter = $t02827430563._10
732734 let feeToStakers = (feeAmount / 2)
733735 let feeToInsurance = (feeAmount - feeToStakers)
734736 let stake = invoke(quoteAssetStaking(), "lockNeutrinoSP", [toString(stakingAddress()), ALL_FEES], [AttachedPayment(quoteAsset(), _amount)])
735737 if ((stake == stake))
736738 then {
737739 let depositInsurance = invoke(insuranceAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), feeToInsurance)])
738740 if ((depositInsurance == depositInsurance))
739741 then (((updatePosition(toString(i.caller), newPositionSize, newPositionRemainMargin, newPosiionOpenNotional, newPositionLatestCPF) ++ updateAmm(quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter)) ++ transferFee(feeToStakers)) ++ updateBalance((cbalance() + _amount)))
740742 else throw("Strict value is not equal to itself.")
741743 }
742744 else throw("Strict value is not equal to itself.")
743745 }
744746 }
745747
746748
747749
748750 @Callable(i)
749751 func addMargin () = {
750752 let _rawAmount = i.payments[0].amount
751753 if (if (if (if ((i.payments[0].assetId != quoteAsset()))
752754 then true
753755 else !(requireOpenPosition(toString(i.caller))))
754756 then true
755757 else !(initialized()))
756758 then true
757759 else paused())
758760 then throw("Invalid addMargin parameters")
759761 else {
760762 let feeAmount = muld(_rawAmount, fee())
761763 let _amount = (_rawAmount - feeAmount)
762- let $t03193132083 = getPosition(toString(i.caller))
763- let oldPositionSize = $t03193132083._1
764- let oldPositionMargin = $t03193132083._2
765- let oldPositionOpenNotional = $t03193132083._3
766- let oldPositionLstUpdCPF = $t03193132083._4
764+ let $t03183831990 = getPosition(toString(i.caller))
765+ let oldPositionSize = $t03183831990._1
766+ let oldPositionMargin = $t03183831990._2
767+ let oldPositionOpenNotional = $t03183831990._3
768+ let oldPositionLstUpdCPF = $t03183831990._4
767769 let feeToStakers = (feeAmount / 2)
768770 let feeToInsurance = (feeAmount - feeToStakers)
769771 let stake = invoke(quoteAssetStaking(), "lockNeutrinoSP", [toString(stakingAddress()), ALL_FEES], [AttachedPayment(quoteAsset(), _amount)])
770772 if ((stake == stake))
771773 then {
772774 let depositInsurance = invoke(insuranceAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), feeToInsurance)])
773775 if ((depositInsurance == depositInsurance))
774776 then ((updatePosition(toString(i.caller), oldPositionSize, (oldPositionMargin + i.payments[0].amount), oldPositionOpenNotional, oldPositionLstUpdCPF) ++ transferFee(feeToStakers)) ++ updateBalance((cbalance() + _amount)))
775777 else throw("Strict value is not equal to itself.")
776778 }
777779 else throw("Strict value is not equal to itself.")
778780 }
779781 }
780782
781783
782784
783785 @Callable(i)
784786 func removeMargin (_amount) = if (if (if (if ((0 >= _amount))
785787 then true
786788 else !(requireOpenPosition(toString(i.caller))))
787789 then true
788790 else !(initialized()))
789791 then true
790792 else paused())
791793 then throw("Invalid removeMargin parameters")
792794 else {
793- let $t03301633168 = getPosition(toString(i.caller))
794- let oldPositionSize = $t03301633168._1
795- let oldPositionMargin = $t03301633168._2
796- let oldPositionOpenNotional = $t03301633168._3
797- let oldPositionLstUpdCPF = $t03301633168._4
795+ let $t03292333075 = getPosition(toString(i.caller))
796+ let oldPositionSize = $t03292333075._1
797+ let oldPositionMargin = $t03292333075._2
798+ let oldPositionOpenNotional = $t03292333075._3
799+ let oldPositionLstUpdCPF = $t03292333075._4
798800 let marginDelta = -(_amount)
799- let $t03320533400 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, marginDelta)
800- let remainMargin = $t03320533400._1
801- let badDebt = $t03320533400._2
802- let x1 = $t03320533400._3
803- let latestCPF1 = $t03320533400._4
801+ let $t03311233307 = calcRemainMarginWithFundingPayment(oldPositionSize, oldPositionMargin, oldPositionLstUpdCPF, marginDelta)
802+ let remainMargin = $t03311233307._1
803+ let badDebt = $t03311233307._2
804+ let x1 = $t03311233307._3
805+ let latestCPF1 = $t03311233307._4
804806 if ((badDebt != 0))
805807 then throw("Invalid added margin amount")
806808 else {
807809 let unstake = invoke(quoteAssetStaking(), "unlockNeutrino", [_amount, toBase58String(quoteAsset())], nil)
808810 if ((unstake == unstake))
809811 then ((updatePosition(toString(i.caller), oldPositionSize, remainMargin, oldPositionOpenNotional, latestCPF1) ++ withdraw(i.caller, _amount)) ++ updateBalance((cbalance() - _amount)))
810812 else throw("Strict value is not equal to itself.")
811813 }
812814 }
813815
814816
815817
816818 @Callable(i)
817819 func closePosition () = if (if (if (!(requireOpenPosition(toString(i.caller))))
818820 then true
819821 else !(initialized()))
820822 then true
821823 else paused())
822824 then throw("Invalid closePosition parameters")
823825 else {
824- let $t03412234480 = internalClosePosition(toString(i.caller))
825- let x1 = $t03412234480._1
826- let badDebt = $t03412234480._2
827- let realizedPnl = $t03412234480._3
828- let marginToVault = $t03412234480._4
829- let quoteAssetReserveAfter = $t03412234480._5
830- let baseAssetReserveAfter = $t03412234480._6
831- let baseAssetDeltaThisFundingPeriodAfter = $t03412234480._7
832- let totalPositionSizeAfter = $t03412234480._8
833- let cumulativeNotionalAfter = $t03412234480._9
834- let openInteresetNotionalAfter = $t03412234480._10
826+ let $t03402934387 = internalClosePosition(toString(i.caller))
827+ let x1 = $t03402934387._1
828+ let badDebt = $t03402934387._2
829+ let realizedPnl = $t03402934387._3
830+ let marginToVault = $t03402934387._4
831+ let quoteAssetReserveAfter = $t03402934387._5
832+ let baseAssetReserveAfter = $t03402934387._6
833+ let baseAssetDeltaThisFundingPeriodAfter = $t03402934387._7
834+ let totalPositionSizeAfter = $t03402934387._8
835+ let cumulativeNotionalAfter = $t03402934387._9
836+ let openInteresetNotionalAfter = $t03402934387._10
835837 if ((badDebt > 0))
836838 then throw("Unable to close position with bad debt")
837839 else {
838840 let withdrawAmount = abs(marginToVault)
839841 let bd = (cbalance() - withdrawAmount)
840- let $t03467334769 = if ((0 > bd))
842+ let $t03458034676 = if ((0 > bd))
841843 then $Tuple2(0, abs(bd))
842844 else $Tuple2(bd, 0)
843- let nb = $t03467334769._1
844- let fromi = $t03467334769._2
845+ let nb = $t03458034676._1
846+ let fromi = $t03458034676._2
845847 let x = if ((fromi > 0))
846848 then {
847849 let withdrawInsurance = invoke(insuranceAddress(), "withdraw", [fromi], nil)
848850 if ((withdrawInsurance == withdrawInsurance))
849851 then nil
850852 else throw("Strict value is not equal to itself.")
851853 }
852854 else nil
853855 if ((x == x))
854856 then {
855857 let unstake = invoke(quoteAssetStaking(), "unlockNeutrino", [(withdrawAmount - fromi), toBase58String(quoteAsset())], nil)
856858 if ((unstake == unstake))
857859 then (((deletePosition(toString(i.caller)) ++ updateAmm(quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter)) ++ withdraw(i.caller, withdrawAmount)) ++ updateBalance(nb))
858860 else throw("Strict value is not equal to itself.")
859861 }
860862 else throw("Strict value is not equal to itself.")
861863 }
862864 }
863865
864866
865867
866868 @Callable(i)
867869 func liquidate (_trader) = {
868870 let marginRatio = if (isOverFluctuationLimit())
869871 then getMarginRatioByOption(_trader, PNL_OPTION_ORACLE)
870872 else getMarginRatioByOption(_trader, PNL_OPTION_SPOT)
871873 if (if (if (!(requireMoreMarginRatio(marginRatio, mmr(), false)))
872874 then true
873875 else !(initialized()))
874876 then true
875877 else paused())
876878 then throw("Unable to liquidate")
877879 else {
878- let $t03594136271 = internalClosePosition(_trader)
879- let x1 = $t03594136271._1
880- let badDebt = $t03594136271._2
881- let x2 = $t03594136271._3
882- let marginToVault = $t03594136271._4
883- let quoteAssetReserveAfter = $t03594136271._5
884- let baseAssetReserveAfter = $t03594136271._6
885- let baseAssetDeltaThisFundingPeriodAfter = $t03594136271._7
886- let totalPositionSizeAfter = $t03594136271._8
887- let cumulativeNotionalAfter = $t03594136271._9
888- let openInteresetNotionalAfter = $t03594136271._10
889- let exchangedQuoteAssetAmount = $t03594136271._11
880+ let $t03584836178 = internalClosePosition(_trader)
881+ let x1 = $t03584836178._1
882+ let badDebt = $t03584836178._2
883+ let x2 = $t03584836178._3
884+ let marginToVault = $t03584836178._4
885+ let quoteAssetReserveAfter = $t03584836178._5
886+ let baseAssetReserveAfter = $t03584836178._6
887+ let baseAssetDeltaThisFundingPeriodAfter = $t03584836178._7
888+ let totalPositionSizeAfter = $t03584836178._8
889+ let cumulativeNotionalAfter = $t03584836178._9
890+ let openInteresetNotionalAfter = $t03584836178._10
891+ let exchangedQuoteAssetAmount = $t03584836178._11
890892 let feeToLiquidator = (muld(exchangedQuoteAssetAmount, liquidationFeeRatio()) / 2)
891- let $t03636136765 = if ((feeToLiquidator > marginToVault))
893+ let $t03626836672 = if ((feeToLiquidator > marginToVault))
892894 then $Tuple3((feeToLiquidator - marginToVault), marginToVault, ((badDebt + feeToLiquidator) - marginToVault))
893895 else $Tuple3(0, (marginToVault - feeToLiquidator), badDebt)
894- let liquidationBadDebt = $t03636136765._1
895- let remainMargin = $t03636136765._2
896- let totalBadDebt = $t03636136765._3
896+ let liquidationBadDebt = $t03626836672._1
897+ let remainMargin = $t03626836672._2
898+ let totalBadDebt = $t03626836672._3
897899 let bd = (cbalance() - feeToLiquidator)
898- let $t03681336901 = if ((0 > bd))
900+ let $t03672036808 = if ((0 > bd))
899901 then $Tuple2(0, abs(bd))
900902 else $Tuple2(bd, 0)
901- let nb = $t03681336901._1
902- let fromi = $t03681336901._2
903+ let nb = $t03672036808._1
904+ let fromi = $t03672036808._2
903905 let x = if ((fromi > 0))
904906 then {
905907 let withdrawInsurance = invoke(insuranceAddress(), "withdraw", [fromi], nil)
906908 if ((withdrawInsurance == withdrawInsurance))
907909 then nil
908910 else throw("Strict value is not equal to itself.")
909911 }
910912 else nil
911913 if ((x == x))
912914 then {
913915 let unstake = invoke(quoteAssetStaking(), "unlockNeutrino", [(feeToLiquidator - fromi), toBase58String(quoteAsset())], nil)
914916 if ((unstake == unstake))
915917 then (((deletePosition(_trader) ++ updateAmm(quoteAssetReserveAfter, baseAssetReserveAfter, baseAssetDeltaThisFundingPeriodAfter, totalPositionSizeAfter, cumulativeNotionalAfter, openInteresetNotionalAfter)) ++ withdraw(i.caller, feeToLiquidator)) ++ updateBalance(nb))
916918 else throw("Strict value is not equal to itself.")
917919 }
918920 else throw("Strict value is not equal to itself.")
919921 }
920922 }
921923
922924
923925
924926 @Callable(i)
925927 func payFunding () = {
926928 let fundingBlockTimestamp = nextFundingBlockTimestamp()
927929 if (if (if ((fundingBlockTimestamp > lastBlock.timestamp))
928930 then true
929931 else !(initialized()))
930932 then true
931933 else paused())
932934 then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(fundingBlockTimestamp)))
933935 else {
934936 let underlyingPrice = getOracleTwapPrice()
935937 let spotTwapPrice = getTwapSpotPrice()
936938 let premium = (spotTwapPrice - underlyingPrice)
937939 let premiumFraction = divd(muld(premium, fundingPeriodDecimal()), ONE_DAY)
938940 updateFunding(0, (fundingBlockTimestamp + fundingPeriodSeconds()), (latestCPF() + premiumFraction), divd(premiumFraction, underlyingPrice))
939941 }
940942 }
941943
942944
943945
944946 @Callable(i)
945947 func v_get (_trader) = {
946- let $t03837538428 = internalClosePosition(_trader)
947- let x1 = $t03837538428._1
948- let x2 = $t03837538428._2
949- let x3 = $t03837538428._3
950- let x4 = $t03837538428._4
948+ let $t03828238335 = internalClosePosition(_trader)
949+ let x1 = $t03828238335._1
950+ let x2 = $t03828238335._2
951+ let x3 = $t03828238335._3
952+ let x4 = $t03828238335._4
951953 throw((((s(x2) + s(x3)) + s(x4)) + s(getMarginRatio(_trader))))
952954 }
953955
954956
955957 @Verifier(tx)
956958 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey())
957959

github/deemru/w8io/873ac7e 
162.36 ms