tx · AJm2FZWAtWH2GSEbFuX7Bg51ebzXu2x4JFtKdQbqPBXG

3P3hCvE9ZfeMnZE6kXzR6YBzxhxM8J6PE7K:  -0.03800000 Waves

2023.05.18 17:27 [3648985] smart account 3P3hCvE9ZfeMnZE6kXzR6YBzxhxM8J6PE7K > SELF 0.00000000 Waves

{ "type": 13, "id": "AJm2FZWAtWH2GSEbFuX7Bg51ebzXu2x4JFtKdQbqPBXG", "fee": 3800000, "feeAssetId": null, "timestamp": 1684420104537, "version": 2, "chainId": 87, "sender": "3P3hCvE9ZfeMnZE6kXzR6YBzxhxM8J6PE7K", "senderPublicKey": "EM7EfoVTgHtLuphbMD4o1z2Br9abQALk5fCGoMLeKTfX", "proofs": [ "3ppKSaG6im4tDZDa3FHfka8XcKu7GWLkjf322rosLFmpXEkpKns5WajXuqGtkHUGvjL29DQZiPbVjUtcV1zCN7aX" ], "script": "base64:AAIEAAAAAAAAADsIAhIQCg4ICAgBCAEBAQgBAQEBCBIDCgEBEgASABIFCgMICAgSBQoDCAgIEgMKAQgSBAoCCAESAwoBCAAAAFQAAAAAA1NFUAIAAAACX18BAAAAD2dldFN0cmluZ09yRmFpbAAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5CQABLAAAAAICAAAAFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUAAAADa2V5AQAAABBnZXRCb29sZWFuT3JGYWlsAAAAAQAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBsAAAACBQAAAAR0aGlzBQAAAANrZXkJAAEsAAAAAgIAAAAVTm8gZGF0YSBmb3IgdGhpcy5rZXk9BQAAAANrZXkBAAAADGdldEludE9yRmFpbAAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5CQABLAAAAAICAAAAFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUAAAADa2V5AQAAAARJbnRFAAAAAgAAAANrZXkAAAADdmFsCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAADa2V5BQAAAAN2YWwBAAAABFN0ckUAAAACAAAAA2tleQAAAAN2YWwJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAA2tleQUAAAADdmFsAQAAAA5mYWlsRXhlY3V0ZUdldAAAAAUAAAADbXNnAAAADGJhc2VBc3NldFN0cgAAAA51c2VyQWRkcmVzc1N0cgAAAA1zdWJtaXRUeElkU3RyAAAADW9wZXJhdGlvblR5cGUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAAA21zZwIAAAAMOiBiYXNlQXNzZXQ9BQAAAAxiYXNlQXNzZXRTdHICAAAADSB1c2VyQWRkcmVzcz0FAAAADnVzZXJBZGRyZXNzU3RyAgAAAAwgc3VibWl0VHhJZD0FAAAADXN1Ym1pdFR4SWRTdHICAAAACyBvcGVyYXRpb249BQAAAA1vcGVyYXRpb25UeXBlAQAAABdmYWlsU3VibWl0TGltaXRzRXhjZWVkcwAAAAQAAAANcmVtYWluaW5nQmFzZQAAAA5yZW1haW5pbmdTaGFyZQAAABBuZXdSZW1haW5pbmdCYXNlAAAAEW5ld1JlbWFpbmluZ1NoYXJlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACtzdWJtaXQgb3BlcmF0aW9uIGxpbWl0cyBoYXZlIGJlZW4gcmVhY2hlZDogAgAAABIgcmVtYWluaW5nQmFzZVZhbD0JAAGkAAAAAQUAAAANcmVtYWluaW5nQmFzZQIAAAATIHJlbWFpbmluZ1NoYXJlVmFsPQkAAaQAAAABBQAAAA5yZW1haW5pbmdTaGFyZQIAAAAVIG5ld1JlbWFpbmluZ0Jhc2VWYWw9CQABpAAAAAEFAAAAEG5ld1JlbWFpbmluZ0Jhc2UCAAAAFiBuZXdSZW1haW5pbmdTaGFyZVZhbD0JAAGkAAAAAQUAAAARbmV3UmVtYWluaW5nU2hhcmUBAAAAFGZhaWxUb3B1cE1hbmFnZXJPbmx5AAAAAQAAABN0b3B1cE1hbmFnZXJBZGRyZXNzCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAACNvcGVydGlvbiBkZW5pZWQ6IG9ubHkgdG9wVXBNYW5hZ2VyPQUAAAATdG9wdXBNYW5hZ2VyQWRkcmVzcwIAAAAbIGNhbiBzZW5kIHN1Y2ggdHJhbnNhY3Rpb25zAQAAABpmYWlsVG9wdXBNYXhQcmljZURldmlhdGlvbgAAAAIAAAAFcHJpY2UAAAAPbWluQWxsb3dlZFByaWNlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAARnRvcHVwIGlzIG5vdCBhbGxvd2VkIC0gbWF4IGRldmlhdGlvbiBmcm9tIEFUSCBwcmljZSBleGNlZWRzOiBuZXdQcmljZT0JAAGkAAAAAQUAAAAFcHJpY2UCAAAAESBtaW5BbGxvd2VkUHJpY2U9CQABpAAAAAEFAAAAD21pbkFsbG93ZWRQcmljZQEAAAARY29udmVydFNoYXJlMkJhc2UAAAADAAAAC3NoYXJlQW1vdW50AAAABXByaWNlAAAACXByaWNlTXVsdAkAAGsAAAADBQAAAAtzaGFyZUFtb3VudAUAAAAFcHJpY2UFAAAACXByaWNlTXVsdAEAAAARY29udmVydEJhc2UyU2hhcmUAAAADAAAACmJhc2VBbW91bnQAAAAFcHJpY2UAAAAJcHJpY2VNdWx0CQAAawAAAAMFAAAACmJhc2VBbW91bnQFAAAACXByaWNlTXVsdAUAAAAFcHJpY2UBAAAAC2tleUFzc2V0Q2ZnAAAAAQAAAAxiYXNlQXNzZXRTdHIJAAEsAAAAAgIAAAAXJXMlcyVzX19jb25maWdfX2Fzc2V0X18FAAAADGJhc2VBc3NldFN0cgEAAAAWa2V5TmV4dEludGVybmFsQXNzZXRJZAAAAAACAAAAFyVzX19uZXh0SW50ZXJuYWxBc3NldElkAQAAAAxrZXlQcmljZUxhc3QAAAABAAAADGlubmVyQmFzZVN0cgkAASwAAAACAgAAABUlcyVzJWRfX3ByaWNlX19sYXN0X18FAAAADGlubmVyQmFzZVN0cgEAAAALa2V5UHJpY2VBVEgAAAABAAAADGlubmVyQmFzZVN0cgkAASwAAAACAgAAABQlcyVzJWRfX3ByaWNlX19hdGhfXwUAAAAMaW5uZXJCYXNlU3RyAQAAABJrZXlQcmljZUJ5VG9wVXBJZHgAAAACAAAADGlubmVyQmFzZVN0cgAAAAh0b3BVcElkeAkABLkAAAACCQAETAAAAAICAAAAGyVzJXMlZCVkX19wcmljZV9fYnlUb3BVcElkeAkABEwAAAACBQAAAAxpbm5lckJhc2VTdHIJAARMAAAAAgkAAaQAAAABBQAAAAh0b3BVcElkeAUAAAADbmlsBQAAAANTRVABAAAAD2tleVByaWNlSGlzdG9yeQAAAAMAAAAMaW5uZXJCYXNlU3RyAAAAAWgAAAAJdGltZXN0YW1wCQAEuQAAAAIJAARMAAAAAgIAAAAaJXMlcyVkJWQlZF9fcHJpY2VfX2hpc3RvcnkJAARMAAAAAgUAAAAMaW5uZXJCYXNlU3RyCQAETAAAAAIJAAGkAAAAAQUAAAABaAkABEwAAAACCQABpAAAAAEFAAAACXRpbWVzdGFtcAUAAAADbmlsBQAAAANTRVABAAAADmtleVRvdGFsTG9ja2VkAAAAAQAAAAxpbm5lckJhc2VTdHIJAAEsAAAAAgIAAAAXJXMlcyVkX190b3RhbF9fbG9ja2VkX18FAAAADGlubmVyQmFzZVN0cgEAAAAUa2V5VG90YWxMb2NrZWRCeVVzZXIAAAACAAAADGlubmVyQmFzZVN0cgAAAA51c2VyQWRkcmVzc1N0cgkABLkAAAACCQAETAAAAAICAAAAFyVzJXMlZCVzX190b3RhbF9fbG9ja2VkCQAETAAAAAIFAAAADGlubmVyQmFzZVN0cgkABEwAAAACBQAAAA51c2VyQWRkcmVzc1N0cgUAAAADbmlsBQAAAANTRVABAAAAH2tleU1hcHBpbmdzSW50ZXJuYWwyYmFzZUFzc2V0SWQAAAABAAAAEWludGVybmFsQmFzZUFzc2V0CQABLAAAAAICAAAAKCVzJXMlZF9fbWFwcGluZ3NfX2ludGVybmFsMmJhc2VBc3NldElkX18JAAGkAAAAAQUAAAARaW50ZXJuYWxCYXNlQXNzZXQBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABAAAADGJhc2VBc3NldFN0cgkAASwAAAACAgAAACglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQAAAAxiYXNlQXNzZXRTdHIBAAAAHGtleU1hcHBpbmdzU2hhcmUyYmFzZUFzc2V0SWQAAAABAAAADXNoYXJlQXNzZXRTdHIJAAEsAAAAAgIAAAAlJXMlcyVzX19tYXBwaW5nc19fc2hhcmUyYmFzZUFzc2V0SWRfXwUAAAANc2hhcmVBc3NldFN0cgEAAAAca2V5TWFwcGluZ3NCYXNlQXNzZXQyc2hhcmVJZAAAAAEAAAAMYmFzZUFzc2V0U3RyCQABLAAAAAICAAAAJSVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJzaGFyZUlkX18FAAAADGJhc2VBc3NldFN0cgEAAAAaa2V5U2h1dGRvd25TdWJtaXRPcGVyYXRpb24AAAABAAAADGlubmVyQmFzZVN0cgkAASwAAAACAgAAABolcyVzJWRfX3NodXRkb3duX19zdWJtaXRfXwUAAAAMaW5uZXJCYXNlU3RyAQAAABJrZXlTaHV0ZG93bk1hbmFnZXIAAAABAAAADGlubmVyQmFzZVN0cgkAASwAAAACAgAAABslcyVzJWRfX3NodXRkb3duX19tYW5hZ2VyX18FAAAADGlubmVyQmFzZVN0cgEAAAASa2V5VG9wVXBDdXJyZW50SWR4AAAAAQAAAAxpbm5lckJhc2VTdHIJAAEsAAAAAgIAAAAbJXMlcyVkX190b3B1cF9fY3VycmVudElkeF9fBQAAAAxpbm5lckJhc2VTdHIBAAAAEmtleVRvcFVwTGFzdEhlaWdodAAAAAIAAAAMaW5uZXJCYXNlU3RyAAAABnNlbmRlcgkABLkAAAACCQAETAAAAAICAAAAHyVzJXMlcyVkJXNfX3RvcHVwX19sYXN0X19oZWlnaHQJAARMAAAAAgUAAAAMaW5uZXJCYXNlU3RyCQAETAAAAAIFAAAABnNlbmRlcgUAAAADbmlsBQAAAANTRVABAAAADmtleVRvcHVwTXV0ZXh0AAAAAQAAAAxpbm5lckJhc2VTdHIJAAEsAAAAAgIAAAAWJXMlcyVkX190b3B1cF9fbXV0ZXhfXwUAAAAMaW5uZXJCYXNlU3RyAQAAABVrZXlUb3B1cExhc3RUaW1lc3RhbXAAAAABAAAADGlubmVyQmFzZVN0cgkAASwAAAACAgAAACIlcyVzJXMlZF9fdG9wdXBfX2xhc3RfX3RpbWVzdGFtcF9fBQAAAAxpbm5lckJhc2VTdHIBAAAAD2tleVRvcHVwSGlzdG9yeQAAAAIAAAAMaW5uZXJCYXNlU3RyAAAACHRvcHVwSWR4CQAEuQAAAAIJAARMAAAAAgIAAAAYJXMlcyVkJWRfX3RvcHVwX19oaXN0b3J5CQAETAAAAAIFAAAADGlubmVyQmFzZVN0cgkABEwAAAACCQABpAAAAAEFAAAACHRvcHVwSWR4BQAAAANuaWwFAAAAA1NFUAEAAAASa2V5TGltaXRzUmVtYWluaW5nAAAAAQAAAAxpbm5lckJhc2VTdHIJAAEsAAAAAgIAAAAbJXMlcyVkX19saW1pdHNfX3JlbWFpbmluZ19fBQAAAAxpbm5lckJhc2VTdHIBAAAAFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAAAAAgAAABclc19fbWFuYWdlclZhdWx0QWRkcmVzcwEAAAATa2V5TWFuYWdlclB1YmxpY0tleQAAAAACAAAAFCVzX19tYW5hZ2VyUHVibGljS2V5AAAAABJJZHhDZmdTaGFyZUFzc2V0SWQAAAAAAAAAAAEAAAAAF0lkeENmZ0ludGVybmFsQmFzZUFzc2V0AAAAAAAAAAACAAAAABxJZHhDZmdEZWNpbWFsc011bHRCb3RoQXNzZXRzAAAAAAAAAAADAAAAABdJZHhDZmdEZWNpbWFsc011bHRQcmljZQAAAAAAAAAABAAAAAAUSWR4Q2ZnR2V0RGVsYXlCbG9ja3MAAAAAAAAAAAUAAAAAG0lkeENmZ1RvcHVwSW50ZXJ2YWxJbkJsb2NrcwAAAAAAAAAABgAAAAAaSWR4Q2ZnVG9wdXBNYXhOZWdhdGl2ZVBhcnQAAAAAAAAAAAcAAAAAGUlkeENmZ1RvcHVwTWFuYWdlckFkZHJlc3MAAAAAAAAAAAgAAAAAGUlkeENmZ1N1Ym1pdExpbWl0c0Jhc2VNYXgAAAAAAAAAAAkAAAAAG0lkeENmZ1N1Ym1pdExpbWl0c0Jhc2VSZXNldAAAAAAAAAAACgAAAAAaSWR4Q2ZnU3VibWl0TGltaXRzU2hhcmVNYXgAAAAAAAAAAAsAAAAAHElkeENmZ1N1Ym1pdExpbWl0c1NoYXJlUmVzZXQAAAAAAAAAAAwAAAAAEklkeENmZ0FkbWluQWRkcmVzcwAAAAAAAAAADQEAAAAMZGF0YUFzc2V0Q2ZnAAAADQAAAA1zaGFyZUFzc2V0U3RyAAAADGlubmVyQmFzZVN0cgAAABZkZWNpbWFsc011bHRCb3RoQXNzZXRzAAAAEWRlY2ltYWxzTXVsdFByaWNlAAAAEGdldERlbGF5SW5CbG9ja3MAAAAVdG9wdXBJbnRlcnZhbEluQmxvY2tzAAAAFHRvcHVwTWF4TmVnYXRpdmVQYXJ0AAAAE3RvcHVwTWFuYWdlckFkZHJlc3MAAAATc3VibWl0TGltaXRzQmFzZU1heAAAABVzdWJtaXRMaW1pdHNCYXNlUmVzZXQAAAAUc3VibWl0TGltaXRzU2hhcmVNYXgAAAAWc3VibWl0TGltaXRzU2hhcmVSZXNldAAAAAxhZG1pbkFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAABglcyVkJWQlZCVkJWQlZCVzJWQlZCVkJWQJAARMAAAAAgUAAAANc2hhcmVBc3NldFN0cgkABEwAAAACBQAAAAxpbm5lckJhc2VTdHIJAARMAAAAAgkAAaQAAAABBQAAABZkZWNpbWFsc011bHRCb3RoQXNzZXRzCQAETAAAAAIJAAGkAAAAAQUAAAARZGVjaW1hbHNNdWx0UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABBnZXREZWxheUluQmxvY2tzCQAETAAAAAIJAAGkAAAAAQUAAAAVdG9wdXBJbnRlcnZhbEluQmxvY2tzCQAETAAAAAIJAAGkAAAAAQUAAAAUdG9wdXBNYXhOZWdhdGl2ZVBhcnQJAARMAAAAAgUAAAATdG9wdXBNYW5hZ2VyQWRkcmVzcwkABEwAAAACCQABpAAAAAEFAAAAE3N1Ym1pdExpbWl0c0Jhc2VNYXgJAARMAAAAAgkAAaQAAAABBQAAABVzdWJtaXRMaW1pdHNCYXNlUmVzZXQJAARMAAAAAgkAAaQAAAABBQAAABRzdWJtaXRMaW1pdHNTaGFyZU1heAkABEwAAAACCQABpAAAAAEFAAAAFnN1Ym1pdExpbWl0c1NoYXJlUmVzZXQJAARMAAAAAgUAAAAMYWRtaW5BZGRyZXNzBQAAAANuaWwFAAAAA1NFUAAAAAAVSWR4VG90YWxMb2NrZWRJblNoYXJlAAAAAAAAAAABAAAAABVJZHhUb3RhbExvY2tlZE91dEJhc2UAAAAAAAAAAAIAAAAAFElkeFRvdGFsTG9ja2VkSW5CYXNlAAAAAAAAAAADAAAAABZJZHhUb3RhbExvY2tlZE91dFNoYXJlAAAAAAAAAAAEAQAAAA9kYXRhVG90YWxMb2NrZWQAAAAEAAAADWluU2hhcmVBbW91bnQAAAANb3V0QmFzZUFtb3VudAAAAAxpbkJhc2VBbW91bnQAAAAOb3V0U2hhcmVBbW91bnQJAAS5AAAAAgkABEwAAAACAgAAAAglZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAADWluU2hhcmVBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAA1vdXRCYXNlQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAMaW5CYXNlQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAOb3V0U2hhcmVBbW91bnQFAAAAA25pbAUAAAADU0VQAQAAABJkYXRhVG90YWxMb2NrZWRJbnQAAAAEAAAADWluU2hhcmVBbW91bnQAAAANb3V0QmFzZUFtb3VudAAAAAxpbkJhc2VBbW91bnQAAAAOb3V0U2hhcmVBbW91bnQJAARMAAAAAgD//////////wkABEwAAAACBQAAAA1pblNoYXJlQW1vdW50CQAETAAAAAIFAAAADW91dEJhc2VBbW91bnQJAARMAAAAAgUAAAAMaW5CYXNlQW1vdW50CQAETAAAAAIFAAAADm91dFNoYXJlQW1vdW50BQAAAANuaWwBAAAAD3JlYWRUb3RhbExvY2tlZAAAAAEAAAADa2V5BAAAABB0b3RhbExvY2tlZEFycmF5CQAEtQAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5CQEAAAAPZGF0YVRvdGFsTG9ja2VkAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAADU0VQCQEAAAASZGF0YVRvdGFsTG9ja2VkSW50AAAABAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEHRvdGFsTG9ja2VkQXJyYXkFAAAAFUlkeFRvdGFsTG9ja2VkSW5TaGFyZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEHRvdGFsTG9ja2VkQXJyYXkFAAAAFUlkeFRvdGFsTG9ja2VkT3V0QmFzZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEHRvdGFsTG9ja2VkQXJyYXkFAAAAFElkeFRvdGFsTG9ja2VkSW5CYXNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAQdG90YWxMb2NrZWRBcnJheQUAAAAWSWR4VG90YWxMb2NrZWRPdXRTaGFyZQEAAAATY2FsY1RvdGFsTG9ja2VkRGlmZgAAAAgAAAAJZGlyZWN0aW9uAAAADW9wZXJhdGlvblR5cGUAAAAMaW5uZXJCYXNlU3RyAAAABXByaWNlAAAACXByaWNlTXVsdAAAAAhpbkFtb3VudAAAAAtiYXNlQXNzZXRJZAAAAAxzaGFyZUFzc2V0SWQEAAAAAXQJAAEsAAAAAgUAAAAJZGlyZWN0aW9uBQAAAA1vcGVyYXRpb25UeXBlBAAAAAllbXB0eVZlY3QJAAJZAAAAAQIAAAAAAwkAAAAAAAACBQAAAAF0AgAAAAdzdWJtaXRQBAAAAAl0b3RhbERpZmYJAQAAABJkYXRhVG90YWxMb2NrZWRJbnQAAAAEAAAAAAAAAAAAAAAAAAAAAAAABQAAAAhpbkFtb3VudAAAAAAAAAAAAAQAAAAIdXNlckRpZmYFAAAACXRvdGFsRGlmZgkABRcAAAAFBQAAAAl0b3RhbERpZmYFAAAACHVzZXJEaWZmAAAAAAAAAAAABQAAAAllbXB0eVZlY3QHAwkAAAAAAAACBQAAAAF0AgAAAAdzdWJtaXRHBAAAAAl0b3RhbERpZmYJAQAAABJkYXRhVG90YWxMb2NrZWRJbnQAAAAEBQAAAAhpbkFtb3VudAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIdXNlckRpZmYFAAAACXRvdGFsRGlmZgkABRcAAAAFBQAAAAl0b3RhbERpZmYFAAAACHVzZXJEaWZmAAAAAAAAAAAABQAAAAllbXB0eVZlY3QGAwkAAAAAAAACBQAAAAF0AgAAAAhleGVjdXRlUAQAAAAJb3V0QW1vdW50CQEAAAARY29udmVydEJhc2UyU2hhcmUAAAADBQAAAAhpbkFtb3VudAUAAAAFcHJpY2UFAAAACXByaWNlTXVsdAQAAAAJdG90YWxEaWZmCQEAAAASZGF0YVRvdGFsTG9ja2VkSW50AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAJb3V0QW1vdW50BAAAAAh1c2VyRGlmZgkBAAAAEmRhdGFUb3RhbExvY2tlZEludAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAFAAAACGluQW1vdW50AAAAAAAAAAAACQAFFwAAAAUFAAAACXRvdGFsRGlmZgUAAAAIdXNlckRpZmYFAAAACW91dEFtb3VudAUAAAAMc2hhcmVBc3NldElkBwMJAAAAAAAAAgUAAAABdAIAAAAIZXhlY3V0ZUcEAAAACW91dEFtb3VudAkBAAAAEWNvbnZlcnRTaGFyZTJCYXNlAAAAAwUAAAAIaW5BbW91bnQFAAAABXByaWNlBQAAAAlwcmljZU11bHQEAAAACXRvdGFsRGlmZgkBAAAAEmRhdGFUb3RhbExvY2tlZEludAAAAAQAAAAAAAAAAAAFAAAACW91dEFtb3VudAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIdXNlckRpZmYJAQAAABJkYXRhVG90YWxMb2NrZWRJbnQAAAAEBQAAAAhpbkFtb3VudAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkABRcAAAAFBQAAAAl0b3RhbERpZmYFAAAACHVzZXJEaWZmBQAAAAlvdXRBbW91bnQFAAAAC2Jhc2VBc3NldElkBwMJAAAAAAAAAgUAAAABdAIAAAAFdG9wdXAEAAAAEHRvdGFsTG9ja2VkQXJyYXkJAQAAAA9yZWFkVG90YWxMb2NrZWQAAAABCQEAAAAOa2V5VG90YWxMb2NrZWQAAAABBQAAAAxpbm5lckJhc2VTdHIEAAAAF3RvdGFsTG9ja2VkSW5CYXNlQW1vdW50CQABkQAAAAIFAAAAEHRvdGFsTG9ja2VkQXJyYXkFAAAAFElkeFRvdGFsTG9ja2VkSW5CYXNlBAAAABh0b3RhbExvY2tlZEluU2hhcmVBbW91bnQJAAGRAAAAAgUAAAAQdG90YWxMb2NrZWRBcnJheQUAAAAVSWR4VG90YWxMb2NrZWRJblNoYXJlBAAAAAl0b3RhbERpZmYJAQAAABJkYXRhVG90YWxMb2NrZWRJbnQAAAAEBQAAABh0b3RhbExvY2tlZEluU2hhcmVBbW91bnQJAABoAAAAAgD//////////wkBAAAAEWNvbnZlcnRTaGFyZTJCYXNlAAAAAwUAAAAYdG90YWxMb2NrZWRJblNoYXJlQW1vdW50BQAAAAVwcmljZQUAAAAJcHJpY2VNdWx0BQAAABd0b3RhbExvY2tlZEluQmFzZUFtb3VudAkAAGgAAAACAP//////////CQEAAAARY29udmVydEJhc2UyU2hhcmUAAAADBQAAABd0b3RhbExvY2tlZEluQmFzZUFtb3VudAUAAAAFcHJpY2UFAAAACXByaWNlTXVsdAkABRcAAAAFBQAAAAl0b3RhbERpZmYFAAAAA25pbAAAAAAAAAAAAAUAAAAJZW1wdHlWZWN0BwkAAAIAAAABCQABLAAAAAICAAAAEVVuc3VwcG9ydGVkIFR5cGUgBQAAAAF0AQAAABZUb3RhbExvY2tlZFN0cmluZ0VudHJ5AAAAAwAAAAZhY3Rpb24AAAADa2V5AAAABGRpZmYKAQAAAAZVUERBVEUAAAACAAAAAWEAAAABYgMJAAAAAAAAAgUAAAAGYWN0aW9uAgAAAAlJTkNSRU1FTlQJAABkAAAAAgUAAAABYQUAAAABYgMJAAAAAAAAAgUAAAAGYWN0aW9uAgAAAAlERUNSRU1FTlQJAABlAAAAAgUAAAABYQUAAAABYgkAAAIAAAABCQABLAAAAAICAAAAE1Vuc3VwcG9ydGVkIGFjdGlvbiAFAAAABmFjdGlvbgQAAAAJZGF0YUFycmF5CQEAAAAPcmVhZFRvdGFsTG9ja2VkAAAAAQUAAAADa2V5CQEAAAAEU3RyRQAAAAIFAAAAA2tleQkBAAAAD2RhdGFUb3RhbExvY2tlZAAAAAQJAQAAAAZVUERBVEUAAAACCQABkQAAAAIFAAAACWRhdGFBcnJheQUAAAAVSWR4VG90YWxMb2NrZWRJblNoYXJlCQABkQAAAAIFAAAABGRpZmYFAAAAFUlkeFRvdGFsTG9ja2VkSW5TaGFyZQkBAAAABlVQREFURQAAAAIJAAGRAAAAAgUAAAAJZGF0YUFycmF5BQAAABVJZHhUb3RhbExvY2tlZE91dEJhc2UJAAGRAAAAAgUAAAAEZGlmZgUAAAAVSWR4VG90YWxMb2NrZWRPdXRCYXNlCQEAAAAGVVBEQVRFAAAAAgkAAZEAAAACBQAAAAlkYXRhQXJyYXkFAAAAFElkeFRvdGFsTG9ja2VkSW5CYXNlCQABkQAAAAIFAAAABGRpZmYFAAAAFElkeFRvdGFsTG9ja2VkSW5CYXNlCQEAAAAGVVBEQVRFAAAAAgkAAZEAAAACBQAAAAlkYXRhQXJyYXkFAAAAFklkeFRvdGFsTG9ja2VkT3V0U2hhcmUJAAGRAAAAAgUAAAAEZGlmZgUAAAAWSWR4VG90YWxMb2NrZWRPdXRTaGFyZQEAAAAMa2V5T3BlcmF0aW9uAAAABAAAAA1vcGVyYXRpb25UeXBlAAAADGlubmVyQmFzZVN0cgAAAAt1c2VyQWRkcmVzcwAAAAR0eElkCQAEuQAAAAIJAARMAAAAAgIAAAAIJXMlZCVzJXMJAARMAAAAAgUAAAANb3BlcmF0aW9uVHlwZQkABEwAAAACBQAAAAxpbm5lckJhc2VTdHIJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgUAAAAEdHhJZAUAAAADbmlsBQAAAANTRVAAAAAADUlkeE9wZXJTdGF0dXMAAAAAAAAAAAEAAAAAD0lkeE9wZXJJbkFtb3VudAAAAAAAAAAAAgAAAAAMSWR4T3BlclByaWNlAAAAAAAAAAADAAAAABBJZHhPcGVyT3V0QW1vdW50AAAAAAAAAAAEAAAAABJJZHhPcGVyU3RhcnRIZWlnaHQAAAAAAAAAAAUAAAAAFUlkeE9wZXJTdGFydFRpbWVzdGFtcAAAAAAAAAAABgAAAAAQSWR4T3BlckVuZEhlaWdodAAAAAAAAAAABwAAAAATSWR4T3BlckVuZFRpbWVzdGFtcAAAAAAAAAAACAAAAAAVSWR4T3BlclRvcHVwVW5sb2NrSWR4AAAAAAAAAAAJAQAAAB5wcml2YXRlRGF0YU9wZXJhdGlvbkFsbFN0cmluZ3MAAAAJAAAABnN0YXR1cwAAAA1pbkFzc2V0QW1vdW50AAAABXByaWNlAAAADm91dEFzc2V0QW1vdW50AAAAC3N0YXJ0SGVpZ2h0AAAADnN0YXJ0VGltZXN0YW1wAAAACWVuZEhlaWdodAAAAAxlbmRUaW1lc3RhbXAAAAAEbG9jawkABLkAAAACCQAETAAAAAICAAAAEiVzJWQlZCVkJWQlZCVkJWQlZAkABEwAAAACBQAAAAZzdGF0dXMJAARMAAAAAgUAAAANaW5Bc3NldEFtb3VudAkABEwAAAACBQAAAAVwcmljZQkABEwAAAACBQAAAA5vdXRBc3NldEFtb3VudAkABEwAAAACBQAAAAtzdGFydEhlaWdodAkABEwAAAACBQAAAA5zdGFydFRpbWVzdGFtcAkABEwAAAACBQAAAAllbmRIZWlnaHQJAARMAAAAAgUAAAAMZW5kVGltZXN0YW1wCQAETAAAAAIFAAAABGxvY2sFAAAAA25pbAUAAAADU0VQAQAAAA1kYXRhT3BlcmF0aW9uAAAACQAAAAZzdGF0dXMAAAANaW5Bc3NldEFtb3VudAAAAAVwcmljZQAAAA5vdXRBc3NldEFtb3VudAAAAAtzdGFydEhlaWdodAAAAA5zdGFydFRpbWVzdGFtcAAAAAllbmRIZWlnaHQAAAAMZW5kVGltZXN0YW1wAAAADnRvcHVwVW5sb2NrSWR4CQEAAAAecHJpdmF0ZURhdGFPcGVyYXRpb25BbGxTdHJpbmdzAAAACQUAAAAGc3RhdHVzCQABpAAAAAEFAAAADWluQXNzZXRBbW91bnQJAAGkAAAAAQUAAAAFcHJpY2UJAAGkAAAAAQUAAAAOb3V0QXNzZXRBbW91bnQJAAGkAAAAAQUAAAALc3RhcnRIZWlnaHQJAAGkAAAAAQUAAAAOc3RhcnRUaW1lc3RhbXAJAAGkAAAAAQUAAAAJZW5kSGVpZ2h0CQABpAAAAAEFAAAADGVuZFRpbWVzdGFtcAkAAaQAAAABBQAAAA50b3B1cFVubG9ja0lkeAEAAAAcZGF0YU9wZXJhdGlvbkV4ZWN1dGlvblVwZGF0ZQAAAAQAAAANY3Vyck9wZXJBcnJheQAAAAluZXdTdGF0dXMAAAAIbmV3UHJpY2UAAAAMbmV3T3V0QW1vdW50CQEAAAAecHJpdmF0ZURhdGFPcGVyYXRpb25BbGxTdHJpbmdzAAAACQUAAAAJbmV3U3RhdHVzCQABkQAAAAIFAAAADWN1cnJPcGVyQXJyYXkFAAAAD0lkeE9wZXJJbkFtb3VudAkAAaQAAAABBQAAAAhuZXdQcmljZQkAAaQAAAABBQAAAAxuZXdPdXRBbW91bnQJAAGRAAAAAgUAAAANY3Vyck9wZXJBcnJheQUAAAASSWR4T3BlclN0YXJ0SGVpZ2h0CQABkQAAAAIFAAAADWN1cnJPcGVyQXJyYXkFAAAAFUlkeE9wZXJTdGFydFRpbWVzdGFtcAkAAaQAAAABBQAAAAZoZWlnaHQJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAGRAAAAAgUAAAANY3Vyck9wZXJBcnJheQUAAAAVSWR4T3BlclRvcHVwVW5sb2NrSWR4AQAAABJyZWFkQXNzZXRDZmdPckZhaWwAAAABAAAADGJhc2VBc3NldFN0cgQAAAADa2V5CQEAAAALa2V5QXNzZXRDZmcAAAABBQAAAAxiYXNlQXNzZXRTdHIJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEFAAAAA2tleQUAAAADU0VQAAAAABZJZHhMaW1pdHNSZW1haW5pbmdCYXNlAAAAAAAAAAABAAAAABdJZHhMaW1pdHNSZW1haW5pbmdTaGFyZQAAAAAAAAAAAgEAAAAaUmVtYWluaW5nTGltaXRzU3RyaW5nRW50cnkAAAADAAAAA2tleQAAABJiYXNlUmVtYWluaW5nTGltaXQAAAATc2hhcmVSZW1haW5pbmdMaW1pdAkBAAAABFN0ckUAAAACBQAAAANrZXkJAAS5AAAAAgkABEwAAAACAgAAAAQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAASYmFzZVJlbWFpbmluZ0xpbWl0CQAETAAAAAIJAAGkAAAAAQUAAAATc2hhcmVSZW1haW5pbmdMaW1pdAUAAAADbmlsBQAAAANTRVABAAAAElRvcHVwTXV0ZXhJbnRFbnRyeQAAAAIAAAAMaW5uZXJCYXNlU3RyAAAADmFjcXVpcmVkSGVpZ2h0CQEAAAAESW50RQAAAAIJAQAAAA5rZXlUb3B1cE11dGV4dAAAAAEFAAAADGlubmVyQmFzZVN0cgUAAAAOYWNxdWlyZWRIZWlnaHQBAAAAEGdlbmVyaWNDYWxjUHJpY2UAAAAFAAAADGlubmVyQmFzZVN0cgAAAAtiYXNlQXNzZXRJZAAAAA90b3BVcEJhc2VBbW91bnQAAAAMc2hhcmVBc3NldElkAAAAEWRlY2ltYWxzTXVsdFByaWNlBAAAABB0b3RhbExvY2tlZEFycmF5CQEAAAAPcmVhZFRvdGFsTG9ja2VkAAAAAQkBAAAADmtleVRvdGFsTG9ja2VkAAAAAQUAAAAMaW5uZXJCYXNlU3RyBAAAABh0b3RhbExvY2tlZE91dEJhc2VBbW91bnQJAAGRAAAAAgUAAAAQdG90YWxMb2NrZWRBcnJheQUAAAAVSWR4VG90YWxMb2NrZWRPdXRCYXNlBAAAABljdXJySXRlclRvdGFsSW5CYXNlQW1vdW50CQABkQAAAAIFAAAAEHRvdGFsTG9ja2VkQXJyYXkFAAAAFElkeFRvdGFsTG9ja2VkSW5CYXNlBAAAABBiYXNlQXNzZXRCYWxhbmNlCQAD8AAAAAIFAAAABHRoaXMFAAAAC2Jhc2VBc3NldElkBAAAABNiYXNlQXNzZXRCYWxhbmNlV0NPCQAAZQAAAAIJAABlAAAAAgkAAGQAAAACBQAAABBiYXNlQXNzZXRCYWxhbmNlBQAAAA90b3BVcEJhc2VBbW91bnQFAAAAGWN1cnJJdGVyVG90YWxJbkJhc2VBbW91bnQFAAAAGHRvdGFsTG9ja2VkT3V0QmFzZUFtb3VudAQAAAAZdG90YWxMb2NrZWRPdXRTaGFyZUFtb3VudAkAAZEAAAACBQAAABB0b3RhbExvY2tlZEFycmF5BQAAABZJZHhUb3RhbExvY2tlZE91dFNoYXJlBAAAABpjdXJySXRlclRvdGFsSW5TaGFyZUFtb3VudAkAAZEAAAACBQAAABB0b3RhbExvY2tlZEFycmF5BQAAABVJZHhUb3RhbExvY2tlZEluU2hhcmUEAAAADXNoYXJlRW1pc3Npb24ICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAADHNoYXJlQXNzZXRJZAAAAAhxdWFudGl0eQMJAABmAAAAAgAAAAAAAAAAAAUAAAATYmFzZUFzc2V0QmFsYW5jZVdDTwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACtiYXNlQXNzZXRCYWxhbmNlV2NvIDwgMDogYmFzZUFzc2V0dEJhbGFuY2U9CQABpAAAAAEFAAAAEGJhc2VBc3NldEJhbGFuY2UCAAAAFSBiYXNlQXNzZXRCYWxhbmNlV2NvPQkAAaQAAAABBQAAABNiYXNlQXNzZXRCYWxhbmNlV0NPBAAAAAlsYXN0UHJpY2UJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAAMa2V5UHJpY2VMYXN0AAAAAQUAAAAMaW5uZXJCYXNlU3RyBAAAAAVwcmljZQMJAAAAAAAAAgUAAAANc2hhcmVFbWlzc2lvbgAAAAAAAAAAAAUAAAAJbGFzdFByaWNlCQAAawAAAAMFAAAAE2Jhc2VBc3NldEJhbGFuY2VXQ08FAAAAEWRlY2ltYWxzTXVsdFByaWNlBQAAAA1zaGFyZUVtaXNzaW9uCQAFGwAAAAkFAAAABXByaWNlBQAAABBiYXNlQXNzZXRCYWxhbmNlAP//////////BQAAABNiYXNlQXNzZXRCYWxhbmNlV0NPBQAAAA1zaGFyZUVtaXNzaW9uBQAAABljdXJySXRlclRvdGFsSW5CYXNlQW1vdW50BQAAABpjdXJySXRlclRvdGFsSW5TaGFyZUFtb3VudAUAAAAYdG90YWxMb2NrZWRPdXRCYXNlQW1vdW50BQAAABl0b3RhbExvY2tlZE91dFNoYXJlQW1vdW50AQAAAAljYWxjUHJpY2UAAAAEAAAADGlubmVyQmFzZVN0cgAAAAtiYXNlQXNzZXRJZAAAAAxzaGFyZUFzc2V0SWQAAAARZGVjaW1hbHNNdWx0UHJpY2UJAQAAABBnZW5lcmljQ2FsY1ByaWNlAAAABQUAAAAMaW5uZXJCYXNlU3RyBQAAAAtiYXNlQXNzZXRJZAAAAAAAAAAAAAUAAAAMc2hhcmVBc3NldElkBQAAABFkZWNpbWFsc011bHRQcmljZQEAAAAcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAAAAAEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwkBAAAAFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAAXMFAAAABHRoaXMBAAAAFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAABAAAABNtYW5hZ2VyVmF1bHRBZGRyZXNzCQEAAAAcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAAAAAEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAATbWFuYWdlclZhdWx0QWRkcmVzcwkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAUAAAAEdW5pdAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAJaXNNYW5hZ2VyAAAAAQAAAAFpBAAAAAckbWF0Y2gwCQEAAAAWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAnBrBQAAAAckbWF0Y2gwCQAAAAAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAACcGsDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAttdXN0TWFuYWdlcgAAAAEAAAABaQMJAQAAAAlpc01hbmFnZXIAAAABBQAAAAFpBgkAAAIAAAABAgAAABFwZXJtaXNzaW9uIGRlbmllZAEAAAAMY29tbW9uU3VibWl0AAAABQAAAA1vcGVyYXRpb25UeXBlAAAAAWkAAAAIaW5BbW91bnQAAAAJaW5Bc3NldElkAAAADGJhc2VBc3NldFN0cgQAAAAKaW5Bc3NldFN0cgkAAlgAAAABBQAAAAlpbkFzc2V0SWQEAAAADnVzZXJBZGRyZXNzU3RyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAALYmFzZUFzc2V0SWQJAAJZAAAAAQUAAAAMYmFzZUFzc2V0U3RyBAAAAAhjZmdBcnJheQkBAAAAEnJlYWRBc3NldENmZ09yRmFpbAAAAAEFAAAADGJhc2VBc3NldFN0cgQAAAANc2hhcmVBc3NldFN0cgkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAASSWR4Q2ZnU2hhcmVBc3NldElkBAAAAAxzaGFyZUFzc2V0SWQJAAJZAAAAAQUAAAANc2hhcmVBc3NldFN0cgQAAAAWZGVjaW1hbHNNdWx0Qm90aEFzc2V0cwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABxJZHhDZmdEZWNpbWFsc011bHRCb3RoQXNzZXRzBAAAAAxpbm5lckJhc2VTdHIJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAF0lkeENmZ0ludGVybmFsQmFzZUFzc2V0BAAAAA5nZXREZWxheUJsb2NrcwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABRJZHhDZmdHZXREZWxheUJsb2NrcwQAAAAJbGltaXRzS0VZCQEAAAASa2V5TGltaXRzUmVtYWluaW5nAAAAAQUAAAAMaW5uZXJCYXNlU3RyBAAAAA5saW1pdHNDZmdBcnJheQkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQUAAAAJbGltaXRzS0VZBQAAAANTRVAEAAAAE2xpbWl0c1JlbWFpbmluZ0Jhc2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA5saW1pdHNDZmdBcnJheQUAAAAWSWR4TGltaXRzUmVtYWluaW5nQmFzZQQAAAAUbGltaXRzUmVtYWluaW5nU2hhcmUJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA5saW1pdHNDZmdBcnJheQUAAAAXSWR4TGltaXRzUmVtYWluaW5nU2hhcmUEAAAAD2lzU3VibWl0QmxvY2tlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAAR0aGlzCQEAAAAaa2V5U2h1dGRvd25TdWJtaXRPcGVyYXRpb24AAAABBQAAAAxpbm5lckJhc2VTdHIHAwUAAAAPaXNTdWJtaXRCbG9ja2VkCQAAAgAAAAECAAAAG3N1Ym1pdCBvcGVyYXRpb24gaXMgYmxvY2tlZAQAAAAPb3BlcmF0aW9uc011dGV4CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAA5rZXlUb3B1cE11dGV4dAAAAAEFAAAADGlubmVyQmFzZVN0cgAAAAAAAAAAAAMJAABmAAAAAgkAAGQAAAACBQAAAA9vcGVyYXRpb25zTXV0ZXgAAAAAAAAAADwFAAAABmhlaWdodAkAAAIAAAABAgAAAC5zdWJtaXQgb3BlcmF0aW9ucyBhcmUgYmxvY2tlZCBieSB0b3B1cCBtYW5hZ2VyBAAAAAlkaWZmVHVwbGUJAQAAABNjYWxjVG90YWxMb2NrZWREaWZmAAAACAIAAAAGc3VibWl0BQAAAA1vcGVyYXRpb25UeXBlBQAAAAxpbm5lckJhc2VTdHIAAAAAAAAAAAAAAAAAAAAAAAAFAAAACGluQW1vdW50BQAAAAtiYXNlQXNzZXRJZAUAAAAMc2hhcmVBc3NldElkBAAAABZsaW1pdHNSZW1haW5pbmdCYXNlTmV3CQAAZQAAAAIFAAAAE2xpbWl0c1JlbWFpbmluZ0Jhc2UJAAGRAAAAAggFAAAACWRpZmZUdXBsZQAAAAJfMgUAAAAUSWR4VG90YWxMb2NrZWRJbkJhc2UEAAAAF2xpbWl0c1JlbWFpbmluZ1NoYXJlTmV3CQAAZQAAAAIFAAAAFGxpbWl0c1JlbWFpbmluZ1NoYXJlCQABkQAAAAIIBQAAAAlkaWZmVHVwbGUAAAACXzIFAAAAFUlkeFRvdGFsTG9ja2VkSW5TaGFyZQMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAFmxpbWl0c1JlbWFpbmluZ0Jhc2VOZXcGCQAAZgAAAAIAAAAAAAAAAAAFAAAAF2xpbWl0c1JlbWFpbmluZ1NoYXJlTmV3CQEAAAAXZmFpbFN1Ym1pdExpbWl0c0V4Y2VlZHMAAAAEBQAAABNsaW1pdHNSZW1haW5pbmdCYXNlBQAAABRsaW1pdHNSZW1haW5pbmdTaGFyZQUAAAAWbGltaXRzUmVtYWluaW5nQmFzZU5ldwUAAAAXbGltaXRzUmVtYWluaW5nU2hhcmVOZXcEAAAAD3RvcFVwQ3VycmVudElkeAkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABJrZXlUb3BVcEN1cnJlbnRJZHgAAAABBQAAAAxpbm5lckJhc2VTdHIEAAAACWVuZEhlaWdodAMIBQAAAAlkaWZmVHVwbGUAAAACXzUJAABkAAAAAgUAAAAGaGVpZ2h0BQAAAA5nZXREZWxheUJsb2NrcwUAAAAGaGVpZ2h0CQAETQAAAAIJAARNAAAAAgkABE0AAAACCQAETAAAAAIJAQAAAARTdHJFAAAAAgkBAAAADGtleU9wZXJhdGlvbgAAAAQFAAAADW9wZXJhdGlvblR5cGUFAAAADGlubmVyQmFzZVN0cgUAAAAOdXNlckFkZHJlc3NTdHIJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAkBAAAADWRhdGFPcGVyYXRpb24AAAAJAgAAAAdQRU5ESU5HBQAAAAhpbkFtb3VudAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAJZW5kSGVpZ2h0AAAAAAAAAAAACQAAZAAAAAIFAAAAD3RvcFVwQ3VycmVudElkeAAAAAAAAAAAAQUAAAADbmlsCQEAAAAWVG90YWxMb2NrZWRTdHJpbmdFbnRyeQAAAAMCAAAACUlOQ1JFTUVOVAkBAAAADmtleVRvdGFsTG9ja2VkAAAAAQUAAAAMaW5uZXJCYXNlU3RyCAUAAAAJZGlmZlR1cGxlAAAAAl8xCQEAAAAWVG90YWxMb2NrZWRTdHJpbmdFbnRyeQAAAAMCAAAACUlOQ1JFTUVOVAkBAAAAFGtleVRvdGFsTG9ja2VkQnlVc2VyAAAAAgUAAAAMaW5uZXJCYXNlU3RyBQAAAA51c2VyQWRkcmVzc1N0cggFAAAACWRpZmZUdXBsZQAAAAJfMgkBAAAAGlJlbWFpbmluZ0xpbWl0c1N0cmluZ0VudHJ5AAAAAwUAAAAJbGltaXRzS0VZBQAAABZsaW1pdHNSZW1haW5pbmdCYXNlTmV3BQAAABdsaW1pdHNSZW1haW5pbmdTaGFyZU5ldwEAAAANY29tbW9uRXhlY3V0ZQAAAAQAAAANb3BlcmF0aW9uVHlwZQAAAAxiYXNlQXNzZXRTdHIAAAAOdXNlckFkZHJlc3NTdHIAAAANc3VibWl0VHhJZFN0cgQAAAALdXNlckFkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA1hc3NldENmZ0FycmF5CQEAAAAScmVhZEFzc2V0Q2ZnT3JGYWlsAAAAAQUAAAAMYmFzZUFzc2V0U3RyBAAAAAxzaGFyZUFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAAA1hc3NldENmZ0FycmF5BQAAABJJZHhDZmdTaGFyZUFzc2V0SWQEAAAADGlubmVyQmFzZVN0cgkAAZEAAAACBQAAAA1hc3NldENmZ0FycmF5BQAAABdJZHhDZmdJbnRlcm5hbEJhc2VBc3NldAQAAAARZGVjaW1hbHNNdWx0UHJpY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA1hc3NldENmZ0FycmF5BQAAABdJZHhDZmdEZWNpbWFsc011bHRQcmljZQQAAAALYmFzZUFzc2V0SWQJAAJZAAAAAQUAAAAMYmFzZUFzc2V0U3RyBAAAAAVvcEtleQkBAAAADGtleU9wZXJhdGlvbgAAAAQFAAAADW9wZXJhdGlvblR5cGUFAAAADGlubmVyQmFzZVN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADXN1Ym1pdFR4SWRTdHIEAAAAB29wQXJyYXkJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEFAAAABW9wS2V5BQAAAANTRVAEAAAABnN0YXR1cwkAAZEAAAACBQAAAAdvcEFycmF5BQAAAA1JZHhPcGVyU3RhdHVzBAAAAAhpbkFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAB29wQXJyYXkFAAAAD0lkeE9wZXJJbkFtb3VudAQAAAAOdG9wdXBVbmxvY2tJZHgJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAdvcEFycmF5BQAAABVJZHhPcGVyVG9wdXBVbmxvY2tJZHgEAAAADHVubG9ja0hlaWdodAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAB29wQXJyYXkFAAAAEElkeE9wZXJFbmRIZWlnaHQEAAAADGN1cnJUb3BVcElkeAkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABJrZXlUb3BVcEN1cnJlbnRJZHgAAAABBQAAAAxpbm5lckJhc2VTdHIEAAAADnByaWNlQnlUb3BVcElkCQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAEmtleVByaWNlQnlUb3BVcElkeAAAAAIFAAAADGlubmVyQmFzZVN0cgUAAAAOdG9wdXBVbmxvY2tJZHgDCQEAAAACIT0AAAACBQAAAAZzdGF0dXMCAAAAB1BFTkRJTkcJAQAAAA5mYWlsRXhlY3V0ZUdldAAAAAUCAAAAFVN0YXR1cyBpcyBub3QgUEVORElORwUAAAAMYmFzZUFzc2V0U3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAANc3VibWl0VHhJZFN0cgUAAAANb3BlcmF0aW9uVHlwZQMJAABmAAAAAgUAAAAOdG9wdXBVbmxvY2tJZHgFAAAADGN1cnJUb3BVcElkeAkBAAAADmZhaWxFeGVjdXRlR2V0AAAABQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJT3BlckxvY2tbCQABpAAAAAEFAAAADnRvcHVwVW5sb2NrSWR4AgAAAARdID4gCQABpAAAAAEFAAAADGN1cnJUb3BVcElkeAUAAAAMYmFzZUFzc2V0U3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAANc3VibWl0VHhJZFN0cgUAAAANb3BlcmF0aW9uVHlwZQMJAABmAAAAAgUAAAAMdW5sb2NrSGVpZ2h0BQAAAAZoZWlnaHQJAQAAAA5mYWlsRXhlY3V0ZUdldAAAAAUJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD09wZXJIZWlnaHRMb2NrWwkAAaQAAAABBQAAAAx1bmxvY2tIZWlnaHQCAAAABF0gPiAJAAGkAAAAAQUAAAAGaGVpZ2h0BQAAAAxiYXNlQXNzZXRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAA1zdWJtaXRUeElkU3RyBQAAAA1vcGVyYXRpb25UeXBlBAAAAAlkaWZmVHVwbGUJAQAAABNjYWxjVG90YWxMb2NrZWREaWZmAAAACAIAAAAHZXhlY3V0ZQUAAAANb3BlcmF0aW9uVHlwZQUAAAAMaW5uZXJCYXNlU3RyBQAAAA5wcmljZUJ5VG9wVXBJZAUAAAARZGVjaW1hbHNNdWx0UHJpY2UFAAAACGluQW1vdW50BQAAAAtiYXNlQXNzZXRJZAUAAAAMc2hhcmVBc3NldElkBAAAAAlvdXRBbW91bnQIBQAAAAlkaWZmVHVwbGUAAAACXzMEAAAAD291dFRyYW5zZmVyRGF0YQMJAAAAAAAAAggFAAAACWRpZmZUdXBsZQAAAAJfNAUAAAALYmFzZUFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAACW91dEFtb3VudAUAAAALYmFzZUFzc2V0SWQFAAAAA25pbAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAAJb3V0QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQFAAAAA25pbAkABE0AAAACCQAETQAAAAIJAARNAAAAAgUAAAAPb3V0VHJhbnNmZXJEYXRhCQEAAAAEU3RyRQAAAAIFAAAABW9wS2V5CQEAAAAcZGF0YU9wZXJhdGlvbkV4ZWN1dGlvblVwZGF0ZQAAAAQFAAAAB29wQXJyYXkCAAAACEZJTklTSEVEBQAAAA5wcmljZUJ5VG9wVXBJZAUAAAAJb3V0QW1vdW50CQEAAAAWVG90YWxMb2NrZWRTdHJpbmdFbnRyeQAAAAMCAAAACURFQ1JFTUVOVAkBAAAADmtleVRvdGFsTG9ja2VkAAAAAQUAAAAMaW5uZXJCYXNlU3RyCAUAAAAJZGlmZlR1cGxlAAAAAl8xCQEAAAAWVG90YWxMb2NrZWRTdHJpbmdFbnRyeQAAAAMCAAAACURFQ1JFTUVOVAkBAAAAFGtleVRvdGFsTG9ja2VkQnlVc2VyAAAAAgUAAAAMaW5uZXJCYXNlU3RyBQAAAA51c2VyQWRkcmVzc1N0cggFAAAACWRpZmZUdXBsZQAAAAJfMgEAAAAbcHJpdmF0ZUN1cnJlbnRTeXNQYXJhbXNSRVNUAAAAAQAAAAxiYXNlQXNzZXRTdHIEAAAAC2Jhc2VBc3NldElkCQACWQAAAAEFAAAADGJhc2VBc3NldFN0cgQAAAAIY2ZnQXJyYXkJAQAAABJyZWFkQXNzZXRDZmdPckZhaWwAAAABBQAAAAxiYXNlQXNzZXRTdHIEAAAADXNoYXJlQXNzZXRTdHIJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAEklkeENmZ1NoYXJlQXNzZXRJZAQAAAAMc2hhcmVBc3NldElkCQACWQAAAAEFAAAADXNoYXJlQXNzZXRTdHIEAAAAGWRlY2ltYWxzTXVsdEJvdGhBc3NldHNWYWwJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAcSWR4Q2ZnRGVjaW1hbHNNdWx0Qm90aEFzc2V0cwQAAAAUZGVjaW1hbHNNdWx0UHJpY2VWYWwJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAXSWR4Q2ZnRGVjaW1hbHNNdWx0UHJpY2UEAAAADGlubmVyQmFzZVN0cgkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAXSWR4Q2ZnSW50ZXJuYWxCYXNlQXNzZXQEAAAAC3ByaWNlQXRoS0VZCQEAAAALa2V5UHJpY2VBVEgAAAABBQAAAAxpbm5lckJhc2VTdHIEAAAAC3ByaWNlQXRoVmFsCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAC3ByaWNlQXRoS0VZAAAAAAAAAAAABAAAAAxwcmljZUxhc3RLRVkJAQAAAAxrZXlQcmljZUxhc3QAAAABBQAAAAxpbm5lckJhc2VTdHIEAAAADHByaWNlTGFzdFZhbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAxwcmljZUxhc3RLRVkAAAAAAAAAAAAEAAAAEHRvcHVwTGFzdFRpbWVLRVkJAQAAABVrZXlUb3B1cExhc3RUaW1lc3RhbXAAAAABBQAAAAxpbm5lckJhc2VTdHIEAAAAEHRvcHVwTGFzdFRpbWVWYWwJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAQdG9wdXBMYXN0VGltZUtFWQAAAAAAAAAAAAQAAAAIc3lzU3RhdGUJAQAAAAljYWxjUHJpY2UAAAAEBQAAAAxpbm5lckJhc2VTdHIFAAAAC2Jhc2VBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQFAAAAFGRlY2ltYWxzTXVsdFByaWNlVmFsCQAFIAAAAA4JAQAAAARJbnRFAAAAAgIAAAAFcHJpY2UFAAAADHByaWNlTGFzdFZhbAkBAAAABEludEUAAAACAgAAABFkZWNpbWFsc011bHRQcmljZQUAAAAUZGVjaW1hbHNNdWx0UHJpY2VWYWwJAQAAAARJbnRFAAAAAgIAAAAQYmFzZUFzc2V0QmFsYW5jZQgFAAAACHN5c1N0YXRlAAAAAl8yCQEAAAAESW50RQAAAAICAAAAAi0xCAUAAAAIc3lzU3RhdGUAAAACXzMJAQAAAARJbnRFAAAAAgIAAAATYmFzZUFzc2V0QmFsYW5jZVdDTwgFAAAACHN5c1N0YXRlAAAAAl80CQEAAAAESW50RQAAAAICAAAADXNoYXJlRW1pc3Npb24IBQAAAAhzeXNTdGF0ZQAAAAJfNQkBAAAABEludEUAAAACAgAAABljdXJySXRlclRvdGFsSW5CYXNlQW1vdW50CAUAAAAIc3lzU3RhdGUAAAACXzYJAQAAAARJbnRFAAAAAgIAAAAaY3Vyckl0ZXJUb3RhbEluU2hhcmVBbW91bnQIBQAAAAhzeXNTdGF0ZQAAAAJfNwkBAAAABEludEUAAAACAgAAABh0b3RhbExvY2tlZE91dEJhc2VBbW91bnQIBQAAAAhzeXNTdGF0ZQAAAAJfOAkBAAAABEludEUAAAACAgAAABl0b3RhbExvY2tlZE91dFNoYXJlQW1vdW50CAUAAAAIc3lzU3RhdGUAAAACXzkJAQAAAARJbnRFAAAAAgIAAAAWZGVjaW1hbHNNdWx0Qm90aEFzc2V0cwUAAAAZZGVjaW1hbHNNdWx0Qm90aEFzc2V0c1ZhbAkBAAAABEludEUAAAACAgAAAAhwcmljZUFUSAUAAAALcHJpY2VBdGhWYWwJAQAAAARJbnRFAAAAAgIAAAARcHJpY2VSZWNhbGN1bGF0ZWQIBQAAAAhzeXNTdGF0ZQAAAAJfMQkBAAAABEludEUAAAACAgAAABJ0b3B1cExhc3RUaW1lc3RhbXAFAAAAEHRvcHVwTGFzdFRpbWVWYWwAAAAJAAAAAWkBAAAAEmFkbWluUmVnaXN0ZXJBc3NldAAAAA4AAAAMYmFzZUFzc2V0U3RyAAAADnNoYXJlQXNzZXROYW1lAAAAD3NoYXJlQXNzZXREZXNjcgAAABBnZXREZWxheWluQmxvY2tzAAAAFnNodXRkb3duTWFuYWdlckFkZHJlc3MAAAAKc3RhcnRQcmljZQAAABV0b3B1cEludGVydmFsSW5CbG9ja3MAAAAUdG9wdXBNYXhOZWdhdGl2ZVBhcnQAAAATdG9wdXBNYW5hZ2VyQWRkcmVzcwAAABNzdWJtaXRMaW1pdHNCYXNlTWF4AAAAFXN1Ym1pdExpbWl0c0Jhc2VSZXNldAAAABRzdWJtaXRMaW1pdHNTaGFyZU1heAAAABZzdWJtaXRMaW1pdHNTaGFyZVJlc2V0AAAADGFkbWluQWRkcmVzcwQAAAALYmFzZUFzc2V0SWQJAAJZAAAAAQUAAAAMYmFzZUFzc2V0U3RyBAAAABJib3RoQXNzZXRzRGVjaW1hbHMICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAC2Jhc2VBc3NldElkAAAACGRlY2ltYWxzBAAAABZkZWNpbWFsc011bHRCb3RoQXNzZXRzCQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAFAAAAEmJvdGhBc3NldHNEZWNpbWFscwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAERE9XTgQAAAARZGVjaW1hbHNNdWx0UHJpY2UJAABoAAAAAgkAAGgAAAACAAAAAAAAAABkAAAAAAAAAAPoAAAAAAAAAAPoBAAAABh0b3B1cE1heE5lZ2F0aXZlUGVyY2VudHMJAABrAAAAAwUAAAAUdG9wdXBNYXhOZWdhdGl2ZVBhcnQAAAAAAAAAAGQFAAAAFmRlY2ltYWxzTXVsdEJvdGhBc3NldHMEAAAAEGJhc2VBc3NldEJhbGFuY2UJAAPwAAAAAgUAAAAEdGhpcwUAAAALYmFzZUFzc2V0SWQEAAAAC2NoZWNrQ2FsbGVyCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIDCQAAAAAAAAIFAAAAEGJhc2VBc3NldEJhbGFuY2UAAAAAAAAAAAAJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAQlAAAAAQUAAAAEdGhpcwIAAAAiIG11c3QgaGF2ZSBhbnkgaW5pdGlhbCBiYWxhbmNlIG9mIAUAAAAMYmFzZUFzc2V0U3RyAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwkBAAAAC2tleUFzc2V0Q2ZnAAAAAQUAAAAMYmFzZUFzc2V0U3RyCQAAAgAAAAEJAAEsAAAAAgUAAAAMYmFzZUFzc2V0U3RyAgAAABwgaGFzIGJlZW4gYWxyZWFkeSByZWdpc3RlcmVkAwkBAAAAAiE9AAAAAgkABCUAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAABZzaHV0ZG93bk1hbmFnZXJBZGRyZXNzBQAAABZzaHV0ZG93bk1hbmFnZXJBZGRyZXNzCQAAAgAAAAECAAAAHmludmFsaWQgc2h1dGRvd25NYW5hZ2VyQWRkcmVzcwMJAQAAAAIhPQAAAAIJAAQlAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAATdG9wdXBNYW5hZ2VyQWRkcmVzcwUAAAATdG9wdXBNYW5hZ2VyQWRkcmVzcwkAAAIAAAABAgAAABtpbnZhbGlkIHRvcHVwTWFuYWdlckFkZHJlc3MDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEGdldERlbGF5aW5CbG9ja3MJAAACAAAAAQkAASwAAAACAgAAABlpbnZhbGlkIGdldERlbGF5aW5CbG9ja3M9CQABpAAAAAEFAAAAEGdldERlbGF5aW5CbG9ja3MDAwkAAGcAAAACAAAAAAAAAAAABQAAABh0b3B1cE1heE5lZ2F0aXZlUGVyY2VudHMGCQAAZwAAAAIFAAAAGHRvcHVwTWF4TmVnYXRpdmVQZXJjZW50cwAAAAAAAAAAYwkAAAIAAAABAgAAACZpbnZhbGlkIHRvcHVwTWF4TmVnYXRpdmVQYXJ0IHBhcmFtZXRlcgQAAAAPc2hhcmVJbml0QW1vdW50CQEAAAARY29udmVydEJhc2UyU2hhcmUAAAADBQAAABBiYXNlQXNzZXRCYWxhbmNlBQAAAApzdGFydFByaWNlBQAAABFkZWNpbWFsc011bHRQcmljZQQAAAAVc2hhcmVBc3NldElzc3VlQWN0aW9uCQAEQgAAAAUFAAAADnNoYXJlQXNzZXROYW1lBQAAAA9zaGFyZUFzc2V0RGVzY3IFAAAAD3NoYXJlSW5pdEFtb3VudAUAAAASYm90aEFzc2V0c0RlY2ltYWxzBgQAAAAMc2hhcmVBc3NldElkCQAEOAAAAAEFAAAAFXNoYXJlQXNzZXRJc3N1ZUFjdGlvbgQAAAANc2hhcmVBc3NldFN0cgkAAlgAAAABBQAAAAxzaGFyZUFzc2V0SWQEAAAAE2ludGVybmFsQmFzZUFzc2V0SWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAFmtleU5leHRJbnRlcm5hbEFzc2V0SWQAAAAAAAAAAAAAAAAABAAAAAxpbm5lckJhc2VTdHIJAAGkAAAAAQUAAAATaW50ZXJuYWxCYXNlQXNzZXRJZAkABEwAAAACCQEAAAAEU3RyRQAAAAIJAQAAAAtrZXlBc3NldENmZwAAAAEFAAAADGJhc2VBc3NldFN0cgkBAAAADGRhdGFBc3NldENmZwAAAA0FAAAADXNoYXJlQXNzZXRTdHIFAAAADGlubmVyQmFzZVN0cgUAAAAWZGVjaW1hbHNNdWx0Qm90aEFzc2V0cwUAAAARZGVjaW1hbHNNdWx0UHJpY2UFAAAAEGdldERlbGF5aW5CbG9ja3MFAAAAFXRvcHVwSW50ZXJ2YWxJbkJsb2NrcwUAAAAUdG9wdXBNYXhOZWdhdGl2ZVBhcnQFAAAAE3RvcHVwTWFuYWdlckFkZHJlc3MFAAAAE3N1Ym1pdExpbWl0c0Jhc2VNYXgFAAAAFXN1Ym1pdExpbWl0c0Jhc2VSZXNldAUAAAAUc3VibWl0TGltaXRzU2hhcmVNYXgFAAAAFnN1Ym1pdExpbWl0c1NoYXJlUmVzZXQFAAAADGFkbWluQWRkcmVzcwkABEwAAAACCQEAAAAEU3RyRQAAAAIJAQAAAB9rZXlNYXBwaW5nc0ludGVybmFsMmJhc2VBc3NldElkAAAAAQUAAAATaW50ZXJuYWxCYXNlQXNzZXRJZAUAAAAMYmFzZUFzc2V0U3RyCQAETAAAAAIJAQAAAARTdHJFAAAAAgkBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABBQAAAAxiYXNlQXNzZXRTdHIFAAAADGlubmVyQmFzZVN0cgkABEwAAAACCQEAAAAEU3RyRQAAAAIJAQAAABxrZXlNYXBwaW5nc1NoYXJlMmJhc2VBc3NldElkAAAAAQUAAAANc2hhcmVBc3NldFN0cgUAAAAMYmFzZUFzc2V0U3RyCQAETAAAAAIJAQAAAARTdHJFAAAAAgkBAAAAHGtleU1hcHBpbmdzQmFzZUFzc2V0MnNoYXJlSWQAAAABBQAAAAxiYXNlQXNzZXRTdHIFAAAADXNoYXJlQXNzZXRTdHIJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIJAQAAABprZXlTaHV0ZG93blN1Ym1pdE9wZXJhdGlvbgAAAAEFAAAADGlubmVyQmFzZVN0cgcJAARMAAAAAgkBAAAABFN0ckUAAAACCQEAAAASa2V5U2h1dGRvd25NYW5hZ2VyAAAAAQUAAAAMaW5uZXJCYXNlU3RyBQAAABZzaHV0ZG93bk1hbmFnZXJBZGRyZXNzCQAETAAAAAIJAQAAAARJbnRFAAAAAgkBAAAAFmtleU5leHRJbnRlcm5hbEFzc2V0SWQAAAAACQAAZAAAAAIFAAAAE2ludGVybmFsQmFzZUFzc2V0SWQAAAAAAAAAAAEJAARMAAAAAgkBAAAABEludEUAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAQUAAAAMaW5uZXJCYXNlU3RyBQAAAApzdGFydFByaWNlCQAETAAAAAIJAQAAAARJbnRFAAAAAgkBAAAAC2tleVByaWNlQVRIAAAAAQUAAAAMaW5uZXJCYXNlU3RyBQAAAApzdGFydFByaWNlCQAETAAAAAIJAQAAAARJbnRFAAAAAgkBAAAAD2tleVByaWNlSGlzdG9yeQAAAAMFAAAADGlubmVyQmFzZVN0cgUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAKc3RhcnRQcmljZQkABEwAAAACCQEAAAAESW50RQAAAAIJAQAAABJrZXlUb3BVcEN1cnJlbnRJZHgAAAABBQAAAAxpbm5lckJhc2VTdHIAAAAAAAAAAAAJAARMAAAAAgkBAAAAGlJlbWFpbmluZ0xpbWl0c1N0cmluZ0VudHJ5AAAAAwkBAAAAEmtleUxpbWl0c1JlbWFpbmluZwAAAAEFAAAADGlubmVyQmFzZVN0cgUAAAATc3VibWl0TGltaXRzQmFzZU1heAUAAAAUc3VibWl0TGltaXRzU2hhcmVNYXgJAARMAAAAAgUAAAAVc2hhcmVBc3NldElzc3VlQWN0aW9uCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAE3RvcHVwTWFuYWdlckFkZHJlc3MFAAAAD3NoYXJlSW5pdEFtb3VudAUAAAAMc2hhcmVBc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAD3NodXRkb3duU3VibWl0cwAAAAEAAAATaW50ZXJuYWxCYXNlQXNzZXRJZAQAAAALY2hlY2tDYWxsZXIJAQAAAAttdXN0TWFuYWdlcgAAAAEFAAAAAWkDCQAAAAAAAAIFAAAAC2NoZWNrQ2FsbGVyBQAAAAtjaGVja0NhbGxlcgQAAAAWaW50ZXJuYWxCYXNlQXNzZXRJZFN0cgkAAaQAAAABBQAAABNpbnRlcm5hbEJhc2VBc3NldElkBAAAAA5iYXNlQXNzZXRJZFN0cgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAAB9rZXlNYXBwaW5nc0ludGVybmFsMmJhc2VBc3NldElkAAAAAQUAAAATaW50ZXJuYWxCYXNlQXNzZXRJZAQAAAAWc2h1dGRvd25NYW5hZ2VyQWRkcmVzcwkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAABJrZXlTaHV0ZG93bk1hbmFnZXIAAAABBQAAABZpbnRlcm5hbEJhc2VBc3NldElkU3RyAwkAAGYAAAACAAAAAAAAAAABCQABMQAAAAEFAAAADmJhc2VBc3NldElkU3RyCQAAAgAAAAECAAAAG2ludmFsaWQgaW50ZXJuYWxCYXNlQXNzZXRJZAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAAGmtleVNodXRkb3duU3VibWl0T3BlcmF0aW9uAAAAAQkAAaQAAAABBQAAABNpbnRlcm5hbEJhc2VBc3NldElkBgUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAlzdWJtaXRQdXQAAAAABAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACGluQW1vdW50CAUAAAADcG10AAAABmFtb3VudAQAAAAJaW5Bc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAADGJhc2VBc3NldFN0cgkAAlgAAAABBQAAAAlpbkFzc2V0SWQJAQAAAAxjb21tb25TdWJtaXQAAAAFAgAAAAFQBQAAAAFpBQAAAAhpbkFtb3VudAUAAAAJaW5Bc3NldElkBQAAAAxiYXNlQXNzZXRTdHIAAAABaQEAAAAJc3VibWl0R2V0AAAAAAQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAhpbkFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQEAAAACWluQXNzZXRJZAkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAA1zaGFyZUFzc2V0U3RyCQACWAAAAAEFAAAACWluQXNzZXRJZAQAAAAMYmFzZUFzc2V0U3RyCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQkBAAAAHGtleU1hcHBpbmdzU2hhcmUyYmFzZUFzc2V0SWQAAAABBQAAAA1zaGFyZUFzc2V0U3RyCQEAAAAMY29tbW9uU3VibWl0AAAABQIAAAABRwUAAAABaQUAAAAIaW5BbW91bnQFAAAACWluQXNzZXRJZAUAAAAMYmFzZUFzc2V0U3RyAAAAAWkBAAAACmV4ZWN1dGVQdXQAAAADAAAADGJhc2VBc3NldFN0cgAAAA51c2VyQWRkcmVzc1N0cgAAAA1zdWJtaXRUeElkU3RyCQEAAAANY29tbW9uRXhlY3V0ZQAAAAQCAAAAAVAFAAAADGJhc2VBc3NldFN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADXN1Ym1pdFR4SWRTdHIAAAABaQEAAAAKZXhlY3V0ZUdldAAAAAMAAAAMYmFzZUFzc2V0U3RyAAAADnVzZXJBZGRyZXNzU3RyAAAADXN1Ym1pdFR4SWRTdHIJAQAAAA1jb21tb25FeGVjdXRlAAAABAIAAAABRwUAAAAMYmFzZUFzc2V0U3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAANc3VibWl0VHhJZFN0cgAAAAFpAQAAAA9vcGVyYXRpb25zTXV0ZXgAAAABAAAADGJhc2VBc3NldFN0cgQAAAANYXNzZXRDZmdBcnJheQkBAAAAEnJlYWRBc3NldENmZ09yRmFpbAAAAAEFAAAADGJhc2VBc3NldFN0cgQAAAAWdG9wVXBNYW5hZ2VyQWRkcmVzc1N0cgkAAZEAAAACBQAAAA1hc3NldENmZ0FycmF5BQAAABlJZHhDZmdUb3B1cE1hbmFnZXJBZGRyZXNzBAAAAAxpbm5lckJhc2VTdHIJAAGRAAAAAgUAAAANYXNzZXRDZmdBcnJheQUAAAAXSWR4Q2ZnSW50ZXJuYWxCYXNlQXNzZXQDCQEAAAACIT0AAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAWdG9wVXBNYW5hZ2VyQWRkcmVzc1N0cgkBAAAAFGZhaWxUb3B1cE1hbmFnZXJPbmx5AAAAAQUAAAAWdG9wVXBNYW5hZ2VyQWRkcmVzc1N0cgkABEwAAAACCQEAAAASVG9wdXBNdXRleEludEVudHJ5AAAAAgUAAAAMaW5uZXJCYXNlU3RyBQAAAAZoZWlnaHQFAAAAA25pbAAAAAFpAQAAAAx0b3BVcEJhbGFuY2UAAAACAAAADGJhc2VBc3NldFN0cgAAAAZpbmNvbWUEAAAAC2Jhc2VBc3NldElkCQACWQAAAAEFAAAADGJhc2VBc3NldFN0cgQAAAADY2ZnCQEAAAAScmVhZEFzc2V0Q2ZnT3JGYWlsAAAAAQUAAAAMYmFzZUFzc2V0U3RyBAAAAAxzaGFyZUFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAEklkeENmZ1NoYXJlQXNzZXRJZAQAAAAJcHJpY2VNdWx0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABdJZHhDZmdEZWNpbWFsc011bHRQcmljZQQAAAANYm90aEFzc2V0TXVsdAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAcSWR4Q2ZnRGVjaW1hbHNNdWx0Qm90aEFzc2V0cwQAAAAVdG9wdXBJbnRlcnZhbEluQmxvY2tzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABtJZHhDZmdUb3B1cEludGVydmFsSW5CbG9ja3MEAAAAFHRvcHVwTWF4TmVnYXRpdmVQYXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABpJZHhDZmdUb3B1cE1heE5lZ2F0aXZlUGFydAQAAAAMaW5uZXJCYXNlU3RyCQABkQAAAAIFAAAAA2NmZwUAAAAXSWR4Q2ZnSW50ZXJuYWxCYXNlQXNzZXQEAAAAFnRvcFVwTWFuYWdlckFkZHJlc3NTdHIJAAGRAAAAAgUAAAADY2ZnBQAAABlJZHhDZmdUb3B1cE1hbmFnZXJBZGRyZXNzBAAAABNzdWJtaXRMaW1pdHNCYXNlTWF4CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABlJZHhDZmdTdWJtaXRMaW1pdHNCYXNlTWF4BAAAABRzdWJtaXRMaW1pdHNTaGFyZU1heAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAaSWR4Q2ZnU3VibWl0TGltaXRzU2hhcmVNYXgEAAAAEnRvcFVwQ3VycmVudElkeEtFWQkBAAAAEmtleVRvcFVwQ3VycmVudElkeAAAAAEFAAAADGlubmVyQmFzZVN0cgQAAAAMcHJldlRvcFVwSWR4CQEAAAAMZ2V0SW50T3JGYWlsAAAAAQUAAAASdG9wVXBDdXJyZW50SWR4S0VZBAAAAA9jdXJyZW50VG9wVXBJZHgJAABkAAAAAgUAAAAMcHJldlRvcFVwSWR4AAAAAAAAAAABBAAAABJ0b3BVcExhc3RIZWlnaHRLRVkJAQAAABJrZXlUb3BVcExhc3RIZWlnaHQAAAACBQAAAAxpbm5lckJhc2VTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA90b3BVcExhc3RIZWlnaHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAASdG9wVXBMYXN0SGVpZ2h0S0VZAAAAAAAAAAAABAAAAAtwcmljZUF0aEtFWQkBAAAAC2tleVByaWNlQVRIAAAAAQUAAAAMaW5uZXJCYXNlU3RyBAAAAAxwcmV2UHJpY2VBVEgJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAALcHJpY2VBdGhLRVkAAAAAAAAAAAADCQEAAAACIT0AAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAWdG9wVXBNYW5hZ2VyQWRkcmVzc1N0cgkBAAAAFGZhaWxUb3B1cE1hbmFnZXJPbmx5AAAAAQUAAAAWdG9wVXBNYW5hZ2VyQWRkcmVzc1N0cgMJAABmAAAAAgUAAAAVdG9wdXBJbnRlcnZhbEluQmxvY2tzCQAAZQAAAAIFAAAABmhlaWdodAUAAAAPdG9wVXBMYXN0SGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAwxIHRvcHVwIHBlciAJAAGkAAAAAQUAAAAVdG9wdXBJbnRlcnZhbEluQmxvY2tzAgAAACggYmxvY2tzIGZyb20gdGhlIHNhbWUgYWRkcmVzcyBpcyBhbGxvd2VkBAAAAAVwcmljZQgJAQAAABBnZW5lcmljQ2FsY1ByaWNlAAAABQUAAAAMaW5uZXJCYXNlU3RyBQAAAAtiYXNlQXNzZXRJZAUAAAAGaW5jb21lBQAAAAxzaGFyZUFzc2V0SWQFAAAACXByaWNlTXVsdAAAAAJfMQQAAAAFdmFsaWQDCQAAZgAAAAIFAAAABmluY29tZQAAAAAAAAAAAAQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAApwbXRBc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQDCQEAAAACIT0AAAACBQAAAAtiYXNlQXNzZXRJZAUAAAAKcG10QXNzZXRJZAkAAAIAAAABAgAAAD5hdHRhY2hlZCBwYXltZW50J3MgYXNzZXQgaWQgaXMgTk9UIG1hdGNoZWQgcGFzc2VkIGJhc2VBc3NldFN0cgMJAABmAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAACBvbmx5IG9uZSBwYXltZW50IGNhbiBiZSBhdHRhY2hlZAMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAGYW1vdW50BQAAAAZpbmNvbWUJAAACAAAAAQIAAAA9YXR0YWNoZWQgcGF5bWVudC5hbW91bnQgaXMgTk9UIG1hdGNoZWQgcGFzc2VkIGluY29tZSBhcmd1bWVudAYDCQAAZgAAAAIAAAAAAAAAAAAFAAAABmluY29tZQQAAAAPbWluQWxsb3dlZFByaWNlCQAAawAAAAMFAAAADHByZXZQcmljZUFUSAkAAGUAAAACCQAAaAAAAAIAAAAAAAAAAAEFAAAADWJvdGhBc3NldE11bHQFAAAAFHRvcHVwTWF4TmVnYXRpdmVQYXJ0BQAAAA1ib3RoQXNzZXRNdWx0AwkAAGYAAAACBQAAAA9taW5BbGxvd2VkUHJpY2UFAAAABXByaWNlCQEAAAAaZmFpbFRvcHVwTWF4UHJpY2VEZXZpYXRpb24AAAACBQAAAAVwcmljZQUAAAAPbWluQWxsb3dlZFByaWNlBgkAAAIAAAABAgAAABp6ZXJvIGluY29tZSBpcyBub3QgYWxsb3dlZAMJAQAAAAEhAAAAAQUAAAAFdmFsaWQJAAACAAAAAQIAAAARdmFsaWRhdGlvbiBmYWlsZWQEAAAACWRpZmZUdXBsZQkBAAAAE2NhbGNUb3RhbExvY2tlZERpZmYAAAAIAgAAAAV0b3B1cAIAAAAABQAAAAxpbm5lckJhc2VTdHIFAAAABXByaWNlBQAAAAlwcmljZU11bHQAAAAAAAAAAAAFAAAAC2Jhc2VBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQEAAAADnRvcHVwVG90YWxEaWZmCAUAAAAJZGlmZlR1cGxlAAAAAl8xCQAETgAAAAIJAARNAAAAAgkABE0AAAACCQAETQAAAAIJAARNAAAAAgkABE0AAAACCQAETQAAAAIJAARMAAAAAgkBAAAABEludEUAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAQUAAAAMaW5uZXJCYXNlU3RyBQAAAAVwcmljZQkABEwAAAACCQEAAAAESW50RQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAADBQAAAAxpbm5lckJhc2VTdHIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAABXByaWNlCQAETAAAAAIJAQAAAARJbnRFAAAAAgkBAAAAEmtleVByaWNlQnlUb3BVcElkeAAAAAIFAAAADGlubmVyQmFzZVN0cgUAAAAPY3VycmVudFRvcFVwSWR4BQAAAAVwcmljZQkABEwAAAACCQEAAAAESW50RQAAAAIFAAAAEnRvcFVwQ3VycmVudElkeEtFWQUAAAAPY3VycmVudFRvcFVwSWR4CQAETAAAAAIJAQAAAARJbnRFAAAAAgUAAAALcHJpY2VBdGhLRVkDCQAAZgAAAAIFAAAABXByaWNlBQAAAAxwcmV2UHJpY2VBVEgFAAAABXByaWNlBQAAAAxwcmV2UHJpY2VBVEgJAARMAAAAAgkBAAAABEludEUAAAACBQAAABJ0b3BVcExhc3RIZWlnaHRLRVkFAAAABmhlaWdodAUAAAADbmlsCQEAAAAWVG90YWxMb2NrZWRTdHJpbmdFbnRyeQAAAAMCAAAACURFQ1JFTUVOVAkBAAAADmtleVRvdGFsTG9ja2VkAAAAAQUAAAAMaW5uZXJCYXNlU3RyBQAAAA50b3B1cFRvdGFsRGlmZgkBAAAAElRvcHVwTXV0ZXhJbnRFbnRyeQAAAAIFAAAADGlubmVyQmFzZVN0cgAAAAAAAAAAAAkBAAAABEludEUAAAACCQEAAAAVa2V5VG9wdXBMYXN0VGltZXN0YW1wAAAAAQUAAAAMaW5uZXJCYXNlU3RyCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkBAAAAGlJlbWFpbmluZ0xpbWl0c1N0cmluZ0VudHJ5AAAAAwkBAAAAEmtleUxpbWl0c1JlbWFpbmluZwAAAAEFAAAADGlubmVyQmFzZVN0cgUAAAATc3VibWl0TGltaXRzQmFzZU1heAUAAAAUc3VibWl0TGltaXRzU2hhcmVNYXgJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkCQABkQAAAAIFAAAADnRvcHVwVG90YWxEaWZmBQAAABVJZHhUb3RhbExvY2tlZEluU2hhcmUJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkCQEAAAABLQAAAAEJAAGRAAAAAgUAAAAOdG9wdXBUb3RhbERpZmYFAAAAFklkeFRvdGFsTG9ja2VkT3V0U2hhcmUGAwkAAGYAAAACAAAAAAAAAAAABQAAAAZpbmNvbWUJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyCQEAAAABLQAAAAEFAAAABmluY29tZQUAAAALYmFzZUFzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAAAWkBAAAAFGN1cnJlbnRTeXNQYXJhbXNSRVNUAAAAAQAAAAxiYXNlQXNzZXRTdHIEAAAADXN5c1N0YXRlVHVwbGUJAQAAABtwcml2YXRlQ3VycmVudFN5c1BhcmFtc1JFU1QAAAABBQAAAAxiYXNlQXNzZXRTdHIEAAAABXByaWNlCAgFAAAADXN5c1N0YXRlVHVwbGUAAAACXzEAAAAFdmFsdWUEAAAAEWRlY2ltYWxzTXVsdFByaWNlCAgFAAAADXN5c1N0YXRlVHVwbGUAAAACXzIAAAAFdmFsdWUEAAAAEGJhc2VBc3NldEJhbGFuY2UICAUAAAANc3lzU3RhdGVUdXBsZQAAAAJfMwAAAAV2YWx1ZQQAAAAVdG90YWxMb2NrZWRCYXNlQW1vdW50CAgFAAAADXN5c1N0YXRlVHVwbGUAAAACXzQAAAAFdmFsdWUEAAAAE2Jhc2VBc3NldEJhbGFuY2VXQ08ICAUAAAANc3lzU3RhdGVUdXBsZQAAAAJfNQAAAAV2YWx1ZQQAAAANc2hhcmVFbWlzc2lvbggIBQAAAA1zeXNTdGF0ZVR1cGxlAAAAAl82AAAABXZhbHVlBAAAABljdXJySXRlclRvdGFsSW5CYXNlQW1vdW50CAgFAAAADXN5c1N0YXRlVHVwbGUAAAACXzcAAAAFdmFsdWUEAAAAGmN1cnJJdGVyVG90YWxJblNoYXJlQW1vdW50CAgFAAAADXN5c1N0YXRlVHVwbGUAAAACXzgAAAAFdmFsdWUEAAAAGHRvdGFsTG9ja2VkT3V0QmFzZUFtb3VudAgIBQAAAA1zeXNTdGF0ZVR1cGxlAAAAAl85AAAABXZhbHVlBAAAABl0b3RhbExvY2tlZE91dFNoYXJlQW1vdW50CAgFAAAADXN5c1N0YXRlVHVwbGUAAAADXzEwAAAABXZhbHVlBAAAABZkZWNpbWFsc011bHRCb3RoQXNzZXRzCAgFAAAADXN5c1N0YXRlVHVwbGUAAAADXzExAAAABXZhbHVlBAAAAAhwcmljZUFUSAgIBQAAAA1zeXNTdGF0ZVR1cGxlAAAAA18xMgAAAAV2YWx1ZQQAAAARcHJpY2VSZWNhbGN1bGF0ZWQICAUAAAANc3lzU3RhdGVUdXBsZQAAAANfMTMAAAAFdmFsdWUEAAAADXRvcHVwTGFzdFRpbWUICAUAAAANc3lzU3RhdGVUdXBsZQAAAANfMTQAAAAFdmFsdWUEAAAACHJlc3REYXRhCQAEuQAAAAIJAARMAAAAAgIAAAAZc3RhcnRDdXJyZW50U3lzUGFyYW1zUkVTVAkABEwAAAACCQABpAAAAAEFAAAABXByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAARZGVjaW1hbHNNdWx0UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABBiYXNlQXNzZXRCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAAVdG90YWxMb2NrZWRCYXNlQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAATYmFzZUFzc2V0QmFsYW5jZVdDTwkABEwAAAACCQABpAAAAAEFAAAADXNoYXJlRW1pc3Npb24JAARMAAAAAgkAAaQAAAABBQAAABljdXJySXRlclRvdGFsSW5CYXNlQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAaY3Vyckl0ZXJUb3RhbEluU2hhcmVBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAABh0b3RhbExvY2tlZE91dEJhc2VBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAABl0b3RhbExvY2tlZE91dFNoYXJlQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAWZGVjaW1hbHNNdWx0Qm90aEFzc2V0cwkABEwAAAACCQABpAAAAAEFAAAACHByaWNlQVRICQAETAAAAAIJAAGkAAAAAQUAAAARcHJpY2VSZWNhbGN1bGF0ZWQJAARMAAAAAgkAAaQAAAABBQAAAA10b3B1cExhc3RUaW1lCQAETAAAAAICAAAAF2VuZEN1cnJlbnRTeXNQYXJhbXNSRVNUBQAAAANuaWwFAAAAA1NFUAkAAAIAAAABBQAAAAhyZXN0RGF0YQAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAD3RhcmdldFB1YmxpY0tleQQAAAAHJG1hdGNoMAkBAAAAFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJwawUAAAAHJG1hdGNoMAUAAAACcGsDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAA90YXJnZXRQdWJsaWNLZXnmyAFs", "height": 3648985, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Gpxk17PkttcqbR5kPChQMTPCF57ryeu6KV1y66Wc7x9M Next: none Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
274274 func calcPrice (innerBaseStr,baseAssetId,shareAssetId,decimalsMultPrice) = genericCalcPrice(innerBaseStr, baseAssetId, 0, shareAssetId, decimalsMultPrice)
275275
276276
277-func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
277+func getManagerVaultAddressOrThis () = match getString(this, keyManagerVaultAddress()) {
278278 case s: String =>
279279 addressFromStringValue(s)
280280 case _ =>
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
77
88
99 func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key))
1010
1111
1212 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key))
1313
1414
1515 func IntE (key,val) = IntegerEntry(key, val)
1616
1717
1818 func StrE (key,val) = StringEntry(key, val)
1919
2020
2121 func failExecuteGet (msg,baseAssetStr,userAddressStr,submitTxIdStr,operationType) = throw(((((((((msg + ": baseAsset=") + baseAssetStr) + " userAddress=") + userAddressStr) + " submitTxId=") + submitTxIdStr) + " operation=") + operationType))
2222
2323
2424 func failSubmitLimitsExceeds (remainingBase,remainingShare,newRemainingBase,newRemainingShare) = throw((((((((("submit operation limits have been reached: " + " remainingBaseVal=") + toString(remainingBase)) + " remainingShareVal=") + toString(remainingShare)) + " newRemainingBaseVal=") + toString(newRemainingBase)) + " newRemainingShareVal=") + toString(newRemainingShare)))
2525
2626
2727 func failTopupManagerOnly (topupManagerAddress) = throw((("opertion denied: only topUpManager=" + topupManagerAddress) + " can send such transactions"))
2828
2929
3030 func failTopupMaxPriceDeviation (price,minAllowedPrice) = throw(((("topup is not allowed - max deviation from ATH price exceeds: newPrice=" + toString(price)) + " minAllowedPrice=") + toString(minAllowedPrice)))
3131
3232
3333 func convertShare2Base (shareAmount,price,priceMult) = fraction(shareAmount, price, priceMult)
3434
3535
3636 func convertBase2Share (baseAmount,price,priceMult) = fraction(baseAmount, priceMult, price)
3737
3838
3939 func keyAssetCfg (baseAssetStr) = ("%s%s%s__config__asset__" + baseAssetStr)
4040
4141
4242 func keyNextInternalAssetId () = "%s__nextInternalAssetId"
4343
4444
4545 func keyPriceLast (innerBaseStr) = ("%s%s%d__price__last__" + innerBaseStr)
4646
4747
4848 func keyPriceATH (innerBaseStr) = ("%s%s%d__price__ath__" + innerBaseStr)
4949
5050
5151 func keyPriceByTopUpIdx (innerBaseStr,topUpIdx) = makeString(["%s%s%d%d__price__byTopUpIdx", innerBaseStr, toString(topUpIdx)], SEP)
5252
5353
5454 func keyPriceHistory (innerBaseStr,h,timestamp) = makeString(["%s%s%d%d%d__price__history", innerBaseStr, toString(h), toString(timestamp)], SEP)
5555
5656
5757 func keyTotalLocked (innerBaseStr) = ("%s%s%d__total__locked__" + innerBaseStr)
5858
5959
6060 func keyTotalLockedByUser (innerBaseStr,userAddressStr) = makeString(["%s%s%d%s__total__locked", innerBaseStr, userAddressStr], SEP)
6161
6262
6363 func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset))
6464
6565
6666 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
6767
6868
6969 func keyMappingsShare2baseAssetId (shareAssetStr) = ("%s%s%s__mappings__share2baseAssetId__" + shareAssetStr)
7070
7171
7272 func keyMappingsBaseAsset2shareId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2shareId__" + baseAssetStr)
7373
7474
7575 func keyShutdownSubmitOperation (innerBaseStr) = ("%s%s%d__shutdown__submit__" + innerBaseStr)
7676
7777
7878 func keyShutdownManager (innerBaseStr) = ("%s%s%d__shutdown__manager__" + innerBaseStr)
7979
8080
8181 func keyTopUpCurrentIdx (innerBaseStr) = ("%s%s%d__topup__currentIdx__" + innerBaseStr)
8282
8383
8484 func keyTopUpLastHeight (innerBaseStr,sender) = makeString(["%s%s%s%d%s__topup__last__height", innerBaseStr, sender], SEP)
8585
8686
8787 func keyTopupMutext (innerBaseStr) = ("%s%s%d__topup__mutex__" + innerBaseStr)
8888
8989
9090 func keyTopupLastTimestamp (innerBaseStr) = ("%s%s%s%d__topup__last__timestamp__" + innerBaseStr)
9191
9292
9393 func keyTopupHistory (innerBaseStr,topupIdx) = makeString(["%s%s%d%d__topup__history", innerBaseStr, toString(topupIdx)], SEP)
9494
9595
9696 func keyLimitsRemaining (innerBaseStr) = ("%s%s%d__limits__remaining__" + innerBaseStr)
9797
9898
9999 func keyManagerVaultAddress () = "%s__managerVaultAddress"
100100
101101
102102 func keyManagerPublicKey () = "%s__managerPublicKey"
103103
104104
105105 let IdxCfgShareAssetId = 1
106106
107107 let IdxCfgInternalBaseAsset = 2
108108
109109 let IdxCfgDecimalsMultBothAssets = 3
110110
111111 let IdxCfgDecimalsMultPrice = 4
112112
113113 let IdxCfgGetDelayBlocks = 5
114114
115115 let IdxCfgTopupIntervalInBlocks = 6
116116
117117 let IdxCfgTopupMaxNegativePart = 7
118118
119119 let IdxCfgTopupManagerAddress = 8
120120
121121 let IdxCfgSubmitLimitsBaseMax = 9
122122
123123 let IdxCfgSubmitLimitsBaseReset = 10
124124
125125 let IdxCfgSubmitLimitsShareMax = 11
126126
127127 let IdxCfgSubmitLimitsShareReset = 12
128128
129129 let IdxCfgAdminAddress = 13
130130
131131 func dataAssetCfg (shareAssetStr,innerBaseStr,decimalsMultBothAssets,decimalsMultPrice,getDelayInBlocks,topupIntervalInBlocks,topupMaxNegativePart,topupManagerAddress,submitLimitsBaseMax,submitLimitsBaseReset,submitLimitsShareMax,submitLimitsShareReset,adminAddress) = makeString(["%s%d%d%d%d%d%d%s%d%d%d%d", shareAssetStr, innerBaseStr, toString(decimalsMultBothAssets), toString(decimalsMultPrice), toString(getDelayInBlocks), toString(topupIntervalInBlocks), toString(topupMaxNegativePart), topupManagerAddress, toString(submitLimitsBaseMax), toString(submitLimitsBaseReset), toString(submitLimitsShareMax), toString(submitLimitsShareReset), adminAddress], SEP)
132132
133133
134134 let IdxTotalLockedInShare = 1
135135
136136 let IdxTotalLockedOutBase = 2
137137
138138 let IdxTotalLockedInBase = 3
139139
140140 let IdxTotalLockedOutShare = 4
141141
142142 func dataTotalLocked (inShareAmount,outBaseAmount,inBaseAmount,outShareAmount) = makeString(["%d%d%d%d", toString(inShareAmount), toString(outBaseAmount), toString(inBaseAmount), toString(outShareAmount)], SEP)
143143
144144
145145 func dataTotalLockedInt (inShareAmount,outBaseAmount,inBaseAmount,outShareAmount) = [-1, inShareAmount, outBaseAmount, inBaseAmount, outShareAmount]
146146
147147
148148 func readTotalLocked (key) = {
149149 let totalLockedArray = split(valueOrElse(getString(this, key), dataTotalLocked(0, 0, 0, 0)), SEP)
150150 dataTotalLockedInt(parseIntValue(totalLockedArray[IdxTotalLockedInShare]), parseIntValue(totalLockedArray[IdxTotalLockedOutBase]), parseIntValue(totalLockedArray[IdxTotalLockedInBase]), parseIntValue(totalLockedArray[IdxTotalLockedOutShare]))
151151 }
152152
153153
154154 func calcTotalLockedDiff (direction,operationType,innerBaseStr,price,priceMult,inAmount,baseAssetId,shareAssetId) = {
155155 let t = (direction + operationType)
156156 let emptyVect = fromBase58String("")
157157 if ((t == "submitP"))
158158 then {
159159 let totalDiff = dataTotalLockedInt(0, 0, inAmount, 0)
160160 let userDiff = totalDiff
161161 $Tuple5(totalDiff, userDiff, 0, emptyVect, false)
162162 }
163163 else if ((t == "submitG"))
164164 then {
165165 let totalDiff = dataTotalLockedInt(inAmount, 0, 0, 0)
166166 let userDiff = totalDiff
167167 $Tuple5(totalDiff, userDiff, 0, emptyVect, true)
168168 }
169169 else if ((t == "executeP"))
170170 then {
171171 let outAmount = convertBase2Share(inAmount, price, priceMult)
172172 let totalDiff = dataTotalLockedInt(0, 0, 0, outAmount)
173173 let userDiff = dataTotalLockedInt(0, 0, inAmount, 0)
174174 $Tuple5(totalDiff, userDiff, outAmount, shareAssetId, false)
175175 }
176176 else if ((t == "executeG"))
177177 then {
178178 let outAmount = convertShare2Base(inAmount, price, priceMult)
179179 let totalDiff = dataTotalLockedInt(0, outAmount, 0, 0)
180180 let userDiff = dataTotalLockedInt(inAmount, 0, 0, 0)
181181 $Tuple5(totalDiff, userDiff, outAmount, baseAssetId, false)
182182 }
183183 else if ((t == "topup"))
184184 then {
185185 let totalLockedArray = readTotalLocked(keyTotalLocked(innerBaseStr))
186186 let totalLockedInBaseAmount = totalLockedArray[IdxTotalLockedInBase]
187187 let totalLockedInShareAmount = totalLockedArray[IdxTotalLockedInShare]
188188 let totalDiff = dataTotalLockedInt(totalLockedInShareAmount, (-1 * convertShare2Base(totalLockedInShareAmount, price, priceMult)), totalLockedInBaseAmount, (-1 * convertBase2Share(totalLockedInBaseAmount, price, priceMult)))
189189 $Tuple5(totalDiff, nil, 0, emptyVect, false)
190190 }
191191 else throw(("Unsupported Type " + t))
192192 }
193193
194194
195195 func TotalLockedStringEntry (action,key,diff) = {
196196 func UPDATE (a,b) = if ((action == "INCREMENT"))
197197 then (a + b)
198198 else if ((action == "DECREMENT"))
199199 then (a - b)
200200 else throw(("Unsupported action " + action))
201201
202202 let dataArray = readTotalLocked(key)
203203 StrE(key, dataTotalLocked(UPDATE(dataArray[IdxTotalLockedInShare], diff[IdxTotalLockedInShare]), UPDATE(dataArray[IdxTotalLockedOutBase], diff[IdxTotalLockedOutBase]), UPDATE(dataArray[IdxTotalLockedInBase], diff[IdxTotalLockedInBase]), UPDATE(dataArray[IdxTotalLockedOutShare], diff[IdxTotalLockedOutShare])))
204204 }
205205
206206
207207 func keyOperation (operationType,innerBaseStr,userAddress,txId) = makeString(["%s%d%s%s", operationType, innerBaseStr, userAddress, txId], SEP)
208208
209209
210210 let IdxOperStatus = 1
211211
212212 let IdxOperInAmount = 2
213213
214214 let IdxOperPrice = 3
215215
216216 let IdxOperOutAmount = 4
217217
218218 let IdxOperStartHeight = 5
219219
220220 let IdxOperStartTimestamp = 6
221221
222222 let IdxOperEndHeight = 7
223223
224224 let IdxOperEndTimestamp = 8
225225
226226 let IdxOperTopupUnlockIdx = 9
227227
228228 func privateDataOperationAllStrings (status,inAssetAmount,price,outAssetAmount,startHeight,startTimestamp,endHeight,endTimestamp,lock) = makeString(["%s%d%d%d%d%d%d%d%d", status, inAssetAmount, price, outAssetAmount, startHeight, startTimestamp, endHeight, endTimestamp, lock], SEP)
229229
230230
231231 func dataOperation (status,inAssetAmount,price,outAssetAmount,startHeight,startTimestamp,endHeight,endTimestamp,topupUnlockIdx) = privateDataOperationAllStrings(status, toString(inAssetAmount), toString(price), toString(outAssetAmount), toString(startHeight), toString(startTimestamp), toString(endHeight), toString(endTimestamp), toString(topupUnlockIdx))
232232
233233
234234 func dataOperationExecutionUpdate (currOperArray,newStatus,newPrice,newOutAmount) = privateDataOperationAllStrings(newStatus, currOperArray[IdxOperInAmount], toString(newPrice), toString(newOutAmount), currOperArray[IdxOperStartHeight], currOperArray[IdxOperStartTimestamp], toString(height), toString(lastBlock.timestamp), currOperArray[IdxOperTopupUnlockIdx])
235235
236236
237237 func readAssetCfgOrFail (baseAssetStr) = {
238238 let key = keyAssetCfg(baseAssetStr)
239239 split(getStringOrFail(key), SEP)
240240 }
241241
242242
243243 let IdxLimitsRemainingBase = 1
244244
245245 let IdxLimitsRemainingShare = 2
246246
247247 func RemainingLimitsStringEntry (key,baseRemainingLimit,shareRemainingLimit) = StrE(key, makeString(["%d%d", toString(baseRemainingLimit), toString(shareRemainingLimit)], SEP))
248248
249249
250250 func TopupMutexIntEntry (innerBaseStr,acquiredHeight) = IntE(keyTopupMutext(innerBaseStr), acquiredHeight)
251251
252252
253253 func genericCalcPrice (innerBaseStr,baseAssetId,topUpBaseAmount,shareAssetId,decimalsMultPrice) = {
254254 let totalLockedArray = readTotalLocked(keyTotalLocked(innerBaseStr))
255255 let totalLockedOutBaseAmount = totalLockedArray[IdxTotalLockedOutBase]
256256 let currIterTotalInBaseAmount = totalLockedArray[IdxTotalLockedInBase]
257257 let baseAssetBalance = assetBalance(this, baseAssetId)
258258 let baseAssetBalanceWCO = (((baseAssetBalance + topUpBaseAmount) - currIterTotalInBaseAmount) - totalLockedOutBaseAmount)
259259 let totalLockedOutShareAmount = totalLockedArray[IdxTotalLockedOutShare]
260260 let currIterTotalInShareAmount = totalLockedArray[IdxTotalLockedInShare]
261261 let shareEmission = value(assetInfo(shareAssetId)).quantity
262262 if ((0 > baseAssetBalanceWCO))
263263 then throw(((("baseAssetBalanceWco < 0: baseAssettBalance=" + toString(baseAssetBalance)) + " baseAssetBalanceWco=") + toString(baseAssetBalanceWCO)))
264264 else {
265265 let lastPrice = getIntOrFail(keyPriceLast(innerBaseStr))
266266 let price = if ((shareEmission == 0))
267267 then lastPrice
268268 else fraction(baseAssetBalanceWCO, decimalsMultPrice, shareEmission)
269269 $Tuple9(price, baseAssetBalance, -1, baseAssetBalanceWCO, shareEmission, currIterTotalInBaseAmount, currIterTotalInShareAmount, totalLockedOutBaseAmount, totalLockedOutShareAmount)
270270 }
271271 }
272272
273273
274274 func calcPrice (innerBaseStr,baseAssetId,shareAssetId,decimalsMultPrice) = genericCalcPrice(innerBaseStr, baseAssetId, 0, shareAssetId, decimalsMultPrice)
275275
276276
277-func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
277+func getManagerVaultAddressOrThis () = match getString(this, keyManagerVaultAddress()) {
278278 case s: String =>
279279 addressFromStringValue(s)
280280 case _ =>
281281 this
282282 }
283283
284284
285285 func managerPublicKeyOrUnit () = {
286286 let managerVaultAddress = getManagerVaultAddressOrThis()
287287 match getString(managerVaultAddress, keyManagerPublicKey()) {
288288 case s: String =>
289289 fromBase58String(s)
290290 case _: Unit =>
291291 unit
292292 case _ =>
293293 throw("Match error")
294294 }
295295 }
296296
297297
298298 func isManager (i) = match managerPublicKeyOrUnit() {
299299 case pk: ByteVector =>
300300 (i.callerPublicKey == pk)
301301 case _: Unit =>
302302 (i.caller == this)
303303 case _ =>
304304 throw("Match error")
305305 }
306306
307307
308308 func mustManager (i) = if (isManager(i))
309309 then true
310310 else throw("permission denied")
311311
312312
313313 func commonSubmit (operationType,i,inAmount,inAssetId,baseAssetStr) = {
314314 let inAssetStr = toBase58String(inAssetId)
315315 let userAddressStr = toString(i.caller)
316316 let baseAssetId = fromBase58String(baseAssetStr)
317317 let cfgArray = readAssetCfgOrFail(baseAssetStr)
318318 let shareAssetStr = cfgArray[IdxCfgShareAssetId]
319319 let shareAssetId = fromBase58String(shareAssetStr)
320320 let decimalsMultBothAssets = parseIntValue(cfgArray[IdxCfgDecimalsMultBothAssets])
321321 let innerBaseStr = cfgArray[IdxCfgInternalBaseAsset]
322322 let getDelayBlocks = parseIntValue(cfgArray[IdxCfgGetDelayBlocks])
323323 let limitsKEY = keyLimitsRemaining(innerBaseStr)
324324 let limitsCfgArray = split(getStringOrFail(limitsKEY), SEP)
325325 let limitsRemainingBase = parseIntValue(limitsCfgArray[IdxLimitsRemainingBase])
326326 let limitsRemainingShare = parseIntValue(limitsCfgArray[IdxLimitsRemainingShare])
327327 let isSubmitBlocked = valueOrElse(getBoolean(this, keyShutdownSubmitOperation(innerBaseStr)), false)
328328 if (isSubmitBlocked)
329329 then throw("submit operation is blocked")
330330 else {
331331 let operationsMutex = valueOrElse(getInteger(this, keyTopupMutext(innerBaseStr)), 0)
332332 if (((operationsMutex + 60) > height))
333333 then throw("submit operations are blocked by topup manager")
334334 else {
335335 let diffTuple = calcTotalLockedDiff("submit", operationType, innerBaseStr, 0, 0, inAmount, baseAssetId, shareAssetId)
336336 let limitsRemainingBaseNew = (limitsRemainingBase - diffTuple._2[IdxTotalLockedInBase])
337337 let limitsRemainingShareNew = (limitsRemainingShare - diffTuple._2[IdxTotalLockedInShare])
338338 if (if ((0 > limitsRemainingBaseNew))
339339 then true
340340 else (0 > limitsRemainingShareNew))
341341 then failSubmitLimitsExceeds(limitsRemainingBase, limitsRemainingShare, limitsRemainingBaseNew, limitsRemainingShareNew)
342342 else {
343343 let topUpCurrentIdx = getIntOrFail(keyTopUpCurrentIdx(innerBaseStr))
344344 let endHeight = if (diffTuple._5)
345345 then (height + getDelayBlocks)
346346 else height
347347 ((([StrE(keyOperation(operationType, innerBaseStr, userAddressStr, toBase58String(i.transactionId)), dataOperation("PENDING", inAmount, 0, 0, height, lastBlock.timestamp, endHeight, 0, (topUpCurrentIdx + 1)))] :+ TotalLockedStringEntry("INCREMENT", keyTotalLocked(innerBaseStr), diffTuple._1)) :+ TotalLockedStringEntry("INCREMENT", keyTotalLockedByUser(innerBaseStr, userAddressStr), diffTuple._2)) :+ RemainingLimitsStringEntry(limitsKEY, limitsRemainingBaseNew, limitsRemainingShareNew))
348348 }
349349 }
350350 }
351351 }
352352
353353
354354 func commonExecute (operationType,baseAssetStr,userAddressStr,submitTxIdStr) = {
355355 let userAddress = addressFromStringValue(userAddressStr)
356356 let assetCfgArray = readAssetCfgOrFail(baseAssetStr)
357357 let shareAssetId = fromBase58String(assetCfgArray[IdxCfgShareAssetId])
358358 let innerBaseStr = assetCfgArray[IdxCfgInternalBaseAsset]
359359 let decimalsMultPrice = parseIntValue(assetCfgArray[IdxCfgDecimalsMultPrice])
360360 let baseAssetId = fromBase58String(baseAssetStr)
361361 let opKey = keyOperation(operationType, innerBaseStr, userAddressStr, submitTxIdStr)
362362 let opArray = split(getStringOrFail(opKey), SEP)
363363 let status = opArray[IdxOperStatus]
364364 let inAmount = parseIntValue(opArray[IdxOperInAmount])
365365 let topupUnlockIdx = parseIntValue(opArray[IdxOperTopupUnlockIdx])
366366 let unlockHeight = parseIntValue(opArray[IdxOperEndHeight])
367367 let currTopUpIdx = getIntOrFail(keyTopUpCurrentIdx(innerBaseStr))
368368 let priceByTopUpId = getIntOrFail(keyPriceByTopUpIdx(innerBaseStr, topupUnlockIdx))
369369 if ((status != "PENDING"))
370370 then failExecuteGet("Status is not PENDING", baseAssetStr, userAddressStr, submitTxIdStr, operationType)
371371 else if ((topupUnlockIdx > currTopUpIdx))
372372 then failExecuteGet(((("OperLock[" + toString(topupUnlockIdx)) + "] > ") + toString(currTopUpIdx)), baseAssetStr, userAddressStr, submitTxIdStr, operationType)
373373 else if ((unlockHeight > height))
374374 then failExecuteGet(((("OperHeightLock[" + toString(unlockHeight)) + "] > ") + toString(height)), baseAssetStr, userAddressStr, submitTxIdStr, operationType)
375375 else {
376376 let diffTuple = calcTotalLockedDiff("execute", operationType, innerBaseStr, priceByTopUpId, decimalsMultPrice, inAmount, baseAssetId, shareAssetId)
377377 let outAmount = diffTuple._3
378378 let outTransferData = if ((diffTuple._4 == baseAssetId))
379379 then [ScriptTransfer(userAddress, outAmount, baseAssetId)]
380380 else [ScriptTransfer(userAddress, outAmount, shareAssetId)]
381381 (((outTransferData :+ StrE(opKey, dataOperationExecutionUpdate(opArray, "FINISHED", priceByTopUpId, outAmount))) :+ TotalLockedStringEntry("DECREMENT", keyTotalLocked(innerBaseStr), diffTuple._1)) :+ TotalLockedStringEntry("DECREMENT", keyTotalLockedByUser(innerBaseStr, userAddressStr), diffTuple._2))
382382 }
383383 }
384384
385385
386386 func privateCurrentSysParamsREST (baseAssetStr) = {
387387 let baseAssetId = fromBase58String(baseAssetStr)
388388 let cfgArray = readAssetCfgOrFail(baseAssetStr)
389389 let shareAssetStr = cfgArray[IdxCfgShareAssetId]
390390 let shareAssetId = fromBase58String(shareAssetStr)
391391 let decimalsMultBothAssetsVal = parseIntValue(cfgArray[IdxCfgDecimalsMultBothAssets])
392392 let decimalsMultPriceVal = parseIntValue(cfgArray[IdxCfgDecimalsMultPrice])
393393 let innerBaseStr = cfgArray[IdxCfgInternalBaseAsset]
394394 let priceAthKEY = keyPriceATH(innerBaseStr)
395395 let priceAthVal = valueOrElse(getInteger(this, priceAthKEY), 0)
396396 let priceLastKEY = keyPriceLast(innerBaseStr)
397397 let priceLastVal = valueOrElse(getInteger(this, priceLastKEY), 0)
398398 let topupLastTimeKEY = keyTopupLastTimestamp(innerBaseStr)
399399 let topupLastTimeVal = valueOrElse(getInteger(this, topupLastTimeKEY), 0)
400400 let sysState = calcPrice(innerBaseStr, baseAssetId, shareAssetId, decimalsMultPriceVal)
401401 $Tuple14(IntE("price", priceLastVal), IntE("decimalsMultPrice", decimalsMultPriceVal), IntE("baseAssetBalance", sysState._2), IntE("-1", sysState._3), IntE("baseAssetBalanceWCO", sysState._4), IntE("shareEmission", sysState._5), IntE("currIterTotalInBaseAmount", sysState._6), IntE("currIterTotalInShareAmount", sysState._7), IntE("totalLockedOutBaseAmount", sysState._8), IntE("totalLockedOutShareAmount", sysState._9), IntE("decimalsMultBothAssets", decimalsMultBothAssetsVal), IntE("priceATH", priceAthVal), IntE("priceRecalculated", sysState._1), IntE("topupLastTimestamp", topupLastTimeVal))
402402 }
403403
404404
405405 @Callable(i)
406406 func adminRegisterAsset (baseAssetStr,shareAssetName,shareAssetDescr,getDelayinBlocks,shutdownManagerAddress,startPrice,topupIntervalInBlocks,topupMaxNegativePart,topupManagerAddress,submitLimitsBaseMax,submitLimitsBaseReset,submitLimitsShareMax,submitLimitsShareReset,adminAddress) = {
407407 let baseAssetId = fromBase58String(baseAssetStr)
408408 let bothAssetsDecimals = value(assetInfo(baseAssetId)).decimals
409409 let decimalsMultBothAssets = pow(10, 0, bothAssetsDecimals, 0, 0, DOWN)
410410 let decimalsMultPrice = ((100 * 1000) * 1000)
411411 let topupMaxNegativePercents = fraction(topupMaxNegativePart, 100, decimalsMultBothAssets)
412412 let baseAssetBalance = assetBalance(this, baseAssetId)
413413 let checkCaller = mustManager(i)
414414 if ((checkCaller == checkCaller))
415415 then if ((baseAssetBalance == 0))
416416 then throw(((toString(this) + " must have any initial balance of ") + baseAssetStr))
417417 else if (isDefined(getString(this, keyAssetCfg(baseAssetStr))))
418418 then throw((baseAssetStr + " has been already registered"))
419419 else if ((toString(addressFromStringValue(shutdownManagerAddress)) != shutdownManagerAddress))
420420 then throw("invalid shutdownManagerAddress")
421421 else if ((toString(addressFromStringValue(topupManagerAddress)) != topupManagerAddress))
422422 then throw("invalid topupManagerAddress")
423423 else if ((0 > getDelayinBlocks))
424424 then throw(("invalid getDelayinBlocks=" + toString(getDelayinBlocks)))
425425 else if (if ((0 >= topupMaxNegativePercents))
426426 then true
427427 else (topupMaxNegativePercents >= 99))
428428 then throw("invalid topupMaxNegativePart parameter")
429429 else {
430430 let shareInitAmount = convertBase2Share(baseAssetBalance, startPrice, decimalsMultPrice)
431431 let shareAssetIssueAction = Issue(shareAssetName, shareAssetDescr, shareInitAmount, bothAssetsDecimals, true)
432432 let shareAssetId = calculateAssetId(shareAssetIssueAction)
433433 let shareAssetStr = toBase58String(shareAssetId)
434434 let internalBaseAssetId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
435435 let innerBaseStr = toString(internalBaseAssetId)
436436 [StrE(keyAssetCfg(baseAssetStr), dataAssetCfg(shareAssetStr, innerBaseStr, decimalsMultBothAssets, decimalsMultPrice, getDelayinBlocks, topupIntervalInBlocks, topupMaxNegativePart, topupManagerAddress, submitLimitsBaseMax, submitLimitsBaseReset, submitLimitsShareMax, submitLimitsShareReset, adminAddress)), StrE(keyMappingsInternal2baseAssetId(internalBaseAssetId), baseAssetStr), StrE(keyMappingsBaseAsset2internalId(baseAssetStr), innerBaseStr), StrE(keyMappingsShare2baseAssetId(shareAssetStr), baseAssetStr), StrE(keyMappingsBaseAsset2shareId(baseAssetStr), shareAssetStr), BooleanEntry(keyShutdownSubmitOperation(innerBaseStr), false), StrE(keyShutdownManager(innerBaseStr), shutdownManagerAddress), IntE(keyNextInternalAssetId(), (internalBaseAssetId + 1)), IntE(keyPriceLast(innerBaseStr), startPrice), IntE(keyPriceATH(innerBaseStr), startPrice), IntE(keyPriceHistory(innerBaseStr, height, lastBlock.timestamp), startPrice), IntE(keyTopUpCurrentIdx(innerBaseStr), 0), RemainingLimitsStringEntry(keyLimitsRemaining(innerBaseStr), submitLimitsBaseMax, submitLimitsShareMax), shareAssetIssueAction, ScriptTransfer(addressFromStringValue(topupManagerAddress), shareInitAmount, shareAssetId)]
437437 }
438438 else throw("Strict value is not equal to itself.")
439439 }
440440
441441
442442
443443 @Callable(i)
444444 func shutdownSubmits (internalBaseAssetId) = {
445445 let checkCaller = mustManager(i)
446446 if ((checkCaller == checkCaller))
447447 then {
448448 let internalBaseAssetIdStr = toString(internalBaseAssetId)
449449 let baseAssetIdStr = getStringOrFail(keyMappingsInternal2baseAssetId(internalBaseAssetId))
450450 let shutdownManagerAddress = getStringOrFail(keyShutdownManager(internalBaseAssetIdStr))
451451 if ((1 > size(baseAssetIdStr)))
452452 then throw("invalid internalBaseAssetId")
453453 else [BooleanEntry(keyShutdownSubmitOperation(toString(internalBaseAssetId)), true)]
454454 }
455455 else throw("Strict value is not equal to itself.")
456456 }
457457
458458
459459
460460 @Callable(i)
461461 func submitPut () = {
462462 let pmt = value(i.payments[0])
463463 let inAmount = pmt.amount
464464 let inAssetId = value(pmt.assetId)
465465 let baseAssetStr = toBase58String(inAssetId)
466466 commonSubmit("P", i, inAmount, inAssetId, baseAssetStr)
467467 }
468468
469469
470470
471471 @Callable(i)
472472 func submitGet () = {
473473 let pmt = value(i.payments[0])
474474 let inAmount = pmt.amount
475475 let inAssetId = value(pmt.assetId)
476476 let shareAssetStr = toBase58String(inAssetId)
477477 let baseAssetStr = getStringOrFail(keyMappingsShare2baseAssetId(shareAssetStr))
478478 commonSubmit("G", i, inAmount, inAssetId, baseAssetStr)
479479 }
480480
481481
482482
483483 @Callable(i)
484484 func executePut (baseAssetStr,userAddressStr,submitTxIdStr) = commonExecute("P", baseAssetStr, userAddressStr, submitTxIdStr)
485485
486486
487487
488488 @Callable(i)
489489 func executeGet (baseAssetStr,userAddressStr,submitTxIdStr) = commonExecute("G", baseAssetStr, userAddressStr, submitTxIdStr)
490490
491491
492492
493493 @Callable(i)
494494 func operationsMutex (baseAssetStr) = {
495495 let assetCfgArray = readAssetCfgOrFail(baseAssetStr)
496496 let topUpManagerAddressStr = assetCfgArray[IdxCfgTopupManagerAddress]
497497 let innerBaseStr = assetCfgArray[IdxCfgInternalBaseAsset]
498498 if ((toString(i.caller) != topUpManagerAddressStr))
499499 then failTopupManagerOnly(topUpManagerAddressStr)
500500 else [TopupMutexIntEntry(innerBaseStr, height)]
501501 }
502502
503503
504504
505505 @Callable(i)
506506 func topUpBalance (baseAssetStr,income) = {
507507 let baseAssetId = fromBase58String(baseAssetStr)
508508 let cfg = readAssetCfgOrFail(baseAssetStr)
509509 let shareAssetId = fromBase58String(cfg[IdxCfgShareAssetId])
510510 let priceMult = parseIntValue(cfg[IdxCfgDecimalsMultPrice])
511511 let bothAssetMult = parseIntValue(cfg[IdxCfgDecimalsMultBothAssets])
512512 let topupIntervalInBlocks = parseIntValue(cfg[IdxCfgTopupIntervalInBlocks])
513513 let topupMaxNegativePart = parseIntValue(cfg[IdxCfgTopupMaxNegativePart])
514514 let innerBaseStr = cfg[IdxCfgInternalBaseAsset]
515515 let topUpManagerAddressStr = cfg[IdxCfgTopupManagerAddress]
516516 let submitLimitsBaseMax = parseIntValue(cfg[IdxCfgSubmitLimitsBaseMax])
517517 let submitLimitsShareMax = parseIntValue(cfg[IdxCfgSubmitLimitsShareMax])
518518 let topUpCurrentIdxKEY = keyTopUpCurrentIdx(innerBaseStr)
519519 let prevTopUpIdx = getIntOrFail(topUpCurrentIdxKEY)
520520 let currentTopUpIdx = (prevTopUpIdx + 1)
521521 let topUpLastHeightKEY = keyTopUpLastHeight(innerBaseStr, toString(i.caller))
522522 let topUpLastHeight = valueOrElse(getInteger(this, topUpLastHeightKEY), 0)
523523 let priceAthKEY = keyPriceATH(innerBaseStr)
524524 let prevPriceATH = valueOrElse(getInteger(this, priceAthKEY), 0)
525525 if ((toString(i.caller) != topUpManagerAddressStr))
526526 then failTopupManagerOnly(topUpManagerAddressStr)
527527 else if ((topupIntervalInBlocks > (height - topUpLastHeight)))
528528 then throw((("1 topup per " + toString(topupIntervalInBlocks)) + " blocks from the same address is allowed"))
529529 else {
530530 let price = genericCalcPrice(innerBaseStr, baseAssetId, income, shareAssetId, priceMult)._1
531531 let valid = if ((income > 0))
532532 then {
533533 let pmt = value(i.payments[0])
534534 let pmtAssetId = value(pmt.assetId)
535535 if ((baseAssetId != pmtAssetId))
536536 then throw("attached payment's asset id is NOT matched passed baseAssetStr")
537537 else if ((size(i.payments) > 1))
538538 then throw("only one payment can be attached")
539539 else if ((pmt.amount != income))
540540 then throw("attached payment.amount is NOT matched passed income argument")
541541 else true
542542 }
543543 else if ((0 > income))
544544 then {
545545 let minAllowedPrice = fraction(prevPriceATH, ((1 * bothAssetMult) - topupMaxNegativePart), bothAssetMult)
546546 if ((minAllowedPrice > price))
547547 then failTopupMaxPriceDeviation(price, minAllowedPrice)
548548 else true
549549 }
550550 else throw("zero income is not allowed")
551551 if (!(valid))
552552 then throw("validation failed")
553553 else {
554554 let diffTuple = calcTotalLockedDiff("topup", "", innerBaseStr, price, priceMult, 0, baseAssetId, shareAssetId)
555555 let topupTotalDiff = diffTuple._1
556556 ((((((([IntE(keyPriceLast(innerBaseStr), price), IntE(keyPriceHistory(innerBaseStr, height, lastBlock.timestamp), price), IntE(keyPriceByTopUpIdx(innerBaseStr, currentTopUpIdx), price), IntE(topUpCurrentIdxKEY, currentTopUpIdx), IntE(priceAthKEY, if ((price > prevPriceATH))
557557 then price
558558 else prevPriceATH), IntE(topUpLastHeightKEY, height)] :+ TotalLockedStringEntry("DECREMENT", keyTotalLocked(innerBaseStr), topupTotalDiff)) :+ TopupMutexIntEntry(innerBaseStr, 0)) :+ IntE(keyTopupLastTimestamp(innerBaseStr), lastBlock.timestamp)) :+ RemainingLimitsStringEntry(keyLimitsRemaining(innerBaseStr), submitLimitsBaseMax, submitLimitsShareMax)) :+ Burn(shareAssetId, topupTotalDiff[IdxTotalLockedInShare])) :+ Reissue(shareAssetId, -(topupTotalDiff[IdxTotalLockedOutShare]), true)) ++ (if ((0 > income))
559559 then [ScriptTransfer(i.caller, -(income), baseAssetId)]
560560 else nil))
561561 }
562562 }
563563 }
564564
565565
566566
567567 @Callable(i)
568568 func currentSysParamsREST (baseAssetStr) = {
569569 let sysStateTuple = privateCurrentSysParamsREST(baseAssetStr)
570570 let price = sysStateTuple._1.value
571571 let decimalsMultPrice = sysStateTuple._2.value
572572 let baseAssetBalance = sysStateTuple._3.value
573573 let totalLockedBaseAmount = sysStateTuple._4.value
574574 let baseAssetBalanceWCO = sysStateTuple._5.value
575575 let shareEmission = sysStateTuple._6.value
576576 let currIterTotalInBaseAmount = sysStateTuple._7.value
577577 let currIterTotalInShareAmount = sysStateTuple._8.value
578578 let totalLockedOutBaseAmount = sysStateTuple._9.value
579579 let totalLockedOutShareAmount = sysStateTuple._10.value
580580 let decimalsMultBothAssets = sysStateTuple._11.value
581581 let priceATH = sysStateTuple._12.value
582582 let priceRecalculated = sysStateTuple._13.value
583583 let topupLastTime = sysStateTuple._14.value
584584 let restData = makeString(["startCurrentSysParamsREST", toString(price), toString(decimalsMultPrice), toString(baseAssetBalance), toString(totalLockedBaseAmount), toString(baseAssetBalanceWCO), toString(shareEmission), toString(currIterTotalInBaseAmount), toString(currIterTotalInShareAmount), toString(totalLockedOutBaseAmount), toString(totalLockedOutShareAmount), toString(decimalsMultBothAssets), toString(priceATH), toString(priceRecalculated), toString(topupLastTime), "endCurrentSysParamsREST"], SEP)
585585 throw(restData)
586586 }
587587
588588
589589 @Verifier(tx)
590590 func verify () = {
591591 let targetPublicKey = match managerPublicKeyOrUnit() {
592592 case pk: ByteVector =>
593593 pk
594594 case _: Unit =>
595595 tx.senderPublicKey
596596 case _ =>
597597 throw("Match error")
598598 }
599599 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
600600 }
601601

github/deemru/w8io/6500d08 
91.95 ms