tx · 2eS9b612jnPujdq6fhiQ6a4MZvhPnJ8mqivpgKZ6Ub5y

3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy:  -0.01000000 Waves

2021.12.02 10:48 [1816379] smart account 3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy > SELF 0.00000000 Waves

{ "type": 13, "id": "2eS9b612jnPujdq6fhiQ6a4MZvhPnJ8mqivpgKZ6Ub5y", "fee": 1000000, "feeAssetId": null, "timestamp": 1638431386734, "version": 1, "sender": "3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy", "senderPublicKey": "9W33iCCNfmFxUbiC6XZcH5x7f6xfwC7Jb3BoExT5q2PV", "proofs": [ "3eznmFoQk8zDu58LiLHbCEn8dDVoGWGKLywLQG6gGtJWTNpczTWQx2mVu6t3fekvFyZDnjKchKzkUYb7vRSdCArH" ], "script": "base64:AAIFAAAAAAAAACwIAhIICgYICAEBAQgSAwoBARIDCgEBEgQKAggIEgQKAggIEgMKAQgSAwoBCAAAAFQAAAAAA1NFUAIAAAACX18AAAAABlNDQUxFOAAAAAAAAAAACAAAAAAFTVVMVDgAAAAAAAX14QAAAAAADlBPT0xXRUlHSFRNVUxUBQAAAAVNVUxUOAEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAICAAAAD21hbmRhdG9yeSB0aGlzLgUAAAADa2V5AgAAAA8gaXMgbm90IGRlZmluZWQBAAAADGdldEludE9yWmVybwAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AAAAAAAAAAAAAQAAAA9nZXRJbnRPckRlZmF1bHQAAAADAAAAB2FkZHJlc3MAAAADa2V5AAAACmRlZmF1bHRWYWwJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5BQAAAApkZWZhdWx0VmFsAQAAAAxnZXRJbnRPckZhaWwAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgIAAAAPbWFuZGF0b3J5IHRoaXMuBQAAAANrZXkCAAAADyBpcyBub3QgZGVmaW5lZAEAAAAJYXNBbnlMaXN0AAAAAQAAAAN2YWwEAAAAByRtYXRjaDAFAAAAA3ZhbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAJTGlzdFtBbnldBAAAAAp2YWxBbnlMeXN0BQAAAAckbWF0Y2gwBQAAAAp2YWxBbnlMeXN0CQAAAgAAAAECAAAAG2ZhaWwgdG8gY2FzdCBpbnRvIExpc3RbQW55XQEAAAAFYXNJbnQAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAABnZhbEludAUAAAAHJG1hdGNoMAUAAAAGdmFsSW50CQAAAgAAAAECAAAAFWZhaWwgdG8gY2FzdCBpbnRvIEludAEAAAARa2V5RmFjdG9yeUFkZHJlc3MAAAAAAgAAABwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzAAAAABhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHAAAAAAAAAAAAEAAAAAGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAAAAAAAAAAAAIAAAAAFElkeEZhY3RvcnlDZmdJZG9EYXBwAAAAAAAAAAADAAAAABVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAAAAAAAAAAAAQAAAAAGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAAAAAAAAAAAAUAAAAAFUlkeEZhY3RvcnlDZmdSZXN0RGFwcAAAAAAAAAAABgAAAAAZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcAAAAAAAAAAABwEAAAANa2V5RmFjdG9yeUNmZwAAAAACAAAAESVzX19mYWN0b3J5Q29uZmlnAQAAABprZXlGYWN0b3J5THAyQXNzZXRzTWFwcGluZwAAAAEAAAAKbHBBc3NldFN0cgkABLkAAAACCQAETAAAAAICAAAABiVzJXMlcwkABEwAAAACBQAAAApscEFzc2V0U3RyCQAETAAAAAICAAAAHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUAAAADbmlsBQAAAANTRVABAAAAEGtleUZhY3RvcnlMcExpc3QAAAAAAgAAABAlc19fbHBUb2tlbnNMaXN0AQAAACZrZXlGYWN0b3J5THBBc3NldFRvUG9vbENvbnRyYWN0QWRkcmVzcwAAAAEAAAAKbHBBc3NldFN0cgkABLkAAAACCQAETAAAAAICAAAABiVzJXMlcwkABEwAAAACBQAAAApscEFzc2V0U3RyCQAETAAAAAICAAAAHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUAAAADbmlsBQAAAANTRVABAAAAFGtleUZhY3RvcnlQb29sV2VpZ2h0AAAAAQAAAA9jb250cmFjdEFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAAQlcyVzCQAETAAAAAICAAAACnBvb2xXZWlnaHQJAARMAAAAAgUAAAAPY29udHJhY3RBZGRyZXNzBQAAAANuaWwFAAAAA1NFUAEAAAAYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsAAAAAAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAABAAAACnJlYWRMcExpc3QAAAAACQAEtQAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgkBAAAAGHJlYWRGYWN0b3J5QWRkcmVzc09yRmFpbAAAAAAJAQAAABBrZXlGYWN0b3J5THBMaXN0AAAAAAIAAAAABQAAAANTRVABAAAAFHJlYWRGYWN0b3J5Q2ZnT3JGYWlsAAAAAQAAAAdmYWN0b3J5CQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAdmYWN0b3J5CQEAAAANa2V5RmFjdG9yeUNmZwAAAAAFAAAAA1NFUAEAAAAYZ2V0Qm9vc3RpbmdBZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHABAAAAGGdldEVtaXNzaW9uQWRkcmVzc09yRmFpbAAAAAEAAAAKZmFjdG9yeUNmZwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApmYWN0b3J5Q2ZnBQAAABlJZHhGYWN0b3J5Q2ZnRW1pc3Npb25EYXBwAQAAABdnZXRTdGFraW5nQWRkcmVzc09yRmFpbAAAAAEAAAAKZmFjdG9yeUNmZwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApmYWN0b3J5Q2ZnBQAAABhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHABAAAAHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudAAAAAACAAAAGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAEAAAAha2V5RW1pc3Npb25SYXRlUGVyQmxvY2tNYXhDdXJyZW50AAAAAAIAAAAeJXMlc19fcmF0ZVBlckJsb2NrTWF4X19jdXJyZW50AQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAAAgAAABolcyVzX19lbWlzc2lvbl9fc3RhcnRCbG9jawEAAAAba2V5RW1pc3Npb25EdXJhdGlvbkluQmxvY2tzAAAAAAIAAAAYJXMlc19fZW1pc3Npb25fX2R1cmF0aW9uAQAAABNrZXlFbWlzc2lvbkVuZEJsb2NrAAAAAAIAAAAYJXMlc19fZW1pc3Npb25fX2VuZEJsb2NrAAAAAA1JZHhDZmdBc3NldElkAAAAAAAAAAABAAAAABNJZHhDZmdNaW5Mb2NrQW1vdW50AAAAAAAAAAACAAAAABVJZHhDZmdNaW5Mb2NrRHVyYXRpb24AAAAAAAAAAAMAAAAAFUlkeENmZ01heExvY2tEdXJhdGlvbgAAAAAAAAAABAAAAAASSWR4Q2ZnTWF0aENvbnRyYWN0AAAAAAAAAAAFAQAAAAlrZXlDb25maWcAAAAAAgAAAAolc19fY29uZmlnAQAAABVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAAAACQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAR0aGlzCQEAAAAJa2V5Q29uZmlnAAAAAAUAAAADU0VQAQAAAA1mb3JtYXRDb25maWdTAAAABQAAAAdhc3NldElkAAAADW1pbkxvY2tBbW91bnQAAAAPbWluTG9ja0R1cmF0aW9uAAAAD21heExvY2tEdXJhdGlvbgAAAAxtYXRoQ29udHJhY3QJAAS5AAAAAgkABEwAAAACAgAAAAglcyVkJWQlZAkABEwAAAACBQAAAAdhc3NldElkCQAETAAAAAIFAAAADW1pbkxvY2tBbW91bnQJAARMAAAAAgUAAAAPbWluTG9ja0R1cmF0aW9uCQAETAAAAAIFAAAAD21heExvY2tEdXJhdGlvbgkABEwAAAACBQAAAAxtYXRoQ29udHJhY3QFAAAAA25pbAUAAAADU0VQAQAAAAxmb3JtYXRDb25maWcAAAAFAAAAB2Fzc2V0SWQAAAANbWluTG9ja0Ftb3VudAAAAA9taW5Mb2NrRHVyYXRpb24AAAAPbWF4TG9ja0R1cmF0aW9uAAAADG1hdGhD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dW50AQAAABJrZXlTdGF0c1VzZXJzQ291bnQAAAAAAgAAAB0lcyVzX19zdGF0c19fYWN0aXZlVXNlcnNDb3VudAEAAAAga2V5VXNlckJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAAB4lcyVkX191c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnQJAARMAAAAAgUAAAAHdXNlck51bQUAAAADbmlsBQAAAANTRVABAAAAF2tleVVzZXJNYXhCb29zdElOVEVHUkFMAAAAAQAAAAd1c2VyTnVtCQAEuQAAAAIJAARMAAAAAgIAAAARJXMlZF9fbWF4Qm9vc3RJbnQJAARMAAAAAgUAAAAHdXNlck51bQUAAAADbmlsBQAAAANTRVABAAAAGGtleVRvdGFsTWF4Qm9vc3RJTlRFR1JBTAAAAAACAAAAGCVzJXNfX21heEJvb3N0SW50X190b3RhbAEAAAAha2V5VXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsAAAAAQAAAAd1c2VyTnVtCQAEuQAAAAIJAARMAAAAAgIAAAAkJXMlZF9fdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsCQAETAAAAAIFAAAAB3VzZXJOdW0FAAAAA25pbAUAAAADU0VQAQAAABNrZXlVc2VyQm9vc3RDbGFpbWVkAAAAAQAAAAd1c2VyTnVtCQAEuQAAAAIJAARMAAAAAgIAAAAWJXMlZF9fdXNlckJvb3N0Q2xhaW1lZAkABEwAAAACBQAAAAd1c2VyTnVtBQAAAANuaWwFAAAAA1NFUAEAAAARa2V5VG90YWxDYWNoZWRHd3gAAAAAAgAAABYlcyVzX19nd3hDYWNoZWRfX3RvdGFsAAAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAAAAAAAApmYWN0b3J5Q2ZnCQEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABBQAAAA9mYWN0b3J5Q29udHJhY3QAAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwAAAABBQAAAApmYWN0b3J5Q2ZnAAAAAA9zdGFraW5nQ29udHJhY3QJAQAAABdnZXRTdGFraW5nQWRkcmVzc09yRmFpbAAAAAEFAAAACmZhY3RvcnlDZmcBAAAADEhpc3RvcnlFbnRyeQAAAAgAAAAEdHlwZQAAAAR1c2VyAAAABmFtb3VudAAAAAlsb2NrU3RhcnQAAAAIZHVyYXRpb24AAAABawAAAAFiAAAAAWkEAAAACmhpc3RvcnlLRVkJAAS5AAAAAgkABEwAAAACAgAAABElcyVzJXMlc19faGlzdG9yeQkABEwAAAACBQAAAAR0eXBlCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAANuaWwFAAAAA1NFUAQAAAALaGlzdG9yeURBVEEJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAGaGVpZ2h0CQAETAAAAAIJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAARMAAAAAgkAAaQAAAABBQAAAAZhbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAAlsb2NrU3RhcnQJAARMAAAAAgkAAaQAAAABBQAAAAhkdXJhdGlvbgkABEwAAAACCQABpAAAAAEFAAAAAWsJAARMAAAAAgkAAaQAAAABBQAAAAFiBQAAAANuaWwFAAAAA1NFUAkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAKaGlzdG9yeUtFWQUAAAALaGlzdG9yeURBVEEBAAAAClN0YXRzRW50cnkAAAAEAAAADnRvdGFsTG9ja2VkSW5jAAAAC2R1cmF0aW9uSW5jAAAADGxvY2tDb3VudEluYwAAAA11c2Vyc0NvdW50SW5jBAAAABtsb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3NLRVkJAQAAACBrZXlTdGF0c0xvY2tzRHVyYXRpb25TdW1JbkJsb2NrcwAAAAAEAAAADWxvY2tzQ291bnRLRVkJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAABAAAAA11c2Vyc0NvdW50S0VZCQEAAAASa2V5U3RhdHNVc2Vyc0NvdW50AAAAAAQAAAAOdG90YWxBbW91bnRLRVkJAQAAABdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAAEAAAAGGxvY2tzRHVyYXRpb25TdW1JbkJsb2NrcwkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAG2xvY2tzRHVyYXRpb25TdW1JbkJsb2Nrc0tFWQQAAAAKbG9ja3NDb3VudAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAADWxvY2tzQ291bnRLRVkEAAAACnVzZXJzQ291bnQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAAA11c2Vyc0NvdW50S0VZBAAAAAt0b3RhbEFtb3VudAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAADnRvdGFsQW1vdW50S0VZCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABtsb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3NLRVkJAABkAAAAAgUAAAAYbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzBQAAAAtkdXJhdGlvbkluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANbG9ja3NDb3VudEtFWQkAAGQAAAACBQAAAApsb2Nrc0NvdW50BQAAAAxsb2NrQ291bnRJbmMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADXVzZXJzQ291bnRLRVkJAABkAAAAAgUAAAAKdXNlcnNDb3VudAUAAAANdXNlcnNDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOdG90YWxBbW91bnRLRVkJAABkAAAAAgUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsTG9ja2VkSW5jBQAAAANuaWwBAAAADWNhbGNHd3hBbW91bnQAAAADAAAABGtSYXcAAAAEYlJhdwAAAAFoBAAAAAVTQ0FMRQAAAAAAAAAD6AkAAGkAAAACCQAAZAAAAAIJAABoAAAAAgUAAAAEa1JhdwUAAAABaAUAAAAEYlJhdwUAAAAFU0NBTEUBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAgAAAALdXNlckFkZHJlc3MAAAAHdXNlck51bQAAAAZhbW91bnQAAAAFc3RhcnQAAAAIZHVyYXRpb24AAAABawAAAAFiAAAABnBlcmlvZAQAAAANdXNlckFtb3VudEtFWQkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAd1c2VyTnVtBAAAAA1zdGFydEJsb2NrS0VZCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAB3VzZXJOdW0EAAAAC2R1cmF0aW9uS0VZCQEAAAAUa2V5TG9ja1BhcmFtRHVyYXRpb24AAAABBQAAAAd1c2VyTnVtBAAAAARrS0VZCQEAAAANa2V5TG9ja1BhcmFtSwAAAAEFAAAAB3VzZXJOdW0EAAAABGJLRVkJAQAAAA1rZXlMb2NrUGFyYW1CAAAAAQUAAAAHdXNlck51bQQAAAALa0J5UGVyaW9LRVkJAQAAABVrZXlMb2NrUGFyYW1CeVBlcmlvZEsAAAACBQAAAAd1c2VyTnVtBQAAAAZwZXJpb2QEAAAADGJCeVBlcmlvZEtFWQkBAAAAFWtleUxvY2tQYXJhbUJ5UGVyaW9kQgAAAAIFAAAAB3VzZXJOdW0FAAAABnBlcmlvZAQAAAAJZ3d4QW1vdW50CQEAAAANY2FsY0d3eEFtb3VudAAAAAMFAAAAAWsFAAAAAWIFAAAABmhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANdXNlckFtb3VudEtFWQUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1zdGFydEJsb2NrS0VZBQAAAAVzdGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALZHVyYXRpb25LRVkFAAAACGR1cmF0aW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAARrS0VZBQAAAAFrCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAARiS0VZBQAAAAFiCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrQnlQZXJpb0tFWQUAAAABawkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAMYkJ5UGVyaW9kS0VZBQAAAAFiCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABNrZXlMb2NrUGFyYW1zUmVjb3JkAAAAAQUAAAALdXNlckFkZHJlc3MJAQAAABZmb3JtYXRMb2NrUGFyYW1zUmVjb3JkAAAABwUAAAAHdXNlck51bQUAAAAGYW1vdW50BQAAAAVzdGFydAUAAAAIZHVyYXRpb24FAAAAAWsFAAAAAWIFAAAACWd3eEFtb3VudAUAAAADbmlsAQAAACJleHRyYWN0T3B0aW9uYWxQYXltZW50QW1vdW50T3JGYWlsAAAAAgAAAAFpAAAAD2V4cGVjdGVkQXNzZXRJZAMJAABmAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAABtvbmx5IG9uZSBwYXltZW50IGlzIGFsbG93ZWQDCQAAAAAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA3BtdAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAMJAQAAAAIhPQAAAAIJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAAPZXhwZWN0ZWRBc3NldElkCQAAAgAAAAECAAAAG2ludmFsaWQgYXNzZXQgaWQgaW4gcGF5bWVudAgFAAAAA3BtdAAAAAZhbW91bnQBAAAAFGNhbGNDdXJyZW50R3d4QW1vdW50AAAAAQAAAAt1c2VyQWRkcmVzcwQAAAAFRU1QVFkCAAAABWVtcHR5BAAAABJ1c2VyMk51bU1hcHBpbmdLRVkJAQAAABJrZXlVc2VyMk51bU1hcHBpbmcAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAAHdXNlck51bQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABCIAAAABBQAAABJ1c2VyMk51bU1hcHBpbmdLRVkFAAAABUVNUFRZBAAAAAFrCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAAA1rZXlMb2NrUGFyYW1LAAAAAQUAAAAHdXNlck51bQAAAAAAAAAAAAQAAAABYgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABCQEAAAANa2V5TG9ja1BhcmFtQgAAAAEFAAAAB3VzZXJOdW0AAAAAAAAAAAAEAAAADWd3eEFtb3VudENhbGMJAQAAAA1jYWxjR3d4QW1vdW50AAAAAwUAAAABawUAAAABYgUAAAAGaGVpZ2h0BAAAAAlnd3hBbW91bnQDCQAAZgAAAAIAAAAAAAAAAAAFAAAADWd3eEFtb3VudENhbGMAAAAAAAAAAAAFAAAADWd3eEFtb3VudENhbGMFAAAACWd3eEFtb3VudAEAAAAUaW50ZXJuYWxDbGFpbVd4Qm9vc3QAAAADAAAADGxwQXNzZXRJZFN0cgAAAA51c2VyQWRkcmVzc1N0cgAAAAhyZWFkT25seQQAAAAFRU1QVFkCAAAABUVNUFRZBAAAABF1c2VyUmVjb3JkT3JFbXB0eQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAATa2V5TG9ja1BhcmFtc1JlY29yZAAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAVFTVBUWQMJAAAAAAAAAgUAAAARdXNlclJlY29yZE9yRW1wdHkFAAAABUVNUFRZCQAFFQAAAAMAAAAAAAAAAAAFAAAAA25pbAIAAAAVdXNlclJlY29yZDo6aXM6OmVtcHR5BAAAAA91c2VyUmVjb3JkQXJyYXkJAAS1AAAAAgUAAAARdXNlclJlY29yZE9yRW1wdHkFAAAAA1NFUAQAAAAKdXNlck51bVN0cgkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAADklkeExvY2tVc2VyTnVtBAAAAAhFTVBUWVNUUgIAAAAFZW1wdHkEAAAACnBvb2xXZWlnaHQDCQEAAAACIT0AAAACBQAAAAxscEFzc2V0SWRTdHIFAAAACEVNUFRZU1RSBAAAAA5wb29sQWRkcmVzc1N0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQUAAAAMbHBBc3NldElkU3RyCQABLAAAAAICAAAAFXVuc3VwcG9ydGVkIGxwIGFzc2V0IAUAAAAMbHBBc3NldElkU3RyCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABRrZXlGYWN0b3J5UG9vbFdlaWdodAAAAAEFAAAADnBvb2xBZGRyZXNzU3RyAwUAAAAIcmVhZE9ubHkAAAAAAAAAAAAJAAACAAAAAQkAASwAAAACAgAAAChub3QgcmVhZG9ubHkgbW9kZTogdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQAAAAxscEFzc2V0SWRTdHIEAAAAEnd4RW1pc3Npb25QZXJCbG9jawkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAAB5rZXlFbWlzc2lvblJhdGVQZXJCbG9ja0N1cnJlbnQAAAAABAAAAA1lbWlzc2lvblN0YXJ0CQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAAEAAAAC2VtaXNzaW9uRW5kCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAE2tleUVtaXNzaW9uRW5kQmxvY2sAAAAABAAAAAFoAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAAC2VtaXNzaW9uRW5kBQAAAAtlbWlzc2lvbkVuZAUAAAAGaGVpZ2h0BAAAAAJkaAkAAZYAAAABCQAETAAAAAIJAABlAAAAAgUAAAABaAUAAAANZW1pc3Npb25TdGFydAkABEwAAAACAAAAAAAAAAAABQAAAANuaWwEAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZCQEAAAAga2V5VXNlckJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwAAAABBQAAAAp1c2VyTnVtU3RyBAAAAB11c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZBAAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwJAABpAAAAAgkAAGgAAAACCQAAaAAAAAIFAAAAEnd4RW1pc3Npb25QZXJCbG9jawUAAAACZGgAAAAAAAAAAAIAAAAAAAAAAAMEAAAAGXVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwJAABlAAAAAgUAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsBQAAAB11c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbAMJAABmAAAAAgAAAAAAAAAAAAUAAAAZdXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAAIAAAABAgAAABJ3cm9uZyBjYWxjdWxhdGlvbnMEAAAAF3VzZXJNYXhCb29zdEludGVncmFsS0VZCQEAAAAXa2V5VXNlck1heEJvb3N0SU5URUdSQUwAAAABBQAAAAp1c2VyTnVtU3RyBAAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkJAQAAABhrZXlUb3RhbE1heEJvb3N0SU5URUdSQUwAAAAABAAAAA91c2VyTWF4Qm9vc3RJbnQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQQAAAAQdG90YWxNYXhCb29zdEludAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQQAAAARdG90YWxDYWNoZWRHd3hLRVkJAQAAABFrZXlUb3RhbENhY2hlZEd3eAAAAAAEAAAADnRvdGFsQ2FjaGVkR3d4CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEXRvdGFsQ2FjaGVkR3d4S0VZAAAAAAAAAAAABAAAAAt1c2VyQ3Vyckd3eAkBAAAAFGNhbGNDdXJyZW50R3d4QW1vdW50AAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQkBAAAAIWtleVVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQQAAAAdcG9vbFVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwJAABrAAAAAwUAAAAZdXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbAUAAAAKcG9vbFdlaWdodAUAAAAOUE9PTFdFSUdIVE1VTFQEAAAAIXVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbE5ldwkAAGQAAAACBQAAAB51c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWwDCQAAAAAAAAIFAAAADnRvdGFsQ2FjaGVkR3d4AAAAAAAAAAAAAAAAAAAAAAAACQAAawAAAAMFAAAAHXBvb2xVc2VyQm9vc3RFbWlzc2lvbkludGVncmFsBQAAAAt1c2VyQ3Vyckd3eAUAAAAOdG90YWxDYWNoZWRHd3gEAAAAE3VzZXJCb29zdENsYWltZWRLRVkJAQAAABNrZXlVc2VyQm9vc3RDbGFpbWVkAAAAAQUAAAAKdXNlck51bVN0cgQAAAAQdXNlckJvb3N0Q2xhaW1lZAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAE3VzZXJCb29zdENsYWltZWRLRVkEAAAAEnVzZXJCb29zdEF2YWlsYWJsZQkAAGUAAAACBQAAACF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXcFAAAAEHVzZXJCb29zdENsYWltZWQEAAAACWRhdGFTdGF0ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAhdXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsS0VZBQAAACF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZBQAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwFAAAAA25pbAQAAAAFZGVidWcJAAS5AAAAAgkABEwAAAACCQABLAAAAAICAAAAHnVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsPQkAAaQAAAABBQAAAB11c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbAkABEwAAAACCQABLAAAAAICAAAAGnVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWw9CQABpAAAAAEFAAAAGXVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwJAARMAAAAAgkAASwAAAACAgAAABB1c2VyTWF4Qm9vc3RJbnQ9CQABpAAAAAEFAAAAD3VzZXJNYXhCb29zdEludAkABEwAAAACCQABLAAAAAICAAAAEXRvdGFsTWF4Qm9vc3RJbnQ9CQABpAAAAAEFAAAAEHRvdGFsTWF4Qm9vc3RJbnQJAARMAAAAAgkAASwAAAACAgAAAB91c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWw9CQABpAAAAAEFAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkABEwAAAACCQABLAAAAAICAAAAInVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbE5ldz0JAAGkAAAAAQUAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3CQAETAAAAAIJAAEsAAAAAgIAAAARdXNlckJvb3N0Q2xhaW1lZD0JAAGkAAAAAQUAAAAQdXNlckJvb3N0Q2xhaW1lZAkABEwAAAACCQABLAAAAAICAAAAE3VzZXJCb29zdEF2YWlsYWJsZT0JAAGkAAAAAQUAAAASdXNlckJvb3N0QXZhaWxhYmxlCQAETAAAAAIJAAEsAAAAAgIAAAAecG9vbFVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWw9CQABpAAAAAEFAAAAHXBvb2xVc2VyQm9vc3RFbWlzc2lvbkludGVncmFsCQAETAAAAAIJAAEsAAAAAgIAAAAMdXNlckN1cnJHd3g9CQABpAAAAAEFAAAAC3VzZXJDdXJyR3d4CQAETAAAAAIJAAEsAAAAAgIAAAAOdG90YWxDYWNoZWRHd3gJAAGkAAAAAQUAAAAOdG90YWxDYWNoZWRHd3gFAAAAA25pbAIAAAACOjoJAAUVAAAAAwUAAAASdXNlckJvb3N0QXZhaWxhYmxlBQAAAAlkYXRhU3RhdGUFAAAABWRlYnVnAAAABwAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAYAAAARZmFjdG9yeUFkZHJlc3NTdHIAAAAObG9ja0Fzc2V0SWRTdHIAAAANbWluTG9ja0Ftb3VudAAAAAttaW5EdXJhdGlvbgAAAAttYXhEdXJhdGlvbgAAAAxtYXRoQ29udHJhY3QDCQEAAAACIT0AAAACBQAAAAR0aGlzCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAAObm90IGF1dGhvcml6ZWQJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADmtleU5leHRVc2VyTnVtAAAAAAAAAAAAAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAJa2V5Q29uZmlnAAAAAAkBAAAADGZvcm1hdENvbmZpZwAAAAUFAAAADmxvY2tBc3NldElkU3RyBQAAAA1taW5Mb2NrQW1vdW50BQAAAAttaW5EdXJhdGlvbgUAAAALbWF4RHVyYXRpb24FAAAADG1hdGhDb250cmFjdAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARa2V5RmFjdG9yeUFkZHJlc3MAAAAABQAAABFmYWN0b3J5QWRkcmVzc1N0cgUAAAADbmlsCQEAAAAKU3RhdHNFbnRyeQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaQEAAAAEbG9jawAAAAEAAAAIZHVyYXRpb24EAAAACGNmZ0FycmF5CQEAAAAVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAAAAAQAAAAKYXNzZXRJZFN0cgkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAANSWR4Q2ZnQXNzZXRJZAQAAAAHYXNzZXRJZAkAAlkAAAABBQAAAAphc3NldElkU3RyBAAAAA1taW5Mb2NrQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAE0lkeENmZ01pbkxvY2tBbW91bnQEAAAAD21pbkxvY2tEdXJhdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABVJZHhDZmdNaW5Mb2NrRHVyYXRpb24EAAAAD21heExvY2tEdXJhdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABVJZHhDZmdNYXhMb2NrRHVyYXRpb24EAAAADG1hdGhDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAASSWR4Q2ZnTWF0aENvbnRyYWN0AwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAADRpbnZhbGlkIHBheW1lbnQgLSBleGFjdCBvbmUgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBAAAAANwbXQJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACXBtdEFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQDCQEAAAACIT0AAAACBQAAAAdhc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAHmludmFsaWQgYXNzZXQgaXMgaW4gcGF5bWVudCAtIAUAAAAKYXNzZXRJZFN0cgIAAAAMIGlzIGV4cGVjdGVkBAAAAA5uZXh0VXNlck51bUtFWQkBAAAADmtleU5leHRVc2VyTnVtAAAAAAQAAAAOdXNlckFkZHJlc3NTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VySXNFeGlzdGluZwkBAAAACWlzRGVmaW5lZAAAAAEJAAQiAAAAAQkBAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAAp1c2VyTnVtU3RyAwUAAAAOdXNlcklzRXhpc3RpbmcJAQAAAAV2YWx1ZQAAAAEJAAQiAAAAAQkBAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEFAAAADnVzZXJBZGRyZXNzU3RyCQABpAAAAAEJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAA5uZXh0VXNlck51bUtFWQQAAAAHdXNlck51bQkBAAAADXBhcnNlSW50VmFsdWUAAAABBQAAAAp1c2VyTnVtU3RyBAAAAAlsb2NrU3RhcnQFAAAABmhlaWdodAQAAAANc3RhcnRCbG9ja0tFWQkBAAAAFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sAAAABBQAAAAp1c2VyTnVtU3RyBAAAAAtkdXJhdGlvbktFWQkBAAAAFGtleUxvY2tQYXJhbUR1cmF0aW9uAAAAAQUAAAAKdXNlck51bVN0cgQAAAANdXNlckFtb3VudEtFWQkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAp1c2VyTnVtU3RyAwkAAGYAAAACBQAAAA1taW5Mb2NrQW1vdW50BQAAAAlwbXRBbW91bnQJAAACAAAAAQkAASwAAAACAgAAACJhbW91bnQgaXMgbGVzcyB0aGVuIG1pbkxvY2tBbW91bnQ9CQABpAAAAAEFAAAADW1pbkxvY2tBbW91bnQDCQAAZgAAAAIFAAAAD21pbkxvY2tEdXJhdGlvbgUAAAAIZHVyYXRpb24JAAACAAAAAQkAASwAAAACAgAAAC1wYXNzZWQgZHVyYXRpb24gaXMgbGVzcyB0aGVuIG1pbkxvY2tEdXJhdGlvbj0JAAGkAAAAAQUAAAAPbWluTG9ja0R1cmF0aW9uAwkAAGYAAAACBQAAAAhkdXJhdGlvbgUAAAAPbWF4TG9ja0R1cmF0aW9uCQAAAgAAAAEJAAEsAAAAAgIAAAAwcGFzc2VkIGR1cmF0aW9uIGlzIGdyZWF0ZXIgdGhlbiBtYXhMb2NrRHVyYXRpb249CQABpAAAAAEFAAAAD21heExvY2tEdXJhdGlvbgMDBQAAAA51c2VySXNFeGlzdGluZwkAAGcAAAACCQAAZAAAAAIJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAA1zdGFydEJsb2NrS0VZCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAALZHVyYXRpb25LRVkFAAAACWxvY2tTdGFydAcJAAACAAAAAQIAAAA2dGhlcmUgaXMgYW4gYWN0aXZlIGxvY2sgLSBjb25zaWRlciB0byB1c2UgaW5jcmVhc2VMb2NrBAAAAAdjb2VmZlg4CQAAawAAAAMFAAAACGR1cmF0aW9uBQAAAAVNVUxUOAUAAAAPbWF4TG9ja0R1cmF0aW9uBAAAAA5nV3hBbW91bnRTdGFydAkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAAB2NvZWZmWDgFAAAABU1VTFQ4BAAAABNnV3hQYXJhbXNSZXN1bHRMaXN0CQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAFWNhbGNHd3hQYXJhbXNSRUFET05MWQkABEwAAAACBQAAAA5nV3hBbW91bnRTdGFydAkABEwAAAACBQAAAAlsb2NrU3RhcnQJAARMAAAAAgUAAAAIZHVyYXRpb24FAAAAA25pbAUAAAADbmlsBAAAAAFrCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAE2dXeFBhcmFtc1Jlc3VsdExpc3QAAAAAAAAAAAAEAAAAAWIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAAAAAAAAAAAAQQAAAAGcGVyaW9kCQABpAAAAAEJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAAAAAAAAAAAAgQAAAASd3hFbWlzc2lvblBlckJsb2NrCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudAAAAAAEAAAADWVtaXNzaW9uU3RhcnQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAVa2V5RW1pc3Npb25TdGFydEJsb2NrAAAAAAQAAAALZW1pc3Npb25FbmQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAATa2V5RW1pc3Npb25FbmRCbG9jawAAAAAEAAAAAWgDCQAAZgAAAAIFAAAABmhlaWdodAUAAAALZW1pc3Npb25FbmQFAAAAC2VtaXNzaW9uRW5kBQAAAAZoZWlnaHQEAAAAAmRoCQABlgAAAAEJAARMAAAAAgkAAGUAAAACBQAAAAFoBQAAAA1lbWlzc2lvblN0YXJ0CQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAQAAAAgdXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWxLRVkJAQAAACBrZXlVc2VyQm9vc3RFbWlzc2lvbkxhc3RJTlRFR1JBTAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAFWJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAGkAAAACCQAAaAAAAAIJAABoAAAAAgUAAAASd3hFbWlzc2lvblBlckJsb2NrBQAAAAJkaAAAAAAAAAAAAgAAAAAAAAAAAwQAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkJAQAAABdrZXlVc2VyTWF4Qm9vc3RJTlRFR1JBTAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQkBAAAAGGtleVRvdGFsTWF4Qm9vc3RJTlRFR1JBTAAAAAAEAAAAD3VzZXJNYXhCb29zdEludAkAAGkAAAACCQAAaAAAAAIFAAAADmdXeEFtb3VudFN0YXJ0BQAAAAhkdXJhdGlvbgAAAAAAAAAAAgQAAAAQdG90YWxNYXhCb29zdEludAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQQAAAARdG90YWxDYWNoZWRHd3hLRVkJAQAAABFrZXlUb3RhbENhY2hlZEd3eAAAAAAEAAAADnRvdGFsQ2FjaGVkR3d4CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEXRvdGFsQ2FjaGVkR3d4S0VZAAAAAAAAAAAABAAAAANhcnIDBQAAAA51c2VySXNFeGlzdGluZwUAAAADbmlsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5uZXh0VXNlck51bUtFWQkAAGQAAAACBQAAAAd1c2VyTnVtAAAAAAAAAAABCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlVc2VyMk51bU1hcHBpbmcAAAABBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAKdXNlck51bVN0cgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5TnVtMlVzZXJNYXBwaW5nAAAAAQUAAAAKdXNlck51bVN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAAA25pbAkABE4AAAACCQAETQAAAAIJAAROAAAAAgkABE4AAAACBQAAAANhcnIJAQAAAA9Mb2NrUGFyYW1zRW50cnkAAAAIBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAKdXNlck51bVN0cgUAAAAJcG10QW1vdW50BQAAAAlsb2NrU3RhcnQFAAAACGR1cmF0aW9uBQAAAAFrBQAAAAFiBQAAAAZwZXJpb2QJAQAAAApTdGF0c0VudHJ5AAAABAUAAAAJcG10QW1vdW50BQAAAAhkdXJhdGlvbgAAAAAAAAAAAQMFAAAADnVzZXJJc0V4aXN0aW5nAAAAAAAAAAAAAAAAAAAAAAABCQEAAAAMSGlzdG9yeUVudHJ5AAAACAIAAAAEbG9jawUAAAAOdXNlckFkZHJlc3NTdHIFAAAACXBtdEFtb3VudAUAAAAJbG9ja1N0YXJ0BQAAAAhkdXJhdGlvbgUAAAABawUAAAABYgUAAAABaQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAgdXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWxLRVkFAAAAFWJvb3N0RW1pc3Npb25JbnRlZ3JhbAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARdG90YWxDYWNoZWRHd3hLRVkJAABkAAAAAgUAAAAOdG90YWxDYWNoZWRHd3gFAAAADmdXeEFtb3VudFN0YXJ0BQAAAANuaWwAAAABaQEAAAAMaW5jcmVhc2VMb2NrAAAAAQAAAA1kZWx0YUR1cmF0aW9uBAAAAAhjZmdBcnJheQkBAAAAFXJlYWRDb25maWdBcnJheU9yRmFpbAAAAAAEAAAACmFzc2V0SWRTdHIJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAADUlkeENmZ0Fzc2V0SWQEAAAAB2Fzc2V0SWQJAAJZAAAAAQUAAAAKYXNzZXRJZFN0cgQAAAAPbWluTG9ja0R1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeENmZ01pbkxvY2tEdXJhdGlvbgQAAAAPbWF4TG9ja0R1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeENmZ01heExvY2tEdXJhdGlvbgQAAAAMbWF0aENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhDZmdNYXRoQ29udHJhY3QEAAAACXBtdEFtb3VudAkBAAAAImV4dHJhY3RPcHRpb25hbFBheW1lbnRBbW91bnRPckZhaWwAAAACBQAAAAFpBQAAAAdhc3NldElkBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAD3VzZXJSZWNvcmRBcnJheQkBAAAAGnJlYWRMb2NrUGFyYW1zUmVjb3JkT3JGYWlsAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAACnVzZXJOdW1TdHIJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAA5JZHhMb2NrVXNlck51bQQAAAAKdXNlckFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAANSWR4TG9ja0Ftb3VudAQAAAAJbG9ja1N0YXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAAxJZHhMb2NrU3RhcnQEAAAADGxvY2tEdXJhdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAPSWR4TG9ja0R1cmF0aW9uBAAAAAdsb2NrRW5kCQAAZAAAAAIFAAAACWxvY2tTdGFydAUAAAAMbG9ja0R1cmF0aW9uBAAAABFyZW1haW5pbmdEdXJhdGlvbgkAAZYAAAABCQAETAAAAAIJAABlAAAAAgUAAAAHbG9ja0VuZAUAAAAGaGVpZ2h0CQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAQAAAANdXNlckFtb3VudE5ldwkAAGQAAAACBQAAAAp1c2VyQW1vdW50BQAAAAlwbXRBbW91bnQEAAAAD2xvY2tEdXJhdGlvbk5ldwkAAGQAAAACBQAAABFyZW1haW5pbmdEdXJhdGlvbgUAAAANZGVsdGFEdXJhdGlvbgMJAABmAAAAAgAAAAAAAAAAAAUAAAANZGVsdGFEdXJhdGlvbgkAAAIAAAABAgAAABpkdXJhdGlvbiBpcyBsZXNzIHRoZW4gemVybwMJAABmAAAAAgUAAAAPbWluTG9ja0R1cmF0aW9uBQAAAA9sb2NrRHVyYXRpb25OZXcJAAACAAAAAQkAASwAAAACAgAAAC1sb2NrRHVyYXRpb25OZXcgaXMgbGVzcyB0aGVuIG1pbkxvY2tEdXJhdGlvbj0JAAGkAAAAAQUAAAAPbWluTG9ja0R1cmF0aW9uAwkAAGYAAAACBQAAAA9sb2NrRHVyYXRpb25OZXcFAAAAD21heExvY2tEdXJhdGlvbgkAAAIAAAABCQABLAAAAAICAAAARGRlbHRhRHVyYXRpb24gKyBleGlzdGVkTG9ja0R1cmF0aW9uIGlzIGdyZWF0ZXIgdGhlbiBtYXhMb2NrRHVyYXRpb249CQABpAAAAAEFAAAAD21heExvY2tEdXJhdGlvbgMDCQAAZwAAAAIFAAAABmhlaWdodAUAAAAHbG9ja0VuZAkAAGYAAAACBQAAAAp1c2VyQW1vdW50AAAAAAAAAAAABwkAAAIAAAABAgAAADl0aGVyZSBpcyBhbiBleHBpcmVkIGxvY2sgLSBuZWVkIHRvIHVubG9jayBiZWZvcmUgbmV3IGxvY2sEAAAAB2NvZWZmWDgJAABrAAAAAwUAAAAPbG9ja0R1cmF0aW9uTmV3BQAAAAVNVUxUOAUAAAAPbWF4TG9ja0R1cmF0aW9uBAAAAA5nV3hBbW91bnRTdGFydAkAAGsAAAADBQAAAA11c2VyQW1vdW50TmV3BQAAAAdjb2VmZlg4BQAAAAVNVUxUOAQAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAABVjYWxjR3d4UGFyYW1zUkVBRE9OTFkJAARMAAAAAgUAAAAOZ1d4QW1vdW50U3RhcnQJAARMAAAAAgUAAAAGaGVpZ2h0CQAETAAAAAIFAAAAD2xvY2tEdXJhdGlvbk5ldwUAAAADbmlsBQAAAANuaWwEAAAAAWsJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAAAAAAAAAAAAAQAAAABYgkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAABBAAAAAZwZXJpb2QJAAGkAAAAAQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAACBAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAQAAAANZW1pc3Npb25TdGFydAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAAAtlbWlzc2lvbkVuZAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABNrZXlFbWlzc2lvbkVuZEJsb2NrAAAAAAQAAAABaAMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAAtlbWlzc2lvbkVuZAUAAAALZW1pc3Npb25FbmQFAAAABmhlaWdodAQAAAACZGgJAAGWAAAAAQkABEwAAAACCQAAZQAAAAIFAAAAAWgFAAAADWVtaXNzaW9uU3RhcnQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBAAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQkBAAAAIGtleVVzZXJCb29zdEVtaXNzaW9uTGFzdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAddXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWwJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQQAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsCQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAABJ3eEVtaXNzaW9uUGVyQmxvY2sFAAAAAmRoAAAAAAAAAAACAAAAAAAAAAADBAAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsCQAAZQAAAAIFAAAAFWJvb3N0RW1pc3Npb25JbnRlZ3JhbAUAAAAddXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWwDCQAAZgAAAAIAAAAAAAAAAAAFAAAAGXVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwJAAACAAAAAQIAAAASd3JvbmcgY2FsY3VsYXRpb25zBAAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQkBAAAAF2tleVVzZXJNYXhCb29zdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAYdG90YWxNYXhCb29zdEludGVncmFsS0VZCQEAAAAYa2V5VG90YWxNYXhCb29zdElOVEVHUkFMAAAAAAQAAAAhdXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsS0VZCQEAAAAha2V5VXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsAAAAAQUAAAAKdXNlck51bVN0cgQAAAAPdXNlck1heEJvb3N0SW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkEAAAAEHRvdGFsTWF4Qm9vc3RJbnQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkEAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQQAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3CQAAZAAAAAIFAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkAAGsAAAADBQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsBQAAAA91c2VyTWF4Qm9vc3RJbnQFAAAAEHRvdGFsTWF4Qm9vc3RJbnQEAAAAEnVzZXJNYXhCb29zdEludE5ldwkAAGkAAAACCQAAaAAAAAIFAAAADmdXeEFtb3VudFN0YXJ0BQAAAA9sb2NrRHVyYXRpb25OZXcAAAAAAAAAAAIEAAAAC2N1cnJVc2VyR3d4CQEAAAAUY2FsY0N1cnJlbnRHd3hBbW91bnQAAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAYcmVtYWluaW5nVXNlck1heEJvb3N0SW50CQAAaQAAAAIJAABoAAAAAgUAAAALY3VyclVzZXJHd3gFAAAAEXJlbWFpbmluZ0R1cmF0aW9uAAAAAAAAAAACBAAAABN1c2VyTWF4Qm9vc3RJbnREaWZmCQAAZQAAAAIFAAAAEnVzZXJNYXhCb29zdEludE5ldwUAAAAYcmVtYWluaW5nVXNlck1heEJvb3N0SW50AwkAAGYAAAACAAAAAAAAAAAABQAAABN1c2VyTWF4Qm9vc3RJbnREaWZmCQAAAgAAAAECAAAAEndyb25nIGNhbGN1bGF0aW9ucwQAAAAHZ3d4RGlmZgkAAGUAAAACBQAAAA5nV3hBbW91bnRTdGFydAUAAAALY3VyclVzZXJHd3gDCQAAZgAAAAIAAAAAAAAAAAAFAAAAB2d3eERpZmYJAAACAAAAAQIAAAAWZ3d4RGlmZiBpcyBsZXNzIHRoZW4gMAQAAAARdG90YWxDYWNoZWRHd3hLRVkJAQAAABFrZXlUb3RhbENhY2hlZEd3eAAAAAAEAAAADnRvdGFsQ2FjaGVkR3d4CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEXRvdGFsQ2FjaGVkR3d4S0VZAAAAAAAAAAAACQAETgAAAAIJAARNAAAAAgkABE4AAAACCQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAACAUAAAAOdXNlckFkZHJlc3NTdHIFAAAACnVzZXJOdW1TdHIFAAAADXVzZXJBbW91bnROZXcFAAAACWxvY2tTdGFydAUAAAAPbG9ja0R1cmF0aW9uTmV3BQAAAAFrBQAAAAFiBQAAAAZwZXJpb2QJAQAAAApTdGF0c0VudHJ5AAAABAUAAAAJcG10QW1vdW50BQAAAA1kZWx0YUR1cmF0aW9uAAAAAAAAAAAAAAAAAAAAAAAACQEAAAAMSGlzdG9yeUVudHJ5AAAACAIAAAAEbG9jawUAAAAOdXNlckFkZHJlc3NTdHIFAAAACXBtdEFtb3VudAUAAAAJbG9ja1N0YXJ0BQAAAA9sb2NrRHVyYXRpb25OZXcFAAAAAWsFAAAAAWIFAAAAAWkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQUAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQUAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABF0b3RhbENhY2hlZEd3eEtFWQkAAGQAAAACBQAAAA50b3RhbENhY2hlZEd3eAUAAAAHZ3d4RGlmZgUAAAADbmlsAAAAAWkBAAAADGNsYWltV3hCb29zdAAAAAIAAAAMbHBBc3NldElkU3RyAAAADnVzZXJBZGRyZXNzU3RyAwkBAAAAAiE9AAAAAgUAAAAPc3Rha2luZ0NvbnRyYWN0CAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAAScGVybWlzc2lvbnMgZGVuaWVkBAAAAA0kdDAyNDI3NDI0Mzc2CQEAAAAUaW50ZXJuYWxDbGFpbVd4Qm9vc3QAAAADBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBwQAAAASdXNlckJvb3N0QXZhaWxhYmxlCAUAAAANJHQwMjQyNzQyNDM3NgAAAAJfMQQAAAAJZGF0YVN0YXRlCAUAAAANJHQwMjQyNzQyNDM3NgAAAAJfMgQAAAAFZGVidWcIBQAAAA0kdDAyNDI3NDI0Mzc2AAAAAl8zCQAFFAAAAAIFAAAACWRhdGFTdGF0ZQkABEwAAAACBQAAABJ1c2VyQm9vc3RBdmFpbGFibGUFAAAAA25pbAAAAAFpAQAAABRjbGFpbVd4Qm9vc3RSRUFET05MWQAAAAIAAAAMbHBBc3NldElkU3RyAAAADnVzZXJBZGRyZXNzU3RyBAAAAA0kdDAyNDUwODI0NjA5CQEAAAAUaW50ZXJuYWxDbGFpbVd4Qm9vc3QAAAADBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBgQAAAASdXNlckJvb3N0QXZhaWxhYmxlCAUAAAANJHQwMjQ1MDgyNDYwOQAAAAJfMQQAAAAJZGF0YVN0YXRlCAUAAAANJHQwMjQ1MDgyNDYwOQAAAAJfMgQAAAAFZGVidWcIBQAAAA0kdDAyNDUwODI0NjA5AAAAAl8zCQAFFAAAAAIFAAAAA25pbAkABEwAAAACBQAAABJ1c2VyQm9vc3RBdmFpbGFibGUJAARMAAAAAgUAAAAFZGVidWcFAAAAA25pbAAAAAFpAQAAAAZ1bmxvY2sAAAABAAAAC3VzZXJBZGRyZXNzBAAAAA91c2VyUmVjb3JkQXJyYXkJAQAAABpyZWFkTG9ja1BhcmFtc1JlY29yZE9yRmFpbAAAAAEFAAAAC3VzZXJBZGRyZXNzBAAAAAp1c2VyTnVtU3RyCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAOSWR4TG9ja1VzZXJOdW0EAAAACnVzZXJBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAADUlkeExvY2tBbW91bnQEAAAACWxvY2tTdGFydAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAMSWR4TG9ja1N0YXJ0BAAAAAxsb2NrRHVyYXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAAD0lkeExvY2tEdXJhdGlvbgQAAAAHbG9ja0VuZAkAAGQAAAACBQAAAAlsb2NrU3RhcnQFAAAADGxvY2tEdXJhdGlvbgQAAAAIY2ZnQXJyYXkJAQAAABVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAAAABAAAAAdhc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAADUlkeENmZ0Fzc2V0SWQDCQAAZwAAAAIFAAAAB2xvY2tFbmQFAAAABmhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAFd2FpdCAJAAGkAAAAAQUAAAAHbG9ja0VuZAIAAAAKIHRvIHVubG9jawMJAABnAAAAAgAAAAAAAAAAAAUAAAAKdXNlckFtb3VudAkAAAIAAAABAgAAABFub3RoaW5nIHRvIHVubG9jawQAAAAGcGVyaW9kAgAAAAEwCQAETQAAAAIJAARNAAAAAgkABE4AAAACCQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAACAUAAAALdXNlckFkZHJlc3MFAAAACnVzZXJOdW1TdHIAAAAAAAAAAAAFAAAACWxvY2tTdGFydAUAAAAMbG9ja0R1cmF0aW9uAAAAAAAAAAAAAAAAAAAAAAAABQAAAAZwZXJpb2QJAQAAAApTdGF0c0VudHJ5AAAABAkBAAAAAS0AAAABBQAAAAp1c2VyQW1vdW50AAAAAAAAAAAAAAAAAAAAAAAAAP//////////CQEAAAAMSGlzdG9yeUVudHJ5AAAACAIAAAAGdW5sb2NrBQAAAAt1c2VyQWRkcmVzcwUAAAAKdXNlckFtb3VudAUAAAAJbG9ja1N0YXJ0BQAAAAxsb2NrRHVyYXRpb24AAAAAAAAAAAAAAAAAAAAAAAAFAAAAAWkJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAp1c2VyQW1vdW50BQAAAAdhc3NldElkAAAAAWkBAAAAE2d3eFVzZXJJbmZvUkVBRE9OTFkAAAABAAAAC3VzZXJBZGRyZXNzBAAAAAlnd3hBbW91bnQJAQAAABRjYWxjQ3VycmVudEd3eEFtb3VudAAAAAEFAAAAC3VzZXJBZGRyZXNzCQAFFAAAAAIFAAAAA25pbAkABEwAAAACBQAAAAlnd3hBbW91bnQFAAAAA25pbAAAAAApwbbx", "chainId": 84, "height": 1816379, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AkxFVWFQrYPSAVPouQo5m9z3aXGP4AatVbMDh4iNxcyo Next: FxrQyy3L4rzK8vcoPdHugmKkwX1Vai1kCbgdjpgacxhN Diff:
OldNewDifferences
329329 let userBoostClaimed = getIntOrZero(this, userBoostClaimedKEY)
330330 let userBoostAvailable = (userBoostAvaliableToClaimTotalNew - userBoostClaimed)
331331 let dataState = [IntegerEntry(userBoostAvalaibleToClaimTotalKEY, userBoostAvaliableToClaimTotalNew), IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral)]
332- let debug = makeString([("userBoostEmissionLastIntegral=" + toString(userBoostEmissionLastIntegral)), ("userBoostEmissionIntegral=" + toString(userBoostEmissionIntegral)), ("userMaxBoostInt=" + toString(userMaxBoostInt)), ("totalMaxBoostInt=" + toString(totalMaxBoostInt)), ("userBoostAvaliableToClaimTotal=" + toString(userBoostAvaliableToClaimTotal)), ("userBoostAvaliableToClaimTotalNew=" + toString(userBoostAvaliableToClaimTotalNew)), ("userBoostClaimed=" + toString(userBoostClaimed)), ("userBoostAvailable=" + toString(userBoostAvailable))], "::")
332+ let debug = makeString([("userBoostEmissionLastIntegral=" + toString(userBoostEmissionLastIntegral)), ("userBoostEmissionIntegral=" + toString(userBoostEmissionIntegral)), ("userMaxBoostInt=" + toString(userMaxBoostInt)), ("totalMaxBoostInt=" + toString(totalMaxBoostInt)), ("userBoostAvaliableToClaimTotal=" + toString(userBoostAvaliableToClaimTotal)), ("userBoostAvaliableToClaimTotalNew=" + toString(userBoostAvaliableToClaimTotalNew)), ("userBoostClaimed=" + toString(userBoostClaimed)), ("userBoostAvailable=" + toString(userBoostAvailable)), ("poolUserBoostEmissionIntegral=" + toString(poolUserBoostEmissionIntegral)), ("userCurrGwx=" + toString(userCurrGwx)), ("totalCachedGwx" + toString(totalCachedGwx))], "::")
333333 $Tuple3(userBoostAvailable, dataState, debug)
334334 }
335335 }
499499 func claimWxBoost (lpAssetIdStr,userAddressStr) = if ((stakingContract != i.caller))
500500 then throw("permissions denied")
501501 else {
502- let $t02409824200 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
503- let userBoostAvailable = $t02409824200._1
504- let dataState = $t02409824200._2
505- let debug = $t02409824200._3
502+ let $t02427424376 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
503+ let userBoostAvailable = $t02427424376._1
504+ let dataState = $t02427424376._2
505+ let debug = $t02427424376._3
506506 $Tuple2(dataState, [userBoostAvailable])
507507 }
508508
510510
511511 @Callable(i)
512512 func claimWxBoostREADONLY (lpAssetIdStr,userAddressStr) = {
513- let $t02433224433 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
514- let userBoostAvailable = $t02433224433._1
515- let dataState = $t02433224433._2
516- let debug = $t02433224433._3
513+ let $t02450824609 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
514+ let userBoostAvailable = $t02450824609._1
515+ let dataState = $t02450824609._2
516+ let debug = $t02450824609._3
517517 $Tuple2(nil, [userBoostAvailable, debug])
518518 }
519519
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let SCALE8 = 8
77
88 let MULT8 = 100000000
99
1010 let POOLWEIGHTMULT = MULT8
1111
1212 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("mandatory this." + key) + " is not defined"))
1313
1414
1515 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
1616
1717
1818 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
1919
2020
2121 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
2222
2323
2424 func asAnyList (val) = match val {
2525 case valAnyLyst: List[Any] =>
2626 valAnyLyst
2727 case _ =>
2828 throw("fail to cast into List[Any]")
2929 }
3030
3131
3232 func asInt (val) = match val {
3333 case valInt: Int =>
3434 valInt
3535 case _ =>
3636 throw("fail to cast into Int")
3737 }
3838
3939
4040 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4141
4242
4343 let IdxFactoryCfgStakingDapp = 1
4444
4545 let IdxFactoryCfgBoostingDapp = 2
4646
4747 let IdxFactoryCfgIdoDapp = 3
4848
4949 let IdxFactoryCfgTeamDapp = 4
5050
5151 let IdxFactoryCfgEmissionDapp = 5
5252
5353 let IdxFactoryCfgRestDapp = 6
5454
5555 let IdxFactoryCfgSlippageDapp = 7
5656
5757 func keyFactoryCfg () = "%s__factoryConfig"
5858
5959
6060 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
6161
6262
6363 func keyFactoryLpList () = "%s__lpTokensList"
6464
6565
6666 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
6767
6868
6969 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
7070
7171
7272 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(this, keyFactoryAddress()))
7373
7474
7575 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
7676
7777
7878 func readFactoryCfgOrFail (factory) = split(getStringOrFail(factory, keyFactoryCfg()), SEP)
7979
8080
8181 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
8282
8383
8484 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
8585
8686
8787 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
8888
8989
9090 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
9191
9292
9393 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
9494
9595
9696 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
9797
9898
9999 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
100100
101101
102102 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
103103
104104
105105 let IdxCfgAssetId = 1
106106
107107 let IdxCfgMinLockAmount = 2
108108
109109 let IdxCfgMinLockDuration = 3
110110
111111 let IdxCfgMaxLockDuration = 4
112112
113113 let IdxCfgMathContract = 5
114114
115115 func keyConfig () = "%s__config"
116116
117117
118118 func readConfigArrayOrFail () = split(getStringOrFail(this, keyConfig()), SEP)
119119
120120
121121 func formatConfigS (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = makeString(["%s%d%d%d", assetId, minLockAmount, minLockDuration, maxLockDuration, mathContract], SEP)
122122
123123
124124 func formatConfig (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = formatConfigS(assetId, toString(minLockAmount), toString(minLockDuration), toString(maxLockDuration), mathContract)
125125
126126
127127 let IdxLockUserNum = 1
128128
129129 let IdxLockAmount = 2
130130
131131 let IdxLockStart = 3
132132
133133 let IdxLockDuration = 4
134134
135135 let IdxLockParamK = 5
136136
137137 let IdxLockParamB = 6
138138
139139 func keyLockParamsRecord (userAddress) = makeString(["%s%s__lock", userAddress], SEP)
140140
141141
142142 func readLockParamsRecordOrFail (userAddress) = split(getStringOrFail(this, keyLockParamsRecord(userAddress)), SEP)
143143
144144
145145 func formatLockParamsRecordS (userNum,amount,start,duration,paramK,paramB,lastUpdTimestamp,gwxAmount) = makeString(["%d%d%d%d%d%d%d%d", userNum, amount, start, duration, paramK, paramB, lastUpdTimestamp, gwxAmount], SEP)
146146
147147
148148 func formatLockParamsRecord (userNum,amount,start,duration,paramK,paramB,gwxAmount) = formatLockParamsRecordS(userNum, toString(amount), toString(start), toString(duration), toString(paramK), toString(paramB), toString(lastBlock.timestamp), toString(gwxAmount))
149149
150150
151151 func keyNextUserNum () = "%s__nextUserNum"
152152
153153
154154 func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
155155
156156
157157 func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
158158
159159
160160 func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
161161
162162
163163 func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
164164
165165
166166 func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
167167
168168
169169 func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
170170
171171
172172 func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
173173
174174
175175 func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
176176
177177
178178 func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
179179
180180
181181 func keyLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
182182
183183
184184 func keyStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
185185
186186
187187 func keyStatsLocksCount () = "%s%s__stats__locksCount"
188188
189189
190190 func keyStatsUsersCount () = "%s%s__stats__activeUsersCount"
191191
192192
193193 func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastInt", userNum], SEP)
194194
195195
196196 func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
197197
198198
199199 func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
200200
201201
202202 func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
203203
204204
205205 func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
206206
207207
208208 func keyTotalCachedGwx () = "%s%s__gwxCached__total"
209209
210210
211211 let factoryContract = readFactoryAddressOrFail()
212212
213213 let factoryCfg = readFactoryCfgOrFail(factoryContract)
214214
215215 let emissionContract = getEmissionAddressOrFail(factoryCfg)
216216
217217 let stakingContract = getStakingAddressOrFail(factoryCfg)
218218
219219 func HistoryEntry (type,user,amount,lockStart,duration,k,b,i) = {
220220 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
221221 let historyDATA = makeString(["%d%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(lockStart), toString(duration), toString(k), toString(b)], SEP)
222222 StringEntry(historyKEY, historyDATA)
223223 }
224224
225225
226226 func StatsEntry (totalLockedInc,durationInc,lockCountInc,usersCountInc) = {
227227 let locksDurationSumInBlocksKEY = keyStatsLocksDurationSumInBlocks()
228228 let locksCountKEY = keyStatsLocksCount()
229229 let usersCountKEY = keyStatsUsersCount()
230230 let totalAmountKEY = keyLockParamTotalAmount()
231231 let locksDurationSumInBlocks = getIntOrZero(this, locksDurationSumInBlocksKEY)
232232 let locksCount = getIntOrZero(this, locksCountKEY)
233233 let usersCount = getIntOrZero(this, usersCountKEY)
234234 let totalAmount = getIntOrZero(this, totalAmountKEY)
235235 [IntegerEntry(locksDurationSumInBlocksKEY, (locksDurationSumInBlocks + durationInc)), IntegerEntry(locksCountKEY, (locksCount + lockCountInc)), IntegerEntry(usersCountKEY, (usersCount + usersCountInc)), IntegerEntry(totalAmountKEY, (totalAmount + totalLockedInc))]
236236 }
237237
238238
239239 func calcGwxAmount (kRaw,bRaw,h) = {
240240 let SCALE = 1000
241241 (((kRaw * h) + bRaw) / SCALE)
242242 }
243243
244244
245245 func LockParamsEntry (userAddress,userNum,amount,start,duration,k,b,period) = {
246246 let userAmountKEY = keyLockParamUserAmount(userNum)
247247 let startBlockKEY = keyLockParamStartBlock(userNum)
248248 let durationKEY = keyLockParamDuration(userNum)
249249 let kKEY = keyLockParamK(userNum)
250250 let bKEY = keyLockParamB(userNum)
251251 let kByPerioKEY = keyLockParamByPeriodK(userNum, period)
252252 let bByPeriodKEY = keyLockParamByPeriodB(userNum, period)
253253 let gwxAmount = calcGwxAmount(k, b, height)
254254 [IntegerEntry(userAmountKEY, amount), IntegerEntry(startBlockKEY, start), IntegerEntry(durationKEY, duration), IntegerEntry(kKEY, k), IntegerEntry(bKEY, b), IntegerEntry(kByPerioKEY, k), IntegerEntry(bByPeriodKEY, b), StringEntry(keyLockParamsRecord(userAddress), formatLockParamsRecord(userNum, amount, start, duration, k, b, gwxAmount))]
255255 }
256256
257257
258258 func extractOptionalPaymentAmountOrFail (i,expectedAssetId) = if ((size(i.payments) > 1))
259259 then throw("only one payment is allowed")
260260 else if ((size(i.payments) == 0))
261261 then 0
262262 else {
263263 let pmt = i.payments[0]
264264 if ((value(pmt.assetId) != expectedAssetId))
265265 then throw("invalid asset id in payment")
266266 else pmt.amount
267267 }
268268
269269
270270 func calcCurrentGwxAmount (userAddress) = {
271271 let EMPTY = "empty"
272272 let user2NumMappingKEY = keyUser2NumMapping(userAddress)
273273 let userNum = valueOrElse(getString(user2NumMappingKEY), EMPTY)
274274 let k = valueOrElse(getInteger(keyLockParamK(userNum)), 0)
275275 let b = valueOrElse(getInteger(keyLockParamB(userNum)), 0)
276276 let gwxAmountCalc = calcGwxAmount(k, b, height)
277277 let gwxAmount = if ((0 > gwxAmountCalc))
278278 then 0
279279 else gwxAmountCalc
280280 gwxAmount
281281 }
282282
283283
284284 func internalClaimWxBoost (lpAssetIdStr,userAddressStr,readOnly) = {
285285 let EMPTY = "EMPTY"
286286 let userRecordOrEmpty = valueOrElse(getString(this, keyLockParamsRecord(userAddressStr)), EMPTY)
287287 if ((userRecordOrEmpty == EMPTY))
288288 then $Tuple3(0, nil, "userRecord::is::empty")
289289 else {
290290 let userRecordArray = split(userRecordOrEmpty, SEP)
291291 let userNumStr = userRecordArray[IdxLockUserNum]
292292 let EMPTYSTR = "empty"
293293 let poolWeight = if ((lpAssetIdStr != EMPTYSTR))
294294 then {
295295 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
296296 getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
297297 }
298298 else if (readOnly)
299299 then 0
300300 else throw(("not readonly mode: unsupported lp asset " + lpAssetIdStr))
301301 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
302302 let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
303303 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
304304 let h = if ((height > emissionEnd))
305305 then emissionEnd
306306 else height
307307 let dh = max([(h - emissionStart), 0])
308308 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
309309 let userBoostEmissionLastIntegral = getIntOrZero(this, userBoostEmissionLastIntegralKEY)
310310 let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
311311 let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
312312 if ((0 > userBoostEmissionIntegral))
313313 then throw("wrong calculations")
314314 else {
315315 let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
316316 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
317317 let userMaxBoostInt = getIntOrZero(this, userMaxBoostIntegralKEY)
318318 let totalMaxBoostInt = getIntOrZero(this, totalMaxBoostIntegralKEY)
319319 let totalCachedGwxKEY = keyTotalCachedGwx()
320320 let totalCachedGwx = valueOrElse(getInteger(this, totalCachedGwxKEY), 0)
321321 let userCurrGwx = calcCurrentGwxAmount(userAddressStr)
322322 let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
323323 let userBoostAvaliableToClaimTotal = getIntOrZero(this, userBoostAvalaibleToClaimTotalKEY)
324324 let poolUserBoostEmissionIntegral = fraction(userBoostEmissionIntegral, poolWeight, POOLWEIGHTMULT)
325325 let userBoostAvaliableToClaimTotalNew = (userBoostAvaliableToClaimTotal + (if ((totalCachedGwx == 0))
326326 then 0
327327 else fraction(poolUserBoostEmissionIntegral, userCurrGwx, totalCachedGwx)))
328328 let userBoostClaimedKEY = keyUserBoostClaimed(userNumStr)
329329 let userBoostClaimed = getIntOrZero(this, userBoostClaimedKEY)
330330 let userBoostAvailable = (userBoostAvaliableToClaimTotalNew - userBoostClaimed)
331331 let dataState = [IntegerEntry(userBoostAvalaibleToClaimTotalKEY, userBoostAvaliableToClaimTotalNew), IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral)]
332- let debug = makeString([("userBoostEmissionLastIntegral=" + toString(userBoostEmissionLastIntegral)), ("userBoostEmissionIntegral=" + toString(userBoostEmissionIntegral)), ("userMaxBoostInt=" + toString(userMaxBoostInt)), ("totalMaxBoostInt=" + toString(totalMaxBoostInt)), ("userBoostAvaliableToClaimTotal=" + toString(userBoostAvaliableToClaimTotal)), ("userBoostAvaliableToClaimTotalNew=" + toString(userBoostAvaliableToClaimTotalNew)), ("userBoostClaimed=" + toString(userBoostClaimed)), ("userBoostAvailable=" + toString(userBoostAvailable))], "::")
332+ let debug = makeString([("userBoostEmissionLastIntegral=" + toString(userBoostEmissionLastIntegral)), ("userBoostEmissionIntegral=" + toString(userBoostEmissionIntegral)), ("userMaxBoostInt=" + toString(userMaxBoostInt)), ("totalMaxBoostInt=" + toString(totalMaxBoostInt)), ("userBoostAvaliableToClaimTotal=" + toString(userBoostAvaliableToClaimTotal)), ("userBoostAvaliableToClaimTotalNew=" + toString(userBoostAvaliableToClaimTotalNew)), ("userBoostClaimed=" + toString(userBoostClaimed)), ("userBoostAvailable=" + toString(userBoostAvailable)), ("poolUserBoostEmissionIntegral=" + toString(poolUserBoostEmissionIntegral)), ("userCurrGwx=" + toString(userCurrGwx)), ("totalCachedGwx" + toString(totalCachedGwx))], "::")
333333 $Tuple3(userBoostAvailable, dataState, debug)
334334 }
335335 }
336336 }
337337
338338
339339 @Callable(i)
340340 func constructor (factoryAddressStr,lockAssetIdStr,minLockAmount,minDuration,maxDuration,mathContract) = if ((this != i.caller))
341341 then throw("not authorized")
342342 else ([IntegerEntry(keyNextUserNum(), 0), StringEntry(keyConfig(), formatConfig(lockAssetIdStr, minLockAmount, minDuration, maxDuration, mathContract)), StringEntry(keyFactoryAddress(), factoryAddressStr)] ++ StatsEntry(0, 0, 0, 0))
343343
344344
345345
346346 @Callable(i)
347347 func lock (duration) = {
348348 let cfgArray = readConfigArrayOrFail()
349349 let assetIdStr = cfgArray[IdxCfgAssetId]
350350 let assetId = fromBase58String(assetIdStr)
351351 let minLockAmount = parseIntValue(cfgArray[IdxCfgMinLockAmount])
352352 let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
353353 let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
354354 let mathContract = addressFromStringValue(cfgArray[IdxCfgMathContract])
355355 if ((size(i.payments) != 1))
356356 then throw("invalid payment - exact one payment must be attached")
357357 else {
358358 let pmt = i.payments[0]
359359 let pmtAmount = pmt.amount
360360 if ((assetId != value(pmt.assetId)))
361361 then throw((("invalid asset is in payment - " + assetIdStr) + " is expected"))
362362 else {
363363 let nextUserNumKEY = keyNextUserNum()
364364 let userAddressStr = toString(i.caller)
365365 let userIsExisting = isDefined(getString(keyUser2NumMapping(userAddressStr)))
366366 let userNumStr = if (userIsExisting)
367367 then value(getString(keyUser2NumMapping(userAddressStr)))
368368 else toString(getIntOrFail(this, nextUserNumKEY))
369369 let userNum = parseIntValue(userNumStr)
370370 let lockStart = height
371371 let startBlockKEY = keyLockParamStartBlock(userNumStr)
372372 let durationKEY = keyLockParamDuration(userNumStr)
373373 let userAmountKEY = keyLockParamUserAmount(userNumStr)
374374 if ((minLockAmount > pmtAmount))
375375 then throw(("amount is less then minLockAmount=" + toString(minLockAmount)))
376376 else if ((minLockDuration > duration))
377377 then throw(("passed duration is less then minLockDuration=" + toString(minLockDuration)))
378378 else if ((duration > maxLockDuration))
379379 then throw(("passed duration is greater then maxLockDuration=" + toString(maxLockDuration)))
380380 else if (if (userIsExisting)
381381 then ((getIntOrFail(this, startBlockKEY) + getIntOrFail(this, durationKEY)) >= lockStart)
382382 else false)
383383 then throw("there is an active lock - consider to use increaseLock")
384384 else {
385385 let coeffX8 = fraction(duration, MULT8, maxLockDuration)
386386 let gWxAmountStart = fraction(pmtAmount, coeffX8, MULT8)
387387 let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, lockStart, duration], nil))
388388 let k = asInt(gWxParamsResultList[0])
389389 let b = asInt(gWxParamsResultList[1])
390390 let period = toString(asInt(gWxParamsResultList[2]))
391391 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
392392 let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
393393 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
394394 let h = if ((height > emissionEnd))
395395 then emissionEnd
396396 else height
397397 let dh = max([(h - emissionStart), 0])
398398 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
399399 let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
400400 let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
401401 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
402402 let userMaxBoostInt = ((gWxAmountStart * duration) / 2)
403403 let totalMaxBoostInt = getIntOrZero(this, totalMaxBoostIntegralKEY)
404404 let totalCachedGwxKEY = keyTotalCachedGwx()
405405 let totalCachedGwx = valueOrElse(getInteger(this, totalCachedGwxKEY), 0)
406406 let arr = if (userIsExisting)
407407 then nil
408408 else [IntegerEntry(nextUserNumKEY, (userNum + 1)), StringEntry(keyUser2NumMapping(userAddressStr), userNumStr), StringEntry(keyNum2UserMapping(userNumStr), userAddressStr)]
409409 ((((arr ++ LockParamsEntry(userAddressStr, userNumStr, pmtAmount, lockStart, duration, k, b, period)) ++ StatsEntry(pmtAmount, duration, 1, if (userIsExisting)
410410 then 0
411411 else 1)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, duration, k, b, i)) ++ [IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(totalCachedGwxKEY, (totalCachedGwx + gWxAmountStart))])
412412 }
413413 }
414414 }
415415 }
416416
417417
418418
419419 @Callable(i)
420420 func increaseLock (deltaDuration) = {
421421 let cfgArray = readConfigArrayOrFail()
422422 let assetIdStr = cfgArray[IdxCfgAssetId]
423423 let assetId = fromBase58String(assetIdStr)
424424 let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
425425 let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
426426 let mathContract = addressFromStringValue(cfgArray[IdxCfgMathContract])
427427 let pmtAmount = extractOptionalPaymentAmountOrFail(i, assetId)
428428 let userAddressStr = toString(i.caller)
429429 let userRecordArray = readLockParamsRecordOrFail(userAddressStr)
430430 let userNumStr = userRecordArray[IdxLockUserNum]
431431 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
432432 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
433433 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
434434 let lockEnd = (lockStart + lockDuration)
435435 let remainingDuration = max([(lockEnd - height), 0])
436436 let userAmountNew = (userAmount + pmtAmount)
437437 let lockDurationNew = (remainingDuration + deltaDuration)
438438 if ((0 > deltaDuration))
439439 then throw("duration is less then zero")
440440 else if ((minLockDuration > lockDurationNew))
441441 then throw(("lockDurationNew is less then minLockDuration=" + toString(minLockDuration)))
442442 else if ((lockDurationNew > maxLockDuration))
443443 then throw(("deltaDuration + existedLockDuration is greater then maxLockDuration=" + toString(maxLockDuration)))
444444 else if (if ((height >= lockEnd))
445445 then (userAmount > 0)
446446 else false)
447447 then throw("there is an expired lock - need to unlock before new lock")
448448 else {
449449 let coeffX8 = fraction(lockDurationNew, MULT8, maxLockDuration)
450450 let gWxAmountStart = fraction(userAmountNew, coeffX8, MULT8)
451451 let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, height, lockDurationNew], nil))
452452 let k = asInt(gWxParamsResultList[0])
453453 let b = asInt(gWxParamsResultList[1])
454454 let period = toString(asInt(gWxParamsResultList[2]))
455455 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
456456 let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
457457 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
458458 let h = if ((height > emissionEnd))
459459 then emissionEnd
460460 else height
461461 let dh = max([(h - emissionStart), 0])
462462 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
463463 let userBoostEmissionLastIntegral = getIntOrZero(this, userBoostEmissionLastIntegralKEY)
464464 let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
465465 let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
466466 if ((0 > userBoostEmissionIntegral))
467467 then throw("wrong calculations")
468468 else {
469469 let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
470470 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
471471 let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
472472 let userMaxBoostInt = getIntOrZero(this, userMaxBoostIntegralKEY)
473473 let totalMaxBoostInt = getIntOrZero(this, totalMaxBoostIntegralKEY)
474474 let userBoostAvaliableToClaimTotal = getIntOrZero(this, userBoostAvalaibleToClaimTotalKEY)
475475 let userBoostAvaliableToClaimTotalNew = (userBoostAvaliableToClaimTotal + fraction(userBoostEmissionIntegral, userMaxBoostInt, totalMaxBoostInt))
476476 let userMaxBoostIntNew = ((gWxAmountStart * lockDurationNew) / 2)
477477 let currUserGwx = calcCurrentGwxAmount(userAddressStr)
478478 let remainingUserMaxBoostInt = ((currUserGwx * remainingDuration) / 2)
479479 let userMaxBoostIntDiff = (userMaxBoostIntNew - remainingUserMaxBoostInt)
480480 if ((0 > userMaxBoostIntDiff))
481481 then throw("wrong calculations")
482482 else {
483483 let gwxDiff = (gWxAmountStart - currUserGwx)
484484 if ((0 > gwxDiff))
485485 then throw("gwxDiff is less then 0")
486486 else {
487487 let totalCachedGwxKEY = keyTotalCachedGwx()
488488 let totalCachedGwx = valueOrElse(getInteger(this, totalCachedGwxKEY), 0)
489489 (((LockParamsEntry(userAddressStr, userNumStr, userAmountNew, lockStart, lockDurationNew, k, b, period) ++ StatsEntry(pmtAmount, deltaDuration, 0, 0)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, lockDurationNew, k, b, i)) ++ [IntegerEntry(userBoostAvalaibleToClaimTotalKEY, userBoostAvaliableToClaimTotalNew), IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(totalCachedGwxKEY, (totalCachedGwx + gwxDiff))])
490490 }
491491 }
492492 }
493493 }
494494 }
495495
496496
497497
498498 @Callable(i)
499499 func claimWxBoost (lpAssetIdStr,userAddressStr) = if ((stakingContract != i.caller))
500500 then throw("permissions denied")
501501 else {
502- let $t02409824200 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
503- let userBoostAvailable = $t02409824200._1
504- let dataState = $t02409824200._2
505- let debug = $t02409824200._3
502+ let $t02427424376 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
503+ let userBoostAvailable = $t02427424376._1
504+ let dataState = $t02427424376._2
505+ let debug = $t02427424376._3
506506 $Tuple2(dataState, [userBoostAvailable])
507507 }
508508
509509
510510
511511 @Callable(i)
512512 func claimWxBoostREADONLY (lpAssetIdStr,userAddressStr) = {
513- let $t02433224433 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
514- let userBoostAvailable = $t02433224433._1
515- let dataState = $t02433224433._2
516- let debug = $t02433224433._3
513+ let $t02450824609 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
514+ let userBoostAvailable = $t02450824609._1
515+ let dataState = $t02450824609._2
516+ let debug = $t02450824609._3
517517 $Tuple2(nil, [userBoostAvailable, debug])
518518 }
519519
520520
521521
522522 @Callable(i)
523523 func unlock (userAddress) = {
524524 let userRecordArray = readLockParamsRecordOrFail(userAddress)
525525 let userNumStr = userRecordArray[IdxLockUserNum]
526526 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
527527 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
528528 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
529529 let lockEnd = (lockStart + lockDuration)
530530 let cfgArray = readConfigArrayOrFail()
531531 let assetId = fromBase58String(cfgArray[IdxCfgAssetId])
532532 if ((lockEnd >= height))
533533 then throw((("wait " + toString(lockEnd)) + " to unlock"))
534534 else if ((0 >= userAmount))
535535 then throw("nothing to unlock")
536536 else {
537537 let period = "0"
538538 (((LockParamsEntry(userAddress, userNumStr, 0, lockStart, lockDuration, 0, 0, period) ++ StatsEntry(-(userAmount), 0, 0, -1)) :+ HistoryEntry("unlock", userAddress, userAmount, lockStart, lockDuration, 0, 0, i)) :+ ScriptTransfer(addressFromStringValue(userAddress), userAmount, assetId))
539539 }
540540 }
541541
542542
543543
544544 @Callable(i)
545545 func gwxUserInfoREADONLY (userAddress) = {
546546 let gwxAmount = calcCurrentGwxAmount(userAddress)
547547 $Tuple2(nil, [gwxAmount])
548548 }
549549
550550

github/deemru/w8io/169f3d6 
97.15 ms