Add event prefix + arbitrary JSON options for IFTTT.

This commit is contained in:
Orne Brocaar 2023-05-19 14:43:39 +01:00
parent 5146c87940
commit 513aa7804d
19 changed files with 3453 additions and 2737 deletions

View File

@ -163,204 +163,205 @@ namespace Chirpstack.Api {
"bG90VGhpbmdzSW50ZWdyYXRpb24iVwojVXBkYXRlUGlsb3RUaGluZ3NJbnRl", "bG90VGhpbmdzSW50ZWdyYXRpb24iVwojVXBkYXRlUGlsb3RUaGluZ3NJbnRl",
"Z3JhdGlvblJlcXVlc3QSMAoLaW50ZWdyYXRpb24YASABKAsyGy5hcGkuUGls", "Z3JhdGlvblJlcXVlc3QSMAoLaW50ZWdyYXRpb24YASABKAsyGy5hcGkuUGls",
"b3RUaGluZ3NJbnRlZ3JhdGlvbiI9CiNEZWxldGVQaWxvdFRoaW5nc0ludGVn", "b3RUaGluZ3NJbnRlZ3JhdGlvbiI9CiNEZWxldGVQaWxvdFRoaW5nc0ludGVn",
"cmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSJOChBJZnR0", "cmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSJ8ChBJZnR0",
"dEludGVncmF0aW9uEhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJEgsKA2tleRgC", "dEludGVncmF0aW9uEhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJEgsKA2tleRgC",
"IAEoCRIVCg11cGxpbmtfdmFsdWVzGAMgAygJIksKHUNyZWF0ZUlmdHR0SW50", "IAEoCRIVCg11cGxpbmtfdmFsdWVzGAMgAygJEhYKDmFyYml0cmFyeV9qc29u",
"ZWdyYXRpb25SZXF1ZXN0EioKC2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklm", "GAQgASgIEhQKDGV2ZW50X3ByZWZpeBgFIAEoCSJLCh1DcmVhdGVJZnR0dElu",
"dHR0SW50ZWdyYXRpb24iNAoaR2V0SWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QS", "dGVncmF0aW9uUmVxdWVzdBIqCgtpbnRlZ3JhdGlvbhgBIAEoCzIVLmFwaS5J",
"FgoOYXBwbGljYXRpb25faWQYASABKAkiSQobR2V0SWZ0dHRJbnRlZ3JhdGlv", "ZnR0dEludGVncmF0aW9uIjQKGkdldElmdHR0SW50ZWdyYXRpb25SZXF1ZXN0",
"blJlc3BvbnNlEioKC2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklmdHR0SW50", "EhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJIkkKG0dldElmdHR0SW50ZWdyYXRp",
"ZWdyYXRpb24iSwodVXBkYXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QSKgoL", "b25SZXNwb25zZRIqCgtpbnRlZ3JhdGlvbhgBIAEoCzIVLmFwaS5JZnR0dElu",
"aW50ZWdyYXRpb24YASABKAsyFS5hcGkuSWZ0dHRJbnRlZ3JhdGlvbiI3Ch1E", "dGVncmF0aW9uIksKHVVwZGF0ZUlmdHR0SW50ZWdyYXRpb25SZXF1ZXN0EioK",
"ZWxldGVJZnR0dEludGVncmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9p", "C2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklmdHR0SW50ZWdyYXRpb24iNwod",
"ZBgBIAEoCSJJCi9HZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRp", "RGVsZXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QSFgoOYXBwbGljYXRpb25f",
"ZmljYXRlUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSKWAQowR2Vu", "aWQYASABKAkiSQovR2VuZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0",
"ZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZVJlc3BvbnNl", "aWZpY2F0ZVJlcXVlc3QSFgoOYXBwbGljYXRpb25faWQYASABKAkilgEKMEdl",
"EhAKCHRsc19jZXJ0GAEgASgJEg8KB3Rsc19rZXkYAiABKAkSDwoHY2FfY2Vy", "bmVyYXRlTXF0dEludGVncmF0aW9uQ2xpZW50Q2VydGlmaWNhdGVSZXNwb25z",
"dBgDIAEoCRIuCgpleHBpcmVzX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVm", "ZRIQCgh0bHNfY2VydBgBIAEoCRIPCgd0bHNfa2V5GAIgASgJEg8KB2NhX2Nl",
"LlRpbWVzdGFtcCoiCghFbmNvZGluZxIICgRKU09OEAASDAoIUFJPVE9CVUYQ", "cnQYAyABKAkSLgoKZXhwaXJlc19hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1",
"ASq/AQoPSW50ZWdyYXRpb25LaW5kEggKBEhUVFAQABINCglJTkZMVVhfREIQ", "Zi5UaW1lc3RhbXAqIgoIRW5jb2RpbmcSCAoESlNPThAAEgwKCFBST1RPQlVG",
"ARIQCgxUSElOR1NfQk9BUkQQAhIOCgpNWV9ERVZJQ0VTEAMSDgoKTE9SQV9D", "EAEqvwEKD0ludGVncmF0aW9uS2luZBIICgRIVFRQEAASDQoJSU5GTFVYX0RC",
"TE9VRBAEEg8KC0dDUF9QVUJfU1VCEAUSCwoHQVdTX1NOUxAGEhUKEUFaVVJF", "EAESEAoMVEhJTkdTX0JPQVJEEAISDgoKTVlfREVWSUNFUxADEg4KCkxPUkFf",
"X1NFUlZJQ0VfQlVTEAcSEAoMUElMT1RfVEhJTkdTEAgSDwoLTVFUVF9HTE9C", "Q0xPVUQQBBIPCgtHQ1BfUFVCX1NVQhAFEgsKB0FXU19TTlMQBhIVChFBWlVS",
"QUwQCRIJCgVJRlRUVBAKKj8KEUluZmx1eERiUHJlY2lzaW9uEgYKAk5TEAAS", "RV9TRVJWSUNFX0JVUxAHEhAKDFBJTE9UX1RISU5HUxAIEg8KC01RVFRfR0xP",
"BQoBVRABEgYKAk1TEAISBQoBUxADEgUKAU0QBBIFCgFIEAUqMQoPSW5mbHV4", "QkFMEAkSCQoFSUZUVFQQCio/ChFJbmZsdXhEYlByZWNpc2lvbhIGCgJOUxAA",
"RGJWZXJzaW9uEg4KCklORkxVWERCXzEQABIOCgpJTkZMVVhEQl8yEAEyuDwK", "EgUKAVUQARIGCgJNUxACEgUKAVMQAxIFCgFNEAQSBQoBSBAFKjEKD0luZmx1",
"EkFwcGxpY2F0aW9uU2VydmljZRJlCgZDcmVhdGUSHS5hcGkuQ3JlYXRlQXBw", "eERiVmVyc2lvbhIOCgpJTkZMVVhEQl8xEAASDgoKSU5GTFVYREJfMhABMrg8",
"bGljYXRpb25SZXF1ZXN0Gh4uYXBpLkNyZWF0ZUFwcGxpY2F0aW9uUmVzcG9u", "ChJBcHBsaWNhdGlvblNlcnZpY2USZQoGQ3JlYXRlEh0uYXBpLkNyZWF0ZUFw",
"c2UiHILT5JMCFiIRL2FwaS9hcHBsaWNhdGlvbnM6ASoSXgoDR2V0EhouYXBp", "cGxpY2F0aW9uUmVxdWVzdBoeLmFwaS5DcmVhdGVBcHBsaWNhdGlvblJlc3Bv",
"LkdldEFwcGxpY2F0aW9uUmVxdWVzdBobLmFwaS5HZXRBcHBsaWNhdGlvblJl", "bnNlIhyC0+STAhYiES9hcGkvYXBwbGljYXRpb25zOgEqEl4KA0dldBIaLmFw",
"c3BvbnNlIh6C0+STAhgSFi9hcGkvYXBwbGljYXRpb25zL3tpZH0SbgoGVXBk", "aS5HZXRBcHBsaWNhdGlvblJlcXVlc3QaGy5hcGkuR2V0QXBwbGljYXRpb25S",
"YXRlEh0uYXBpLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBoWLmdvb2dsZS5w", "ZXNwb25zZSIegtPkkwIYEhYvYXBpL2FwcGxpY2F0aW9ucy97aWR9Em4KBlVw",
"cm90b2J1Zi5FbXB0eSItgtPkkwInGiIvYXBpL2FwcGxpY2F0aW9ucy97YXBw", "ZGF0ZRIdLmFwaS5VcGRhdGVBcHBsaWNhdGlvblJlcXVlc3QaFi5nb29nbGUu",
"bGljYXRpb24uaWR9OgEqEl8KBkRlbGV0ZRIdLmFwaS5EZWxldGVBcHBsaWNh", "cHJvdG9idWYuRW1wdHkiLYLT5JMCJxoiL2FwaS9hcHBsaWNhdGlvbnMve2Fw",
"dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiHoLT5JMCGCoW", "cGxpY2F0aW9uLmlkfToBKhJfCgZEZWxldGUSHS5hcGkuRGVsZXRlQXBwbGlj",
"L2FwaS9hcHBsaWNhdGlvbnMve2lkfRJeCgRMaXN0EhwuYXBpLkxpc3RBcHBs", "YXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ih6C0+STAhgq",
"aWNhdGlvbnNSZXF1ZXN0Gh0uYXBpLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25z", "Fi9hcGkvYXBwbGljYXRpb25zL3tpZH0SXgoETGlzdBIcLmFwaS5MaXN0QXBw",
"ZSIZgtPkkwITEhEvYXBpL2FwcGxpY2F0aW9ucxKIAQoQTGlzdEludGVncmF0", "bGljYXRpb25zUmVxdWVzdBodLmFwaS5MaXN0QXBwbGljYXRpb25zUmVzcG9u",
"aW9ucxIcLmFwaS5MaXN0SW50ZWdyYXRpb25zUmVxdWVzdBodLmFwaS5MaXN0", "c2UiGYLT5JMCExIRL2FwaS9hcHBsaWNhdGlvbnMSiAEKEExpc3RJbnRlZ3Jh",
"SW50ZWdyYXRpb25zUmVzcG9uc2UiN4LT5JMCMRIvL2FwaS9hcHBsaWNhdGlv", "dGlvbnMSHC5hcGkuTGlzdEludGVncmF0aW9uc1JlcXVlc3QaHS5hcGkuTGlz",
"bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMSnwEKFUNyZWF0ZUh0", "dEludGVncmF0aW9uc1Jlc3BvbnNlIjeC0+STAjESLy9hcGkvYXBwbGljYXRp",
"dHBJbnRlZ3JhdGlvbhIhLmFwaS5DcmVhdGVIdHRwSW50ZWdyYXRpb25SZXF1", "b25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zEp8BChVDcmVhdGVI",
"ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkuC0+STAkUiQC9hcGkvYXBw", "dHRwSW50ZWdyYXRpb24SIS5hcGkuQ3JlYXRlSHR0cEludGVncmF0aW9uUmVx",
"dWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJLgtPkkwJFIkAvYXBpL2Fw",
"cGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVn",
"cmF0aW9ucy9odHRwOgEqEpMBChJHZXRIdHRwSW50ZWdyYXRpb24SHi5hcGku",
"R2V0SHR0cEludGVncmF0aW9uUmVxdWVzdBofLmFwaS5HZXRIdHRwSW50ZWdy",
"YXRpb25SZXNwb25zZSI8gtPkkwI2EjQvYXBpL2FwcGxpY2F0aW9ucy97YXBw",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9odHRwEp8BChVVcGRhdGVIdHRw",
"SW50ZWdyYXRpb24SIS5hcGkuVXBkYXRlSHR0cEludGVncmF0aW9uUmVxdWVz",
"dBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJLgtPkkwJFGkAvYXBpL2FwcGxp",
"Y2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0",
"aW9ucy9odHRwOgEqEpABChVEZWxldGVIdHRwSW50ZWdyYXRpb24SIS5hcGku",
"RGVsZXRlSHR0cEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1",
"Zi5FbXB0eSI8gtPkkwI2KjQvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRp",
"b25faWR9L2ludGVncmF0aW9ucy9odHRwEqsBChlDcmVhdGVJbmZsdXhEYklu",
"dGVncmF0aW9uEiUuYXBpLkNyZWF0ZUluZmx1eERiSW50ZWdyYXRpb25SZXF1",
"ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ik+C0+STAkkiRC9hcGkvYXBw",
"bGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdy", "bGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdy",
"YXRpb25zL2h0dHA6ASoSkwEKEkdldEh0dHBJbnRlZ3JhdGlvbhIeLmFwaS5H", "YXRpb25zL2luZmx1eGRiOgEqEqMBChZHZXRJbmZsdXhEYkludGVncmF0aW9u",
"ZXRIdHRwSW50ZWdyYXRpb25SZXF1ZXN0Gh8uYXBpLkdldEh0dHBJbnRlZ3Jh", "EiIuYXBpLkdldEluZmx1eERiSW50ZWdyYXRpb25SZXF1ZXN0GiMuYXBpLkdl",
"dGlvblJlc3BvbnNlIjyC0+STAjYSNC9hcGkvYXBwbGljYXRpb25zL3thcHBs", "dEluZmx1eERiSW50ZWdyYXRpb25SZXNwb25zZSJAgtPkkwI6EjgvYXBpL2Fw",
"aWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2h0dHASnwEKFVVwZGF0ZUh0dHBJ", "cGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pbmZs",
"bnRlZ3JhdGlvbhIhLmFwaS5VcGRhdGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0", "dXhkYhKrAQoZVXBkYXRlSW5mbHV4RGJJbnRlZ3JhdGlvbhIlLmFwaS5VcGRh",
"GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkuC0+STAkUaQC9hcGkvYXBwbGlj", "dGVJbmZsdXhEYkludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1",
"YXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRp", "Zi5FbXB0eSJPgtPkkwJJGkQvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRp",
"b25zL2h0dHA6ASoSkAEKFURlbGV0ZUh0dHBJbnRlZ3JhdGlvbhIhLmFwaS5E", "b24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pbmZsdXhkYjoBKhKc",
"ZWxldGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm", "AQoZRGVsZXRlSW5mbHV4RGJJbnRlZ3JhdGlvbhIlLmFwaS5EZWxldGVJbmZs",
"LkVtcHR5IjyC0+STAjYqNC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlv", "dXhEYkludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0",
"bl9pZH0vaW50ZWdyYXRpb25zL2h0dHASqwEKGUNyZWF0ZUluZmx1eERiSW50", "eSJAgtPkkwI6KjgvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9",
"ZWdyYXRpb24SJS5hcGkuQ3JlYXRlSW5mbHV4RGJJbnRlZ3JhdGlvblJlcXVl", "L2ludGVncmF0aW9ucy9pbmZsdXhkYhK0AQocQ3JlYXRlVGhpbmdzQm9hcmRJ",
"c3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiT4LT5JMCSSJEL2FwaS9hcHBs", "bnRlZ3JhdGlvbhIoLmFwaS5DcmVhdGVUaGluZ3NCb2FyZEludGVncmF0aW9u",
"aWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3Jh", "UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMIkcvYXBp",
"dGlvbnMvaW5mbHV4ZGI6ASoSowEKFkdldEluZmx1eERiSW50ZWdyYXRpb24S", "L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu",
"Ii5hcGkuR2V0SW5mbHV4RGJJbnRlZ3JhdGlvblJlcXVlc3QaIy5hcGkuR2V0", "dGVncmF0aW9ucy90aGluZ3Nib2FyZDoBKhKvAQoZR2V0VGhpbmdzQm9hcmRJ",
"SW5mbHV4RGJJbnRlZ3JhdGlvblJlc3BvbnNlIkCC0+STAjoSOC9hcGkvYXBw", "bnRlZ3JhdGlvbhIlLmFwaS5HZXRUaGluZ3NCb2FyZEludGVncmF0aW9uUmVx",
"bGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2luZmx1", "dWVzdBomLmFwaS5HZXRUaGluZ3NCb2FyZEludGVncmF0aW9uUmVzcG9uc2Ui",
"eGRiEqsBChlVcGRhdGVJbmZsdXhEYkludGVncmF0aW9uEiUuYXBpLlVwZGF0", "Q4LT5JMCPRI7L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9p",
"ZUluZmx1eERiSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm", "bnRlZ3JhdGlvbnMvdGhpbmdzYm9hcmQStAEKHFVwZGF0ZVRoaW5nc0JvYXJk",
"LkVtcHR5Ik+C0+STAkkaRC9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlv", "SW50ZWdyYXRpb24SKC5hcGkuVXBkYXRlVGhpbmdzQm9hcmRJbnRlZ3JhdGlv",
"bi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2luZmx1eGRiOgEqEpwB", "blJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUoLT5JMCTBpHL2Fw",
"ChlEZWxldGVJbmZsdXhEYkludGVncmF0aW9uEiUuYXBpLkRlbGV0ZUluZmx1", "aS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9p",
"eERiSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5", "bnRlZ3JhdGlvbnMvdGhpbmdzYm9hcmQ6ASoSpQEKHERlbGV0ZVRoaW5nc0Jv",
"IkCC0+STAjoqOC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0v", "YXJkSW50ZWdyYXRpb24SKC5hcGkuRGVsZXRlVGhpbmdzQm9hcmRJbnRlZ3Jh",
"aW50ZWdyYXRpb25zL2luZmx1eGRiErQBChxDcmVhdGVUaGluZ3NCb2FyZElu", "dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiQ4LT5JMCPSo7",
"dGVncmF0aW9uEiguYXBpLkNyZWF0ZVRoaW5nc0JvYXJkSW50ZWdyYXRpb25S", "L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlv",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IlKC0+STAkwiRy9hcGkv", "bnMvdGhpbmdzYm9hcmQSrgEKGkNyZWF0ZU15RGV2aWNlc0ludGVncmF0aW9u",
"EiYuYXBpLkNyZWF0ZU15RGV2aWNlc0ludGVncmF0aW9uUmVxdWVzdBoWLmdv",
"b2dsZS5wcm90b2J1Zi5FbXB0eSJQgtPkkwJKIkUvYXBpL2FwcGxpY2F0aW9u",
"cy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9t",
"eWRldmljZXM6ASoSpwEKF0dldE15RGV2aWNlc0ludGVncmF0aW9uEiMuYXBp",
"LkdldE15RGV2aWNlc0ludGVncmF0aW9uUmVxdWVzdBokLmFwaS5HZXRNeURl",
"dmljZXNJbnRlZ3JhdGlvblJlc3BvbnNlIkGC0+STAjsSOS9hcGkvYXBwbGlj",
"YXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215ZGV2aWNl",
"cxKuAQoaVXBkYXRlTXlEZXZpY2VzSW50ZWdyYXRpb24SJi5hcGkuVXBkYXRl",
"TXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm",
"LkVtcHR5IlCC0+STAkoaRS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlv",
"bi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215ZGV2aWNlczoBKhKf",
"AQoaRGVsZXRlTXlEZXZpY2VzSW50ZWdyYXRpb24SJi5hcGkuRGVsZXRlTXlE",
"ZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVt",
"cHR5IkGC0+STAjsqOS9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9p",
"ZH0vaW50ZWdyYXRpb25zL215ZGV2aWNlcxKuAQoaQ3JlYXRlTG9yYUNsb3Vk",
"SW50ZWdyYXRpb24SJi5hcGkuQ3JlYXRlTG9yYUNsb3VkSW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IlCC0+STAkoiRS9hcGkv",
"YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50", "YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50",
"ZWdyYXRpb25zL3RoaW5nc2JvYXJkOgEqEq8BChlHZXRUaGluZ3NCb2FyZElu", "ZWdyYXRpb25zL2xvcmFjbG91ZDoBKhKnAQoXR2V0TG9yYUNsb3VkSW50ZWdy",
"dGVncmF0aW9uEiUuYXBpLkdldFRoaW5nc0JvYXJkSW50ZWdyYXRpb25SZXF1", "YXRpb24SIy5hcGkuR2V0TG9yYUNsb3VkSW50ZWdyYXRpb25SZXF1ZXN0GiQu",
"ZXN0GiYuYXBpLkdldFRoaW5nc0JvYXJkSW50ZWdyYXRpb25SZXNwb25zZSJD", "YXBpLkdldExvcmFDbG91ZEludGVncmF0aW9uUmVzcG9uc2UiQYLT5JMCOxI5",
"gtPkkwI9EjsvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2lu", "L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlv",
"dGVncmF0aW9ucy90aGluZ3Nib2FyZBK0AQocVXBkYXRlVGhpbmdzQm9hcmRJ", "bnMvbG9yYWNsb3VkEq4BChpVcGRhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvbhIm",
"bnRlZ3JhdGlvbhIoLmFwaS5VcGRhdGVUaGluZ3NCb2FyZEludGVncmF0aW9u", "LmFwaS5VcGRhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29n",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBp", "bGUucHJvdG9idWYuRW1wdHkiUILT5JMCShpFL2FwaS9hcHBsaWNhdGlvbnMv",
"L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu", "e2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbG9y",
"dGVncmF0aW9ucy90aGluZ3Nib2FyZDoBKhKlAQocRGVsZXRlVGhpbmdzQm9h", "YWNsb3VkOgEqEp8BChpEZWxldGVMb3JhQ2xvdWRJbnRlZ3JhdGlvbhImLmFw",
"cmRJbnRlZ3JhdGlvbhIoLmFwaS5EZWxldGVUaGluZ3NCb2FyZEludGVncmF0", "aS5EZWxldGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUu",
"aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJDgtPkkwI9Kjsv", "cHJvdG9idWYuRW1wdHkiQYLT5JMCOyo5L2FwaS9hcHBsaWNhdGlvbnMve2Fw",
"cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbG9yYWNsb3VkErABChpDcmVh",
"dGVHY3BQdWJTdWJJbnRlZ3JhdGlvbhImLmFwaS5DcmVhdGVHY3BQdWJTdWJJ",
"bnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUoLT",
"5JMCTCJHL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0",
"aW9uX2lkfS9pbnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWI6ASoSqQEKF0dldEdj",
"cFB1YlN1YkludGVncmF0aW9uEiMuYXBpLkdldEdjcFB1YlN1YkludGVncmF0",
"aW9uUmVxdWVzdBokLmFwaS5HZXRHY3BQdWJTdWJJbnRlZ3JhdGlvblJlc3Bv",
"bnNlIkOC0+STAj0SOy9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9p",
"ZH0vaW50ZWdyYXRpb25zL2djcC1wdWItc3ViErABChpVcGRhdGVHY3BQdWJT",
"dWJJbnRlZ3JhdGlvbhImLmFwaS5VcGRhdGVHY3BQdWJTdWJJbnRlZ3JhdGlv",
"blJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUoLT5JMCTBpHL2Fw",
"aS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9p",
"bnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWI6ASoSoQEKGkRlbGV0ZUdjcFB1YlN1",
"YkludGVncmF0aW9uEiYuYXBpLkRlbGV0ZUdjcFB1YlN1YkludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJDgtPkkwI9KjsvYXBp",
"L2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9n",
"Y3AtcHViLXN1YhKmAQoXQ3JlYXRlQXdzU25zSW50ZWdyYXRpb24SIy5hcGku",
"Q3JlYXRlQXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3Rv",
"YnVmLkVtcHR5Ik6C0+STAkgiQy9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3Jh",
"dGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2F3cy1zbnM6ASoS",
"nAEKFEdldEF3c1Nuc0ludGVncmF0aW9uEiAuYXBpLkdldEF3c1Nuc0ludGVn",
"cmF0aW9uUmVxdWVzdBohLmFwaS5HZXRBd3NTbnNJbnRlZ3JhdGlvblJlc3Bv",
"bnNlIj+C0+STAjkSNy9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9p",
"ZH0vaW50ZWdyYXRpb25zL2F3cy1zbnMSpgEKF1VwZGF0ZUF3c1Nuc0ludGVn",
"cmF0aW9uEiMuYXBpLlVwZGF0ZUF3c1Nuc0ludGVncmF0aW9uUmVxdWVzdBoW",
"Lmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJOgtPkkwJIGkMvYXBpL2FwcGxpY2F0",
"aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u",
"cy9hd3Mtc25zOgEqEpcBChdEZWxldGVBd3NTbnNJbnRlZ3JhdGlvbhIjLmFw",
"aS5EZWxldGVBd3NTbnNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJv",
"dG9idWYuRW1wdHkiP4LT5JMCOSo3L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxp",
"Y2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXdzLXNucxLCAQogQ3JlYXRlQXp1",
"cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb24SLC5hcGkuQ3JlYXRlQXp1cmVTZXJ2",
"aWNlQnVzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVt",
"cHR5IliC0+STAlIiTS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5h",
"cHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2F6dXJlLXNlcnZpY2UtYnVz",
"OgEqEsEBCh1HZXRBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIpLmFwaS5H",
"ZXRBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaKi5hcGkuR2V0",
"QXp1cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb25SZXNwb25zZSJJgtPkkwJDEkEv",
"YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u", "YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u",
"cy90aGluZ3Nib2FyZBKuAQoaQ3JlYXRlTXlEZXZpY2VzSW50ZWdyYXRpb24S", "cy9henVyZS1zZXJ2aWNlLWJ1cxLCAQogVXBkYXRlQXp1cmVTZXJ2aWNlQnVz",
"Ji5hcGkuQ3JlYXRlTXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29v", "SW50ZWdyYXRpb24SLC5hcGkuVXBkYXRlQXp1cmVTZXJ2aWNlQnVzSW50ZWdy",
"Z2xlLnByb3RvYnVmLkVtcHR5IlCC0+STAkoiRS9hcGkvYXBwbGljYXRpb25z", "YXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IliC0+STAlIa",
"L3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215", "TS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9p",
"ZGV2aWNlczoBKhKnAQoXR2V0TXlEZXZpY2VzSW50ZWdyYXRpb24SIy5hcGku", "ZH0vaW50ZWdyYXRpb25zL2F6dXJlLXNlcnZpY2UtYnVzOgEqErMBCiBEZWxl",
"R2V0TXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GiQuYXBpLkdldE15RGV2", "dGVBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIsLmFwaS5EZWxldGVBenVy",
"aWNlc0ludGVncmF0aW9uUmVzcG9uc2UiQYLT5JMCOxI5L2FwaS9hcHBsaWNh", "ZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i",
"dGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2Vz", "dWYuRW1wdHkiSYLT5JMCQypBL2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0",
"Eq4BChpVcGRhdGVNeURldmljZXNJbnRlZ3JhdGlvbhImLmFwaS5VcGRhdGVN", "aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXMStQEKHENy",
"eURldmljZXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYu", "ZWF0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuQ3JlYXRlUGlsb3RU",
"RW1wdHkiUILT5JMCShpFL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9u", "aGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w",
"LmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2VzOgEqEp8B", "dHkiU4LT5JMCTSJIL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFw",
"ChpEZWxldGVNeURldmljZXNJbnRlZ3JhdGlvbhImLmFwaS5EZWxldGVNeURl", "cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzOgEqErAB",
"dmljZXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w", "ChlHZXRQaWxvdFRoaW5nc0ludGVncmF0aW9uEiUuYXBpLkdldFBpbG90VGhp",
"dHkiQYLT5JMCOyo5L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk", "bmdzSW50ZWdyYXRpb25SZXF1ZXN0GiYuYXBpLkdldFBpbG90VGhpbmdzSW50",
"fS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2VzEq4BChpDcmVhdGVMb3JhQ2xvdWRJ", "ZWdyYXRpb25SZXNwb25zZSJEgtPkkwI+EjwvYXBpL2FwcGxpY2F0aW9ucy97",
"bnRlZ3JhdGlvbhImLmFwaS5DcmVhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJl", "YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3MStQEK",
"cXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUILT5JMCSiJFL2FwaS9h", "HFVwZGF0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuVXBkYXRlUGls",
"cHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRl", "b3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYu",
"Z3JhdGlvbnMvbG9yYWNsb3VkOgEqEqcBChdHZXRMb3JhQ2xvdWRJbnRlZ3Jh", "RW1wdHkiU4LT5JMCTRpIL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9u",
"dGlvbhIjLmFwaS5HZXRMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaJC5h", "LmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzOgEq",
"cGkuR2V0TG9yYUNsb3VkSW50ZWdyYXRpb25SZXNwb25zZSJBgtPkkwI7Ejkv", "EqYBChxEZWxldGVQaWxvdFRoaW5nc0ludGVncmF0aW9uEiguYXBpLkRlbGV0",
"YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u", "ZVBpbG90VGhpbmdzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3Rv",
"cy9sb3JhY2xvdWQSrgEKGlVwZGF0ZUxvcmFDbG91ZEludGVncmF0aW9uEiYu", "YnVmLkVtcHR5IkSC0+STAj4qPC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNh",
"YXBpLlVwZGF0ZUxvcmFDbG91ZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2ds", "dGlvbl9pZH0vaW50ZWdyYXRpb25zL3BpbG90LXRoaW5ncxKiAQoWQ3JlYXRl",
"ZS5wcm90b2J1Zi5FbXB0eSJQgtPkkwJKGkUvYXBpL2FwcGxpY2F0aW9ucy97", "SWZ0dHRJbnRlZ3JhdGlvbhIiLmFwaS5DcmVhdGVJZnR0dEludGVncmF0aW9u",
"aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9sb3Jh", "UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJMgtPkkwJGIkEvYXBp",
"Y2xvdWQ6ASoSnwEKGkRlbGV0ZUxvcmFDbG91ZEludGVncmF0aW9uEiYuYXBp",
"LkRlbGV0ZUxvcmFDbG91ZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5w",
"cm90b2J1Zi5FbXB0eSJBgtPkkwI7KjkvYXBpL2FwcGxpY2F0aW9ucy97YXBw",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9sb3JhY2xvdWQSsAEKGkNyZWF0",
"ZUdjcFB1YlN1YkludGVncmF0aW9uEiYuYXBpLkNyZWF0ZUdjcFB1YlN1Yklu",
"dGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPk",
"kwJMIkcvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRp",
"b25faWR9L2ludGVncmF0aW9ucy9nY3AtcHViLXN1YjoBKhKpAQoXR2V0R2Nw",
"UHViU3ViSW50ZWdyYXRpb24SIy5hcGkuR2V0R2NwUHViU3ViSW50ZWdyYXRp",
"b25SZXF1ZXN0GiQuYXBpLkdldEdjcFB1YlN1YkludGVncmF0aW9uUmVzcG9u",
"c2UiQ4LT5JMCPRI7L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWISsAEKGlVwZGF0ZUdjcFB1YlN1",
"YkludGVncmF0aW9uEiYuYXBpLlVwZGF0ZUdjcFB1YlN1YkludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBp",
"L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu", "L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy9nY3AtcHViLXN1YjoBKhKhAQoaRGVsZXRlR2NwUHViU3Vi", "dGVncmF0aW9ucy9pZnR0dDoBKhKXAQoTR2V0SWZ0dHRJbnRlZ3JhdGlvbhIf",
"SW50ZWdyYXRpb24SJi5hcGkuRGVsZXRlR2NwUHViU3ViSW50ZWdyYXRpb25S", "LmFwaS5HZXRJZnR0dEludGVncmF0aW9uUmVxdWVzdBogLmFwaS5HZXRJZnR0",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkOC0+STAj0qOy9hcGkv", "dEludGVncmF0aW9uUmVzcG9uc2UiPYLT5JMCNxI1L2FwaS9hcHBsaWNhdGlv",
"YXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2dj", "bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvaWZ0dHQSogEKFlVw",
"cC1wdWItc3ViEqYBChdDcmVhdGVBd3NTbnNJbnRlZ3JhdGlvbhIjLmFwaS5D", "ZGF0ZUlmdHR0SW50ZWdyYXRpb24SIi5hcGkuVXBkYXRlSWZ0dHRJbnRlZ3Jh",
"cmVhdGVBd3NTbnNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i", "dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiTILT5JMCRhpB",
"dWYuRW1wdHkiToLT5JMCSCJDL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0",
"aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXdzLXNuczoBKhKc",
"AQoUR2V0QXdzU25zSW50ZWdyYXRpb24SIC5hcGkuR2V0QXdzU25zSW50ZWdy",
"YXRpb25SZXF1ZXN0GiEuYXBpLkdldEF3c1Nuc0ludGVncmF0aW9uUmVzcG9u",
"c2UiP4LT5JMCORI3L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvYXdzLXNucxKmAQoXVXBkYXRlQXdzU25zSW50ZWdy",
"YXRpb24SIy5hcGkuVXBkYXRlQXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0GhYu",
"Z29vZ2xlLnByb3RvYnVmLkVtcHR5Ik6C0+STAkgaQy9hcGkvYXBwbGljYXRp",
"b25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25z",
"L2F3cy1zbnM6ASoSlwEKF0RlbGV0ZUF3c1Nuc0ludGVncmF0aW9uEiMuYXBp",
"LkRlbGV0ZUF3c1Nuc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90",
"b2J1Zi5FbXB0eSI/gtPkkwI5KjcvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGlj",
"YXRpb25faWR9L2ludGVncmF0aW9ucy9hd3Mtc25zEsIBCiBDcmVhdGVBenVy",
"ZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIsLmFwaS5DcmVhdGVBenVyZVNlcnZp",
"Y2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w",
"dHkiWILT5JMCUiJNL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFw",
"cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXM6",
"ASoSwQEKHUdldEF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uEikuYXBpLkdl",
"dEF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uUmVxdWVzdBoqLmFwaS5HZXRB",
"enVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlc3BvbnNlIkmC0+STAkMSQS9h",
"cGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25z",
"L2F6dXJlLXNlcnZpY2UtYnVzEsIBCiBVcGRhdGVBenVyZVNlcnZpY2VCdXNJ",
"bnRlZ3JhdGlvbhIsLmFwaS5VcGRhdGVBenVyZVNlcnZpY2VCdXNJbnRlZ3Jh",
"dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiWILT5JMCUhpN",
"L2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lk", "L2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXM6ASoSswEKIERlbGV0", "fS9pbnRlZ3JhdGlvbnMvaWZ0dHQ6ASoSkwEKFkRlbGV0ZUlmdHR0SW50ZWdy",
"ZUF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uEiwuYXBpLkRlbGV0ZUF6dXJl", "YXRpb24SIi5hcGkuRGVsZXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QaFi5n",
"U2VydmljZUJ1c0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1", "b29nbGUucHJvdG9idWYuRW1wdHkiPYLT5JMCNyo1L2FwaS9hcHBsaWNhdGlv",
"Zi5FbXB0eSJJgtPkkwJDKkEvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRp", "bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvaWZ0dHQS4QEKKEdl",
"b25faWR9L2ludGVncmF0aW9ucy9henVyZS1zZXJ2aWNlLWJ1cxK1AQocQ3Jl", "bmVyYXRlTXF0dEludGVncmF0aW9uQ2xpZW50Q2VydGlmaWNhdGUSNC5hcGku",
"YXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlvbhIoLmFwaS5DcmVhdGVQaWxvdFRo", "R2VuZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZVJlcXVl",
"aW5nc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0", "c3QaNS5hcGkuR2VuZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZp",
"eSJTgtPkkwJNIkgvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBw", "Y2F0ZVJlc3BvbnNlIkiC0+STAkIiQC9hcGkvYXBwbGljYXRpb25zL3thcHBs",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3M6ASoSsAEK", "aWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL21xdHQvY2VydGlmaWNhdGVCaAoR",
"GUdldFBpbG90VGhpbmdzSW50ZWdyYXRpb24SJS5hcGkuR2V0UGlsb3RUaGlu", "aW8uY2hpcnBzdGFjay5hcGlCEEFwcGxpY2F0aW9uUHJvdG9QAVouZ2l0aHVi",
"Z3NJbnRlZ3JhdGlvblJlcXVlc3QaJi5hcGkuR2V0UGlsb3RUaGluZ3NJbnRl", "LmNvbS9jaGlycHN0YWNrL2NoaXJwc3RhY2svYXBpL2dvL3Y0L2FwaaoCDkNo",
"Z3JhdGlvblJlc3BvbnNlIkSC0+STAj4SPC9hcGkvYXBwbGljYXRpb25zL3th", "aXJwc3RhY2suQXBpYgZwcm90bzM="));
"cHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL3BpbG90LXRoaW5ncxK1AQoc",
"VXBkYXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlvbhIoLmFwaS5VcGRhdGVQaWxv",
"dFRoaW5nc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5F",
"bXB0eSJTgtPkkwJNGkgvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24u",
"YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3M6ASoS",
"pgEKHERlbGV0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuRGVsZXRl",
"UGlsb3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i",
"dWYuRW1wdHkiRILT5JMCPio8L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0",
"aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzEqIBChZDcmVhdGVJ",
"ZnR0dEludGVncmF0aW9uEiIuYXBpLkNyZWF0ZUlmdHR0SW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkyC0+STAkYiQS9hcGkv",
"YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50",
"ZWdyYXRpb25zL2lmdHR0OgEqEpcBChNHZXRJZnR0dEludGVncmF0aW9uEh8u",
"YXBpLkdldElmdHR0SW50ZWdyYXRpb25SZXF1ZXN0GiAuYXBpLkdldElmdHR0",
"SW50ZWdyYXRpb25SZXNwb25zZSI9gtPkkwI3EjUvYXBpL2FwcGxpY2F0aW9u",
"cy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pZnR0dBKiAQoWVXBk",
"YXRlSWZ0dHRJbnRlZ3JhdGlvbhIiLmFwaS5VcGRhdGVJZnR0dEludGVncmF0",
"aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJMgtPkkwJGGkEv",
"YXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9",
"L2ludGVncmF0aW9ucy9pZnR0dDoBKhKTAQoWRGVsZXRlSWZ0dHRJbnRlZ3Jh",
"dGlvbhIiLmFwaS5EZWxldGVJZnR0dEludGVncmF0aW9uUmVxdWVzdBoWLmdv",
"b2dsZS5wcm90b2J1Zi5FbXB0eSI9gtPkkwI3KjUvYXBpL2FwcGxpY2F0aW9u",
"cy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pZnR0dBLhAQooR2Vu",
"ZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZRI0LmFwaS5H",
"ZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRpZmljYXRlUmVxdWVz",
"dBo1LmFwaS5HZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRpZmlj",
"YXRlUmVzcG9uc2UiSILT5JMCQiJAL2FwaS9hcHBsaWNhdGlvbnMve2FwcGxp",
"Y2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXF0dC9jZXJ0aWZpY2F0ZUJoChFp",
"by5jaGlycHN0YWNrLmFwaUIQQXBwbGljYXRpb25Qcm90b1ABWi5naXRodWIu",
"Y29tL2NoaXJwc3RhY2svY2hpcnBzdGFjay9hcGkvZ28vdjQvYXBpqgIOQ2hp",
"cnBzdGFjay5BcGliBnByb3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Api.AnnotationsReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.EmptyReflection.Descriptor, }, new pbr::FileDescriptor[] { global::Google.Api.AnnotationsReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.EmptyReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Chirpstack.Api.Encoding), typeof(global::Chirpstack.Api.IntegrationKind), typeof(global::Chirpstack.Api.InfluxDbPrecision), typeof(global::Chirpstack.Api.InfluxDbVersion), }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Chirpstack.Api.Encoding), typeof(global::Chirpstack.Api.IntegrationKind), typeof(global::Chirpstack.Api.InfluxDbPrecision), typeof(global::Chirpstack.Api.InfluxDbVersion), }, null, new pbr::GeneratedClrTypeInfo[] {
@ -432,7 +433,7 @@ namespace Chirpstack.Api {
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetPilotThingsIntegrationResponse), global::Chirpstack.Api.GetPilotThingsIntegrationResponse.Parser, new[]{ "Integration" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetPilotThingsIntegrationResponse), global::Chirpstack.Api.GetPilotThingsIntegrationResponse.Parser, new[]{ "Integration" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.UpdatePilotThingsIntegrationRequest), global::Chirpstack.Api.UpdatePilotThingsIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.UpdatePilotThingsIntegrationRequest), global::Chirpstack.Api.UpdatePilotThingsIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DeletePilotThingsIntegrationRequest), global::Chirpstack.Api.DeletePilotThingsIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DeletePilotThingsIntegrationRequest), global::Chirpstack.Api.DeletePilotThingsIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.IftttIntegration), global::Chirpstack.Api.IftttIntegration.Parser, new[]{ "ApplicationId", "Key", "UplinkValues" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.IftttIntegration), global::Chirpstack.Api.IftttIntegration.Parser, new[]{ "ApplicationId", "Key", "UplinkValues", "ArbitraryJson", "EventPrefix" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.CreateIftttIntegrationRequest), global::Chirpstack.Api.CreateIftttIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.CreateIftttIntegrationRequest), global::Chirpstack.Api.CreateIftttIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetIftttIntegrationRequest), global::Chirpstack.Api.GetIftttIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetIftttIntegrationRequest), global::Chirpstack.Api.GetIftttIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetIftttIntegrationResponse), global::Chirpstack.Api.GetIftttIntegrationResponse.Parser, new[]{ "Integration" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetIftttIntegrationResponse), global::Chirpstack.Api.GetIftttIntegrationResponse.Parser, new[]{ "Integration" }, null, null, null, null),
@ -6136,7 +6137,7 @@ namespace Chirpstack.Api {
public const int IntegrationFieldNumber = 1; public const int IntegrationFieldNumber = 1;
private global::Chirpstack.Api.InfluxDbIntegration integration_; private global::Chirpstack.Api.InfluxDbIntegration integration_;
/// <summary> /// <summary>
/// Integration object to update. /// Integration object to update.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -10997,7 +10998,8 @@ namespace Chirpstack.Api {
private string credentialsFile_ = ""; private string credentialsFile_ = "";
/// <summary> /// <summary>
/// Credentials file. /// Credentials file.
/// This IAM service-account credentials file (JSON) must have the following Pub/Sub roles: /// This IAM service-account credentials file (JSON) must have the following
/// Pub/Sub roles:
/// * Pub/Sub Publisher /// * Pub/Sub Publisher
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@ -16231,6 +16233,8 @@ namespace Chirpstack.Api {
applicationId_ = other.applicationId_; applicationId_ = other.applicationId_;
key_ = other.key_; key_ = other.key_;
uplinkValues_ = other.uplinkValues_.Clone(); uplinkValues_ = other.uplinkValues_.Clone();
arbitraryJson_ = other.arbitraryJson_;
eventPrefix_ = other.eventPrefix_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
} }
@ -16287,7 +16291,8 @@ namespace Chirpstack.Api {
/// You would specify the following fields: /// You would specify the following fields:
/// uplink_values = ["batteryLevel", "buttons_0_pressed"] /// uplink_values = ["batteryLevel", "buttons_0_pressed"]
/// ///
/// Note: The first value is always used for the DevEUI. /// Notes: The first value is always used for the DevEUI.
/// Ignored if arbitrary_json is set to true.
/// </summary> /// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -16295,6 +16300,42 @@ namespace Chirpstack.Api {
get { return uplinkValues_; } get { return uplinkValues_; }
} }
/// <summary>Field number for the "arbitrary_json" field.</summary>
public const int ArbitraryJsonFieldNumber = 4;
private bool arbitraryJson_;
/// <summary>
/// Arbitrary JSON.
/// If set to true, ChirpStack events will be sent as-is as arbitrary JSON
/// payload. If set to false (default), the 3 JSON values format will be used.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool ArbitraryJson {
get { return arbitraryJson_; }
set {
arbitraryJson_ = value;
}
}
/// <summary>Field number for the "event_prefix" field.</summary>
public const int EventPrefixFieldNumber = 5;
private string eventPrefix_ = "";
/// <summary>
/// Event prefix.
/// If set, the event name will be PREFIX_EVENT. For example if event_prefix
/// is set to weatherstation, and uplink event will be sent as
/// weatherstation_up to the IFTTT webhook.
/// Note: Only characters in the A-Z, a-z and 0-9 range are allowed.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public string EventPrefix {
get { return eventPrefix_; }
set {
eventPrefix_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
}
}
[global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) { public override bool Equals(object other) {
@ -16313,6 +16354,8 @@ namespace Chirpstack.Api {
if (ApplicationId != other.ApplicationId) return false; if (ApplicationId != other.ApplicationId) return false;
if (Key != other.Key) return false; if (Key != other.Key) return false;
if(!uplinkValues_.Equals(other.uplinkValues_)) return false; if(!uplinkValues_.Equals(other.uplinkValues_)) return false;
if (ArbitraryJson != other.ArbitraryJson) return false;
if (EventPrefix != other.EventPrefix) return false;
return Equals(_unknownFields, other._unknownFields); return Equals(_unknownFields, other._unknownFields);
} }
@ -16323,6 +16366,8 @@ namespace Chirpstack.Api {
if (ApplicationId.Length != 0) hash ^= ApplicationId.GetHashCode(); if (ApplicationId.Length != 0) hash ^= ApplicationId.GetHashCode();
if (Key.Length != 0) hash ^= Key.GetHashCode(); if (Key.Length != 0) hash ^= Key.GetHashCode();
hash ^= uplinkValues_.GetHashCode(); hash ^= uplinkValues_.GetHashCode();
if (ArbitraryJson != false) hash ^= ArbitraryJson.GetHashCode();
if (EventPrefix.Length != 0) hash ^= EventPrefix.GetHashCode();
if (_unknownFields != null) { if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode(); hash ^= _unknownFields.GetHashCode();
} }
@ -16350,6 +16395,14 @@ namespace Chirpstack.Api {
output.WriteString(Key); output.WriteString(Key);
} }
uplinkValues_.WriteTo(output, _repeated_uplinkValues_codec); uplinkValues_.WriteTo(output, _repeated_uplinkValues_codec);
if (ArbitraryJson != false) {
output.WriteRawTag(32);
output.WriteBool(ArbitraryJson);
}
if (EventPrefix.Length != 0) {
output.WriteRawTag(42);
output.WriteString(EventPrefix);
}
if (_unknownFields != null) { if (_unknownFields != null) {
_unknownFields.WriteTo(output); _unknownFields.WriteTo(output);
} }
@ -16369,6 +16422,14 @@ namespace Chirpstack.Api {
output.WriteString(Key); output.WriteString(Key);
} }
uplinkValues_.WriteTo(ref output, _repeated_uplinkValues_codec); uplinkValues_.WriteTo(ref output, _repeated_uplinkValues_codec);
if (ArbitraryJson != false) {
output.WriteRawTag(32);
output.WriteBool(ArbitraryJson);
}
if (EventPrefix.Length != 0) {
output.WriteRawTag(42);
output.WriteString(EventPrefix);
}
if (_unknownFields != null) { if (_unknownFields != null) {
_unknownFields.WriteTo(ref output); _unknownFields.WriteTo(ref output);
} }
@ -16386,6 +16447,12 @@ namespace Chirpstack.Api {
size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); size += 1 + pb::CodedOutputStream.ComputeStringSize(Key);
} }
size += uplinkValues_.CalculateSize(_repeated_uplinkValues_codec); size += uplinkValues_.CalculateSize(_repeated_uplinkValues_codec);
if (ArbitraryJson != false) {
size += 1 + 1;
}
if (EventPrefix.Length != 0) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(EventPrefix);
}
if (_unknownFields != null) { if (_unknownFields != null) {
size += _unknownFields.CalculateSize(); size += _unknownFields.CalculateSize();
} }
@ -16405,6 +16472,12 @@ namespace Chirpstack.Api {
Key = other.Key; Key = other.Key;
} }
uplinkValues_.Add(other.uplinkValues_); uplinkValues_.Add(other.uplinkValues_);
if (other.ArbitraryJson != false) {
ArbitraryJson = other.ArbitraryJson;
}
if (other.EventPrefix.Length != 0) {
EventPrefix = other.EventPrefix;
}
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
} }
@ -16432,6 +16505,14 @@ namespace Chirpstack.Api {
uplinkValues_.AddEntriesFrom(input, _repeated_uplinkValues_codec); uplinkValues_.AddEntriesFrom(input, _repeated_uplinkValues_codec);
break; break;
} }
case 32: {
ArbitraryJson = input.ReadBool();
break;
}
case 42: {
EventPrefix = input.ReadString();
break;
}
} }
} }
#endif #endif
@ -16459,6 +16540,14 @@ namespace Chirpstack.Api {
uplinkValues_.AddEntriesFrom(ref input, _repeated_uplinkValues_codec); uplinkValues_.AddEntriesFrom(ref input, _repeated_uplinkValues_codec);
break; break;
} }
case 32: {
ArbitraryJson = input.ReadBool();
break;
}
case 42: {
EventPrefix = input.ReadString();
break;
}
} }
} }
} }

