tx · fa8yUhCwxDGUYHd76azfUCprCgphJXdFQPPYppjsa3t 3MvrTeyB8RQcdjnU76bpg5WnBPsBptfvCBt: -0.01000000 Waves 2021.09.13 22:47 [1701717] smart account 3MvrTeyB8RQcdjnU76bpg5WnBPsBptfvCBt > SELF 0.00000000 Waves
{ "type": 13, "id": "fa8yUhCwxDGUYHd76azfUCprCgphJXdFQPPYppjsa3t", "fee": 1000000, "feeAssetId": null, "timestamp": 1631562494622, "version": 2, "chainId": 84, "sender": "3MvrTeyB8RQcdjnU76bpg5WnBPsBptfvCBt", "senderPublicKey": "Dd4gdSrciSyWaLM8EfohSYhmDDp7GiVH6K9N1Mj8zFy", "proofs": [ "5UMF9zzaQQ3UwmSQaHnJkQsFcaKufFetNyoT68K5c81nQneTMjRftbBqhqRPqnfS9WGDufKz4rxvDeiSLECNma3X" ], "script": "base64:AAIFAAAAAAAAACkIAhIECgIBBBIAEgQKAggIEgASBQoDAQEIEgUKAwEBCBIFCgMIAQgSAAAAADgAAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAB0FkZHJlc3MAAAABAQAAABoBVGKj2upWaZ+pQUgYRThtGvhV6u4YNF7hRQAAAAAKbFBkZWNpbWFscwAAAAAAAAAACAAAAAAGc2NhbGU4AAAAAAAF9eEAAAAAAAdzY2FsZTE4CQABNgAAAAEADeC2s6dkAAAAAAAAA1NFUAIAAAACX18AAAAAClBvb2xBY3RpdmUAAAAAAAAAAAEAAAAAD1Bvb2xQdXREaXNhYmxlZAAAAAAAAAAAAgAAAAATUG9vbE1hdGNoZXJEaXNhYmxlZAAAAAAAAAAAAwAAAAAMUG9vbFNodXRkb3duAAAAAAAAAAAEAAAAAA5pZHhQb29sQWRkcmVzcwAAAAAAAAAAAQAAAAANaWR4UG9vbFN0YXR1cwAAAAAAAAAAAgAAAAAQaWR4UG9vbExQQXNzZXRJZAAAAAAAAAAAAwAAAAAQaWR4QW1vdW50QXNzZXRJZAAAAAAAAAAABAAAAAAPaWR4UHJpY2VBc3NldElkAAAAAAAAAAAFAAAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzAAAAAAAAAAAGAAAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMAAAAAAAAAAAcAAAAAGGlkeEFtb3VudEFzc2V0SW50ZXJuYWxJZAAAAAAAAAAACAAAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQAAAAAAAAAAAkAAAAAEmlkeExQQXNzZXREZWNpbWFscwAAAAAAAAAACgAAAAATaWR4TWF0Y2hlclB1YmxpY0tleQAAAAAAAAAACwAAAAAVaWR4UG9vbEFtb3VudEFzc2V0QW10AAAAAAAAAAABAAAAABRpZHhQb29sUHJpY2VBc3NldEFtdAAAAAAAAAAAAgAAAAARaWR4UG9vbExQQXNzZXRBbXQAAAAAAAAAAAMAAAAAGWlkeEZhY3RvcnlTdGFraW5nQ29udHJhY3QAAAAAAAAAAAEAAAAAGGlkeEZhY3RvcnlCb29zdGluZ0NvbmZpZwAAAAAAAAAAAgEAAAAMa2V5UHJpY2VMYXN0AAAAAAIAAAARJXMlc19fcHJpY2VfX2xhc3QBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIAAAABaAAAAAl0aW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAABglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAARMAAAAAgkAAaQAAAABBQAAAAFoCQAETAAAAAIJAAGkAAAAAQUAAAAJdGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAAQa2V5UG9vbExpcXVpZGl0eQAAAAIAAAATaW50ZXJuYWxBbW91bnRBc3NldAAAABJpbnRlcm5hbFByaWNlQXNzZXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIJWQlZCVzX18FAAAAE2ludGVybmFsQW1vdW50QXNzZXQCAAAAAl9fBQAAABJpbnRlcm5hbFByaWNlQXNzZXQCAAAACF9fbG9ja2VkAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwAAABNpbnRlcm5hbEFtb3VudEFzc2V0AAAAEmludGVybmFsUHJpY2VBc3NldAAAAAt1c2VyQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKJWQlZCVzJXNfXwUAAAATaW50ZXJuYWxBbW91bnRBc3NldAIAAAACX18FAAAAEmludGVybmFsUHJpY2VBc3NldAIAAAACX18FAAAAC3VzZXJBZGRyZXNzAgAAAAhfX2xvY2tlZAEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgAAAAt1c2VyQWRkcmVzcwAAAAR0eElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAslcyVzJXNfX1BfXwUAAAALdXNlckFkZHJlc3MCAAAAAl9fBQAAAAR0eElkAQAAABJrZXlHZXRBY3Rpb25CeVVzZXIAAAACAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACyVzJXMlc19fR19fBQAAAAt1c2VyQWRkcmVzcwIAAAACX18FAAAABHR4SWQBAAAADmtleUFtb3VudEFzc2V0AAAAAAIAAAAPJXNfX2Ftb3VudEFzc2V0AQAAAA1rZXlQcmljZUFzc2V0AAAAAAIAAAAOJXNfX3ByaWNlQXNzZXQBAAAAEGtleUZhY3RvcnlDb25maWcAAAAAAgAAABElc19fZmFjdG9yeUNvbmZpZwEAAAApa2V5TWFwcGluZ1Bvb2xDb250cmFjdEFkZHJlc3NUb1Bvb2xBc3NldHMAAAABAAAAE3Bvb2xDb250cmFjdEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAAAglcyVzJXNfXwUAAAATcG9vbENvbnRyYWN0QWRkcmVzcwIAAAAgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQBAAAADWtleVBvb2xDb25maWcAAAACAAAAE2Ftb3VudEFzc2V0SW50ZXJuYWwAAAAScHJpY2VBc3NldEludGVybmFsCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACCVkJWQlc19fBQAAABNhbW91bnRBc3NldEludGVybmFsAgAAAAJfXwUAAAAScHJpY2VBc3NldEludGVybmFsAgAAAAhfX2NvbmZpZwEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEAAAAMYmFzZUFzc2V0U3RyCQABLAAAAAICAAAAKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAAAADGJhc2VBc3NldFN0cgEAAAATa2V5QWxsUG9vbHNTaHV0ZG93bgAAAAACAAAADCVzX19zaHV0ZG93bgEAAAANa2V5UG9vbFdlaWdodAAAAAEAAAAPY29udHJhY3RBZGRyZXNzCQABLAAAAAICAAAAEiVzJXNfX3Bvb2xXZWlnaHRfXwUAAAAPY29udHJhY3RBZGRyZXNzAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABNrZXlBbGxQb29sc1NodXRkb3duAAAAAAcBAAAADWdldFBvb2xDb25maWcAAAAABAAAAA9wb29sQW1vdW50QXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAOa2V5QW1vdW50QXNzZXQAAAAAAgAAACBObyBjb25maWcgZm9yIGFtb3VudCBhc3NldCBmb3VuZAQAAAAOcG9vbFByaWNlQXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAANa2V5UHJpY2VBc3NldAAAAAACAAAAH05vIGNvbmZpZyBmb3IgcHJpY2UgYXNzZXQgZm91bmQEAAAAFnBvb2xQcmljZUFzc2V0SW50ZXJuYWwJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAB9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAAAAAQUAAAAOcG9vbFByaWNlQXNzZXQCAAAAKE5vIGNvbmZpZyBmb3IgaW50ZXJuYWwgcHJpY2UgYXNzZXQgZm91bmQEAAAAF3Bvb2xBbW91bnRBc3NldEludGVybmFsCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEFAAAAD3Bvb2xBbW91bnRBc3NldAIAAAApTm8gY29uZmlnIGZvciBpbnRlcm5hbCBhbW91bnQgYXNzZXQgZm91bmQJAAS1AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAADWtleVBvb2xDb25maWcAAAACCQABpAAAAAEFAAAAF3Bvb2xBbW91bnRBc3NldEludGVybmFsCQABpAAAAAEFAAAAFnBvb2xQcmljZUFzc2V0SW50ZXJuYWwCAAAAKE5vIGZhY3RvcnkgY29uZmlnIGZvdW5kIGZvciBwb29sIGFzc2V0cy4FAAAAA1NFUAEAAAAQZ2V0RmFjdG9yeUNvbmZpZwAAAAAJAAS1AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAEGtleUZhY3RvcnlDb25maWcAAAAAAgAAABhObyBmYWN0b3J5IGNvbmZpZyBmb3VuZC4FAAAAA1NFUAEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEHQAAAAIFAAAABHRoaXMJAQAAABBrZXlQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAMJAQAAAAlpc0RlZmluZWQAAAABBQAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEtQAAAAIJAQAAAAV2YWx1ZQAAAAEFAAAAGWN1cnJlbnRQb29sTGlxdWlkaXR5VmFsdWUFAAAAA1NFUAkABEwAAAACAgAAAAAJAARMAAAAAgIAAAABMAkABEwAAAACAgAAAAEwCQAETAAAAAICAAAAATAFAAAAA25pbAEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkAAAAC3VzZXJBZGRyZXNzBAAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEHQAAAAIFAAAABHRoaXMJAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAALdXNlckFkZHJlc3MDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAZY3VycmVudFBvb2xMaXF1aWRpdHlWYWx1ZQkABLUAAAACCQEAAAAFdmFsdWUAAAABBQAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlBQAAAANTRVAJAARMAAAAAgIAAAAACQAETAAAAAICAAAAATAJAARMAAAAAgIAAAABMAkABEwAAAACAgAAAAEwCQAETAAAAAICAAAAATAFAAAAA25pbAEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADAAAAEWFtb3VudEFzc2V0TG9ja2VkAAAAEHByaWNlQXNzZXRMb2NrZWQAAAANbHBUb2tlbkxvY2tlZAkABLkAAAACCQAETAAAAAICAAAABiVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEWFtb3VudEFzc2V0TG9ja2VkCQAETAAAAAIJAAGkAAAAAQUAAAAQcHJpY2VBc3NldExvY2tlZAkABEwAAAACCQABpAAAAAEFAAAADWxwVG9rZW5Mb2NrZWQFAAAAA25pbAUAAAADU0VQAQAAABdkYXRhUG9vbExpcXVpZGl0eUJ5VXNlcgAAAAQAAAARYW1vdW50QXNzZXRMb2NrZWQAAAAQcHJpY2VBc3NldExvY2tlZAAAAA1scFRva2VuTG9ja2VkAAAAC3VzZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAGJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAARYW1vdW50QXNzZXRMb2NrZWQJAARMAAAAAgkAAaQAAAABBQAAABBwcmljZUFzc2V0TG9ja2VkCQAETAAAAAIJAAGkAAAAAQUAAAANbHBUb2tlbkxvY2tlZAUAAAADbmlsBQAAAANTRVABAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACAAAABBpbkFtb3VudEFzc2V0QW10AAAAD2luUHJpY2VBc3NldEFtdAAAAAhvdXRMcEFtdAAAAAVwcmljZQAAAB1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlcgAAABVzbGlwcGFnZVRvbGVyYW5jZVJlYWwAAAAIdHhIZWlnaHQAAAALdHhUaW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEGluQW1vdW50QXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAA9pblByaWNlQXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAAhvdXRMcEFtdAkABEwAAAACCQABpAAAAAEFAAAABXByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAdc2xpcHBhZ2VUb2xlcmFuY2VQYXNzZWRCeVVzZXIJAARMAAAAAgkAAaQAAAABBQAAABVzbGlwcGFnZVRvbGVyYW5jZVJlYWwJAARMAAAAAgkAAaQAAAABBQAAAAh0eEhlaWdodAkABEwAAAACCQABpAAAAAEFAAAAC3R4VGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAARZGF0YUdldEFjdGlvbkluZm8AAAAGAAAAEW91dEFtb3VudEFzc2V0QW10AAAAEG91dFByaWNlQXNzZXRBbXQAAAAHaW5McEFtdAAAAAVwcmljZQAAAAh0eEhlaWdodAAAAAt0eFRpbWVzdGFtcAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEW91dEFtb3VudEFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAQb3V0UHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAB2luTHBBbXQJAARMAAAAAgkAAaQAAAABBQAAAAVwcmljZQkABEwAAAACCQABpAAAAAEFAAAACHR4SGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAALdHhUaW1lc3RhbXAFAAAAA25pbAUAAAADU0VQAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMAAAAGYW1vdW50AAAAC3Jlc3VsdFNjYWxlAAAADGN1cnJlbnRTY2FsZQkAAGsAAAADBQAAAAZhbW91bnQFAAAAC3Jlc3VsdFNjYWxlBQAAAAxjdXJyZW50U2NhbGUBAAAADmNhbGN1bGF0ZVByaWNlAAAAAgAAABNwcmljZUFzc2V0TG9ja2VkQW10AAAAFWFtb3VudEFzc2V0bExvY2tlZEFtdAkAAGsAAAADBQAAABNwcmljZUFzc2V0TG9ja2VkQW10BQAAAAZzY2FsZTgFAAAAFWFtb3VudEFzc2V0bExvY2tlZEFtdAEAAAAVcHJpdmF0ZUNhbGN1bGF0ZVByaWNlAAAABAAAABJhbW91dEFzc2V0RGVjaW1hbHMAAAAScHJpY2VBc3NldERlY2ltYWxzAAAADmFtb3VudEFzc2V0QW10AAAADXByaWNlQXNzZXRBbXQEAAAAFGFtb3VudEFzc2V0QW10Q2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAA5hbW91bnRBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJhbW91dEFzc2V0RGVjaW1hbHMEAAAAE3ByaWNlQXNzZXRBbXRDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAADXByaWNlQXNzZXRBbXQFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABNwcmljZUFzc2V0QW10Q2FzdGVkBQAAABRhbW91bnRBc3NldEFtdENhc3RlZAEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQAAAAdhc3NldElkAwkAAAAAAAACBQAAAAdhc3NldElkAgAAAAVXQVZFUwgJAAPvAAAAAQUAAAAEdGhpcwAAAAlhdmFpbGFibGUJAAPwAAAAAgUAAAAEdGhpcwkAAlkAAAABBQAAAAdhc3NldElkAQAAAA9jYWxjdWxhdGVQcmljZXMAAAADAAAADmFtb3VudEFzc2V0QW10AAAADXByaWNlQXNzZXRBbXQAAAAIbHBBbW91bnQEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAAAlwb29sUHJpY2UJAQAAABVwcml2YXRlQ2FsY3VsYXRlUHJpY2UAAAAEBQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAAEnByaWNlQXNzZXREZWNpbWFscwUAAAAOYW1vdW50QXNzZXRBbXQFAAAADXByaWNlQXNzZXRBbXQEAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAOYW1vdW50QXNzZXRBbXQFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAANcHJpY2VBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQFAAAACGxwQW1vdW50BAAAABNscFByaWNlSW5QcmljZUFzc2V0CQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAAIbHBBbW91bnQJAARMAAAAAgUAAAAJcG9vbFByaWNlCQAETAAAAAIFAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQAETAAAAAIFAAAAE2xwUHJpY2VJblByaWNlQXNzZXQFAAAAA25pbAEAAAAbcHJpdmF0ZUVzdGltYXRlR2V0T3BlcmF0aW9uAAAAAwAAABBwYXltZW50THBBc3NldElkAAAAD3BheW1lbnRMcEFtb3VudAAAAAt1c2VyQWRkcmVzcwQAAAAOcG9vbENvbmZpZ0xpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAQAAAASYW1vdXRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAADWlkeFBvb2xTdGF0dXMEAAAAEXVzZXJMaXF1aWRpdHlMaXN0CQEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQFAAAAC3VzZXJBZGRyZXNzBAAAAA11c2VyTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARdXNlckxpcXVpZGl0eUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARdXNlckxpcXVpZGl0eUxpc3QFAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAQAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARdXNlckxpcXVpZGl0eUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10BAAAABFwb29sTGlxdWlkaXR5TGlzdAkBAAAAEGdldFBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARcG9vbExpcXVpZGl0eUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARcG9vbExpcXVpZGl0eUxpc3QFAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAQAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARcG9vbExpcXVpZGl0eUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10AwkBAAAAAiE9AAAAAgUAAAAJbHBBc3NldElkBQAAABBwYXltZW50THBBc3NldElkCQAAAgAAAAECAAAAFUludmFsaWQgYXNzZXQgcGFzc2VkLgQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQEAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10CQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEmFtb3V0QXNzZXREZWNpbWFscwQAAAAXcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAEW91dEFtb3VudEFzc2V0QW10CQAAawAAAAMFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAUAAAAPcGF5bWVudExwQW1vdW50BQAAAA1wb29sTFBCYWxhbmNlBAAAABBvdXRQcmljZUFzc2V0QW10CQAAawAAAAMFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAAA9wYXltZW50THBBbW91bnQFAAAADXBvb2xMUEJhbGFuY2UEAAAAFm91dEFtb3VudEFzc2V0QW10RmluYWwJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAEW91dEFtb3VudEFzc2V0QW10BQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAABnNjYWxlOAQAAAAVb3V0UHJpY2VBc3NldEFtdEZpbmFsCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABBvdXRQcmljZUFzc2V0QW10BQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAABnNjYWxlOAQAAAAMY3VycmVudFByaWNlCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10CQAFIAAAAA4FAAAAFm91dEFtb3VudEFzc2V0QW10RmluYWwFAAAAFW91dFByaWNlQXNzZXRBbXRGaW5hbAUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAANYW1vdW50QXNzZXRJZAUAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlBQAAAAxwcmljZUFzc2V0SWQFAAAADXVzZXJMUEJhbGFuY2UFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAANcG9vbExQQmFsYW5jZQUAAAAMY3VycmVudFByaWNlBQAAAApwb29sU3RhdHVzAQAAABtwcml2YXRlRXN0aW1hdGVQdXRPcGVyYXRpb24AAAAHAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAEGluQW1vdW50QXNzZXRBbXQAAAAPaW5BbW91bnRBc3NldElkAAAAD2luUHJpY2VBc3NldEFtdAAAAA5pblByaWNlQXNzZXRJZAAAAAt1c2VyQWRkcmVzcwAAAAppc0V2YWx1YXRlBAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAABVhbW91bnRBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQEAAAAEmFtb3V0QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwQAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA1pZHhQb29sU3RhdHVzBAAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAAVaWR4UG9vbEFtb3VudEFzc2V0QW10BAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10BAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAVdXNlckxpcXVpZGl0eURhdGFMaXN0CQEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQFAAAAC3VzZXJBZGRyZXNzBAAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVdXNlckxpcXVpZGl0eURhdGFMaXN0BQAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQEAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXVzZXJMaXF1aWRpdHlEYXRhTGlzdAUAAAAUaWR4UG9vbFByaWNlQXNzZXRBbXQEAAAADXVzZXJMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABV1c2VyTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10AwMJAQAAAAIhPQAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAAD2luQW1vdW50QXNzZXRJZAYJAQAAAAIhPQAAAAIFAAAADHByaWNlQXNzZXRJZAUAAAAOaW5QcmljZUFzc2V0SWQJAAACAAAAAQIAAAAlSW52YWxpZCBhbW91bnQgb3IgcHJpY2UgYXNzZXQgcGFzc2VkLgQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQMFAAAACmlzRXZhbHVhdGUJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkCQAAZQAAAAIJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkBQAAABBpbkFtb3VudEFzc2V0QW10BAAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UDBQAAAAppc0V2YWx1YXRlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkCQAAZQAAAAIJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQFAAAAD2luUHJpY2VBc3NldEFtdAQAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAA9pblByaWNlQXNzZXRBbXQFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzBAAAAAl1c2VyUHJpY2UJAQAAAA5jYWxjdWxhdGVQcmljZQAAAAIFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQFAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkBAAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEnByaWNlQXNzZXREZWNpbWFscwQAAAALY3VyZW50UHJpY2UDCQAAAAAAAAIFAAAADXBvb2xMUEJhbGFuY2UAAAAAAAAAAAAAAAAAAAAAAAAJAQAAAA5jYWxjdWxhdGVQcmljZQAAAAIFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQEAAAACHNsaXBwYWdlAwkAAAAAAAACBQAAAAtjdXJlbnRQcmljZQAAAAAAAAAAAAAAAAAAAAAAAAMJAABmAAAAAgUAAAALY3VyZW50UHJpY2UFAAAACXVzZXJQcmljZQkAAGsAAAADCQAAZQAAAAIFAAAAC2N1cmVudFByaWNlBQAAAAl1c2VyUHJpY2UAAAAAAAAAAGQFAAAAC2N1cmVudFByaWNlCQAAawAAAAMJAABlAAAAAgUAAAAJdXNlclByaWNlBQAAAAtjdXJlbnRQcmljZQAAAAAAAAAAZAUAAAALY3VyZW50UHJpY2UDAwkBAAAAAiE9AAAAAgUAAAALY3VyZW50UHJpY2UAAAAAAAAAAAAJAABmAAAAAgkAAGgAAAACBQAAAAhzbGlwcGFnZQUAAAAGc2NhbGU4BQAAABFzbGlwcGFnZVRvbGVyYW5jZQcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPUHJpY2Ugc2xpcHBhZ2UgCQABpAAAAAEJAABoAAAAAgUAAAAIc2xpcHBhZ2UFAAAABnNjYWxlOAIAAAAeIGV4Y2VlZGVkIHRoZSBwYXNzZWQgbGltaXQgb2YgCQABpAAAAAEFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAApmaW5hbFByaWNlCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACCQAAZAAAAAIFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkCQAAZAAAAAIFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAUAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQEAAAAC291dExwQW1vdW50AwkAAAAAAAACBQAAAA1wb29sTFBCYWxhbmNlAAAAAAAAAAAABAAAAAVwYXJ0QQkAAGwAAAAGBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgQAAAAFcGFydEIJAABsAAAABgUAAAAZaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgkAAGgAAAACBQAAAAVwYXJ0QQUAAAAFcGFydEIEAAAAEmxwQW10QnlBbW91bnRBc3NldAkAAGsAAAADBQAAAA1wb29sTFBCYWxhbmNlBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10BAAAABFscEFtdEJ5UHJpY2VBc3NldAkAAGsAAAADBQAAAA1wb29sTFBCYWxhbmNlBQAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAMJAABmAAAAAgUAAAARbHBBbXRCeVByaWNlQXNzZXQFAAAAEmxwQW10QnlBbW91bnRBc3NldAUAAAASbHBBbXRCeUFtb3VudEFzc2V0BQAAABFscEFtdEJ5UHJpY2VBc3NldAkABR8AAAANBQAAAAtvdXRMcEFtb3VudAUAAAAKZmluYWxQcmljZQUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlBQAAAA11c2VyTFBCYWxhbmNlBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UFAAAADXBvb2xMUEJhbGFuY2UFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQFAAAACWxwQXNzZXRJZAUAAAAIc2xpcHBhZ2UFAAAACnBvb2xTdGF0dXMBAAAAG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZAAAAAEAAAAFb3JkZXIEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAAApwb29sU3RhdHVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA1pZHhQb29sU3RhdHVzBAAAABNtYXRjaGVyUHVibGljS2V5U3RyCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAATaWR4TWF0Y2hlclB1YmxpY0tleQQAAAATYW1vdW50QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwQAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkBAAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQEAAAADGN1cnJlbnRQcmljZQMJAAAAAAAAAggFAAAABW9yZGVyAAAACW9yZGVyVHlwZQUAAAADQnV5CQEAAAAVcHJpdmF0ZUNhbGN1bGF0ZVByaWNlAAAABAUAAAATYW1vdW50QXNzZXREZWNpbWFscwUAAAAScHJpY2VBc3NldERlY2ltYWxzCQAAZAAAAAIFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UIBQAAAAVvcmRlcgAAAAZhbW91bnQFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkBAAAAFXByaXZhdGVDYWxjdWxhdGVQcmljZQAAAAQFAAAAE2Ftb3VudEFzc2V0RGVjaW1hbHMFAAAAEnByaWNlQXNzZXREZWNpbWFscwkAAGQAAAACBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCAUAAAAFb3JkZXIAAAAGYW1vdW50BQAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UEAAAAEWlzUG9vbFN0YXR1c1ZhbGlkAwMDCQEAAAAQaXNHbG9iYWxTaHV0ZG93bgAAAAAGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAAE1Bvb2xNYXRjaGVyRGlzYWJsZWQGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAADFBvb2xTaHV0ZG93bgcGBAAAABJpc1ZhbGlkTWF0Y2hlclNpZ24GBAAAABBvcmRlckFtb3VudEFzc2V0CAgFAAAABW9yZGVyAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAQAAAATb3JkZXJBbW91bnRBc3NldFN0cgMJAAAAAAAAAgUAAAAQb3JkZXJBbW91bnRBc3NldAUAAAAEdW5pdAIAAAAFV0FWRVMJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQUAAAAQb3JkZXJBbW91bnRBc3NldAQAAAAPb3JkZXJQcmljZUFzc2V0CAgFAAAABW9yZGVyAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BAAAABJvcmRlclByaWNlQXNzZXRTdHIDCQAAAAAAAAIFAAAAD29yZGVyUHJpY2VBc3NldAUAAAAEdW5pdAIAAAAFV0FWRVMJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQUAAAAPb3JkZXJQcmljZUFzc2V0BAAAABBpc1ZhbGlkQXNzZXRQYWlyAwMJAQAAAAIhPQAAAAIFAAAAE29yZGVyQW1vdW50QXNzZXRTdHIFAAAADWFtb3VudEFzc2V0SWQGCQEAAAACIT0AAAACBQAAABJvcmRlclByaWNlQXNzZXRTdHIFAAAADHByaWNlQXNzZXRJZAcGBAAAAApvcmRlclByaWNlCAUAAAAFb3JkZXIAAAAFcHJpY2UEAAAADXByaWNlRGVjaW1hbHMJAABrAAAAAwUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAAE2Ftb3VudEFzc2V0RGVjaW1hbHMEAAAAEGNhc3RlZE9yZGVyUHJpY2UJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAACm9yZGVyUHJpY2UFAAAABnNjYWxlOAUAAAANcHJpY2VEZWNpbWFscwQAAAARaXNPcmRlclByaWNlVmFsaWQDCQAAAAAAAAIIBQAAAAVvcmRlcgAAAAlvcmRlclR5cGUFAAAAA0J1eQkAAGcAAAACBQAAAAxjdXJyZW50UHJpY2UFAAAAEGNhc3RlZE9yZGVyUHJpY2UJAABnAAAAAgUAAAAQY2FzdGVkT3JkZXJQcmljZQUAAAAMY3VycmVudFByaWNlAwMDBQAAABBpc1ZhbGlkQXNzZXRQYWlyBQAAABJpc1ZhbGlkTWF0Y2hlclNpZ24HBQAAABFpc1Bvb2xTdGF0dXNWYWxpZAcFAAAAEWlzT3JkZXJQcmljZVZhbGlkBwAAAAgAAAABaQEAAAADcHV0AAAAAgAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAA9zaG91bGRBdXRvU3Rha2UEAAAAEWZhY3RvcnlDb25maWdMaXN0CQEAAAAQZ2V0RmFjdG9yeUNvbmZpZwAAAAAEAAAAD3N0YWtpbmdDb250cmFjdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAAGRAAAAAgUAAAARZmFjdG9yeUNvbmZpZ0xpc3QFAAAAGWlkeEZhY3RvcnlTdGFraW5nQ29udHJhY3QCAAAAIUVycm9yLiBJbmNvcnJlY3Qgc3Rha2luZyBhZGRyZXNzLgQAAAAOcG10QW1vdW50QXNzZXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAAEGluQW1vdW50QXNzZXRBbXQIBQAAAA5wbXRBbW91bnRBc3NldAAAAAZhbW91bnQEAAAAD2luQW1vdW50QXNzZXRJZAMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAA5wbXRBbW91bnRBc3NldAAAAAdhc3NldElkCQACWQAAAAECAAAABVdBVkVTCQEAAAAFdmFsdWUAAAABCAUAAAAOcG10QW1vdW50QXNzZXQAAAAHYXNzZXRJZAQAAAANcG10UHJpY2VBc3NldAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQQAAAAPaW5QcmljZUFzc2V0QW10CAUAAAANcG10UHJpY2VBc3NldAAAAAZhbW91bnQEAAAADmluUHJpY2VBc3NldElkAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAADXBtdFByaWNlQXNzZXQAAAAHYXNzZXRJZAkAAlkAAAABAgAAAAVXQVZFUwkBAAAABXZhbHVlAAAAAQgFAAAADXBtdFByaWNlQXNzZXQAAAAHYXNzZXRJZAQAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwkBAAAAG3ByaXZhdGVFc3RpbWF0ZVB1dE9wZXJhdGlvbgAAAAcFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABBpbkFtb3VudEFzc2V0QW10CQACWAAAAAEFAAAAD2luQW1vdW50QXNzZXRJZAUAAAAPaW5QcmljZUFzc2V0QW10CQACWAAAAAEFAAAADmluUHJpY2VBc3NldElkCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgcEAAAAC291dExwQW1vdW50CAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfMQQAAAALY3VyZW50UHJpY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8yBAAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfMwQAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNAQAAAANdXNlckxQQmFsYW5jZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzUEAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl82BAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl83BAAAAA1wb29sTFBCYWxhbmNlCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfOAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfOQQAAAAUcHJpY2VBc3NldEludGVybmFsSWQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAA18xMAQAAAAJbHBBc3NldElkCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAANfMTEEAAAAEnNsaXBwYWdlQ2FsY3VsYXRlZAgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAADXzEyBAAAAApwb29sU3RhdHVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAA18xMwMDAwkBAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAABgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAAA9Qb29sUHV0RGlzYWJsZWQGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAADFBvb2xTaHV0ZG93bgkAAAIAAAABCQABLAAAAAICAAAALFB1dCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbi4gU3RhdHVzID0gCQABpAAAAAEFAAAACnBvb2xTdGF0dXMEAAAAFGVtaXRMUEFzc2V0T25GYWN0b3J5CQAD/AAAAAQFAAAAD2ZhY3RvcnlDb250cmFjdAIAAAAEZW1pdAkABEwAAAACBQAAAAtvdXRMcEFtb3VudAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAFGVtaXRMUEFzc2V0T25GYWN0b3J5BQAAABRlbWl0TFBBc3NldE9uRmFjdG9yeQMJAQAAAAIhPQAAAAIFAAAAFGVtaXRMUEFzc2V0T25GYWN0b3J5AgAAAAdzdWNjZXNzCQAAAgAAAAECAAAANExQIGFzc2V0IHJlaXNzdWUgZmFpbGVkIGR1cmluZyBlbWl0IGNhbGwgb24gZmFjdG9yeS4EAAAAB3Jlc3VsdHMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleVByaWNlTGFzdAAAAAAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAAAtjdXJlbnRQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5UHJpY2VIaXN0b3J5AAAAAgUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkAASwAAAACAgAAAAQlc19fCQABpAAAAAEFAAAAC2N1cmVudFByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlQdXRBY3Rpb25CeVVzZXIAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQEAAAARZGF0YVB1dEFjdGlvbkluZm8AAAAIBQAAABBpbkFtb3VudEFzc2V0QW10BQAAAA9pblByaWNlQXNzZXRBbXQFAAAAC291dExwQW1vdW50BQAAAAtjdXJlbnRQcmljZQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAEnNsaXBwYWdlQ2FsY3VsYXRlZAUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAWa2V5UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADCQAAZAAAAAIFAAAAFnVzZXJBbW91bnRBc3NldEJhbGFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQJAABkAAAAAgUAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlBQAAAA9pblByaWNlQXNzZXRBbXQJAABkAAAAAgUAAAANdXNlckxQQmFsYW5jZQUAAAALb3V0THBBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleVBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADCQAAZAAAAAIFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQJAABkAAAAAgUAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlBQAAAA9pblByaWNlQXNzZXRBbXQJAABkAAAAAgUAAAANcG9vbExQQmFsYW5jZQUAAAALb3V0THBBbW91bnQFAAAAA25pbAMFAAAAD3Nob3VsZEF1dG9TdGFrZQQAAAAFc3Rha2UJAAP8AAAABAUAAAAPc3Rha2luZ0NvbnRyYWN0AgAAAAVzdGFrZQUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAAlscEFzc2V0SWQFAAAAC291dExwQW1vdW50BQAAAANuaWwDCQAAAAAAAAIFAAAABXN0YWtlBQAAAAVzdGFrZQUAAAAHcmVzdWx0cwkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAARNAAAAAgUAAAAHcmVzdWx0cwkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAtvdXRMcEFtb3VudAUAAAAJbHBBc3NldElkCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAANnZXQAAAAABAAAAA5wbXRBbW91bnRBc3NldAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAKcG10QXNzZXRJZAkBAAAABXZhbHVlAAAAAQgFAAAADnBtdEFtb3VudEFzc2V0AAAAB2Fzc2V0SWQEAAAADnBtdEFzc2V0QW1vdW50CAUAAAAOcG10QW1vdW50QXNzZXQAAAAGYW1vdW50BAAAAAdyZXN1bHRzCQEAAAAbcHJpdmF0ZUVzdGltYXRlR2V0T3BlcmF0aW9uAAAAAwkAAlgAAAABBQAAAApwbXRBc3NldElkBQAAAA5wbXRBc3NldEFtb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAEW91dEFtb3VudEFzc2V0QW10CAUAAAAHcmVzdWx0cwAAAAJfMQQAAAAQb3V0UHJpY2VBc3NldEFtdAgFAAAAB3Jlc3VsdHMAAAACXzIEAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAgFAAAAB3Jlc3VsdHMAAAACXzMEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCAUAAAAHcmVzdWx0cwAAAAJfNAQAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAACXzUEAAAADWFtb3VudEFzc2V0SWQIBQAAAAdyZXN1bHRzAAAAAl82BAAAABV1c2VyUHJpY2VBc3NldEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAAl83BAAAAAxwcmljZUFzc2V0SWQIBQAAAAdyZXN1bHRzAAAAAl84BAAAAA11c2VyTFBCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAAJfOQQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAADXzEwBAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAA18xMQQAAAANcG9vbExQQmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAADXzEyBAAAAAxjdXJyZW50UHJpY2UIBQAAAAdyZXN1bHRzAAAAA18xMwQAAAAKcG9vbFN0YXR1cwkBAAAADXBhcnNlSW50VmFsdWUAAAABCAUAAAAHcmVzdWx0cwAAAANfMTQDAwkBAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAABgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAAAxQb29sU2h1dGRvd24JAAACAAAAAQkAASwAAAACAgAAACxHZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkAAaQAAAABBQAAAApwb29sU3RhdHVzBAAAABRidXJuTFBBc3NldE9uRmFjdG9yeQkAA/wAAAAEBQAAAA9mYWN0b3J5Q29udHJhY3QCAAAABGJ1cm4JAARMAAAAAgUAAAAOcG10QXNzZXRBbW91bnQFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAOcG10QXNzZXRBbW91bnQFAAAAA25pbAMJAAAAAAAAAgUAAAAUYnVybkxQQXNzZXRPbkZhY3RvcnkFAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5AwkBAAAAAiE9AAAAAgUAAAAUYnVybkxQQXNzZXRPbkZhY3RvcnkCAAAAB3N1Y2Nlc3MJAAACAAAAAQIAAAAxTFAgYXNzZXQgYnVybiBmYWlsZWQgZHVyaW5nIGVtaXQgY2FsbCBvbiBmYWN0b3J5LgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEW91dEFtb3VudEFzc2V0QW10AwkAAAAAAAACBQAAAA1hbW91bnRBc3NldElkAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAA1hbW91bnRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAQb3V0UHJpY2VBc3NldEFtdAkAAlkAAAABBQAAAAxwcmljZUFzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAFmtleVBvb2xMaXF1aWRpdHlCeVVzZXIAAAADBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkBAAAAEWRhdGFQb29sTGlxdWlkaXR5AAAAAwkAAGUAAAACBQAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlBQAAABFvdXRBbW91bnRBc3NldEFtdAkAAGUAAAACBQAAABV1c2VyUHJpY2VBc3NldEJhbGFuY2UFAAAAEG91dFByaWNlQXNzZXRBbXQJAABlAAAAAgUAAAANdXNlckxQQmFsYW5jZQUAAAAOcG10QXNzZXRBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleVBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADCQAAZQAAAAIFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAEW91dEFtb3VudEFzc2V0QW10CQAAZQAAAAIFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAAQb3V0UHJpY2VBc3NldEFtdAkAAGUAAAACBQAAAA1wb29sTFBCYWxhbmNlBQAAAA5wbXRBc3NldEFtb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5R2V0QWN0aW9uQnlVc2VyAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAkBAAAAEWRhdGFHZXRBY3Rpb25JbmZvAAAABgUAAAARb3V0QW1vdW50QXNzZXRBbXQFAAAAEG91dFByaWNlQXNzZXRBbXQFAAAADnBtdEFzc2V0QW1vdW50BQAAAAxjdXJyZW50UHJpY2UFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleVByaWNlTGFzdAAAAAAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAIYWN0aXZhdGUAAAACAAAADmFtb3VudEFzc2V0U3RyAAAADXByaWNlQXNzZXRTdHIDCQEAAAACIT0AAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkABCUAAAABBQAAAA9mYWN0b3J5Q29udHJhY3QJAAACAAAAAQIAAAAScGVybWlzc2lvbnMgZGVuaWVkCQAFFAAAAAIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADmtleUFtb3VudEFzc2V0AAAAAAUAAAAOYW1vdW50QXNzZXRTdHIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADWtleVByaWNlQXNzZXQAAAAABQAAAA1wcmljZUFzc2V0U3RyBQAAAANuaWwCAAAAB3N1Y2Nlc3MAAAABaQEAAAANc3RhdHNSRUFET05MWQAAAAAEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADWFtb3VudEFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA9pZHhQcmljZUFzc2V0SWQEAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAGGlkeEFtb3VudEFzc2V0SW50ZXJuYWxJZAQAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAQAAAASYW1vdXRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzBAAAABJwcmljZUFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFWlkeFByaWNlQXNzZXREZWNpbWFscwQAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0CQEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQEAAAADXBvb2xMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAANYW1vdW50QXNzZXRJZAQAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkBAAAAApwcmljZXNMaXN0CQEAAAAPY2FsY3VsYXRlUHJpY2VzAAAAAwUAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlBQAAAA1wb29sTFBCYWxhbmNlBAAAAAxjdXJyZW50UHJpY2UJAAGRAAAAAgUAAAAKcHJpY2VzTGlzdAAAAAAAAAAAAAQAAAAUbHBQcmljZUluQW1vdW50QXNzZXQJAAGRAAAAAgUAAAAKcHJpY2VzTGlzdAAAAAAAAAAAAQQAAAATbHBQcmljZUluUHJpY2VBc3NldAkAAZEAAAACBQAAAApwcmljZXNMaXN0AAAAAAAAAAACBAAAAApwb29sV2VpZ2h0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAANa2V5UG9vbFdlaWdodAAAAAEJAAQlAAAAAQUAAAAEdGhpcwIAAAAZUG9vbCBkb2Vzbid0IGhhdmUgd2VpZ2h0LgkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAA1wb29sTFBCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAUbHBQcmljZUluQW1vdW50QXNzZXQJAARMAAAAAgkAAaQAAAABBQAAABNscFByaWNlSW5QcmljZUFzc2V0CQAETAAAAAIJAAGkAAAAAQUAAAAKcG9vbFdlaWdodAUAAAADbmlsBQAAAANTRVAAAAABaQEAAAAgZXZhbHVhdGVQdXRCeUFtb3VudEFzc2V0UkVBRE9OTFkAAAADAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAEGluQW1vdW50QXNzZXRBbXQAAAALdXNlckFkZHJlc3MEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADWFtb3VudEFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA9pZHhQcmljZUFzc2V0SWQEAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAGGlkeEFtb3VudEFzc2V0SW50ZXJuYWxJZAQAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAQAAAASYW1vdXRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzBAAAABJwcmljZUFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFWlkeFByaWNlQXNzZXREZWNpbWFscwQAAAAKcG9vbFN0YXR1cwkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAADWlkeFBvb2xTdGF0dXMEAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAkBAAAAEGdldFBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQEAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAAfYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZUNhc3RlZAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQUAAAAGc2NhbGU4BQAAABJhbW91dEFzc2V0RGVjaW1hbHMEAAAAHmFjY291bnRQcmljZUFzc2V0QmFsYW5jZUNhc3RlZAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEnByaWNlQXNzZXREZWNpbWFscwQAAAALY3VyZW50UHJpY2UDCQAAAAAAAAIFAAAADXBvb2xMUEJhbGFuY2UAAAAAAAAAAAAAAAAAAAAAAAAJAQAAAA5jYWxjdWxhdGVQcmljZQAAAAIFAAAAHmFjY291bnRQcmljZUFzc2V0QmFsYW5jZUNhc3RlZAUAAAAfYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZUNhc3RlZAQAAAAZaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZAkAAGsAAAADBQAAABBpbkFtb3VudEFzc2V0QW10BQAAAAtjdXJlbnRQcmljZQUAAAAGc2NhbGU4BAAAAA9pblByaWNlQXNzZXRBbXQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQFAAAAEnByaWNlQXNzZXREZWNpbWFscwUAAAAGc2NhbGU4BAAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzCQEAAAAbcHJpdmF0ZUVzdGltYXRlUHV0T3BlcmF0aW9uAAAABwUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAADWFtb3VudEFzc2V0SWQFAAAAD2luUHJpY2VBc3NldEFtdAUAAAAMcHJpY2VBc3NldElkBQAAAAt1c2VyQWRkcmVzcwYEAAAAD291dExwQW1vdW50Q2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzEEAAAAD2N1cmVudFByaWNlQ2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzIEAAAAGnBvb2xBbW91bnRBc3NldEJhbGFuY2VDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNgQAAAAZcG9vbFByaWNlQXNzZXRCYWxhbmNlQ0FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzcEAAAAEXBvb2xMUEJhbGFuY2VDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfOAQAAAAOcG9vbFN0YXR1c0NhbGMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAADXzEzCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAD291dExwQW1vdW50Q2FsYwkABEwAAAACCQABpAAAAAEFAAAAC2N1cmVudFByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAacG9vbEFtb3VudEFzc2V0QmFsYW5jZUNhbGMJAARMAAAAAgkAAaQAAAABBQAAABlwb29sUHJpY2VBc3NldEJhbGFuY2VDQWxjCQAETAAAAAIJAAGkAAAAAQUAAAARcG9vbExQQmFsYW5jZUNhbGMJAARMAAAAAgkAAaQAAAABBQAAAA5wb29sU3RhdHVzQ2FsYwUAAAADbmlsBQAAAANTRVAAAAABaQEAAAAfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQAAAAMAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAAPaW5QcmljZUFzc2V0QW10AAAAC3VzZXJBZGRyZXNzBAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAABVhbW91bnRBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQEAAAAEmFtb3V0QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwQAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA1pZHhQb29sU3RhdHVzBAAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAANcG9vbExQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAARaWR4UG9vbExQQXNzZXRBbXQEAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkBAAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQEAAAAH2FjY291bnRBbW91bnRBc3NldEJhbGFuY2VDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAAB5hY2NvdW50UHJpY2VBc3NldEJhbGFuY2VDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAHmluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWRUdXBsZQkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAPaW5QcmljZUFzc2V0QW10BQAAAAZzY2FsZTgFAAAAEnByaWNlQXNzZXREZWNpbWFscwQAAAALY3VyZW50UHJpY2UDCQAAAAAAAAIFAAAADXBvb2xMUEJhbGFuY2UAAAAAAAAAAAAAAAAAAAAAAAAJAQAAAA5jYWxjdWxhdGVQcmljZQAAAAIFAAAAHmFjY291bnRQcmljZUFzc2V0QmFsYW5jZUNhc3RlZAUAAAAfYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZUNhc3RlZAQAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQJAABrAAAAAwUAAAAeaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZFR1cGxlBQAAAAZzY2FsZTgFAAAAC2N1cmVudFByaWNlBAAAABBpbkFtb3VudEFzc2V0QW10CQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAUAAAASYW1vdXRBc3NldERlY2ltYWxzBQAAAAZzY2FsZTgEAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMJAQAAABtwcml2YXRlRXN0aW1hdGVQdXRPcGVyYXRpb24AAAAHBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAQaW5BbW91bnRBc3NldEFtdAUAAAANYW1vdW50QXNzZXRJZAUAAAAPaW5QcmljZUFzc2V0QW10BQAAAAxwcmljZUFzc2V0SWQFAAAAC3VzZXJBZGRyZXNzBgQAAAAPb3V0THBBbW91bnRDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfMQQAAAAPY3VyZW50UHJpY2VDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfMgQAAAAacG9vbEFtb3VudEFzc2V0QmFsYW5jZUNhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl82BAAAABlwb29sUHJpY2VBc3NldEJhbGFuY2VDQWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNwQAAAARcG9vbExQQmFsYW5jZUNhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl84BAAAAA5wb29sU3RhdHVzQ2FsYwkBAAAADXBhcnNlSW50VmFsdWUAAAABCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAANfMTMJAAUUAAAAAgUAAAADbmlsCQAEuQAAAAIJAARMAAAAAgIAAAAMJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAAPb3V0THBBbW91bnRDYWxjCQAETAAAAAIJAAGkAAAAAQUAAAALY3VyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABpwb29sQW1vdW50QXNzZXRCYWxhbmNlQ2FsYwkABEwAAAACCQABpAAAAAEFAAAAGXBvb2xQcmljZUFzc2V0QmFsYW5jZUNBbGMJAARMAAAAAgkAAaQAAAABBQAAABFwb29sTFBCYWxhbmNlQ2FsYwkABEwAAAACCQABpAAAAAEFAAAADnBvb2xTdGF0dXNDYWxjBQAAAANuaWwFAAAAA1NFUAAAAAFpAQAAABNldmFsdWF0ZUdldFJFQURPTkxZAAAAAwAAABBwYXltZW50THBBc3NldElkAAAAD3BheW1lbnRMcEFtb3VudAAAAAt1c2VyQWRkcmVzcwQAAAAHcmVzdWx0cwkBAAAAG3ByaXZhdGVFc3RpbWF0ZUdldE9wZXJhdGlvbgAAAAMFAAAAEHBheW1lbnRMcEFzc2V0SWQFAAAAD3BheW1lbnRMcEFtb3VudAUAAAALdXNlckFkZHJlc3MEAAAAEW91dEFtb3VudEFzc2V0QW10CAUAAAAHcmVzdWx0cwAAAAJfMQQAAAAQb3V0UHJpY2VBc3NldEFtdAgFAAAAB3Jlc3VsdHMAAAACXzIEAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAA18xMAQAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAANfMTEEAAAADXBvb2xMUEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAA18xMgQAAAAMY3VycmVudFByaWNlCAUAAAAHcmVzdWx0cwAAAANfMTMEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAB3Jlc3VsdHMAAAADXzE0CQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAADiVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAARb3V0QW1vdW50QXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAABBvdXRQcmljZUFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAADXBvb2xMUEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAAApwb29sU3RhdHVzBQAAAANuaWwFAAAAA1NFUAAAAAFpAQAAAAxoYXNoUkVBRE9OTFkAAAAACQAFFAAAAAIFAAAAA25pbAkAAloAAAABCQEAAAAFdmFsdWUAAAABCQAD8QAAAAEFAAAABHRoaXMAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFT3JkZXIEAAAABW9yZGVyBQAAAAckbWF0Y2gwBgkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkzy2qZ", "height": 1701717, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 5 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let factoryContract = Address(base58'3MxueHaGvWmdk5crtn9HwtkSAAZScTWoHaC') | |
5 | + | ||
6 | + | let lPdecimals = 8 | |
7 | + | ||
8 | + | let scale8 = 100000000 | |
9 | + | ||
10 | + | let scale18 = toBigInt(1000000000000000000) | |
11 | + | ||
12 | + | let SEP = "__" | |
13 | + | ||
14 | + | let PoolActive = 1 | |
15 | + | ||
16 | + | let PoolPutDisabled = 2 | |
17 | + | ||
18 | + | let PoolMatcherDisabled = 3 | |
19 | + | ||
20 | + | let PoolShutdown = 4 | |
21 | + | ||
22 | + | let idxPoolAddress = 1 | |
23 | + | ||
24 | + | let idxPoolStatus = 2 | |
25 | + | ||
26 | + | let idxPoolLPAssetId = 3 | |
27 | + | ||
28 | + | let idxAmountAssetId = 4 | |
29 | + | ||
30 | + | let idxPriceAssetId = 5 | |
31 | + | ||
32 | + | let idxAmountAssetDecimals = 6 | |
33 | + | ||
34 | + | let idxPriceAssetDecimals = 7 | |
35 | + | ||
36 | + | let idxAmountAssetInternalId = 8 | |
37 | + | ||
38 | + | let idxPriceAssetInternalId = 9 | |
39 | + | ||
40 | + | let idxLPAssetDecimals = 10 | |
41 | + | ||
42 | + | let idxMatcherPublicKey = 11 | |
43 | + | ||
44 | + | let idxPoolAmountAssetAmt = 1 | |
45 | + | ||
46 | + | let idxPoolPriceAssetAmt = 2 | |
47 | + | ||
48 | + | let idxPoolLPAssetAmt = 3 | |
49 | + | ||
50 | + | let idxFactoryStakingContract = 1 | |
51 | + | ||
52 | + | let idxFactoryBoostingConfig = 2 | |
53 | + | ||
54 | + | func keyPriceLast () = "%s%s__price__last" | |
55 | + | ||
56 | + | ||
57 | + | func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP) | |
58 | + | ||
59 | + | ||
60 | + | func keyPoolLiquidity (internalAmountAsset,internalPriceAsset) = (((("%d%d%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__locked") | |
61 | + | ||
62 | + | ||
63 | + | func keyPoolLiquidityByUser (internalAmountAsset,internalPriceAsset,userAddress) = (((((("%d%d%s%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__") + userAddress) + "__locked") | |
64 | + | ||
65 | + | ||
66 | + | func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId) | |
67 | + | ||
68 | + | ||
69 | + | func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId) | |
70 | + | ||
71 | + | ||
72 | + | func keyAmountAsset () = "%s__amountAsset" | |
73 | + | ||
74 | + | ||
75 | + | func keyPriceAsset () = "%s__priceAsset" | |
76 | + | ||
77 | + | ||
78 | + | func keyFactoryConfig () = "%s__factoryConfig" | |
79 | + | ||
80 | + | ||
81 | + | func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset") | |
82 | + | ||
83 | + | ||
84 | + | func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config") | |
85 | + | ||
86 | + | ||
87 | + | func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr) | |
88 | + | ||
89 | + | ||
90 | + | func keyAllPoolsShutdown () = "%s__shutdown" | |
91 | + | ||
92 | + | ||
93 | + | func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress) | |
94 | + | ||
95 | + | ||
96 | + | func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false) | |
97 | + | ||
98 | + | ||
99 | + | func getPoolConfig () = { | |
100 | + | let poolAmountAsset = valueOrErrorMessage(getString(this, keyAmountAsset()), "No config for amount asset found") | |
101 | + | let poolPriceAsset = valueOrErrorMessage(getString(this, keyPriceAsset()), "No config for price asset found") | |
102 | + | let poolPriceAssetInternal = valueOrErrorMessage(getInteger(factoryContract, keyMappingsBaseAsset2internalId(poolPriceAsset)), "No config for internal price asset found") | |
103 | + | let poolAmountAssetInternal = valueOrErrorMessage(getInteger(factoryContract, keyMappingsBaseAsset2internalId(poolAmountAsset)), "No config for internal amount asset found") | |
104 | + | split(valueOrErrorMessage(getString(factoryContract, keyPoolConfig(toString(poolAmountAssetInternal), toString(poolPriceAssetInternal))), "No factory config found for pool assets."), SEP) | |
105 | + | } | |
106 | + | ||
107 | + | ||
108 | + | func getFactoryConfig () = split(valueOrErrorMessage(getString(factoryContract, keyFactoryConfig()), "No factory config found."), SEP) | |
109 | + | ||
110 | + | ||
111 | + | func getPoolLiquidity (amountAssetInternalId,priceAssetInternalId) = { | |
112 | + | let currentPoolLiquidityValue = getString(this, keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId)) | |
113 | + | if (isDefined(currentPoolLiquidityValue)) | |
114 | + | then split(value(currentPoolLiquidityValue), SEP) | |
115 | + | else ["", "0", "0", "0"] | |
116 | + | } | |
117 | + | ||
118 | + | ||
119 | + | func getPoolLiquidityByUser (amountAssetInternalId,priceAssetInternalId,userAddress) = { | |
120 | + | let currentPoolLiquidityValue = getString(this, keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress)) | |
121 | + | if (isDefined(currentPoolLiquidityValue)) | |
122 | + | then split(value(currentPoolLiquidityValue), SEP) | |
123 | + | else ["", "0", "0", "0", "0"] | |
124 | + | } | |
125 | + | ||
126 | + | ||
127 | + | func dataPoolLiquidity (amountAssetLocked,priceAssetLocked,lpTokenLocked) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP) | |
128 | + | ||
129 | + | ||
130 | + | func dataPoolLiquidityByUser (amountAssetLocked,priceAssetLocked,lpTokenLocked,userAddress) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP) | |
131 | + | ||
132 | + | ||
133 | + | func dataPutActionInfo (inAmountAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d%d", toString(inAmountAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp)], SEP) | |
134 | + | ||
135 | + | ||
136 | + | func dataGetActionInfo (outAmountAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP) | |
137 | + | ||
138 | + | ||
139 | + | func privateCastToScaleOf (amount,resultScale,currentScale) = fraction(amount, resultScale, currentScale) | |
140 | + | ||
141 | + | ||
142 | + | func calculatePrice (priceAssetLockedAmt,amountAssetlLockedAmt) = fraction(priceAssetLockedAmt, scale8, amountAssetlLockedAmt) | |
143 | + | ||
144 | + | ||
145 | + | func privateCalculatePrice (amoutAssetDecimals,priceAssetDecimals,amountAssetAmt,priceAssetAmt) = { | |
146 | + | let amountAssetAmtCasted = privateCastToScaleOf(amountAssetAmt, scale8, amoutAssetDecimals) | |
147 | + | let priceAssetAmtCasted = privateCastToScaleOf(priceAssetAmt, scale8, priceAssetDecimals) | |
148 | + | calculatePrice(priceAssetAmtCasted, amountAssetAmtCasted) | |
149 | + | } | |
150 | + | ||
151 | + | ||
152 | + | func privateGetAccountBalance (assetId) = if ((assetId == "WAVES")) | |
153 | + | then wavesBalance(this).available | |
154 | + | else assetBalance(this, fromBase58String(assetId)) | |
155 | + | ||
156 | + | ||
157 | + | func calculatePrices (amountAssetAmt,priceAssetAmt,lpAmount) = { | |
158 | + | let poolConfigDataList = getPoolConfig() | |
159 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
160 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
161 | + | let poolPrice = privateCalculatePrice(amoutAssetDecimals, priceAssetDecimals, amountAssetAmt, priceAssetAmt) | |
162 | + | let amountAssetPoolLockedAmt = privateCastToScaleOf(amountAssetAmt, scale8, amoutAssetDecimals) | |
163 | + | let priceAssetPoolLockedAmt = privateCastToScaleOf(priceAssetAmt, scale8, priceAssetDecimals) | |
164 | + | let lpPriceInAmountAsset = calculatePrice(amountAssetPoolLockedAmt, lpAmount) | |
165 | + | let lpPriceInPriceAsset = calculatePrice(priceAssetPoolLockedAmt, lpAmount) | |
166 | + | [poolPrice, lpPriceInAmountAsset, lpPriceInPriceAsset] | |
167 | + | } | |
168 | + | ||
169 | + | ||
170 | + | func privateEstimateGetOperation (paymentLpAssetId,paymentLpAmount,userAddress) = { | |
171 | + | let poolConfigList = getPoolConfig() | |
172 | + | let lpAssetId = poolConfigList[idxPoolLPAssetId] | |
173 | + | let amountAssetId = poolConfigList[idxAmountAssetId] | |
174 | + | let priceAssetId = poolConfigList[idxPriceAssetId] | |
175 | + | let amountAssetInternalId = poolConfigList[idxAmountAssetInternalId] | |
176 | + | let priceAssetInternalId = poolConfigList[idxPriceAssetInternalId] | |
177 | + | let amoutAssetDecimals = parseIntValue(poolConfigList[idxAmountAssetDecimals]) | |
178 | + | let priceAssetDecimals = parseIntValue(poolConfigList[idxPriceAssetDecimals]) | |
179 | + | let poolStatus = poolConfigList[idxPoolStatus] | |
180 | + | let userLiquidityList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress) | |
181 | + | let userLPBalance = parseIntValue(userLiquidityList[idxPoolLPAssetAmt]) | |
182 | + | let userAmountAssetBalance = parseIntValue(userLiquidityList[idxPoolAmountAssetAmt]) | |
183 | + | let userPriceAssetBalance = parseIntValue(userLiquidityList[idxPoolPriceAssetAmt]) | |
184 | + | let poolLiquidityList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
185 | + | let poolLPBalance = parseIntValue(poolLiquidityList[idxPoolLPAssetAmt]) | |
186 | + | let poolAmountAssetBalance = parseIntValue(poolLiquidityList[idxPoolAmountAssetAmt]) | |
187 | + | let poolPriceAssetBalance = parseIntValue(poolLiquidityList[idxPoolPriceAssetAmt]) | |
188 | + | if ((lpAssetId != paymentLpAssetId)) | |
189 | + | then throw("Invalid asset passed.") | |
190 | + | else { | |
191 | + | let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId) | |
192 | + | let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId) | |
193 | + | let amountAssetPoolLockedAmt = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals) | |
194 | + | let priceAssetPoolLockedAmt = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals) | |
195 | + | let outAmountAssetAmt = fraction(amountAssetPoolLockedAmt, paymentLpAmount, poolLPBalance) | |
196 | + | let outPriceAssetAmt = fraction(priceAssetPoolLockedAmt, paymentLpAmount, poolLPBalance) | |
197 | + | let outAmountAssetAmtFinal = privateCastToScaleOf(outAmountAssetAmt, amoutAssetDecimals, scale8) | |
198 | + | let outPriceAssetAmtFinal = privateCastToScaleOf(outPriceAssetAmt, priceAssetDecimals, scale8) | |
199 | + | let currentPrice = calculatePrice(priceAssetPoolLockedAmt, amountAssetPoolLockedAmt) | |
200 | + | $Tuple14(outAmountAssetAmtFinal, outPriceAssetAmtFinal, amountAssetInternalId, priceAssetInternalId, userAmountAssetBalance, amountAssetId, userPriceAssetBalance, priceAssetId, userLPBalance, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, currentPrice, poolStatus) | |
201 | + | } | |
202 | + | } | |
203 | + | ||
204 | + | ||
205 | + | func privateEstimatePutOperation (slippageTolerance,inAmountAssetAmt,inAmountAssetId,inPriceAssetAmt,inPriceAssetId,userAddress,isEvaluate) = { | |
206 | + | let poolConfigDataList = getPoolConfig() | |
207 | + | let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId]) | |
208 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
209 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
210 | + | let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId] | |
211 | + | let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId] | |
212 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
213 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
214 | + | let poolStatus = poolConfigDataList[idxPoolStatus] | |
215 | + | let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
216 | + | let poolAmountAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolAmountAssetAmt]) | |
217 | + | let poolPriceAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolPriceAssetAmt]) | |
218 | + | let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt]) | |
219 | + | let userLiquidityDataList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress) | |
220 | + | let userAmountAssetBalance = parseIntValue(userLiquidityDataList[idxPoolAmountAssetAmt]) | |
221 | + | let userPriceAssetBalance = parseIntValue(userLiquidityDataList[idxPoolPriceAssetAmt]) | |
222 | + | let userLPBalance = parseIntValue(userLiquidityDataList[idxPoolLPAssetAmt]) | |
223 | + | if (if ((amountAssetId != inAmountAssetId)) | |
224 | + | then true | |
225 | + | else (priceAssetId != inPriceAssetId)) | |
226 | + | then throw("Invalid amount or price asset passed.") | |
227 | + | else { | |
228 | + | let accountAmountAssetBalance = if (isEvaluate) | |
229 | + | then privateGetAccountBalance(amountAssetId) | |
230 | + | else (privateGetAccountBalance(amountAssetId) - inAmountAssetAmt) | |
231 | + | let accountPriceAssetBalance = if (isEvaluate) | |
232 | + | then privateGetAccountBalance(priceAssetId) | |
233 | + | else (privateGetAccountBalance(priceAssetId) - inPriceAssetAmt) | |
234 | + | let inAmountAssetAmtCalculated = privateCastToScaleOf(inAmountAssetAmt, scale8, amoutAssetDecimals) | |
235 | + | let inPriceAssetAmtCalculated = privateCastToScaleOf(inPriceAssetAmt, scale8, priceAssetDecimals) | |
236 | + | let userPrice = calculatePrice(inPriceAssetAmtCalculated, inAmountAssetAmtCalculated) | |
237 | + | let amountAssetPoolLockedAmt = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals) | |
238 | + | let priceAssetPoolLockedAmt = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals) | |
239 | + | let curentPrice = if ((poolLPBalance == 0)) | |
240 | + | then 0 | |
241 | + | else calculatePrice(priceAssetPoolLockedAmt, amountAssetPoolLockedAmt) | |
242 | + | let slippage = if ((curentPrice == 0)) | |
243 | + | then 0 | |
244 | + | else if ((curentPrice > userPrice)) | |
245 | + | then fraction((curentPrice - userPrice), 100, curentPrice) | |
246 | + | else fraction((userPrice - curentPrice), 100, curentPrice) | |
247 | + | if (if ((curentPrice != 0)) | |
248 | + | then ((slippage * scale8) > slippageTolerance) | |
249 | + | else false) | |
250 | + | then throw(((("Price slippage " + toString((slippage * scale8))) + " exceeded the passed limit of ") + toString(slippageTolerance))) | |
251 | + | else { | |
252 | + | let finalPrice = calculatePrice((priceAssetPoolLockedAmt + inPriceAssetAmtCalculated), (amountAssetPoolLockedAmt + inAmountAssetAmtCalculated)) | |
253 | + | let outLpAmount = if ((poolLPBalance == 0)) | |
254 | + | then { | |
255 | + | let partA = pow(inAmountAssetAmtCalculated, 0, 5, 1, 0, DOWN) | |
256 | + | let partB = pow(inPriceAssetAmtCalculated, 0, 5, 1, 0, DOWN) | |
257 | + | (partA * partB) | |
258 | + | } | |
259 | + | else { | |
260 | + | let lpAmtByAmountAsset = fraction(poolLPBalance, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt) | |
261 | + | let lpAmtByPriceAsset = fraction(poolLPBalance, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt) | |
262 | + | if ((lpAmtByPriceAsset > lpAmtByAmountAsset)) | |
263 | + | then lpAmtByAmountAsset | |
264 | + | else lpAmtByPriceAsset | |
265 | + | } | |
266 | + | $Tuple13(outLpAmount, finalPrice, userAmountAssetBalance, userPriceAssetBalance, userLPBalance, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, amountAssetInternalId, priceAssetInternalId, lpAssetId, slippage, poolStatus) | |
267 | + | } | |
268 | + | } | |
269 | + | } | |
270 | + | ||
271 | + | ||
272 | + | func validateMatcherOrderAllowed (order) = { | |
273 | + | let poolConfigDataList = getPoolConfig() | |
274 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
275 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
276 | + | let poolStatus = parseIntValue(poolConfigDataList[idxPoolStatus]) | |
277 | + | let matcherPublicKeyStr = poolConfigDataList[idxMatcherPublicKey] | |
278 | + | let amountAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
279 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
280 | + | let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId) | |
281 | + | let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId) | |
282 | + | let currentPrice = if ((order.orderType == Buy)) | |
283 | + | then privateCalculatePrice(amountAssetDecimals, priceAssetDecimals, (accountAmountAssetBalance + order.amount), accountPriceAssetBalance) | |
284 | + | else privateCalculatePrice(amountAssetDecimals, priceAssetDecimals, (accountAmountAssetBalance + order.amount), accountPriceAssetBalance) | |
285 | + | let isPoolStatusValid = if (if (if (isGlobalShutdown()) | |
286 | + | then true | |
287 | + | else (poolStatus == PoolMatcherDisabled)) | |
288 | + | then true | |
289 | + | else (poolStatus == PoolShutdown)) | |
290 | + | then false | |
291 | + | else true | |
292 | + | let isValidMatcherSign = true | |
293 | + | let orderAmountAsset = order.assetPair.amountAsset | |
294 | + | let orderAmountAssetStr = if ((orderAmountAsset == unit)) | |
295 | + | then "WAVES" | |
296 | + | else toBase58String(value(orderAmountAsset)) | |
297 | + | let orderPriceAsset = order.assetPair.priceAsset | |
298 | + | let orderPriceAssetStr = if ((orderPriceAsset == unit)) | |
299 | + | then "WAVES" | |
300 | + | else toBase58String(value(orderPriceAsset)) | |
301 | + | let isValidAssetPair = if (if ((orderAmountAssetStr != amountAssetId)) | |
302 | + | then true | |
303 | + | else (orderPriceAssetStr != priceAssetId)) | |
304 | + | then false | |
305 | + | else true | |
306 | + | let orderPrice = order.price | |
307 | + | let priceDecimals = fraction(scale8, priceAssetDecimals, amountAssetDecimals) | |
308 | + | let castedOrderPrice = privateCastToScaleOf(orderPrice, scale8, priceDecimals) | |
309 | + | let isOrderPriceValid = if ((order.orderType == Buy)) | |
310 | + | then (currentPrice >= castedOrderPrice) | |
311 | + | else (castedOrderPrice >= currentPrice) | |
312 | + | if (if (if (isValidAssetPair) | |
313 | + | then isValidMatcherSign | |
314 | + | else false) | |
315 | + | then isPoolStatusValid | |
316 | + | else false) | |
317 | + | then isOrderPriceValid | |
318 | + | else false | |
319 | + | } | |
320 | + | ||
321 | + | ||
322 | + | @Callable(i) | |
323 | + | func put (slippageTolerance,shouldAutoStake) = { | |
324 | + | let factoryConfigList = getFactoryConfig() | |
325 | + | let stakingContract = valueOrErrorMessage(addressFromString(factoryConfigList[idxFactoryStakingContract]), "Error. Incorrect staking address.") | |
326 | + | let pmtAmountAsset = value(i.payments[0]) | |
327 | + | let inAmountAssetAmt = pmtAmountAsset.amount | |
328 | + | let inAmountAssetId = if (!(isDefined(pmtAmountAsset.assetId))) | |
329 | + | then fromBase58String("WAVES") | |
330 | + | else value(pmtAmountAsset.assetId) | |
331 | + | let pmtPriceAsset = value(i.payments[1]) | |
332 | + | let inPriceAssetAmt = pmtPriceAsset.amount | |
333 | + | let inPriceAssetId = if (!(isDefined(pmtPriceAsset.assetId))) | |
334 | + | then fromBase58String("WAVES") | |
335 | + | else value(pmtPriceAsset.assetId) | |
336 | + | let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, toBase58String(inAmountAssetId), inPriceAssetAmt, toBase58String(inPriceAssetId), toString(i.caller), false) | |
337 | + | let outLpAmount = estimatedPutResults._1 | |
338 | + | let curentPrice = estimatedPutResults._2 | |
339 | + | let userAmountAssetBalance = estimatedPutResults._3 | |
340 | + | let userPriceAssetBalance = estimatedPutResults._4 | |
341 | + | let userLPBalance = estimatedPutResults._5 | |
342 | + | let poolAmountAssetBalance = estimatedPutResults._6 | |
343 | + | let poolPriceAssetBalance = estimatedPutResults._7 | |
344 | + | let poolLPBalance = estimatedPutResults._8 | |
345 | + | let amountAssetInternalId = estimatedPutResults._9 | |
346 | + | let priceAssetInternalId = estimatedPutResults._10 | |
347 | + | let lpAssetId = estimatedPutResults._11 | |
348 | + | let slippageCalculated = estimatedPutResults._12 | |
349 | + | let poolStatus = parseIntValue(estimatedPutResults._13) | |
350 | + | if (if (if (isGlobalShutdown()) | |
351 | + | then true | |
352 | + | else (poolStatus == PoolPutDisabled)) | |
353 | + | then true | |
354 | + | else (poolStatus == PoolShutdown)) | |
355 | + | then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus))) | |
356 | + | else { | |
357 | + | let emitLPAssetOnFactory = invoke(factoryContract, "emit", [outLpAmount], nil) | |
358 | + | if ((emitLPAssetOnFactory == emitLPAssetOnFactory)) | |
359 | + | then if ((emitLPAssetOnFactory != "success")) | |
360 | + | then throw("LP asset reissue failed during emit call on factory.") | |
361 | + | else { | |
362 | + | let results = [StringEntry(keyPriceLast(), ("%s__" + toString(curentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(curentPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, outLpAmount, curentPrice, slippageTolerance, slippageCalculated, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance + inAmountAssetAmt), (userPriceAssetBalance + inPriceAssetAmt), (userLPBalance + outLpAmount))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance + inAmountAssetAmt), (poolPriceAssetBalance + inPriceAssetAmt), (poolLPBalance + outLpAmount)))] | |
363 | + | if (shouldAutoStake) | |
364 | + | then { | |
365 | + | let stake = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, outLpAmount)]) | |
366 | + | if ((stake == stake)) | |
367 | + | then results | |
368 | + | else throw("Strict value is not equal to itself.") | |
369 | + | } | |
370 | + | else (results :+ ScriptTransfer(i.caller, outLpAmount, lpAssetId)) | |
371 | + | } | |
372 | + | else throw("Strict value is not equal to itself.") | |
373 | + | } | |
374 | + | } | |
375 | + | ||
376 | + | ||
377 | + | ||
378 | + | @Callable(i) | |
379 | + | func get () = { | |
380 | + | let pmtAmountAsset = value(i.payments[0]) | |
381 | + | let pmtAssetId = value(pmtAmountAsset.assetId) | |
382 | + | let pmtAssetAmount = pmtAmountAsset.amount | |
383 | + | let results = privateEstimateGetOperation(toBase58String(pmtAssetId), pmtAssetAmount, toString(i.caller)) | |
384 | + | let outAmountAssetAmt = results._1 | |
385 | + | let outPriceAssetAmt = results._2 | |
386 | + | let amountAssetInternalId = results._3 | |
387 | + | let priceAssetInternalId = results._4 | |
388 | + | let userAmountAssetBalance = results._5 | |
389 | + | let amountAssetId = results._6 | |
390 | + | let userPriceAssetBalance = results._7 | |
391 | + | let priceAssetId = results._8 | |
392 | + | let userLPBalance = results._9 | |
393 | + | let poolAmountAssetBalance = results._10 | |
394 | + | let poolPriceAssetBalance = results._11 | |
395 | + | let poolLPBalance = results._12 | |
396 | + | let currentPrice = results._13 | |
397 | + | let poolStatus = parseIntValue(results._14) | |
398 | + | if (if (isGlobalShutdown()) | |
399 | + | then true | |
400 | + | else (poolStatus == PoolShutdown)) | |
401 | + | then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus))) | |
402 | + | else { | |
403 | + | let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAssetAmount], [AttachedPayment(pmtAssetId, pmtAssetAmount)]) | |
404 | + | if ((burnLPAssetOnFactory == burnLPAssetOnFactory)) | |
405 | + | then if ((burnLPAssetOnFactory != "success")) | |
406 | + | then throw("LP asset burn failed during emit call on factory.") | |
407 | + | else [ScriptTransfer(i.caller, outAmountAssetAmt, if ((amountAssetId == "WAVES")) | |
408 | + | then unit | |
409 | + | else fromBase58String(amountAssetId)), ScriptTransfer(i.caller, outPriceAssetAmt, fromBase58String(priceAssetId)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance - outAmountAssetAmt), (userPriceAssetBalance - outPriceAssetAmt), (userLPBalance - pmtAssetAmount))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance - outAmountAssetAmt), (poolPriceAssetBalance - outPriceAssetAmt), (poolLPBalance - pmtAssetAmount))), StringEntry(keyGetActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataGetActionInfo(outAmountAssetAmt, outPriceAssetAmt, pmtAssetAmount, currentPrice, height, lastBlock.timestamp)), StringEntry(keyPriceLast(), ("%s__" + toString(currentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPrice)))] | |
410 | + | else throw("Strict value is not equal to itself.") | |
411 | + | } | |
412 | + | } | |
413 | + | ||
414 | + | ||
415 | + | ||
416 | + | @Callable(i) | |
417 | + | func activate (amountAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract))) | |
418 | + | then throw("permissions denied") | |
419 | + | else $Tuple2([StringEntry(keyAmountAsset(), amountAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success") | |
420 | + | ||
421 | + | ||
422 | + | ||
423 | + | @Callable(i) | |
424 | + | func statsREADONLY () = { | |
425 | + | let poolConfigDataList = getPoolConfig() | |
426 | + | let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId]) | |
427 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
428 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
429 | + | let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId] | |
430 | + | let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId] | |
431 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
432 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
433 | + | let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
434 | + | let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt]) | |
435 | + | let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId) | |
436 | + | let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId) | |
437 | + | let pricesList = calculatePrices(accountAmountAssetBalance, accountPriceAssetBalance, poolLPBalance) | |
438 | + | let currentPrice = pricesList[0] | |
439 | + | let lpPriceInAmountAsset = pricesList[1] | |
440 | + | let lpPriceInPriceAsset = pricesList[2] | |
441 | + | let poolWeight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeight(toString(this))), "Pool doesn't have weight.") | |
442 | + | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accountAmountAssetBalance), toString(accountPriceAssetBalance), toString(poolLPBalance), toString(currentPrice), toString(lpPriceInAmountAsset), toString(lpPriceInPriceAsset), toString(poolWeight)], SEP)) | |
443 | + | } | |
444 | + | ||
445 | + | ||
446 | + | ||
447 | + | @Callable(i) | |
448 | + | func evaluatePutByAmountAssetREADONLY (slippageTolerance,inAmountAssetAmt,userAddress) = { | |
449 | + | let poolConfigDataList = getPoolConfig() | |
450 | + | let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId]) | |
451 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
452 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
453 | + | let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId] | |
454 | + | let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId] | |
455 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
456 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
457 | + | let poolStatus = poolConfigDataList[idxPoolStatus] | |
458 | + | let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
459 | + | let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt]) | |
460 | + | let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId) | |
461 | + | let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId) | |
462 | + | let accountAmountAssetBalanceCasted = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals) | |
463 | + | let accountPriceAssetBalanceCasted = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals) | |
464 | + | let curentPrice = if ((poolLPBalance == 0)) | |
465 | + | then 0 | |
466 | + | else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted) | |
467 | + | let inPriceAssetAmtCalculated = fraction(inAmountAssetAmt, curentPrice, scale8) | |
468 | + | let inPriceAssetAmt = privateCastToScaleOf(inPriceAssetAmtCalculated, priceAssetDecimals, scale8) | |
469 | + | let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true) | |
470 | + | let outLpAmountCalc = estimatedPutResults._1 | |
471 | + | let curentPriceCalc = estimatedPutResults._2 | |
472 | + | let poolAmountAssetBalanceCalc = estimatedPutResults._6 | |
473 | + | let poolPriceAssetBalanceCAlc = estimatedPutResults._7 | |
474 | + | let poolLPBalanceCalc = estimatedPutResults._8 | |
475 | + | let poolStatusCalc = parseIntValue(estimatedPutResults._13) | |
476 | + | $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(outLpAmountCalc), toString(curentPrice), toString(poolAmountAssetBalanceCalc), toString(poolPriceAssetBalanceCAlc), toString(poolLPBalanceCalc), toString(poolStatusCalc)], SEP)) | |
477 | + | } | |
478 | + | ||
479 | + | ||
480 | + | ||
481 | + | @Callable(i) | |
482 | + | func evaluatePutByPriceAssetREADONLY (slippageTolerance,inPriceAssetAmt,userAddress) = { | |
483 | + | let poolConfigDataList = getPoolConfig() | |
484 | + | let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId]) | |
485 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
486 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
487 | + | let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId] | |
488 | + | let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId] | |
489 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
490 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
491 | + | let poolStatus = poolConfigDataList[idxPoolStatus] | |
492 | + | let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
493 | + | let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt]) | |
494 | + | let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId) | |
495 | + | let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId) | |
496 | + | let accountAmountAssetBalanceCasted = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals) | |
497 | + | let accountPriceAssetBalanceCasted = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals) | |
498 | + | let inPriceAssetAmtCalculatedTuple = privateCastToScaleOf(inPriceAssetAmt, scale8, priceAssetDecimals) | |
499 | + | let curentPrice = if ((poolLPBalance == 0)) | |
500 | + | then 0 | |
501 | + | else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted) | |
502 | + | let inAmountAssetAmtCalculated = fraction(inPriceAssetAmtCalculatedTuple, scale8, curentPrice) | |
503 | + | let inAmountAssetAmt = privateCastToScaleOf(inAmountAssetAmtCalculated, amoutAssetDecimals, scale8) | |
504 | + | let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true) | |
505 | + | let outLpAmountCalc = estimatedPutResults._1 | |
506 | + | let curentPriceCalc = estimatedPutResults._2 | |
507 | + | let poolAmountAssetBalanceCalc = estimatedPutResults._6 | |
508 | + | let poolPriceAssetBalanceCAlc = estimatedPutResults._7 | |
509 | + | let poolLPBalanceCalc = estimatedPutResults._8 | |
510 | + | let poolStatusCalc = parseIntValue(estimatedPutResults._13) | |
511 | + | $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(outLpAmountCalc), toString(curentPrice), toString(poolAmountAssetBalanceCalc), toString(poolPriceAssetBalanceCAlc), toString(poolLPBalanceCalc), toString(poolStatusCalc)], SEP)) | |
512 | + | } | |
513 | + | ||
514 | + | ||
515 | + | ||
516 | + | @Callable(i) | |
517 | + | func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmount,userAddress) = { | |
518 | + | let results = privateEstimateGetOperation(paymentLpAssetId, paymentLpAmount, userAddress) | |
519 | + | let outAmountAssetAmt = results._1 | |
520 | + | let outPriceAssetAmt = results._2 | |
521 | + | let poolAmountAssetBalance = results._10 | |
522 | + | let poolPriceAssetBalance = results._11 | |
523 | + | let poolLPBalance = results._12 | |
524 | + | let currentPrice = results._13 | |
525 | + | let poolStatus = parseIntValue(results._14) | |
526 | + | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(poolAmountAssetBalance), toString(poolPriceAssetBalance), toString(poolLPBalance), toString(currentPrice), toString(poolStatus)], SEP)) | |
527 | + | } | |
528 | + | ||
529 | + | ||
530 | + | ||
531 | + | @Callable(i) | |
532 | + | func hashREADONLY () = $Tuple2(nil, toBase64String(value(scriptHash(this)))) | |
533 | + | ||
534 | + | ||
535 | + | @Verifier(tx) | |
536 | + | func verify () = match tx { | |
537 | + | case order: Order => | |
538 | + | true | |
539 | + | case _ => | |
540 | + | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
541 | + | } | |
542 | + |
github/deemru/w8io/026f985 33.86 ms ◑