tx · EB5E3XbRok1yGfrr3ZN98HmssW9jTzEgxBNrdPzVPvyQ

3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2:  -0.01500000 Waves

2019.09.29 16:22 [697779] smart account 3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2 > SELF 0.00000000 Waves

{ "type": 13, "id": "EB5E3XbRok1yGfrr3ZN98HmssW9jTzEgxBNrdPzVPvyQ", "fee": 1500000, "feeAssetId": null, "timestamp": 1569763370972, "version": 1, "sender": "3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2", "senderPublicKey": "8y2Uc9uYf5gRD6Dzm1aC73zYe3LZvtVDUVAnAhNdN2mg", "proofs": [ "2Lqcqj7Kiv1nZirByKuLbtHoQZhhU7rEzN6WFQQKDRLPnXuiNv4TrMkNpGoGLQDuYrVGUspcJ6Mt3Kn7NwvnvXYR" ], "script": "base64:AAIDAAAAAAAAAD8IARIDCgEIEgMKAQgSBQoDAQEIEgQKAggBEgQKAggIEgQKAggBEgMKAQgSAwoBCBIECgIICBIDCgEIEgMKAQgAAAAjAAAAAANkYXkAAAAAAAAABaAAAAAABVdBVkVTBQAAAAR1bml0AAAAAAR3QlRDAQAAACBs+mr/xe2qjAt/tSqT0qIML4KC23R6BIxT+/0TH3Og/wAAAAAEd0VVUgEAAAAg7BZhBF97kSFBBjs38+fX1Pjz08YOqoCX85C/0PoVupkAAAAABHdVU0QBAAAAIN0cvQHwz3UFMHgHsqi2OJjRRd1cH7ozWuNAb/pmWXD9AAAAAAlzdGF0ZU9wZW4CAAAABk9wZW5lZAAAAAAOc3RhdGVTdWdnZXN0ZWQCAAAACVN1Z2dlc3RlZAAAAAALc3RhdGVDYW5jZWwCAAAACENhbmNlbGVkAAAAAA9zdGF0ZUluUHJvZ3Jlc3MCAAAACkluUHJvZ3Jlc3MAAAAAEXN0YXRlV2FpdDRDb25maXJtAgAAABNXYWl0Rm9yQ29uZmlybWF0aW9uAAAAAA1zdGF0ZUNvbXBsZXRlAgAAAAlDb21wbGV0ZWQAAAAADHN0YXRlRGlzcHV0ZQIAAAAHRGlzcHV0ZQAAAAAUc3RhdGVEaXNwdXRlUmVzb2x2ZWQCAAAAD0Rpc3B1dGVSZXNvbHZlZAAAAAAGY2xpZW50AgAAAANDTVIAAAAACmZyZWVsYW5jZXICAAAAAkZMAAAAAAthbWJhc3NhZG9yMQEAAAABAAAAAAALYW1iYXNzYWRvcjIBAAAAAQAAAAAAC2FtYmFzc2Fkb3IzAQAAAAEAAAAAAAthbWJhc3NhZG9yNAEAAAABAAAAAAALYW1iYXNzYWRvcjUBAAAAAQABAAAAEEF1Y3Rpb25JZERhdGFLZXkAAAABAAAACWF1Y3Rpb25JZAkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADF9BdWN0aW9uRGF0YQEAAAARQXNzZXROYW1lVG9CYXNlNTgAAAABAAAAEGF1Y3Rpb25Bc3NldE5hbWUDCQAAAAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAABVdBVkVTBQAAAAVXQVZFUwMJAAAAAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAADQlRDBQAAAAR3QlRDAwkAAAAAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAANFVVIFAAAABHdFVVIDCQAAAAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAAA1VTRAUAAAAEd1VTRAkAAAIAAAABAgAAABJJbmNvcnJlY3QgQXNzZXQgSWQBAAAACXRpbWVDaGVjawAAAAMAAAALY3VycmVudFRpbWUAAAAJc3RhcnRUaW1lAAAADmV4cGlyYXRpb25UaW1lCQAAZgAAAAIJAABlAAAAAgUAAAALY3VycmVudFRpbWUFAAAACXN0YXJ0VGltZQUAAAAOZXhwaXJhdGlvblRpbWUBAAAAFmluY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACAAAADHBtdEFzc2V0TmFtZQAAAAxhdWN0aW9uUHJpY2UEAAAAD2tleUZyZWV6ZWRGdW5kcwkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAADHBtdEFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQEAAAAFWN1cnJlbnRGcmVlemVkQmFsYW5jZQQAAAAHJG1hdGNoMAUAAAAPa2V5RnJlZXplZEZ1bmRzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAJAABkAAAAAgUAAAAVY3VycmVudEZyZWV6ZWRCYWxhbmNlBQAAAAxhdWN0aW9uUHJpY2UBAAAAFmRlY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACAAAADHBtdEFzc2V0TmFtZQAAAAxhdWN0aW9uUHJpY2UEAAAAD2tleUZyZWV6ZWRGdW5kcwkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAADHBtdEFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQEAAAAFWN1cnJlbnRGcmVlemVkQmFsYW5jZQQAAAAHJG1hdGNoMAUAAAAPa2V5RnJlZXplZEZ1bmRzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAEAAAAAWEJAABlAAAAAgUAAAAVY3VycmVudEZyZWV6ZWRCYWxhbmNlBQAAAAxhdWN0aW9uUHJpY2UDCQAAZgAAAAIFAAAAAWEAAAAAAAAAAAAFAAAAAWEJAAACAAAAAQIAAAAmRnJlZXplZCBhbW91bnQgY291bGRuJ3QgYmUgbGVzcyB0aGFuIDABAAAAFmZyZWVsYW5jZXJJc1JlZ2lzdGVyZWQAAAABAAAACWNhbGxlclB1YgQAAAAWZnJlZWxhbmNlcklzUmVnaXN0ZXJlZAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWNhbGxlclB1YgIAAAALX0ZyZWVsYW5jZXIEAAAAByRtYXRjaDAFAAAAFmZyZWVsYW5jZXJJc1JlZ2lzdGVyZWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAAJY2FsbGVyUHViCQAAAgAAAAECAAAAI09ubHkgcmVnaXN0ZXJlZCB1c2VycyBjYW4gbWFrZSBiZXRzAQAAABdjcmVhdGVBdWN0aW9uUHJpY2VDaGVjawAAAAEAAAAJcG10QW1vdW50AwkAAGYAAAACBQAAAAlwbXRBbW91bnQAAAAAAAAAAAAFAAAACXBtdEFtb3VudAkAAAIAAAABAgAAABxBbW91bnQgbXVzdCBiZSBoaWdoZXIgdGhlbiAwAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABAAAACWF1Y3Rpb25JZAQAAAAKdmFsdWVTdGF0ZQkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1N0YXRlBAAAAAckbWF0Y2gwBQAAAAp2YWx1ZVN0YXRlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAbQXVjdGlvbiBTdGF0ZSB3YXMgbm90IGZvdW5kAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQAAAAlhdWN0aW9uSWQEAAAAC3ZhbHVlQ2xpZW50CQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAdfQ2xpZW50BAAAAAFhBAAAAAckbWF0Y2gwBQAAAAt2YWx1ZUNsaWVudAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAHEF1Y3Rpb24gQ2xpZW50IHdhcyBub3QgZm91bmQJAAJZAAAAAQUAAAABYQEAAAATZ2V0QXVjdGlvblN0YXJ0VGltZQAAAAEAAAAJYXVjdGlvbklkBAAAABF2YWx1ZUF1Y3Rpb25TdGFydAkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAANX0F1Y3Rpb25TdGFydAQAAAAHJG1hdGNoMAUAAAARdmFsdWVBdWN0aW9uU3RhcnQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACBBdWN0aW9uIFN0YXJ0IHRpbWUgd2FzIG5vdCBmb3VuZAEAAAAWZ2V0QXVjdGlvbkR1cmF0aW9uVGltZQAAAAEAAAAJYXVjdGlvbklkBAAAABR2YWx1ZWF1Y3Rpb25EdXJhdGlvbgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAQX0F1Y3Rpb25EdXJhdGlvbgQAAAAHJG1hdGNoMAUAAAAUdmFsdWVhdWN0aW9uRHVyYXRpb24DCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACNBdWN0aW9uIGR1cmF0aW9uIHRpbWUgd2FzIG5vdCBmb3VuZAEAAAAcZ2V0QXVjdGlvbkpvYlBlcmZvcm1hbmNlVGltZQAAAAEAAAAJYXVjdGlvbklkBAAAABd2YWx1ZUJsb2Nrc0ZvckV4ZWN1dGlvbgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAPX0pvYlBlcmZvcm1hbmNlBAAAAAckbWF0Y2gwBQAAABd2YWx1ZUJsb2Nrc0ZvckV4ZWN1dGlvbgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAKkF1Y3Rpb24gam9iIHBlcmZvcm1hbmNlIHRpbWUgd2FzIG5vdCBmb3VuZAEAAAATZ2V0QXVjdGlvbkFzc2V0TmFtZQAAAAEAAAAJYXVjdGlvbklkBAAAAA52YWx1ZUFzc2V0TmFtZQkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAKX0Fzc2V0TmFtZQQAAAAHJG1hdGNoMAUAAAAOdmFsdWVBc3NldE5hbWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACBBdWN0aW9uIGFzc2V0IG5hbWUgd2FzIG5vdCBmb3VuZAEAAAAPZ2V0QXVjdGlvblByaWNlAAAAAQAAAAlhdWN0aW9uSWQEAAAACnZhbHVlUHJpY2UJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9QcmljZQQAAAAHJG1hdGNoMAUAAAAKdmFsdWVQcmljZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAG0F1Y3Rpb24gcHJpY2Ugd2FzIG5vdCBmb3VuZAEAAAAXZ2V0QXVjdGlvbkZyZWVsYW5jZXJQdWIAAAABAAAACWF1Y3Rpb25JZAQAAAALdmFsdWVDbGllbnQJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAC19GcmVlbGFuY2VyBAAAAAFhBAAAAAckbWF0Y2gwBQAAAAt2YWx1ZUNsaWVudAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAHEF1Y3Rpb24gQ2xpZW50IHdhcyBub3QgZm91bmQJAAJZAAAAAQUAAAABYQAAAAsAAAABaQEAAAAQZnJlZWxhbmNlclNpZ25VcAAAAAEAAAAEaW5mbwQAAAANdXNlclB1YmxpY0tleQkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAEWFscmVhZHlSZWdpc3RlcmVkCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAALX0ZyZWVsYW5jZXIDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAARYWxyZWFkeVJlZ2lzdGVyZWQJAAACAAAAAQIAAAAXVXNlciBhbHJlYWR5IHJlZ2lzdGVyZWQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAALX0ZyZWVsYW5jZXIFAAAABGluZm8FAAAAA25pbAAAAAFpAQAAAAxjbGllbnRTaWduVXAAAAABAAAABGluZm8EAAAADXVzZXJQdWJsaWNLZXkJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAABFhbHJlYWR5UmVnaXN0ZXJlZAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAADXVzZXJQdWJsaWNLZXkCAAAAB19DbGllbnQDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAARYWxyZWFkeVJlZ2lzdGVyZWQJAAACAAAAAQIAAAAXVXNlciBhbHJlYWR5IHJlZ2lzdGVyZWQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAAHX0NsaWVudAUAAAAEaW5mbwUAAAADbmlsAAAAAWkBAAAADWNyZWF0ZUF1Y3Rpb24AAAADAAAAEGpvYkV4ZWN1dGlvbkRheXMAAAATYXVjdGlvbkR1cmF0aW9uRGF5cwAAAAthdWN0aW9uSW5mbwQAAAAJYXVjdGlvbklkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAJcG10QW1vdW50CAUAAAADcG10AAAABmFtb3VudAQAAAAMYXVjdGlvblByaWNlCQEAAAAXY3JlYXRlQXVjdGlvblByaWNlQ2hlY2sAAAABBQAAAAlwbXRBbW91bnQEAAAADGF1Y3Rpb25TdGFydAUAAAAGaGVpZ2h0BAAAABVhdWN0aW9uRHVyYXRpb25CbG9ja3MJAABoAAAAAgUAAAATYXVjdGlvbkR1cmF0aW9uRGF5cwUAAAADZGF5BAAAABJibG9ja3NGb3JFeGVjdXRpb24JAABoAAAAAgUAAAAQam9iRXhlY3V0aW9uRGF5cwUAAAADZGF5BAAAAAxwbXRBc3NldE5hbWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQCAAAABVdBVkVTAwkAAAAAAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAABHdCVEMCAAAAA0JUQwMJAAAAAAAAAggFAAAAA3BtdAAAAAdhc3NldElkBQAAAAR3RVVSAgAAAANFVVIDCQAAAAAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAAEd1VTRAIAAAADVVNECQAAAgAAAAECAAAAFEFzc2V0SWQgaXMgaW5jb3JyZWN0BAAAABFuZXdGcmVlemVkQmFsYW5jZQkBAAAAFmluY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACBQAAAAxwbXRBc3NldE5hbWUFAAAADGF1Y3Rpb25QcmljZQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAJc3RhdGVPcGVuCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0luZm8FAAAAC2F1Y3Rpb25JbmZvCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAHX0NsaWVudAUAAAANYXVjdGlvbkNsaWVudAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADV9BdWN0aW9uU3RhcnQFAAAADGF1Y3Rpb25TdGFydAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAEF9BdWN0aW9uRHVyYXRpb24FAAAAFWF1Y3Rpb25EdXJhdGlvbkJsb2NrcwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAD19Kb2JQZXJmb3JtYW5jZQUAAAASYmxvY2tzRm9yRXhlY3V0aW9uCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAKX0Fzc2V0TmFtZQUAAAAMcG10QXNzZXROYW1lCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1ByaWNlBQAAAAxhdWN0aW9uUHJpY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAMcG10QXNzZXROYW1lAgAAAAhfRnJlZXplZAUAAAARbmV3RnJlZXplZEJhbGFuY2UFAAAAA25pbAAAAAFpAQAAAAdtYWtlQmlkAAAAAgAAAAlhdWN0aW9uSWQAAAAIYmV0UHJpY2UEAAAACWNhbGxlclB1YgkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAB2JldFRpbWUFAAAABmhlaWdodAQAAAAMYXVjdGlvblN0YXRlCQEAAAAPZ2V0QXVjdGlvblN0YXRlAAAAAQUAAAAJYXVjdGlvbklkBAAAAA1hdWN0aW9uQ2xpZW50CQEAAAATZ2V0QXVjdGlvbkNsaWVudFB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblN0YXJ0CQEAAAATZ2V0QXVjdGlvblN0YXJ0VGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAPYXVjdGlvbkR1cmF0aW9uCQEAAAAWZ2V0QXVjdGlvbkR1cmF0aW9uVGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAZYXVjdGlvbkJsb2Nrc0ZvckV4ZWN1dGlvbgkBAAAAHGdldEF1Y3Rpb25Kb2JQZXJmb3JtYW5jZVRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAEGF1Y3Rpb25Bc3NldE5hbWUJAQAAABNnZXRBdWN0aW9uQXNzZXROYW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAAAxhdWN0aW9uUHJpY2UJAQAAAA9nZXRBdWN0aW9uUHJpY2UAAAABBQAAAAlhdWN0aW9uSWQEAAAAEGF1Y3Rpb25Bc3NldElkNTgJAQAAABFBc3NldE5hbWVUb0Jhc2U1OAAAAAEFAAAAEGF1Y3Rpb25Bc3NldE5hbWUEAAAADW5ld0ZyZWVsYW5jZXIJAQAAABZmcmVlbGFuY2VySXNSZWdpc3RlcmVkAAAAAQUAAAAJY2FsbGVyUHViBAAAAA5kQXBwQ29tbWlzc2lvbgkAAGkAAAACCQAAaAAAAAIFAAAADGF1Y3Rpb25QcmljZQAAAAAAAAAAAwAAAAAAAAAAZAQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAMYXVjdGlvblByaWNlBAAAABFhdWN0aW9uVGltZWlzT3ZlcgkBAAAACXRpbWVDaGVjawAAAAMFAAAAB2JldFRpbWUFAAAADGF1Y3Rpb25TdGFydAUAAAAPYXVjdGlvbkR1cmF0aW9uAwUAAAARYXVjdGlvblRpbWVpc092ZXIDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAJc3RhdGVPcGVuCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAALc3RhdGVDYW5jZWwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQFAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQUAAAANYXVjdGlvbkNsaWVudAkAAGUAAAACBQAAAAxhdWN0aW9uUHJpY2UFAAAADmRBcHBDb21taXNzaW9uBQAAABBhdWN0aW9uQXNzZXRJZDU4BQAAAANuaWwDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQEAAAAE2F1Y3Rpb25Mb3dlc3RCaWRkZXIEAAAAEXZhbHVlTG93ZXN0QmlkZGVyCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfTG93ZXN0QmlkZGVyUHViBAAAAAckbWF0Y2gwBQAAABF2YWx1ZUxvd2VzdEJpZGRlcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAI0F1Y3Rpb24gbG93ZXN0IGJpZGRlciB3YXMgbm90IGZvdW5kBAAAAA9uZXdBdWN0aW9uUHJpY2UEAAAAFHZhbHVlTmV3QXVjdGlvblByaWNlCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABV9CaWRfBQAAABNhdWN0aW9uTG93ZXN0QmlkZGVyBAAAAAckbWF0Y2gwBQAAABR2YWx1ZU5ld0F1Y3Rpb25QcmljZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAIEF1Y3Rpb24gbG93ZXN0IGJpZCB3YXMgbm90IGZvdW5kBAAAABBhbW91bnREaWZmZXJlbmNlCQAAZQAAAAIJAABlAAAAAgUAAAAMYXVjdGlvblByaWNlBQAAAA9uZXdBdWN0aW9uUHJpY2UFAAAADmRBcHBDb21taXNzaW9uCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAALX0ZyZWVsYW5jZXIFAAAAE2F1Y3Rpb25Mb3dlc3RCaWRkZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfUHJpY2UFAAAAD25ld0F1Y3Rpb25QcmljZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAADWF1Y3Rpb25DbGllbnQFAAAAEGFtb3VudERpZmZlcmVuY2UFAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkAAAIAAAABAgAAABdJbmNvcnJlY3QgYXVjdGlvbiBzdGF0ZQMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAAlzdGF0ZU9wZW4JAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABV9CaWRfBQAAAA1uZXdGcmVlbGFuY2VyBQAAAAhiZXRQcmljZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfTG93ZXN0QmlkZGVyUHViBQAAAAljYWxsZXJQdWIFAAAAA25pbAMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAA5zdGF0ZVN1Z2dlc3RlZAQAAAAWY3VycmVudExvd2VzdEJpZGRlclB1YgQAAAAMbG93ZXN0QmlkZGVyCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfTG93ZXN0QmlkZGVyUHViBAAAAAckbWF0Y2gwBQAAAAxsb3dlc3RCaWRkZXIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACNBdWN0aW9uIGxvd2VzdCBiaWRkZXIgd2FzIG5vdCBmb3VuZAQAAAASbmV3TG93ZXN0QmlkZGVyUHViBAAAABV2YWx1ZUN1cnJlbnRMb3dlc3RCaWQJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0JpZF8FAAAAFmN1cnJlbnRMb3dlc3RCaWRkZXJQdWIEAAAAEGN1cnJlbnRMb3dlc3RCaWQEAAAAByRtYXRjaDAFAAAAFXZhbHVlQ3VycmVudExvd2VzdEJpZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAIEF1Y3Rpb24gbG93ZXN0IGJpZCB3YXMgbm90IGZvdW5kAwkAAGYAAAACBQAAABBjdXJyZW50TG93ZXN0QmlkBQAAAAhiZXRQcmljZQUAAAANbmV3RnJlZWxhbmNlcgUAAAAWY3VycmVudExvd2VzdEJpZGRlclB1YgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAEF9Mb3dlc3RCaWRkZXJQdWIFAAAAEm5ld0xvd2VzdEJpZGRlclB1YgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0JpZF8FAAAADW5ld0ZyZWVsYW5jZXIFAAAACGJldFByaWNlBQAAAANuaWwJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAHEluY29ycmVjdCBqb2JJZCBzdGF0ZS4gTm93OiAFAAAADGF1Y3Rpb25TdGF0ZQIAAAALLCBtdXN0IGJlOiAFAAAACXN0YXRlT3BlbgIAAAAEIG9yIAUAAAAOc3RhdGVTdWdnZXN0ZWQAAAABaQEAAAAQY2hvb3NlRnJlZWxhbmNlcgAAAAIAAAAJYXVjdGlvbklkAAAADWZyZWVsYW5jZXJQdWIEAAAACWNhbGxlclB1YgkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAB2JldFRpbWUFAAAABmhlaWdodAQAAAAMYXVjdGlvblN0YXRlCQEAAAAPZ2V0QXVjdGlvblN0YXRlAAAAAQUAAAAJYXVjdGlvbklkBAAAAA1hdWN0aW9uQ2xpZW50CQEAAAATZ2V0QXVjdGlvbkNsaWVudFB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblN0YXJ0CQEAAAATZ2V0QXVjdGlvblN0YXJ0VGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAPYXVjdGlvbkR1cmF0aW9uCQEAAAAWZ2V0QXVjdGlvbkR1cmF0aW9uVGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0TmFtZQkBAAAAE2dldEF1Y3Rpb25Bc3NldE5hbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25QcmljZQkBAAAAD2dldEF1Y3Rpb25QcmljZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0SWQ1OAkBAAAAEUFzc2V0TmFtZVRvQmFzZTU4AAAAAQUAAAAQYXVjdGlvbkFzc2V0TmFtZQQAAAATZnJlZWxhbmNlckJpZEFtb3VudAQAAAAQa2V5RnJlZWxhbmNlckJpZAkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0JpZF8FAAAADWZyZWVsYW5jZXJQdWIEAAAAEXZhbHVlRnJlZWxhY2VyQmlkCQAEGgAAAAIFAAAABHRoaXMFAAAAEGtleUZyZWVsYW5jZXJCaWQEAAAAByRtYXRjaDAFAAAAEXZhbHVlRnJlZWxhY2VyQmlkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAeRnJlZWxhbmNlcidzIGJldCB3YXMgbm90IGZvdW5kBAAAAA5kQXBwQ29tbWlzc2lvbgkAAGkAAAACCQAAaAAAAAIFAAAAE2ZyZWVsYW5jZXJCaWRBbW91bnQAAAAAAAAAAAMAAAAAAAAAAGQEAAAAEWF1Y3Rpb25UaW1laXNPdmVyCQEAAAAJdGltZUNoZWNrAAAAAwUAAAAHYmV0VGltZQUAAAAMYXVjdGlvblN0YXJ0BQAAAA9hdWN0aW9uRHVyYXRpb24DCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAANYXVjdGlvbkNsaWVudAMFAAAAEWF1Y3Rpb25UaW1laXNPdmVyAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAMYXVjdGlvblByaWNlCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAALc3RhdGVDYW5jZWwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQFAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQUAAAANYXVjdGlvbkNsaWVudAkAAGUAAAACBQAAAAxhdWN0aW9uUHJpY2UFAAAADmRBcHBDb21taXNzaW9uBQAAABBhdWN0aW9uQXNzZXRJZDU4BQAAAANuaWwDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQEAAAAE2F1Y3Rpb25Mb3dlc3RCaWRkZXIEAAAAEXZhbHVlTG93ZXN0QmlkZGVyCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfTG93ZXN0QmlkZGVyUHViBAAAAAckbWF0Y2gwBQAAABF2YWx1ZUxvd2VzdEJpZGRlcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAI0F1Y3Rpb24gbG93ZXN0IGJpZGRlciB3YXMgbm90IGZvdW5kBAAAAA9uZXdBdWN0aW9uUHJpY2UEAAAAFHZhbHVlTmV3QXVjdGlvblByaWNlCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABV9CaWRfBQAAABNhdWN0aW9uTG93ZXN0QmlkZGVyBAAAAAckbWF0Y2gwBQAAABR2YWx1ZU5ld0F1Y3Rpb25QcmljZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAIEF1Y3Rpb24gbG93ZXN0IGJpZCB3YXMgbm90IGZvdW5kBAAAABBhbW91bnREaWZmZXJlbmNlCQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAAPbmV3QXVjdGlvblByaWNlBAAAABFuZXdGcmVlemVkQmFsYW5jZQkBAAAAFmRlY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lBQAAABBhbW91bnREaWZmZXJlbmNlCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAALX0ZyZWVsYW5jZXIFAAAAE2F1Y3Rpb25Mb3dlc3RCaWRkZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfUHJpY2UFAAAAD25ld0F1Y3Rpb25QcmljZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAAhfRnJlZXplZAUAAAARbmV3RnJlZXplZEJhbGFuY2UFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABBQAAAA1hdWN0aW9uQ2xpZW50BQAAABBhbW91bnREaWZmZXJlbmNlBQAAABBhdWN0aW9uQXNzZXRJZDU4BQAAAANuaWwJAAACAAAAAQIAAAAXSW5jb3JyZWN0IGF1Y3Rpb24gc3RhdGUEAAAAEHNldE5ld0ZyZWVsYW5jZXIEAAAADW5ld0ZyZWVsYW5jZXIJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0JpZF8FAAAADWZyZWVsYW5jZXJQdWIEAAAAByRtYXRjaDAFAAAADW5ld0ZyZWVsYW5jZXIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAANZnJlZWxhbmNlclB1YgkAAAIAAAABAgAAAB5FcnJvcjogSW5jb3JyZWN0IGZyZWVsYW5jZXJQdWIEAAAAD25ld0F1Y3Rpb25QcmljZQQAAAANZnJlZWxhbmNlckJpZAkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAVfQmlkXwUAAAANZnJlZWxhbmNlclB1YgQAAAAHJG1hdGNoMAUAAAANZnJlZWxhbmNlckJpZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAI0F1Y3Rpb24gbG93ZXN0IGJpZGRlciB3YXMgbm90IGZvdW5kBAAAABBhbW91bnREaWZmZXJlbmNlCQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAATZnJlZWxhbmNlckJpZEFtb3VudAQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAQYW1vdW50RGlmZmVyZW5jZQkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAD3N0YXRlSW5Qcm9ncmVzcwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAC19GcmVlbGFuY2VyBQAAABBzZXROZXdGcmVlbGFuY2VyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1ByaWNlBQAAAA9uZXdBdWN0aW9uUHJpY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQFAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQUAAAANYXVjdGlvbkNsaWVudAkAAGUAAAACBQAAABBhbW91bnREaWZmZXJlbmNlBQAAAA5kQXBwQ29tbWlzc2lvbgUAAAAQYXVjdGlvbkFzc2V0SWQ1OAUAAAADbmlsCQAAAgAAAAECAAAALU9ubHkgYXVjdGlvbiBjdXN0b21lciBjYW4gY2hvb3NlIGEgZnJlZWxhbmNlcgAAAAFpAQAAABVpbmNyZWFzZUV4ZWN1dGlvblRpbWUAAAACAAAACWF1Y3Rpb25JZAAAAA1leGVjdXRpb25EYXlzBAAAAAZjYWxsZXIJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQUAAAAJYXVjdGlvbklkBAAAABlhdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uCQEAAAAcZ2V0QXVjdGlvbkpvYlBlcmZvcm1hbmNlVGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAXbmV3QXVjdGlvbkV4ZWN1dGlvblRpbWUEAAAAHG5ld0F1Y3Rpb25CbG9ja3NGb3JFeGVjdXRpb24JAABoAAAAAgUAAAANZXhlY3V0aW9uRGF5cwUAAAADZGF5AwkAAGYAAAACBQAAABxuZXdBdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uBQAAABlhdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uBQAAABxuZXdBdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uCQAAAgAAAAECAAAAOE5ldyBleGVjdXRpb24gdGltZSBtdXN0IG1vcmUgdGhhbiBjdXJyZW50IGV4ZWN1dGlvbiB0aW1lAwkAAAAAAAACBQAAAAZjYWxsZXIFAAAADWF1Y3Rpb25DbGllbnQDAwMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAAlzdGF0ZU9wZW4GCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQGCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAPX0pvYlBlcmZvcm1hbmNlBQAAABduZXdBdWN0aW9uRXhlY3V0aW9uVGltZQUAAAADbmlsCQAAAgAAAAECAAAAD0luY29ycmVjdCBzdGF0ZQkAAAIAAAABAgAAACdPbmx5IENsaWVudCBjYW4gaW5jcmVhc2UgZXhlY3V0aW9uIHRpbWUAAAABaQEAAAANY2FuY2VsQXVjdGlvbgAAAAEAAAAJYXVjdGlvbklkBAAAAAljYWxsZXJQdWIJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQUAAAAJYXVjdGlvbklkBAAAABBhdWN0aW9uQXNzZXROYW1lCQEAAAATZ2V0QXVjdGlvbkFzc2V0TmFtZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblByaWNlCQEAAAAPZ2V0QXVjdGlvblByaWNlAAAAAQUAAAAJYXVjdGlvbklkBAAAABBhdWN0aW9uQXNzZXRJZDU4CQEAAAARQXNzZXROYW1lVG9CYXNlNTgAAAABBQAAABBhdWN0aW9uQXNzZXROYW1lBAAAAA5kQXBwQ29tbWlzc2lvbgkAAGkAAAACCQAAaAAAAAIFAAAADGF1Y3Rpb25QcmljZQAAAAAAAAAAAwAAAAAAAAAAZAQAAAARYW1vdW50V2l0aG91dENvbW0JAABlAAAAAgUAAAAMYXVjdGlvblByaWNlBQAAAA5kQXBwQ29tbWlzc2lvbgQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAMYXVjdGlvblByaWNlBAAAAA5jYWxsZXJJc0NsaWVudAMJAAAAAAAAAgUAAAAJY2FsbGVyUHViBQAAAA1hdWN0aW9uQ2xpZW50BgkAAAIAAAABAgAAAC5BdWN0aW9uIGNhbiBiZSBjYW5jZWxlZCBvbmx5IGJ5IGF1Y3Rpb24gb3duZXIuAwUAAAAOY2FsbGVySXNDbGllbnQDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAJc3RhdGVPcGVuCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAALc3RhdGVDYW5jZWwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQFAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQUAAAANYXVjdGlvbkNsaWVudAUAAAARYW1vdW50V2l0aG91dENvbW0FAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkAAAIAAAABAgAAABhJbmNvcnJlY3QgYXVjdGlvbiBzdGF0ZS4JAAACAAAAAQIAAAAeT25seSBDbGllbnQgY2FuIGNhbmNlbCBhdWN0aW9uAAAAAWkBAAAAC29wZW5EaXNwdXRlAAAAAQAAAAlhdWN0aW9uSWQEAAAABmNhbGxlcgkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAADGF1Y3Rpb25TdGF0ZQkBAAAAD2dldEF1Y3Rpb25TdGF0ZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAANYXVjdGlvbkNsaWVudAkBAAAAE2dldEF1Y3Rpb25DbGllbnRQdWIAAAABBQAAAAlhdWN0aW9uSWQEAAAAEWF1Y3Rpb25GcmVlbGFuY2VyCQEAAAAXZ2V0QXVjdGlvbkZyZWVsYW5jZXJQdWIAAAABBQAAAAlhdWN0aW9uSWQDAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgYJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAA5zdGF0ZVN1Z2dlc3RlZAkAAAIAAAABAgAAACtJbmNvcnJlY3QgYXVjdGlvbiBzdGF0ZSBmb3IgZGlzcHV0ZSBvcGVuaW5nAwMJAAAAAAAAAgUAAAAGY2FsbGVyBQAAAA1hdWN0aW9uQ2xpZW50BgkAAAAAAAACBQAAAAZjYWxsZXIFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1N0YXRlBQAAAAxzdGF0ZURpc3B1dGUJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA1fRGlzcHV0ZVZvdGVzAAAAAAAAAAAABQAAAANuaWwJAAACAAAAAQIAAAAtT25seSBjdXN0b21lciBhbmQgZnJlZWxhbmNlciBjYW4gb3BlbiBkaXNwdXRlAAAAAWkBAAAAC3ZvdGVEaXNwdXRlAAAAAgAAAAlhdWN0aW9uSWQAAAAEdm90ZQQAAAAJY2FsbGVyUHViCQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAMYXVjdGlvblN0YXRlCQEAAAAPZ2V0QXVjdGlvblN0YXRlAAAAAQUAAAAJYXVjdGlvbklkBAAAAA1hdWN0aW9uQ2xpZW50CQEAAAATZ2V0QXVjdGlvbkNsaWVudFB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0TmFtZQkBAAAAE2dldEF1Y3Rpb25Bc3NldE5hbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25QcmljZQkBAAAAD2dldEF1Y3Rpb25QcmljZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAARYXVjdGlvbkZyZWVsYW5jZXIJAQAAABdnZXRBdWN0aW9uRnJlZWxhbmNlclB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAAJY29taXNzaW9uCQAAaQAAAAIJAABoAAAAAgUAAAAMYXVjdGlvblByaWNlAAAAAAAAAAADAAAAAAAAAABkBAAAABBhdWN0aW9uQXNzZXRJZDU4CQEAAAARQXNzZXROYW1lVG9CYXNlNTgAAAABBQAAABBhdWN0aW9uQXNzZXROYW1lBAAAABJjYWxsZXJJc0FtYmFzc2Fkb3IDAwMDAwkAAAAAAAACBQAAAAljYWxsZXJQdWIFAAAAC2FtYmFzc2Fkb3IxBgkAAAAAAAACBQAAAAljYWxsZXJQdWIFAAAAC2FtYmFzc2Fkb3IyBgkAAAAAAAACBQAAAAljYWxsZXJQdWIFAAAAC2FtYmFzc2Fkb3IzBgkAAAAAAAACBQAAAAljYWxsZXJQdWIFAAAAC2FtYmFzc2Fkb3I0BgkAAAAAAAACBQAAAAljYWxsZXJQdWIFAAAAC2FtYmFzc2Fkb3I1CQACWAAAAAEFAAAACWNhbGxlclB1YgkAAAIAAAABAgAAAC1Pbmx5IGRlZmluZWQgYW1iYXNzYWRvcnMgY2FuIHZvdGUgaW4gZGlzcHV0ZXMEAAAAB25ld1ZvdGUDAwkAAAAAAAACBQAAAAR2b3RlBQAAAAZjbGllbnQGCQAAAAAAAAIFAAAABHZvdGUFAAAACmZyZWVsYW5jZXIFAAAABHZvdGUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAcVm90ZSBpcyBpbmNvcnJlY3QuIE11c3QgYmU6IAUAAAAGY2xpZW50AgAAAAQgb3IgBQAAAApmcmVlbGFuY2VyBAAAAAhuZXdWb3RlcgQAAAAIa2V5Vm90ZXIJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADF9EaXB1dGVWb3RlXwUAAAASY2FsbGVySXNBbWJhc3NhZG9yBAAAAAp2YWx1ZVZvdGVyCQAEHQAAAAIFAAAABHRoaXMFAAAACGtleVZvdGVyBAAAAAckbWF0Y2gwBQAAAAp2YWx1ZVZvdGVyAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAJAAACAAAAAQIAAAASVXNlciBhbHJlYWR5IHZvdGVkBQAAABJjYWxsZXJJc0FtYmFzc2Fkb3IEAAAAC3ZvdGVzTnVtYmVyBAAAABB2YWx1ZVZvdGVzTnVtYmVyCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA1fRGlzcHV0ZVZvdGVzBAAAAAckbWF0Y2gwBQAAABB2YWx1ZVZvdGVzTnVtYmVyAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAZVm90ZXNOdW1iZXIgd2FzIG5vdCBmb3VuZAMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAAxzdGF0ZURpc3B1dGUDCQAAAAAAAAIFAAAAC3ZvdGVzTnVtYmVyAAAAAAAAAAAEBAAAAA1kaXNwdXRlV2lubmVyBAAAAA9hbWJhc3NhZG9yMVZvdGUJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfCQACWAAAAAEFAAAAC2FtYmFzc2Fkb3IxBAAAAA9hbWJhc3NhZG9yMlZvdGUJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfCQACWAAAAAEFAAAAC2FtYmFzc2Fkb3IyBAAAAA9hbWJhc3NhZG9yM1ZvdGUJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfCQACWAAAAAEFAAAAC2FtYmFzc2Fkb3IzBAAAAA9hbWJhc3NhZG9yNFZvdGUJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfCQACWAAAAAEFAAAAC2FtYmFzc2Fkb3I0BAAAAA9hbWJhc3NhZG9yNVZvdGUJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfCQACWAAAAAEFAAAAC2FtYmFzc2Fkb3I1BAAAAAJ2MQMJAAAAAAAAAgUAAAAPYW1iYXNzYWRvcjFWb3RlBQAAAAZjbGllbnQAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAnYyAwkAAAAAAAACBQAAAA9hbWJhc3NhZG9yMlZvdGUFAAAABmNsaWVudAAAAAAAAAAAAQAAAAAAAAAAAAQAAAACdjMDCQAAAAAAAAIFAAAAD2FtYmFzc2Fkb3IzVm90ZQUAAAAGY2xpZW50AAAAAAAAAAABAAAAAAAAAAAABAAAAAJ2NAMJAAAAAAAAAgUAAAAPYW1iYXNzYWRvcjRWb3RlBQAAAAZjbGllbnQAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAnY1AwkAAAAAAAACBQAAAA9hbWJhc3NhZG9yNVZvdGUFAAAABmNsaWVudAAAAAAAAAAAAQAAAAAAAAAAAAQAAAALY3VycmVudFZvdGUDCQAAAAAAAAIFAAAAB25ld1ZvdGUFAAAABmNsaWVudAAAAAAAAAAAAQAAAAAAAAAAAAQAAAAOdm90ZXNGb3JDbGllbnQJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgkAAGQAAAACBQAAAAJ2MQUAAAACdjIFAAAAAnYzBQAAAAJ2NAUAAAACdjUFAAAAC2N1cnJlbnRWb3RlAwkAAGYAAAACBQAAAA52b3Rlc0ZvckNsaWVudAAAAAAAAAAAAgUAAAANYXVjdGlvbkNsaWVudAUAAAARYXVjdGlvbkZyZWVsYW5jZXIEAAAAEnBheW1lbnRXaXRob3V0Q29tbQMJAAAAAAAAAgUAAAANZGlzcHV0ZVdpbm5lcgUAAAANYXVjdGlvbkNsaWVudAUAAAAMYXVjdGlvblByaWNlCQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAAJY29taXNzaW9uBAAAABFuZXdGcmVlemVkQmFsYW5jZQkBAAAAFmRlY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lBQAAAAxhdWN0aW9uUHJpY2UJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAANX0Rpc3B1dGVWb3RlcwkAAGQAAAACBQAAAAt2b3Rlc051bWJlcgAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAUc3RhdGVEaXNwdXRlUmVzb2x2ZWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADF9EaXB1dGVWb3RlXwUAAAASY2FsbGVySXNBbWJhc3NhZG9yBQAAAAduZXdWb3RlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAADWRpc3B1dGVXaW5uZXIFAAAAEnBheW1lbnRXaXRob3V0Q29tbQUAAAAQYXVjdGlvbkFzc2V0SWQ1OAUAAAADbmlsCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAANX0Rpc3B1dGVWb3RlcwkAAGQAAAACBQAAAAt2b3Rlc051bWJlcgAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfBQAAABJjYWxsZXJJc0FtYmFzc2Fkb3IFAAAAB25ld1ZvdGUFAAAAA25pbAkAAAIAAAABCQABLAAAAAICAAAAGkluY29ycmVjdCBzdGF0ZS4gTXVzdCBiZTogBQAAAAxzdGF0ZURpc3B1dGUAAAABaQEAAAAMd29ya0hhbmRPdmVyAAAAAQAAAAlhdWN0aW9uSWQEAAAACWNhbGxlclB1YgkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAADGF1Y3Rpb25TdGF0ZQkBAAAAD2dldEF1Y3Rpb25TdGF0ZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblN0YXJ0CQEAAAATZ2V0QXVjdGlvblN0YXJ0VGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAPYXVjdGlvbkR1cmF0aW9uCQEAAAAWZ2V0QXVjdGlvbkR1cmF0aW9uVGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAZYXVjdGlvbkJsb2Nrc0ZvckV4ZWN1dGlvbgkBAAAAHGdldEF1Y3Rpb25Kb2JQZXJmb3JtYW5jZVRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAEWF1Y3Rpb25GcmVlbGFuY2VyCQEAAAAXZ2V0QXVjdGlvbkZyZWVsYW5jZXJQdWIAAAABBQAAAAlhdWN0aW9uSWQEAAAAC2N1cnJlbnRUaW1lBQAAAAZoZWlnaHQEAAAAEmZyZWVsYW5jZXJQdWJDaGVjawMJAAAAAAAAAgUAAAAJY2FsbGVyUHViBQAAABFhdWN0aW9uRnJlZWxhbmNlcgUAAAAJY2FsbGVyUHViCQAAAgAAAAECAAAANE9ubHkgYSBmcmVlbGFuY2VyIGNhbiBpbmRpY2F0ZSB0aGF0IHRoZSB3b3JrIGlzIGRvbmUEAAAACnRpbWVJc092ZXIJAABmAAAAAgkAAGUAAAACBQAAAAtjdXJyZW50VGltZQUAAAAMYXVjdGlvblN0YXJ0BQAAABlhdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAAD3N0YXRlSW5Qcm9ncmVzcwMFAAAACnRpbWVJc092ZXIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAADHN0YXRlRGlzcHV0ZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADV9EaXNwdXRlVm90ZXMCAAAAATAFAAAAA25pbAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAARc3RhdGVXYWl0NENvbmZpcm0FAAAAA25pbAkAAAIAAAABAgAAABpBdWN0aW9uIHN0YXRlIGlzIGluY29ycmVjdAAAAAFpAQAAAAphY2NlcHRXb3JrAAAAAQAAAAlhdWN0aW9uSWQEAAAACWNhbGxlclB1YgkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAADGF1Y3Rpb25TdGF0ZQkBAAAAD2dldEF1Y3Rpb25TdGF0ZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAANYXVjdGlvbkNsaWVudAkBAAAAE2dldEF1Y3Rpb25DbGllbnRQdWIAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25TdGFydAkBAAAAE2dldEF1Y3Rpb25TdGFydFRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAD2F1Y3Rpb25EdXJhdGlvbgkBAAAAFmdldEF1Y3Rpb25EdXJhdGlvblRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAEGF1Y3Rpb25Bc3NldE5hbWUJAQAAABNnZXRBdWN0aW9uQXNzZXROYW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAAAxhdWN0aW9uUHJpY2UJAQAAAA9nZXRBdWN0aW9uUHJpY2UAAAABBQAAAAlhdWN0aW9uSWQEAAAAEWF1Y3Rpb25GcmVlbGFuY2VyCQEAAAAXZ2V0QXVjdGlvbkZyZWVsYW5jZXJQdWIAAAABBQAAAAlhdWN0aW9uSWQEAAAADmRBcHBDb21taXNzaW9uCQAAaQAAAAIJAABoAAAAAgUAAAAMYXVjdGlvblByaWNlAAAAAAAAAAADAAAAAAAAAABkBAAAABFhbW91bnRXaXRob3V0Q29tbQkAAGUAAAACBQAAAAxhdWN0aW9uUHJpY2UFAAAADmRBcHBDb21taXNzaW9uBAAAABBhdWN0aW9uQXNzZXRJZDU4CQEAAAARQXNzZXROYW1lVG9CYXNlNTgAAAABBQAAABBhdWN0aW9uQXNzZXROYW1lBAAAABFuZXdGcmVlemVkQmFsYW5jZQkBAAAAFmRlY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lBQAAAAxhdWN0aW9uUHJpY2UEAAAACW5ld1JhdGluZwQAAAALdmFsdWVSYXRpbmcJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQACWAAAAAEFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyAgAAAAdfUmF0aW5nBAAAAA1jdXJyZW50UmF0aW5nBAAAAAckbWF0Y2gwBQAAAAt2YWx1ZVJhdGluZwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAACQAAZAAAAAIFAAAADWN1cnJlbnRSYXRpbmcAAAAAAAAAAAEDCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAANYXVjdGlvbkNsaWVudAMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAABFzdGF0ZVdhaXQ0Q29uZmlybQkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAADXN0YXRlQ29tcGxldGUJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAAlgAAAABBQAAABFhdWN0aW9uRnJlZWxhbmNlcgIAAAAHX1JhdGluZwUAAAAJbmV3UmF0aW5nCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyBQAAABFhbW91bnRXaXRob3V0Q29tbQUAAAAQYXVjdGlvbkFzc2V0SWQ1OAUAAAADbmlsCQAAAgAAAAEJAAEsAAAAAgIAAAAaSW5jb3JyZWN0IHN0YXRlLiBNdXN0IGJlOiAFAAAAEXN0YXRlV2FpdDRDb25maXJtCQAAAgAAAAECAAAAK09ubHkgYXVjdGlvbiBjdXN0b21lciBjYW4gdXNlIHRoaXMgZnVuY3Rpb24AAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAN0dHgFAAAAByRtYXRjaDAGAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgQAAAADc3R4BQAAAAckbWF0Y2gwBgcHJ5u+KQ==", "chainId": 84, "height": 697779, "spentComplexity": 0 } View: original | compacted Prev: CvwrnBQyiABCgLwSjiYZVqzJyRy4wxXsaFABh8Xj8ox4 Next: 2e9DKsK2rCgq7KyhbBeoM1SoEcKyMyJnYUdRVYYa4JP5 Diff:
OldNewDifferences
4242 let ambassador5 = base58'1'
4343
4444 func AuctionIdDataKey (auctionId) = (auctionId + "_AuctionData")
45-
46-
47-func getDataList (auctionId) = {
48- let getDataString = getString(this, auctionId)
49- let a = match getDataString {
50- case a: String =>
51- a
52- case _ =>
53- throw("AuctionId was not found")
54- }
55- split(a, "_")
56- }
57-
58-
59-func getDisputeDataList (auctionId) = {
60- let keyDisputeData = ((auctionId + "_") + stateDispute)
61- let getDisputeDataString = getString(this, keyDisputeData)
62- let a = match getDisputeDataString {
63- case a: String =>
64- a
65- case _ =>
66- throw("Dispute data was not found")
67- }
68- split(a, "/")
69- }
7045
7146
7247 func AssetNameToBase58 (auctionAssetName) = if ((auctionAssetName == "WAVES"))
12196 }
12297
12398
99+func createAuctionPriceCheck (pmtAmount) = if ((pmtAmount > 0))
100+ then pmtAmount
101+ else throw("Amount must be higher then 0")
102+
103+
104+func getAuctionState (auctionId) = {
105+ let valueState = getString(this, (auctionId + "_State"))
106+ match valueState {
107+ case a: String =>
108+ a
109+ case _ =>
110+ throw("Auction State was not found")
111+ }
112+ }
113+
114+
115+func getAuctionClientPub (auctionId) = {
116+ let valueClient = getString(this, (auctionId + "_Client"))
117+ let a = match valueClient {
118+ case a: String =>
119+ a
120+ case _ =>
121+ throw("Auction Client was not found")
122+ }
123+ fromBase58String(a)
124+ }
125+
126+
127+func getAuctionStartTime (auctionId) = {
128+ let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
129+ match valueAuctionStart {
130+ case a: Int =>
131+ a
132+ case _ =>
133+ throw("Auction Start time was not found")
134+ }
135+ }
136+
137+
138+func getAuctionDurationTime (auctionId) = {
139+ let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
140+ match valueauctionDuration {
141+ case a: Int =>
142+ a
143+ case _ =>
144+ throw("Auction duration time was not found")
145+ }
146+ }
147+
148+
149+func getAuctionJobPerformanceTime (auctionId) = {
150+ let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
151+ match valueBlocksForExecution {
152+ case a: Int =>
153+ a
154+ case _ =>
155+ throw("Auction job performance time was not found")
156+ }
157+ }
158+
159+
160+func getAuctionAssetName (auctionId) = {
161+ let valueAssetName = getString(this, (auctionId + "_AssetName"))
162+ match valueAssetName {
163+ case a: String =>
164+ a
165+ case _ =>
166+ throw("Auction asset name was not found")
167+ }
168+ }
169+
170+
171+func getAuctionPrice (auctionId) = {
172+ let valuePrice = getInteger(this, (auctionId + "_Price"))
173+ match valuePrice {
174+ case a: Int =>
175+ a
176+ case _ =>
177+ throw("Auction price was not found")
178+ }
179+ }
180+
181+
182+func getAuctionFreelancerPub (auctionId) = {
183+ let valueClient = getString(this, (auctionId + "_Freelancer"))
184+ let a = match valueClient {
185+ case a: String =>
186+ a
187+ case _ =>
188+ throw("Auction Client was not found")
189+ }
190+ fromBase58String(a)
191+ }
192+
193+
124194 @Callable(i)
125195 func freelancerSignUp (info) = {
126196 let userPublicKey = toBase58String(i.callerPublicKey)
149219 let auctionClient = toBase58String(i.callerPublicKey)
150220 let pmt = extract(i.payment)
151221 let pmtAmount = pmt.amount
152- let auctionPrice = if ((pmtAmount > 0))
153- then pmtAmount
154- else throw("Amount must be higher then 0")
222+ let auctionPrice = createAuctionPriceCheck(pmtAmount)
155223 let auctionStart = height
156224 let auctionDurationBlocks = (auctionDurationDays * day)
157225 let blocksForExecution = (jobExecutionDays * day)
174242 func makeBid (auctionId,betPrice) = {
175243 let callerPub = toBase58String(i.callerPublicKey)
176244 let betTime = height
177- let auctionState = {
178- let valueState = getString(this, (auctionId + "_State"))
179- match valueState {
180- case a: String =>
181- a
182- case _ =>
183- throw("Auction State was not found")
184- }
185- }
186- let auctionInfo = {
187- let valueAuctionInfo = getString(this, (auctionId + "_Info"))
188- match valueAuctionInfo {
189- case a: String =>
190- a
191- case _ =>
192- throw("Auction info was not found")
193- }
194- }
195- let auctionClient = {
196- let valueClient = getString(this, (auctionId + "_Client"))
197- let a = match valueClient {
198- case a: String =>
199- a
200- case _ =>
201- throw("Auction Client was not found")
202- }
203- fromBase58String(a)
204- }
205- let auctionStart = {
206- let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
207- match valueAuctionStart {
208- case a: Int =>
209- a
210- case _ =>
211- throw("Auction Start time was not found")
212- }
213- }
214- let auctionDuration = {
215- let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
216- match valueauctionDuration {
217- case a: Int =>
218- a
219- case _ =>
220- throw("Auction duration time was not found")
221- }
222- }
223- let auctionBlocksForExecution = {
224- let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
225- match valueBlocksForExecution {
226- case a: Int =>
227- a
228- case _ =>
229- throw("Auction job performance time was not found")
230- }
231- }
232- let auctionAssetName = {
233- let valueAssetName = getString(this, (auctionId + "_AssetName"))
234- match valueAssetName {
235- case a: String =>
236- a
237- case _ =>
238- throw("Auction asset name was not found")
239- }
240- }
241- let auctionPrice = {
242- let valuePrice = getInteger(this, (auctionId + "_Price"))
243- match valuePrice {
244- case a: Int =>
245- a
246- case _ =>
247- throw("Auction price was not found")
248- }
249- }
245+ let auctionState = getAuctionState(auctionId)
246+ let auctionClient = getAuctionClientPub(auctionId)
247+ let auctionStart = getAuctionStartTime(auctionId)
248+ let auctionDuration = getAuctionDurationTime(auctionId)
249+ let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
250+ let auctionAssetName = getAuctionAssetName(auctionId)
251+ let auctionPrice = getAuctionPrice(auctionId)
250252 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
251253 let newFreelancer = freelancerIsRegistered(callerPub)
252254 let dAppCommission = ((auctionPrice * 3) / 100)
280282 }
281283 else throw("Incorrect auction state")
282284 else if ((auctionState == stateOpen))
283- then WriteSet([DataEntry(((auctionId + "_Bid_") + newFreelancer), betPrice), DataEntry((auctionId + "_State"), stateSuggested), DataEntry((auctionId + "_LowestBidderPub"), callerPub), DataEntry((auctionId + callerPub), betPrice)])
285+ then WriteSet([DataEntry(((auctionId + "_Bid_") + newFreelancer), betPrice), DataEntry((auctionId + "_State"), stateSuggested), DataEntry((auctionId + "_LowestBidderPub"), callerPub)])
284286 else if ((auctionState == stateSuggested))
285287 then {
286288 let currentLowestBidderPub = {
315317 func chooseFreelancer (auctionId,freelancerPub) = {
316318 let callerPub = extract(i.callerPublicKey)
317319 let betTime = height
318- let auctionState = {
319- let valueState = getString(this, (auctionId + "_State"))
320- match valueState {
321- case a: String =>
322- a
323- case _ =>
324- throw("Auction State was not found")
325- }
326- }
327- let auctionClient = {
328- let valueClient = getString(this, (auctionId + "_Client"))
329- let a = match valueClient {
330- case a: String =>
331- a
332- case _ =>
333- throw("Auction Client was not found")
334- }
335- fromBase58String(a)
336- }
337- let auctionStart = {
338- let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
339- match valueAuctionStart {
340- case a: Int =>
341- a
342- case _ =>
343- throw("Auction Start time was not found")
344- }
345- }
346- let auctionDuration = {
347- let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
348- match valueauctionDuration {
349- case a: Int =>
350- a
351- case _ =>
352- throw("Auction duration time was not found")
353- }
354- }
355- let auctionAssetName = {
356- let valueAssetName = getString(this, (auctionId + "_AssetName"))
357- match valueAssetName {
358- case a: String =>
359- a
360- case _ =>
361- throw("Auction asset name was not found")
362- }
363- }
364- let auctionPrice = {
365- let valuePrice = getInteger(this, (auctionId + "_Price"))
366- match valuePrice {
367- case a: Int =>
368- a
369- case _ =>
370- throw("Auction price was not found")
371- }
372- }
320+ let auctionState = getAuctionState(auctionId)
321+ let auctionClient = getAuctionClientPub(auctionId)
322+ let auctionStart = getAuctionStartTime(auctionId)
323+ let auctionDuration = getAuctionDurationTime(auctionId)
324+ let auctionAssetName = getAuctionAssetName(auctionId)
325+ let auctionPrice = getAuctionPrice(auctionId)
373326 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
374327 let freelancerBidAmount = {
375328 let keyFreelancerBid = ((auctionId + "_Bid_") + freelancerPub)
381334 throw("Freelancer's bet was not found")
382335 }
383336 }
384- let dAppCommission = ((auctionPrice * 3) / 100)
385- let amountDifference = ((auctionPrice - freelancerBidAmount) - dAppCommission)
337+ let dAppCommission = ((freelancerBidAmount * 3) / 100)
386338 let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
387339 if ((callerPub == auctionClient))
388340 then if (auctionTimeisOver)
389341 then if ((auctionState == stateOpen))
390342 then {
391- let newPrice = (auctionPrice - dAppCommission)
392- let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, newPrice)
393- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), newPrice, auctionAssetId58)]))
343+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
344+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (auctionPrice - dAppCommission), auctionAssetId58)]))
394345 }
395346 else if ((auctionState == stateSuggested))
396347 then {
412363 throw("Auction lowest bid was not found")
413364 }
414365 }
415- WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_Freelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice)])
366+ let amountDifference = (auctionPrice - newAuctionPrice)
367+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
368+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_Freelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
416369 }
417370 else throw("Incorrect auction state")
418371 else {
425378 throw("Error: Incorrect freelancerPub")
426379 }
427380 }
428- let setNewPrice = {
381+ let newAuctionPrice = {
429382 let freelancerBid = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
430383 match freelancerBid {
431384 case a: Int =>
434387 throw("Auction lowest bidder was not found")
435388 }
436389 }
437- let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, setNewPrice)
438- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_Freelancer"), setNewFreelancer), DataEntry((auctionId + "_Price"), setNewPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
390+ let amountDifference = (auctionPrice - freelancerBidAmount)
391+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
392+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_Freelancer"), setNewFreelancer), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (amountDifference - dAppCommission), auctionAssetId58)]))
439393 }
440394 else throw("Only auction customer can choose a freelancer")
441395 }
445399 @Callable(i)
446400 func increaseExecutionTime (auctionId,executionDays) = {
447401 let caller = extract(i.callerPublicKey)
448- let auctionState = {
449- let valueState = getString(this, (auctionId + "_State"))
450- match valueState {
451- case a: String =>
452- a
453- case _ =>
454- throw("Auction State was not found")
455- }
456- }
457- let auctionClient = {
458- let valueClient = getString(this, (auctionId + "_Client"))
459- let a = match valueClient {
460- case a: String =>
461- a
462- case _ =>
463- throw("Auction Client was not found")
464- }
465- fromBase58String(a)
466- }
467- let auctionExecutionTime = {
468- let valueBlocksForExecution = getInteger(this, (auctionId + "JobPerformance"))
469- match valueBlocksForExecution {
470- case a: Int =>
471- a
472- case _ =>
473- throw("Auction job performance time was not found")
474- }
475- }
402+ let auctionState = getAuctionState(auctionId)
403+ let auctionClient = getAuctionClientPub(auctionId)
404+ let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
476405 let newAuctionExecutionTime = {
477406 let newAuctionBlocksForExecution = (executionDays * day)
478- if ((newAuctionBlocksForExecution > auctionExecutionTime))
407+ if ((newAuctionBlocksForExecution > auctionBlocksForExecution))
479408 then newAuctionBlocksForExecution
480409 else throw("New execution time must more than current execution time")
481410 }
495424 @Callable(i)
496425 func cancelAuction (auctionId) = {
497426 let callerPub = extract(i.callerPublicKey)
498- let auctionState = {
499- let valueState = getString(this, (auctionId + "_State"))
500- match valueState {
501- case a: String =>
502- a
503- case _ =>
504- throw("Auction State was not found")
505- }
506- }
507- let auctionClient = {
508- let valueClient = getString(this, (auctionId + "_Client"))
509- let a = match valueClient {
510- case a: String =>
511- a
512- case _ =>
513- throw("Auction Client was not found")
514- }
515- fromBase58String(a)
516- }
427+ let auctionState = getAuctionState(auctionId)
428+ let auctionClient = getAuctionClientPub(auctionId)
429+ let auctionAssetName = getAuctionAssetName(auctionId)
430+ let auctionPrice = getAuctionPrice(auctionId)
431+ let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
432+ let dAppCommission = ((auctionPrice * 3) / 100)
433+ let amountWithoutComm = (auctionPrice - dAppCommission)
434+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
517435 let callerIsClient = if ((callerPub == auctionClient))
518436 then true
519- else throw("Auction can be canceled only by owner.")
437+ else throw("Auction can be canceled only by auction owner.")
520438 if (callerIsClient)
521439 then if ((auctionState == stateOpen))
522- then WriteSet([DataEntry((auctionId + "_State"), stateCancel)])
440+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountWithoutComm, auctionAssetId58)]))
523441 else throw("Incorrect auction state.")
524442 else throw("Only Client can cancel auction")
525443 }
529447 @Callable(i)
530448 func openDispute (auctionId) = {
531449 let caller = extract(i.callerPublicKey)
532- let auctionState = {
533- let valueState = getString(this, (auctionId + "_State"))
534- match valueState {
535- case a: String =>
536- a
537- case _ =>
538- throw("Auction State was not found")
539- }
540- }
541- let auctionClient = {
542- let valueClient = getString(this, (auctionId + "_Client"))
543- let a = match valueClient {
544- case a: String =>
545- a
546- case _ =>
547- throw("Auction Client was not found")
548- }
549- fromBase58String(a)
550- }
551- let auctionFreelancer = {
552- let valueClient = getString(this, (auctionId + "_Freelancer"))
553- let a = match valueClient {
554- case a: String =>
555- a
556- case _ =>
557- throw("Auction Client was not found")
558- }
559- fromBase58String(a)
560- }
450+ let auctionState = getAuctionState(auctionId)
451+ let auctionClient = getAuctionClientPub(auctionId)
452+ let auctionFreelancer = getAuctionFreelancerPub(auctionId)
561453 if (if ((auctionState == stateOpen))
562454 then true
563455 else (auctionState == stateSuggested))
574466 @Callable(i)
575467 func voteDispute (auctionId,vote) = {
576468 let callerPub = extract(i.callerPublicKey)
577- let auctionState = {
578- let valueState = getString(this, (auctionId + "_State"))
579- match valueState {
580- case a: String =>
581- a
582- case _ =>
583- throw("Auction State was not found")
584- }
585- }
586- let auctionClient = {
587- let valueClient = getString(this, (auctionId + "_Client"))
588- let a = match valueClient {
589- case a: String =>
590- a
591- case _ =>
592- throw("Auction Client was not found")
593- }
594- fromBase58String(a)
595- }
596- let auctionAssetName = {
597- let valueAssetName = getString(this, (auctionId + "_AssetName"))
598- match valueAssetName {
599- case a: String =>
600- a
601- case _ =>
602- throw("Auction asset name was not found")
603- }
604- }
605- let auctionPrice = {
606- let valuePrice = getInteger(this, (auctionId + "_Price"))
607- match valuePrice {
608- case a: Int =>
609- a
610- case _ =>
611- throw("Auction price was not found")
612- }
613- }
614- let auctionFreelancer = {
615- let valueClient = getString(this, (auctionId + "_Freelancer"))
616- let a = match valueClient {
617- case a: String =>
618- a
619- case _ =>
620- throw("Auction Client was not found")
621- }
622- fromBase58String(a)
623- }
469+ let auctionState = getAuctionState(auctionId)
470+ let auctionClient = getAuctionClientPub(auctionId)
471+ let auctionAssetName = getAuctionAssetName(auctionId)
472+ let auctionPrice = getAuctionPrice(auctionId)
473+ let auctionFreelancer = getAuctionFreelancerPub(auctionId)
624474 let comission = ((auctionPrice * 3) / 100)
625475 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
626476 let callerIsAmbassador = if (if (if (if (if ((callerPub == ambassador1))
693543 let paymentWithoutComm = if ((disputeWinner == auctionClient))
694544 then auctionPrice
695545 else (auctionPrice - comission)
696- let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, paymentWithoutComm)
546+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
697547 ScriptResult(WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry((auctionId + "_State"), stateDisputeResolved), DataEntry(((auctionId + "_DiputeVote_") + callerIsAmbassador), newVote), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(disputeWinner), paymentWithoutComm, auctionAssetId58)]))
698548 }
699549 else WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry(((auctionId + "_DiputeVote_") + callerIsAmbassador), newVote)])
705555 @Callable(i)
706556 func workHandOver (auctionId) = {
707557 let callerPub = extract(i.callerPublicKey)
708- let auctionState = {
709- let valueState = getString(this, (auctionId + "_State"))
710- match valueState {
711- case a: String =>
712- a
713- case _ =>
714- throw("Auction State was not found")
715- }
716- }
717- let auctionStart = {
718- let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
719- match valueAuctionStart {
720- case a: Int =>
721- a
722- case _ =>
723- throw("Auction Start time was not found")
724- }
725- }
726- let auctionDuration = {
727- let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
728- match valueauctionDuration {
729- case a: Int =>
730- a
731- case _ =>
732- throw("Auction duration time was not found")
733- }
734- }
735- let auctionExecutionTime = {
736- let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
737- match valueBlocksForExecution {
738- case a: Int =>
739- a
740- case _ =>
741- throw("Auction job performance time was not found")
742- }
743- }
744- let auctionFreelancer = {
745- let valueClient = getString(this, (auctionId + "_Freelancer"))
746- let a = match valueClient {
747- case a: String =>
748- a
749- case _ =>
750- throw("Auction Client was not found")
751- }
752- fromBase58String(a)
753- }
558+ let auctionState = getAuctionState(auctionId)
559+ let auctionStart = getAuctionStartTime(auctionId)
560+ let auctionDuration = getAuctionDurationTime(auctionId)
561+ let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
562+ let auctionFreelancer = getAuctionFreelancerPub(auctionId)
754563 let currentTime = height
755564 let freelancerPubCheck = if ((callerPub == auctionFreelancer))
756565 then callerPub
757566 else throw("Only a freelancer can indicate that the work is done")
758- let timeIsOver = ((currentTime - auctionStart) > auctionExecutionTime)
567+ let timeIsOver = ((currentTime - auctionStart) > auctionBlocksForExecution)
759568 if ((auctionState == stateInProgress))
760569 then if (timeIsOver)
761570 then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), "0")])
768577 @Callable(i)
769578 func acceptWork (auctionId) = {
770579 let callerPub = extract(i.callerPublicKey)
771- let auctionState = {
772- let valueState = getString(this, (auctionId + "_State"))
773- match valueState {
774- case a: String =>
775- a
776- case _ =>
777- throw("Auction State was not found")
778- }
779- }
780- let auctionClient = {
781- let valueClient = getString(this, (auctionId + "_Client"))
782- let a = match valueClient {
783- case a: String =>
784- a
785- case _ =>
786- throw("Auction Client was not found")
787- }
788- fromBase58String(a)
789- }
790- let auctionStart = {
791- let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
792- match valueAuctionStart {
793- case a: Int =>
794- a
795- case _ =>
796- throw("Auction Start time was not found")
797- }
798- }
799- let auctionDuration = {
800- let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
801- match valueauctionDuration {
802- case a: Int =>
803- a
804- case _ =>
805- throw("Auction duration time was not found")
806- }
807- }
808- let auctionExecutionTime = {
809- let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
810- match valueBlocksForExecution {
811- case a: Int =>
812- a
813- case _ =>
814- throw("Auction job performance time was not found")
815- }
816- }
817- let auctionAssetName = {
818- let valueAssetName = getString(this, (auctionId + "_AssetName"))
819- match valueAssetName {
820- case a: String =>
821- a
822- case _ =>
823- throw("Auction asset name was not found")
824- }
825- }
826- let auctionPrice = {
827- let valuePrice = getInteger(this, (auctionId + "_Price"))
828- match valuePrice {
829- case a: Int =>
830- a
831- case _ =>
832- throw("Auction price was not found")
833- }
834- }
835- let auctionFreelancer = {
836- let valueClient = getString(this, (auctionId + "_Freelancer"))
837- let a = match valueClient {
838- case a: String =>
839- a
840- case _ =>
841- throw("Auction Client was not found")
842- }
843- fromBase58String(a)
844- }
580+ let auctionState = getAuctionState(auctionId)
581+ let auctionClient = getAuctionClientPub(auctionId)
582+ let auctionStart = getAuctionStartTime(auctionId)
583+ let auctionDuration = getAuctionDurationTime(auctionId)
584+ let auctionAssetName = getAuctionAssetName(auctionId)
585+ let auctionPrice = getAuctionPrice(auctionId)
586+ let auctionFreelancer = getAuctionFreelancerPub(auctionId)
845587 let dAppCommission = ((auctionPrice * 3) / 100)
846588 let amountWithoutComm = (auctionPrice - dAppCommission)
847589 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
590+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
848591 let newRating = {
849592 let valueRating = getInteger(this, (toBase58String(auctionFreelancer) + "_Rating"))
850593 let currentRating = match valueRating {
857600 }
858601 if ((callerPub == auctionClient))
859602 then if ((auctionState == stateWait4Confirm))
860- then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateComplete), DataEntry((toBase58String(auctionFreelancer) + "_Rating"), newRating)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionFreelancer), amountWithoutComm, auctionAssetId58)]))
603+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateComplete), DataEntry((toBase58String(auctionFreelancer) + "_Rating"), newRating), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionFreelancer), amountWithoutComm, auctionAssetId58)]))
861604 else throw(("Incorrect state. Must be: " + stateWait4Confirm))
862605 else throw("Only auction customer can use this function")
863606 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let day = 1440
55
66 let WAVES = unit
77
88 let wBTC = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
99
1010 let wEUR = base58'Gtb1WRznfchDnTh37ezoDTJ4wcoKaRsKqKjJjy7nm2zU'
1111
1212 let wUSD = base58'Ft8X1v1LTa1ABafufpaCWyVj8KkaxUWE6xBhW6sNFJck'
1313
1414 let stateOpen = "Opened"
1515
1616 let stateSuggested = "Suggested"
1717
1818 let stateCancel = "Canceled"
1919
2020 let stateInProgress = "InProgress"
2121
2222 let stateWait4Confirm = "WaitForConfirmation"
2323
2424 let stateComplete = "Completed"
2525
2626 let stateDispute = "Dispute"
2727
2828 let stateDisputeResolved = "DisputeResolved"
2929
3030 let client = "CMR"
3131
3232 let freelancer = "FL"
3333
3434 let ambassador1 = base58'1'
3535
3636 let ambassador2 = base58'1'
3737
3838 let ambassador3 = base58'1'
3939
4040 let ambassador4 = base58'1'
4141
4242 let ambassador5 = base58'1'
4343
4444 func AuctionIdDataKey (auctionId) = (auctionId + "_AuctionData")
45-
46-
47-func getDataList (auctionId) = {
48- let getDataString = getString(this, auctionId)
49- let a = match getDataString {
50- case a: String =>
51- a
52- case _ =>
53- throw("AuctionId was not found")
54- }
55- split(a, "_")
56- }
57-
58-
59-func getDisputeDataList (auctionId) = {
60- let keyDisputeData = ((auctionId + "_") + stateDispute)
61- let getDisputeDataString = getString(this, keyDisputeData)
62- let a = match getDisputeDataString {
63- case a: String =>
64- a
65- case _ =>
66- throw("Dispute data was not found")
67- }
68- split(a, "/")
69- }
7045
7146
7247 func AssetNameToBase58 (auctionAssetName) = if ((auctionAssetName == "WAVES"))
7348 then WAVES
7449 else if ((auctionAssetName == "BTC"))
7550 then wBTC
7651 else if ((auctionAssetName == "EUR"))
7752 then wEUR
7853 else if ((auctionAssetName == "USD"))
7954 then wUSD
8055 else throw("Incorrect Asset Id")
8156
8257
8358 func timeCheck (currentTime,startTime,expirationTime) = ((currentTime - startTime) > expirationTime)
8459
8560
8661 func increaseFreezedBalance (pmtAssetName,auctionPrice) = {
8762 let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
8863 let currentFreezedBalance = match keyFreezedFunds {
8964 case a: Int =>
9065 a
9166 case _ =>
9267 0
9368 }
9469 (currentFreezedBalance + auctionPrice)
9570 }
9671
9772
9873 func decreaseFreezedBalance (pmtAssetName,auctionPrice) = {
9974 let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
10075 let currentFreezedBalance = match keyFreezedFunds {
10176 case a: Int =>
10277 a
10378 case _ =>
10479 0
10580 }
10681 let a = (currentFreezedBalance - auctionPrice)
10782 if ((a > 0))
10883 then a
10984 else throw("Freezed amount couldn't be less than 0")
11085 }
11186
11287
11388 func freelancerIsRegistered (callerPub) = {
11489 let freelancerIsRegistered = getString(this, (callerPub + "_Freelancer"))
11590 match freelancerIsRegistered {
11691 case a: String =>
11792 callerPub
11893 case _ =>
11994 throw("Only registered users can make bets")
12095 }
12196 }
12297
12398
99+func createAuctionPriceCheck (pmtAmount) = if ((pmtAmount > 0))
100+ then pmtAmount
101+ else throw("Amount must be higher then 0")
102+
103+
104+func getAuctionState (auctionId) = {
105+ let valueState = getString(this, (auctionId + "_State"))
106+ match valueState {
107+ case a: String =>
108+ a
109+ case _ =>
110+ throw("Auction State was not found")
111+ }
112+ }
113+
114+
115+func getAuctionClientPub (auctionId) = {
116+ let valueClient = getString(this, (auctionId + "_Client"))
117+ let a = match valueClient {
118+ case a: String =>
119+ a
120+ case _ =>
121+ throw("Auction Client was not found")
122+ }
123+ fromBase58String(a)
124+ }
125+
126+
127+func getAuctionStartTime (auctionId) = {
128+ let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
129+ match valueAuctionStart {
130+ case a: Int =>
131+ a
132+ case _ =>
133+ throw("Auction Start time was not found")
134+ }
135+ }
136+
137+
138+func getAuctionDurationTime (auctionId) = {
139+ let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
140+ match valueauctionDuration {
141+ case a: Int =>
142+ a
143+ case _ =>
144+ throw("Auction duration time was not found")
145+ }
146+ }
147+
148+
149+func getAuctionJobPerformanceTime (auctionId) = {
150+ let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
151+ match valueBlocksForExecution {
152+ case a: Int =>
153+ a
154+ case _ =>
155+ throw("Auction job performance time was not found")
156+ }
157+ }
158+
159+
160+func getAuctionAssetName (auctionId) = {
161+ let valueAssetName = getString(this, (auctionId + "_AssetName"))
162+ match valueAssetName {
163+ case a: String =>
164+ a
165+ case _ =>
166+ throw("Auction asset name was not found")
167+ }
168+ }
169+
170+
171+func getAuctionPrice (auctionId) = {
172+ let valuePrice = getInteger(this, (auctionId + "_Price"))
173+ match valuePrice {
174+ case a: Int =>
175+ a
176+ case _ =>
177+ throw("Auction price was not found")
178+ }
179+ }
180+
181+
182+func getAuctionFreelancerPub (auctionId) = {
183+ let valueClient = getString(this, (auctionId + "_Freelancer"))
184+ let a = match valueClient {
185+ case a: String =>
186+ a
187+ case _ =>
188+ throw("Auction Client was not found")
189+ }
190+ fromBase58String(a)
191+ }
192+
193+
124194 @Callable(i)
125195 func freelancerSignUp (info) = {
126196 let userPublicKey = toBase58String(i.callerPublicKey)
127197 let alreadyRegistered = getString(this, (userPublicKey + "_Freelancer"))
128198 if (isDefined(alreadyRegistered))
129199 then throw("User already registered")
130200 else WriteSet([DataEntry((userPublicKey + "_Freelancer"), info)])
131201 }
132202
133203
134204
135205 @Callable(i)
136206 func clientSignUp (info) = {
137207 let userPublicKey = toBase58String(i.callerPublicKey)
138208 let alreadyRegistered = getString(this, (userPublicKey + "_Client"))
139209 if (isDefined(alreadyRegistered))
140210 then throw("User already registered")
141211 else WriteSet([DataEntry((userPublicKey + "_Client"), info)])
142212 }
143213
144214
145215
146216 @Callable(i)
147217 func createAuction (jobExecutionDays,auctionDurationDays,auctionInfo) = {
148218 let auctionId = toBase58String(i.transactionId)
149219 let auctionClient = toBase58String(i.callerPublicKey)
150220 let pmt = extract(i.payment)
151221 let pmtAmount = pmt.amount
152- let auctionPrice = if ((pmtAmount > 0))
153- then pmtAmount
154- else throw("Amount must be higher then 0")
222+ let auctionPrice = createAuctionPriceCheck(pmtAmount)
155223 let auctionStart = height
156224 let auctionDurationBlocks = (auctionDurationDays * day)
157225 let blocksForExecution = (jobExecutionDays * day)
158226 let pmtAssetName = if (!(isDefined(pmt.assetId)))
159227 then "WAVES"
160228 else if ((pmt.assetId == wBTC))
161229 then "BTC"
162230 else if ((pmt.assetId == wEUR))
163231 then "EUR"
164232 else if ((pmt.assetId == wUSD))
165233 then "USD"
166234 else throw("AssetId is incorrect")
167235 let newFreezedBalance = increaseFreezedBalance(pmtAssetName, auctionPrice)
168236 WriteSet([DataEntry((auctionId + "_State"), stateOpen), DataEntry((auctionId + "_Info"), auctionInfo), DataEntry((auctionId + "_Client"), auctionClient), DataEntry((auctionId + "_AuctionStart"), auctionStart), DataEntry((auctionId + "_AuctionDuration"), auctionDurationBlocks), DataEntry((auctionId + "_JobPerformance"), blocksForExecution), DataEntry((auctionId + "_AssetName"), pmtAssetName), DataEntry((auctionId + "_Price"), auctionPrice), DataEntry((pmtAssetName + "_Freezed"), newFreezedBalance)])
169237 }
170238
171239
172240
173241 @Callable(i)
174242 func makeBid (auctionId,betPrice) = {
175243 let callerPub = toBase58String(i.callerPublicKey)
176244 let betTime = height
177- let auctionState = {
178- let valueState = getString(this, (auctionId + "_State"))
179- match valueState {
180- case a: String =>
181- a
182- case _ =>
183- throw("Auction State was not found")
184- }
185- }
186- let auctionInfo = {
187- let valueAuctionInfo = getString(this, (auctionId + "_Info"))
188- match valueAuctionInfo {
189- case a: String =>
190- a
191- case _ =>
192- throw("Auction info was not found")
193- }
194- }
195- let auctionClient = {
196- let valueClient = getString(this, (auctionId + "_Client"))
197- let a = match valueClient {
198- case a: String =>
199- a
200- case _ =>
201- throw("Auction Client was not found")
202- }
203- fromBase58String(a)
204- }
205- let auctionStart = {
206- let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
207- match valueAuctionStart {
208- case a: Int =>
209- a
210- case _ =>
211- throw("Auction Start time was not found")
212- }
213- }
214- let auctionDuration = {
215- let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
216- match valueauctionDuration {
217- case a: Int =>
218- a
219- case _ =>
220- throw("Auction duration time was not found")
221- }
222- }
223- let auctionBlocksForExecution = {
224- let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
225- match valueBlocksForExecution {
226- case a: Int =>
227- a
228- case _ =>
229- throw("Auction job performance time was not found")
230- }
231- }
232- let auctionAssetName = {
233- let valueAssetName = getString(this, (auctionId + "_AssetName"))
234- match valueAssetName {
235- case a: String =>
236- a
237- case _ =>
238- throw("Auction asset name was not found")
239- }
240- }
241- let auctionPrice = {
242- let valuePrice = getInteger(this, (auctionId + "_Price"))
243- match valuePrice {
244- case a: Int =>
245- a
246- case _ =>
247- throw("Auction price was not found")
248- }
249- }
245+ let auctionState = getAuctionState(auctionId)
246+ let auctionClient = getAuctionClientPub(auctionId)
247+ let auctionStart = getAuctionStartTime(auctionId)
248+ let auctionDuration = getAuctionDurationTime(auctionId)
249+ let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
250+ let auctionAssetName = getAuctionAssetName(auctionId)
251+ let auctionPrice = getAuctionPrice(auctionId)
250252 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
251253 let newFreelancer = freelancerIsRegistered(callerPub)
252254 let dAppCommission = ((auctionPrice * 3) / 100)
253255 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
254256 let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
255257 if (auctionTimeisOver)
256258 then if ((auctionState == stateOpen))
257259 then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (auctionPrice - dAppCommission), auctionAssetId58)]))
258260 else if ((auctionState == stateSuggested))
259261 then {
260262 let auctionLowestBidder = {
261263 let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
262264 match valueLowestBidder {
263265 case a: String =>
264266 a
265267 case _ =>
266268 throw("Auction lowest bidder was not found")
267269 }
268270 }
269271 let newAuctionPrice = {
270272 let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
271273 match valueNewAuctionPrice {
272274 case a: Int =>
273275 a
274276 case _ =>
275277 throw("Auction lowest bid was not found")
276278 }
277279 }
278280 let amountDifference = ((auctionPrice - newAuctionPrice) - dAppCommission)
279281 ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_Freelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
280282 }
281283 else throw("Incorrect auction state")
282284 else if ((auctionState == stateOpen))
283- then WriteSet([DataEntry(((auctionId + "_Bid_") + newFreelancer), betPrice), DataEntry((auctionId + "_State"), stateSuggested), DataEntry((auctionId + "_LowestBidderPub"), callerPub), DataEntry((auctionId + callerPub), betPrice)])
285+ then WriteSet([DataEntry(((auctionId + "_Bid_") + newFreelancer), betPrice), DataEntry((auctionId + "_State"), stateSuggested), DataEntry((auctionId + "_LowestBidderPub"), callerPub)])
284286 else if ((auctionState == stateSuggested))
285287 then {
286288 let currentLowestBidderPub = {
287289 let lowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
288290 match lowestBidder {
289291 case a: String =>
290292 a
291293 case _ =>
292294 throw("Auction lowest bidder was not found")
293295 }
294296 }
295297 let newLowestBidderPub = {
296298 let valueCurrentLowestBid = getInteger(this, ((auctionId + "_Bid_") + currentLowestBidderPub))
297299 let currentLowestBid = match valueCurrentLowestBid {
298300 case a: Int =>
299301 a
300302 case _ =>
301303 throw("Auction lowest bid was not found")
302304 }
303305 if ((currentLowestBid > betPrice))
304306 then newFreelancer
305307 else currentLowestBidderPub
306308 }
307309 WriteSet([DataEntry((auctionId + "_LowestBidderPub"), newLowestBidderPub), DataEntry(((auctionId + "_Bid_") + newFreelancer), betPrice)])
308310 }
309311 else throw(((((("Incorrect jobId state. Now: " + auctionState) + ", must be: ") + stateOpen) + " or ") + stateSuggested))
310312 }
311313
312314
313315
314316 @Callable(i)
315317 func chooseFreelancer (auctionId,freelancerPub) = {
316318 let callerPub = extract(i.callerPublicKey)
317319 let betTime = height
318- let auctionState = {
319- let valueState = getString(this, (auctionId + "_State"))
320- match valueState {
321- case a: String =>
322- a
323- case _ =>
324- throw("Auction State was not found")
325- }
326- }
327- let auctionClient = {
328- let valueClient = getString(this, (auctionId + "_Client"))
329- let a = match valueClient {
330- case a: String =>
331- a
332- case _ =>
333- throw("Auction Client was not found")
334- }
335- fromBase58String(a)
336- }
337- let auctionStart = {
338- let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
339- match valueAuctionStart {
340- case a: Int =>
341- a
342- case _ =>
343- throw("Auction Start time was not found")
344- }
345- }
346- let auctionDuration = {
347- let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
348- match valueauctionDuration {
349- case a: Int =>
350- a
351- case _ =>
352- throw("Auction duration time was not found")
353- }
354- }
355- let auctionAssetName = {
356- let valueAssetName = getString(this, (auctionId + "_AssetName"))
357- match valueAssetName {
358- case a: String =>
359- a
360- case _ =>
361- throw("Auction asset name was not found")
362- }
363- }
364- let auctionPrice = {
365- let valuePrice = getInteger(this, (auctionId + "_Price"))
366- match valuePrice {
367- case a: Int =>
368- a
369- case _ =>
370- throw("Auction price was not found")
371- }
372- }
320+ let auctionState = getAuctionState(auctionId)
321+ let auctionClient = getAuctionClientPub(auctionId)
322+ let auctionStart = getAuctionStartTime(auctionId)
323+ let auctionDuration = getAuctionDurationTime(auctionId)
324+ let auctionAssetName = getAuctionAssetName(auctionId)
325+ let auctionPrice = getAuctionPrice(auctionId)
373326 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
374327 let freelancerBidAmount = {
375328 let keyFreelancerBid = ((auctionId + "_Bid_") + freelancerPub)
376329 let valueFreelacerBid = getInteger(this, keyFreelancerBid)
377330 match valueFreelacerBid {
378331 case a: Int =>
379332 a
380333 case _ =>
381334 throw("Freelancer's bet was not found")
382335 }
383336 }
384- let dAppCommission = ((auctionPrice * 3) / 100)
385- let amountDifference = ((auctionPrice - freelancerBidAmount) - dAppCommission)
337+ let dAppCommission = ((freelancerBidAmount * 3) / 100)
386338 let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
387339 if ((callerPub == auctionClient))
388340 then if (auctionTimeisOver)
389341 then if ((auctionState == stateOpen))
390342 then {
391- let newPrice = (auctionPrice - dAppCommission)
392- let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, newPrice)
393- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), newPrice, auctionAssetId58)]))
343+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
344+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (auctionPrice - dAppCommission), auctionAssetId58)]))
394345 }
395346 else if ((auctionState == stateSuggested))
396347 then {
397348 let auctionLowestBidder = {
398349 let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
399350 match valueLowestBidder {
400351 case a: String =>
401352 a
402353 case _ =>
403354 throw("Auction lowest bidder was not found")
404355 }
405356 }
406357 let newAuctionPrice = {
407358 let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
408359 match valueNewAuctionPrice {
409360 case a: Int =>
410361 a
411362 case _ =>
412363 throw("Auction lowest bid was not found")
413364 }
414365 }
415- WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_Freelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice)])
366+ let amountDifference = (auctionPrice - newAuctionPrice)
367+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
368+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_Freelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
416369 }
417370 else throw("Incorrect auction state")
418371 else {
419372 let setNewFreelancer = {
420373 let newFreelancer = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
421374 match newFreelancer {
422375 case a: Int =>
423376 freelancerPub
424377 case _ =>
425378 throw("Error: Incorrect freelancerPub")
426379 }
427380 }
428- let setNewPrice = {
381+ let newAuctionPrice = {
429382 let freelancerBid = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
430383 match freelancerBid {
431384 case a: Int =>
432385 a
433386 case _ =>
434387 throw("Auction lowest bidder was not found")
435388 }
436389 }
437- let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, setNewPrice)
438- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_Freelancer"), setNewFreelancer), DataEntry((auctionId + "_Price"), setNewPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
390+ let amountDifference = (auctionPrice - freelancerBidAmount)
391+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
392+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_Freelancer"), setNewFreelancer), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (amountDifference - dAppCommission), auctionAssetId58)]))
439393 }
440394 else throw("Only auction customer can choose a freelancer")
441395 }
442396
443397
444398
445399 @Callable(i)
446400 func increaseExecutionTime (auctionId,executionDays) = {
447401 let caller = extract(i.callerPublicKey)
448- let auctionState = {
449- let valueState = getString(this, (auctionId + "_State"))
450- match valueState {
451- case a: String =>
452- a
453- case _ =>
454- throw("Auction State was not found")
455- }
456- }
457- let auctionClient = {
458- let valueClient = getString(this, (auctionId + "_Client"))
459- let a = match valueClient {
460- case a: String =>
461- a
462- case _ =>
463- throw("Auction Client was not found")
464- }
465- fromBase58String(a)
466- }
467- let auctionExecutionTime = {
468- let valueBlocksForExecution = getInteger(this, (auctionId + "JobPerformance"))
469- match valueBlocksForExecution {
470- case a: Int =>
471- a
472- case _ =>
473- throw("Auction job performance time was not found")
474- }
475- }
402+ let auctionState = getAuctionState(auctionId)
403+ let auctionClient = getAuctionClientPub(auctionId)
404+ let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
476405 let newAuctionExecutionTime = {
477406 let newAuctionBlocksForExecution = (executionDays * day)
478- if ((newAuctionBlocksForExecution > auctionExecutionTime))
407+ if ((newAuctionBlocksForExecution > auctionBlocksForExecution))
479408 then newAuctionBlocksForExecution
480409 else throw("New execution time must more than current execution time")
481410 }
482411 if ((caller == auctionClient))
483412 then if (if (if ((auctionState == stateOpen))
484413 then true
485414 else (auctionState == stateSuggested))
486415 then true
487416 else (auctionState == stateInProgress))
488417 then WriteSet([DataEntry((auctionId + "_JobPerformance"), newAuctionExecutionTime)])
489418 else throw("Incorrect state")
490419 else throw("Only Client can increase execution time")
491420 }
492421
493422
494423
495424 @Callable(i)
496425 func cancelAuction (auctionId) = {
497426 let callerPub = extract(i.callerPublicKey)
498- let auctionState = {
499- let valueState = getString(this, (auctionId + "_State"))
500- match valueState {
501- case a: String =>
502- a
503- case _ =>
504- throw("Auction State was not found")
505- }
506- }
507- let auctionClient = {
508- let valueClient = getString(this, (auctionId + "_Client"))
509- let a = match valueClient {
510- case a: String =>
511- a
512- case _ =>
513- throw("Auction Client was not found")
514- }
515- fromBase58String(a)
516- }
427+ let auctionState = getAuctionState(auctionId)
428+ let auctionClient = getAuctionClientPub(auctionId)
429+ let auctionAssetName = getAuctionAssetName(auctionId)
430+ let auctionPrice = getAuctionPrice(auctionId)
431+ let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
432+ let dAppCommission = ((auctionPrice * 3) / 100)
433+ let amountWithoutComm = (auctionPrice - dAppCommission)
434+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
517435 let callerIsClient = if ((callerPub == auctionClient))
518436 then true
519- else throw("Auction can be canceled only by owner.")
437+ else throw("Auction can be canceled only by auction owner.")
520438 if (callerIsClient)
521439 then if ((auctionState == stateOpen))
522- then WriteSet([DataEntry((auctionId + "_State"), stateCancel)])
440+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountWithoutComm, auctionAssetId58)]))
523441 else throw("Incorrect auction state.")
524442 else throw("Only Client can cancel auction")
525443 }
526444
527445
528446
529447 @Callable(i)
530448 func openDispute (auctionId) = {
531449 let caller = extract(i.callerPublicKey)
532- let auctionState = {
533- let valueState = getString(this, (auctionId + "_State"))
534- match valueState {
535- case a: String =>
536- a
537- case _ =>
538- throw("Auction State was not found")
539- }
540- }
541- let auctionClient = {
542- let valueClient = getString(this, (auctionId + "_Client"))
543- let a = match valueClient {
544- case a: String =>
545- a
546- case _ =>
547- throw("Auction Client was not found")
548- }
549- fromBase58String(a)
550- }
551- let auctionFreelancer = {
552- let valueClient = getString(this, (auctionId + "_Freelancer"))
553- let a = match valueClient {
554- case a: String =>
555- a
556- case _ =>
557- throw("Auction Client was not found")
558- }
559- fromBase58String(a)
560- }
450+ let auctionState = getAuctionState(auctionId)
451+ let auctionClient = getAuctionClientPub(auctionId)
452+ let auctionFreelancer = getAuctionFreelancerPub(auctionId)
561453 if (if ((auctionState == stateOpen))
562454 then true
563455 else (auctionState == stateSuggested))
564456 then throw("Incorrect auction state for dispute opening")
565457 else if (if ((caller == auctionClient))
566458 then true
567459 else (caller == auctionFreelancer))
568460 then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), 0)])
569461 else throw("Only customer and freelancer can open dispute")
570462 }
571463
572464
573465
574466 @Callable(i)
575467 func voteDispute (auctionId,vote) = {
576468 let callerPub = extract(i.callerPublicKey)
577- let auctionState = {
578- let valueState = getString(this, (auctionId + "_State"))
579- match valueState {
580- case a: String =>
581- a
582- case _ =>
583- throw("Auction State was not found")
584- }
585- }
586- let auctionClient = {
587- let valueClient = getString(this, (auctionId + "_Client"))
588- let a = match valueClient {
589- case a: String =>
590- a
591- case _ =>
592- throw("Auction Client was not found")
593- }
594- fromBase58String(a)
595- }
596- let auctionAssetName = {
597- let valueAssetName = getString(this, (auctionId + "_AssetName"))
598- match valueAssetName {
599- case a: String =>
600- a
601- case _ =>
602- throw("Auction asset name was not found")
603- }
604- }
605- let auctionPrice = {
606- let valuePrice = getInteger(this, (auctionId + "_Price"))
607- match valuePrice {
608- case a: Int =>
609- a
610- case _ =>
611- throw("Auction price was not found")
612- }
613- }
614- let auctionFreelancer = {
615- let valueClient = getString(this, (auctionId + "_Freelancer"))
616- let a = match valueClient {
617- case a: String =>
618- a
619- case _ =>
620- throw("Auction Client was not found")
621- }
622- fromBase58String(a)
623- }
469+ let auctionState = getAuctionState(auctionId)
470+ let auctionClient = getAuctionClientPub(auctionId)
471+ let auctionAssetName = getAuctionAssetName(auctionId)
472+ let auctionPrice = getAuctionPrice(auctionId)
473+ let auctionFreelancer = getAuctionFreelancerPub(auctionId)
624474 let comission = ((auctionPrice * 3) / 100)
625475 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
626476 let callerIsAmbassador = if (if (if (if (if ((callerPub == ambassador1))
627477 then true
628478 else (callerPub == ambassador2))
629479 then true
630480 else (callerPub == ambassador3))
631481 then true
632482 else (callerPub == ambassador4))
633483 then true
634484 else (callerPub == ambassador5))
635485 then toBase58String(callerPub)
636486 else throw("Only defined ambassadors can vote in disputes")
637487 let newVote = if (if ((vote == client))
638488 then true
639489 else (vote == freelancer))
640490 then vote
641491 else throw(((("Vote is incorrect. Must be: " + client) + " or ") + freelancer))
642492 let newVoter = {
643493 let keyVoter = ((auctionId + "_DiputeVote_") + callerIsAmbassador)
644494 let valueVoter = getString(this, keyVoter)
645495 match valueVoter {
646496 case a: String =>
647497 throw("User already voted")
648498 case _ =>
649499 callerIsAmbassador
650500 }
651501 }
652502 let votesNumber = {
653503 let valueVotesNumber = getInteger(this, (auctionId + "_DisputeVotes"))
654504 match valueVotesNumber {
655505 case a: Int =>
656506 a
657507 case _ =>
658508 throw("VotesNumber was not found")
659509 }
660510 }
661511 if ((auctionState == stateDispute))
662512 then if ((votesNumber == 4))
663513 then {
664514 let disputeWinner = {
665515 let ambassador1Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador1)))
666516 let ambassador2Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador2)))
667517 let ambassador3Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador3)))
668518 let ambassador4Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador4)))
669519 let ambassador5Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador5)))
670520 let v1 = if ((ambassador1Vote == client))
671521 then 1
672522 else 0
673523 let v2 = if ((ambassador2Vote == client))
674524 then 1
675525 else 0
676526 let v3 = if ((ambassador3Vote == client))
677527 then 1
678528 else 0
679529 let v4 = if ((ambassador4Vote == client))
680530 then 1
681531 else 0
682532 let v5 = if ((ambassador5Vote == client))
683533 then 1
684534 else 0
685535 let currentVote = if ((newVote == client))
686536 then 1
687537 else 0
688538 let votesForClient = (((((v1 + v2) + v3) + v4) + v5) + currentVote)
689539 if ((votesForClient > 2))
690540 then auctionClient
691541 else auctionFreelancer
692542 }
693543 let paymentWithoutComm = if ((disputeWinner == auctionClient))
694544 then auctionPrice
695545 else (auctionPrice - comission)
696- let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, paymentWithoutComm)
546+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
697547 ScriptResult(WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry((auctionId + "_State"), stateDisputeResolved), DataEntry(((auctionId + "_DiputeVote_") + callerIsAmbassador), newVote), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(disputeWinner), paymentWithoutComm, auctionAssetId58)]))
698548 }
699549 else WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry(((auctionId + "_DiputeVote_") + callerIsAmbassador), newVote)])
700550 else throw(("Incorrect state. Must be: " + stateDispute))
701551 }
702552
703553
704554
705555 @Callable(i)
706556 func workHandOver (auctionId) = {
707557 let callerPub = extract(i.callerPublicKey)
708- let auctionState = {
709- let valueState = getString(this, (auctionId + "_State"))
710- match valueState {
711- case a: String =>
712- a
713- case _ =>
714- throw("Auction State was not found")
715- }
716- }
717- let auctionStart = {
718- let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
719- match valueAuctionStart {
720- case a: Int =>
721- a
722- case _ =>
723- throw("Auction Start time was not found")
724- }
725- }
726- let auctionDuration = {
727- let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
728- match valueauctionDuration {
729- case a: Int =>
730- a
731- case _ =>
732- throw("Auction duration time was not found")
733- }
734- }
735- let auctionExecutionTime = {
736- let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
737- match valueBlocksForExecution {
738- case a: Int =>
739- a
740- case _ =>
741- throw("Auction job performance time was not found")
742- }
743- }
744- let auctionFreelancer = {
745- let valueClient = getString(this, (auctionId + "_Freelancer"))
746- let a = match valueClient {
747- case a: String =>
748- a
749- case _ =>
750- throw("Auction Client was not found")
751- }
752- fromBase58String(a)
753- }
558+ let auctionState = getAuctionState(auctionId)
559+ let auctionStart = getAuctionStartTime(auctionId)
560+ let auctionDuration = getAuctionDurationTime(auctionId)
561+ let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
562+ let auctionFreelancer = getAuctionFreelancerPub(auctionId)
754563 let currentTime = height
755564 let freelancerPubCheck = if ((callerPub == auctionFreelancer))
756565 then callerPub
757566 else throw("Only a freelancer can indicate that the work is done")
758- let timeIsOver = ((currentTime - auctionStart) > auctionExecutionTime)
567+ let timeIsOver = ((currentTime - auctionStart) > auctionBlocksForExecution)
759568 if ((auctionState == stateInProgress))
760569 then if (timeIsOver)
761570 then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), "0")])
762571 else WriteSet([DataEntry((auctionId + "_State"), stateWait4Confirm)])
763572 else throw("Auction state is incorrect")
764573 }
765574
766575
767576
768577 @Callable(i)
769578 func acceptWork (auctionId) = {
770579 let callerPub = extract(i.callerPublicKey)
771- let auctionState = {
772- let valueState = getString(this, (auctionId + "_State"))
773- match valueState {
774- case a: String =>
775- a
776- case _ =>
777- throw("Auction State was not found")
778- }
779- }
780- let auctionClient = {
781- let valueClient = getString(this, (auctionId + "_Client"))
782- let a = match valueClient {
783- case a: String =>
784- a
785- case _ =>
786- throw("Auction Client was not found")
787- }
788- fromBase58String(a)
789- }
790- let auctionStart = {
791- let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
792- match valueAuctionStart {
793- case a: Int =>
794- a
795- case _ =>
796- throw("Auction Start time was not found")
797- }
798- }
799- let auctionDuration = {
800- let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
801- match valueauctionDuration {
802- case a: Int =>
803- a
804- case _ =>
805- throw("Auction duration time was not found")
806- }
807- }
808- let auctionExecutionTime = {
809- let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
810- match valueBlocksForExecution {
811- case a: Int =>
812- a
813- case _ =>
814- throw("Auction job performance time was not found")
815- }
816- }
817- let auctionAssetName = {
818- let valueAssetName = getString(this, (auctionId + "_AssetName"))
819- match valueAssetName {
820- case a: String =>
821- a
822- case _ =>
823- throw("Auction asset name was not found")
824- }
825- }
826- let auctionPrice = {
827- let valuePrice = getInteger(this, (auctionId + "_Price"))
828- match valuePrice {
829- case a: Int =>
830- a
831- case _ =>
832- throw("Auction price was not found")
833- }
834- }
835- let auctionFreelancer = {
836- let valueClient = getString(this, (auctionId + "_Freelancer"))
837- let a = match valueClient {
838- case a: String =>
839- a
840- case _ =>
841- throw("Auction Client was not found")
842- }
843- fromBase58String(a)
844- }
580+ let auctionState = getAuctionState(auctionId)
581+ let auctionClient = getAuctionClientPub(auctionId)
582+ let auctionStart = getAuctionStartTime(auctionId)
583+ let auctionDuration = getAuctionDurationTime(auctionId)
584+ let auctionAssetName = getAuctionAssetName(auctionId)
585+ let auctionPrice = getAuctionPrice(auctionId)
586+ let auctionFreelancer = getAuctionFreelancerPub(auctionId)
845587 let dAppCommission = ((auctionPrice * 3) / 100)
846588 let amountWithoutComm = (auctionPrice - dAppCommission)
847589 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
590+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
848591 let newRating = {
849592 let valueRating = getInteger(this, (toBase58String(auctionFreelancer) + "_Rating"))
850593 let currentRating = match valueRating {
851594 case a: Int =>
852595 a
853596 case _ =>
854597 0
855598 }
856599 (currentRating + 1)
857600 }
858601 if ((callerPub == auctionClient))
859602 then if ((auctionState == stateWait4Confirm))
860- then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateComplete), DataEntry((toBase58String(auctionFreelancer) + "_Rating"), newRating)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionFreelancer), amountWithoutComm, auctionAssetId58)]))
603+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateComplete), DataEntry((toBase58String(auctionFreelancer) + "_Rating"), newRating), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionFreelancer), amountWithoutComm, auctionAssetId58)]))
861604 else throw(("Incorrect state. Must be: " + stateWait4Confirm))
862605 else throw("Only auction customer can use this function")
863606 }
864607
865608
866609 @Verifier(tx)
867610 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
868611 then match tx {
869612 case ttx: TransferTransaction =>
870613 true
871614 case stx: SetScriptTransaction =>
872615 true
873616 case _ =>
874617 false
875618 }
876619 else false
877620

github/deemru/w8io/169f3d6 
93.51 ms