View File

@ -9,7 +9,8 @@ using grpc = global::Grpc.Core;
namespace Chirpstack.Api { namespace Chirpstack.Api {
/// <summary> /// <summary>
/// ApplicationService is the service providing API methods for managing applications. /// ApplicationService is the service providing API methods for managing
/// applications.
/// </summary> /// </summary>
public static partial class ApplicationService public static partial class ApplicationService
{ {

File diff suppressed because it is too large Load Diff

View File

@ -1555,6 +1555,12 @@ export class IftttIntegration extends jspb.Message {
clearUplinkValuesList(): IftttIntegration; clearUplinkValuesList(): IftttIntegration;
addUplinkValues(value: string, index?: number): IftttIntegration; addUplinkValues(value: string, index?: number): IftttIntegration;
getArbitraryJson(): boolean;
setArbitraryJson(value: boolean): IftttIntegration;
getEventPrefix(): string;
setEventPrefix(value: string): IftttIntegration;
serializeBinary(): Uint8Array; serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): IftttIntegration.AsObject; toObject(includeInstance?: boolean): IftttIntegration.AsObject;
static toObject(includeInstance: boolean, msg: IftttIntegration): IftttIntegration.AsObject; static toObject(includeInstance: boolean, msg: IftttIntegration): IftttIntegration.AsObject;
@ -1568,6 +1574,8 @@ export namespace IftttIntegration {
applicationId: string, applicationId: string,
key: string, key: string,
uplinkValuesList: Array<string>, uplinkValuesList: Array<string>,
arbitraryJson: boolean,
eventPrefix: string,
} }
} }

View File

@ -13195,7 +13195,9 @@ proto.api.IftttIntegration.toObject = function(includeInstance, msg) {
var f, obj = { var f, obj = {
applicationId: jspb.Message.getFieldWithDefault(msg, 1, ""), applicationId: jspb.Message.getFieldWithDefault(msg, 1, ""),
key: jspb.Message.getFieldWithDefault(msg, 2, ""), key: jspb.Message.getFieldWithDefault(msg, 2, ""),
uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f,
arbitraryJson: jspb.Message.getBooleanFieldWithDefault(msg, 4, false),
eventPrefix: jspb.Message.getFieldWithDefault(msg, 5, "")
}; };
if (includeInstance) { if (includeInstance) {
@ -13244,6 +13246,14 @@ proto.api.IftttIntegration.deserializeBinaryFromReader = function(msg, reader) {
var value = /** @type {string} */ (reader.readString()); var value = /** @type {string} */ (reader.readString());
msg.addUplinkValues(value); msg.addUplinkValues(value);
break; break;
case 4:
var value = /** @type {boolean} */ (reader.readBool());
msg.setArbitraryJson(value);
break;
case 5:
var value = /** @type {string} */ (reader.readString());
msg.setEventPrefix(value);
break;
default: default:
reader.skipField(); reader.skipField();
break; break;
@ -13294,6 +13304,20 @@ proto.api.IftttIntegration.serializeBinaryToWriter = function(message, writer) {
f f
); );
} }
f = message.getArbitraryJson();
if (f) {
writer.writeBool(
4,
f
);
}
f = message.getEventPrefix();
if (f.length > 0) {
writer.writeString(
5,
f
);
}
}; };
@ -13370,6 +13394,42 @@ proto.api.IftttIntegration.prototype.clearUplinkValuesList = function() {
}; };
/**
* optional bool arbitrary_json = 4;
* @return {boolean}
*/
proto.api.IftttIntegration.prototype.getArbitraryJson = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false));
};
/**
* @param {boolean} value
* @return {!proto.api.IftttIntegration} returns this
*/
proto.api.IftttIntegration.prototype.setArbitraryJson = function(value) {
return jspb.Message.setProto3BooleanField(this, 4, value);
};
/**
* optional string event_prefix = 5;
* @return {string}
*/
proto.api.IftttIntegration.prototype.getEventPrefix = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
};
/**
* @param {string} value
* @return {!proto.api.IftttIntegration} returns this
*/
proto.api.IftttIntegration.prototype.setEventPrefix = function(value) {
return jspb.Message.setProto3StringField(this, 5, value);
};

