tx · Bfj4CGcSBE6igtCWTR6bWoFAzFFfUhGeYxT3zqhdtWz2

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.10.11 06:31 [2793426] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "Bfj4CGcSBE6igtCWTR6bWoFAzFFfUhGeYxT3zqhdtWz2", "fee": 2600000, "feeAssetId": null, "timestamp": 1696995071924, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "3NesUcRzxD48J2Fuk8Nod7Lb6mj5PNWexSgVP1UnnmMvHVFWctYkqSxhE2epupy2rvnh9LnFvCF4DhB1VNVXkuiN" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFsAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9wdXp6bGVfYXJ0X3Bvb2wAEXVzZHRQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRFRfUFAADmFydEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEQ19QUAAPZWFzdEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X0VBU1QAEXB1enpsZUFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIaY29uZl9hY2NlcHRlZF9hc3NldF9FVEhfUFAAEHdhdmVzQXNzZXRJZF9zdHICBVdBVkVTAA11c2R0UFBBc3NldElkCQDZBAEFEXVzZHRQUEFzc2V0SWRfc3RyAAphcnRBc3NldElkCQDZBAEFDmFydEFzc2V0SWRfc3RyAA11c2RjUFBBc3NldElkCQDZBAEFEXVzZGNQUEFzc2V0SWRfc3RyAAtlYXN0QXNzZXRJZAkA2QQBBQ9lYXN0QXNzZXRJZF9zdHIADXB1enpsZUFzc2V0SWQJANkEAQURcHV6emxlQXNzZXRJZF9zdHIADGV0aFBQQXNzZXRJZAkA2QQBBRBldGhQUEFzc2V0SWRfc3RyAAx3YXZlc0Fzc2V0SWQBAAATYWxsX2FjY2VwdGVkX2Fzc2V0cwkAzAgCBRF1c2R0UFBBc3NldElkX3N0cgkAzAgCBQ5hcnRBc3NldElkX3N0cgkAzAgCBRF1c2RjUFBBc3NldElkX3N0cgkAzAgCBQ9lYXN0QXNzZXRJZF9zdHIJAMwIAgURcHV6emxlQXNzZXRJZF9zdHIJAMwIAgUQd2F2ZXNBc3NldElkX3N0cgkAzAgCBRBldGhQUEFzc2V0SWRfc3RyBQNuaWwABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAOY29tbWlzc2lvbl9mZWUACAAOZGVmYXVsdExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECFGNvbmZfZGVmYXVsdF9saWNlbmNlABJkZWZhdWx0SGFzaExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECGWNvbmZfZGVmYXVsdF9saWNlbmNlX2hhc2gAC2RhcHBSdW5uaW5nCQELdmFsdWVPckVsc2UCCQCbCAIFCHVzZXJEYXBwAhRjb25mX2RhcHBfaXNfcnVubmluZwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwAhRjb25mX21haW50ZW5hbmNlX21zZwIAAA11c2VyU3VzcGVuZGVkAglTVVNQRU5ERUQAC3VzZXJSZW1vdmVkAgdSRU1PVkVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQAC3VzZXJBbGxvd2VkAgdBTExPV0VEABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQACG1pbnRfZmVlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgIJbWludF9mZWVfCQDYBAEFCmFydEFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBC3ZhbGlkYXRlQ0lEAQNjaWQDCQEIY29udGFpbnMCBQNjaWQCAS8DAwkAZgIATAkAsQIBBQNjaWQJAAACCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAAA7BwkAZgIAEAkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAEHBwEMdmFsaWRhdGVIYXNoAQRoYXNoCQAAAgkAsQIBBQRoYXNoAEABDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEHa2V5RGF0ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGF0ZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5hbWUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25hbWVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlEZXNjAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kZXNjXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RGlzcGxheUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZGlzcGxheV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlFeHBvcnRIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9leHBvcnRfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDGtleUV4cG9ydENpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBCmtleU1heE1pbnQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X3NpZ25pZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleUlzc3VlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfaXNzdWVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5T25TYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyAQ5rZXlMaWNlbmNlSGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhFhcnRfbGljZW5jZV9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5TGljZW5jZUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUYWdzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90YWdzXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VHlwZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdHlwZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5vdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlDcmF3bGVyAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9jcmF3bGVyX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDGtleVJveWFsdGllcwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5RW5kU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfZW5kc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBEmtleUFzc2V0SWRBY2NlcHRlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleUZsYWcCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBcnRpc3RBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgINYXJ0aXN0X2FnZW50XwUKYXJ0aXN0QWRkcgEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBGmtleVByaW1hcnlTaGFyZVB1YmxpY0FnZW50AQphcnRpc3RBZGRyCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBA0kdDAxMDE1NjEwMTkyCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwMTU2MTAxOTICXzEEBmFtb3VudAgFDSR0MDEwMTU2MTAxOTICXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQphcnRBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBA0kdDAxMDc3OTEwODE1CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwNzc5MTA4MTUCXzEEBmFtb3VudAgFDSR0MDEwNzc5MTA4MTUCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAQVwcmljZQMJAGcCAAAFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgFpBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQLaXNTcG9uc29yZWQDCQECIT0CBQZwdWJLZXkCAAkBC3ZhbHVlT3JFbHNlAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkCCV9mcmVlX3R4cwAAAAAEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQtpc1Nwb25zb3JlZAAABwkApQgBCQCnCAEJANkEAQUGcHViS2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEE2dldF9zcG9uc29yZWRfd2F2ZXMDAwkBAiE9AgUGcHViS2V5AgAJAGYCBQtpc1Nwb25zb3JlZAAABwkA/AcEBQ13aGl0ZWxpc3REYXBwAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUGcHViS2V5BQNuaWwFA25pbAUEdW5pdAMJAAACBRNnZXRfc3BvbnNvcmVkX3dhdmVzBRNnZXRfc3BvbnNvcmVkX3dhdmVzCQCWCgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUGY2FsbGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFC2lzU3BvbnNvcmVkAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEHYnV5TWludAYBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5BA0kdDAxMzQyMDEzNTA5CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDEzNDIwMTM1MDkCXzEEBmNhbGxlcggFDSR0MDEzNDIwMTM1MDkCXzIEBGRhdGUIBQ0kdDAxMzQyMDEzNTA5Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDEzNDIwMTM1MDkCXzQEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHAwMFBWlzQmlkCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyBQhtaW50X2ZlZQkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFCmFydEFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTUwODYxNTI3OAMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNTA4NjE1Mjc4Al8xBAdhc3NldElkCAUNJHQwMTUwODYxNTI3OAJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBBQZpc3N1ZXIAAAQLcHVibGljQWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBBBwdWJsaWNBZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBBQZpc3N1ZXIAAAQNaXNXaGl0ZWxpc3RlZAkBDmNoZWNrV2hpdGVsaXN0AQUGaXNzdWVyBA1hbW91bnRGb3JTaWduCQBrAwUGYW1vdW50BQ5jb21taXNzaW9uX2ZlZQBkBA5hbW91bnRGb3JBZ2VudAMDAwkBAiE9AgUFYWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUKYWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFCmFnZW50U2hhcmUAkE4AAAQUYW1vdW50Rm9yUHVibGljQWdlbnQDAwMJAQIhPQIFC3B1YmxpY0FnZW50BQtmZWVSZWNlaXZlcgkAZgIFEHB1YmxpY0FnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BRBwdWJsaWNBZ2VudFNoYXJlAJBOAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFBmlzc3VlcgIKLAogQXJ0SUQ6IAUFYXJ0SWQCESwKIEFydHdvcmsgbmFtZTogBQthcnR3b3JrTmFtZQIKLAogSXNzdWU6IAkApAMBBQ1uZXdBbW91bnRTb2xkAgEvCQCkAwEFCm1heENhblNlbGwECGlzc3VlTkZUCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQECnNlbGxTdGF0dXMDAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwGCQEBIQEFCGlzT25TYWxlBwYECnJlY2VpdmVORlQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQhiaWRPd25lcggFAWkGY2FsbGVyBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkRGVsT2xkCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWRVcGRhdGUJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYmlkRGF0YUtleQIHX0NMT1NFRAkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwkA2AQBBQVpZE5GVAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFCnJlY2VpdmVORlQCAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUGYW1vdW50AgFfBQphc3NldElkQmlkAgFfCQDYBAEFBWlkTkZUBAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBCJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwAwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQ1hbW91bnRGb3JTaWduBBFhbW91bnRfYXJ0X2JlZm9yZQkBCmdldEJhbGFuY2UBBQphcnRBc3NldElkAwkAAAIFEWFtb3VudF9hcnRfYmVmb3JlBRFhbW91bnRfYXJ0X2JlZm9yZQMJAAACBQdhc3NldElkBQR1bml0CQACAQkApQMBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAQPc3dhcF9mZWVfdG9fYXJ0AwkBAiE9AgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkA/AcECQEHQWRkcmVzcwEJANkEAQUPcHV6emxlX2FydF9wb29sAgRzd2FwCQDMCAIFDmFydEFzc2V0SWRfc3RyCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBSJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwBQNuaWwFBHVuaXQDCQAAAgUPc3dhcF9mZWVfdG9fYXJ0BQ9zd2FwX2ZlZV90b19hcnQEEGFtb3VudF9hcnRfYWZ0ZXIJAQpnZXRCYWxhbmNlAQUKYXJ0QXNzZXRJZAMJAAACBRBhbW91bnRfYXJ0X2FmdGVyBRBhbW91bnRfYXJ0X2FmdGVyBBRjb21taXNzaW9uc1dpdGhBZ2VudAMJAQIhPQIFDmFtb3VudEZvckFnZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyAwkAAAIFB2Fzc2V0SWQFCmFydEFzc2V0SWQJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAkAZQIFEGFtb3VudF9hcnRfYWZ0ZXIFEWFtb3VudF9hcnRfYmVmb3JlBQphcnRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQVhZ2VudAUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIDCQAAAgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAUNYW1vdW50Rm9yU2lnbgkAZQIFEGFtb3VudF9hcnRfYWZ0ZXIFEWFtb3VudF9hcnRfYmVmb3JlBQphcnRBc3NldElkBQNuaWwEGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50AwkBAiE9AgUUYW1vdW50Rm9yUHVibGljQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULcHVibGljQWdlbnQFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIJAGUCBRBhbW91bnRGb3JDcmVhdG9yBRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIFEGFtb3VudEZvckNyZWF0b3IFB2Fzc2V0SWQFA25pbAQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwEBmJ1eVJlcwkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQFDW5ld0Ftb3VudFNvbGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFBWlkTkZUBQdzb2xkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUIdG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIFCGlzc3VlTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQFA25pbAUUY29tbWlzc2lvbnNXaXRoQWdlbnQFGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50BQp0eFRvQ2FsbGVyAwUFaXNCaWQJAMwIAgUIc29sZERhdGEJAMwIAgUJYmlkVXBkYXRlCQDMCAIFCWJpZERlbE9sZAUGYnV5UmVzCQDMCAIFCHNvbGREYXRhBQZidXlSZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAoGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAWkBCmFkZEFydHdvcmsMBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5BA0kdDAyMTYxMjIxNjg1CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAVhcnRJZAgFDSR0MDIxNjEyMjE2ODUCXzEEBmNhbGxlcggFDSR0MDIxNjEyMjE2ODUCXzIEBGRhdGUIBQ0kdDAyMTYxMjIxNjg1Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDIxNjEyMjE2ODUCXzQEDSR0MDIxNjk1MjE3NjQJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDIxNjk1MjE3NjQCXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjE2OTUyMTc2NAJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEEHdoaXRlbGlzdGVkX2Ryb3AJAGYCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIFBmNhbGxlcgILX2ZyZWVfZHJvcHMAAAQNJHQwMjIwNjMyMjE1MQMFEHdoaXRlbGlzdGVkX2Ryb3AJAJQKAgAABQphcnRBc3NldElkCQEPdmFsaWRhdGVQYXltZW50AQUBaQQGYW1vdW50CAUNJHQwMjIwNjMyMjE1MQJfMQQHYXNzZXRJZAgFDSR0MDIyMDYzMjIxNTECXzIDCQEBIQEJAQlpc0RlZmluZWQBBQZhbW91bnQJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3ADBRB3aGl0ZWxpc3RlZF9kcm9wCQD8BwQFDXdoaXRlbGlzdERhcHACC3VzZUZyZWVEcm9wCQDMCAIFBmNhbGxlcgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AFF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5RGF0ZQIFBmNhbGxlcgUFYXJ0SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQVhcnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBWFydElkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBWFydElkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBWFydElkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQVhcnRJZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBWFydElkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQVhcnRJZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUFYXJ0SWQFBHRhZ3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBWFydElkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQVhcnRJZAUJcm95YWx0aWVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUGYW1vdW50BQphcnRBc3NldElkBQNuaWwFCnR4VG9DYWxsZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdXBkYXRlQXJ0d29yaw0EdHhpZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQNJHQwMjQwNjYyNDEzNgkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyNDA2NjI0MTM2Al8xBAZjYWxsZXIIBQ0kdDAyNDA2NjI0MTM2Al8yBARkYXRlCAUNJHQwMjQwNjYyNDEzNgJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyNDA2NjI0MTM2Al80BA0kdDAyNDE0NjI0MjE1CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyNDE0NjI0MjE1Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDI0MTQ2MjQyMTUCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAUKdHhUb0NhbGxlcgkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjU4NDIyNTg3NgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjU4NDIyNTg3NgJfMQQGY2FsbGVyCAUNJHQwMjU4NDIyNTg3NgJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNjMxMjI2MzQ2CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNjMxMjI2MzQ2Al8xBAZjYWxsZXIIBQ0kdDAyNjMxMjI2MzQ2Al8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAQGc2lnbklEAwkBAiE9AgUKc2hhMjU2SGFzaAIACQEOZ2V0U3RyaW5nQnlLZXkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAIABA1zaWduSURfbGVnYWN5AwkAAAIFBnNpZ25JRAIABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleWlkQnlTaWduaWQCBQlhZGRyVG9Vc2UFBnNpZ25JRAUDbmlsBAxkYXRhVG9EZWxldGUJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGF0ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEZXNjAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RGlzcGxheUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV4cG9ydENpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUV4cG9ydEhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlMaWNlbmNlSGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUxpY2VuY2VDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUeXBlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VGFncwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleU1heE1pbnQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlPblNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlGbGFnAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEIa2V5UHJpY2UCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAUNc2lnbklEX2xlZ2FjeQMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjkxMjUyOTE5NQkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyOTEyNTI5MTk1Al8xBAZjYWxsZXIIBQ0kdDAyOTEyNTI5MTk1Al8yBARkYXRlCAUNJHQwMjkxMjUyOTE5NQJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyOTEyNTI5MTk1Al80BAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsBQp0eFRvQ2FsbGVyAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyAgACAAIAAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBA0kdDAzMTU2ODMxNjA4CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMTU2ODMxNjA4Al8xBAZjYWxsZXIIBQ0kdDAzMTU2ODMxNjA4Al8yBARkYXRlCAUNJHQwMzE1NjgzMTYwOAJfMwQNJHQwMzE2MTMzMTY0OQkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAzMTYxMzMxNjQ5Al8xBAZhbW91bnQIBQ0kdDAzMTYxMzMxNjQ5Al8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQACAQILU2FsZSBlbmRlZC4EBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUGYW1vdW50CQACAQIOV3JvbmcgbWluIHNlbGwECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsAWkBCWFjY2VwdEJpZAUFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBnB1YktleQkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZAUIYmlkT3duZXIFBnB1YktleQFpAQljYW5jZWxCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzI5NzMzMzAzNAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzI5NzMzMzAzNAJfMQQGY2FsbGVyCAUNJHQwMzI5NzMzMzAzNAJfMgQEZGF0ZQgFDSR0MDMyOTczMzMwMzQCXzMDAwkBAiE9AgUGY2FsbGVyBQhiaWRPd25lcgkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQNcmV0dXJuTW9uZXlUbwMJAAACBQZjYWxsZXIFBmlzc3VlcgUIYmlkT3duZXIFBmNhbGxlcgQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8EB2Fzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAAECWJpZFN0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUNcmV0dXJuTW9uZXlUbwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQUHYXNzZXRJZAUDbmlsAQJ0eAEIdmVyaWZpZXIABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MACwMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAg11cGRhdGVBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwMDCQAAAggFA2ludghmdW5jdGlvbgILc2VsbEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABQMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAglhY2NlcHRCaWQJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAMgTAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleU90X5Y=", "height": 2793426, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ExxjPm3PpTgxtiDQwf1UASpVBpqznK9wcTCVCXZzWskQ Next: CYdz1npivyr13VFdTAFANfc61i6idSXLZfqTNesn9VH8 Diff:
OldNewDifferences
508508 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
509509 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
510510 let soldData = StringEntry(soldKey, soldValue)
511- if ((assetId == unit))
512- then throw(toString(isDefined(assetId)))
513- else {
514- let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
515- then (amountForSign - amountForAgent)
516- else amountForSign
517- let amount_art_before = getBalance(artAssetId)
518- if ((amount_art_before == amount_art_before))
519- then {
520- let swap_fee_to_art = if ((assetId != artAssetId))
521- then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
522- else unit
523- if ((swap_fee_to_art == swap_fee_to_art))
524- then {
525- let amount_art_after = getBalance(artAssetId)
526- if ((amount_art_after == amount_art_after))
527- then {
528- let commissionsWithAgent = if ((amountForAgent != 0))
529- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
530- then (amountForSign - amountForAgent)
531- else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
532- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
533- then amountForSign
534- else (amount_art_after - amount_art_before), artAssetId)]
535- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
536- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
537- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
538- let txToCaller = if (isSponsored)
539- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
540- else nil
541- let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
542- if (isBid)
543- then [soldData, bidUpdate, bidDelOld] :: buyRes
544- else soldData :: buyRes
545- }
546- else throw("Strict value is not equal to itself.")
547- }
548- else throw("Strict value is not equal to itself.")
549- }
550- else throw("Strict value is not equal to itself.")
551- }
511+ let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
512+ then (amountForSign - amountForAgent)
513+ else amountForSign
514+ let amount_art_before = getBalance(artAssetId)
515+ if ((amount_art_before == amount_art_before))
516+ then if ((assetId == unit))
517+ then throw(toString(isDefined(assetId)))
518+ else {
519+ let swap_fee_to_art = if ((assetId != artAssetId))
520+ then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
521+ else unit
522+ if ((swap_fee_to_art == swap_fee_to_art))
523+ then {
524+ let amount_art_after = getBalance(artAssetId)
525+ if ((amount_art_after == amount_art_after))
526+ then {
527+ let commissionsWithAgent = if ((amountForAgent != 0))
528+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
529+ then (amountForSign - amountForAgent)
530+ else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
531+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
532+ then amountForSign
533+ else (amount_art_after - amount_art_before), artAssetId)]
534+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
535+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
536+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
537+ let txToCaller = if (isSponsored)
538+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
539+ else nil
540+ let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
541+ if (isBid)
542+ then [soldData, bidUpdate, bidDelOld] :: buyRes
543+ else soldData :: buyRes
544+ }
545+ else throw("Strict value is not equal to itself.")
546+ }
547+ else throw("Strict value is not equal to itself.")
548+ }
549+ else throw("Strict value is not equal to itself.")
552550 }
553551 }
554552 }
580578
581579 @Callable(i)
582580 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
583- let $t02160721680 = idCallerDateSponsored(i, pubKey)
584- let artId = $t02160721680._1
585- let caller = $t02160721680._2
586- let date = $t02160721680._3
587- let isSponsored = $t02160721680._4
588- let $t02169021759 = setLIcence(cidLicence, sha256Licence)
589- let licenceCID = $t02169021759._1
590- let licenceHash = $t02169021759._2
581+ let $t02161221685 = idCallerDateSponsored(i, pubKey)
582+ let artId = $t02161221685._1
583+ let caller = $t02161221685._2
584+ let date = $t02161221685._3
585+ let isSponsored = $t02161221685._4
586+ let $t02169521764 = setLIcence(cidLicence, sha256Licence)
587+ let licenceCID = $t02169521764._1
588+ let licenceHash = $t02169521764._2
591589 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
592590 if ((validateArtwork != ""))
593591 then throw("Something went wrong!")
594592 else {
595593 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
596- let $t02205822146 = if (whitelisted_drop)
594+ let $t02206322151 = if (whitelisted_drop)
597595 then $Tuple2(0, artAssetId)
598596 else validatePayment(i)
599- let amount = $t02205822146._1
600- let assetId = $t02205822146._2
597+ let amount = $t02206322151._1
598+ let assetId = $t02206322151._2
601599 if (!(isDefined(amount)))
602600 then throw("Something went wrong")
603601 else {
622620 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
623621 then throw(maintenanceMSG)
624622 else {
625- let $t02406124131 = idCallerDateSponsored(i, pubKey)
626- let id = $t02406124131._1
627- let caller = $t02406124131._2
628- let date = $t02406124131._3
629- let isSponsored = $t02406124131._4
630- let $t02414124210 = setLIcence(cidLicence, sha256Licence)
631- let licenceCID = $t02414124210._1
632- let licenceHash = $t02414124210._2
623+ let $t02406624136 = idCallerDateSponsored(i, pubKey)
624+ let id = $t02406624136._1
625+ let caller = $t02406624136._2
626+ let date = $t02406624136._3
627+ let isSponsored = $t02406624136._4
628+ let $t02414624215 = setLIcence(cidLicence, sha256Licence)
629+ let licenceCID = $t02414624215._1
630+ let licenceHash = $t02414624215._2
633631 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
634632 if ((validateArtwork != ""))
635633 then throw("Something went wrong!")
657655
658656 @Callable(i)
659657 func flagArtwork (artId,addr,flag,note) = {
660- let $t02583725871 = idCallerDate(i)
661- let id = $t02583725871._1
662- let caller = $t02583725871._2
658+ let $t02584225876 = idCallerDate(i)
659+ let id = $t02584225876._1
660+ let caller = $t02584225876._2
663661 if (containsElement([chris, toString(this)], caller))
664662 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
665663 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
671669
672670 @Callable(i)
673671 func deleteArtwork (artId,addr) = {
674- let $t02630726341 = idCallerDate(i)
675- let id = $t02630726341._1
676- let caller = $t02630726341._2
672+ let $t02631226346 = idCallerDate(i)
673+ let id = $t02631226346._1
674+ let caller = $t02631226346._2
677675 let addrToUse = if (containsElement([chris, toString(this)], caller))
678676 then addr
679677 else caller
703701
704702 @Callable(i)
705703 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
706- let $t02912029190 = idCallerDateSponsored(i, pubKey)
707- let id = $t02912029190._1
708- let caller = $t02912029190._2
709- let date = $t02912029190._3
710- let isSponsored = $t02912029190._4
704+ let $t02912529195 = idCallerDateSponsored(i, pubKey)
705+ let id = $t02912529195._1
706+ let caller = $t02912529195._2
707+ let date = $t02912529195._3
708+ let isSponsored = $t02912529195._4
711709 let artworkName = getStringByKey(keyName(caller, artId))
712710 if ((artworkName == ""))
713711 then throw("This art doesn't match your account")
781779
782780 @Callable(i)
783781 func setBid (artId,issuer) = {
784- let $t03156331603 = idCallerDate(i)
785- let id = $t03156331603._1
786- let caller = $t03156331603._2
787- let date = $t03156331603._3
788- let $t03160831644 = isPayment(i)
789- let payment = $t03160831644._1
790- let amount = $t03160831644._2
782+ let $t03156831608 = idCallerDate(i)
783+ let id = $t03156831608._1
784+ let caller = $t03156831608._2
785+ let date = $t03156831608._3
786+ let $t03161331649 = isPayment(i)
787+ let payment = $t03161331649._1
788+ let amount = $t03161331649._2
791789 let assetId = if (!(isDefined(payment.assetId)))
792790 then "WAVES"
793791 else toBase58String(value(payment.assetId))
823821
824822 @Callable(i)
825823 func cancelBid (artId,issuer,bidId,bidOwner) = {
826- let $t03296833029 = idCallerDate(i)
827- let id = $t03296833029._1
828- let caller = $t03296833029._2
829- let date = $t03296833029._3
824+ let $t03297333034 = idCallerDate(i)
825+ let id = $t03297333034._1
826+ let caller = $t03297333034._2
827+ let date = $t03297333034._3
830828 if (if ((caller != bidOwner))
831829 then (caller != issuer)
832830 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "2.0.0"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let unitTest = false
1010
1111 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1212
1313 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1414
1515 let feeReceiver = getStringByKey("conf_fee_receiver")
1616
1717 let userDapp = if (unitTest)
1818 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1919 else value(addressFromString(getStringByKey("conf_users_dapp")))
2020
2121 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2222
2323 let puzzle_art_pool = getStringByKey("conf_puzzle_art_pool")
2424
2525 let usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2626
2727 let artAssetId_str = getStringByKey("conf_accepted_asset_ART")
2828
2929 let usdcPPAssetId_str = getStringByKey("conf_accepted_asset_USDC_PP")
3030
3131 let eastAssetId_str = getStringByKey("conf_accepted_asset_EAST")
3232
3333 let puzzleAssetId_str = getStringByKey("conf_accepted_asset_PUZZLE")
3434
3535 let ethPPAssetId_str = getStringByKey("conf_accepted_asset_ETH_PP")
3636
3737 let wavesAssetId_str = "WAVES"
3838
3939 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
4040
4141 let artAssetId = fromBase58String(artAssetId_str)
4242
4343 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4444
4545 let eastAssetId = fromBase58String(eastAssetId_str)
4646
4747 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
4848
4949 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
5050
5151 let wavesAssetId = base58''
5252
5353 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5454
5555 let chris = getStringByKey("conf_admin_1")
5656
5757 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5858
5959
6060 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
6161
6262
6363 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6464
6565
6666 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6767
6868
6969 let commission_fee = 8
7070
7171 let defaultLicence = getStringByKey("conf_default_licence")
7272
7373 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
7474
7575 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
7676
7777 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
7878
7979 let userSuspended = "SUSPENDED"
8080
8181 let userRemoved = "REMOVED"
8282
8383 let userUnregistered = "UNREGISTERED"
8484
8585 let userAllowed = "ALLOWED"
8686
8787 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(artAssetId)))
8888
8989 let mint_fee = getIntegerByKeyFromOracle(("mint_fee_" + toBase58String(artAssetId)))
9090
9191 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
9292
9393
9494 func validateCID (cid) = if (contains(cid, "/"))
9595 then if (if ((76 > size(cid)))
9696 then (size(split(cid, "/")[0]) == 59)
9797 else false)
9898 then (16 > size(split(cid, "/")[1]))
9999 else false
100100 else false
101101
102102
103103 func validateHash (hash) = (size(hash) == 64)
104104
105105
106106 func keyUserStatus (caller) = ("user_status_" + caller)
107107
108108
109109 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
110110
111111
112112 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
113113
114114
115115 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
116116
117117
118118 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
119119
120120
121121 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
122122
123123
124124 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
125125
126126
127127 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
128128
129129
130130 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
131131
132132
133133 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
134134
135135
136136 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
137137
138138
139139 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
140140
141141
142142 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
143143
144144
145145 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
146146
147147
148148 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
149149
150150
151151 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
152152
153153
154154 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
155155
156156
157157 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
158158
159159
160160 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
161161
162162
163163 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
164164
165165
166166 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
167167
168168
169169 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
170170
171171
172172 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
173173
174174
175175 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
176176
177177
178178 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
179179
180180
181181 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
182182
183183
184184 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
185185
186186
187187 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
188188
189189
190190 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
191191
192192
193193 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
194194 then throw("Wrong Display CID")
195195 else if (!(validateCID(cidExport)))
196196 then throw("Wrong Export CID")
197197 else if (if ((cidLicence != ""))
198198 then !(validateCID(cidLicence))
199199 else false)
200200 then throw("Wrong Licence CID")
201201 else true
202202
203203
204204 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
205205 then throw("Export Hash 64 char. max")
206206 else if (!(validateHash(sha256Licence)))
207207 then throw("Licence Hash 64 char. max")
208208 else true
209209
210210
211211 func validateString (str,max) = if ((size(str) == 0))
212212 then throw("Field cannot be is empty")
213213 else if ((size(str) > max))
214214 then throw((str + " is too long"))
215215 else true
216216
217217
218218 func validateUser (caller) = {
219219 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
220220 if (if ((userStatus == userUnregistered))
221221 then true
222222 else (userStatus == userAllowed))
223223 then "Register this account first with \"Account\" tab"
224224 else if ((userStatus == userSuspended))
225225 then "Account suspended"
226226 else if ((userStatus == userRemoved))
227227 then "Account removed"
228228 else ""
229229 }
230230
231231
232232 func setLIcence (cidLicence,sha256Licence) = {
233233 let cid = if ((size(cidLicence) == 0))
234234 then defaultLicence
235235 else cidLicence
236236 let hash = if ((size(sha256Licence) == 0))
237237 then defaultHashLicence
238238 else sha256Licence
239239 $Tuple2(cid, hash)
240240 }
241241
242242
243243 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
244244 let checkUser = validateUser(caller)
245245 if ((checkUser != ""))
246246 then throw(checkUser)
247247 else if ((size(cidDisplay) == 0))
248248 then throw("Display CID cannot be empty")
249249 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
250250 then throw("Problem with CID")
251251 else if (!(validateAllHash(sha256Export, licenceHash)))
252252 then throw("Problem with Hashes")
253253 else if (!(validateString(name, 100)))
254254 then throw("100 Char. max name")
255255 else if (!(validateString(description, 1000)))
256256 then throw("1000 Char. max description")
257257 else if (if ((0 > royalties))
258258 then true
259259 else (royalties > 1000))
260260 then throw("Royalties cannot be less than 0% or higher than 10%")
261261 else if ((size(split(tags, ",")) > 5))
262262 then throw("5 tags max.")
263263 else ""
264264 }
265265
266266
267267 func isPayment (i) = if ((size(i.payments) == 0))
268268 then throw("No payment attached")
269269 else {
270270 let payment = value(i.payments[0])
271271 let amount = value(payment.amount)
272272 $Tuple2(payment, amount)
273273 }
274274
275275
276276 func validatePayment (i) = {
277277 let $t01015610192 = isPayment(i)
278278 let payment = $t01015610192._1
279279 let amount = $t01015610192._2
280280 let assetId = if (if (isDefined(payment.assetId))
281281 then (payment.assetId == artAssetId)
282282 else false)
283283 then payment.assetId
284284 else throw("Only SIGN token accepted as transaction fee")
285285 if ((amount != currentCertificationPrice))
286286 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
287287 else $Tuple2(amount, assetId)
288288 }
289289
290290
291291 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
292292 case b: Int =>
293293 if ((b != 0))
294294 then true
295295 else false
296296 case _ =>
297297 false
298298 }
299299
300300
301301 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
302302 let $t01077910815 = isPayment(i)
303303 let payment = $t01077910815._1
304304 let amount = $t01077910815._2
305305 let assetId = if (!(isDefined(payment.assetId)))
306306 then unit
307307 else if (if ((size(priceAssetId) > 0))
308308 then (toBase58String(value(payment.assetId)) == priceAssetId)
309309 else false)
310310 then payment.assetId
311311 else throw("Wrong asset id")
312312 if (if ((assetId == unit))
313313 then (priceAssetId != "")
314314 else false)
315315 then throw("Wrong asset id")
316316 else if ((artworkPrice != amount))
317317 then throw("Payment don't match")
318318 else $Tuple2(amount, assetId)
319319 }
320320
321321
322322 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
323323 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
324324 else true
325325
326326
327327 func validateMinSell (price) = if ((0 >= price))
328328 then throw("Wrong minimum sell price")
329329 else true
330330
331331
332332 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
333333 then unit
334334 else fromBase58String(assetId)
335335
336336
337337 func getPriceAssetIdFromBid (bidDataKey) = {
338338 let bidData = getStringByKey((bidDataKey + "_OPEN"))
339339 if ((bidData == ""))
340340 then throw("Bid not found")
341341 else {
342342 let bidDataArr = split(bidData, "_")
343343 let bidAmount = parseIntValue(bidDataArr[1])
344344 let bidAssetId = getBidAssetId(bidDataArr[0])
345345 if ((0 >= bidAmount))
346346 then throw("Wrong amount")
347347 else $Tuple2(bidAmount, bidAssetId)
348348 }
349349 }
350350
351351
352352 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
353353 then throw(maintenanceMSG)
354354 else {
355355 let isSponsored = if ((pubKey != ""))
356356 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
357357 else 0
358358 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
359359 then (isSponsored > 0)
360360 else false)
361361 then toString(addressFromPublicKey(fromBase58String(pubKey)))
362362 else toBase58String(i.caller.bytes)
363363 let get_sponsored_waves = if (if ((pubKey != ""))
364364 then (isSponsored > 0)
365365 else false)
366366 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
367367 else unit
368368 if ((get_sponsored_waves == get_sponsored_waves))
369369 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
370370 else throw("Strict value is not equal to itself.")
371371 }
372372
373373
374374 func idCallerDate (i) = if (!(dappRunning))
375375 then throw(maintenanceMSG)
376376 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
377377
378378
379379 func getBalance (assetId) = match assetId {
380380 case b: ByteVector =>
381381 assetBalance(this, b)
382382 case _ =>
383383 wavesBalance(this).available
384384 }
385385
386386
387387 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
388388 let $t01342013509 = idCallerDateSponsored(i, pubKey)
389389 let id = $t01342013509._1
390390 let caller = $t01342013509._2
391391 let date = $t01342013509._3
392392 let isSponsored = $t01342013509._4
393393 let isBid = if (if (if ((caller == issuer))
394394 then (bidOwner != "")
395395 else false)
396396 then (bidId != "")
397397 else false)
398398 then true
399399 else false
400400 if (if (isBid)
401401 then (caller != issuer)
402402 else false)
403403 then throw("You cannot do this action")
404404 else {
405405 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
406406 if (if (if ((blockEnd != 0))
407407 then (height >= blockEnd)
408408 else false)
409409 then !(isBid)
410410 else false)
411411 then throw("Sale ended.")
412412 else {
413413 let callerIsIssuer = (caller == issuer)
414414 let totalNFT = getIntegerByKey("total_nft_issued")
415415 let artworkName = getStringByKey(keyName(issuer, artId))
416416 if ((artworkName == ""))
417417 then throw("Art doesn't exist")
418418 else {
419419 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
420420 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
421421 let artworkPrice = if (callerIsIssuer)
422422 then mint_fee
423423 else getIntegerByKey(keyPrice(issuer, artId))
424424 let priceAssetId = if (callerIsIssuer)
425425 then toBase58String(artAssetId)
426426 else getStringByKey(keyAssetIdAccepted(issuer, artId))
427427 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
428428 if (if (if (!(isBid))
429429 then !(callerIsIssuer)
430430 else false)
431431 then if (if ((0 >= artworkPrice))
432432 then true
433433 else !(isOnSale))
434434 then true
435435 else (0 >= maxCanSell)
436436 else false)
437437 then throw("Art not for sale")
438438 else if (if (if (!(isBid))
439439 then callerIsIssuer
440440 else false)
441441 then (0 >= maxCanSell)
442442 else false)
443443 then throw("Max issuable not set")
444444 else {
445445 let checkUser = validateUser(issuer)
446446 if (if (isBid)
447447 then (checkUser != "")
448448 else false)
449449 then throw(checkUser)
450450 else {
451451 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
452452 let $t01508615278 = if (isBid)
453453 then getPriceAssetIdFromBid(bidDataKey)
454454 else validatePriceAssetId(i, priceAssetId, artworkPrice)
455455 let amount = $t01508615278._1
456456 let assetId = $t01508615278._2
457457 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
458458 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
459459 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
460460 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
461461 let isWhitelisted = checkWhitelist(issuer)
462462 let amountForSign = fraction(amount, commission_fee, 100)
463463 let amountForAgent = if (if (if ((agent != feeReceiver))
464464 then (agentShare > 0)
465465 else false)
466466 then (height > isWhitelisted)
467467 else false)
468468 then fraction(amount, agentShare, 10000)
469469 else 0
470470 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
471471 then (publicAgentShare > 0)
472472 else false)
473473 then (height > isWhitelisted)
474474 else false)
475475 then fraction(amount, publicAgentShare, 10000)
476476 else 0
477477 let amountForCreator = (amount - amountForSign)
478478 if ((amountSold == maxCanSell))
479479 then throw("Art sold out")
480480 else {
481481 let newAmountSold = (amountSold + 1)
482482 let issueMeta = ((((((((("Creator: " + issuer) + ",
483483 ArtID: ") + artId) + ",
484484 Artwork name: ") + artworkName) + ",
485485 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
486486 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
487487 let idNFT = calculateAssetId(issueNFT)
488488 let sellStatus = if (if ((newAmountSold == maxCanSell))
489489 then true
490490 else !(isOnSale))
491491 then false
492492 else true
493493 let receiveNFT = if (if (if ((caller == issuer))
494494 then (bidOwner != "")
495495 else false)
496496 then (bidId != "")
497497 else false)
498498 then addressFromStringValue(bidOwner)
499499 else i.caller
500500 let assetIdBid = if (!(isDefined(assetId)))
501501 then "WAVES"
502502 else toBase58String(value(assetId))
503503 let bidData = getStringByKey((bidDataKey + "_OPEN"))
504504 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
505505 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
506506 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
507507 let soldValue = if (!(isBid))
508508 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
509509 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
510510 let soldData = StringEntry(soldKey, soldValue)
511- if ((assetId == unit))
512- then throw(toString(isDefined(assetId)))
513- else {
514- let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
515- then (amountForSign - amountForAgent)
516- else amountForSign
517- let amount_art_before = getBalance(artAssetId)
518- if ((amount_art_before == amount_art_before))
519- then {
520- let swap_fee_to_art = if ((assetId != artAssetId))
521- then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
522- else unit
523- if ((swap_fee_to_art == swap_fee_to_art))
524- then {
525- let amount_art_after = getBalance(artAssetId)
526- if ((amount_art_after == amount_art_after))
527- then {
528- let commissionsWithAgent = if ((amountForAgent != 0))
529- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
530- then (amountForSign - amountForAgent)
531- else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
532- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
533- then amountForSign
534- else (amount_art_after - amount_art_before), artAssetId)]
535- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
536- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
537- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
538- let txToCaller = if (isSponsored)
539- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
540- else nil
541- let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
542- if (isBid)
543- then [soldData, bidUpdate, bidDelOld] :: buyRes
544- else soldData :: buyRes
545- }
546- else throw("Strict value is not equal to itself.")
547- }
548- else throw("Strict value is not equal to itself.")
549- }
550- else throw("Strict value is not equal to itself.")
551- }
511+ let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
512+ then (amountForSign - amountForAgent)
513+ else amountForSign
514+ let amount_art_before = getBalance(artAssetId)
515+ if ((amount_art_before == amount_art_before))
516+ then if ((assetId == unit))
517+ then throw(toString(isDefined(assetId)))
518+ else {
519+ let swap_fee_to_art = if ((assetId != artAssetId))
520+ then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
521+ else unit
522+ if ((swap_fee_to_art == swap_fee_to_art))
523+ then {
524+ let amount_art_after = getBalance(artAssetId)
525+ if ((amount_art_after == amount_art_after))
526+ then {
527+ let commissionsWithAgent = if ((amountForAgent != 0))
528+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
529+ then (amountForSign - amountForAgent)
530+ else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
531+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
532+ then amountForSign
533+ else (amount_art_after - amount_art_before), artAssetId)]
534+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
535+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
536+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
537+ let txToCaller = if (isSponsored)
538+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
539+ else nil
540+ let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
541+ if (isBid)
542+ then [soldData, bidUpdate, bidDelOld] :: buyRes
543+ else soldData :: buyRes
544+ }
545+ else throw("Strict value is not equal to itself.")
546+ }
547+ else throw("Strict value is not equal to itself.")
548+ }
549+ else throw("Strict value is not equal to itself.")
552550 }
553551 }
554552 }
555553 }
556554 }
557555 }
558556 }
559557
560558
561559 func asString (bv) = match bv {
562560 case bv0: String =>
563561 bv0
564562 case _ =>
565563 throw("Sponsored Public Key String expected")
566564 }
567565
568566
569567 @Callable(invoke)
570568 func setConf (key,val) = {
571569 let caller = toString(invoke.caller)
572570 if (containsElement([chris, toString(this)], caller))
573571 then if (contains(key, "conf_"))
574572 then [StringEntry(key, val)]
575573 else throw("Entries starting with conf_ only")
576574 else throw("You are not allowed to change this")
577575 }
578576
579577
580578
581579 @Callable(i)
582580 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
583- let $t02160721680 = idCallerDateSponsored(i, pubKey)
584- let artId = $t02160721680._1
585- let caller = $t02160721680._2
586- let date = $t02160721680._3
587- let isSponsored = $t02160721680._4
588- let $t02169021759 = setLIcence(cidLicence, sha256Licence)
589- let licenceCID = $t02169021759._1
590- let licenceHash = $t02169021759._2
581+ let $t02161221685 = idCallerDateSponsored(i, pubKey)
582+ let artId = $t02161221685._1
583+ let caller = $t02161221685._2
584+ let date = $t02161221685._3
585+ let isSponsored = $t02161221685._4
586+ let $t02169521764 = setLIcence(cidLicence, sha256Licence)
587+ let licenceCID = $t02169521764._1
588+ let licenceHash = $t02169521764._2
591589 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
592590 if ((validateArtwork != ""))
593591 then throw("Something went wrong!")
594592 else {
595593 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
596- let $t02205822146 = if (whitelisted_drop)
594+ let $t02206322151 = if (whitelisted_drop)
597595 then $Tuple2(0, artAssetId)
598596 else validatePayment(i)
599- let amount = $t02205822146._1
600- let assetId = $t02205822146._2
597+ let amount = $t02206322151._1
598+ let assetId = $t02206322151._2
601599 if (!(isDefined(amount)))
602600 then throw("Something went wrong")
603601 else {
604602 let decrease_whitelist_drop = if (whitelisted_drop)
605603 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
606604 else unit
607605 if ((decrease_whitelist_drop == decrease_whitelist_drop))
608606 then {
609607 let txToCaller = if (isSponsored)
610608 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
611609 else nil
612610 ([IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, artAssetId)] ++ txToCaller)
613611 }
614612 else throw("Strict value is not equal to itself.")
615613 }
616614 }
617615 }
618616
619617
620618
621619 @Callable(i)
622620 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
623621 then throw(maintenanceMSG)
624622 else {
625- let $t02406124131 = idCallerDateSponsored(i, pubKey)
626- let id = $t02406124131._1
627- let caller = $t02406124131._2
628- let date = $t02406124131._3
629- let isSponsored = $t02406124131._4
630- let $t02414124210 = setLIcence(cidLicence, sha256Licence)
631- let licenceCID = $t02414124210._1
632- let licenceHash = $t02414124210._2
623+ let $t02406624136 = idCallerDateSponsored(i, pubKey)
624+ let id = $t02406624136._1
625+ let caller = $t02406624136._2
626+ let date = $t02406624136._3
627+ let isSponsored = $t02406624136._4
628+ let $t02414624215 = setLIcence(cidLicence, sha256Licence)
629+ let licenceCID = $t02414624215._1
630+ let licenceHash = $t02414624215._2
633631 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
634632 if ((validateArtwork != ""))
635633 then throw("Something went wrong!")
636634 else {
637635 let entryExist = getStringByKey(keyName(caller, txid))
638636 if ((entryExist == ""))
639637 then throw("Entry not found")
640638 else {
641639 let flag = getStringByKey(keyFlag(caller, txid))
642640 if ((flag == "ILLEGAL"))
643641 then throw("Cannot update ILLEGAL artwork")
644642 else if (!(isArtMinted(caller, txid)))
645643 then {
646644 let txToCaller = if (isSponsored)
647645 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
648646 else nil
649647 ([StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler), IntegerEntry(keyRoyalties(caller, txid), royalties)] ++ txToCaller)
650648 }
651649 else throw("Already minted")
652650 }
653651 }
654652 }
655653
656654
657655
658656 @Callable(i)
659657 func flagArtwork (artId,addr,flag,note) = {
660- let $t02583725871 = idCallerDate(i)
661- let id = $t02583725871._1
662- let caller = $t02583725871._2
658+ let $t02584225876 = idCallerDate(i)
659+ let id = $t02584225876._1
660+ let caller = $t02584225876._2
663661 if (containsElement([chris, toString(this)], caller))
664662 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
665663 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
666664 else throw(("Unknow status " + flag))
667665 else throw("You are not allowed")
668666 }
669667
670668
671669
672670 @Callable(i)
673671 func deleteArtwork (artId,addr) = {
674- let $t02630726341 = idCallerDate(i)
675- let id = $t02630726341._1
676- let caller = $t02630726341._2
672+ let $t02631226346 = idCallerDate(i)
673+ let id = $t02631226346._1
674+ let caller = $t02631226346._2
677675 let addrToUse = if (containsElement([chris, toString(this)], caller))
678676 then addr
679677 else caller
680678 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
681679 if ((entryExist == ""))
682680 then throw("No art matching for this address")
683681 else {
684682 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
685683 let signID = if ((sha256Hash != ""))
686684 then getStringByKey(keySignID(addrToUse, artId))
687685 else ""
688686 let signID_legacy = if ((signID == ""))
689687 then nil
690688 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
691689 let dataToDelete = ([DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addrToUse, artId)), DeleteEntry(keyPrice(addrToUse, artId)), DeleteEntry(keyAssetIdAccepted(addrToUse, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId)), DeleteEntry(keyRoyalties(addrToUse, artId))] ++ signID_legacy)
692690 if (!(isArtMinted(addrToUse, artId)))
693691 then if (!(dappRunning))
694692 then throw(maintenanceMSG)
695693 else dataToDelete
696694 else if (containsElement([chris, toString(this)], caller))
697695 then dataToDelete
698696 else throw("Art already minted, you cannot delete it")
699697 }
700698 }
701699
702700
703701
704702 @Callable(i)
705703 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
706- let $t02912029190 = idCallerDateSponsored(i, pubKey)
707- let id = $t02912029190._1
708- let caller = $t02912029190._2
709- let date = $t02912029190._3
710- let isSponsored = $t02912029190._4
704+ let $t02912529195 = idCallerDateSponsored(i, pubKey)
705+ let id = $t02912529195._1
706+ let caller = $t02912529195._2
707+ let date = $t02912529195._3
708+ let isSponsored = $t02912529195._4
711709 let artworkName = getStringByKey(keyName(caller, artId))
712710 if ((artworkName == ""))
713711 then throw("This art doesn't match your account")
714712 else {
715713 let flag = getStringByKey(keyFlag(caller, artId))
716714 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
717715 then throw("Flagged artwork")
718716 else {
719717 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
720718 if ((0 > blockEnd))
721719 then throw("Negative end")
722720 else if (if ((blockEnd > 0))
723721 then if ((maxMint != 1))
724722 then true
725723 else (price != 0)
726724 else false)
727725 then throw("Timed offer only allowed for unique edition and offer only")
728726 else {
729727 let baseHeight = if ((blockEnd == 0))
730728 then 0
731729 else height
732730 if (!(acceptedAssetIds(assetId)))
733731 then throw("Something went wrong!")
734732 else if (!(validateMinSell(price)))
735733 then throw("Something went wrong!")
736734 else {
737735 let checkUser = validateUser(caller)
738736 if ((checkUser != ""))
739737 then throw(checkUser)
740738 else {
741739 let amountSold = getIntegerByKey(keyIssued(caller, artId))
742740 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
743741 if ((maxMint > 100))
744742 then throw("100 editions max per artwork")
745743 else if (if ((amountSold != 0))
746744 then (amountSold == maxCanSell)
747745 else false)
748746 then throw("Max edition reached.")
749747 else if (if ((amountSold > 0))
750748 then (maxCanSell != maxMint)
751749 else false)
752750 then throw("Cannot change maximum issuable anymore")
753751 else if (if ((bidNbr > 0))
754752 then (maxCanSell != maxMint)
755753 else false)
756754 then throw("Cannot change maximum issuable with active orders")
757755 else {
758756 let sellStatus = if (if ((price > 0))
759757 then (maxMint > 0)
760758 else false)
761759 then true
762760 else false
763761 let txToCaller = if (isSponsored)
764762 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
765763 else nil
766764 ([BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))] ++ txToCaller)
767765 }
768766 }
769767 }
770768 }
771769 }
772770 }
773771 }
774772
775773
776774
777775 @Callable(i)
778776 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
779777
780778
781779
782780 @Callable(i)
783781 func setBid (artId,issuer) = {
784- let $t03156331603 = idCallerDate(i)
785- let id = $t03156331603._1
786- let caller = $t03156331603._2
787- let date = $t03156331603._3
788- let $t03160831644 = isPayment(i)
789- let payment = $t03160831644._1
790- let amount = $t03160831644._2
782+ let $t03156831608 = idCallerDate(i)
783+ let id = $t03156831608._1
784+ let caller = $t03156831608._2
785+ let date = $t03156831608._3
786+ let $t03161331649 = isPayment(i)
787+ let payment = $t03161331649._1
788+ let amount = $t03161331649._2
791789 let assetId = if (!(isDefined(payment.assetId)))
792790 then "WAVES"
793791 else toBase58String(value(payment.assetId))
794792 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
795793 if (if ((blockEnd != 0))
796794 then (height >= blockEnd)
797795 else false)
798796 then throw("Sale ended.")
799797 else {
800798 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
801799 if (!(acceptedAssetIds(assetId)))
802800 then throw("asset not accepted")
803801 else if (!(validateMinSell(amount)))
804802 then throw("Wrong min sell")
805803 else {
806804 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
807805 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
808806 if ((0 >= maxCanSell))
809807 then throw("No max edition set for this artwork")
810808 else if ((amountSold >= maxCanSell))
811809 then throw("Sold out, you cannot bid")
812810 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
813811 }
814812 }
815813 }
816814
817815
818816
819817 @Callable(i)
820818 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
821819
822820
823821
824822 @Callable(i)
825823 func cancelBid (artId,issuer,bidId,bidOwner) = {
826- let $t03296833029 = idCallerDate(i)
827- let id = $t03296833029._1
828- let caller = $t03296833029._2
829- let date = $t03296833029._3
824+ let $t03297333034 = idCallerDate(i)
825+ let id = $t03297333034._1
826+ let caller = $t03297333034._2
827+ let date = $t03297333034._3
830828 if (if ((caller != bidOwner))
831829 then (caller != issuer)
832830 else false)
833831 then throw("You cannot do this action")
834832 else {
835833 let returnMoneyTo = if ((caller == issuer))
836834 then bidOwner
837835 else caller
838836 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
839837 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
840838 let bidData = getStringByKey((bidDataKey + "_OPEN"))
841839 if ((bidData == ""))
842840 then throw("Bid not found")
843841 else {
844842 let bidDataArr = split(bidData, "_")
845843 let assetId = getBidAssetId(bidDataArr[0])
846844 let bidStatus = "CANCELED"
847845 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
848846 }
849847 }
850848 }
851849
852850
853851 @Verifier(tx)
854852 func verifier () = match tx {
855853 case inv: InvokeScriptTransaction =>
856854 if (if (if (if ((inv.function == "addArtwork"))
857855 then (inv.dApp == this)
858856 else false)
859857 then (inv.fee == 500000)
860858 else false)
861859 then (inv.feeAssetId == unit)
862860 else false)
863861 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
864862 else if (if (if (if ((inv.function == "updateArtwork"))
865863 then (inv.dApp == this)
866864 else false)
867865 then (inv.fee == 500000)
868866 else false)
869867 then (inv.feeAssetId == unit)
870868 else false)
871869 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
872870 else if (if (if (if ((inv.function == "sellArtwork"))
873871 then (inv.dApp == this)
874872 else false)
875873 then (inv.fee == 500000)
876874 else false)
877875 then (inv.feeAssetId == unit)
878876 else false)
879877 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
880878 else if (if (if (if ((inv.function == "acceptBid"))
881879 then (inv.dApp == this)
882880 else false)
883881 then (inv.fee == 500000)
884882 else false)
885883 then (inv.feeAssetId == unit)
886884 else false)
887885 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
888886 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
889887 case _ =>
890888 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
891889 }
892890

github/deemru/w8io/026f985 
106.18 ms