tx · FaRA8aykCEdvXnmPqE8V8YCGBS1bWsViXU9YMGAURbji

3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN:  -0.01400000 Waves

2021.12.29 19:00 [1855721] smart account 3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN > SELF 0.00000000 Waves

{ "type": 13, "id": "FaRA8aykCEdvXnmPqE8V8YCGBS1bWsViXU9YMGAURbji", "fee": 1400000, "feeAssetId": null, "timestamp": 1640793652565, "version": 2, "chainId": 84, "sender": "3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN", "senderPublicKey": "2SGdJb3x9Ak59xjRyHMHFxLvh6dC5m37urdsBJy3f6TU", "proofs": [ "4Fx6A6Wg323hm9Mwi5MuRWZ76yLrj3F7CrkrVGTXmszfWX9Vv2gndcYJrQeaEvEuQjBMxS3pf7t6K7QZeGRzmy9o", "GhDeXNb3CmBSFqLa3cs4mwR2tV8sSzUPRTyXP68XApuYQ2EuniBf3Q1ifjq5uDj66aGfkWvJYyR2aheZNpUovmQ" ], "script": "base64:AAIFAAAAAAAAEJcIAhIAEgMKAQESBAoCAQESABIECgIBARIAEgASAwoBARIFCgMEAQgSABoRCgFBEgxhZG1pblB1YktleTMaEQoBQhIMYWRtU3RhcnRTdG9wGg8KAUMSCmFkbVN0YWtpbmcaDAoBRBIHZ292QWRkchoJCgFFEgRVU0ROGgkKAUYSBEVVUk4aEgoBRxINc3Rha2luZ0Fzc2V0cxobCgFIEhZzdGFraW5nVVNETk5TQlRBZGRyZXNzGhcKAUkSEnN0YWtpbmdFVVJOQWRkcmVzcxoNCgFKEghpc0FjdGl2ZRoQCgFLEgtzdHJBc3NldElkQRoQCgFMEgtzdHJBc3NldElkQhoNCgFNEghhc3NldElkQRoNCgFOEghhc3NldElkQhoPCgFPEgphc3NldE5hbWVBGgcKAVASAmlkGgoKAVESBXdhdmVzGg8KAVISCmFzc2V0TmFtZUIaDQoBUxIIYmFsYW5jZUEaDQoBVBIIYmFsYW5jZUIaEQoBVRIMc2hhcmVBc3NldElkGhUKAVYSEHNoYXJlQXNzZXRTdXBwbHkaDgoBVxIJaW52YXJpYW50GggKAVgSA2ZlZRoSCgFZEg1mZWVHb3Zlcm5hbmNlGg4KAVoSCWZlZVNjYWxlNhoMCgFhEgd2ZXJzaW9uGhMKAmFBEg1pbnZhcmlhbnRDYWxjGggKAmFCEgJzaxoZCgJhQxITY2FsY3VsYXRlU2VuZEFtb3VudBobCgJhRBIVYW1vdW50VG9TZW5kRXN0aW1hdGVkGhsKAmFFEhVtaW5Ub2tlblJlY2VpdmVBbW91bnQaGAoCYUYSEnRva2VuUmVjZWl2ZUFtb3VudBoNCgJhRxIHdG9rZW5JZBoTCgJhSBINc2xpcHBhZ2VWYWx1ZRokCgJhSRIeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlGhIKAmFKEgxpbnZhcmlhbnROZXcaHQoCYUsSF2ludmFyaWFudEVzdGltYXRlZFJhdGlvGhMKAmFMEg1nZXRTdGVwQW1vdW50GgkKAmFNEgNhY2MaCgoCYU4SBHN0ZXAaEgoCYU8SDGFtb3VudFRvU2VuZBoTCgJhUBINc3RlcEludmFyaWFudBoQCgJhURIKc3RlcEFtb3VudBoICgJhUhICJGwaCAoCYVMSAiRzGgsKAmFUEgUkYWNjMBoLCgJhVRIFJGYwXzEaCAoCYVYSAiRhGggKAmFXEgIkaRoLCgJhWBIFJGYwXzIaEgoCYVkSDGdldEFzc2V0SW5mbxoOCgJhWhIIc3RyaW5nSWQaDAoCYWESBnNjYWxlMxoMCgJhYhIGc2NhbGU4Gg0KAmFjEgdzY2FsZTEyGhQKAmFkEg5zbGlwcGFnZVNjYWxlMxoNCgJhZRIHZGlnaXRzOBoTCgJhZhINZEFwcFRocmVzaG9sZBoZCgJhZxITZEFwcFRocmVzaG9sZFNjYWxlMhobCgJhaBIVZXhjaGFuZ2VSYXRpb0xpbWl0TWluGhsKAmFpEhVleGNoYW5nZVJhdGlvTGltaXRNYXgaCwoCYWoSBWFscGhhGhEKAmFrEgthbHBoYURpZ2l0cxoKCgJhbBIEYmV0YRoUCgJhbRIOYWNjb3VudEJhbGFuY2UaDQoCYW4SB2Fzc2V0SWQaEgoCYW8SDHN0YWtlZEFtb3VudBocCgJhcBIWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZBoJCgJhcRIDYUlkGgcKAmFyEgFpGhMKAmFzEg1zdGFrZWRBbW91bnRBGhMKAmF0Eg1zdGFrZWRBbW91bnRCGh8KAmF1EhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBGh8KAmF2EhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCGhYKAmF3EhBoYXNFbm91Z2hCYWxhbmNlGg4KAmF4Eghza2V3bmVzcxoHCgJheRIBeBoHCgJhehIBeRoNCgFiEghrVmVyc2lvbhoRCgJiQRILJHQwOTMxMzkzOTAaFAoCYkISDnBtdFN0ckFzc2V0SWRBGhMKAmJDEg1wbXRBc3NldE5hbWVBGhIKAmJEEgxwbXREZWNpbWFsc0EaEQoCYkUSCyR0MDkzOTU5NDcyGhQKAmJGEg5wbXRTdHJBc3NldElkQhoTCgJiRxINcG10QXNzZXROYW1lQhoSCgJiSBIMcG10RGVjaW1hbHNCGg8KAmJJEglzaGFyZU5hbWUaFgoCYkoSEHNoYXJlRGVzY3JpcHRpb24aEwoCYksSDXNoYXJlRGVjaW1hbHMaGAoCYkwSEnNoYXJlSW5pdGlhbFN1cHBseRoQCgJiTRIKc2hhcmVJc3N1ZRoSCgJiThIMc2hhcmVJc3N1ZUlkGhkKAmJPEhNpbnZhcmlhbnRDYWxjdWxhdGVkGgwKAmJQEgZzdGFrZTEaDAoCYlESBnN0YWtlMhoXCgJiUhIRc2xpcHBhZ2VUb2xlcmFuY2UaEwoCYlMSDSR0MDExOTkyMTIwNjkaEwoCYlQSDSR0MDEyMDc0MTIyNjgaEAoCYlUSCnRva2VuUmF0aW8aGQoCYlYSE3JhdGlvU2hhcmVUb2tlbnNJbkEaGQoCYlcSE3JhdGlvU2hhcmVUb2tlbnNJbkIaGwoCYlgSFXNoYXJlVG9rZW5Ub1BheUFtb3VudBoZCgJiWRITdmlydHVhbFN3YXBUb2tlblBheRoZCgJiWhITdmlydHVhbFN3YXBUb2tlbkdldBoKCgJiYRIEaW5mbxoNCgJiYhIHc3VzcGVuZBoLCgJiYxIFY2F1c2UaEwoCYmQSDXRocm93SXNBY3RpdmUaFQoCYmUSD3Rocm93SXNJbmFjdGl2ZRoUCgJiZhIOdGhyb3dPbmx5QWRtaW4aEQoCYmcSC3Rocm93QXNzZXRzGhQKAmJoEg50aHJvd1RocmVzaG9sZBoPCgJiaRIJdGhyZXNob2xkGg0KAmJqEgdhbW91bnRBGg0KAmJrEgdhbW91bnRCGhcKAmJsEhFzdXNwZW5kU3VzcGljaW91cxoeCgJibRIYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzGgsKAmJuEgVzdGFrZRoXCgJibxIRY2FsY1N0YWtpbmdQYXJhbXMaDAoCYnASBmFtb3VudBoRCgJicRILJHQwODgyNjg4OTIaCgoCYnISBGNhbGwaEQoCYnMSC3N0YWtpbmdBZGRyGhEKAmJ0EgskdDA4OTc4OTA0NBoRCgJidRILJHQwOTE0OTkyMjYaEAoCYnYSCnBtdEFtb3VudEEaEQoCYncSC3BtdEFzc2V0SWRBGhEKAmJ4EgskdDA5MjMxOTMwOBoQCgJieRIKcG10QW1vdW50QhoRCgJiehILcG10QXNzZXRJZEIaDAoBYxIHa0FjdGl2ZRoeCgJjQRIYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlGhgKAmNCEhJtaW5BbW91bnRUb1JlY2VpdmUaEwoCY0MSDSR0MDIwMzgwMjA0NTUaEQoCY0QSC3NlbmRBc3NldElkGhYKAmNFEhBnb3Zlcm5hbmNlUmV3YXJkGhQKAmNGEg5hbW91bnRNaW51c0ZlZRoTCgJjRxINJHQwMjE4NzcyMjEzORoTCgJjSBINJHQwMjI0MzcyMjUxMBoTCgJjSRINJHQwMjI1MjMyMjYwMBoUCgJjShIOc2VuZFN0ckFzc2V0SWQaEwoCY0sSDXNlbmRBc3NldE5hbWUaEgoCY0wSDHNlbmREZWNpbWFscxoRCgJjTRILYW1vdW50TGVhdmUaEgoCY04SDHVuY291bnRhYmxlQRoSCgJjTxIMdW5jb3VudGFibGVCGhMKAmNQEg1hbW91bnRFbnJvbGxBGhMKAmNREg1hbW91bnRFbnJvbGxCGhMKAmNSEg1hc3NldElkU3RyaW5nGhMKAmNTEg0kdDAyNTkyMDI2MDIzGgoKAmNUEgRhZGRyGgwKAmNVEgZwYXJhbXMaDgoCY1YSCHBheW1lbnRzGgkKAmNXEgNpbnYaCAoCY1gSAnR4GgwKAmNZEgZ2ZXJpZnkaGQoCY1oSE211bHRpU2lnbmVkQnlBZG1pbnMaEwoCY2ESDSR0MDE0NTY3MTQ2NDIaDwoCY2ISCXBtdEFtb3VudBoQCgJjYxIKcG10QXNzZXRJZBoTCgJjZBINJHQwMTQ2NDcxNDcyMBoTCgJjZRINcG10U3RyQXNzZXRJZBoSCgJjZhIMcG10QXNzZXROYW1lGhEKAmNnEgtwbXREZWNpbWFscxoVCgJjaBIPcG10TWluVGhyZXNob2xkGiMKAmNpEh10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZRoPCgJjahIJdG9sZXJhbmNlGiIKAmNrEhxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoGiIKAmNsEhxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoGh0KAmNtEhdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcBoTCgJjbhINJHQwMTU3MzIxNjQ5NxoXCgJjbxIRdmlydHVhbFJlcGxlbmlzaEEaFwoCY3ASEXZpcnR1YWxSZXBsZW5pc2hCGhcKAmNxEhFiYWxhbmNlQWZ0ZXJTd2FwQRoXCgJjchIRYmFsYW5jZUFmdGVyU3dhcEIaEQoCY3MSC25ld0JhbGFuY2VBGhEKAmN0EgtuZXdCYWxhbmNlQhoVCgJjdRIPbmV3QmFsYW5jZUVudHJ5GisKAmN2EiVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoGhkKAmN3EhNkQXBwVGhyZXNob2xkQW1vdW50GhMKAmN4Eg0kdDAxODcyMzE4ODY2GhIKAmN5EgxhbW91bnRUb1BheUEaEgoCY3oSDGFtb3VudFRvUGF5QhoOCgFkEglrQXNzZXRJZEEaGAoCZGESEmFkbWluUHViS2V5MVNpZ25lZBoYCgJkYhISYWRtaW5QdWJLZXkyU2lnbmVkGhgKAmRjEhJhZG1pblB1YktleTNTaWduZWQaGQoCZGQSE2NhbGxUYWtlSW50b0FjY291bnQaEwoCZGUSDXNpZ25lZEJ5QWRtaW4aDgoBZRIJa0Fzc2V0SWRCGg4KAWYSCWtCYWxhbmNlQRoOCgFnEglrQmFsYW5jZUIaEgoBaBINa1NoYXJlQXNzZXRJZBoWCgFpEhFrU2hhcmVBc3NldFN1cHBseRoJCgFqEgRrRmVlGhcKAWsSEmtGZWVTY2FsZURlbGltaXRlchoPCgFsEgprSW52YXJpYW50GgsKAW0SBmtDYXVzZRoXCgFuEhJrZXlVU0ROTlNCVEFkZHJlc3MaEwoBbxIOa2V5RVVSTkFkZHJlc3MaFAoBcBIPa2V5QWRtaW5QdWJLZXkxGhQKAXESD2tleUFkbWluUHViS2V5MhoUCgFyEg9rZXlBZG1pblB1YktleTMaCwoBcxIGb3JhY2xlGhAKAXQSC2dldEFkbWluUHViGhAKAXUSC2tleUFkbWluUHViGgwKAXYSByRtYXRjaDAaCwoBdxIGc3RyaW5nGgwKAXgSB25vdGhpbmcaEQoBeRIMYWRtaW5QdWJLZXkxGhEKAXoSDGFkbWluUHViS2V5MgAAAE4AAAAAAWECAAAABTIuMC4wAAAAAAFiAgAAAAd2ZXJzaW9uAAAAAAFjAgAAAAZhY3RpdmUAAAAAAWQCAAAACkFfYXNzZXRfaWQAAAAAAWUCAAAACkJfYXNzZXRfaWQAAAAAAWYCAAAAD0FfYXNzZXRfYmFsYW5jZQAAAAABZwIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAAFoAgAAAA5zaGFyZV9hc3NldF9pZAAAAAABaQIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAAFqAgAAAApjb21taXNzaW9uAAAAAAFrAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAABbAIAAAAJaW52YXJpYW50AAAAAAFtAgAAAA5zaHV0ZG93bl9jYXVzZQAAAAABbgIAAAAYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAAAAAFvAgAAABRzdGFraW5nX2V1cm5fYWRkcmVzcwAAAAABcAIAAAALYWRtaW5fcHViXzEAAAAAAXECAAAAC2FkbWluX3B1Yl8yAAAAAAFyAgAAAAthZG1pbl9wdWJfMwAAAAABcwkBAAAAB0FkZHJlc3MAAAABAQAAABoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAEAAAABdAAAAAEAAAABdQQAAAABdgkABB0AAAACBQAAAAFzBQAAAAF1AwkAAAEAAAACBQAAAAF2AgAAAAZTdHJpbmcEAAAAAXcFAAAAAXYJAAJZAAAAAQUAAAABdwQAAAABeAUAAAABdgkAAAIAAAABAgAAABlBZG1pbiBwdWJsaWMga2V5IGlzIGVtcHR5AAAAAAF5CQEAAAABdAAAAAEFAAAAAXAAAAAAAXoJAQAAAAF0AAAAAQUAAAABcQAAAAABQQkBAAAAAXQAAAABBQAAAAFyAAAAAAFCAQAAACAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAAAAABQwEAAAAgBM915WTQwQ9OZ7kfE2TEGg3qhCRCMX0zkF1AWAqdk0oAAAAAAUQJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVTfPUuXiVhZ3hXg5FELVt09el+9tX+FIYkAAAAAAUUBAAAAIG8ko8qrMNxSKZjoLGFa7lp/I03CLXW76Z2qVODS0AfBAAAAAAFGAQAAACDEBNrfWg9GtjhLPk7lWPJ8KP+tqxyRMJicySw438SSvwAAAAABRwkABEwAAAACCQACWAAAAAEFAAAAAUUJAARMAAAAAgkAAlgAAAABBQAAAAFGBQAAAANuaWwAAAAAAUgJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAABcwUAAAABbgIAAAAXbm8gdXNkbiBzdGFraW5nIGFkZHJlc3MAAAAAAUkJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAABcwUAAAABbwIAAAAXbm8gdXNkbiBzdGFraW5nIGFkZHJlc3MAAAAAAUoJAQAAABFAZXh0ck5hdGl2ZSgxMDUxKQAAAAIFAAAABHRoaXMFAAAAAWMAAAAAAUsJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAAAWQAAAAAAUwJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAAAWUAAAAAAU0DCQAAAAAAAAIFAAAAAUsCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAAAUsAAAAAAU4DCQAAAAAAAAIFAAAAAUwCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAAAUwAAAAAAU8EAAAAAXYFAAAAAU0DCQAAAQAAAAIFAAAAAXYCAAAACkJ5dGVWZWN0b3IEAAAAAVAFAAAAAXYICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAAVAAAAAEbmFtZQMJAAABAAAAAgUAAAABdgIAAAAEVW5pdAQAAAABUQUAAAABdgIAAAAFV0FWRVMJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IAAAAAAVIEAAAAAXYFAAAAAU4DCQAAAQAAAAIFAAAAAXYCAAAACkJ5dGVWZWN0b3IEAAAAAVAFAAAAAXYICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAAVAAAAAEbmFtZQMJAAABAAAAAgUAAAABdgIAAAAEVW5pdAQAAAABUQUAAAABdgIAAAAFV0FWRVMJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IAAAAAAVMJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAAAWYAAAAAAVQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAAAWcAAAAAAVUJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAABaAAAAAABVgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAABaQAAAAABVwkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAABbAAAAAABWAAAAAAAAAAB9AAAAAABWQAAAAAAAAAAyAAAAAABWgAAAAAAAA9CQAAAAAACYWEAAAAAAAAAA+gAAAAAAmFiAAAAAAAF9eEAAAAAAAJhYwAAAADo1KUQAAAAAAACYWQAAAAAAAAAA+gAAAAAAmFlAAAAAAAAAAAIAAAAAAJhZgAAAAAAAAAAMgAAAAACYWcAAAAAAAAAAGQAAAAAAmFoAAAAAAAFXUqAAAAAAAJhaQAAAAAABo53gAAAAAACYWoAAAAAAAAAADIAAAAAAmFrAAAAAAAAAAACAAAAAAJhbAAAAAAAAr3ngAEAAAACYW0AAAABAAAAAmFuBAAAAAF2BQAAAAJhbgMJAAABAAAAAgUAAAABdgIAAAAKQnl0ZVZlY3RvcgQAAAABUAUAAAABdgkAA/AAAAACBQAAAAR0aGlzBQAAAAFQAwkAAAEAAAACBQAAAAF2AgAAAARVbml0BAAAAAFRBQAAAAF2CAkAA+8AAAABBQAAAAR0aGlzAAAACWF2YWlsYWJsZQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAACYW8AAAABAAAAAmFuBAAAAAJhcAQAAAABdgUAAAACYW4DCQAAAQAAAAIFAAAAAXYCAAAACkJ5dGVWZWN0b3IEAAAAAmFxBQAAAAF2AwkAAAAAAAACBQAAAAJhcQUAAAABRQkABBoAAAACBQAAAAFICQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxycGRfYmFsYW5jZV8JAAJYAAAAAQUAAAACYXECAAAAAV8JAAQlAAAAAQUAAAAEdGhpcwMJAAAAAAAAAgUAAAACYXEFAAAAAUYJAAQaAAAAAgUAAAABSQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAYJXMlcyVzX19zdGFraW5nQmFsYW5jZV9fCQACWAAAAAEFAAAAAmFxAgAAAAJfXwkABCUAAAABBQAAAAR0aGlzAAAAAAAAAAAAAwkAAAEAAAACBQAAAAF2AgAAAARVbml0AAAAAAAAAAAACQAAAgAAAAECAAAAC01hdGNoIGVycm9yBAAAAAF2BQAAAAJhcAMJAAABAAAAAgUAAAABdgIAAAADSW50BAAAAAJhcgUAAAABdgUAAAACYXIAAAAAAAAAAAAAAAAAAmFzCQEAAAACYW8AAAABBQAAAAFNAAAAAAJhdAkBAAAAAmFvAAAAAQUAAAABTgAAAAACYXUJAABkAAAAAgkBAAAAAmFtAAAAAQUAAAABTQUAAAACYXMAAAAAAmF2CQAAZAAAAAIJAQAAAAJhbQAAAAEFAAAAAU4FAAAAAmF0AAAAAAJhdwMJAABnAAAAAgUAAAACYXUFAAAAAVMJAABnAAAAAgUAAAACYXYFAAAAAVQHAQAAAAJheAAAAAIAAAACYXkAAAACYXoJAABpAAAAAgkAAGkAAAACCQAAZAAAAAIJAABrAAAAAwUAAAACYWMFAAAAAmF5BQAAAAJhegkAAGsAAAADBQAAAAJhYwUAAAACYXoFAAAAAmF5AAAAAAAAAAACAAAAAAAAACcQAQAAAAJhQQAAAAIAAAACYXkAAAACYXoEAAAAAmFCCQEAAAACYXgAAAACBQAAAAJheQUAAAACYXoJAABkAAAAAgkAAGsAAAADCQAAZAAAAAIFAAAAAmF5BQAAAAJhegUAAAACYWIJAABsAAAABgUAAAACYUIFAAAAAmFlBQAAAAJhagUAAAACYWsFAAAAAmFlBQAAAAdDRUlMSU5HCQAAaAAAAAIAAAAAAAAAAAIJAABrAAAAAwkAAGwAAAAGCQAAawAAAAMFAAAAAmF5BQAAAAJhegUAAAACYWIAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAEJAABpAAAAAgUAAAACYWUAAAAAAAAAAAIFAAAABERPV04JAABsAAAABgkAAGUAAAACBQAAAAJhQgUAAAACYWwFAAAAAmFlBQAAAAJhagUAAAACYWsFAAAAAmFlBQAAAARET1dOBQAAAAJhYgEAAAACYUMAAAAEAAAAAmFEAAAAAmFFAAAAAmFGAAAAAmFHBAAAAAJhSAkAAGUAAAACBQAAAAJhYgkAAGkAAAACCQAAaAAAAAIFAAAAAmFiAAAAAAAAAAABAAAAAAAAmJaABAAAAAJhSQkAAGUAAAACBQAAAAJhRAUAAAACYUUEAAAAAmF5CQAAZAAAAAIFAAAAAVMFAAAAAmFGBAAAAAJhegkAAGQAAAACBQAAAAFUBQAAAAJhRgQAAAACYUoDCQAAAAAAAAIFAAAAAmFHBQAAAAFNCQEAAAACYUEAAAACBQAAAAJheQkAAGUAAAACBQAAAAFUBQAAAAJhRAMJAAAAAAAAAgUAAAACYUcFAAAAAU4JAQAAAAJhQQAAAAIJAABlAAAAAgUAAAABUwUAAAACYUQFAAAAAmF6CQAAAgAAAAECAAAAFldyb25nIGFzc2V0IGluIHBheW1lbnQEAAAAAmFLCQAAawAAAAMFAAAAAmFiBQAAAAFXBQAAAAJhSgoBAAAAAmFMAAAAAgAAAAJhTQAAAAJhTgMJAAAAAAAAAgUAAAACYU0A//////////8EAAAAAmFPCQAAZQAAAAIFAAAAAmFECQAAaQAAAAIJAABoAAAAAgUAAAACYU4FAAAAAmFJAAAAAAAAAAAFBAAAAAJhUAMJAAAAAAAAAgUAAAACYUcFAAAAAU0JAQAAAAJhQQAAAAIFAAAAAmF5CQAAZQAAAAIFAAAAAVQFAAAAAmFPCQEAAAACYUEAAAACCQAAZQAAAAIFAAAAAVMFAAAAAmFPBQAAAAJhegMJAABmAAAAAgUAAAACYVAFAAAAAVcFAAAAAmFPAP//////////BQAAAAJhTQQAAAACYVEKAAAAAAJhUgkABEwAAAACAAAAAAAAAAABCQAETAAAAAIAAAAAAAAAAAIJAARMAAAAAgAAAAAAAAAAAwkABEwAAAACAAAAAAAAAAAECQAETAAAAAIAAAAAAAAAAAUFAAAAA25pbAoAAAAAAmFTCQABkAAAAAEFAAAAAmFSCgAAAAACYVQA//////////8KAQAAAAJhVQAAAAIAAAACYVYAAAACYVcDCQAAZwAAAAIFAAAAAmFXBQAAAAJhUwUAAAACYVYJAQAAAAJhTAAAAAIFAAAAAmFWCQABkQAAAAIFAAAAAmFSBQAAAAJhVwoBAAAAAmFYAAAAAgAAAAJhVgAAAAJhVwMJAABnAAAAAgUAAAACYVcFAAAAAmFTBQAAAAJhVgkAAAIAAAABAgAAABNMaXN0IHNpemUgZXhjZWVkcyA1CQEAAAACYVgAAAACCQEAAAACYVUAAAACCQEAAAACYVUAAAACCQEAAAACYVUAAAACCQEAAAACYVUAAAACCQEAAAACYVUAAAACBQAAAAJhVAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQMJAABmAAAAAgAAAAAAAAAAAAUAAAACYVEJAAACAAAAAQIAAAA0c29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hpbGUgd29ya2luZyB3aXRoIGFtb3VudFRvU2VuZAMDCQAAZgAAAAIFAAAAAmFLBQAAAAJhSAkAAGYAAAACBQAAAAJhSgUAAAABVwcFAAAAAmFEBQAAAAJhUQEAAAACYVkAAAABAAAAAmFuBAAAAAF2BQAAAAJhbgMJAAABAAAAAgUAAAABdgIAAAAKQnl0ZVZlY3RvcgQAAAABUAUAAAABdgQAAAACYVoJAAJYAAAAAQUAAAABUAQAAAACYmEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAFQCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgBQAAAAJhWgIAAAAOIGRvZXNuJ3QgZXhpc3QJAAUVAAAAAwUAAAACYVoIBQAAAAJiYQAAAARuYW1lCAUAAAACYmEAAAAIZGVjaW1hbHMDCQAAAQAAAAIFAAAAAXYCAAAABFVuaXQEAAAAAVEFAAAAAXYJAAUVAAAAAwIAAAAFV0FWRVMCAAAABVdBVkVTAAAAAAAAAAAICQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAJiYgAAAAEAAAACYmMJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAAWMHCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAAW0FAAAAAmJjBQAAAANuaWwBAAAAAmJkAAAAAAkAAAIAAAABAgAAABZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAQAAAAJiZQAAAAAJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEAAAACYmYAAAAACQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEAAAACYmcAAAAACQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAAUsCAAAABSBhbmQgBQAAAAFMAQAAAAJiaAAAAAMAAAACYmkAAAACYmoAAAACYmsJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAA5TmV3IGJhbGFuY2UgaW4gYXNzZXRzIG9mIHRoZSBEQXBwIGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQgCQABpAAAAAEFAAAAAmJpAgAAAAI6IAkAAaQAAAABBQAAAAJiagIAAAABIAUAAAABTwIAAAACLCAJAAGkAAAAAQUAAAACYmsCAAAAASAFAAAAAVIBAAAAAmJsAAAAAAkBAAAAAmJiAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAjU3VzcGljaW91cyBzdGF0ZS4gQWN0dWFsIGJhbGFuY2VzOiAJAAGkAAAAAQUAAAABUwIAAAABIAUAAAABTwIAAAACLCAJAAGkAAAAAQUAAAABVAIAAAABIAUAAAABUgIAAAAJLiBTdGF0ZTogCQABpAAAAAEJAQAAAAJhbQAAAAEFAAAAAU0CAAAAASAFAAAAAU8CAAAAAiwgCQABpAAAAAEJAQAAAAJhbQAAAAEFAAAAAU4CAAAAASAFAAAAAVIBAAAAAmJtAAAAAgAAAAJibgAAAAJhbgMFAAAAAmJuAwkAAAAAAAACBQAAAAJhbgUAAAABRQkABRQAAAACAgAAAAxsb2NrTmV1dHJpbm8FAAAAAUgJAAUUAAAAAgIAAAAMc3RhcnRTdGFraW5nBQAAAAFJAwkAAAAAAAACBQAAAAJhbgUAAAABRQkABRQAAAACAgAAAA51bmxvY2tOZXV0cmlubwUAAAABSAkABRQAAAACAgAAAAtzdG9wU3Rha2luZwUAAAABSQEAAAACYm8AAAADAAAAAmJuAAAAAmJwAAAAAmFuAwUAAAACYm4EAAAAAmJxCQEAAAACYm0AAAACBQAAAAJibgUAAAACYW4EAAAAAmJyCAUAAAACYnEAAAACXzEEAAAAAmJzCAUAAAACYnEAAAACXzIJAAUWAAAABAUAAAACYnIFAAAAAmJzBQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAAAmFuBQAAAAJicAUAAAADbmlsBAAAAAJidAkBAAAAAmJtAAAAAgUAAAACYm4FAAAAAmFuBAAAAAJicggFAAAAAmJ0AAAAAl8xBAAAAAJicwgFAAAAAmJ0AAAAAl8yCQAFFgAAAAQFAAAAAmJyBQAAAAJicwkABEwAAAACBQAAAAJicAkABEwAAAACCQACWAAAAAEFAAAAAmFuBQAAAANuaWwFAAAAA25pbAAAAAoAAAACYXIBAAAABGluaXQAAAAABAAAAAJidQkABRQAAAACCAkAAZEAAAACCAUAAAACYXIAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAACYXIAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAACYnYIBQAAAAJidQAAAAJfMQQAAAACYncIBQAAAAJidQAAAAJfMgQAAAACYngJAAUUAAAAAggJAAGRAAAAAggFAAAAAmFyAAAACHBheW1lbnRzAAAAAAAAAAABAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAmFyAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAAAmJ5CAUAAAACYngAAAACXzEEAAAAAmJ6CAUAAAACYngAAAACXzIEAAAAAmJBCQEAAAACYVkAAAABBQAAAAJidwQAAAACYkIIBQAAAAJiQQAAAAJfMQQAAAACYkMIBQAAAAJiQQAAAAJfMgQAAAACYkQIBQAAAAJiQQAAAAJfMwQAAAACYkUJAQAAAAJhWQAAAAEFAAAAAmJ6BAAAAAJiRggFAAAAAmJFAAAAAl8xBAAAAAJiRwgFAAAAAmJFAAAAAl8yBAAAAAJiSAgFAAAAAmJFAAAAAl8zAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQbAAAAAgUAAAAEdGhpcwUAAAABYwkBAAAAAmJkAAAAAAMJAAAAAAAAAgUAAAACYncFAAAAAmJ6CQAAAgAAAAECAAAAGEFzc2V0cyBtdXN0IGJlIGRpZmZlcmVudAQAAAACYkkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAAXMJAAEvAAAAAgUAAAACYkMAAAAAAAAAAAcCAAAAAV8JAAEvAAAAAgUAAAACYkcAAAAAAAAAAAcEAAAAAmJKCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAiU2hhcmVUb2tlbiBvZiBTd29wRmkgcHJvdG9jb2wgZm9yIAUAAAACYkMCAAAABSBhbmQgBQAAAAJiRwIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAABHRoaXMEAAAAAmJLCQAAaQAAAAIJAABkAAAAAgUAAAACYkQFAAAAAmJIAAAAAAAAAAACBAAAAAJiTAkAAGsAAAADCQAAbAAAAAYFAAAAAmJ2BQAAAAJiRAAAAAAAAAAABQAAAAAAAAAAAQUAAAACYkQFAAAABERPV04JAABsAAAABgUAAAACYnkFAAAAAmJIAAAAAAAAAAAFAAAAAAAAAAABBQAAAAJiSAUAAAAERE9XTgkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAAAJiSwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAERE9XTgQAAAACYk0JAARCAAAABQUAAAACYkkFAAAAAmJKBQAAAAJiTAUAAAACYksGBAAAAAJiTgkABDgAAAABBQAAAAJiTQQAAAACYk8JAQAAAAJhQQAAAAIFAAAAAmJ2BQAAAAJieQQAAAACYlADCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAABRwUAAAACYkIJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAAAmJ2CQAETAAAAAIFAAAAAmJCBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAACYlAFAAAAAmJQBAAAAAJiUQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAFHBQAAAAJiRgkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAACYnkJAARMAAAAAgUAAAACYkYFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAJiUQUAAAACYlEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAABYgUAAAABYQkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAABYwYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAABZAUAAAACYkIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAABZQUAAAACYkYJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWYFAAAAAmJ2CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAFnBQAAAAJieQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAABbAUAAAACYk8JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWoFAAAAAVgJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWsFAAAAAVoJAARMAAAAAgUAAAACYk0JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAABaAkAAlgAAAABBQAAAAJiTgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAABaQUAAAACYkwJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAmFyAAAABmNhbGxlcgUAAAACYkwFAAAAAmJOBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAJhcgEAAAAWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwAAAAEAAAACYlIEAAAAAmJ3CAkAAZEAAAACCAUAAAACYXIAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAACYnoICQABkQAAAAIIBQAAAAJhcgAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAdhc3NldElkBAAAAAJidggJAAGRAAAAAggFAAAAAmFyAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAQAAAACYnkICQABkQAAAAIIBQAAAAJhcgAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAZhbW91bnQEAAAAAmJTCQEAAAACYVkAAAABBQAAAAJidwQAAAACYkIIBQAAAAJiUwAAAAJfMQQAAAACYkMIBQAAAAJiUwAAAAJfMgQAAAACYkQIBQAAAAJiUwAAAAJfMwQAAAACYlQJAQAAAAJhWQAAAAEFAAAAAmJ6BAAAAAJiRggFAAAAAmJUAAAAAl8xBAAAAAJiRwgFAAAAAmJUAAAAAl8yBAAAAAJiSAgFAAAAAmJUAAAAAl8zBAAAAAJiVQkAAGsAAAADCQAAawAAAAMFAAAAAmFiBQAAAAFTBQAAAAJidgUAAAACYWEJAABrAAAAAwUAAAACYWIFAAAAAVQFAAAAAmJ5BAAAAAJiVgkAAGsAAAADBQAAAAJhYgUAAAACYnYFAAAAAVMEAAAAAmJXCQAAawAAAAMFAAAAAmFiBQAAAAJieQUAAAABVAQAAAACYlgJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAAmJWCQAETAAAAAIFAAAAAmJXBQAAAANuaWwFAAAAAVYFAAAAAmFiBAAAAAJiTwkBAAAAAmFBAAAAAgkAAGQAAAACBQAAAAFTBQAAAAJidgkAAGQAAAACBQAAAAFUBQAAAAJieQMJAQAAAAEhAAAAAQUAAAABSgkBAAAAAmJlAAAAAAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAAmJSBgkAAGYAAAACBQAAAAJiUgAAAAAAAAAACgkAAAIAAAABAgAAACBTbGlwcGFnZSB0b2xlcmFuY2UgbXVzdCBiZSA8PSAxJQMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAmFyAAAACHBheW1lbnRzAAAAAAAAAAACCQAAAgAAAAECAAAAHFR3byBhdHRhY2hlZCBhc3NldHMgZXhwZWN0ZWQDAwkBAAAAAiE9AAAAAgUAAAACYncFAAAAAU0GCQEAAAACIT0AAAACBQAAAAJiegUAAAABTgkBAAAAAmJnAAAAAAMDCQAAZgAAAAIJAABpAAAAAgkAAGgAAAACBQAAAAJhYQkAAGUAAAACBQAAAAJhZAUAAAACYlIFAAAAAmFkBQAAAAJiVQYJAABmAAAAAgUAAAACYlUJAABpAAAAAgkAAGgAAAACBQAAAAJhYQkAAGQAAAACBQAAAAJhZAUAAAACYlIFAAAAAmFkCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DCQAAAAAAAAIFAAAAAmJYAAAAAAAAAAAACQAAAgAAAAECAAAAHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkBAAAAASEAAAABBQAAAAJhdwkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAJhcgAAAAZjYWxsZXIFAAAAAmJ2BQAAAAJidwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAACYXIAAAAGY2FsbGVyBQAAAAJieQUAAAACYnoFAAAAA25pbAkBAAAAAmJsAAAAAAQAAAACYlADCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAABRwUAAAACYkIJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAAAmJ2CQAETAAAAAIFAAAAAmJCBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAACYlAFAAAAAmJQBAAAAAJiUQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAFHBQAAAAJiRgkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAACYnkJAARMAAAAAgUAAAACYkYFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAJiUQUAAAACYlEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWYJAABkAAAAAgUAAAABUwUAAAACYnYJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWcJAABkAAAAAgUAAAABVAUAAAACYnkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWkJAABkAAAAAgUAAAABVgUAAAACYlgJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWwFAAAAAmJPCQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAABVQUAAAACYlgGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAJhcgAAAAZjYWxsZXIFAAAAAmJYBQAAAAFVBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAJhcgEAAAAVcmVwbGVuaXNoV2l0aE9uZVRva2VuAAAAAgAAAAJiWQAAAAJiWgQAAAACY2EJAAUUAAAAAggJAAGRAAAAAggFAAAAAmFyAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAmFyAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAAAmNiCAUAAAACY2EAAAACXzEEAAAAAmNjCAUAAAACY2EAAAACXzIEAAAAAmNkCQEAAAACYVkAAAABBQAAAAJjYwQAAAACY2UIBQAAAAJjZAAAAAJfMQQAAAACY2YIBQAAAAJjZAAAAAJfMgQAAAACY2cIBQAAAAJjZAAAAAJfMwQAAAACY2gAAAAAAABMS0AEAAAAAmNpAAAAAAAC+vCABAAAAAJjagMJAABmAAAAAgUAAAACY2kFAAAAAmNiAAAAAAAAAYagAAAAAAAAAAABBAAAAAJjawkAAGUAAAACBQAAAAJhYgkAAGkAAAACCQAAaAAAAAIFAAAAAmFiBQAAAAJjagAAAAAAAJiWgAQAAAACY2wJAABkAAAAAgUAAAACYWIJAABpAAAAAgkAAGgAAAACBQAAAAJhYgUAAAACY2oAAAAAAACYloAEAAAAAmNtCQAAZQAAAAIFAAAAAmFiCQAAaQAAAAIJAABoAAAAAgUAAAACYWIAAAAAAAAAAAEAAAAAAACYloADCQEAAAABIQAAAAEFAAAAAUoJAQAAAAJiZQAAAAADCQAAZgAAAAIFAAAAAmNoBQAAAAJjYgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1BheW1lbnQgYW1vdW50IAkAAaQAAAABBQAAAAJjYgIAAAAnIGRvZXMgbm90IGV4Y2VlZCB0aGUgbWluaW11bSBhbW91bnQgb2YgCQABpAAAAAEFAAAAAmNoAgAAAAcgdG9rZW5zAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAACYXIAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAABIQAAAAEFAAAAAmF3CQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAmFyAAAABmNhbGxlcgUAAAACY2IFAAAAAmNjBQAAAANuaWwJAQAAAAJibAAAAAADAwkBAAAAAiE9AAAAAgUAAAACY2MFAAAAAU0JAQAAAAIhPQAAAAIFAAAAAmNjBQAAAAFOBwkBAAAAAmJnAAAAAAQAAAACY24DCQAAAAAAAAIFAAAAAmNjBQAAAAFNCQAFGQAAAAcJAABlAAAAAgUAAAACY2IFAAAAAmJZBQAAAAJiWgkAAGQAAAACBQAAAAFTBQAAAAJiWQkAAGUAAAACBQAAAAFUBQAAAAJiWgkBAAAAAmFBAAAAAgkAAGQAAAACBQAAAAFTBQAAAAJjYgUAAAABVAkAAGQAAAACBQAAAAFTBQAAAAJjYgUAAAABVAkABRkAAAAHBQAAAAJiWgkAAGUAAAACBQAAAAJjYgUAAAACYlkJAABlAAAAAgUAAAABUwUAAAACYloJAABkAAAAAgUAAAABVAUAAAACYlkJAQAAAAJhQQAAAAIFAAAAAVMJAABkAAAAAgUAAAABVAUAAAACY2IFAAAAAVMJAABkAAAAAgUAAAABVAUAAAACY2IEAAAAAmNvCAUAAAACY24AAAACXzEEAAAAAmNwCAUAAAACY24AAAACXzIEAAAAAmNxCAUAAAACY24AAAACXzMEAAAAAmNyCAUAAAACY24AAAACXzQEAAAAAmJPCAUAAAACY24AAAACXzUEAAAAAmNzCAUAAAACY24AAAACXzYEAAAAAmN0CAUAAAACY24AAAACXzcEAAAAAmN1AwkAAAAAAAACBQAAAAJjYwUAAAABTQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWYFAAAAAmNzCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAABZwUAAAACY3QEAAAAAmFKCQEAAAACYUEAAAACBQAAAAJjcQUAAAACY3IEAAAAAmFLCQAAawAAAAMFAAAAAmFiBQAAAAFXBQAAAAJhSgQAAAACY3YJAABpAAAAAgkAAGsAAAADCQAAaAAAAAIFAAAAAmFiBQAAAAJhYgUAAAACY3EFAAAAAmNyCQAAawAAAAMFAAAAAmFiBQAAAAJjbwUAAAACY3AEAAAAAmN3CQAAawAAAAMJAABkAAAAAgUAAAACY3MFAAAAAmN0BQAAAAJhZgkAAGgAAAACAAAAAAAAAAACBQAAAAJhZwMDCQAAZwAAAAIFAAAAAmNtBQAAAAJhSwYJAABmAAAAAgUAAAABVwUAAAACYUoJAAACAAAAAQIAAAA6SW5jb3JyZWN0IHZpcnR1YWxTd2FwVG9rZW5QYXkgb3IgdmlydHVhbFN3YXBUb2tlbkdldCB2YWx1ZQMDCQAAZgAAAAIFAAAAAmNrBQAAAAJjdgYJAABmAAAAAgUAAAACY3YFAAAAAmNsCQAAAgAAAAECAAAAbFN3YXAgd2l0aCB2aXJ0dWFsU3dhcFRva2VuUGF5IGFuZCB2aXJ0dWFsU3dhcFRva2VuR2V0IGlzIHBvc3NpYmxlLCBidXQgcmF0aW8gYWZ0ZXIgdmlydHVhbCBzd2FwIGlzIGluY29ycmVjdAMDCQAAZgAAAAIFAAAAAmN3BQAAAAJjcwYJAABmAAAAAgUAAAACY3cFAAAAAmN0CQEAAAACYmgAAAADBQAAAAJjdwUAAAACY3MFAAAAAmN0BAAAAAJiUAMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAFHBQAAAAJjZQkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAACY2IJAARMAAAAAgUAAAACY2UFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAJiUAUAAAACYlAEAAAAAmJWCQAAawAAAAMFAAAAAmNvBQAAAAJhYgUAAAACY3EEAAAAAmJXCQAAawAAAAMFAAAAAmNwBQAAAAJhYgUAAAACY3IEAAAAAmJYCQAAawAAAAMJAAGXAAAAAQkABEwAAAACBQAAAAJiVgkABEwAAAACBQAAAAJiVwUAAAADbmlsBQAAAAFWBQAAAAJhYgkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAAAVUFAAAAAmJYBgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAACYXIAAAAGY2FsbGVyBQAAAAJiWAUAAAABVQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAABaQkAAGQAAAACBQAAAAFWBQAAAAJiWAkABEwAAAACBQAAAAJjdQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAABbAUAAAACYk8FAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAACYXIBAAAACHdpdGhkcmF3AAAAAAQAAAACY3gJAAUUAAAAAggJAAGRAAAAAggFAAAAAmFyAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAmFyAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAAAmNiCAUAAAACY3gAAAACXzEEAAAAAmNjCAUAAAACY3gAAAACXzIEAAAAAmN5CQAAawAAAAMFAAAAAmNiBQAAAAFTBQAAAAFWBAAAAAJjegkAAGsAAAADBQAAAAJjYgUAAAABVAUAAAABVgQAAAACYk8JAQAAAAJhQQAAAAIJAABlAAAAAgUAAAABUwUAAAACY3kJAABlAAAAAgUAAAABVAUAAAACY3oDCQEAAAABIQAAAAEFAAAAAUoJAQAAAAJiZQAAAAADCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAJhcgAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAIhPQAAAAIFAAAAAmNjBQAAAAFVCQAAAgAAAAEJAAEsAAAAAgIAAAAkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogCQACWAAAAAEFAAAAAVUDCQEAAAABIQAAAAEFAAAAAmF3CQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAmFyAAAABmNhbGxlcgUAAAACY2IFAAAAAmNjBQAAAANuaWwJAQAAAAJibAAAAAAEAAAAAmJQAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAAAUcFAAAAAUsJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIHCQAETAAAAAIFAAAAAmN5CQAETAAAAAIFAAAAAUsFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAJiUAUAAAACYlAEAAAAAmJRAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAAAUcFAAAAAUwJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIHCQAETAAAAAIFAAAAAmN6CQAETAAAAAIFAAAAAUwFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAJiUQUAAAACYlEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWYJAABlAAAAAgUAAAABUwUAAAACY3kJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWcJAABlAAAAAgUAAAABVAUAAAACY3oJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWkJAABlAAAAAgUAAAABVgUAAAACY2IJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWwFAAAAAmJPCQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAABVQUAAAACY2IJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAmFyAAAABmNhbGxlcgUAAAACY3kFAAAAAU0JAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAmFyAAAABmNhbGxlcgUAAAACY3oFAAAAAU4FAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAmFyAQAAAAhleGNoYW5nZQAAAAIAAAACY0EAAAACY0IEAAAAAmNDCQAFFAAAAAIICQABkQAAAAIIBQAAAAJhcgAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAJhcgAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAJjYggFAAAAAmNDAAAAAl8xBAAAAAJjYwgFAAAAAmNDAAAAAl8yAwkBAAAAASEAAAABBQAAAAFKCQEAAAACYmUAAAAAAwkAAGcAAAACAAAAAAAAAAAABQAAAAJjQQkAAAIAAAABCQABLAAAAAICAAAAK0VzdGltYXRlZCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS4gQWN0dWFsOiAJAAGkAAAAAQUAAAACY0EDCQAAZgAAAAIFAAAAAmNCBQAAAAJjQQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAADtNaW5pbWFsIGFtb3VudCBjYW4ndCBiZSBncmVhdGVyIHRoYW4gZXN0aW1hdGVkLiBFc3RpbWF0ZWQ6IAkAAaQAAAABBQAAAAJjQQIAAAALLiBNaW5pbWFsOiAJAAGkAAAAAQUAAAACY0IDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAJhcgAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAEhAAAAAQUAAAACYXcJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAACYXIAAAAGY2FsbGVyBQAAAAJjYgUAAAACY2MFAAAAA25pbAkBAAAAAmJsAAAAAAMDCQEAAAACIT0AAAACBQAAAAJjYwUAAAABTQkBAAAAAiE9AAAAAgUAAAACY2MFAAAAAU4HCQEAAAACYmcAAAAAAwkAAGYAAAACAAAAAAAAmJaABQAAAAJjYgkAAAIAAAABAgAAADBPbmx5IHN3YXAgb2YgMTAuMDAwMDAwIG9yIG1vcmUgdG9rZW5zIGlzIGFsbG93ZWQDAwkAAGYAAAACBQAAAAJhaAkAAGsAAAADBQAAAAJhYgUAAAACY0IFAAAAAmNiBgkAAGYAAAACCQAAawAAAAMFAAAAAmFiBQAAAAJjQQUAAAACY2IFAAAAAmFpCQAAAgAAAAECAAAAHEluY29ycmVjdCBhcmdzIGFuZCBwbXQgcmF0aW8EAAAAAmNEAwkAAAAAAAACBQAAAAJjYwUAAAABTQUAAAABTgUAAAABTQQAAAACYnAJAQAAAAJhQwAAAAQFAAAAAmNBBQAAAAJjQgUAAAACY2IFAAAAAmNjBAAAAAJjRQkAAGsAAAADBQAAAAJicAUAAAABWQUAAAABWgQAAAACY0YJAABrAAAAAwUAAAACYnAJAABlAAAAAgUAAAABWgUAAAABWAUAAAABWgQAAAACY0cDCQAAAAAAAAIFAAAAAmNjBQAAAAFNCQAFFAAAAAIJAABkAAAAAgUAAAABUwUAAAACY2IJAABlAAAAAgkAAGUAAAACBQAAAAFUBQAAAAJjRgUAAAACY0UJAAUUAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAAAVMFAAAAAmNGBQAAAAJjRQkAAGQAAAACBQAAAAFUBQAAAAJjYgQAAAACY3MIBQAAAAJjRwAAAAJfMQQAAAACY3QIBQAAAAJjRwAAAAJfMgQAAAACY3cJAABrAAAAAwkAAGQAAAACBQAAAAJjcwUAAAACY3QFAAAAAmFmCQAAaAAAAAIAAAAAAAAAAAIFAAAAAmFnAwMJAABmAAAAAgUAAAACY3cFAAAAAmNzBgkAAGYAAAACBQAAAAJjdwUAAAACY3QJAQAAAAJiaAAAAAMFAAAAAmN3BQAAAAJjcwUAAAACY3QEAAAAAmNICQEAAAACYVkAAAABBQAAAAJjYwQAAAACY2UIBQAAAAJjSAAAAAJfMQQAAAACY2YIBQAAAAJjSAAAAAJfMgQAAAACY2cIBQAAAAJjSAAAAAJfMwQAAAACY0kJAQAAAAJhWQAAAAEFAAAAAmNEBAAAAAJjSggFAAAAAmNJAAAAAl8xBAAAAAJjSwgFAAAAAmNJAAAAAl8yBAAAAAJjTAgFAAAAAmNJAAAAAl8zBAAAAAJiUAMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAFHBQAAAAJjZQkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAACY2IJAARMAAAAAgUAAAACY2UFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAJiUAUAAAACYlAEAAAAAmJRAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAAAUcFAAAAAmNKCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBwkABEwAAAACCQAAZAAAAAIFAAAAAmJwBQAAAAJjRQkABEwAAAACBQAAAAJjSgUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAAAmJRBQAAAAJiUQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAABZgUAAAACY3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWcFAAAAAmN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAFsCQEAAAACYUEAAAACBQAAAAJjcwUAAAACY3QJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAmFyAAAABmNhbGxlcgUAAAACY0YFAAAAAmNECQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAAUQFAAAAAmNFBQAAAAJjRAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAACYXIBAAAACHNodXRkb3duAAAAAAMJAQAAAAEhAAAAAQUAAAABSgkAAAIAAAABCQABLAAAAAICAAAAIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAABbQIAAAAadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAAAXkJAARMAAAAAgUAAAABegkABEwAAAACBQAAAAFBCQAETAAAAAIFAAAAAUIFAAAAA25pbAgFAAAAAmFyAAAAD2NhbGxlclB1YmxpY0tleQkBAAAAAmJmAAAAAAkBAAAAAmJiAAAAAQIAAAAPUGF1c2VkIGJ5IGFkbWluAAAAAmFyAQAAAAhhY3RpdmF0ZQAAAAADBQAAAAFKCQEAAAACYmQAAAAAAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAF5CQAETAAAAAIFAAAAAXoJAARMAAAAAgUAAAABQQkABEwAAAACBQAAAAFCBQAAAANuaWwIBQAAAAJhcgAAAA9jYWxsZXJQdWJsaWNLZXkJAQAAAAJiZgAAAAAJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAAWMGCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAAAW0FAAAAA25pbAAAAAJhcgEAAAAZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwAAAAEAAAACY00EAAAAAmNOCQAAZQAAAAIFAAAAAmF1BQAAAAFTBAAAAAJjTwkAAGUAAAACBQAAAAJhdgUAAAABVAQAAAACY1AJAABlAAAAAgUAAAACY04DCQAAAAAAAAIFAAAAAU0FAAAABHVuaXQFAAAAAmNNAAAAAAAAAAAABAAAAAJjUQkAAGUAAAACBQAAAAJjTwMJAAAAAAAAAgUAAAABTgUAAAAEdW5pdAUAAAACY00AAAAAAAAAAAAEAAAAAmFKCQEAAAACYUEAAAACCQAAZAAAAAIFAAAAAVMFAAAAAmNQCQAAZAAAAAIFAAAAAVQFAAAAAmNRAwkBAAAAASEAAAABBQAAAAFKCQEAAAACYmUAAAAAAwkBAAAAAiE9AAAAAggFAAAAAmFyAAAABmNhbGxlcgUAAAAEdGhpcwkBAAAAAmJmAAAAAAMJAABmAAAAAgAAAAAAAAAAAAUAAAACY00JAAACAAAAAQkAASwAAAACAgAAADNBcmd1bWVudCAnYW1vdW50TGVhdmUnIGNhbm5vdCBiZSBuZWdhdGl2ZS4gQWN0dWFsOiAJAAGkAAAAAQUAAAACY00DAwkAAGYAAAACAAAAAAAAAAAABQAAAAJjTgYJAABmAAAAAgAAAAAAAAAAAAUAAAACY08JAQAAAAJiYgAAAAECAAAAFkVucm9sbCBhbW91bnQgbmVnYXRpdmUDAwkAAGYAAAACAAAAAAAAAAAABQAAAAJjUAYJAABmAAAAAgAAAAAAAAAAAAUAAAACY1EJAAACAAAAAQIAAAAVVG9vIGxhcmdlIGFtb3VudExlYXZlBAAAAAJiUAMDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAABRwUAAAABSwkAAGYAAAACBQAAAAJjUAAAAAAAAAAAAAcJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAAAmNQCQAETAAAAAIFAAAAAUsFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAJiUAUAAAACYlAEAAAAAmJRAwMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAFHBQAAAAFMCQAAZgAAAAIFAAAAAmNRAAAAAAAAAAAABwkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAACY1EJAARMAAAAAgUAAAABTAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAAAmJRBQAAAAJiUQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAABbAUAAAACYUoJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWYJAABkAAAAAgUAAAABUwUAAAACY1AJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWcJAABkAAAAAgUAAAABVAUAAAACY1EJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAMbGFzdF9pbmNvbWVfBQAAAAFLBQAAAAJjUAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACAgAAAAxsYXN0X2luY29tZV8FAAAAAUwFAAAAAmNRBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAJhcgEAAAAMc3Rha2VVbnN0YWtlAAAAAwAAAAJibgAAAAJicAAAAAJjUgMJAQAAAAIhPQAAAAIIBQAAAAJhcgAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAtT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGludm9rZSB0aGlzIGZ1bmN0aW9uBAAAAAJjUwkBAAAAAmJvAAAAAwUAAAACYm4FAAAAAmJwCQACWQAAAAEFAAAAAmNSBAAAAAJicggFAAAAAmNTAAAAAl8xBAAAAAJjVAgFAAAAAmNTAAAAAl8yBAAAAAJjVQgFAAAAAmNTAAAAAl8zBAAAAAJjVggFAAAAAmNTAAAAAl80BAAAAAJjVwkAA/wAAAAEBQAAAAJjVAUAAAACYnIFAAAAAmNVBQAAAAJjVgMJAAAAAAAAAgUAAAACY1cFAAAAAmNXBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAmFyAQAAAAhzdGFrZUFsbAAAAAADCQEAAAABIQAAAAEFAAAAAUoJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAABeQkABEwAAAACBQAAAAF6CQAETAAAAAIFAAAAAUEJAARMAAAAAgUAAAABQgUAAAADbmlsCAUAAAACYXIAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgQAAAACYlADCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAABRwUAAAABSwQAAAACYmoJAABlAAAAAgUAAAABUwUAAAACYXMDCQAAZgAAAAIFAAAAAmJqAAAAAAAAAAAACQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBgkABEwAAAACBQAAAAJiagkABEwAAAACBQAAAAFLBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAAAAAAAAAAAAAMJAAAAAAAAAgUAAAACYlAFAAAAAmJQBAAAAAJiUQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAFHBQAAAAFMBAAAAAJiawkAAGUAAAACBQAAAAFUBQAAAAJhdAMJAABmAAAAAgUAAAACYmsAAAAAAAAAAAAJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAAAmJrCQAETAAAAAIFAAAAAUwFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAAAAAAAAAAAAAwkAAAAAAAACBQAAAAJiUQUAAAACYlEFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAQAAAAJjWAEAAAACY1kAAAAABAAAAAJjWgQAAAACZGEDCQAB9AAAAAMIBQAAAAJjWAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAmNYAAAABnByb29mcwAAAAAAAAAAAAUAAAABeQAAAAAAAAAAAQAAAAAAAAAAAAQAAAACZGIDCQAB9AAAAAMIBQAAAAJjWAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAmNYAAAABnByb29mcwAAAAAAAAAAAQUAAAABegAAAAAAAAAAAQAAAAAAAAAAAAQAAAACZGMDCQAB9AAAAAMIBQAAAAJjWAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAmNYAAAABnByb29mcwAAAAAAAAAAAgUAAAABQQAAAAAAAAAAAQAAAAAAAAAAAAkAAGcAAAACCQAAZAAAAAIJAABkAAAAAgUAAAACZGEFAAAAAmRiBQAAAAJkYwAAAAAAAAAAAgQAAAABdgUAAAACY1gDCQAAAQAAAAIFAAAAAXYCAAAAF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAAAAAJjVwUAAAABdgQAAAACZGQDCQAAAAAAAAIIBQAAAAJjVwAAAARkQXBwBQAAAAR0aGlzCQAAAAAAAAIIBQAAAAJjVwAAAAhmdW5jdGlvbgIAAAAZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwcEAAAAAmRlAwMDCQAB9AAAAAMIBQAAAAJjWAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAmNYAAAABnByb29mcwAAAAAAAAAAAAUAAAABeQYJAAH0AAAAAwgFAAAAAmNYAAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACY1gAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAF6BgkAAfQAAAADCAUAAAACY1gAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJjWAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAAUEGCQAB9AAAAAMIBQAAAAJjWAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAmNYAAAABnByb29mcwAAAAAAAAAAAAUAAAABQwMDBQAAAAJkZAUAAAACZGUHBgUAAAACY1oFAAAAAmNazzg2hg==", "height": 1855721, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9rB3oP9AyswbxnTspNGxTbhrWcS5YqQfF97caTA9N3CS Next: 64m1WdtgXbvdC6BYvWgg4S7ZW54ix944cay7r2ZeAjyy Diff:
OldNewDifferences
561561 let pmtStrAssetId = $t02243722510._1
562562 let pmtAssetName = $t02243722510._2
563563 let pmtDecimals = $t02243722510._3
564- let $t02252322603 = getAssetInfo(sendAssetId)
565- let sendStrAssetIdB = $t02252322603._1
566- let sendAssetNameB = $t02252322603._2
567- let sendDecimalsB = $t02252322603._3
564+ let $t02252322600 = getAssetInfo(sendAssetId)
565+ let sendStrAssetId = $t02252322600._1
566+ let sendAssetName = $t02252322600._2
567+ let sendDecimals = $t02252322600._3
568568 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
569- then invoke(this, "stakeUnstake", [true, pmtAmount, pmtAssetId], nil)
569+ then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
570570 else 0
571571 if ((stake1 == stake1))
572572 then {
573- let stake2 = if (containsElement(stakingAssets, sendStrAssetIdB))
574- then invoke(this, "stakeUnstake", [false, (amount + governanceReward), sendAssetId], nil)
573+ let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
574+ then invoke(this, "stakeUnstake", [false, (amount + governanceReward), sendStrAssetId], nil)
575575 else 0
576576 if ((stake2 == stake2))
577577 then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
654654 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
655655 then throw("Only contract itself can invoke this function")
656656 else {
657- let $t02591826021 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
658- let call = $t02591826021._1
659- let addr = $t02591826021._2
660- let params = $t02591826021._3
661- let payments = $t02591826021._4
657+ let $t02592026023 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
658+ let call = $t02592026023._1
659+ let addr = $t02592026023._2
660+ let params = $t02592026023._3
661+ let payments = $t02592026023._4
662662 let inv = invoke(addr, call, params, payments)
663663 if ((inv == inv))
664664 then nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.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 kShareAssetId = "share_asset_id"
1919
2020 let kShareAssetSupply = "share_asset_supply"
2121
2222 let kFee = "commission"
2323
2424 let kFeeScaleDelimiter = "commission_scale_delimiter"
2525
2626 let kInvariant = "invariant"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
3131
3232 let keyEURNAddress = "staking_eurn_address"
3333
3434 let keyAdminPubKey1 = "admin_pub_1"
3535
3636 let keyAdminPubKey2 = "admin_pub_2"
3737
3838 let keyAdminPubKey3 = "admin_pub_3"
3939
4040 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
4141
4242 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
4343 case string: String =>
4444 fromBase58String(string)
4545 case nothing =>
4646 throw("Admin public key is empty")
4747 }
4848
4949
5050 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
5151
5252 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
5353
5454 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
5555
5656 let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5757
5858 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5959
6060 let govAddr = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
6161
6262 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6363
6464 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
6565
6666 let stakingAssets = [toBase58String(USDN), toBase58String(EURN)]
6767
6868 let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
6969
7070 let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
7171
7272 let isActive = getBooleanValue(this, kActive)
7373
7474 let strAssetIdA = getStringValue(this, kAssetIdA)
7575
7676 let strAssetIdB = getStringValue(this, kAssetIdB)
7777
7878 let assetIdA = if ((strAssetIdA == "WAVES"))
7979 then unit
8080 else fromBase58String(strAssetIdA)
8181
8282 let assetIdB = if ((strAssetIdB == "WAVES"))
8383 then unit
8484 else fromBase58String(strAssetIdB)
8585
8686 let assetNameA = match assetIdA {
8787 case id: ByteVector =>
8888 value(assetInfo(id)).name
8989 case waves: Unit =>
9090 "WAVES"
9191 case _ =>
9292 throw("Match error")
9393 }
9494
9595 let assetNameB = match assetIdB {
9696 case id: ByteVector =>
9797 value(assetInfo(id)).name
9898 case waves: Unit =>
9999 "WAVES"
100100 case _ =>
101101 throw("Match error")
102102 }
103103
104104 let balanceA = getIntegerValue(this, kBalanceA)
105105
106106 let balanceB = getIntegerValue(this, kBalanceB)
107107
108108 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
109109
110110 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
111111
112112 let invariant = getIntegerValue(this, kInvariant)
113113
114114 let fee = 500
115115
116116 let feeGovernance = 200
117117
118118 let feeScale6 = 1000000
119119
120120 let scale3 = 1000
121121
122122 let scale8 = 100000000
123123
124124 let scale12 = 1000000000000
125125
126126 let slippageScale3 = 1000
127127
128128 let digits8 = 8
129129
130130 let dAppThreshold = 50
131131
132132 let dAppThresholdScale2 = 100
133133
134134 let exchangeRatioLimitMin = 90000000
135135
136136 let exchangeRatioLimitMax = 110000000
137137
138138 let alpha = 50
139139
140140 let alphaDigits = 2
141141
142142 let beta = 46000000
143143
144144 func accountBalance (assetId) = match assetId {
145145 case id: ByteVector =>
146146 assetBalance(this, id)
147147 case waves: Unit =>
148148 wavesBalance(this).available
149149 case _ =>
150150 throw("Match error")
151151 }
152152
153153
154154 func stakedAmount (assetId) = {
155155 let stakedAmountCalculated = match assetId {
156156 case aId: ByteVector =>
157157 if ((aId == USDN))
158158 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
159159 else if ((aId == EURN))
160160 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
161161 else 0
162162 case _: Unit =>
163163 0
164164 case _ =>
165165 throw("Match error")
166166 }
167167 match stakedAmountCalculated {
168168 case i: Int =>
169169 i
170170 case _ =>
171171 0
172172 }
173173 }
174174
175175
176176 let stakedAmountA = stakedAmount(assetIdA)
177177
178178 let stakedAmountB = stakedAmount(assetIdB)
179179
180180 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
181181
182182 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
183183
184184 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
185185 then (accountBalanceWithStakedB >= balanceB)
186186 else false
187187
188188 func skewness (x,y) = (((fraction(scale12, x, y) + fraction(scale12, y, x)) / 2) / 10000)
189189
190190
191191 func invariantCalc (x,y) = {
192192 let sk = skewness(x, y)
193193 (fraction((x + y), scale8, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(pow(fraction(x, y, scale8), 0, 5, 1, (digits8 / 2), DOWN), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
194194 }
195195
196196
197197 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
198198 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
199199 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
200200 let x = (balanceA + tokenReceiveAmount)
201201 let y = (balanceB + tokenReceiveAmount)
202202 let invariantNew = if ((tokenId == assetIdA))
203203 then invariantCalc(x, (balanceB - amountToSendEstimated))
204204 else if ((tokenId == assetIdB))
205205 then invariantCalc((balanceA - amountToSendEstimated), y)
206206 else throw("Wrong asset in payment")
207207 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
208208 func getStepAmount (acc,step) = if ((acc == -1))
209209 then {
210210 let amountToSend = (amountToSendEstimated - ((step * deltaBetweenMaxAndMinSendValue) / 5))
211211 let stepInvariant = if ((tokenId == assetIdA))
212212 then invariantCalc(x, (balanceB - amountToSend))
213213 else invariantCalc((balanceA - amountToSend), y)
214214 if ((stepInvariant > invariant))
215215 then amountToSend
216216 else -1
217217 }
218218 else acc
219219
220220 let stepAmount = {
221221 let $l = [1, 2, 3, 4, 5]
222222 let $s = size($l)
223223 let $acc0 = -1
224224 func $f0_1 ($a,$i) = if (($i >= $s))
225225 then $a
226226 else getStepAmount($a, $l[$i])
227227
228228 func $f0_2 ($a,$i) = if (($i >= $s))
229229 then $a
230230 else throw("List size exceeds 5")
231231
232232 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
233233 }
234234 if ((0 > stepAmount))
235235 then throw("something went wrong while working with amountToSend")
236236 else if (if ((invariantEstimatedRatio > slippageValue))
237237 then (invariantNew > invariant)
238238 else false)
239239 then amountToSendEstimated
240240 else stepAmount
241241 }
242242
243243
244244 func getAssetInfo (assetId) = match assetId {
245245 case id: ByteVector =>
246246 let stringId = toBase58String(id)
247247 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
248248 $Tuple3(stringId, info.name, info.decimals)
249249 case waves: Unit =>
250250 $Tuple3("WAVES", "WAVES", 8)
251251 case _ =>
252252 throw("Match error")
253253 }
254254
255255
256256 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
257257
258258
259259 func throwIsActive () = throw("DApp is already active")
260260
261261
262262 func throwIsInactive () = throw("DApp is inactive at this moment")
263263
264264
265265 func throwOnlyAdmin () = throw("Only admin can call this function")
266266
267267
268268 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
269269
270270
271271 func throwThreshold (threshold,amountA,amountB) = throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(threshold)) + ": ") + toString(amountA)) + " ") + assetNameA) + ", ") + toString(amountB)) + " ") + assetNameB))
272272
273273
274274 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
275275
276276
277277 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
278278 then if ((assetId == USDN))
279279 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
280280 else $Tuple2("startStaking", stakingEURNAddress)
281281 else if ((assetId == USDN))
282282 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
283283 else $Tuple2("stopStaking", stakingEURNAddress)
284284
285285
286286 func calcStakingParams (stake,amount,assetId) = if (stake)
287287 then {
288288 let $t088268892 = calcStakingFuncAndAddres(stake, assetId)
289289 let call = $t088268892._1
290290 let stakingAddr = $t088268892._2
291291 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
292292 }
293293 else {
294294 let $t089789044 = calcStakingFuncAndAddres(stake, assetId)
295295 let call = $t089789044._1
296296 let stakingAddr = $t089789044._2
297297 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
298298 }
299299
300300
301301 @Callable(i)
302302 func init () = {
303303 let $t091499226 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
304304 let pmtAmountA = $t091499226._1
305305 let pmtAssetIdA = $t091499226._2
306306 let $t092319308 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
307307 let pmtAmountB = $t092319308._1
308308 let pmtAssetIdB = $t092319308._2
309309 let $t093139390 = getAssetInfo(pmtAssetIdA)
310310 let pmtStrAssetIdA = $t093139390._1
311311 let pmtAssetNameA = $t093139390._2
312312 let pmtDecimalsA = $t093139390._3
313313 let $t093959472 = getAssetInfo(pmtAssetIdB)
314314 let pmtStrAssetIdB = $t093959472._1
315315 let pmtAssetNameB = $t093959472._2
316316 let pmtDecimalsB = $t093959472._3
317317 if (isDefined(getBoolean(this, kActive)))
318318 then throwIsActive()
319319 else if ((pmtAssetIdA == pmtAssetIdB))
320320 then throw("Assets must be different")
321321 else {
322322 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
323323 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
324324 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
325325 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
326326 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
327327 let shareIssueId = calculateAssetId(shareIssue)
328328 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
329329 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
330330 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
331331 else 0
332332 if ((stake1 == stake1))
333333 then {
334334 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
335335 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
336336 else 0
337337 if ((stake2 == stake2))
338338 then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
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 replenishWithTwoTokens (slippageTolerance) = {
349349 let pmtAssetIdA = i.payments[0].assetId
350350 let pmtAssetIdB = i.payments[1].assetId
351351 let pmtAmountA = i.payments[0].amount
352352 let pmtAmountB = i.payments[1].amount
353353 let $t01199212069 = getAssetInfo(pmtAssetIdA)
354354 let pmtStrAssetIdA = $t01199212069._1
355355 let pmtAssetNameA = $t01199212069._2
356356 let pmtDecimalsA = $t01199212069._3
357357 let $t01207412268 = getAssetInfo(pmtAssetIdB)
358358 let pmtStrAssetIdB = $t01207412268._1
359359 let pmtAssetNameB = $t01207412268._2
360360 let pmtDecimalsB = $t01207412268._3
361361 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
362362 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
363363 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
364364 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
365365 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
366366 if (!(isActive))
367367 then throwIsInactive()
368368 else if (if ((0 > slippageTolerance))
369369 then true
370370 else (slippageTolerance > 10))
371371 then throw("Slippage tolerance must be <= 1%")
372372 else if ((size(i.payments) != 2))
373373 then throw("Two attached assets expected")
374374 else if (if ((pmtAssetIdA != assetIdA))
375375 then true
376376 else (pmtAssetIdB != assetIdB))
377377 then throwAssets()
378378 else if (if ((((scale3 * (slippageScale3 - slippageTolerance)) / slippageScale3) > tokenRatio))
379379 then true
380380 else (tokenRatio > ((scale3 * (slippageScale3 + slippageTolerance)) / slippageScale3)))
381381 then throw("Incorrect assets amount: amounts must have the contract ratio")
382382 else if ((shareTokenToPayAmount == 0))
383383 then throw("Too small amount to replenish")
384384 else if (!(hasEnoughBalance))
385385 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
386386 else {
387387 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
388388 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
389389 else 0
390390 if ((stake1 == stake1))
391391 then {
392392 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
393393 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
394394 else 0
395395 if ((stake2 == stake2))
396396 then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalculated), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
397397 else throw("Strict value is not equal to itself.")
398398 }
399399 else throw("Strict value is not equal to itself.")
400400 }
401401 }
402402
403403
404404
405405 @Callable(i)
406406 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
407407 let $t01456714642 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
408408 let pmtAmount = $t01456714642._1
409409 let pmtAssetId = $t01456714642._2
410410 let $t01464714720 = getAssetInfo(pmtAssetId)
411411 let pmtStrAssetId = $t01464714720._1
412412 let pmtAssetName = $t01464714720._2
413413 let pmtDecimals = $t01464714720._3
414414 let pmtMinThreshold = 5000000
415415 let thresholdValueForMinTolerance = 50000000
416416 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
417417 then 100000
418418 else 1
419419 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
420420 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
421421 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
422422 if (!(isActive))
423423 then throwIsInactive()
424424 else if ((pmtMinThreshold > pmtAmount))
425425 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
426426 else if ((size(i.payments) != 1))
427427 then throw("One attached payment expected")
428428 else if (!(hasEnoughBalance))
429429 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
430430 else if (if ((pmtAssetId != assetIdA))
431431 then (pmtAssetId != assetIdB)
432432 else false)
433433 then throwAssets()
434434 else {
435435 let $t01573216497 = if ((pmtAssetId == assetIdA))
436436 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
437437 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
438438 let virtualReplenishA = $t01573216497._1
439439 let virtualReplenishB = $t01573216497._2
440440 let balanceAfterSwapA = $t01573216497._3
441441 let balanceAfterSwapB = $t01573216497._4
442442 let invariantCalculated = $t01573216497._5
443443 let newBalanceA = $t01573216497._6
444444 let newBalanceB = $t01573216497._7
445445 let newBalanceEntry = if ((pmtAssetId == assetIdA))
446446 then IntegerEntry(kBalanceA, newBalanceA)
447447 else IntegerEntry(kBalanceB, newBalanceB)
448448 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
449449 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
450450 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
451451 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
452452 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
453453 then true
454454 else (invariant > invariantNew))
455455 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
456456 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
457457 then true
458458 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
459459 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
460460 else if (if ((dAppThresholdAmount > newBalanceA))
461461 then true
462462 else (dAppThresholdAmount > newBalanceB))
463463 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
464464 else {
465465 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
466466 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
467467 else 0
468468 if ((stake1 == stake1))
469469 then {
470470 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
471471 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
472472 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
473473 [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
474474 }
475475 else throw("Strict value is not equal to itself.")
476476 }
477477 }
478478 }
479479
480480
481481
482482 @Callable(i)
483483 func withdraw () = {
484484 let $t01872318866 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
485485 let pmtAmount = $t01872318866._1
486486 let pmtAssetId = $t01872318866._2
487487 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
488488 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
489489 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
490490 if (!(isActive))
491491 then throwIsInactive()
492492 else if ((size(i.payments) != 1))
493493 then throw("One attached payment expected")
494494 else if ((pmtAssetId != shareAssetId))
495495 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
496496 else if (!(hasEnoughBalance))
497497 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
498498 else {
499499 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
500500 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
501501 else 0
502502 if ((stake1 == stake1))
503503 then {
504504 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
505505 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
506506 else 0
507507 if ((stake2 == stake2))
508508 then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
509509 else throw("Strict value is not equal to itself.")
510510 }
511511 else throw("Strict value is not equal to itself.")
512512 }
513513 }
514514
515515
516516
517517 @Callable(i)
518518 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
519519 let $t02038020455 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
520520 let pmtAmount = $t02038020455._1
521521 let pmtAssetId = $t02038020455._2
522522 if (!(isActive))
523523 then throwIsInactive()
524524 else if ((0 >= estimatedAmountToReceive))
525525 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
526526 else if ((minAmountToReceive > estimatedAmountToReceive))
527527 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
528528 else if ((size(i.payments) != 1))
529529 then throw("One attached payment expected")
530530 else if (!(hasEnoughBalance))
531531 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
532532 else if (if ((pmtAssetId != assetIdA))
533533 then (pmtAssetId != assetIdB)
534534 else false)
535535 then throwAssets()
536536 else if ((10000000 > pmtAmount))
537537 then throw("Only swap of 10.000000 or more tokens is allowed")
538538 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
539539 then true
540540 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
541541 then throw("Incorrect args and pmt ratio")
542542 else {
543543 let sendAssetId = if ((pmtAssetId == assetIdA))
544544 then assetIdB
545545 else assetIdA
546546 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
547547 let governanceReward = fraction(amount, feeGovernance, feeScale6)
548548 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
549549 let $t02187722139 = if ((pmtAssetId == assetIdA))
550550 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
551551 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
552552 let newBalanceA = $t02187722139._1
553553 let newBalanceB = $t02187722139._2
554554 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
555555 if (if ((dAppThresholdAmount > newBalanceA))
556556 then true
557557 else (dAppThresholdAmount > newBalanceB))
558558 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
559559 else {
560560 let $t02243722510 = getAssetInfo(pmtAssetId)
561561 let pmtStrAssetId = $t02243722510._1
562562 let pmtAssetName = $t02243722510._2
563563 let pmtDecimals = $t02243722510._3
564- let $t02252322603 = getAssetInfo(sendAssetId)
565- let sendStrAssetIdB = $t02252322603._1
566- let sendAssetNameB = $t02252322603._2
567- let sendDecimalsB = $t02252322603._3
564+ let $t02252322600 = getAssetInfo(sendAssetId)
565+ let sendStrAssetId = $t02252322600._1
566+ let sendAssetName = $t02252322600._2
567+ let sendDecimals = $t02252322600._3
568568 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
569- then invoke(this, "stakeUnstake", [true, pmtAmount, pmtAssetId], nil)
569+ then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
570570 else 0
571571 if ((stake1 == stake1))
572572 then {
573- let stake2 = if (containsElement(stakingAssets, sendStrAssetIdB))
574- then invoke(this, "stakeUnstake", [false, (amount + governanceReward), sendAssetId], nil)
573+ let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
574+ then invoke(this, "stakeUnstake", [false, (amount + governanceReward), sendStrAssetId], nil)
575575 else 0
576576 if ((stake2 == stake2))
577577 then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
578578 else throw("Strict value is not equal to itself.")
579579 }
580580 else throw("Strict value is not equal to itself.")
581581 }
582582 }
583583 }
584584
585585
586586
587587 @Callable(i)
588588 func shutdown () = if (!(isActive))
589589 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
590590 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
591591 then throwOnlyAdmin()
592592 else suspend("Paused by admin")
593593
594594
595595
596596 @Callable(i)
597597 func activate () = if (isActive)
598598 then throwIsActive()
599599 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
600600 then throwOnlyAdmin()
601601 else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
602602
603603
604604
605605 @Callable(i)
606606 func takeIntoAccountExtraFunds (amountLeave) = {
607607 let uncountableA = (accountBalanceWithStakedA - balanceA)
608608 let uncountableB = (accountBalanceWithStakedB - balanceB)
609609 let amountEnrollA = (uncountableA - (if ((assetIdA == unit))
610610 then amountLeave
611611 else 0))
612612 let amountEnrollB = (uncountableB - (if ((assetIdB == unit))
613613 then amountLeave
614614 else 0))
615615 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
616616 if (!(isActive))
617617 then throwIsInactive()
618618 else if ((i.caller != this))
619619 then throwOnlyAdmin()
620620 else if ((0 > amountLeave))
621621 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
622622 else if (if ((0 > uncountableA))
623623 then true
624624 else (0 > uncountableB))
625625 then suspend("Enroll amount negative")
626626 else if (if ((0 > amountEnrollA))
627627 then true
628628 else (0 > amountEnrollB))
629629 then throw("Too large amountLeave")
630630 else {
631631 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
632632 then (amountEnrollA > 0)
633633 else false)
634634 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
635635 else 0
636636 if ((stake1 == stake1))
637637 then {
638638 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
639639 then (amountEnrollB > 0)
640640 else false)
641641 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
642642 else 0
643643 if ((stake2 == stake2))
644644 then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
645645 else throw("Strict value is not equal to itself.")
646646 }
647647 else throw("Strict value is not equal to itself.")
648648 }
649649 }
650650
651651
652652
653653 @Callable(i)
654654 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
655655 then throw("Only contract itself can invoke this function")
656656 else {
657- let $t02591826021 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
658- let call = $t02591826021._1
659- let addr = $t02591826021._2
660- let params = $t02591826021._3
661- let payments = $t02591826021._4
657+ let $t02592026023 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
658+ let call = $t02592026023._1
659+ let addr = $t02592026023._2
660+ let params = $t02592026023._3
661+ let payments = $t02592026023._4
662662 let inv = invoke(addr, call, params, payments)
663663 if ((inv == inv))
664664 then nil
665665 else throw("Strict value is not equal to itself.")
666666 }
667667
668668
669669
670670 @Callable(i)
671671 func stakeAll () = if (!(isActive))
672672 then throw("DApp is inactive at this moment")
673673 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
674674 then throw("Only admin can call this function")
675675 else {
676676 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
677677 then {
678678 let amountA = (balanceA - stakedAmountA)
679679 if ((amountA > 0))
680680 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
681681 else 0
682682 }
683683 else 0
684684 if ((stake1 == stake1))
685685 then {
686686 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
687687 then {
688688 let amountB = (balanceB - stakedAmountB)
689689 if ((amountB > 0))
690690 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
691691 else 0
692692 }
693693 else 0
694694 if ((stake2 == stake2))
695695 then nil
696696 else throw("Strict value is not equal to itself.")
697697 }
698698 else throw("Strict value is not equal to itself.")
699699 }
700700
701701
702702 @Verifier(tx)
703703 func verify () = {
704704 let multiSignedByAdmins = {
705705 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
706706 then 1
707707 else 0
708708 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
709709 then 1
710710 else 0
711711 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
712712 then 1
713713 else 0
714714 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
715715 }
716716 match tx {
717717 case inv: InvokeScriptTransaction =>
718718 let callTakeIntoAccount = if ((inv.dApp == this))
719719 then (inv.function == "takeIntoAccountExtraFunds")
720720 else false
721721 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
722722 then true
723723 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
724724 then true
725725 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
726726 then true
727727 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
728728 if (if (callTakeIntoAccount)
729729 then signedByAdmin
730730 else false)
731731 then true
732732 else multiSignedByAdmins
733733 case _ =>
734734 multiSignedByAdmins
735735 }
736736 }
737737

github/deemru/w8io/026f985 
86.24 ms