tx · 2xsArvVk7MMMpjLKTESPEZ1sZpWLG2wULWhZMDBsBsrV

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02500000 Waves

2023.09.14 06:57 [2754550] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "2xsArvVk7MMMpjLKTESPEZ1sZpWLG2wULWhZMDBsBsrV", "fee": 2500000, "feeAssetId": null, "timestamp": 1694663844115, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "4VALBHigSVFF3DZJLR7qUoA5qEbtUgVpZmqQ8PPuDEbCh7Z7dnHc8y1tAmyWTdJhkz7zSTQRfeLjAabxeg22uooS" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFkAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAEXVzZHRQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRFRfUFAADmFydEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEQ19QUAAPZWFzdEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X0VBU1QAEXB1enpsZUFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIaY29uZl9hY2NlcHRlZF9hc3NldF9FVEhfUFAAEHdhdmVzQXNzZXRJZF9zdHICBVdBVkVTAA11c2R0UFBBc3NldElkCQDZBAEFEXVzZHRQUEFzc2V0SWRfc3RyAAphcnRBc3NldElkCQDZBAEFDmFydEFzc2V0SWRfc3RyAA11c2RjUFBBc3NldElkCQDZBAEFEXVzZGNQUEFzc2V0SWRfc3RyAAtlYXN0QXNzZXRJZAkA2QQBBQ9lYXN0QXNzZXRJZF9zdHIADXB1enpsZUFzc2V0SWQJANkEAQURcHV6emxlQXNzZXRJZF9zdHIADGV0aFBQQXNzZXRJZAkA2QQBBRBldGhQUEFzc2V0SWRfc3RyAAx3YXZlc0Fzc2V0SWQBAAATYWxsX2FjY2VwdGVkX2Fzc2V0cwkAzAgCBRF1c2R0UFBBc3NldElkX3N0cgkAzAgCBQ5hcnRBc3NldElkX3N0cgkAzAgCBRF1c2RjUFBBc3NldElkX3N0cgkAzAgCBQ9lYXN0QXNzZXRJZF9zdHIJAMwIAgURcHV6emxlQXNzZXRJZF9zdHIJAMwIAgUQd2F2ZXNBc3NldElkX3N0cgkAzAgCBRBldGhQUEFzc2V0SWRfc3RyBQNuaWwABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAOY29tbWlzc2lvbl9mZWUACAAOZGVmYXVsdExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECFGNvbmZfZGVmYXVsdF9saWNlbmNlABJkZWZhdWx0SGFzaExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECGWNvbmZfZGVmYXVsdF9saWNlbmNlX2hhc2gAC2RhcHBSdW5uaW5nCQELdmFsdWVPckVsc2UCCQCbCAIFCHVzZXJEYXBwAhRjb25mX2RhcHBfaXNfcnVubmluZwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwAhRjb25mX21haW50ZW5hbmNlX21zZwIAAA11c2VyU3VzcGVuZGVkAglTVVNQRU5ERUQAC3VzZXJSZW1vdmVkAgdSRU1PVkVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQAC3VzZXJBbGxvd2VkAgdBTExPV0VEABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBC3ZhbGlkYXRlQ0lEAQNjaWQDCQEIY29udGFpbnMCBQNjaWQCAS8DAwkAZgIATAkAsQIBBQNjaWQJAAACCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAAA7BwkAZgIAEAkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAEHBwEMdmFsaWRhdGVIYXNoAQRoYXNoCQAAAgkAsQIBBQRoYXNoAEABDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEHa2V5RGF0ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGF0ZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5hbWUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25hbWVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlEZXNjAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kZXNjXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RGlzcGxheUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZGlzcGxheV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlFeHBvcnRIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9leHBvcnRfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDGtleUV4cG9ydENpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBCmtleU1heE1pbnQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X3NpZ25pZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleUlzc3VlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfaXNzdWVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5T25TYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyAQ5rZXlMaWNlbmNlSGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhFhcnRfbGljZW5jZV9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5TGljZW5jZUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUYWdzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90YWdzXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VHlwZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdHlwZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5vdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlDcmF3bGVyAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9jcmF3bGVyX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDGtleVJveWFsdGllcwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5RW5kU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfZW5kc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBEmtleUFzc2V0SWRBY2NlcHRlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleUZsYWcCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBcnRpc3RBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgINYXJ0aXN0X2FnZW50XwUKYXJ0aXN0QWRkcgEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBGmtleVByaW1hcnlTaGFyZVB1YmxpY0FnZW50AQphcnRpc3RBZGRyCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBA0kdDAxMDAxNDEwMDUwCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwMDE0MTAwNTACXzEEBmFtb3VudAgFDSR0MDEwMDE0MTAwNTACXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQphcnRBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBA0kdDAxMDYzNzEwNjczCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwNjM3MTA2NzMCXzEEBmFtb3VudAgFDSR0MDEwNjM3MTA2NzMCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAQVwcmljZQMJAGcCAAAFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgFpBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQLaXNTcG9uc29yZWQDCQECIT0CBQZwdWJLZXkCAAkBC3ZhbHVlT3JFbHNlAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkCCV9mcmVlX3R4cwAAAAAEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQtpc1Nwb25zb3JlZAAABwkApQgBCQCnCAEJANkEAQUGcHViS2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEE2dldF9zcG9uc29yZWRfd2F2ZXMDAwkBAiE9AgUGcHViS2V5AgAJAGYCBQtpc1Nwb25zb3JlZAAABwkA/AcEBQ13aGl0ZWxpc3REYXBwAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUGcHViS2V5BQNuaWwFA25pbAUEdW5pdAMJAAACBRNnZXRfc3BvbnNvcmVkX3dhdmVzBRNnZXRfc3BvbnNvcmVkX3dhdmVzCQCWCgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUGY2FsbGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFC2lzU3BvbnNvcmVkAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEHYnV5TWludAYBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5BA0kdDAxMzI3ODEzMzY3CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDEzMjc4MTMzNjcCXzEEBmNhbGxlcggFDSR0MDEzMjc4MTMzNjcCXzIEBGRhdGUIBQ0kdDAxMzI3ODEzMzY3Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDEzMjc4MTMzNjcCXzQEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHAwMFBWlzQmlkCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyCQBpAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQAFCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQUKYXJ0QXNzZXRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDAwMJAQEhAQUFaXNCaWQJAQEhAQUOY2FsbGVySXNJc3N1ZXIHAwMJAGcCAAAFDGFydHdvcmtQcmljZQYJAQEhAQUIaXNPblNhbGUGCQBnAgAABQptYXhDYW5TZWxsBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUFaXNCaWQFDmNhbGxlcklzSXNzdWVyBwkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggaXNzdWFibGUgbm90IHNldAQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGaXNzdWVyAwMFBWlzQmlkCQECIT0CBQljaGVja1VzZXICAAcJAAIBBQljaGVja1VzZXIECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBA0kdDAxNDk2NTE1MTU3AwUFaXNCaWQJARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQUKYmlkRGF0YUtleQkBFHZhbGlkYXRlUHJpY2VBc3NldElkAwUBaQUMcHJpY2VBc3NldElkBQxhcnR3b3JrUHJpY2UEBmFtb3VudAgFDSR0MDE0OTY1MTUxNTcCXzEEB2Fzc2V0SWQIBQ0kdDAxNDk2NTE1MTU3Al8yBAVhZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBEmtleUFydGlzdEFnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIECmFnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARRrZXlQcmltYXJ5U2hhcmVBZ2VudAEFBmlzc3VlcgAABAtwdWJsaWNBZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBGGtleUFydGlzdFB1YmxpY0FnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIEEHB1YmxpY0FnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudAEFBmlzc3VlcgAABA1pc1doaXRlbGlzdGVkCQEOY2hlY2tXaGl0ZWxpc3QBBQZpc3N1ZXIEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFDmNvbW1pc3Npb25fZmVlAGQEDmFtb3VudEZvckFnZW50AwMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQCQTgAABBRhbW91bnRGb3JQdWJsaWNBZ2VudAMDAwkBAiE9AgULcHVibGljQWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUQcHVibGljQWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFEHB1YmxpY0FnZW50U2hhcmUAkE4AAAQQYW1vdW50Rm9yQ3JlYXRvcgkAZQIFBmFtb3VudAUNYW1vdW50Rm9yU2lnbgMJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIMQXJ0IHNvbGQgb3V0BA1uZXdBbW91bnRTb2xkCQBkAgUKYW1vdW50U29sZAABBAlpc3N1ZU1ldGEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAgosCiBBcnRJRDogBQVhcnRJZAIRLAogQXJ0d29yayBuYW1lOiAFC2FydHdvcmtOYW1lAgosCiBJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQIaXNzdWVORlQJAMIIBQkArAICAgNTQV8JAKQDAQkAZAIFCHRvdGFsTkZUAAEFCWlzc3VlTWV0YQABAAAHBAVpZE5GVAkAuAgBBQhpc3N1ZU5GVAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMDAwkAAAIFBmNhbGxlcgUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIECmFzc2V0SWRCaWQDCQEBIQEJAQlpc0RlZmluZWQBBQdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQ1uZXdBbW91bnRTb2xkAgRfb2ZfCQCkAwEFCm1heENhblNlbGwCAV8FBWFydElkAgFfBQZpc3N1ZXIECXNvbGRWYWx1ZQMJAQEhAQUFaXNCaWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGY2FsbGVyAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFDGFydHdvcmtQcmljZQIBXwUMcHJpY2VBc3NldElkAgFfCQDYBAEFBWlkTkZUCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUKcmVjZWl2ZU5GVAIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQZhbW91bnQCAV8FCmFzc2V0SWRCaWQCAV8JANgEAQUFaWRORlQECHNvbGREYXRhCQELU3RyaW5nRW50cnkCBQdzb2xkS2V5BQlzb2xkVmFsdWUEFGNvbW1pc3Npb25zV2l0aEFnZW50AwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUFYWdlbnQFDmFtb3VudEZvckFnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQ1hbW91bnRGb3JTaWduBQdhc3NldElkBQNuaWwEGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50AwkBAiE9AgUUYW1vdW50Rm9yUHVibGljQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULcHVibGljQWdlbnQFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIJAGUCBRBhbW91bnRGb3JDcmVhdG9yBRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIFEGFtb3VudEZvckNyZWF0b3IFB2Fzc2V0SWQFA25pbAQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwEBmJ1eVJlcwkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQFDW5ld0Ftb3VudFNvbGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFBWlkTkZUBQdzb2xkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUIdG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIFCGlzc3VlTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQFA25pbAUUY29tbWlzc2lvbnNXaXRoQWdlbnQFGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50BQp0eFRvQ2FsbGVyAwUFaXNCaWQJAMwIAgUIc29sZERhdGEJAMwIAgUJYmlkVXBkYXRlCQDMCAIFCWJpZERlbE9sZAUGYnV5UmVzCQDMCAIFCHNvbGREYXRhBQZidXlSZXMBCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAoGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAWkBCmFkZEFydHdvcmsMBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5BA0kdDAyMDc0ODIwODIxCQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAVhcnRJZAgFDSR0MDIwNzQ4MjA4MjECXzEEBmNhbGxlcggFDSR0MDIwNzQ4MjA4MjECXzIEBGRhdGUIBQ0kdDAyMDc0ODIwODIxAl8zBAtpc1Nwb25zb3JlZAgFDSR0MDIwNzQ4MjA4MjECXzQEDSR0MDIwODMxMjA5MDAJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDIwODMxMjA5MDACXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjA4MzEyMDkwMAJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEEHdoaXRlbGlzdGVkX2Ryb3AJAGYCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIFBmNhbGxlcgILX2ZyZWVfZHJvcHMAAAQNJHQwMjExOTkyMTI4NwMFEHdoaXRlbGlzdGVkX2Ryb3AJAJQKAgAABQphcnRBc3NldElkCQEPdmFsaWRhdGVQYXltZW50AQUBaQQGYW1vdW50CAUNJHQwMjExOTkyMTI4NwJfMQQHYXNzZXRJZAgFDSR0MDIxMTk5MjEyODcCXzIDCQEBIQEJAQlpc0RlZmluZWQBBQZhbW91bnQJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3ADBRB3aGl0ZWxpc3RlZF9kcm9wCQD8BwQFDXdoaXRlbGlzdERhcHACC3VzZUZyZWVEcm9wCQDMCAIFBmNhbGxlcgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AFF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5RGF0ZQIFBmNhbGxlcgUFYXJ0SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQVhcnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBWFydElkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBWFydElkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBWFydElkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQVhcnRJZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBWFydElkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQVhcnRJZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUFYXJ0SWQFBHRhZ3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBWFydElkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQVhcnRJZAUJcm95YWx0aWVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUGYW1vdW50BQphcnRBc3NldElkBQNuaWwFCnR4VG9DYWxsZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdXBkYXRlQXJ0d29yaw0EdHhpZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQNJHQwMjMyMDIyMzI3MgkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyMzIwMjIzMjcyAl8xBAZjYWxsZXIIBQ0kdDAyMzIwMjIzMjcyAl8yBARkYXRlCAUNJHQwMjMyMDIyMzI3MgJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyMzIwMjIzMjcyAl80BA0kdDAyMzI4MjIzMzUxCQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyMzI4MjIzMzUxAl8xBAtsaWNlbmNlSGFzaAgFDSR0MDIzMjgyMjMzNTECXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAUKdHhUb0NhbGxlcgkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjQ5NzgyNTAxMgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjQ5NzgyNTAxMgJfMQQGY2FsbGVyCAUNJHQwMjQ5NzgyNTAxMgJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNTQ0ODI1NDgyCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNTQ0ODI1NDgyAl8xBAZjYWxsZXIIBQ0kdDAyNTQ0ODI1NDgyAl8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAQGc2lnbklEAwkAAAIFCnNoYTI1Nkhhc2gCAAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQCAAQNc2lnbklEX2xlZ2FjeQMJAAACBQZzaWduSUQCAAUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlpZEJ5U2lnbmlkAgUJYWRkclRvVXNlBQZzaWduSUQFA25pbAQMZGF0YVRvRGVsZXRlCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURhdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGVzYwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleURpc3BsYXlDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFeHBvcnRDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlFeHBvcnRIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5TGljZW5jZUhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlMaWNlbmNlQ2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VHlwZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVRhZ3MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlNYXhNaW50AgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5T25TYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RmxhZwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCGtleVByaWNlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlFbmRTYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5Tm90ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUNyYXdsZXICBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlSb3lhbHRpZXMCBQlhZGRyVG9Vc2UFBWFydElkBQNuaWwFDXNpZ25JRF9sZWdhY3kDCQEBIQEJAQtpc0FydE1pbnRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cFDGRhdGFUb0RlbGV0ZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFDGRhdGFUb0RlbGV0ZQkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQBaQELc2VsbEFydHdvcmsGBWFydElkBXByaWNlB21heE1pbnQHYXNzZXRJZAhibG9ja0VuZAZwdWJLZXkEDSR0MDI4MjYxMjgzMzEJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMjgyNjEyODMzMQJfMQQGY2FsbGVyCAUNJHQwMjgyNjEyODMzMQJfMgQEZGF0ZQgFDSR0MDI4MjYxMjgzMzECXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjgyNjEyODMzMQJfNAQLYXJ0d29ya05hbWUJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQVhcnRJZAMJAAACBQthcnR3b3JrTmFtZQIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQVhcnRJZAMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAAgECD0ZsYWdnZWQgYXJ0d29yawQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkAwkAZgIAAAUIYmxvY2tFbmQJAAIBAgxOZWdhdGl2ZSBlbmQDAwkAZgIFCGJsb2NrRW5kAAADCQECIT0CBQdtYXhNaW50AAEGCQECIT0CBQVwcmljZQAABwkAAgECOlRpbWVkIG9mZmVyIG9ubHkgYWxsb3dlZCBmb3IgdW5pcXVlIGVkaXRpb24gYW5kIG9mZmVyIG9ubHkECmJhc2VIZWlnaHQDCQAAAgUIYmxvY2tFbmQAAAAABQZoZWlnaHQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAEFBXByaWNlCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAwkAZgIFB21heE1pbnQAZAkAAgECHDEwMCBlZGl0aW9ucyBtYXggcGVyIGFydHdvcmsDAwkBAiE9AgUKYW1vdW50U29sZAAACQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggZWRpdGlvbiByZWFjaGVkLgMDCQBmAgUKYW1vdW50U29sZAAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECJkNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSBhbnltb3JlAwMJAGYCBQZiaWROYnIAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBApzZWxsU3RhdHVzAwMJAGYCBQVwcmljZQAACQBmAgUHbWF4TWludAAABwYHBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCGtleVByaWNlAgUGY2FsbGVyBQVhcnRJZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAUHbWF4TWludAkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGY2FsbGVyBQVhcnRJZAUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZjYWxsZXIFBWFydElkCQBkAgUKYmFzZUhlaWdodAUIYmxvY2tFbmQFA25pbAUKdHhUb0NhbGxlcgFpAQpidXlBcnR3b3JrAgVhcnRJZAZpc3N1ZXIJAQdidXlNaW50BgUBaQUFYXJ0SWQFBmlzc3VlcgIAAgACAAFpAQZzZXRCaWQCBWFydElkBmlzc3VlcgQNJHQwMzA3MDQzMDc0NAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzA3MDQzMDc0NAJfMQQGY2FsbGVyCAUNJHQwMzA3MDQzMDc0NAJfMgQEZGF0ZQgFDSR0MDMwNzA0MzA3NDQCXzMEDSR0MDMwNzQ5MzA3ODUJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMzA3NDkzMDc4NQJfMQQGYW1vdW50CAUNJHQwMzA3NDkzMDc4NQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkAAgECC1NhbGUgZW5kZWQuBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAEFBmFtb3VudAkAAgECDldyb25nIG1pbiBzZWxsBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUGY2FsbGVyAgFfBQJpZAIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUHYXNzZXRJZAIBXwkApAMBBQZhbW91bnQCAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBkAgUGYmlkTmJyAAEFA25pbAFpAQlhY2NlcHRCaWQFBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgZwdWJLZXkJAQdidXlNaW50BgUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyBQZwdWJLZXkBaQEJY2FuY2VsQmlkBAVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEDSR0MDMyMTA5MzIxNzAJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDMyMTA5MzIxNzACXzEEBmNhbGxlcggFDSR0MDMyMTA5MzIxNzACXzIEBGRhdGUIBQ0kdDAzMjEwOTMyMTcwAl8zAwMJAQIhPQIFBmNhbGxlcgUIYmlkT3duZXIJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EDXJldHVybk1vbmV5VG8DCQAAAgUGY2FsbGVyBQZpc3N1ZXIFCGJpZE93bmVyBQZjYWxsZXIEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQhiaWRPd25lcgIBXwUFYmlkSWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFCmJpZERhdGFLZXkCAV8FCWJpZFN0YXR1cwkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBlAgUGYmlkTmJyAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFDXJldHVybk1vbmV5VG8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEFB2Fzc2V0SWQFA25pbAECdHgBCHZlcmlmaWVyAAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAgphZGRBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAsDAwMDCQAAAggFA2ludghmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAMAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAUDAwMDCQAAAggFA2ludghmdW5jdGlvbgIJYWNjZXB0QmlkCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQDIEwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAQJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkkEORe", "height": 2754550, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GsV3nboydm8e3U2tc3Vvc5pxuiWnv1PTNBkMzuwijk5r Next: DqidiFLDt3uz7Qp2Uks12cZnk8uBm5oT9SizVwP2SiJf Diff:
OldNewDifferences
415415 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
416416 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
417417 let artworkPrice = if (callerIsIssuer)
418- then 0
418+ then (currentCertificationPrice / 5)
419419 else getIntegerByKey(keyPrice(issuer, artId))
420420 let priceAssetId = if (callerIsIssuer)
421421 then toBase58String(artAssetId)
445445 then throw(checkUser)
446446 else {
447447 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
448- let $t01493715129 = if (isBid)
448+ let $t01496515157 = if (isBid)
449449 then getPriceAssetIdFromBid(bidDataKey)
450450 else validatePriceAssetId(i, priceAssetId, artworkPrice)
451- let amount = $t01493715129._1
452- let assetId = $t01493715129._2
451+ let amount = $t01496515157._1
452+ let assetId = $t01496515157._2
453453 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
454454 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
455455 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
548548
549549 @Callable(i)
550550 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
551- let $t02072020793 = idCallerDateSponsored(i, pubKey)
552- let artId = $t02072020793._1
553- let caller = $t02072020793._2
554- let date = $t02072020793._3
555- let isSponsored = $t02072020793._4
556- let $t02080320872 = setLIcence(cidLicence, sha256Licence)
557- let licenceCID = $t02080320872._1
558- let licenceHash = $t02080320872._2
551+ let $t02074820821 = idCallerDateSponsored(i, pubKey)
552+ let artId = $t02074820821._1
553+ let caller = $t02074820821._2
554+ let date = $t02074820821._3
555+ let isSponsored = $t02074820821._4
556+ let $t02083120900 = setLIcence(cidLicence, sha256Licence)
557+ let licenceCID = $t02083120900._1
558+ let licenceHash = $t02083120900._2
559559 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
560560 if ((validateArtwork != ""))
561561 then throw("Something went wrong!")
562562 else {
563563 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
564- let $t02117121259 = if (whitelisted_drop)
564+ let $t02119921287 = if (whitelisted_drop)
565565 then $Tuple2(0, artAssetId)
566566 else validatePayment(i)
567- let amount = $t02117121259._1
568- let assetId = $t02117121259._2
567+ let amount = $t02119921287._1
568+ let assetId = $t02119921287._2
569569 if (!(isDefined(amount)))
570570 then throw("Something went wrong")
571571 else {
590590 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
591591 then throw(maintenanceMSG)
592592 else {
593- let $t02317423244 = idCallerDateSponsored(i, pubKey)
594- let id = $t02317423244._1
595- let caller = $t02317423244._2
596- let date = $t02317423244._3
597- let isSponsored = $t02317423244._4
598- let $t02325423323 = setLIcence(cidLicence, sha256Licence)
599- let licenceCID = $t02325423323._1
600- let licenceHash = $t02325423323._2
593+ let $t02320223272 = idCallerDateSponsored(i, pubKey)
594+ let id = $t02320223272._1
595+ let caller = $t02320223272._2
596+ let date = $t02320223272._3
597+ let isSponsored = $t02320223272._4
598+ let $t02328223351 = setLIcence(cidLicence, sha256Licence)
599+ let licenceCID = $t02328223351._1
600+ let licenceHash = $t02328223351._2
601601 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
602602 if ((validateArtwork != ""))
603603 then throw("Something went wrong!")
625625
626626 @Callable(i)
627627 func flagArtwork (artId,addr,flag,note) = {
628- let $t02495024984 = idCallerDate(i)
629- let id = $t02495024984._1
630- let caller = $t02495024984._2
628+ let $t02497825012 = idCallerDate(i)
629+ let id = $t02497825012._1
630+ let caller = $t02497825012._2
631631 if (containsElement([chris, toString(this)], caller))
632632 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
633633 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
639639
640640 @Callable(i)
641641 func deleteArtwork (artId,addr) = {
642- let $t02542025454 = idCallerDate(i)
643- let id = $t02542025454._1
644- let caller = $t02542025454._2
642+ let $t02544825482 = idCallerDate(i)
643+ let id = $t02544825482._1
644+ let caller = $t02544825482._2
645645 let addrToUse = if (containsElement([chris, toString(this)], caller))
646646 then addr
647647 else caller
671671
672672 @Callable(i)
673673 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
674- let $t02823328303 = idCallerDateSponsored(i, pubKey)
675- let id = $t02823328303._1
676- let caller = $t02823328303._2
677- let date = $t02823328303._3
678- let isSponsored = $t02823328303._4
674+ let $t02826128331 = idCallerDateSponsored(i, pubKey)
675+ let id = $t02826128331._1
676+ let caller = $t02826128331._2
677+ let date = $t02826128331._3
678+ let isSponsored = $t02826128331._4
679679 let artworkName = getStringByKey(keyName(caller, artId))
680680 if ((artworkName == ""))
681681 then throw("This art doesn't match your account")
749749
750750 @Callable(i)
751751 func setBid (artId,issuer) = {
752- let $t03067630716 = idCallerDate(i)
753- let id = $t03067630716._1
754- let caller = $t03067630716._2
755- let date = $t03067630716._3
756- let $t03072130757 = isPayment(i)
757- let payment = $t03072130757._1
758- let amount = $t03072130757._2
752+ let $t03070430744 = idCallerDate(i)
753+ let id = $t03070430744._1
754+ let caller = $t03070430744._2
755+ let date = $t03070430744._3
756+ let $t03074930785 = isPayment(i)
757+ let payment = $t03074930785._1
758+ let amount = $t03074930785._2
759759 let assetId = if (!(isDefined(payment.assetId)))
760760 then "WAVES"
761761 else toBase58String(value(payment.assetId))
791791
792792 @Callable(i)
793793 func cancelBid (artId,issuer,bidId,bidOwner) = {
794- let $t03208132142 = idCallerDate(i)
795- let id = $t03208132142._1
796- let caller = $t03208132142._2
797- let date = $t03208132142._3
794+ let $t03210932170 = idCallerDate(i)
795+ let id = $t03210932170._1
796+ let caller = $t03210932170._2
797+ let date = $t03210932170._3
798798 if (if ((caller != bidOwner))
799799 then (caller != issuer)
800800 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 usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2424
2525 let artAssetId_str = getStringByKey("conf_accepted_asset_ART")
2626
2727 let usdcPPAssetId_str = getStringByKey("conf_accepted_asset_USDC_PP")
2828
2929 let eastAssetId_str = getStringByKey("conf_accepted_asset_EAST")
3030
3131 let puzzleAssetId_str = getStringByKey("conf_accepted_asset_PUZZLE")
3232
3333 let ethPPAssetId_str = getStringByKey("conf_accepted_asset_ETH_PP")
3434
3535 let wavesAssetId_str = "WAVES"
3636
3737 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
3838
3939 let artAssetId = fromBase58String(artAssetId_str)
4040
4141 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4242
4343 let eastAssetId = fromBase58String(eastAssetId_str)
4444
4545 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
4646
4747 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
4848
4949 let wavesAssetId = base58''
5050
5151 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5252
5353 let chris = getStringByKey("conf_admin_1")
5454
5555 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5656
5757
5858 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
5959
6060
6161 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6262
6363
6464 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6565
6666
6767 let commission_fee = 8
6868
6969 let defaultLicence = getStringByKey("conf_default_licence")
7070
7171 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
7272
7373 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
7474
7575 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
7676
7777 let userSuspended = "SUSPENDED"
7878
7979 let userRemoved = "REMOVED"
8080
8181 let userUnregistered = "UNREGISTERED"
8282
8383 let userAllowed = "ALLOWED"
8484
8585 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(artAssetId)))
8686
8787 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
8888
8989
9090 func validateCID (cid) = if (contains(cid, "/"))
9191 then if (if ((76 > size(cid)))
9292 then (size(split(cid, "/")[0]) == 59)
9393 else false)
9494 then (16 > size(split(cid, "/")[1]))
9595 else false
9696 else false
9797
9898
9999 func validateHash (hash) = (size(hash) == 64)
100100
101101
102102 func keyUserStatus (caller) = ("user_status_" + caller)
103103
104104
105105 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
106106
107107
108108 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
109109
110110
111111 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
112112
113113
114114 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
115115
116116
117117 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
118118
119119
120120 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
121121
122122
123123 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
124124
125125
126126 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
127127
128128
129129 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
130130
131131
132132 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
133133
134134
135135 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
136136
137137
138138 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
139139
140140
141141 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
142142
143143
144144 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
145145
146146
147147 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
148148
149149
150150 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
151151
152152
153153 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
154154
155155
156156 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
157157
158158
159159 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
160160
161161
162162 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
163163
164164
165165 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
166166
167167
168168 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
169169
170170
171171 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
172172
173173
174174 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
175175
176176
177177 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
178178
179179
180180 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
181181
182182
183183 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
184184
185185
186186 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
187187
188188
189189 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
190190 then throw("Wrong Display CID")
191191 else if (!(validateCID(cidExport)))
192192 then throw("Wrong Export CID")
193193 else if (if ((cidLicence != ""))
194194 then !(validateCID(cidLicence))
195195 else false)
196196 then throw("Wrong Licence CID")
197197 else true
198198
199199
200200 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
201201 then throw("Export Hash 64 char. max")
202202 else if (!(validateHash(sha256Licence)))
203203 then throw("Licence Hash 64 char. max")
204204 else true
205205
206206
207207 func validateString (str,max) = if ((size(str) == 0))
208208 then throw("Field cannot be is empty")
209209 else if ((size(str) > max))
210210 then throw((str + " is too long"))
211211 else true
212212
213213
214214 func validateUser (caller) = {
215215 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
216216 if (if ((userStatus == userUnregistered))
217217 then true
218218 else (userStatus == userAllowed))
219219 then "Register this account first with \"Account\" tab"
220220 else if ((userStatus == userSuspended))
221221 then "Account suspended"
222222 else if ((userStatus == userRemoved))
223223 then "Account removed"
224224 else ""
225225 }
226226
227227
228228 func setLIcence (cidLicence,sha256Licence) = {
229229 let cid = if ((size(cidLicence) == 0))
230230 then defaultLicence
231231 else cidLicence
232232 let hash = if ((size(sha256Licence) == 0))
233233 then defaultHashLicence
234234 else sha256Licence
235235 $Tuple2(cid, hash)
236236 }
237237
238238
239239 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
240240 let checkUser = validateUser(caller)
241241 if ((checkUser != ""))
242242 then throw(checkUser)
243243 else if ((size(cidDisplay) == 0))
244244 then throw("Display CID cannot be empty")
245245 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
246246 then throw("Problem with CID")
247247 else if (!(validateAllHash(sha256Export, licenceHash)))
248248 then throw("Problem with Hashes")
249249 else if (!(validateString(name, 100)))
250250 then throw("100 Char. max name")
251251 else if (!(validateString(description, 1000)))
252252 then throw("1000 Char. max description")
253253 else if (if ((0 > royalties))
254254 then true
255255 else (royalties > 1000))
256256 then throw("Royalties cannot be less than 0% or higher than 10%")
257257 else if ((size(split(tags, ",")) > 5))
258258 then throw("5 tags max.")
259259 else ""
260260 }
261261
262262
263263 func isPayment (i) = if ((size(i.payments) == 0))
264264 then throw("No payment attached")
265265 else {
266266 let payment = value(i.payments[0])
267267 let amount = value(payment.amount)
268268 $Tuple2(payment, amount)
269269 }
270270
271271
272272 func validatePayment (i) = {
273273 let $t01001410050 = isPayment(i)
274274 let payment = $t01001410050._1
275275 let amount = $t01001410050._2
276276 let assetId = if (if (isDefined(payment.assetId))
277277 then (payment.assetId == artAssetId)
278278 else false)
279279 then payment.assetId
280280 else throw("Only SIGN token accepted as transaction fee")
281281 if ((amount != currentCertificationPrice))
282282 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
283283 else $Tuple2(amount, assetId)
284284 }
285285
286286
287287 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
288288 case b: Int =>
289289 if ((b != 0))
290290 then true
291291 else false
292292 case _ =>
293293 false
294294 }
295295
296296
297297 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
298298 let $t01063710673 = isPayment(i)
299299 let payment = $t01063710673._1
300300 let amount = $t01063710673._2
301301 let assetId = if (!(isDefined(payment.assetId)))
302302 then unit
303303 else if (if ((size(priceAssetId) > 0))
304304 then (toBase58String(value(payment.assetId)) == priceAssetId)
305305 else false)
306306 then payment.assetId
307307 else throw("Wrong asset id")
308308 if (if ((assetId == unit))
309309 then (priceAssetId != "")
310310 else false)
311311 then throw("Wrong asset id")
312312 else if ((artworkPrice != amount))
313313 then throw("Payment don't match")
314314 else $Tuple2(amount, assetId)
315315 }
316316
317317
318318 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
319319 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
320320 else true
321321
322322
323323 func validateMinSell (price) = if ((0 >= price))
324324 then throw("Wrong minimum sell price")
325325 else true
326326
327327
328328 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
329329 then unit
330330 else fromBase58String(assetId)
331331
332332
333333 func getPriceAssetIdFromBid (bidDataKey) = {
334334 let bidData = getStringByKey((bidDataKey + "_OPEN"))
335335 if ((bidData == ""))
336336 then throw("Bid not found")
337337 else {
338338 let bidDataArr = split(bidData, "_")
339339 let bidAmount = parseIntValue(bidDataArr[1])
340340 let bidAssetId = getBidAssetId(bidDataArr[0])
341341 if ((0 >= bidAmount))
342342 then throw("Wrong amount")
343343 else $Tuple2(bidAmount, bidAssetId)
344344 }
345345 }
346346
347347
348348 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
349349 then throw(maintenanceMSG)
350350 else {
351351 let isSponsored = if ((pubKey != ""))
352352 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
353353 else 0
354354 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
355355 then (isSponsored > 0)
356356 else false)
357357 then toString(addressFromPublicKey(fromBase58String(pubKey)))
358358 else toBase58String(i.caller.bytes)
359359 let get_sponsored_waves = if (if ((pubKey != ""))
360360 then (isSponsored > 0)
361361 else false)
362362 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
363363 else unit
364364 if ((get_sponsored_waves == get_sponsored_waves))
365365 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
366366 else throw("Strict value is not equal to itself.")
367367 }
368368
369369
370370 func idCallerDate (i) = if (!(dappRunning))
371371 then throw(maintenanceMSG)
372372 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
373373
374374
375375 func getBalance (assetId) = match assetId {
376376 case b: ByteVector =>
377377 assetBalance(this, b)
378378 case _ =>
379379 wavesBalance(this).available
380380 }
381381
382382
383383 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
384384 let $t01327813367 = idCallerDateSponsored(i, pubKey)
385385 let id = $t01327813367._1
386386 let caller = $t01327813367._2
387387 let date = $t01327813367._3
388388 let isSponsored = $t01327813367._4
389389 let isBid = if (if (if ((caller == issuer))
390390 then (bidOwner != "")
391391 else false)
392392 then (bidId != "")
393393 else false)
394394 then true
395395 else false
396396 if (if (isBid)
397397 then (caller != issuer)
398398 else false)
399399 then throw("You cannot do this action")
400400 else {
401401 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
402402 if (if (if ((blockEnd != 0))
403403 then (height >= blockEnd)
404404 else false)
405405 then !(isBid)
406406 else false)
407407 then throw("Sale ended.")
408408 else {
409409 let callerIsIssuer = (caller == issuer)
410410 let totalNFT = getIntegerByKey("total_nft_issued")
411411 let artworkName = getStringByKey(keyName(issuer, artId))
412412 if ((artworkName == ""))
413413 then throw("Art doesn't exist")
414414 else {
415415 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
416416 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
417417 let artworkPrice = if (callerIsIssuer)
418- then 0
418+ then (currentCertificationPrice / 5)
419419 else getIntegerByKey(keyPrice(issuer, artId))
420420 let priceAssetId = if (callerIsIssuer)
421421 then toBase58String(artAssetId)
422422 else getStringByKey(keyAssetIdAccepted(issuer, artId))
423423 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
424424 if (if (if (!(isBid))
425425 then !(callerIsIssuer)
426426 else false)
427427 then if (if ((0 >= artworkPrice))
428428 then true
429429 else !(isOnSale))
430430 then true
431431 else (0 >= maxCanSell)
432432 else false)
433433 then throw("Art not for sale")
434434 else if (if (if (!(isBid))
435435 then callerIsIssuer
436436 else false)
437437 then (0 >= maxCanSell)
438438 else false)
439439 then throw("Max issuable not set")
440440 else {
441441 let checkUser = validateUser(issuer)
442442 if (if (isBid)
443443 then (checkUser != "")
444444 else false)
445445 then throw(checkUser)
446446 else {
447447 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
448- let $t01493715129 = if (isBid)
448+ let $t01496515157 = if (isBid)
449449 then getPriceAssetIdFromBid(bidDataKey)
450450 else validatePriceAssetId(i, priceAssetId, artworkPrice)
451- let amount = $t01493715129._1
452- let assetId = $t01493715129._2
451+ let amount = $t01496515157._1
452+ let assetId = $t01496515157._2
453453 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
454454 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
455455 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
456456 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
457457 let isWhitelisted = checkWhitelist(issuer)
458458 let amountForSign = fraction(amount, commission_fee, 100)
459459 let amountForAgent = if (if (if ((agent != feeReceiver))
460460 then (agentShare > 0)
461461 else false)
462462 then (height > isWhitelisted)
463463 else false)
464464 then fraction(amount, agentShare, 10000)
465465 else 0
466466 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
467467 then (publicAgentShare > 0)
468468 else false)
469469 then (height > isWhitelisted)
470470 else false)
471471 then fraction(amount, publicAgentShare, 10000)
472472 else 0
473473 let amountForCreator = (amount - amountForSign)
474474 if ((amountSold == maxCanSell))
475475 then throw("Art sold out")
476476 else {
477477 let newAmountSold = (amountSold + 1)
478478 let issueMeta = ((((((((("Creator: " + issuer) + ",
479479 ArtID: ") + artId) + ",
480480 Artwork name: ") + artworkName) + ",
481481 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
482482 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
483483 let idNFT = calculateAssetId(issueNFT)
484484 let sellStatus = if (if ((newAmountSold == maxCanSell))
485485 then true
486486 else !(isOnSale))
487487 then false
488488 else true
489489 let receiveNFT = if (if (if ((caller == issuer))
490490 then (bidOwner != "")
491491 else false)
492492 then (bidId != "")
493493 else false)
494494 then addressFromStringValue(bidOwner)
495495 else i.caller
496496 let assetIdBid = if (!(isDefined(assetId)))
497497 then "WAVES"
498498 else toBase58String(value(assetId))
499499 let bidData = getStringByKey((bidDataKey + "_OPEN"))
500500 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
501501 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
502502 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
503503 let soldValue = if (!(isBid))
504504 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
505505 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
506506 let soldData = StringEntry(soldKey, soldValue)
507507 let commissionsWithAgent = if ((amountForAgent != 0))
508508 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
509509 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
510510 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
511511 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
512512 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
513513 let txToCaller = if (isSponsored)
514514 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
515515 else nil
516516 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)
517517 if (isBid)
518518 then [soldData, bidUpdate, bidDelOld] :: buyRes
519519 else soldData :: buyRes
520520 }
521521 }
522522 }
523523 }
524524 }
525525 }
526526 }
527527
528528
529529 func asString (bv) = match bv {
530530 case bv0: String =>
531531 bv0
532532 case _ =>
533533 throw("Sponsored Public Key String expected")
534534 }
535535
536536
537537 @Callable(invoke)
538538 func setConf (key,val) = {
539539 let caller = toString(invoke.caller)
540540 if (containsElement([chris, toString(this)], caller))
541541 then if (contains(key, "conf_"))
542542 then [StringEntry(key, val)]
543543 else throw("Entries starting with conf_ only")
544544 else throw("You are not allowed to change this")
545545 }
546546
547547
548548
549549 @Callable(i)
550550 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
551- let $t02072020793 = idCallerDateSponsored(i, pubKey)
552- let artId = $t02072020793._1
553- let caller = $t02072020793._2
554- let date = $t02072020793._3
555- let isSponsored = $t02072020793._4
556- let $t02080320872 = setLIcence(cidLicence, sha256Licence)
557- let licenceCID = $t02080320872._1
558- let licenceHash = $t02080320872._2
551+ let $t02074820821 = idCallerDateSponsored(i, pubKey)
552+ let artId = $t02074820821._1
553+ let caller = $t02074820821._2
554+ let date = $t02074820821._3
555+ let isSponsored = $t02074820821._4
556+ let $t02083120900 = setLIcence(cidLicence, sha256Licence)
557+ let licenceCID = $t02083120900._1
558+ let licenceHash = $t02083120900._2
559559 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
560560 if ((validateArtwork != ""))
561561 then throw("Something went wrong!")
562562 else {
563563 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
564- let $t02117121259 = if (whitelisted_drop)
564+ let $t02119921287 = if (whitelisted_drop)
565565 then $Tuple2(0, artAssetId)
566566 else validatePayment(i)
567- let amount = $t02117121259._1
568- let assetId = $t02117121259._2
567+ let amount = $t02119921287._1
568+ let assetId = $t02119921287._2
569569 if (!(isDefined(amount)))
570570 then throw("Something went wrong")
571571 else {
572572 let decrease_whitelist_drop = if (whitelisted_drop)
573573 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
574574 else unit
575575 if ((decrease_whitelist_drop == decrease_whitelist_drop))
576576 then {
577577 let txToCaller = if (isSponsored)
578578 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
579579 else nil
580580 ([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)
581581 }
582582 else throw("Strict value is not equal to itself.")
583583 }
584584 }
585585 }
586586
587587
588588
589589 @Callable(i)
590590 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
591591 then throw(maintenanceMSG)
592592 else {
593- let $t02317423244 = idCallerDateSponsored(i, pubKey)
594- let id = $t02317423244._1
595- let caller = $t02317423244._2
596- let date = $t02317423244._3
597- let isSponsored = $t02317423244._4
598- let $t02325423323 = setLIcence(cidLicence, sha256Licence)
599- let licenceCID = $t02325423323._1
600- let licenceHash = $t02325423323._2
593+ let $t02320223272 = idCallerDateSponsored(i, pubKey)
594+ let id = $t02320223272._1
595+ let caller = $t02320223272._2
596+ let date = $t02320223272._3
597+ let isSponsored = $t02320223272._4
598+ let $t02328223351 = setLIcence(cidLicence, sha256Licence)
599+ let licenceCID = $t02328223351._1
600+ let licenceHash = $t02328223351._2
601601 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
602602 if ((validateArtwork != ""))
603603 then throw("Something went wrong!")
604604 else {
605605 let entryExist = getStringByKey(keyName(caller, txid))
606606 if ((entryExist == ""))
607607 then throw("Entry not found")
608608 else {
609609 let flag = getStringByKey(keyFlag(caller, txid))
610610 if ((flag == "ILLEGAL"))
611611 then throw("Cannot update ILLEGAL artwork")
612612 else if (!(isArtMinted(caller, txid)))
613613 then {
614614 let txToCaller = if (isSponsored)
615615 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
616616 else nil
617617 ([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)
618618 }
619619 else throw("Already minted")
620620 }
621621 }
622622 }
623623
624624
625625
626626 @Callable(i)
627627 func flagArtwork (artId,addr,flag,note) = {
628- let $t02495024984 = idCallerDate(i)
629- let id = $t02495024984._1
630- let caller = $t02495024984._2
628+ let $t02497825012 = idCallerDate(i)
629+ let id = $t02497825012._1
630+ let caller = $t02497825012._2
631631 if (containsElement([chris, toString(this)], caller))
632632 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
633633 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
634634 else throw(("Unknow status " + flag))
635635 else throw("You are not allowed")
636636 }
637637
638638
639639
640640 @Callable(i)
641641 func deleteArtwork (artId,addr) = {
642- let $t02542025454 = idCallerDate(i)
643- let id = $t02542025454._1
644- let caller = $t02542025454._2
642+ let $t02544825482 = idCallerDate(i)
643+ let id = $t02544825482._1
644+ let caller = $t02544825482._2
645645 let addrToUse = if (containsElement([chris, toString(this)], caller))
646646 then addr
647647 else caller
648648 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
649649 if ((entryExist == ""))
650650 then throw("No art matching for this address")
651651 else {
652652 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
653653 let signID = if ((sha256Hash == ""))
654654 then getStringByKey(keySignID(addrToUse, artId))
655655 else ""
656656 let signID_legacy = if ((signID == ""))
657657 then nil
658658 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
659659 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)
660660 if (!(isArtMinted(addrToUse, artId)))
661661 then if (!(dappRunning))
662662 then throw(maintenanceMSG)
663663 else dataToDelete
664664 else if (containsElement([chris, toString(this)], caller))
665665 then dataToDelete
666666 else throw("Art already minted, you cannot delete it")
667667 }
668668 }
669669
670670
671671
672672 @Callable(i)
673673 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
674- let $t02823328303 = idCallerDateSponsored(i, pubKey)
675- let id = $t02823328303._1
676- let caller = $t02823328303._2
677- let date = $t02823328303._3
678- let isSponsored = $t02823328303._4
674+ let $t02826128331 = idCallerDateSponsored(i, pubKey)
675+ let id = $t02826128331._1
676+ let caller = $t02826128331._2
677+ let date = $t02826128331._3
678+ let isSponsored = $t02826128331._4
679679 let artworkName = getStringByKey(keyName(caller, artId))
680680 if ((artworkName == ""))
681681 then throw("This art doesn't match your account")
682682 else {
683683 let flag = getStringByKey(keyFlag(caller, artId))
684684 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
685685 then throw("Flagged artwork")
686686 else {
687687 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
688688 if ((0 > blockEnd))
689689 then throw("Negative end")
690690 else if (if ((blockEnd > 0))
691691 then if ((maxMint != 1))
692692 then true
693693 else (price != 0)
694694 else false)
695695 then throw("Timed offer only allowed for unique edition and offer only")
696696 else {
697697 let baseHeight = if ((blockEnd == 0))
698698 then 0
699699 else height
700700 if (!(acceptedAssetIds(assetId)))
701701 then throw("Something went wrong!")
702702 else if (!(validateMinSell(price)))
703703 then throw("Something went wrong!")
704704 else {
705705 let checkUser = validateUser(caller)
706706 if ((checkUser != ""))
707707 then throw(checkUser)
708708 else {
709709 let amountSold = getIntegerByKey(keyIssued(caller, artId))
710710 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
711711 if ((maxMint > 100))
712712 then throw("100 editions max per artwork")
713713 else if (if ((amountSold != 0))
714714 then (amountSold == maxCanSell)
715715 else false)
716716 then throw("Max edition reached.")
717717 else if (if ((amountSold > 0))
718718 then (maxCanSell != maxMint)
719719 else false)
720720 then throw("Cannot change maximum issuable anymore")
721721 else if (if ((bidNbr > 0))
722722 then (maxCanSell != maxMint)
723723 else false)
724724 then throw("Cannot change maximum issuable with active orders")
725725 else {
726726 let sellStatus = if (if ((price > 0))
727727 then (maxMint > 0)
728728 else false)
729729 then true
730730 else false
731731 let txToCaller = if (isSponsored)
732732 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
733733 else nil
734734 ([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)
735735 }
736736 }
737737 }
738738 }
739739 }
740740 }
741741 }
742742
743743
744744
745745 @Callable(i)
746746 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
747747
748748
749749
750750 @Callable(i)
751751 func setBid (artId,issuer) = {
752- let $t03067630716 = idCallerDate(i)
753- let id = $t03067630716._1
754- let caller = $t03067630716._2
755- let date = $t03067630716._3
756- let $t03072130757 = isPayment(i)
757- let payment = $t03072130757._1
758- let amount = $t03072130757._2
752+ let $t03070430744 = idCallerDate(i)
753+ let id = $t03070430744._1
754+ let caller = $t03070430744._2
755+ let date = $t03070430744._3
756+ let $t03074930785 = isPayment(i)
757+ let payment = $t03074930785._1
758+ let amount = $t03074930785._2
759759 let assetId = if (!(isDefined(payment.assetId)))
760760 then "WAVES"
761761 else toBase58String(value(payment.assetId))
762762 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
763763 if (if ((blockEnd != 0))
764764 then (height >= blockEnd)
765765 else false)
766766 then throw("Sale ended.")
767767 else {
768768 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
769769 if (!(acceptedAssetIds(assetId)))
770770 then throw("asset not accepted")
771771 else if (!(validateMinSell(amount)))
772772 then throw("Wrong min sell")
773773 else {
774774 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
775775 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
776776 if ((0 >= maxCanSell))
777777 then throw("No max edition set for this artwork")
778778 else if ((amountSold >= maxCanSell))
779779 then throw("Sold out, you cannot bid")
780780 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
781781 }
782782 }
783783 }
784784
785785
786786
787787 @Callable(i)
788788 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
789789
790790
791791
792792 @Callable(i)
793793 func cancelBid (artId,issuer,bidId,bidOwner) = {
794- let $t03208132142 = idCallerDate(i)
795- let id = $t03208132142._1
796- let caller = $t03208132142._2
797- let date = $t03208132142._3
794+ let $t03210932170 = idCallerDate(i)
795+ let id = $t03210932170._1
796+ let caller = $t03210932170._2
797+ let date = $t03210932170._3
798798 if (if ((caller != bidOwner))
799799 then (caller != issuer)
800800 else false)
801801 then throw("You cannot do this action")
802802 else {
803803 let returnMoneyTo = if ((caller == issuer))
804804 then bidOwner
805805 else caller
806806 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
807807 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
808808 let bidData = getStringByKey((bidDataKey + "_OPEN"))
809809 if ((bidData == ""))
810810 then throw("Bid not found")
811811 else {
812812 let bidDataArr = split(bidData, "_")
813813 let assetId = getBidAssetId(bidDataArr[0])
814814 let bidStatus = "CANCELED"
815815 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
816816 }
817817 }
818818 }
819819
820820
821821 @Verifier(tx)
822822 func verifier () = match tx {
823823 case inv: InvokeScriptTransaction =>
824824 if (if (if (if ((inv.function == "addArtwork"))
825825 then (inv.dApp == this)
826826 else false)
827827 then (inv.fee == 500000)
828828 else false)
829829 then (inv.feeAssetId == unit)
830830 else false)
831831 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
832832 else if (if (if (if ((inv.function == "updateArtwork"))
833833 then (inv.dApp == this)
834834 else false)
835835 then (inv.fee == 500000)
836836 else false)
837837 then (inv.feeAssetId == unit)
838838 else false)
839839 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
840840 else if (if (if (if ((inv.function == "sellArtwork"))
841841 then (inv.dApp == this)
842842 else false)
843843 then (inv.fee == 500000)
844844 else false)
845845 then (inv.feeAssetId == unit)
846846 else false)
847847 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
848848 else if (if (if (if ((inv.function == "acceptBid"))
849849 then (inv.dApp == this)
850850 else false)
851851 then (inv.fee == 500000)
852852 else false)
853853 then (inv.feeAssetId == unit)
854854 else false)
855855 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
856856 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
857857 case _ =>
858858 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
859859 }
860860

github/deemru/w8io/169f3d6 
92.97 ms