View File

@ -701,7 +701,8 @@ function deserialize_google_protobuf_Empty(buffer_arg) {
} }
// ApplicationService is the service providing API methods for managing applications. // ApplicationService is the service providing API methods for managing
// applications.
var ApplicationServiceService = exports.ApplicationServiceService = { var ApplicationServiceService = exports.ApplicationServiceService = {
// Create creates the given application. // Create creates the given application.
create: { create: {

View File

@ -1691,6 +1691,12 @@ export class IftttIntegration extends jspb.Message {
setUplinkValuesList(value: Array<string>): void; setUplinkValuesList(value: Array<string>): void;
addUplinkValues(value: string, index?: number): string; addUplinkValues(value: string, index?: number): string;
getArbitraryJson(): boolean;
setArbitraryJson(value: boolean): void;
getEventPrefix(): string;
setEventPrefix(value: string): void;
serializeBinary(): Uint8Array; serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): IftttIntegration.AsObject; toObject(includeInstance?: boolean): IftttIntegration.AsObject;
static toObject(includeInstance: boolean, msg: IftttIntegration): IftttIntegration.AsObject; static toObject(includeInstance: boolean, msg: IftttIntegration): IftttIntegration.AsObject;
@ -1706,6 +1712,8 @@ export namespace IftttIntegration {
applicationId: string, applicationId: string,
key: string, key: string,
uplinkValuesList: Array<string>, uplinkValuesList: Array<string>,
arbitraryJson: boolean,
eventPrefix: string,
} }
} }

View File

@ -13195,7 +13195,9 @@ proto.api.IftttIntegration.toObject = function(includeInstance, msg) {
var f, obj = { var f, obj = {
applicationId: jspb.Message.getFieldWithDefault(msg, 1, ""), applicationId: jspb.Message.getFieldWithDefault(msg, 1, ""),
key: jspb.Message.getFieldWithDefault(msg, 2, ""), key: jspb.Message.getFieldWithDefault(msg, 2, ""),
uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f uplinkValuesList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f,
arbitraryJson: jspb.Message.getBooleanFieldWithDefault(msg, 4, false),
eventPrefix: jspb.Message.getFieldWithDefault(msg, 5, "")
}; };
if (includeInstance) { if (includeInstance) {
@ -13244,6 +13246,14 @@ proto.api.IftttIntegration.deserializeBinaryFromReader = function(msg, reader) {
var value = /** @type {string} */ (reader.readString()); var value = /** @type {string} */ (reader.readString());
msg.addUplinkValues(value); msg.addUplinkValues(value);
break; break;
case 4:
var value = /** @type {boolean} */ (reader.readBool());
msg.setArbitraryJson(value);
break;
case 5:
var value = /** @type {string} */ (reader.readString());
msg.setEventPrefix(value);
break;
default: default:
reader.skipField(); reader.skipField();
break; break;
@ -13294,6 +13304,20 @@ proto.api.IftttIntegration.serializeBinaryToWriter = function(message, writer) {
f f
); );
} }
f = message.getArbitraryJson();
if (f) {
writer.writeBool(
4,
f
);
}
f = message.getEventPrefix();
if (f.length > 0) {
writer.writeString(
5,
f
);
}
}; };
@ -13370,6 +13394,42 @@ proto.api.IftttIntegration.prototype.clearUplinkValuesList = function() {
}; };
/**
* optional bool arbitrary_json = 4;
* @return {boolean}
*/
proto.api.IftttIntegration.prototype.getArbitraryJson = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false));
};
/**
* @param {boolean} value
* @return {!proto.api.IftttIntegration} returns this
*/
proto.api.IftttIntegration.prototype.setArbitraryJson = function(value) {
return jspb.Message.setProto3BooleanField(this, 4, value);
};
/**
* optional string event_prefix = 5;
* @return {string}
*/
proto.api.IftttIntegration.prototype.getEventPrefix = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
};
/**
* @param {string} value
* @return {!proto.api.IftttIntegration} returns this
*/
proto.api.IftttIntegration.prototype.setEventPrefix = function(value) {
return jspb.Message.setProto3StringField(this, 5, value);
};

