tx · 6Ch1twG1dcQbDQGG7KUzv381N6NJFGBYT71XXfd1YobJ

3MzqQ3HKdkHmJmk9mDhAeAMxmK5D2ztdAe5:  -0.14000000 Waves

2022.10.24 16:06 [2286532] smart account 3MzqQ3HKdkHmJmk9mDhAeAMxmK5D2ztdAe5 > SELF 0.00000000 Waves

{ "type": 13, "id": "6Ch1twG1dcQbDQGG7KUzv381N6NJFGBYT71XXfd1YobJ", "fee": 14000000, "feeAssetId": null, "timestamp": 1666616791246, "version": 2, "chainId": 84, "sender": "3MzqQ3HKdkHmJmk9mDhAeAMxmK5D2ztdAe5", "senderPublicKey": "FEnkfXnQZkk1FmjhH6QZqyK2taN6ngnZBexevKxouLUM", "proofs": [ "29SARVVrCf2uwrA4D52DwrdddsC9E1gAiB9U5ZVP1fpoYdjreSYgn2qfRMReiho4kLRadtrkbEZehjg27oVAqsii", "5vdTFRVU8nkBEcyTY7rQRZnyxTZMLNhpKkSB5TCQ7yc5gQF8Sazpmtp5Xb7a9LkjvSav3rzeDWKFRx1meHz7C9y5" ], "script": "base64:BgJKCAISBgoEAhgREhIGCgQCGBESEgYKBAIYERISBgoEAhgREhIGCgQCGBESEgYKBAIYERISBgoEAhgREhIGCgQCGBESEgYKBAIYERJMAAd2ZXJzaW9uAgUxLjAuMAAIa1ZlcnNpb24CB3ZlcnNpb24AB2tBY3RpdmUCBmFjdGl2ZQAJa0Fzc2V0SWRBAgpBX2Fzc2V0X2lkAAlrQXNzZXRJZEICCkJfYXNzZXRfaWQACWtCYWxhbmNlQQIPQV9hc3NldF9iYWxhbmNlAAlrQmFsYW5jZUICD0JfYXNzZXRfYmFsYW5jZQANa0JhbGFuY2VJbml0QQIMQV9hc3NldF9pbml0AA1rQmFsYW5jZUluaXRCAgxCX2Fzc2V0X2luaXQADWtTaGFyZUFzc2V0SWQCDnNoYXJlX2Fzc2V0X2lkABFrU2hhcmVBc3NldFN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AARrRmVlAgpjb21taXNzaW9uAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAA1rRmlyc3RIYXJ2ZXN0Ag1maXJzdF9oYXJ2ZXN0ABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAALa1NoYXJlTGltaXQCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAC2tCYXNlUGVyaW9kAgtiYXNlX3BlcmlvZAANa1BlcmlvZExlbmd0aAINcGVyaW9kX2xlbmd0aAAMa1N0YXJ0SGVpZ2h0AgxzdGFydF9oZWlnaHQADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAxrRVVSTkFkZHJlc3MCFHN0YWtpbmdfZXVybl9hZGRyZXNzAA5rTGVhc2luZ0Ftb3VudAIObGVhc2luZ19hbW91bnQADGtVU0ROQXNzZXRJZAINdXNkbl9hc3NldF9pZAAMa0VVUk5Bc3NldElkAg1ldXJuX2Fzc2V0X2lkAA5rU3Rha2luZ0Fzc2V0cwIOc3Rha2luZ19hc3NldHMADWtPcmFjbGVBY3RpdmUCFGFjdGl2ZV9hbGxfY29udHJhY3RzABdrT3JhY2xlQWN0aXZlRXhjaGFuZ2VycwIYYWN0aXZlX2dsb2JhbF9leGNoYW5nZXJzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA9rVXNlckdTd29wSW5Hb3YCDV9HU3dvcF9hbW91bnQADmtVc2VyU3dvcEluR292AgxfU1dPUF9hbW91bnQAC2tPcmFjbGVQb29sAgVwb29sXwANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAAtrR292QWRkcmVzcwISZ292ZXJuYW5jZV9hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwAGb3JhY2xlCQEHQWRkcmVzcwEBGgFUSBOXDMDTM8wlMoC2KfenZGiAq+PMe0uZARNnZXRCYXNlNThGcm9tT3JhY2xlAQNrZXkEByRtYXRjaDAJAJ0IAgUGb3JhY2xlBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQkArAICBQNrZXkCCGlzIGVtcHR5AAxhZG1pblB1YktleTEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MQAMYWRtaW5QdWJLZXkyCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTIADGFkbWluUHViS2V5MwkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkzABFhZG1pbkludm9rZVB1YktleQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRJrQWRtaW5JbnZva2VQdWJLZXkAD21vbmV5Qm94QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEGtNb25leUJveEFkZHJlc3MADXZvdGluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rVm90aW5nQWRkcmVzcwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwAEVVNETgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFzc2V0SWQABEVVUk4JARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa0VVUk5Bc3NldElkAA1zdGFraW5nQXNzZXRzCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFDmtTdGFraW5nQXNzZXRzABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MAEnN0YWtpbmdFVVJOQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtFVVJOQWRkcmVzcwAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFC2tCYXNlUGVyaW9kAhFFbXB0eSBrQmFzZVBlcmlvZAALc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQxrU3RhcnRIZWlnaHQCEkVtcHR5IGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa1BlcmlvZExlbmd0aAITRW1wdHkga1BlcmlvZExlbmd0aAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kCQBkAgkAZAIFCmJhc2VQZXJpb2QJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAMABmFjdGl2ZQMJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBm9yYWNsZQUNa09yYWNsZUFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUGb3JhY2xlBRdrT3JhY2xlQWN0aXZlRXhjaGFuZ2VycwcACWZlZVNjYWxlNgDAhD0ABnNjYWxlOACAwtcvAQ5hY2NvdW50QmFsYW5jZQIHYXNzZXRJZARwb29sBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHBvb2wFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQRwb29sCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yAQxzdGFrZWRBbW91bnQCB2Fzc2V0SWQEcG9vbAQWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDADCQAAAgUDYUlkBQRVU0ROCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFA2FJZAIBXwkApQgBBQRwb29sAwkAAAIFA2FJZAUERVVSTgkAmggCBRJzdGFraW5nRVVSTkFkZHJlc3MJAKwCAgkArAICCQCsAgICGCVzJXMlc19fc3Rha2luZ0JhbGFuY2VfXwkA2AQBBQNhSWQCAl9fCQClCAEFBHBvb2wAAAMJAAECBQckbWF0Y2gwAgRVbml0CQELdmFsdWVPckVsc2UCCQCaCAIFBHBvb2wFDmtMZWFzaW5nQW1vdW50AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEMZ2V0QXNzZXRJbmZvAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwMJAAECBQckbWF0Y2gwAgZTdHJpbmcGCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAECyR0MDQwMDU0MTc3BAckbWF0Y2gxBQJpZAMJAAECBQckbWF0Y2gxAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDEJAJQKAgkA2AQBBQNhSWQFA2FJZAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEA2FJZAUHJG1hdGNoMQkAlAoCBQNhSWQJANkEAQUDYUlkCQACAQILTWF0Y2ggZXJyb3IECHN0cmluZ0lkCAULJHQwNDAwNTQxNzcCXzEEB2J5dGVzSWQIBQskdDA0MDA1NDE3NwJfMgQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFB2J5dGVzSWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlQoDBQhzdHJpbmdJZAgFBGluZm8EbmFtZQgFBGluZm8IZGVjaW1hbHMDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAJAJUKAwIFV0FWRVMCBVdBVkVTAAgJAAIBAgtNYXRjaCBlcnJvcgEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEUY2FsY3VsYXRlRmVlRGlzY291bnQBCHVzZXJBZGRyBApzd29wQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgkApQgBBQh1c2VyQWRkcgUOa1VzZXJTd29wSW5Hb3YAAAQLZ1N3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICCQClCAEFCHVzZXJBZGRyBQ9rVXNlckdTd29wSW5Hb3YAAAQOZGlzY291bnRWYWx1ZXMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQ9rRGlzY291bnRWYWx1ZXMCASwECWRpc2NvdW50cwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFCmtEaXNjb3VudHMCASwDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAAkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAAMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwABAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAIDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAEBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAQJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMABAUJZmVlU2NhbGU2AQ1jYWxjdWxhdGVGZWVzBglwbXRBbW91bnQSbWluQW1vdW50VG9SZWNlaXZlCXRva2VuRnJvbQd0b2tlblRvA2ZlZQ1mZWVHb3Zlcm5hbmNlBBBhbW91bnRXaXRob3V0RmVlCQBrAwUHdG9rZW5UbwUJcG10QW1vdW50CQBkAgUJcG10QW1vdW50BQl0b2tlbkZyb20EDWFtb3VudFdpdGhGZWUJAGsDBRBhbW91bnRXaXRob3V0RmVlCQBlAgUJZmVlU2NhbGU2BQNmZWUFCWZlZVNjYWxlNgQQZ292ZXJuYW5jZVJld2FyZAkAawMFEGFtb3VudFdpdGhvdXRGZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgMJAGYCBRJtaW5BbW91bnRUb1JlY2VpdmUFDWFtb3VudFdpdGhGZWUJAAIBCQCsAgIJAKwCAgkArAICAh1DYWxjdWxhdGVkIGFtb3VudCB0byByZWNlaXZlIAkApAMBBQ1hbW91bnRXaXRoRmVlAiAgaXMgbGVzcyB0aGFuIHNwZWNpZmllZCBtaW5pbXVtIAkApAMBBRJtaW5BbW91bnRUb1JlY2VpdmUJAJUKAwUQYW1vdW50V2l0aG91dEZlZQUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAEQY2FsY3VsYXRlVmlydEdldAMJcG10QW1vdW50B2JhbGFuY2UDZmVlBAFhAAEEAWIJAGUCCQBkAgkAZAIFB2JhbGFuY2UJAGsDBQdiYWxhbmNlCQBlAgUJZmVlU2NhbGU2BQNmZWUFCWZlZVNjYWxlNgkAawMFCXBtdEFtb3VudAkAZQIFCWZlZVNjYWxlNgUDZmVlBQlmZWVTY2FsZTYFCXBtdEFtb3VudAQBYwkAuQICCQC+AgEJALYCAQUHYmFsYW5jZQkAtgIBBQlwbXRBbW91bnQEAUQJALgCAgkAuQICCQC2AgEFAWIJALYCAQUBYgkAuQICCQC5AgIJALYCAQAECQC2AgEFAWEFAWMJAGgCCQCgAwEJALoCAgkAtwICCQC+AgEJALYCAQUBYgkAdgYFAUQAAAkAtgIBAAUAAQAABQRET1dOCQC2AgEAAgUBYQERcGFyc2VQYXltZW50QXNzZXQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAEABQR1bml0BQdhc3NldElkARFzdXNwZW5kU3VzcGljaW91cwYPYWNjb3VudEJhbGFuY2VBD2FjY291bnRCYWxhbmNlQghiYWxhbmNlQQhiYWxhbmNlQghhc3NldElkQQhhc3NldElkQgkBB3N1c3BlbmQBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiNTdXNwaWNpb3VzIHN0YXRlLiBBY3R1YWwgYmFsYW5jZXM6IAkApAMBBQ9hY2NvdW50QmFsYW5jZUECASAFCGFzc2V0SWRBAgIsIAkApAMBBQ9hY2NvdW50QmFsYW5jZUICASAFCGFzc2V0SWRCAgkuIFN0YXRlOiAJAKQDAQUIYmFsYW5jZUECASAFCGFzc2V0SWRBAgIsIAkApAMBBQhiYWxhbmNlQgIBIAUIYXNzZXRJZEIBCGlzQWN0aXZlAAMFBmFjdGl2ZQUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBDGlzT3JhY2xlUG9vbAELcG9vbEFkZHJlc3MDCQEJaXNEZWZpbmVkAQkAnQgCBQZvcmFjbGUJAKwCAgULa09yYWNsZVBvb2wFC3Bvb2xBZGRyZXNzBQR1bml0CQACAQIbREFwcCBpcyBub3QgcmVnaXN0ZXJlZCBwb29sAQ9nZXRQb29sQmFsYW5jZXMDBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIECGJhbGFuY2VBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sBQlrQmFsYW5jZUEECGJhbGFuY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sBQlrQmFsYW5jZUIEDXN0YWtlZEFtb3VudEEJAQxzdGFrZWRBbW91bnQCBQhhc3NldElkQQUEcG9vbAQNc3Rha2VkQW1vdW50QgkBDHN0YWtlZEFtb3VudAIFCGFzc2V0SWRCBQRwb29sBA9hY2NvdW50QmFsYW5jZUEJAGQCCQEOYWNjb3VudEJhbGFuY2UCBQhhc3NldElkQQUEcG9vbAUNc3Rha2VkQW1vdW50QQQPYWNjb3VudEJhbGFuY2VCCQBkAgkBDmFjY291bnRCYWxhbmNlAgUIYXNzZXRJZEIFBHBvb2wFDXN0YWtlZEFtb3VudEIEC3NoYXJlU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sBRFrU2hhcmVBc3NldFN1cHBseQkAlwoFBQhiYWxhbmNlQQUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VCBQtzaGFyZVN1cHBseQENZ2V0UG9vbEFzc2V0cwEEcG9vbAQLc3RyQXNzZXRJZEEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wFCWtBc3NldElkQQQLc3RyQXNzZXRJZEIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wFCWtBc3NldElkQgQIYXNzZXRJZEEDCQAAAgULc3RyQXNzZXRJZEECBVdBVkVTBQR1bml0CQDZBAEFC3N0ckFzc2V0SWRBBAhhc3NldElkQgMJAAACBQtzdHJBc3NldElkQgIFV0FWRVMFBHVuaXQJANkEAQULc3RyQXNzZXRJZEIEDHNoYXJlQXNzZXRJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sBQ1rU2hhcmVBc3NldElkCQCXCgUFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgUIYXNzZXRJZEEFCGFzc2V0SWRCBQxzaGFyZUFzc2V0SWQBDGdldEZlZVBhcmFtcwIEcG9vbAZjYWxsZXIEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBBQZjYWxsZXIEA2ZlZQkAbgQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHBvb2wFBGtGZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcEBmdvdkZlZQkAbgQJAGsDBQNmZWUAKABkBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HCQCUCgIFA2ZlZQUGZ292RmVlCQFpAQRpbml0BAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwQGY2FsbGVyCQEHQWRkcmVzcwEFC2NhbGxlckJ5dGVzBAskdDA4OTk2OTA3NAkAlAoCCQCRAwIFCHBBbW91bnRzAAAJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAAECnBtdEFtb3VudEEIBQskdDA4OTk2OTA3NAJfMQQLcG10QXNzZXRJZEEIBQskdDA4OTk2OTA3NAJfMgQLJHQwOTA3OTkxNTcJAJQKAgkAkQMCBQhwQW1vdW50cwABCQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwABBApwbXRBbW91bnRCCAULJHQwOTA3OTkxNTcCXzEEC3BtdEFzc2V0SWRCCAULJHQwOTA3OTkxNTcCXzIDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzCQDMCAIFEWFkbWluSW52b2tlUHViS2V5BQNuaWwIBQFpFW9yaWdpbkNhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAQlpc0RlZmluZWQBCQCbCAIFBmNhbGxlcgUHa0FjdGl2ZQkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQAAAgULcG10QXNzZXRJZEEFC3BtdEFzc2V0SWRCCQACAQIYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BAskdDA5NTI3OTYwNAkBDGdldEFzc2V0SW5mbwEFC3BtdEFzc2V0SWRBBA5wbXRTdHJBc3NldElkQQgFCyR0MDk1Mjc5NjA0Al8xBA1wbXRBc3NldE5hbWVBCAULJHQwOTUyNzk2MDQCXzIEDHBtdERlY2ltYWxzQQgFCyR0MDk1Mjc5NjA0Al8zBAskdDA5NjEzOTY5MAkBDGdldEFzc2V0SW5mbwEFC3BtdEFzc2V0SWRCBA5wbXRTdHJBc3NldElkQggFCyR0MDk2MTM5NjkwAl8xBA1wbXRBc3NldE5hbWVCCAULJHQwOTYxMzk2OTACXzIEDHBtdERlY2ltYWxzQggFCyR0MDk2MTM5NjkwAl8zBAxmaXJzdEhhcnZlc3QJAAACCQCRAwIFBGFyZ3MAAAIEdHJ1ZQQJc2hhcmVOYW1lCQCsAgIJAKwCAgkArAICAgFzCQCvAgIFDXBtdEFzc2V0TmFtZUEABwIBXwkArwICBQ1wbXRBc3NldE5hbWVCAAcEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQ1wbXRBc3NldE5hbWVBAgUgYW5kIAUNcG10QXNzZXROYW1lQgIMIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgQEYXJnMQkAbAYFCnBtdEFtb3VudEEFDHBtdERlY2ltYWxzQQAFAAEFDHBtdERlY2ltYWxzQQUERE9XTgQEYXJnMgkAbAYFCnBtdEFtb3VudEIFDHBtdERlY2ltYWxzQgAFAAEFDHBtdERlY2ltYWxzQgUERE9XTgQEYXJnMwkAbAYACgAABQ1zaGFyZURlY2ltYWxzAAAAAAUERE9XTgQSc2hhcmVJbml0aWFsU3VwcGx5CQBrAwUEYXJnMQUEYXJnMgUEYXJnMwQKc2hhcmVJc3N1ZQkAwggFBQlzaGFyZU5hbWUFEHNoYXJlRGVzY3JpcHRpb24FEnNoYXJlSW5pdGlhbFN1cHBseQUNc2hhcmVEZWNpbWFscwYEDHNoYXJlSXNzdWVJZAkAuAgBBQpzaGFyZUlzc3VlBAZzdGFrZTEDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQ5wbXRTdHJBc3NldElkQQkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQpwbXRBbW91bnRBCQDMCAIFDnBtdFN0ckFzc2V0SWRBBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMQUGc3Rha2UxBAZzdGFrZTIDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQ5wbXRTdHJBc3NldElkQgkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQpwbXRBbW91bnRCCQDMCAIFDnBtdFN0ckFzc2V0SWRCBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMgUGc3Rha2UyBAliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa1ZlcnNpb24FB3ZlcnNpb24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBc3NldElkQQUOcG10U3RyQXNzZXRJZEEJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa0Fzc2V0SWRCBQ5wbXRTdHJBc3NldElkQgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBBQpwbXRBbW91bnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIFCnBtdEFtb3VudEIJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfY3BtbQkAzAgCBQpzaGFyZUlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUMc2hhcmVJc3N1ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQUSc2hhcmVJbml0aWFsU3VwcGx5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUSc2hhcmVJbml0aWFsU3VwcGx5BQxzaGFyZUlzc3VlSWQFA25pbAMFDGZpcnN0SGFydmVzdAkAlAoCBQNuaWwJAJQKAgkAzggCBQliYXNlRW50cnkJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtGaXJzdEhhcnZlc3QFDGZpcnN0SGFydmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa0ZpcnN0SGFydmVzdEhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0CQBoAgUVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kBQxwZXJpb2RMZW5ndGgFA25pbAUDbmlsCQCUCgIFA25pbAkAlAoCBQliYXNlRW50cnkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFpbml0V2l0aEluaXRSYXRpbwQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMEBmNhbGxlcgkBB0FkZHJlc3MBBQtjYWxsZXJCeXRlcwQNJHQwMTE5MzUxMjEzNQkAlwoFCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwABCQCRAwIFBGFyZ3MAAgkAkQMCBQRhcmdzAAMJAAACCQCRAwIFBGFyZ3MABAIEdHJ1ZQQJYW10QXNzZXRBCAUNJHQwMTE5MzUxMjEzNQJfMQQJYW10QXNzZXRCCAUNJHQwMTE5MzUxMjEzNQJfMgQLYXNzZXRJZEFTdHIIBQ0kdDAxMTkzNTEyMTM1Al8zBAthc3NldElkQlN0cggFDSR0MDExOTM1MTIxMzUCXzQEDGZpcnN0SGFydmVzdAgFDSR0MDExOTM1MTIxMzUCXzUDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzCQDMCAIFEWFkbWluSW52b2tlUHViS2V5BQNuaWwIBQFpFW9yaWdpbkNhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAQlpc0RlZmluZWQBCQCbCAIFBmNhbGxlcgUHa0FjdGl2ZQkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQAAAgULYXNzZXRJZEFTdHIFC2Fzc2V0SWRCU3RyCQACAQIYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BA0kdDAxMjUwNTEyNTgyCQEMZ2V0QXNzZXRJbmZvAQULYXNzZXRJZEFTdHIEDnBtdFN0ckFzc2V0SWRBCAUNJHQwMTI1MDUxMjU4MgJfMQQNcG10QXNzZXROYW1lQQgFDSR0MDEyNTA1MTI1ODICXzIEDHBtdERlY2ltYWxzQQgFDSR0MDEyNTA1MTI1ODICXzMEDSR0MDEyNTkxMTI2NjgJAQxnZXRBc3NldEluZm8BBQthc3NldElkQlN0cgQOcG10U3RyQXNzZXRJZEIIBQ0kdDAxMjU5MTEyNjY4Al8xBA1wbXRBc3NldE5hbWVCCAUNJHQwMTI1OTExMjY2OAJfMgQMcG10RGVjaW1hbHNCCAUNJHQwMTI1OTExMjY2OAJfMwQJc2hhcmVOYW1lCQCsAgIJAKwCAgkArAICAgFzCQCvAgIFDXBtdEFzc2V0TmFtZUEABwIBXwkArwICBQ1wbXRBc3NldE5hbWVCAAcEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQ1wbXRBc3NldE5hbWVBAgUgYW5kIAUNcG10QXNzZXROYW1lQgIMIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgQSc2hhcmVJbml0aWFsU3VwcGx5AAAECnNoYXJlSXNzdWUJAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uBRJzaGFyZUluaXRpYWxTdXBwbHkFDXNoYXJlRGVjaW1hbHMGBAxzaGFyZUlzc3VlSWQJALgIAQUKc2hhcmVJc3N1ZQQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXNzZXRJZEEFDnBtdFN0ckFzc2V0SWRBCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBc3NldElkQgUOcG10U3RyQXNzZXRJZEIJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtCYWxhbmNlSW5pdEEFCWFtdEFzc2V0QQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa0JhbGFuY2VJbml0QgUJYW10QXNzZXRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfY3BtbQkAzAgCBQpzaGFyZUlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUMc2hhcmVJc3N1ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQUSc2hhcmVJbml0aWFsU3VwcGx5BQNuaWwDBQxmaXJzdEhhcnZlc3QJAJQKAgUDbmlsCQCUCgIJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFA25pbAkAlAoCBQNuaWwJAJQKAgUJYmFzZUVudHJ5BQNuaWwBaQEYa2VlcExpbWl0Rm9yRmlyc3RIYXJ2ZXN0BAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwkAzAgCBRFhZG1pbkludm9rZVB1YktleQUDbmlsCAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24ECnNoYXJlTGltaXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRhcmdzAAAJAJQKAgUDbmlsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tTaGFyZUxpbWl0BQpzaGFyZUxpbWl0BQNuaWwFA25pbAFpAQhleGNoYW5nZQQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQGY2FsbGVyCQEHQWRkcmVzcwEFC2NhbGxlckJ5dGVzBA0kdDAxNDk5MzE1MDY5CQCUCgIJAJEDAgUIcEFtb3VudHMAAAkBEXBhcnNlUGF5bWVudEFzc2V0AQkAkQMCBQlwQXNzZXRJZHMAAAQJcG10QW1vdW50CAUNJHQwMTQ5OTMxNTA2OQJfMQQKcG10QXNzZXRJZAgFDSR0MDE0OTkzMTUwNjkCXzIEEm1pbkFtb3VudFRvUmVjZWl2ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAAQNJHQwMTUxNDIxNTIxOAkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMTUxNDIxNTIxOAJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAxNTE0MjE1MjE4Al8yBAhhc3NldElkQQgFDSR0MDE1MTQyMTUyMTgCXzMECGFzc2V0SWRCCAUNJHQwMTUxNDIxNTIxOAJfNAQNJHQwMTUyMzExNTMzNwkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDE1MjMxMTUzMzcCXzEECGJhbGFuY2VCCAUNJHQwMTUyMzExNTMzNwJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMTUyMzExNTMzNwJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMTUyMzExNTMzNwJfNAMDCQAAAgUIYmFsYW5jZUEAAAYJAAACBQhiYWxhbmNlQgAACQACAQIgQ2FuJ3QgZXhjaGFuZ2Ugd2l0aCB6ZXJvIGJhbGFuY2UDCQBnAgAABRJtaW5BbW91bnRUb1JlY2VpdmUJAAIBCQCsAgICNE1pbmltYWwgYW1vdW50IHRvIHJlY2VpdmUgbXVzdCBiZSBwb3NpdGl2ZS4gQWN0dWFsOiAJAKQDAQUSbWluQW1vdW50VG9SZWNlaXZlAwkBAiE9AgkAkAMBBQhwQW1vdW50cwABCQACAQIdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFCGFzc2V0SWRBCQDMCAIFCGFzc2V0SWRCBQNuaWwFCnBtdEFzc2V0SWQJAAIBCQCsAgIJAKwCAgkArAICAiRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAFC3N0ckFzc2V0SWRBAgQgb3IgBQtzdHJBc3NldElkQgMDCQBmAgUIYmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQQYJAGYCBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VCCQCUCgIFA25pbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJcG10QW1vdW50BQpwbXRBc3NldElkBQNuaWwJARFzdXNwZW5kU3VzcGljaW91cwYFD2FjY291bnRCYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VCBQhiYWxhbmNlQQUIYmFsYW5jZUIFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgQNJHQwMTYyMjIxNjI4MAkBDGdldEZlZVBhcmFtcwIIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBANmZWUIBQ0kdDAxNjIyMjE2MjgwAl8xBAZnb3ZGZWUIBQ0kdDAxNjIyMjE2MjgwAl8yBA0kdDAxNjI5NzE2NjM0AwkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQENY2FsY3VsYXRlRmVlcwYFCXBtdEFtb3VudAUSbWluQW1vdW50VG9SZWNlaXZlBQhiYWxhbmNlQQUIYmFsYW5jZUIFA2ZlZQUGZ292RmVlCQENY2FsY3VsYXRlRmVlcwYFCXBtdEFtb3VudAUSbWluQW1vdW50VG9SZWNlaXZlBQhiYWxhbmNlQgUIYmFsYW5jZUEFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMTYyOTcxNjYzNAJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDE2Mjk3MTY2MzQCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAxNjI5NzE2NjM0Al8zBA0kdDAxNjY1MjE2OTc3AwkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQCVCgMJAGQCBQhiYWxhbmNlQQUJcG10QW1vdW50CQBlAgkAZQIFCGJhbGFuY2VCBQ1hbW91bnRXaXRoRmVlBRBnb3Zlcm5hbmNlUmV3YXJkBQhhc3NldElkQgkAlQoDCQBlAgkAZQIFCGJhbGFuY2VBBQ1hbW91bnRXaXRoRmVlBRBnb3Zlcm5hbmNlUmV3YXJkCQBkAgUIYmFsYW5jZUIFCXBtdEFtb3VudAUIYXNzZXRJZEEEC25ld0JhbGFuY2VBCAUNJHQwMTY2NTIxNjk3NwJfMQQLbmV3QmFsYW5jZUIIBQ0kdDAxNjY1MjE2OTc3Al8yBAthc3NldElkU2VuZAgFDSR0MDE2NjUyMTY5NzcCXzMEDSR0MDE2OTk1MTcyNDUDCQAAAgUKcG10QXNzZXRJZAUIYXNzZXRJZEEJAJQKAgUJcG10QW1vdW50CQBkAgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAkAlAoCCQBkAgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAUJcG10QW1vdW50BAxzdGFrZUFtb3VudEEIBQ0kdDAxNjk5NTE3MjQ1Al8xBAxzdGFrZUFtb3VudEIIBQ0kdDAxNjk5NTE3MjQ1Al8yBAZzdGFrZTEDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQQkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCCQAAAgUKcG10QXNzZXRJZAUIYXNzZXRJZEEJAMwIAgUMc3Rha2VBbW91bnRBCQDMCAIFC3N0ckFzc2V0SWRBBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMQUGc3Rha2UxBAZzdGFrZTIDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQgkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCCQAAAgUKcG10QXNzZXRJZAUIYXNzZXRJZEIJAMwIAgUMc3Rha2VBbW91bnRCCQDMCAIFC3N0ckFzc2V0SWRCBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMgUGc3Rha2UyCQCUCgIFA25pbAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEFC25ld0JhbGFuY2VBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIFC25ld0JhbGFuY2VCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUNYW1vdW50V2l0aEZlZQULYXNzZXRJZFNlbmQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBRBnb3Zlcm5hbmNlUmV3YXJkBQthc3NldElkU2VuZAUDbmlsCQDMCAIFDWFtb3VudFdpdGhGZWUJAMwIAgULYXNzZXRJZFNlbmQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zBAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEC3BtdEFzc2V0SWRBCQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAABAtwbXRBc3NldElkQgkBEXBhcnNlUGF5bWVudEFzc2V0AQkAkQMCBQlwQXNzZXRJZHMAAQQMc3Rha2VGYXJtaW5nCQAAAgkAkQMCBQRhcmdzAAACBHRydWUECGxvY2tUeXBlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwABBA0kdDAxODUwODE4NTk4CQENZ2V0UG9vbEFzc2V0cwEIBQFpBmNhbGxlcgQLc3RyQXNzZXRJZEEIBQ0kdDAxODUwODE4NTk4Al8xBAtzdHJBc3NldElkQggFDSR0MDE4NTA4MTg1OTgCXzIECGFzc2V0SWRBCAUNJHQwMTg1MDgxODU5OAJfMwQIYXNzZXRJZEIIBQ0kdDAxODUwODE4NTk4Al80BAxzaGFyZUFzc2V0SWQIBQ0kdDAxODUwODE4NTk4Al81BA0kdDAxODYxMTE4NzM1CQEPZ2V0UG9vbEJhbGFuY2VzAwgFAWkGY2FsbGVyBQhhc3NldElkQQUIYXNzZXRJZEIECGJhbGFuY2VBCAUNJHQwMTg2MTExODczNQJfMQQIYmFsYW5jZUIIBQ0kdDAxODYxMTE4NzM1Al8yBA9hY2NvdW50QmFsYW5jZUEIBQ0kdDAxODYxMTE4NzM1Al8zBA9hY2NvdW50QmFsYW5jZUIIBQ0kdDAxODYxMTE4NzM1Al80BBBzaGFyZUFzc2V0U3VwcGx5CAUNJHQwMTg2MTExODczNQJfNQMDCQECIT0CCQCQAwEFCHBBbW91bnRzAAIJAQIhPQIJAJADAQUIcEFtb3VudHMAAwcJAAIBAh5Ud28gb3IgdGhyZWUgcGF5bWVudHMgZXhwZWN0ZWQDAwkBAiE9AgULcG10QXNzZXRJZEEFCGFzc2V0SWRBBgkBAiE9AgULcG10QXNzZXRJZEIFCGFzc2V0SWRCCQACAQkArAICCQCsAgIJAKwCAgIlSW5jb3JyZWN0IGFzc2V0cyBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAULc3RyQXNzZXRJZEECBSBhbmQgBQtzdHJBc3NldElkQgMDCQBmAgUIYmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQQYJAGYCBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VCCQCUCgIFA25pbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAkQMCBQhwQW1vdW50cwAABQtwbXRBc3NldElkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIJAJEDAgUIcEFtb3VudHMAAQULcG10QXNzZXRJZEIFA25pbAkBEXN1c3BlbmRTdXNwaWNpb3VzBgUPYWNjb3VudEJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VBBQhiYWxhbmNlQgULc3RyQXNzZXRJZEEFC3N0ckFzc2V0SWRCBA0kdDAxOTQzMzE5NTEwCQEMZ2V0QXNzZXRJbmZvAQULcG10QXNzZXRJZEEEDnBtdFN0ckFzc2V0SWRBCAUNJHQwMTk0MzMxOTUxMAJfMQQNcG10QXNzZXROYW1lQQgFDSR0MDE5NDMzMTk1MTACXzIEDHBtdERlY2ltYWxzQQgFDSR0MDE5NDMzMTk1MTACXzMEDSR0MDE5NTI3MTk2MDQJAQxnZXRBc3NldEluZm8BBQtwbXRBc3NldElkQgQOcG10U3RyQXNzZXRJZEIIBQ0kdDAxOTUyNzE5NjA0Al8xBA1wbXRBc3NldE5hbWVCCAUNJHQwMTk1MjcxOTYwNAJfMgQMcG10RGVjaW1hbHNCCAUNJHQwMTk1MjcxOTYwNAJfMwQHaW5pdGlhbAkAAAIJAGQCBQhiYWxhbmNlQQUIYmFsYW5jZUIAAAQNJHQwMTk2NzkyMDUyMgMFB2luaXRpYWwJAJcKBQkAkQMCBQhwQW1vdW50cwAACQCRAwIFCHBBbW91bnRzAAEAAAULcG10QXNzZXRJZEEAAQQTcmF0aW9TaGFyZVRva2Vuc0luQQkAawMFBnNjYWxlOAkAkQMCBQhwQW1vdW50cwAABQhiYWxhbmNlQQQTcmF0aW9TaGFyZVRva2Vuc0luQgkAawMFBnNjYWxlOAkAkQMCBQhwQW1vdW50cwABBQhiYWxhbmNlQgMJAGYCBRNyYXRpb1NoYXJlVG9rZW5zSW5CBRNyYXRpb1NoYXJlVG9rZW5zSW5BBANwbXQJAGsDCQCRAwIFCHBBbW91bnRzAAAFCGJhbGFuY2VCBQhiYWxhbmNlQQkAlwoFCQCRAwIFCHBBbW91bnRzAAAFA3BtdAkAZQIJAJEDAgUIcEFtb3VudHMAAQUDcG10BQtwbXRBc3NldElkQgUTcmF0aW9TaGFyZVRva2Vuc0luQQQDcG10CQBrAwkAkQMCBQhwQW1vdW50cwABBQhiYWxhbmNlQQUIYmFsYW5jZUIJAJcKBQUDcG10CQCRAwIFCHBBbW91bnRzAAEJAGUCCQCRAwIFCHBBbW91bnRzAAAFA3BtdAULcG10QXNzZXRJZEEFE3JhdGlvU2hhcmVUb2tlbnNJbkIECnBtdEFtb3VudEEIBQ0kdDAxOTY3OTIwNTIyAl8xBApwbXRBbW91bnRCCAUNJHQwMTk2NzkyMDUyMgJfMgQGY2hhbmdlCAUNJHQwMTk2NzkyMDUyMgJfMwQNY2hhbmdlQXNzZXRJZAgFDSR0MDE5Njc5MjA1MjICXzQED3NoYXJlVG9rZW5SYXRpbwgFDSR0MDE5Njc5MjA1MjICXzUEFXNoYXJlVG9rZW5Ub1BheUFtb3VudAMFB2luaXRpYWwEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgkAawMJAGwGBQpwbXRBbW91bnRBBQxwbXREZWNpbWFsc0EABQABBQxwbXREZWNpbWFsc0EFBERPV04JAGwGBQpwbXRBbW91bnRCBQxwbXREZWNpbWFsc0IABQABBQxwbXREZWNpbWFsc0IFBERPV04JAGwGAAoAAAUNc2hhcmVEZWNpbWFscwAAAAAFBERPV04JAGsDBQ9zaGFyZVRva2VuUmF0aW8FEHNoYXJlQXNzZXRTdXBwbHkFBnNjYWxlOAMJAAACBRVzaGFyZVRva2VuVG9QYXlBbW91bnQAAAkAAgECHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkAZgIAAAUGY2hhbmdlCQACAQIKQ2hhbmdlIDwgMAQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QQkAzAgCBQ5wbXRTdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QgkAzAgCBQ5wbXRTdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgQMc2hhcmVUb2tlblNUAwUMc3Rha2VGYXJtaW5nBApzdFBheW1lbnRzCQDOCAIJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAUVc2hhcmVUb2tlblRvUGF5QW1vdW50BQNuaWwDCQAAAgkAkAMBBQhwQW1vdW50cwADCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQCRAwIFCXBBc3NldElkcwACCQCRAwIFCHBBbW91bnRzAAIFA25pbAUDbmlsBAdyZWlzc3VlCQD8BwQIBQFpBmNhbGxlcgIRcmVpc3N1ZVNoYXJlVG9rZW4JAMwIAgUVc2hhcmVUb2tlblRvUGF5QW1vdW50BQNuaWwFA25pbAMJAAACBQdyZWlzc3VlBQdyZWlzc3VlBAZzdGFrZTMJAPwHBAUOZmFybWluZ0FkZHJlc3MCD2xvY2tTaGFyZVRva2VucwkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCBQhsb2NrVHlwZQUDbmlsBQpzdFBheW1lbnRzAwkAAAIFBnN0YWtlMwUGc3Rha2UzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFDHNoYXJlQXNzZXRJZAUDbmlsCQCUCgIFA25pbAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQQkAZAIFCGJhbGFuY2VBBQpwbXRBbW91bnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIJAGQCBQhiYWxhbmNlQgUKcG10QW1vdW50QgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBRBzaGFyZUFzc2V0U3VwcGx5BRVzaGFyZVRva2VuVG9QYXlBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQZjaGFuZ2UFDWNoYW5nZUFzc2V0SWQFA25pbAUMc2hhcmVUb2tlblNUBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVcmVwbGVuaXNoV2l0aE9uZVRva2VuBAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMECnBtdEFzc2V0SWQJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAAECXBtdEFtb3VudAkAkQMCBQhwQW1vdW50cwAABBB2aXJ0R2V0TWluQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwAABAxzdGFrZUZhcm1pbmcJAAACCQCRAwIFBGFyZ3MAAQIEdHJ1ZQQIbG9ja1R5cGUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRhcmdzAAEEDSR0MDIzMzYzMjM0NTMJAQ1nZXRQb29sQXNzZXRzAQgFAWkGY2FsbGVyBAtzdHJBc3NldElkQQgFDSR0MDIzMzYzMjM0NTMCXzEEC3N0ckFzc2V0SWRCCAUNJHQwMjMzNjMyMzQ1MwJfMgQIYXNzZXRJZEEIBQ0kdDAyMzM2MzIzNDUzAl8zBAhhc3NldElkQggFDSR0MDIzMzYzMjM0NTMCXzQEDHNoYXJlQXNzZXRJZAgFDSR0MDIzMzYzMjM0NTMCXzUEDSR0MDIzNDY2MjM1OTAJAQ9nZXRQb29sQmFsYW5jZXMDCAUBaQZjYWxsZXIFCGFzc2V0SWRBBQhhc3NldElkQgQIYmFsYW5jZUEIBQ0kdDAyMzQ2NjIzNTkwAl8xBAhiYWxhbmNlQggFDSR0MDIzNDY2MjM1OTACXzIED2FjY291bnRCYWxhbmNlQQgFDSR0MDIzNDY2MjM1OTACXzMED2FjY291bnRCYWxhbmNlQggFDSR0MDIzNDY2MjM1OTACXzQEEHNoYXJlQXNzZXRTdXBwbHkIBQ0kdDAyMzQ2NjIzNTkwAl81BAdpbml0aWFsCQAAAgkAZAIFCGJhbGFuY2VBBQhiYWxhbmNlQgAAAwMJAQIhPQIJAJADAQUIcEFtb3VudHMAAQkBAiE9AgkAkAMBBQhwQW1vdW50cwACBwkAAgECI1R3byBvciBvbmUgYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAQIhPQIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQECIT0CBQpwbXRBc3NldElkBQhhc3NldElkQgcJAAIBCQCsAgIJAKwCAgkArAICAiRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAFC3N0ckFzc2V0SWRBAgQgb3IgBQtzdHJBc3NldElkQgMFB2luaXRpYWwJAAIBAjBGb3IgaW5pdGlhbCBleGNoYW5nZXIgeW91IG5lZWQgdG8gdXNlIHR3byB0b2tlbnMDAwkAZgIFCGJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUEGCQBmAgUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQgkAlAoCBQNuaWwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXBtdEFtb3VudAUKcG10QXNzZXRJZAUDbmlsCQERc3VzcGVuZFN1c3BpY2lvdXMGBQ9hY2NvdW50QmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQgUIYmFsYW5jZUEFCGJhbGFuY2VCBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEDSR0MDI0Mzc1MjQ0MzMJAQxnZXRGZWVQYXJhbXMCCAUBaQZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQDZmVlCAUNJHQwMjQzNzUyNDQzMwJfMQQGZ292RmVlCAUNJHQwMjQzNzUyNDQzMwJfMgQNJHQwMjQ0NTAyNjMzNgMJAAACBQpwbXRBc3NldElkBQhhc3NldElkQQQNdmlydFBheUFtb3VudAkBEGNhbGN1bGF0ZVZpcnRHZXQDBQlwbXRBbW91bnQFCGJhbGFuY2VBBQNmZWUEDSR0MDI0NzI5MjQ4NjYJAQ1jYWxjdWxhdGVGZWVzBgUNdmlydFBheUFtb3VudAUQdmlydEdldE1pbkFtb3VudAUIYmFsYW5jZUEFCGJhbGFuY2VCBQNmZWUFBmdvdkZlZQQQYW1vdW50V2l0aG91dEZlZQgFDSR0MDI0NzI5MjQ4NjYCXzEEDWFtb3VudFdpdGhGZWUIBQ0kdDAyNDcyOTI0ODY2Al8yBBBnb3Zlcm5hbmNlUmV3YXJkCAUNJHQwMjQ3MjkyNDg2NgJfMwQLbmV3QmFsYW5jZUEJAGQCBQhiYWxhbmNlQQUJcG10QW1vdW50BAtuZXdCYWxhbmNlQgkAZQIFCGJhbGFuY2VCBRBnb3Zlcm5hbmNlUmV3YXJkBBNyYXRpb1NoYXJlVG9rZW5zSW5BCQBrAwkAZQIFCXBtdEFtb3VudAUNdmlydFBheUFtb3VudAUGc2NhbGU4BQtuZXdCYWxhbmNlQQQTcmF0aW9TaGFyZVRva2Vuc0luQgkAawMFDWFtb3VudFdpdGhGZWUFBnNjYWxlOAULbmV3QmFsYW5jZUIEFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAawMJAJcDAQkAzAgCBRNyYXRpb1NoYXJlVG9rZW5zSW5BCQDMCAIFE3JhdGlvU2hhcmVUb2tlbnNJbkIFA25pbAUQc2hhcmVBc3NldFN1cHBseQUGc2NhbGU4CQCZCgcFC25ld0JhbGFuY2VBBQtuZXdCYWxhbmNlQgUVc2hhcmVUb2tlblRvUGF5QW1vdW50BRBnb3Zlcm5hbmNlUmV3YXJkBQhhc3NldElkQgULc3RyQXNzZXRJZEIFC3N0ckFzc2V0SWRBBA12aXJ0UGF5QW1vdW50CQEQY2FsY3VsYXRlVmlydEdldAMFCXBtdEFtb3VudAUIYmFsYW5jZUIFA2ZlZQQNJHQwMjU2MDEyNTczOAkBDWNhbGN1bGF0ZUZlZXMGBQ12aXJ0UGF5QW1vdW50BRB2aXJ0R2V0TWluQW1vdW50BQhiYWxhbmNlQgUIYmFsYW5jZUEFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMjU2MDEyNTczOAJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDI1NjAxMjU3MzgCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAyNTYwMTI1NzM4Al8zBAtuZXdCYWxhbmNlQQkAZQIFCGJhbGFuY2VBBRBnb3Zlcm5hbmNlUmV3YXJkBAtuZXdCYWxhbmNlQgkAZAIFCGJhbGFuY2VCBQlwbXRBbW91bnQEE3JhdGlvU2hhcmVUb2tlbnNJbkEJAGsDBQ1hbW91bnRXaXRoRmVlBQZzY2FsZTgFC25ld0JhbGFuY2VBBBNyYXRpb1NoYXJlVG9rZW5zSW5CCQBrAwkAZQIFCXBtdEFtb3VudAUNdmlydFBheUFtb3VudAUGc2NhbGU4BQtuZXdCYWxhbmNlQgQVc2hhcmVUb2tlblRvUGF5QW1vdW50CQBrAwkAlwMBCQDMCAIFE3JhdGlvU2hhcmVUb2tlbnNJbkEJAMwIAgUTcmF0aW9TaGFyZVRva2Vuc0luQgUDbmlsBRBzaGFyZUFzc2V0U3VwcGx5BQZzY2FsZTgJAJkKBwULbmV3QmFsYW5jZUEFC25ld0JhbGFuY2VCBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFEGdvdmVybmFuY2VSZXdhcmQFCGFzc2V0SWRBBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEC25ld0JhbGFuY2VBCAUNJHQwMjQ0NTAyNjMzNgJfMQQLbmV3QmFsYW5jZUIIBQ0kdDAyNDQ1MDI2MzM2Al8yBBVzaGFyZVRva2VuVG9QYXlBbW91bnQIBQ0kdDAyNDQ1MDI2MzM2Al8zBAlnb3ZSZXdhcmQIBQ0kdDAyNDQ1MDI2MzM2Al80BA5nb3ZSZXdhcmRBc3NldAgFDSR0MDI0NDUwMjYzMzYCXzUEEWdvdlJld2FyZEFzc2V0U3RyCAUNJHQwMjQ0NTAyNjMzNgJfNgQNcG10QXNzZXRJZFN0cggFDSR0MDI0NDUwMjYzMzYCXzcDCQAAAgUVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAJAAIBAh1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUNcG10QXNzZXRJZFN0cgkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQlwbXRBbW91bnQJAMwIAgUNcG10QXNzZXRJZFN0cgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwURZ292UmV3YXJkQXNzZXRTdHIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgUJZ292UmV3YXJkCQDMCAIFEWdvdlJld2FyZEFzc2V0U3RyBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMgUGc3Rha2UyBAxzaGFyZVRva2VuU1QDBQxzdGFrZUZhcm1pbmcECnN0UGF5bWVudHMJAM4IAgkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFA25pbAMJAAACCQCQAwEFCHBBbW91bnRzAAIJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAJEDAgUJcEFzc2V0SWRzAAEJAJEDAgUIcEFtb3VudHMAAQUDbmlsBQNuaWwEB3JlaXNzdWUJAPwHBAgFAWkGY2FsbGVyAhFyZWlzc3VlU2hhcmVUb2tlbgkAzAgCBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFA25pbAUDbmlsAwkAAAIFB3JlaXNzdWUFB3JlaXNzdWUEBnN0YWtlMwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIPbG9ja1NoYXJlVG9rZW5zCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFCGxvY2tUeXBlBQNuaWwFCnN0UGF5bWVudHMDCQAAAgUGc3Rha2UzBQZzdGFrZTMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUMc2hhcmVBc3NldElkBQNuaWwJAJQKAgUDbmlsCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBBQtuZXdCYWxhbmNlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQtuZXdCYWxhbmNlQgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBRBzaGFyZUFzc2V0U3VwcGx5BRVzaGFyZVRva2VuVG9QYXlBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQlnb3ZSZXdhcmQFDmdvdlJld2FyZEFzc2V0BQNuaWwFDHNoYXJlVG9rZW5TVAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3BAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDSR0MDI4MzgzMjg0NzMJAQ1nZXRQb29sQXNzZXRzAQgFAWkGY2FsbGVyBAtzdHJBc3NldElkQQgFDSR0MDI4MzgzMjg0NzMCXzEEC3N0ckFzc2V0SWRCCAUNJHQwMjgzODMyODQ3MwJfMgQIYXNzZXRJZEEIBQ0kdDAyODM4MzI4NDczAl8zBAhhc3NldElkQggFDSR0MDI4MzgzMjg0NzMCXzQEDHNoYXJlQXNzZXRJZAgFDSR0MDI4MzgzMjg0NzMCXzUEDSR0MDI4NDg2Mjg2MTAJAQ9nZXRQb29sQmFsYW5jZXMDCAUBaQZjYWxsZXIFCGFzc2V0SWRBBQhhc3NldElkQgQIYmFsYW5jZUEIBQ0kdDAyODQ4NjI4NjEwAl8xBAhiYWxhbmNlQggFDSR0MDI4NDg2Mjg2MTACXzIED2FjY291bnRCYWxhbmNlQQgFDSR0MDI4NDg2Mjg2MTACXzMED2FjY291bnRCYWxhbmNlQggFDSR0MDI4NDg2Mjg2MTACXzQEEHNoYXJlQXNzZXRTdXBwbHkIBQ0kdDAyODQ4NjI4NjEwAl81BA0kdDAyODYyMzI5MDMxAwkAAAIJAJADAQUIcEFtb3VudHMAAQQGcEFzc2V0CQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAAAwkBAiE9AgUGcEFzc2V0BQxzaGFyZUFzc2V0SWQJAAIBCQCsAgICJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkA2AQBBQxzaGFyZUFzc2V0SWQJAJQKAgkAkQMCBQhwQW1vdW50cwAABQZwQXNzZXQJAJQKAgAABQxzaGFyZUFzc2V0SWQECXBtdEFtb3VudAgFDSR0MDI4NjIzMjkwMzECXzEECnBtdEFzc2V0SWQIBQ0kdDAyODYyMzI5MDMxAl8yAwkAZgIJAJADAQUIcEFtb3VudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwMJAGYCBQhiYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VBBgkAZgIFCGJhbGFuY2VCBQ9hY2NvdW50QmFsYW5jZUIJAJQKAgUDbmlsCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQlwbXRBbW91bnQFCnBtdEFzc2V0SWQFA25pbAkBEXN1c3BlbmRTdXNwaWNpb3VzBgUPYWNjb3VudEJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VBBQhiYWxhbmNlQgULc3RyQXNzZXRJZEEFC3N0ckFzc2V0SWRCBAx1bmxvY2tBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkBC3ZhbHVlT3JFbHNlAgkAkQMCBQRhcmdzAAACATAEBnVubG9jawMJAGYCBQx1bmxvY2tBbW91bnQAAAkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAAADCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEDGFtb3VudFRvUGF5QQkAawMFDndpdGhkcmF3QW1vdW50BQhiYWxhbmNlQQUQc2hhcmVBc3NldFN1cHBseQQMYW1vdW50VG9QYXlCCQBrAwUOd2l0aGRyYXdBbW91bnQFCGJhbGFuY2VCBRBzaGFyZUFzc2V0U3VwcGx5BAZzdGFrZTEDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQQkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBwkAzAgCBQxhbW91bnRUb1BheUEJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMJAQhjb250YWlucwIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRCCQD8BwQIBQFpBmNhbGxlcgIMc3Rha2VVbnN0YWtlCQDMCAIHCQDMCAIFDGFtb3VudFRvUGF5QgkAzAgCBQtzdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMdW5sb2NrQW1vdW50BQxzaGFyZUFzc2V0SWQFA25pbAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEJAGUCBQhiYWxhbmNlQQUMYW1vdW50VG9QYXlBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIJAGUCBQhiYWxhbmNlQgUMYW1vdW50VG9QYXlCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFEHNoYXJlQXNzZXRTdXBwbHkFDndpdGhkcmF3QW1vdW50CQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFDGFtb3VudFRvUGF5QQUIYXNzZXRJZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQxhbW91bnRUb1BheUIFCGFzc2V0SWRCBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARB3aXRoZHJhd09uZVRva2VuBAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDXdpdGhkcmF3QXNzZXQDCQAAAgkAkQMCBQRhcmdzAAACAAUEdW5pdAkA2QQBCQCRAwIFBGFyZ3MAAAQNJHQwMzEyMzkzMTMyOQkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMzEyMzkzMTMyOQJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAzMTIzOTMxMzI5Al8yBAhhc3NldElkQQgFDSR0MDMxMjM5MzEzMjkCXzMECGFzc2V0SWRCCAUNJHQwMzEyMzkzMTMyOQJfNAQMc2hhcmVBc3NldElkCAUNJHQwMzEyMzkzMTMyOQJfNQQNJHQwMzEzNDIzMTQ2NgkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDMxMzQyMzE0NjYCXzEECGJhbGFuY2VCCAUNJHQwMzEzNDIzMTQ2NgJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMzEzNDIzMTQ2NgJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMzEzNDIzMTQ2NgJfNAQQc2hhcmVBc3NldFN1cHBseQgFDSR0MDMxMzQyMzE0NjYCXzUEDSR0MDMxNDc5MzE4NTkDCQAAAgkAkAMBBQhwQW1vdW50cwABBAZwQXNzZXQJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAADCQECIT0CBQZwQXNzZXQFDHNoYXJlQXNzZXRJZAkAAgEJAKwCAgIkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogCQDYBAEFDHNoYXJlQXNzZXRJZAkAlAoCCQCRAwIFCHBBbW91bnRzAAAFBnBBc3NldAkAlAoCAAAFDHNoYXJlQXNzZXRJZAQJcG10QW1vdW50CAUNJHQwMzE0NzkzMTg1OQJfMQQKcG10QXNzZXRJZAgFDSR0MDMxNDc5MzE4NTkCXzIED3ZpcnRNaW5Ub1JlY2l2ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAQMJAQIhPQIJAJADAQUIcEFtb3VudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAiE9AgUKcG10QXNzZXRJZAUMc2hhcmVBc3NldElkCQACAQkArAICAiRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJANgEAQUMc2hhcmVBc3NldElkAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhc3NldElkQQkAzAgCBQhhc3NldElkQgUDbmlsBQ13aXRoZHJhd0Fzc2V0CQACAQIZSW5jb3JyZWN0IHdpdGhkcmF3IGFzc2V0LgMDCQBmAgUIYmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQQYJAGYCBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VCCQCUCgIFA25pbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJcG10QW1vdW50BQpwbXRBc3NldElkBQNuaWwJARFzdXNwZW5kU3VzcGljaW91cwYFD2FjY291bnRCYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VCBQhiYWxhbmNlQQUIYmFsYW5jZUIFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgQMdW5sb2NrQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAQt2YWx1ZU9yRWxzZQIJAJEDAgUEYXJncwACAgEwBAZ1bmxvY2sDCQBmAgUMdW5sb2NrQW1vdW50AAAJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAAAAwkAAAIFBnVubG9jawUGdW5sb2NrBA53aXRoZHJhd0Ftb3VudAkAZAIFCXBtdEFtb3VudAUMdW5sb2NrQW1vdW50BAxhbW91bnRUb1BheUEJAGsDBQ53aXRoZHJhd0Ftb3VudAUIYmFsYW5jZUEFEHNoYXJlQXNzZXRTdXBwbHkEDGFtb3VudFRvUGF5QgkAawMFDndpdGhkcmF3QW1vdW50BQhiYWxhbmNlQgUQc2hhcmVBc3NldFN1cHBseQQNJHQwMzMxMDQzMzE2MgkBDGdldEZlZVBhcmFtcwIIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBANmZWUIBQ0kdDAzMzEwNDMzMTYyAl8xBAZnb3ZGZWUIBQ0kdDAzMzEwNDMzMTYyAl8yBA0kdDAzMzE3OTMzNTE5AwkAAAIFDXdpdGhkcmF3QXNzZXQFCGFzc2V0SWRBCQENY2FsY3VsYXRlRmVlcwYFDGFtb3VudFRvUGF5QgUPdmlydE1pblRvUmVjaXZlBQhiYWxhbmNlQgUIYmFsYW5jZUEFA2ZlZQUGZ292RmVlCQENY2FsY3VsYXRlRmVlcwYFDGFtb3VudFRvUGF5QQUPdmlydE1pblRvUmVjaXZlBQhiYWxhbmNlQQUIYmFsYW5jZUIFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMzMxNzkzMzUxOQJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDMzMTc5MzM1MTkCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAzMzE3OTMzNTE5Al8zBA0kdDAzMzUzNjM0ODgyAwkAAAIFDXdpdGhkcmF3QXNzZXQFCGFzc2V0SWRBBAd1bnN0YWtlAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgkAZAIJAGQCBQxhbW91bnRUb1BheUEFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAlgoECQBlAgkAZQIJAGUCBQhiYWxhbmNlQQUMYW1vdW50VG9QYXlBBQ1hbW91bnRXaXRoRmVlBRBnb3Zlcm5hbmNlUmV3YXJkBQhiYWxhbmNlQgUIYXNzZXRJZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBkAgUMYW1vdW50VG9QYXlBBQ1hbW91bnRXaXRoRmVlBQhhc3NldElkQQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAd1bnN0YWtlAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgkAZAIJAGQCBQxhbW91bnRUb1BheUIFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAlgoEBQhiYWxhbmNlQQkAZQIJAGUCCQBlAgUIYmFsYW5jZUIFDGFtb3VudFRvUGF5QgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAUIYXNzZXRJZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBkAgUMYW1vdW50VG9QYXlCBQ1hbW91bnRXaXRoRmVlBQhhc3NldElkQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAtuZXdCYWxhbmNlQQgFDSR0MDMzNTM2MzQ4ODICXzEEC25ld0JhbGFuY2VCCAUNJHQwMzM1MzYzNDg4MgJfMgQQZ292UmV3YXJkQXNzZXRJZAgFDSR0MDMzNTM2MzQ4ODICXzMEDHVzZXJUcmFuc2ZlcggFDSR0MDMzNTM2MzQ4ODICXzQJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDHVubG9ja0Ftb3VudAUMc2hhcmVBc3NldElkBQNuaWwJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEFC25ld0JhbGFuY2VBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIFC25ld0JhbGFuY2VCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFEHNoYXJlQXNzZXRTdXBwbHkFDndpdGhkcmF3QW1vdW50CQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFEGdvdmVybmFuY2VSZXdhcmQFEGdvdlJld2FyZEFzc2V0SWQFA25pbAUMdXNlclRyYW5zZmVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNJHQwMzU2MDczNTY4MwkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMzU2MDczNTY4MwJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAzNTYwNzM1NjgzAl8yBAhhc3NldElkQQgFDSR0MDM1NjA3MzU2ODMCXzMECGFzc2V0SWRCCAUNJHQwMzU2MDczNTY4MwJfNAQNJHQwMzU2OTYzNTgwMgkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDM1Njk2MzU4MDICXzEECGJhbGFuY2VCCAUNJHQwMzU2OTYzNTgwMgJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMzU2OTYzNTgwMgJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMzU2OTYzNTgwMgJfNAQNYW1vdW50RW5yb2xsQQkAZQIFD2FjY291bnRCYWxhbmNlQQUIYmFsYW5jZUEEDWFtb3VudEVucm9sbEIJAGUCBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VCAwkBAiE9AgUPbW9uZXlCb3hBZGRyZXNzCAUBaQxvcmlnaW5DYWxsZXIJAAIBAiZPbmx5IHRoZSB3YWxsZXQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMDCQBmAgAABQ1hbW91bnRFbnJvbGxBBgkAZgIAAAUNYW1vdW50RW5yb2xsQgkBB3N1c3BlbmQBAhZFbnJvbGwgYW1vdW50IG5lZ2F0aXZlAwMJAAACBQ1hbW91bnRFbnJvbGxBAAAJAAACBQ1hbW91bnRFbnJvbGxCAAAHCQACAQIQTm8gbW9uZXkgdG8gdGFrZQQGc3Rha2UxAwMJAQhjb250YWlucwIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRBCQBmAgUNYW1vdW50RW5yb2xsQQAABwkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQ1hbW91bnRFbnJvbGxBCQDMCAIFC3N0ckFzc2V0SWRBBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMQUGc3Rha2UxBAZzdGFrZTIDAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEIJAGYCBQ1hbW91bnRFbnJvbGxCAAAHCQD8BwQIBQFpBmNhbGxlcgIMc3Rha2VVbnN0YWtlCQDMCAIGCQDMCAIFDWFtb3VudEVucm9sbEIJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UyBQZzdGFrZTIJAJQKAgUDbmlsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQQkAZAIFCGJhbGFuY2VBBQ1hbW91bnRFbnJvbGxBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIJAGQCBQhiYWxhbmNlQgUNYW1vdW50RW5yb2xsQgUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIFE211bHRpU2lnbmVkQnlBZG1pbnPNrmZr", "height": 2286532, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 42cfU4A69AEbP6BDmYmVnkm3ZCn7oG4RCKzYNZCCyHWW Next: 8PTiB77Uppm7wMEjwmh4aYggY3PSChJZNzWw2wPBNpeP Diff:
OldNewDifferences
482482 let accountBalanceA = $t01861118735._3
483483 let accountBalanceB = $t01861118735._4
484484 let shareAssetSupply = $t01861118735._5
485- if ((size(pAmounts) != 2))
486- then throw("Two attached assets expected")
485+ if (if ((size(pAmounts) != 2))
486+ then (size(pAmounts) != 3)
487+ else false)
488+ then throw("Two or three payments expected")
487489 else if (if ((pmtAssetIdA != assetIdA))
488490 then true
489491 else (pmtAssetIdB != assetIdB))
493495 else (balanceB > accountBalanceB))
494496 then $Tuple2(nil, ([ScriptTransfer(caller, pAmounts[0], pmtAssetIdA), ScriptTransfer(caller, pAmounts[1], pmtAssetIdB)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
495497 else {
496- let $t01940719484 = getAssetInfo(pmtAssetIdA)
497- let pmtStrAssetIdA = $t01940719484._1
498- let pmtAssetNameA = $t01940719484._2
499- let pmtDecimalsA = $t01940719484._3
500- let $t01950119578 = getAssetInfo(pmtAssetIdB)
501- let pmtStrAssetIdB = $t01950119578._1
502- let pmtAssetNameB = $t01950119578._2
503- let pmtDecimalsB = $t01950119578._3
498+ let $t01943319510 = getAssetInfo(pmtAssetIdA)
499+ let pmtStrAssetIdA = $t01943319510._1
500+ let pmtAssetNameA = $t01943319510._2
501+ let pmtDecimalsA = $t01943319510._3
502+ let $t01952719604 = getAssetInfo(pmtAssetIdB)
503+ let pmtStrAssetIdB = $t01952719604._1
504+ let pmtAssetNameB = $t01952719604._2
505+ let pmtDecimalsB = $t01952719604._3
504506 let initial = ((balanceA + balanceB) == 0)
505- let $t01965320496 = if (initial)
507+ let $t01967920522 = if (initial)
506508 then $Tuple5(pAmounts[0], pAmounts[1], 0, pmtAssetIdA, 1)
507509 else {
508510 let ratioShareTokensInA = fraction(scale8, pAmounts[0], balanceA)
517519 $Tuple5(pmt, pAmounts[1], (pAmounts[0] - pmt), pmtAssetIdA, ratioShareTokensInB)
518520 }
519521 }
520- let pmtAmountA = $t01965320496._1
521- let pmtAmountB = $t01965320496._2
522- let change = $t01965320496._3
523- let changeAssetId = $t01965320496._4
524- let shareTokenRatio = $t01965320496._5
522+ let pmtAmountA = $t01967920522._1
523+ let pmtAmountB = $t01967920522._2
524+ let change = $t01967920522._3
525+ let changeAssetId = $t01967920522._4
526+ let shareTokenRatio = $t01967920522._5
525527 let shareTokenToPayAmount = if (initial)
526528 then {
527529 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
545547 then {
546548 let shareTokenST = if (stakeFarming)
547549 then {
550+ let stPayments = ([AttachedPayment(shareAssetId, shareTokenToPayAmount)] ++ (if ((size(pAmounts) == 3))
551+ then [AttachedPayment(pAssetIds[2], pAmounts[2])]
552+ else nil))
548553 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
549554 if ((reissue == reissue))
550555 then {
551- let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], [AttachedPayment(shareAssetId, shareTokenToPayAmount)])
556+ let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], stPayments)
552557 if ((stake3 == stake3))
553558 then nil
554559 else throw("Strict value is not equal to itself.")
575580 let virtGetMinAmount = parseIntValue(args[0])
576581 let stakeFarming = (args[1] == "true")
577582 let lockType = parseIntValue(args[1])
578- let $t02311223202 = getPoolAssets(i.caller)
579- let strAssetIdA = $t02311223202._1
580- let strAssetIdB = $t02311223202._2
581- let assetIdA = $t02311223202._3
582- let assetIdB = $t02311223202._4
583- let shareAssetId = $t02311223202._5
584- let $t02321523339 = getPoolBalances(i.caller, assetIdA, assetIdB)
585- let balanceA = $t02321523339._1
586- let balanceB = $t02321523339._2
587- let accountBalanceA = $t02321523339._3
588- let accountBalanceB = $t02321523339._4
589- let shareAssetSupply = $t02321523339._5
583+ let $t02336323453 = getPoolAssets(i.caller)
584+ let strAssetIdA = $t02336323453._1
585+ let strAssetIdB = $t02336323453._2
586+ let assetIdA = $t02336323453._3
587+ let assetIdB = $t02336323453._4
588+ let shareAssetId = $t02336323453._5
589+ let $t02346623590 = getPoolBalances(i.caller, assetIdA, assetIdB)
590+ let balanceA = $t02346623590._1
591+ let balanceB = $t02346623590._2
592+ let accountBalanceA = $t02346623590._3
593+ let accountBalanceB = $t02346623590._4
594+ let shareAssetSupply = $t02346623590._5
590595 let initial = ((balanceA + balanceB) == 0)
591- if ((size(pAmounts) != 1))
592- then throw("One attached assets expected")
596+ if (if ((size(pAmounts) != 1))
597+ then (size(pAmounts) != 2)
598+ else false)
599+ then throw("Two or one attached assets expected")
593600 else if (if ((pmtAssetId != assetIdA))
594601 then (pmtAssetId != assetIdB)
595602 else false)
601608 else (balanceB > accountBalanceB))
602609 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
603610 else {
604- let $t02409324151 = getFeeParams(i.caller, i.originCaller)
605- let fee = $t02409324151._1
606- let govFee = $t02409324151._2
607- let $t02416826054 = if ((pmtAssetId == assetIdA))
611+ let $t02437524433 = getFeeParams(i.caller, i.originCaller)
612+ let fee = $t02437524433._1
613+ let govFee = $t02437524433._2
614+ let $t02445026336 = if ((pmtAssetId == assetIdA))
608615 then {
609616 let virtPayAmount = calculateVirtGet(pmtAmount, balanceA, fee)
610- let $t02444724584 = calculateFees(virtPayAmount, virtGetMinAmount, balanceA, balanceB, fee, govFee)
611- let amountWithoutFee = $t02444724584._1
612- let amountWithFee = $t02444724584._2
613- let governanceReward = $t02444724584._3
617+ let $t02472924866 = calculateFees(virtPayAmount, virtGetMinAmount, balanceA, balanceB, fee, govFee)
618+ let amountWithoutFee = $t02472924866._1
619+ let amountWithFee = $t02472924866._2
620+ let governanceReward = $t02472924866._3
614621 let newBalanceA = (balanceA + pmtAmount)
615622 let newBalanceB = (balanceB - governanceReward)
616623 let ratioShareTokensInA = fraction((pmtAmount - virtPayAmount), scale8, newBalanceA)
620627 }
621628 else {
622629 let virtPayAmount = calculateVirtGet(pmtAmount, balanceB, fee)
623- let $t02531925456 = calculateFees(virtPayAmount, virtGetMinAmount, balanceB, balanceA, fee, govFee)
624- let amountWithoutFee = $t02531925456._1
625- let amountWithFee = $t02531925456._2
626- let governanceReward = $t02531925456._3
630+ let $t02560125738 = calculateFees(virtPayAmount, virtGetMinAmount, balanceB, balanceA, fee, govFee)
631+ let amountWithoutFee = $t02560125738._1
632+ let amountWithFee = $t02560125738._2
633+ let governanceReward = $t02560125738._3
627634 let newBalanceA = (balanceA - governanceReward)
628635 let newBalanceB = (balanceB + pmtAmount)
629636 let ratioShareTokensInA = fraction(amountWithFee, scale8, newBalanceA)
631638 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
632639 $Tuple7(newBalanceA, newBalanceB, shareTokenToPayAmount, governanceReward, assetIdA, strAssetIdA, strAssetIdB)
633640 }
634- let newBalanceA = $t02416826054._1
635- let newBalanceB = $t02416826054._2
636- let shareTokenToPayAmount = $t02416826054._3
637- let govReward = $t02416826054._4
638- let govRewardAsset = $t02416826054._5
639- let govRewardAssetStr = $t02416826054._6
640- let pmtAssetIdStr = $t02416826054._7
641+ let newBalanceA = $t02445026336._1
642+ let newBalanceB = $t02445026336._2
643+ let shareTokenToPayAmount = $t02445026336._3
644+ let govReward = $t02445026336._4
645+ let govRewardAsset = $t02445026336._5
646+ let govRewardAssetStr = $t02445026336._6
647+ let pmtAssetIdStr = $t02445026336._7
641648 if ((shareTokenToPayAmount == 0))
642649 then throw("Too small amount to replenish")
643650 else {
653660 then {
654661 let shareTokenST = if (stakeFarming)
655662 then {
663+ let stPayments = ([AttachedPayment(shareAssetId, shareTokenToPayAmount)] ++ (if ((size(pAmounts) == 2))
664+ then [AttachedPayment(pAssetIds[1], pAmounts[1])]
665+ else nil))
656666 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
657667 if ((reissue == reissue))
658668 then {
659- let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], [AttachedPayment(shareAssetId, shareTokenToPayAmount)])
669+ let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], stPayments)
660670 if ((stake3 == stake3))
661671 then nil
662672 else throw("Strict value is not equal to itself.")
678688 @Callable(i)
679689 func withdraw (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
680690 let caller = Address(callerBytes)
681- let $t02787627966 = getPoolAssets(i.caller)
682- let strAssetIdA = $t02787627966._1
683- let strAssetIdB = $t02787627966._2
684- let assetIdA = $t02787627966._3
685- let assetIdB = $t02787627966._4
686- let shareAssetId = $t02787627966._5
687- let $t02797928103 = getPoolBalances(i.caller, assetIdA, assetIdB)
688- let balanceA = $t02797928103._1
689- let balanceB = $t02797928103._2
690- let accountBalanceA = $t02797928103._3
691- let accountBalanceB = $t02797928103._4
692- let shareAssetSupply = $t02797928103._5
693- let $t02811628524 = if ((size(pAmounts) == 1))
691+ let $t02838328473 = getPoolAssets(i.caller)
692+ let strAssetIdA = $t02838328473._1
693+ let strAssetIdB = $t02838328473._2
694+ let assetIdA = $t02838328473._3
695+ let assetIdB = $t02838328473._4
696+ let shareAssetId = $t02838328473._5
697+ let $t02848628610 = getPoolBalances(i.caller, assetIdA, assetIdB)
698+ let balanceA = $t02848628610._1
699+ let balanceB = $t02848628610._2
700+ let accountBalanceA = $t02848628610._3
701+ let accountBalanceB = $t02848628610._4
702+ let shareAssetSupply = $t02848628610._5
703+ let $t02862329031 = if ((size(pAmounts) == 1))
694704 then {
695705 let pAsset = parsePaymentAsset(pAssetIds[0])
696706 if ((pAsset != shareAssetId))
698708 else $Tuple2(pAmounts[0], pAsset)
699709 }
700710 else $Tuple2(0, shareAssetId)
701- let pmtAmount = $t02811628524._1
702- let pmtAssetId = $t02811628524._2
711+ let pmtAmount = $t02862329031._1
712+ let pmtAssetId = $t02862329031._2
703713 if ((size(pAmounts) > 1))
704714 then throw("One attached payment expected")
705715 else if (if ((balanceA > accountBalanceA))
742752 let withdrawAsset = if ((args[0] == ""))
743753 then unit
744754 else fromBase58String(args[0])
745- let $t03073230822 = getPoolAssets(i.caller)
746- let strAssetIdA = $t03073230822._1
747- let strAssetIdB = $t03073230822._2
748- let assetIdA = $t03073230822._3
749- let assetIdB = $t03073230822._4
750- let shareAssetId = $t03073230822._5
751- let $t03083530959 = getPoolBalances(i.caller, assetIdA, assetIdB)
752- let balanceA = $t03083530959._1
753- let balanceB = $t03083530959._2
754- let accountBalanceA = $t03083530959._3
755- let accountBalanceB = $t03083530959._4
756- let shareAssetSupply = $t03083530959._5
757- let $t03097231352 = if ((size(pAmounts) == 1))
755+ let $t03123931329 = getPoolAssets(i.caller)
756+ let strAssetIdA = $t03123931329._1
757+ let strAssetIdB = $t03123931329._2
758+ let assetIdA = $t03123931329._3
759+ let assetIdB = $t03123931329._4
760+ let shareAssetId = $t03123931329._5
761+ let $t03134231466 = getPoolBalances(i.caller, assetIdA, assetIdB)
762+ let balanceA = $t03134231466._1
763+ let balanceB = $t03134231466._2
764+ let accountBalanceA = $t03134231466._3
765+ let accountBalanceB = $t03134231466._4
766+ let shareAssetSupply = $t03134231466._5
767+ let $t03147931859 = if ((size(pAmounts) == 1))
758768 then {
759769 let pAsset = parsePaymentAsset(pAssetIds[0])
760770 if ((pAsset != shareAssetId))
762772 else $Tuple2(pAmounts[0], pAsset)
763773 }
764774 else $Tuple2(0, shareAssetId)
765- let pmtAmount = $t03097231352._1
766- let pmtAssetId = $t03097231352._2
775+ let pmtAmount = $t03147931859._1
776+ let pmtAssetId = $t03147931859._2
767777 let virtMinToRecive = parseIntValue(args[1])
768778 if ((size(pAmounts) != 1))
769779 then throw("One attached payment expected")
785795 let withdrawAmount = (pmtAmount + unlockAmount)
786796 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
787797 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
788- let $t03259732655 = getFeeParams(i.caller, i.originCaller)
789- let fee = $t03259732655._1
790- let govFee = $t03259732655._2
791- let $t03267233012 = if ((withdrawAsset == assetIdA))
798+ let $t03310433162 = getFeeParams(i.caller, i.originCaller)
799+ let fee = $t03310433162._1
800+ let govFee = $t03310433162._2
801+ let $t03317933519 = if ((withdrawAsset == assetIdA))
792802 then calculateFees(amountToPayB, virtMinToRecive, balanceB, balanceA, fee, govFee)
793803 else calculateFees(amountToPayA, virtMinToRecive, balanceA, balanceB, fee, govFee)
794- let amountWithoutFee = $t03267233012._1
795- let amountWithFee = $t03267233012._2
796- let governanceReward = $t03267233012._3
797- let $t03302934375 = if ((withdrawAsset == assetIdA))
804+ let amountWithoutFee = $t03317933519._1
805+ let amountWithFee = $t03317933519._2
806+ let governanceReward = $t03317933519._3
807+ let $t03353634882 = if ((withdrawAsset == assetIdA))
798808 then {
799809 let unstake = if (contains(stakingAssets, strAssetIdA))
800810 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayA + amountWithFee) + governanceReward), strAssetIdA], nil)
811821 then $Tuple4(balanceA, (((balanceB - amountToPayB) - amountWithFee) - governanceReward), assetIdB, [ScriptTransfer(caller, (amountToPayB + amountWithFee), assetIdB)])
812822 else throw("Strict value is not equal to itself.")
813823 }
814- let newBalanceA = $t03302934375._1
815- let newBalanceB = $t03302934375._2
816- let govRewardAssetId = $t03302934375._3
817- let userTransfer = $t03302934375._4
824+ let newBalanceA = $t03353634882._1
825+ let newBalanceB = $t03353634882._2
826+ let govRewardAssetId = $t03353634882._3
827+ let userTransfer = $t03353634882._4
818828 $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceReward, govRewardAssetId)] ++ userTransfer), nil))
819829 }
820830 else throw("Strict value is not equal to itself.")
825835
826836 @Callable(i)
827837 func takeIntoAccountExtraFunds (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
828- let $t03510035176 = getPoolAssets(i.caller)
829- let strAssetIdA = $t03510035176._1
830- let strAssetIdB = $t03510035176._2
831- let assetIdA = $t03510035176._3
832- let assetIdB = $t03510035176._4
833- let $t03518935295 = getPoolBalances(i.caller, assetIdA, assetIdB)
834- let balanceA = $t03518935295._1
835- let balanceB = $t03518935295._2
836- let accountBalanceA = $t03518935295._3
837- let accountBalanceB = $t03518935295._4
838+ let $t03560735683 = getPoolAssets(i.caller)
839+ let strAssetIdA = $t03560735683._1
840+ let strAssetIdB = $t03560735683._2
841+ let assetIdA = $t03560735683._3
842+ let assetIdB = $t03560735683._4
843+ let $t03569635802 = getPoolBalances(i.caller, assetIdA, assetIdB)
844+ let balanceA = $t03569635802._1
845+ let balanceB = $t03569635802._2
846+ let accountBalanceA = $t03569635802._3
847+ let accountBalanceB = $t03569635802._4
838848 let amountEnrollA = (accountBalanceA - balanceA)
839849 let amountEnrollB = (accountBalanceB - balanceB)
840850 if ((moneyBoxAddress != i.originCaller))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kBalanceInitA = "A_asset_init"
1919
2020 let kBalanceInitB = "B_asset_init"
2121
2222 let kShareAssetId = "share_asset_id"
2323
2424 let kShareAssetSupply = "share_asset_supply"
2525
2626 let kFee = "commission"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let kFirstHarvest = "first_harvest"
3131
3232 let kFirstHarvestHeight = "first_harvest_height"
3333
3434 let kShareLimit = "share_limit_on_first_harvest"
3535
3636 let kBasePeriod = "base_period"
3737
3838 let kPeriodLength = "period_length"
3939
4040 let kStartHeight = "start_height"
4141
4242 let kUSDNAddress = "staking_usdnnsbt_address"
4343
4444 let kEURNAddress = "staking_eurn_address"
4545
4646 let kLeasingAmount = "leasing_amount"
4747
4848 let kUSDNAssetId = "usdn_asset_id"
4949
5050 let kEURNAssetId = "eurn_asset_id"
5151
5252 let kStakingAssets = "staking_assets"
5353
5454 let kOracleActive = "active_all_contracts"
5555
5656 let kOracleActiveExchangers = "active_global_exchangers"
5757
5858 let kDiscounts = "discounts"
5959
6060 let kDiscountValues = "discount_values"
6161
6262 let kUserGSwopInGov = "_GSwop_amount"
6363
6464 let kUserSwopInGov = "_SWOP_amount"
6565
6666 let kOraclePool = "pool_"
6767
6868 let kAdminPubKey1 = "admin_pub_1"
6969
7070 let kAdminPubKey2 = "admin_pub_2"
7171
7272 let kAdminPubKey3 = "admin_pub_3"
7373
7474 let kAdminInvokePubKey = "admin_invoke_pub"
7575
7676 let kMoneyBoxAddress = "money_box_address"
7777
7878 let kVotingAddress = "voting_address"
7979
8080 let kGovAddress = "governance_address"
8181
8282 let kFarmingAddress = "farming_address"
8383
8484 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
8585
8686 func getBase58FromOracle (key) = match getString(oracle, key) {
8787 case string: String =>
8888 fromBase58String(string)
8989 case nothing =>
9090 throw((key + "is empty"))
9191 }
9292
9393
9494 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
9595
9696 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
9797
9898 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
9999
100100 let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
101101
102102 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
103103
104104 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
105105
106106 let govAddress = Address(getBase58FromOracle(kGovAddress))
107107
108108 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
109109
110110 let USDN = getBase58FromOracle(kUSDNAssetId)
111111
112112 let EURN = getBase58FromOracle(kEURNAssetId)
113113
114114 let stakingAssets = getStringValue(oracle, kStakingAssets)
115115
116116 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
117117
118118 let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
119119
120120 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
121121
122122 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
123123
124124 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
125125
126126 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
127127
128128 let active = if (getBooleanValue(oracle, kOracleActive))
129129 then getBooleanValue(oracle, kOracleActiveExchangers)
130130 else false
131131
132132 let feeScale6 = 1000000
133133
134134 let scale8 = 100000000
135135
136136 func accountBalance (assetId,pool) = match assetId {
137137 case id: ByteVector =>
138138 assetBalance(pool, id)
139139 case waves: Unit =>
140140 wavesBalance(pool).available
141141 case _ =>
142142 throw("Match error")
143143 }
144144
145145
146146 func stakedAmount (assetId,pool) = {
147147 let stakedAmountCalculated = match assetId {
148148 case aId: ByteVector =>
149149 if ((aId == USDN))
150150 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(pool)))
151151 else if ((aId == EURN))
152152 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(pool)))
153153 else 0
154154 case _: Unit =>
155155 valueOrElse(getInteger(pool, kLeasingAmount), 0)
156156 case _ =>
157157 throw("Match error")
158158 }
159159 match stakedAmountCalculated {
160160 case i: Int =>
161161 i
162162 case _ =>
163163 0
164164 }
165165 }
166166
167167
168168 func getAssetInfo (assetId) = match assetId {
169169 case id: String|ByteVector =>
170170 let $t040054177 = match id {
171171 case aId: ByteVector =>
172172 $Tuple2(toBase58String(aId), aId)
173173 case aId: String =>
174174 $Tuple2(aId, fromBase58String(aId))
175175 case _ =>
176176 throw("Match error")
177177 }
178178 let stringId = $t040054177._1
179179 let bytesId = $t040054177._2
180180 let info = valueOrErrorMessage(assetInfo(bytesId), (("Asset " + stringId) + " doesn't exist"))
181181 $Tuple3(stringId, info.name, info.decimals)
182182 case waves: Unit =>
183183 $Tuple3("WAVES", "WAVES", 8)
184184 case _ =>
185185 throw("Match error")
186186 }
187187
188188
189189 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
190190
191191
192192 func calculateFeeDiscount (userAddr) = {
193193 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
194194 let gSwopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserGSwopInGov)), 0)
195195 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
196196 let discounts = split(getStringValue(oracle, kDiscounts), ",")
197197 if (if ((gSwopAmount >= parseIntValue(discountValues[0])))
198198 then (parseIntValue(discountValues[1]) > gSwopAmount)
199199 else false)
200200 then (feeScale6 - parseIntValue(discounts[0]))
201201 else if (if ((gSwopAmount >= parseIntValue(discountValues[1])))
202202 then (parseIntValue(discountValues[2]) > gSwopAmount)
203203 else false)
204204 then (feeScale6 - parseIntValue(discounts[1]))
205205 else if (if ((gSwopAmount >= parseIntValue(discountValues[2])))
206206 then (parseIntValue(discountValues[3]) > gSwopAmount)
207207 else false)
208208 then (feeScale6 - parseIntValue(discounts[2]))
209209 else if (if ((gSwopAmount >= parseIntValue(discountValues[3])))
210210 then (parseIntValue(discountValues[4]) > gSwopAmount)
211211 else false)
212212 then (feeScale6 - parseIntValue(discounts[3]))
213213 else if ((gSwopAmount >= parseIntValue(discountValues[4])))
214214 then (feeScale6 - parseIntValue(discounts[4]))
215215 else feeScale6
216216 }
217217
218218
219219 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo,fee,feeGovernance) = {
220220 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
221221 let amountWithFee = fraction(amountWithoutFee, (feeScale6 - fee), feeScale6)
222222 let governanceReward = fraction(amountWithoutFee, feeGovernance, feeScale6)
223223 if ((minAmountToReceive > amountWithFee))
224224 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
225225 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
226226 }
227227
228228
229229 func calculateVirtGet (pmtAmount,balance,fee) = {
230230 let a = 1
231231 let b = (((balance + fraction(balance, (feeScale6 - fee), feeScale6)) + fraction(pmtAmount, (feeScale6 - fee), feeScale6)) - pmtAmount)
232232 let c = (-(toBigInt(balance)) * toBigInt(pmtAmount))
233233 let D = ((toBigInt(b) * toBigInt(b)) - ((toBigInt(4) * toBigInt(a)) * c))
234234 (toInt(((-(toBigInt(b)) + pow(D, 0, toBigInt(5), 1, 0, DOWN)) / toBigInt(2))) * a)
235235 }
236236
237237
238238 func parsePaymentAsset (assetId) = if ((assetId == base58''))
239239 then unit
240240 else assetId
241241
242242
243243 func suspendSuspicious (accountBalanceA,accountBalanceB,balanceA,balanceB,assetIdA,assetIdB) = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceA)) + " ") + assetIdA) + ", ") + toString(accountBalanceB)) + " ") + assetIdB) + ". State: ") + toString(balanceA)) + " ") + assetIdA) + ", ") + toString(balanceB)) + " ") + assetIdB))
244244
245245
246246 func isActive () = if (active)
247247 then unit
248248 else throw("DApp is inactive at this moment")
249249
250250
251251 func isOraclePool (poolAddress) = if (isDefined(getString(oracle, (kOraclePool + poolAddress))))
252252 then unit
253253 else throw("DApp is not registered pool")
254254
255255
256256 func getPoolBalances (pool,assetIdA,assetIdB) = {
257257 let balanceA = getIntegerValue(pool, kBalanceA)
258258 let balanceB = getIntegerValue(pool, kBalanceB)
259259 let stakedAmountA = stakedAmount(assetIdA, pool)
260260 let stakedAmountB = stakedAmount(assetIdB, pool)
261261 let accountBalanceA = (accountBalance(assetIdA, pool) + stakedAmountA)
262262 let accountBalanceB = (accountBalance(assetIdB, pool) + stakedAmountB)
263263 let shareSupply = getIntegerValue(pool, kShareAssetSupply)
264264 $Tuple5(balanceA, balanceB, accountBalanceA, accountBalanceB, shareSupply)
265265 }
266266
267267
268268 func getPoolAssets (pool) = {
269269 let strAssetIdA = getStringValue(pool, kAssetIdA)
270270 let strAssetIdB = getStringValue(pool, kAssetIdB)
271271 let assetIdA = if ((strAssetIdA == "WAVES"))
272272 then unit
273273 else fromBase58String(strAssetIdA)
274274 let assetIdB = if ((strAssetIdB == "WAVES"))
275275 then unit
276276 else fromBase58String(strAssetIdB)
277277 let shareAssetId = fromBase58String(getStringValue(pool, kShareAssetId))
278278 $Tuple5(strAssetIdA, strAssetIdB, assetIdA, assetIdB, shareAssetId)
279279 }
280280
281281
282282 func getFeeParams (pool,caller) = {
283283 let feeDiscount = calculateFeeDiscount(caller)
284284 let fee = fraction(getIntegerValue(pool, kFee), feeDiscount, feeScale6, CEILING)
285285 let govFee = fraction(fraction(fee, 40, 100), feeDiscount, feeScale6, CEILING)
286286 $Tuple2(fee, govFee)
287287 }
288288
289289
290290 @Callable(i)
291291 func init (callerBytes,args,pAmounts,pAssetIds) = {
292292 let caller = Address(callerBytes)
293293 let $t089969074 = $Tuple2(pAmounts[0], parsePaymentAsset(pAssetIds[0]))
294294 let pmtAmountA = $t089969074._1
295295 let pmtAssetIdA = $t089969074._2
296296 let $t090799157 = $Tuple2(pAmounts[1], parsePaymentAsset(pAssetIds[1]))
297297 let pmtAmountB = $t090799157._1
298298 let pmtAssetIdB = $t090799157._2
299299 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
300300 then throw("Only admin can call this function")
301301 else if (isDefined(getBoolean(caller, kActive)))
302302 then throw("DApp is already active")
303303 else if ((pmtAssetIdA == pmtAssetIdB))
304304 then throw("Assets must be different")
305305 else {
306306 let $t095279604 = getAssetInfo(pmtAssetIdA)
307307 let pmtStrAssetIdA = $t095279604._1
308308 let pmtAssetNameA = $t095279604._2
309309 let pmtDecimalsA = $t095279604._3
310310 let $t096139690 = getAssetInfo(pmtAssetIdB)
311311 let pmtStrAssetIdB = $t096139690._1
312312 let pmtAssetNameB = $t096139690._2
313313 let pmtDecimalsB = $t096139690._3
314314 let firstHarvest = (args[0] == "true")
315315 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
316316 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
317317 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
318318 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
319319 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
320320 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
321321 let shareInitialSupply = fraction(arg1, arg2, arg3)
322322 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
323323 let shareIssueId = calculateAssetId(shareIssue)
324324 let stake1 = if (contains(stakingAssets, pmtStrAssetIdA))
325325 then invoke(i.caller, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
326326 else 0
327327 if ((stake1 == stake1))
328328 then {
329329 let stake2 = if (contains(stakingAssets, pmtStrAssetIdB))
330330 then invoke(i.caller, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
331331 else 0
332332 if ((stake2 == stake2))
333333 then {
334334 let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(caller, shareInitialSupply, shareIssueId)]
335335 if (firstHarvest)
336336 then $Tuple2(nil, $Tuple2((baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]), nil))
337337 else $Tuple2(nil, $Tuple2(baseEntry, nil))
338338 }
339339 else throw("Strict value is not equal to itself.")
340340 }
341341 else throw("Strict value is not equal to itself.")
342342 }
343343 }
344344
345345
346346
347347 @Callable(i)
348348 func initWithInitRatio (callerBytes,args,pAmounts,pAssetIds) = {
349349 let caller = Address(callerBytes)
350350 let $t01193512135 = $Tuple5(parseIntValue(args[0]), parseIntValue(args[1]), args[2], args[3], (args[4] == "true"))
351351 let amtAssetA = $t01193512135._1
352352 let amtAssetB = $t01193512135._2
353353 let assetIdAStr = $t01193512135._3
354354 let assetIdBStr = $t01193512135._4
355355 let firstHarvest = $t01193512135._5
356356 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
357357 then throw("Only admin can call this function")
358358 else if (isDefined(getBoolean(caller, kActive)))
359359 then throw("DApp is already active")
360360 else if ((assetIdAStr == assetIdBStr))
361361 then throw("Assets must be different")
362362 else {
363363 let $t01250512582 = getAssetInfo(assetIdAStr)
364364 let pmtStrAssetIdA = $t01250512582._1
365365 let pmtAssetNameA = $t01250512582._2
366366 let pmtDecimalsA = $t01250512582._3
367367 let $t01259112668 = getAssetInfo(assetIdBStr)
368368 let pmtStrAssetIdB = $t01259112668._1
369369 let pmtAssetNameB = $t01259112668._2
370370 let pmtDecimalsB = $t01259112668._3
371371 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
372372 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
373373 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
374374 let shareInitialSupply = 0
375375 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
376376 let shareIssueId = calculateAssetId(shareIssue)
377377 let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceInitA, amtAssetA), IntegerEntry(kBalanceInitB, amtAssetB), IntegerEntry(kBalanceA, 0), IntegerEntry(kBalanceB, 0), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply)]
378378 if (firstHarvest)
379379 then $Tuple2(nil, $Tuple2((baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]), nil))
380380 else $Tuple2(nil, $Tuple2(baseEntry, nil))
381381 }
382382 }
383383
384384
385385
386386 @Callable(i)
387387 func keepLimitForFirstHarvest (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
388388 then throw("Only admin can call this function")
389389 else {
390390 let shareLimit = parseIntValue(args[0])
391391 $Tuple2(nil, $Tuple2([IntegerEntry(kShareLimit, shareLimit)], nil))
392392 }))
393393
394394
395395
396396 @Callable(i)
397397 func exchange (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
398398 let caller = Address(callerBytes)
399399 let $t01499315069 = $Tuple2(pAmounts[0], parsePaymentAsset(pAssetIds[0]))
400400 let pmtAmount = $t01499315069._1
401401 let pmtAssetId = $t01499315069._2
402402 let minAmountToReceive = parseIntValue(args[0])
403403 let $t01514215218 = getPoolAssets(i.caller)
404404 let strAssetIdA = $t01514215218._1
405405 let strAssetIdB = $t01514215218._2
406406 let assetIdA = $t01514215218._3
407407 let assetIdB = $t01514215218._4
408408 let $t01523115337 = getPoolBalances(i.caller, assetIdA, assetIdB)
409409 let balanceA = $t01523115337._1
410410 let balanceB = $t01523115337._2
411411 let accountBalanceA = $t01523115337._3
412412 let accountBalanceB = $t01523115337._4
413413 if (if ((balanceA == 0))
414414 then true
415415 else (balanceB == 0))
416416 then throw("Can't exchange with zero balance")
417417 else if ((0 >= minAmountToReceive))
418418 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
419419 else if ((size(pAmounts) != 1))
420420 then throw("One attached payment expected")
421421 else if (!(containsElement([assetIdA, assetIdB], pmtAssetId)))
422422 then throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
423423 else if (if ((balanceA > accountBalanceA))
424424 then true
425425 else (balanceB > accountBalanceB))
426426 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
427427 else {
428428 let $t01622216280 = getFeeParams(i.caller, i.originCaller)
429429 let fee = $t01622216280._1
430430 let govFee = $t01622216280._2
431431 let $t01629716634 = if ((pmtAssetId == assetIdA))
432432 then calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, fee, govFee)
433433 else calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, fee, govFee)
434434 let amountWithoutFee = $t01629716634._1
435435 let amountWithFee = $t01629716634._2
436436 let governanceReward = $t01629716634._3
437437 let $t01665216977 = if ((pmtAssetId == assetIdA))
438438 then $Tuple3((balanceA + pmtAmount), ((balanceB - amountWithFee) - governanceReward), assetIdB)
439439 else $Tuple3(((balanceA - amountWithFee) - governanceReward), (balanceB + pmtAmount), assetIdA)
440440 let newBalanceA = $t01665216977._1
441441 let newBalanceB = $t01665216977._2
442442 let assetIdSend = $t01665216977._3
443443 let $t01699517245 = if ((pmtAssetId == assetIdA))
444444 then $Tuple2(pmtAmount, (amountWithFee + governanceReward))
445445 else $Tuple2((amountWithFee + governanceReward), pmtAmount)
446446 let stakeAmountA = $t01699517245._1
447447 let stakeAmountB = $t01699517245._2
448448 let stake1 = if (contains(stakingAssets, strAssetIdA))
449449 then invoke(i.caller, "stakeUnstake", [(pmtAssetId == assetIdA), stakeAmountA, strAssetIdA], nil)
450450 else 0
451451 if ((stake1 == stake1))
452452 then {
453453 let stake2 = if (contains(stakingAssets, strAssetIdB))
454454 then invoke(i.caller, "stakeUnstake", [(pmtAssetId == assetIdB), stakeAmountB, strAssetIdB], nil)
455455 else 0
456456 if ((stake2 == stake2))
457457 then $Tuple2(nil, $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], [amountWithFee, assetIdSend]))
458458 else throw("Strict value is not equal to itself.")
459459 }
460460 else throw("Strict value is not equal to itself.")
461461 }
462462 }))
463463
464464
465465
466466 @Callable(i)
467467 func replenishWithTwoTokens (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
468468 let caller = Address(callerBytes)
469469 let pmtAssetIdA = parsePaymentAsset(pAssetIds[0])
470470 let pmtAssetIdB = parsePaymentAsset(pAssetIds[1])
471471 let stakeFarming = (args[0] == "true")
472472 let lockType = parseIntValue(args[1])
473473 let $t01850818598 = getPoolAssets(i.caller)
474474 let strAssetIdA = $t01850818598._1
475475 let strAssetIdB = $t01850818598._2
476476 let assetIdA = $t01850818598._3
477477 let assetIdB = $t01850818598._4
478478 let shareAssetId = $t01850818598._5
479479 let $t01861118735 = getPoolBalances(i.caller, assetIdA, assetIdB)
480480 let balanceA = $t01861118735._1
481481 let balanceB = $t01861118735._2
482482 let accountBalanceA = $t01861118735._3
483483 let accountBalanceB = $t01861118735._4
484484 let shareAssetSupply = $t01861118735._5
485- if ((size(pAmounts) != 2))
486- then throw("Two attached assets expected")
485+ if (if ((size(pAmounts) != 2))
486+ then (size(pAmounts) != 3)
487+ else false)
488+ then throw("Two or three payments expected")
487489 else if (if ((pmtAssetIdA != assetIdA))
488490 then true
489491 else (pmtAssetIdB != assetIdB))
490492 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
491493 else if (if ((balanceA > accountBalanceA))
492494 then true
493495 else (balanceB > accountBalanceB))
494496 then $Tuple2(nil, ([ScriptTransfer(caller, pAmounts[0], pmtAssetIdA), ScriptTransfer(caller, pAmounts[1], pmtAssetIdB)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
495497 else {
496- let $t01940719484 = getAssetInfo(pmtAssetIdA)
497- let pmtStrAssetIdA = $t01940719484._1
498- let pmtAssetNameA = $t01940719484._2
499- let pmtDecimalsA = $t01940719484._3
500- let $t01950119578 = getAssetInfo(pmtAssetIdB)
501- let pmtStrAssetIdB = $t01950119578._1
502- let pmtAssetNameB = $t01950119578._2
503- let pmtDecimalsB = $t01950119578._3
498+ let $t01943319510 = getAssetInfo(pmtAssetIdA)
499+ let pmtStrAssetIdA = $t01943319510._1
500+ let pmtAssetNameA = $t01943319510._2
501+ let pmtDecimalsA = $t01943319510._3
502+ let $t01952719604 = getAssetInfo(pmtAssetIdB)
503+ let pmtStrAssetIdB = $t01952719604._1
504+ let pmtAssetNameB = $t01952719604._2
505+ let pmtDecimalsB = $t01952719604._3
504506 let initial = ((balanceA + balanceB) == 0)
505- let $t01965320496 = if (initial)
507+ let $t01967920522 = if (initial)
506508 then $Tuple5(pAmounts[0], pAmounts[1], 0, pmtAssetIdA, 1)
507509 else {
508510 let ratioShareTokensInA = fraction(scale8, pAmounts[0], balanceA)
509511 let ratioShareTokensInB = fraction(scale8, pAmounts[1], balanceB)
510512 if ((ratioShareTokensInB > ratioShareTokensInA))
511513 then {
512514 let pmt = fraction(pAmounts[0], balanceB, balanceA)
513515 $Tuple5(pAmounts[0], pmt, (pAmounts[1] - pmt), pmtAssetIdB, ratioShareTokensInA)
514516 }
515517 else {
516518 let pmt = fraction(pAmounts[1], balanceA, balanceB)
517519 $Tuple5(pmt, pAmounts[1], (pAmounts[0] - pmt), pmtAssetIdA, ratioShareTokensInB)
518520 }
519521 }
520- let pmtAmountA = $t01965320496._1
521- let pmtAmountB = $t01965320496._2
522- let change = $t01965320496._3
523- let changeAssetId = $t01965320496._4
524- let shareTokenRatio = $t01965320496._5
522+ let pmtAmountA = $t01967920522._1
523+ let pmtAmountB = $t01967920522._2
524+ let change = $t01967920522._3
525+ let changeAssetId = $t01967920522._4
526+ let shareTokenRatio = $t01967920522._5
525527 let shareTokenToPayAmount = if (initial)
526528 then {
527529 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
528530 fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
529531 }
530532 else fraction(shareTokenRatio, shareAssetSupply, scale8)
531533 if ((shareTokenToPayAmount == 0))
532534 then throw("Too small amount to replenish")
533535 else if ((0 > change))
534536 then throw("Change < 0")
535537 else {
536538 let stake1 = if (contains(stakingAssets, pmtStrAssetIdA))
537539 then invoke(i.caller, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
538540 else 0
539541 if ((stake1 == stake1))
540542 then {
541543 let stake2 = if (contains(stakingAssets, pmtStrAssetIdB))
542544 then invoke(i.caller, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
543545 else 0
544546 if ((stake2 == stake2))
545547 then {
546548 let shareTokenST = if (stakeFarming)
547549 then {
550+ let stPayments = ([AttachedPayment(shareAssetId, shareTokenToPayAmount)] ++ (if ((size(pAmounts) == 3))
551+ then [AttachedPayment(pAssetIds[2], pAmounts[2])]
552+ else nil))
548553 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
549554 if ((reissue == reissue))
550555 then {
551- let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], [AttachedPayment(shareAssetId, shareTokenToPayAmount)])
556+ let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], stPayments)
552557 if ((stake3 == stake3))
553558 then nil
554559 else throw("Strict value is not equal to itself.")
555560 }
556561 else throw("Strict value is not equal to itself.")
557562 }
558563 else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(caller, shareTokenToPayAmount, shareAssetId)]
559564 $Tuple2(nil, $Tuple2(([IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(caller, change, changeAssetId)] ++ shareTokenST), nil))
560565 }
561566 else throw("Strict value is not equal to itself.")
562567 }
563568 else throw("Strict value is not equal to itself.")
564569 }
565570 }
566571 }))
567572
568573
569574
570575 @Callable(i)
571576 func replenishWithOneToken (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
572577 let caller = Address(callerBytes)
573578 let pmtAssetId = parsePaymentAsset(pAssetIds[0])
574579 let pmtAmount = pAmounts[0]
575580 let virtGetMinAmount = parseIntValue(args[0])
576581 let stakeFarming = (args[1] == "true")
577582 let lockType = parseIntValue(args[1])
578- let $t02311223202 = getPoolAssets(i.caller)
579- let strAssetIdA = $t02311223202._1
580- let strAssetIdB = $t02311223202._2
581- let assetIdA = $t02311223202._3
582- let assetIdB = $t02311223202._4
583- let shareAssetId = $t02311223202._5
584- let $t02321523339 = getPoolBalances(i.caller, assetIdA, assetIdB)
585- let balanceA = $t02321523339._1
586- let balanceB = $t02321523339._2
587- let accountBalanceA = $t02321523339._3
588- let accountBalanceB = $t02321523339._4
589- let shareAssetSupply = $t02321523339._5
583+ let $t02336323453 = getPoolAssets(i.caller)
584+ let strAssetIdA = $t02336323453._1
585+ let strAssetIdB = $t02336323453._2
586+ let assetIdA = $t02336323453._3
587+ let assetIdB = $t02336323453._4
588+ let shareAssetId = $t02336323453._5
589+ let $t02346623590 = getPoolBalances(i.caller, assetIdA, assetIdB)
590+ let balanceA = $t02346623590._1
591+ let balanceB = $t02346623590._2
592+ let accountBalanceA = $t02346623590._3
593+ let accountBalanceB = $t02346623590._4
594+ let shareAssetSupply = $t02346623590._5
590595 let initial = ((balanceA + balanceB) == 0)
591- if ((size(pAmounts) != 1))
592- then throw("One attached assets expected")
596+ if (if ((size(pAmounts) != 1))
597+ then (size(pAmounts) != 2)
598+ else false)
599+ then throw("Two or one attached assets expected")
593600 else if (if ((pmtAssetId != assetIdA))
594601 then (pmtAssetId != assetIdB)
595602 else false)
596603 then throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
597604 else if (initial)
598605 then throw("For initial exchanger you need to use two tokens")
599606 else if (if ((balanceA > accountBalanceA))
600607 then true
601608 else (balanceB > accountBalanceB))
602609 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
603610 else {
604- let $t02409324151 = getFeeParams(i.caller, i.originCaller)
605- let fee = $t02409324151._1
606- let govFee = $t02409324151._2
607- let $t02416826054 = if ((pmtAssetId == assetIdA))
611+ let $t02437524433 = getFeeParams(i.caller, i.originCaller)
612+ let fee = $t02437524433._1
613+ let govFee = $t02437524433._2
614+ let $t02445026336 = if ((pmtAssetId == assetIdA))
608615 then {
609616 let virtPayAmount = calculateVirtGet(pmtAmount, balanceA, fee)
610- let $t02444724584 = calculateFees(virtPayAmount, virtGetMinAmount, balanceA, balanceB, fee, govFee)
611- let amountWithoutFee = $t02444724584._1
612- let amountWithFee = $t02444724584._2
613- let governanceReward = $t02444724584._3
617+ let $t02472924866 = calculateFees(virtPayAmount, virtGetMinAmount, balanceA, balanceB, fee, govFee)
618+ let amountWithoutFee = $t02472924866._1
619+ let amountWithFee = $t02472924866._2
620+ let governanceReward = $t02472924866._3
614621 let newBalanceA = (balanceA + pmtAmount)
615622 let newBalanceB = (balanceB - governanceReward)
616623 let ratioShareTokensInA = fraction((pmtAmount - virtPayAmount), scale8, newBalanceA)
617624 let ratioShareTokensInB = fraction(amountWithFee, scale8, newBalanceB)
618625 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
619626 $Tuple7(newBalanceA, newBalanceB, shareTokenToPayAmount, governanceReward, assetIdB, strAssetIdB, strAssetIdA)
620627 }
621628 else {
622629 let virtPayAmount = calculateVirtGet(pmtAmount, balanceB, fee)
623- let $t02531925456 = calculateFees(virtPayAmount, virtGetMinAmount, balanceB, balanceA, fee, govFee)
624- let amountWithoutFee = $t02531925456._1
625- let amountWithFee = $t02531925456._2
626- let governanceReward = $t02531925456._3
630+ let $t02560125738 = calculateFees(virtPayAmount, virtGetMinAmount, balanceB, balanceA, fee, govFee)
631+ let amountWithoutFee = $t02560125738._1
632+ let amountWithFee = $t02560125738._2
633+ let governanceReward = $t02560125738._3
627634 let newBalanceA = (balanceA - governanceReward)
628635 let newBalanceB = (balanceB + pmtAmount)
629636 let ratioShareTokensInA = fraction(amountWithFee, scale8, newBalanceA)
630637 let ratioShareTokensInB = fraction((pmtAmount - virtPayAmount), scale8, newBalanceB)
631638 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
632639 $Tuple7(newBalanceA, newBalanceB, shareTokenToPayAmount, governanceReward, assetIdA, strAssetIdA, strAssetIdB)
633640 }
634- let newBalanceA = $t02416826054._1
635- let newBalanceB = $t02416826054._2
636- let shareTokenToPayAmount = $t02416826054._3
637- let govReward = $t02416826054._4
638- let govRewardAsset = $t02416826054._5
639- let govRewardAssetStr = $t02416826054._6
640- let pmtAssetIdStr = $t02416826054._7
641+ let newBalanceA = $t02445026336._1
642+ let newBalanceB = $t02445026336._2
643+ let shareTokenToPayAmount = $t02445026336._3
644+ let govReward = $t02445026336._4
645+ let govRewardAsset = $t02445026336._5
646+ let govRewardAssetStr = $t02445026336._6
647+ let pmtAssetIdStr = $t02445026336._7
641648 if ((shareTokenToPayAmount == 0))
642649 then throw("Too small amount to replenish")
643650 else {
644651 let stake1 = if (contains(stakingAssets, pmtAssetIdStr))
645652 then invoke(i.caller, "stakeUnstake", [true, pmtAmount, pmtAssetIdStr], nil)
646653 else 0
647654 if ((stake1 == stake1))
648655 then {
649656 let stake2 = if (contains(stakingAssets, govRewardAssetStr))
650657 then invoke(i.caller, "stakeUnstake", [false, govReward, govRewardAssetStr], nil)
651658 else 0
652659 if ((stake2 == stake2))
653660 then {
654661 let shareTokenST = if (stakeFarming)
655662 then {
663+ let stPayments = ([AttachedPayment(shareAssetId, shareTokenToPayAmount)] ++ (if ((size(pAmounts) == 2))
664+ then [AttachedPayment(pAssetIds[1], pAmounts[1])]
665+ else nil))
656666 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
657667 if ((reissue == reissue))
658668 then {
659- let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], [AttachedPayment(shareAssetId, shareTokenToPayAmount)])
669+ let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], stPayments)
660670 if ((stake3 == stake3))
661671 then nil
662672 else throw("Strict value is not equal to itself.")
663673 }
664674 else throw("Strict value is not equal to itself.")
665675 }
666676 else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(caller, shareTokenToPayAmount, shareAssetId)]
667677 $Tuple2(nil, $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(moneyBoxAddress, govReward, govRewardAsset)] ++ shareTokenST), nil))
668678 }
669679 else throw("Strict value is not equal to itself.")
670680 }
671681 else throw("Strict value is not equal to itself.")
672682 }
673683 }
674684 }))
675685
676686
677687
678688 @Callable(i)
679689 func withdraw (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
680690 let caller = Address(callerBytes)
681- let $t02787627966 = getPoolAssets(i.caller)
682- let strAssetIdA = $t02787627966._1
683- let strAssetIdB = $t02787627966._2
684- let assetIdA = $t02787627966._3
685- let assetIdB = $t02787627966._4
686- let shareAssetId = $t02787627966._5
687- let $t02797928103 = getPoolBalances(i.caller, assetIdA, assetIdB)
688- let balanceA = $t02797928103._1
689- let balanceB = $t02797928103._2
690- let accountBalanceA = $t02797928103._3
691- let accountBalanceB = $t02797928103._4
692- let shareAssetSupply = $t02797928103._5
693- let $t02811628524 = if ((size(pAmounts) == 1))
691+ let $t02838328473 = getPoolAssets(i.caller)
692+ let strAssetIdA = $t02838328473._1
693+ let strAssetIdB = $t02838328473._2
694+ let assetIdA = $t02838328473._3
695+ let assetIdB = $t02838328473._4
696+ let shareAssetId = $t02838328473._5
697+ let $t02848628610 = getPoolBalances(i.caller, assetIdA, assetIdB)
698+ let balanceA = $t02848628610._1
699+ let balanceB = $t02848628610._2
700+ let accountBalanceA = $t02848628610._3
701+ let accountBalanceB = $t02848628610._4
702+ let shareAssetSupply = $t02848628610._5
703+ let $t02862329031 = if ((size(pAmounts) == 1))
694704 then {
695705 let pAsset = parsePaymentAsset(pAssetIds[0])
696706 if ((pAsset != shareAssetId))
697707 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
698708 else $Tuple2(pAmounts[0], pAsset)
699709 }
700710 else $Tuple2(0, shareAssetId)
701- let pmtAmount = $t02811628524._1
702- let pmtAssetId = $t02811628524._2
711+ let pmtAmount = $t02862329031._1
712+ let pmtAssetId = $t02862329031._2
703713 if ((size(pAmounts) > 1))
704714 then throw("One attached payment expected")
705715 else if (if ((balanceA > accountBalanceA))
706716 then true
707717 else (balanceB > accountBalanceB))
708718 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
709719 else {
710720 let unlockAmount = parseIntValue(valueOrElse(args[0], "0"))
711721 let unlock = if ((unlockAmount > 0))
712722 then invoke(farmingAddress, "withdrawShareTokens", [toString(i.caller), unlockAmount], nil)
713723 else 0
714724 if ((unlock == unlock))
715725 then {
716726 let withdrawAmount = (pmtAmount + unlockAmount)
717727 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
718728 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
719729 let stake1 = if (contains(stakingAssets, strAssetIdA))
720730 then invoke(i.caller, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
721731 else 0
722732 if ((stake1 == stake1))
723733 then {
724734 let stake2 = if (contains(stakingAssets, strAssetIdB))
725735 then invoke(i.caller, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
726736 else 0
727737 if ((stake2 == stake2))
728738 then $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2([IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(caller, amountToPayA, assetIdA), ScriptTransfer(caller, amountToPayB, assetIdB)], nil))
729739 else throw("Strict value is not equal to itself.")
730740 }
731741 else throw("Strict value is not equal to itself.")
732742 }
733743 else throw("Strict value is not equal to itself.")
734744 }
735745 }))
736746
737747
738748
739749 @Callable(i)
740750 func withdrawOneToken (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
741751 let caller = Address(callerBytes)
742752 let withdrawAsset = if ((args[0] == ""))
743753 then unit
744754 else fromBase58String(args[0])
745- let $t03073230822 = getPoolAssets(i.caller)
746- let strAssetIdA = $t03073230822._1
747- let strAssetIdB = $t03073230822._2
748- let assetIdA = $t03073230822._3
749- let assetIdB = $t03073230822._4
750- let shareAssetId = $t03073230822._5
751- let $t03083530959 = getPoolBalances(i.caller, assetIdA, assetIdB)
752- let balanceA = $t03083530959._1
753- let balanceB = $t03083530959._2
754- let accountBalanceA = $t03083530959._3
755- let accountBalanceB = $t03083530959._4
756- let shareAssetSupply = $t03083530959._5
757- let $t03097231352 = if ((size(pAmounts) == 1))
755+ let $t03123931329 = getPoolAssets(i.caller)
756+ let strAssetIdA = $t03123931329._1
757+ let strAssetIdB = $t03123931329._2
758+ let assetIdA = $t03123931329._3
759+ let assetIdB = $t03123931329._4
760+ let shareAssetId = $t03123931329._5
761+ let $t03134231466 = getPoolBalances(i.caller, assetIdA, assetIdB)
762+ let balanceA = $t03134231466._1
763+ let balanceB = $t03134231466._2
764+ let accountBalanceA = $t03134231466._3
765+ let accountBalanceB = $t03134231466._4
766+ let shareAssetSupply = $t03134231466._5
767+ let $t03147931859 = if ((size(pAmounts) == 1))
758768 then {
759769 let pAsset = parsePaymentAsset(pAssetIds[0])
760770 if ((pAsset != shareAssetId))
761771 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
762772 else $Tuple2(pAmounts[0], pAsset)
763773 }
764774 else $Tuple2(0, shareAssetId)
765- let pmtAmount = $t03097231352._1
766- let pmtAssetId = $t03097231352._2
775+ let pmtAmount = $t03147931859._1
776+ let pmtAssetId = $t03147931859._2
767777 let virtMinToRecive = parseIntValue(args[1])
768778 if ((size(pAmounts) != 1))
769779 then throw("One attached payment expected")
770780 else if ((pmtAssetId != shareAssetId))
771781 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
772782 else if (!(containsElement([assetIdA, assetIdB], withdrawAsset)))
773783 then throw("Incorrect withdraw asset.")
774784 else if (if ((balanceA > accountBalanceA))
775785 then true
776786 else (balanceB > accountBalanceB))
777787 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
778788 else {
779789 let unlockAmount = parseIntValue(valueOrElse(args[2], "0"))
780790 let unlock = if ((unlockAmount > 0))
781791 then invoke(farmingAddress, "withdrawShareTokens", [toString(i.caller), unlockAmount], nil)
782792 else 0
783793 if ((unlock == unlock))
784794 then {
785795 let withdrawAmount = (pmtAmount + unlockAmount)
786796 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
787797 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
788- let $t03259732655 = getFeeParams(i.caller, i.originCaller)
789- let fee = $t03259732655._1
790- let govFee = $t03259732655._2
791- let $t03267233012 = if ((withdrawAsset == assetIdA))
798+ let $t03310433162 = getFeeParams(i.caller, i.originCaller)
799+ let fee = $t03310433162._1
800+ let govFee = $t03310433162._2
801+ let $t03317933519 = if ((withdrawAsset == assetIdA))
792802 then calculateFees(amountToPayB, virtMinToRecive, balanceB, balanceA, fee, govFee)
793803 else calculateFees(amountToPayA, virtMinToRecive, balanceA, balanceB, fee, govFee)
794- let amountWithoutFee = $t03267233012._1
795- let amountWithFee = $t03267233012._2
796- let governanceReward = $t03267233012._3
797- let $t03302934375 = if ((withdrawAsset == assetIdA))
804+ let amountWithoutFee = $t03317933519._1
805+ let amountWithFee = $t03317933519._2
806+ let governanceReward = $t03317933519._3
807+ let $t03353634882 = if ((withdrawAsset == assetIdA))
798808 then {
799809 let unstake = if (contains(stakingAssets, strAssetIdA))
800810 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayA + amountWithFee) + governanceReward), strAssetIdA], nil)
801811 else 0
802812 if ((unstake == unstake))
803813 then $Tuple4((((balanceA - amountToPayA) - amountWithFee) - governanceReward), balanceB, assetIdA, [ScriptTransfer(caller, (amountToPayA + amountWithFee), assetIdA)])
804814 else throw("Strict value is not equal to itself.")
805815 }
806816 else {
807817 let unstake = if (contains(stakingAssets, strAssetIdB))
808818 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayB + amountWithFee) + governanceReward), strAssetIdB], nil)
809819 else 0
810820 if ((unstake == unstake))
811821 then $Tuple4(balanceA, (((balanceB - amountToPayB) - amountWithFee) - governanceReward), assetIdB, [ScriptTransfer(caller, (amountToPayB + amountWithFee), assetIdB)])
812822 else throw("Strict value is not equal to itself.")
813823 }
814- let newBalanceA = $t03302934375._1
815- let newBalanceB = $t03302934375._2
816- let govRewardAssetId = $t03302934375._3
817- let userTransfer = $t03302934375._4
824+ let newBalanceA = $t03353634882._1
825+ let newBalanceB = $t03353634882._2
826+ let govRewardAssetId = $t03353634882._3
827+ let userTransfer = $t03353634882._4
818828 $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceReward, govRewardAssetId)] ++ userTransfer), nil))
819829 }
820830 else throw("Strict value is not equal to itself.")
821831 }
822832 }))
823833
824834
825835
826836 @Callable(i)
827837 func takeIntoAccountExtraFunds (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
828- let $t03510035176 = getPoolAssets(i.caller)
829- let strAssetIdA = $t03510035176._1
830- let strAssetIdB = $t03510035176._2
831- let assetIdA = $t03510035176._3
832- let assetIdB = $t03510035176._4
833- let $t03518935295 = getPoolBalances(i.caller, assetIdA, assetIdB)
834- let balanceA = $t03518935295._1
835- let balanceB = $t03518935295._2
836- let accountBalanceA = $t03518935295._3
837- let accountBalanceB = $t03518935295._4
838+ let $t03560735683 = getPoolAssets(i.caller)
839+ let strAssetIdA = $t03560735683._1
840+ let strAssetIdB = $t03560735683._2
841+ let assetIdA = $t03560735683._3
842+ let assetIdB = $t03560735683._4
843+ let $t03569635802 = getPoolBalances(i.caller, assetIdA, assetIdB)
844+ let balanceA = $t03569635802._1
845+ let balanceB = $t03569635802._2
846+ let accountBalanceA = $t03569635802._3
847+ let accountBalanceB = $t03569635802._4
838848 let amountEnrollA = (accountBalanceA - balanceA)
839849 let amountEnrollB = (accountBalanceB - balanceB)
840850 if ((moneyBoxAddress != i.originCaller))
841851 then throw("Only the wallet can call this function")
842852 else if (if ((0 > amountEnrollA))
843853 then true
844854 else (0 > amountEnrollB))
845855 then suspend("Enroll amount negative")
846856 else if (if ((amountEnrollA == 0))
847857 then (amountEnrollB == 0)
848858 else false)
849859 then throw("No money to take")
850860 else {
851861 let stake1 = if (if (contains(stakingAssets, strAssetIdA))
852862 then (amountEnrollA > 0)
853863 else false)
854864 then invoke(i.caller, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
855865 else 0
856866 if ((stake1 == stake1))
857867 then {
858868 let stake2 = if (if (contains(stakingAssets, strAssetIdB))
859869 then (amountEnrollB > 0)
860870 else false)
861871 then invoke(i.caller, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
862872 else 0
863873 if ((stake2 == stake2))
864874 then $Tuple2(nil, $Tuple2([IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB))], nil))
865875 else throw("Strict value is not equal to itself.")
866876 }
867877 else throw("Strict value is not equal to itself.")
868878 }
869879 }))
870880
871881
872882 @Verifier(tx)
873883 func verify () = {
874884 let multiSignedByAdmins = {
875885 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
876886 then 1
877887 else 0
878888 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
879889 then 1
880890 else 0
881891 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
882892 then 1
883893 else 0
884894 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
885895 }
886896 multiSignedByAdmins
887897 }
888898

github/deemru/w8io/026f985 
132.99 ms