7
api/md/api/api.md vendored
View File

@ -1108,7 +1108,9 @@
| key | [string](#string) | | Key. This key can be obtained from the IFTTT Webhooks documentation page. | | key | [string](#string) | | Key. This key can be obtained from the IFTTT Webhooks documentation page. |
| uplink_values | [string](#string) | repeated | Values. Up to 2 values can be forwarded to IFTTT. These values must map to the decoded payload keys. For example: { &#34;batteryLevel&#34;: 75.3, &#34;buttons&#34;: [{&#34;pressed&#34;: false}, {&#34;pressed&#34;: true}] } You would specify the following fields: uplink_values = [&#34;batteryLevel&#34;, &#34;buttons_0_pressed&#34;] | uplink_values | [string](#string) | repeated | Values. Up to 2 values can be forwarded to IFTTT. These values must map to the decoded payload keys. For example: { &#34;batteryLevel&#34;: 75.3, &#34;buttons&#34;: [{&#34;pressed&#34;: false}, {&#34;pressed&#34;: true}] } You would specify the following fields: uplink_values = [&#34;batteryLevel&#34;, &#34;buttons_0_pressed&#34;]
Note: The first value is always used for the DevEUI. | Notes: The first value is always used for the DevEUI. Ignored if arbitrary_json is set to true. |
| arbitrary_json | [bool](#bool) | | Arbitrary JSON. If set to true, ChirpStack events will be sent as-is as arbitrary JSON payload. If set to false (default), the 3 JSON values format will be used. |
| event_prefix | [string](#string) | | Event prefix. If set, the event name will be PREFIX_EVENT. For example if event_prefix is set to weatherstation, and uplink event will be sent as weatherstation_up to the IFTTT webhook. Note: Only characters in the A-Z, a-z and 0-9 range are allowed. |
@ -1549,7 +1551,8 @@ Note: The first value is always used for the DevEUI. |
<a name="api-ApplicationService"></a> <a name="api-ApplicationService"></a>
### ApplicationService ### ApplicationService
ApplicationService is the service providing API methods for managing applications. ApplicationService is the service providing API methods for managing
applications.
| Method Name | Request Type | Response Type | Description | | Method Name | Request Type | Response Type | Description |
| ----------- | ------------ | ------------- | ------------| | ----------- | ------------ | ------------- | ------------|

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -412,14 +412,18 @@ class HttpIntegration(_message.Message):
def __init__(self, application_id: _Optional[str] = ..., headers: _Optional[_Mapping[str, str]] = ..., encoding: _Optional[_Union[Encoding, str]] = ..., event_endpoint_url: _Optional[str] = ...) -> None: ... def __init__(self, application_id: _Optional[str] = ..., headers: _Optional[_Mapping[str, str]] = ..., encoding: _Optional[_Union[Encoding, str]] = ..., event_endpoint_url: _Optional[str] = ...) -> None: ...
class IftttIntegration(_message.Message): class IftttIntegration(_message.Message):
__slots__ = ["application_id", "key", "uplink_values"] __slots__ = ["application_id", "arbitrary_json", "event_prefix", "key", "uplink_values"]
APPLICATION_ID_FIELD_NUMBER: _ClassVar[int] APPLICATION_ID_FIELD_NUMBER: _ClassVar[int]
ARBITRARY_JSON_FIELD_NUMBER: _ClassVar[int]
EVENT_PREFIX_FIELD_NUMBER: _ClassVar[int]
KEY_FIELD_NUMBER: _ClassVar[int] KEY_FIELD_NUMBER: _ClassVar[int]
UPLINK_VALUES_FIELD_NUMBER: _ClassVar[int] UPLINK_VALUES_FIELD_NUMBER: _ClassVar[int]
application_id: str application_id: str
arbitrary_json: bool
event_prefix: str
key: str key: str
uplink_values: _containers.RepeatedScalarFieldContainer[str] uplink_values: _containers.RepeatedScalarFieldContainer[str]
def __init__(self, application_id: _Optional[str] = ..., key: _Optional[str] = ..., uplink_values: _Optional[_Iterable[str]] = ...) -> None: ... def __init__(self, application_id: _Optional[str] = ..., key: _Optional[str] = ..., uplink_values: _Optional[_Iterable[str]] = ..., arbitrary_json: bool = ..., event_prefix: _Optional[str] = ...) -> None: ...
class InfluxDbIntegration(_message.Message): class InfluxDbIntegration(_message.Message):
__slots__ = ["application_id", "bucket", "db", "endpoint", "organization", "password", "precision", "retention_policy_name", "token", "username", "version"] __slots__ = ["application_id", "bucket", "db", "endpoint", "organization", "password", "precision", "retention_policy_name", "token", "username", "version"]

View File

@ -7,7 +7,8 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
class ApplicationServiceStub(object): class ApplicationServiceStub(object):
"""ApplicationService is the service providing API methods for managing applications. """ApplicationService is the service providing API methods for managing
applications.
""" """
def __init__(self, channel): def __init__(self, channel):
@ -254,7 +255,8 @@ class ApplicationServiceStub(object):
class ApplicationServiceServicer(object): class ApplicationServiceServicer(object):
"""ApplicationService is the service providing API methods for managing applications. """ApplicationService is the service providing API methods for managing
applications.
""" """
def Create(self, request, context): def Create(self, request, context):
@ -832,7 +834,8 @@ def add_ApplicationServiceServicer_to_server(servicer, server):
# This class is part of an EXPERIMENTAL API. # This class is part of an EXPERIMENTAL API.
class ApplicationService(object): class ApplicationService(object):
"""ApplicationService is the service providing API methods for managing applications. """ApplicationService is the service providing API methods for managing
applications.
""" """
@staticmethod @staticmethod

File diff suppressed because it is too large Load Diff

View File

@ -1716,6 +1716,16 @@ impl ApplicationService for Application {
) )
.await?; .await?;
if !req_int.event_prefix.is_empty()
&& !regex::Regex::new(r"^[a-zA-Z0-9]+$")
.unwrap()
.is_match(&req_int.event_prefix)
{
return Err(Status::invalid_argument(
"event_prefix may only contain A-Z, a-z and 0-9 characters",
));
}
let _ = application::create_integration(application::Integration { let _ = application::create_integration(application::Integration {
application_id: app_id, application_id: app_id,
kind: application::IntegrationKind::Ifttt, kind: application::IntegrationKind::Ifttt,
@ -1726,6 +1736,8 @@ impl ApplicationService for Application {
req_int.uplink_values.get(0).cloned().unwrap_or_default(), req_int.uplink_values.get(0).cloned().unwrap_or_default(),
req_int.uplink_values.get(1).cloned().unwrap_or_default(), req_int.uplink_values.get(1).cloned().unwrap_or_default(),
], ],
arbitrary_json: req_int.arbitrary_json,
event_prefix: req_int.event_prefix.clone(),
}, },
), ),
..Default::default() ..Default::default()
@ -1766,6 +1778,8 @@ impl ApplicationService for Application {
application_id: app_id.to_string(), application_id: app_id.to_string(),
key: conf.key.clone(), key: conf.key.clone(),
uplink_values: conf.uplink_values.to_vec(), uplink_values: conf.uplink_values.to_vec(),
arbitrary_json: conf.arbitrary_json,
event_prefix: conf.event_prefix.clone(),
}), }),
}); });
resp.metadata_mut() resp.metadata_mut()
@ -1806,6 +1820,8 @@ impl ApplicationService for Application {
req_int.uplink_values.get(0).cloned().unwrap_or_default(), req_int.uplink_values.get(0).cloned().unwrap_or_default(),
req_int.uplink_values.get(1).cloned().unwrap_or_default(), req_int.uplink_values.get(1).cloned().unwrap_or_default(),
], ],
arbitrary_json: req_int.arbitrary_json,
event_prefix: req_int.event_prefix.clone(),
}, },
), ),
..Default::default() ..Default::default()
@ -3353,6 +3369,8 @@ pub mod test {
application_id: app.id.to_string(), application_id: app.id.to_string(),
key: "verysecret".into(), key: "verysecret".into(),
uplink_values: vec!["value_1".into(), "value_2".into()], uplink_values: vec!["value_1".into(), "value_2".into()],
arbitrary_json: false,
event_prefix: "foo".to_string(),
}), }),
}, },
); );
@ -3372,6 +3390,8 @@ pub mod test {
application_id: app.id.to_string(), application_id: app.id.to_string(),
key: "verysecret".into(), key: "verysecret".into(),
uplink_values: vec!["value_1".into(), "value_2".into()], uplink_values: vec!["value_1".into(), "value_2".into()],
arbitrary_json: false,
event_prefix: "foo".to_string(),
}), }),
get_resp.integration get_resp.integration
); );
@ -3384,6 +3404,8 @@ pub mod test {
application_id: app.id.to_string(), application_id: app.id.to_string(),
key: "verysecrettoo".into(), key: "verysecrettoo".into(),
uplink_values: vec!["value_4".into(), "value_5".into()], uplink_values: vec!["value_4".into(), "value_5".into()],
arbitrary_json: true,
event_prefix: "bar".to_string(),
}), }),
}, },
); );
@ -3403,6 +3425,8 @@ pub mod test {
application_id: app.id.to_string(), application_id: app.id.to_string(),
key: "verysecrettoo".into(), key: "verysecrettoo".into(),
uplink_values: vec!["value_4".into(), "value_5".into()], uplink_values: vec!["value_4".into(), "value_5".into()],
arbitrary_json: true,
event_prefix: "bar".to_string(),
}), }),
get_resp.integration get_resp.integration
); );

View File

@ -27,6 +27,8 @@ pub struct Integration {
key: String, key: String,
uplink_values: [String; 2], uplink_values: [String; 2],
server: String, server: String,
arbitrary_json: bool,
event_prefix: String,
} }
impl Integration { impl Integration {
@ -37,11 +39,30 @@ impl Integration {
key: conf.key.clone(), key: conf.key.clone(),
uplink_values: conf.uplink_values.clone(), uplink_values: conf.uplink_values.clone(),
server: "https://maker.ifttt.com".to_string(), server: "https://maker.ifttt.com".to_string(),
arbitrary_json: conf.arbitrary_json,
event_prefix: conf.event_prefix.clone(),
} }
} }
async fn post(&self, event: &str, v: Values) -> Result<()> { async fn post<T>(&self, event: &str, v: &T) -> Result<()>
let url = format!("{}/trigger/{}/with/key/{}", self.server, event, self.key); where
T: Serialize,
{
let event = if self.event_prefix.is_empty() {
event.to_string()
} else {
format!("{}_{}", self.event_prefix, event)
};
let url = if self.arbitrary_json {
format!(
"{}/trigger/{}/json/with/key/{}",
self.server, event, self.key
)
} else {
format!("{}/trigger/{}/with/key/{}", self.server, event, self.key)
};
let client = Client::builder().timeout(Duration::from_secs(5)).build()?; let client = Client::builder().timeout(Duration::from_secs(5)).build()?;
let mut headers = HeaderMap::new(); let mut headers = HeaderMap::new();
headers.insert(CONTENT_TYPE, "application/json".parse().unwrap()); headers.insert(CONTENT_TYPE, "application/json".parse().unwrap());
@ -65,6 +86,10 @@ impl IntegrationTrait for Integration {
_vars: &HashMap<String, String>, _vars: &HashMap<String, String>,
pl: &integration::UplinkEvent, pl: &integration::UplinkEvent,
) -> Result<()> { ) -> Result<()> {
if self.arbitrary_json {
return self.post("up", pl).await;
}
let data_measurements: HashMap<String, pbjson_types::value::Kind> = match &pl.object { let data_measurements: HashMap<String, pbjson_types::value::Kind> = match &pl.object {
None => { None => {
trace!("object is None, nothing to send"); trace!("object is None, nothing to send");
@ -91,7 +116,7 @@ impl IntegrationTrait for Integration {
return Ok(()); return Ok(());
} }
self.post("up", v).await self.post("up", &v).await
} }
async fn join_event( async fn join_event(
@ -170,13 +195,15 @@ pub mod test {
use httpmock::prelude::*; use httpmock::prelude::*;
#[tokio::test] #[tokio::test]
async fn test_ifttt() { async fn test_ifttt_no_prefix() {
let server = MockServer::start(); let server = MockServer::start();
let i = Integration { let i = Integration {
key: "verysecret".into(), key: "verysecret".into(),
uplink_values: ["temp".to_string(), "door_open".to_string()], uplink_values: ["temp".to_string(), "door_open".to_string()],
server: server.url(""), server: server.url(""),
arbitrary_json: false,
event_prefix: "".into(),
}; };
// uplink event // uplink event
@ -228,4 +255,121 @@ pub mod test {
mock.assert(); mock.assert();
mock.delete(); mock.delete();
} }
#[tokio::test]
async fn test_ifttt_prefix() {
let server = MockServer::start();
let i = Integration {
key: "verysecret".into(),
uplink_values: ["temp".to_string(), "door_open".to_string()],
server: server.url(""),
arbitrary_json: false,
event_prefix: "weatherstation".into(),
};
// uplink event
let pl = integration::UplinkEvent {
device_info: Some(integration::DeviceInfo {
dev_eui: "0102030405060708".to_string(),
..Default::default()
}),
object: Some(pbjson_types::Struct {
fields: [
(
"temp".to_string(),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::NumberValue(23.5)),
},
),
(
"door_open".to_string(),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::StringValue(
"closed".to_string(),
)),
},
),
]
.iter()
.cloned()
.collect(),
}),
..Default::default()
};
let mut mock = server.mock(|when, then| {
when.method(POST)
.path("/trigger/weatherstation_up/with/key/verysecret")
.header("Content-Type", "application/json")
.body(
serde_json::to_string(&Values {
value1: "0102030405060708".to_string(),
value2: "23.5".to_string(),
value3: "closed".to_string(),
})
.unwrap(),
);
then.status(200);
});
i.uplink_event(&HashMap::new(), &pl).await.unwrap();
mock.assert();
mock.delete();
}
#[tokio::test]
async fn test_ifttt_arbitrary_json() {
let server = MockServer::start();
let i = Integration {
key: "verysecret".into(),
uplink_values: ["temp".to_string(), "door_open".to_string()],
server: server.url(""),
arbitrary_json: true,
event_prefix: "".into(),
};
// uplink event
let pl = integration::UplinkEvent {
device_info: Some(integration::DeviceInfo {
dev_eui: "0102030405060708".to_string(),
..Default::default()
}),
object: Some(pbjson_types::Struct {
fields: [
(
"temp".to_string(),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::NumberValue(23.5)),
},
),
(
"door_open".to_string(),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::StringValue(
"closed".to_string(),
)),
},
),
]
.iter()
.cloned()
.collect(),
}),
..Default::default()
};
let mut mock = server.mock(|when, then| {
when.method(POST)
.path("/trigger/up/json/with/key/verysecret")
.header("Content-Type", "application/json")
.body(serde_json::to_string(&pl).unwrap());
then.status(200);
});
i.uplink_event(&HashMap::new(), &pl).await.unwrap();
mock.assert();
mock.delete();
}
} }

View File

@ -252,10 +252,13 @@ pub struct PilotThingsConfiguration {
pub token: String, pub token: String,
} }
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct IftttConfiguration { pub struct IftttConfiguration {
pub key: String, pub key: String,
pub uplink_values: [String; 2], // The first value is reserved for the DevEUI pub uplink_values: [String; 2], // The first value is reserved for the DevEUI
pub arbitrary_json: bool,
pub event_prefix: String,
} }
#[derive(Clone, Queryable, Insertable, PartialEq, Eq, Debug)] #[derive(Clone, Queryable, Insertable, PartialEq, Eq, Debug)]

View File

@ -1,6 +1,6 @@
import React, { Component } from "react"; import React, { Component } from "react";
import { Form, Input, AutoComplete, Button } from "antd"; import { Form, Input, AutoComplete, Button, Row, Col, Switch } from "antd";
import { IftttIntegration } from "@chirpstack/chirpstack-api-grpc-web/api/application_pb"; import { IftttIntegration } from "@chirpstack/chirpstack-api-grpc-web/api/application_pb";
@ -10,18 +10,46 @@ interface IProps {
onFinish: (obj: IftttIntegration) => void; onFinish: (obj: IftttIntegration) => void;
} }
class IftttIntegrationForm extends Component<IProps> { interface IState {
arbitraryJson: boolean;
}
class IftttIntegrationForm extends Component<IProps, IState> {
constructor(props: IProps) {
super(props);
this.state = {
arbitraryJson: false,
};
}
componentDidMount() {
const v = this.props.initialValues;
this.setState({
arbitraryJson: v.getArbitraryJson(),
});
}
onFinish = (values: IftttIntegration.AsObject) => { onFinish = (values: IftttIntegration.AsObject) => {
const v = Object.assign(this.props.initialValues.toObject(), values); const v = Object.assign(this.props.initialValues.toObject(), values);
let i = new IftttIntegration(); let i = new IftttIntegration();
i.setApplicationId(v.applicationId); i.setApplicationId(v.applicationId);
i.setKey(v.key); i.setKey(v.key);
i.setEventPrefix(v.eventPrefix);
i.setArbitraryJson(v.arbitraryJson);
i.setUplinkValuesList(v.uplinkValuesList); i.setUplinkValuesList(v.uplinkValuesList);
this.props.onFinish(i); this.props.onFinish(i);
}; };
onArbitraryJsonChange = (checked: boolean) => {
this.setState({
arbitraryJson: checked,
});
}
render() { render() {
const options: { const options: {
value: string; value: string;
@ -39,21 +67,45 @@ class IftttIntegrationForm extends Component<IProps> {
> >
<Input.Password /> <Input.Password />
</Form.Item> </Form.Item>
<Form.List name="uplinkValuesList"> <Row gutter={24}>
<Col span={12}>
<Form.Item
label="Event prefix"
name="eventPrefix"
rules={[{ pattern: /[A-Za-z0-9]+/, message: "Only use A-Z, a-z and 0-9 characters" }]}
tooltip="The prefix will be added to the Webhook event, e.g. if set an uplink will be published as PREFIX_up instead of up."
>
<Input />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Publish as arbitrary JSON"
name="arbitraryJson"
valuePropName="checked"
tooltip="If enabled, the event payload will be published as-is (arbitrary JSON payload instead of 3 JSON values format)."
>
<Switch onChange={this.onArbitraryJsonChange} />
</Form.Item>
</Col>
</Row>
{!this.state.arbitraryJson && <Form.List name="uplinkValuesList">
{fields => ( {fields => (
<div> <Row gutter={24}>
{fields.map((field, i) => ( {fields.map((field, i) => (
<Form.Item <Col span={12}>
label={`Value ${i + 1} key`} <Form.Item
{...field} label={`Value ${i + 1} key`}
tooltip="This must match the key in the decoded uplink payload. Nested keys are joined with a '_', array elements are indexed (starting at zero), e.g. 'sensor_0', 'sensor_1'. Auto-completion is based on measurements configuration in the device-profile(s) used within this application." {...field}
> tooltip="This must match the key in the decoded uplink payload. Nested keys are joined with a '_', array elements are indexed (starting at zero), e.g. 'sensor_0', 'sensor_1'. Auto-completion is based on measurements configuration in the device-profile(s) used within this application."
<AutoComplete options={options} /> >
</Form.Item> <AutoComplete options={options} />
</Form.Item>
</Col>
))} ))}
</div> </Row>
)} )}
</Form.List> </Form.List>}
<Form.Item> <Form.Item>
<Button type="primary" htmlType="submit"> <Button type="primary" htmlType="submit">
Submit Submit